import { describe, expect, it } from '@jest/globals'; import { undef } from '../src/core'; import { toNOrd as $o, NOrd } from '../src/ord'; import { toBoolean as $b, fromBoolean as _b, cmp as bcmp, eq as beq, not } from '../src/bool'; import { toNumber as $n, fromNumber as _n, cmp as ncmp, eq as neq, succ } from '../src/num'; import { Pair, both, cmp, eq, first, fst, ge, gt, le, lt, second, snd } from '../src/pair'; import { toString } from '../src/string'; import { show as bshow } from '../src/bool.show'; import { show as nshow } from '../src/num.show'; import { show } from '../src/pair.show'; describe('Pair', () => { describe('fst', () => { it('returns first', () => { expect($b(fst._(Pair._(_b(false))._(_n(0))))).toBe(false); }); it('ignores second', () => { expect($b(fst._(Pair._(_b(false))._(undef)))).toBe(false); }); }); describe('snd', () => { it('returns second', () => { expect($n(snd._(Pair._(_b(false))._(_n(0))))).toBe(0); }); it('ignores first', () => { expect($n(snd._(Pair._(undef)._(_n(0))))).toBe(0); }); }); describe('first', () => { it('updates first', () => { expect($b(fst._(first._(not)._(Pair._(_b(false))._(_n(0)))))).toBe(true); }); it('ignores second', () => { expect($b(fst._(first._(not)._(Pair._(_b(false))._(undef))))).toBe(true); }); }); describe('second', () => { it('updates second', () => { expect($n(snd._(second._(succ)._(Pair._(_b(false))._(_n(0)))))).toBe(1); }); it('ignores first', () => { expect($n(snd._(second._(succ)._(Pair._(undef)._(_n(0)))))).toBe(1); }); }); describe('both', () => { it('updates both', () => { expect($b(fst._(both._(not)._(succ)._(Pair._(_b(false))._(_n(0)))))).toBe(true); expect($n(snd._(both._(not)._(succ)._(Pair._(_b(false))._(_n(0)))))).toBe(1); }); }); describe('cmp', () => { it('(False, 0) cmp (False, 0) is EQ', () => { expect($o(cmp._(bcmp)._(ncmp)._(Pair._(_b(false))._(_n(0)))._(Pair._(_b(false))._(_n(0))))).toBe(NOrd.EQ); }); it('(False, 0) cmp (False, 1) is LT', () => { expect($o(cmp._(bcmp)._(ncmp)._(Pair._(_b(false))._(_n(0)))._(Pair._(_b(false))._(_n(1))))).toBe(NOrd.LT); }); it('(False, 1) cmp (False, 0) is GT', () => { expect($o(cmp._(bcmp)._(ncmp)._(Pair._(_b(false))._(_n(1)))._(Pair._(_b(false))._(_n(0))))).toBe(NOrd.GT); }); it('(False, 0) cmp (True, 0) is LT', () => { expect($o(cmp._(bcmp)._(ncmp)._(Pair._(_b(false))._(_n(0)))._(Pair._(_b(true))._(_n(0))))).toBe(NOrd.LT); }); it('(True, 0) cmp (False, 0) is GT', () => { expect($o(cmp._(bcmp)._(ncmp)._(Pair._(_b(true))._(_n(0)))._(Pair._(_b(false))._(_n(0))))).toBe(NOrd.GT); }); it('ignores second if first not equal', () => { expect($o(cmp._(bcmp)._(undef)._(Pair._(_b(false))._(undef))._(Pair._(_b(true))._(undef)))).toBe(NOrd.LT); }); }); describe('lt', () => { it('(False, 0) lt (False, 0) is False', () => { expect($b(lt._(bcmp)._(ncmp)._(Pair._(_b(false))._(_n(0)))._(Pair._(_b(false))._(_n(0))))).toBe(false); }); it('(False, 0) lt (False, 1) is True', () => { expect($b(lt._(bcmp)._(ncmp)._(Pair._(_b(false))._(_n(0)))._(Pair._(_b(false))._(_n(1))))).toBe(true); }); it('(False, 1) lt (False, 0) is False', () => { expect($b(lt._(bcmp)._(ncmp)._(Pair._(_b(false))._(_n(1)))._(Pair._(_b(false))._(_n(0))))).toBe(false); }); it('(False, 0) lt (True, 0) is True', () => { expect($b(lt._(bcmp)._(ncmp)._(Pair._(_b(false))._(_n(0)))._(Pair._(_b(true))._(_n(0))))).toBe(true); }); it('(True, 0) lt (False, 0) is False', () => { expect($b(lt._(bcmp)._(ncmp)._(Pair._(_b(true))._(_n(0)))._(Pair._(_b(false))._(_n(0))))).toBe(false); }); it('ignores second if first not equal', () => { expect($b(lt._(bcmp)._(undef)._(Pair._(_b(false))._(undef))._(Pair._(_b(true))._(undef)))).toBe(true); }); }); describe('le', () => { it('(False, 0) le (False, 0) is True', () => { expect($b(le._(bcmp)._(ncmp)._(Pair._(_b(false))._(_n(0)))._(Pair._(_b(false))._(_n(0))))).toBe(true); }); it('(False, 0) le (False, 1) is True', () => { expect($b(le._(bcmp)._(ncmp)._(Pair._(_b(false))._(_n(0)))._(Pair._(_b(false))._(_n(1))))).toBe(true); }); it('(False, 1) le (False, 0) is False', () => { expect($b(le._(bcmp)._(ncmp)._(Pair._(_b(false))._(_n(1)))._(Pair._(_b(false))._(_n(0))))).toBe(false); }); it('(False, 0) le (True, 0) is True', () => { expect($b(le._(bcmp)._(ncmp)._(Pair._(_b(false))._(_n(0)))._(Pair._(_b(true))._(_n(0))))).toBe(true); }); it('(True, 0) le (False, 0) is False', () => { expect($b(le._(bcmp)._(ncmp)._(Pair._(_b(true))._(_n(0)))._(Pair._(_b(false))._(_n(0))))).toBe(false); }); it('ignores second if first not equal', () => { expect($b(le._(bcmp)._(undef)._(Pair._(_b(false))._(undef))._(Pair._(_b(true))._(undef)))).toBe(true); }); }); describe('eq', () => { it('(False, 0) eq (False, 0) is True', () => { expect($b(eq._(beq)._(neq)._(Pair._(_b(false))._(_n(0)))._(Pair._(_b(false))._(_n(0))))).toBe(true); }); it('(False, 0) eq (False, 1) is False', () => { expect($b(eq._(beq)._(neq)._(Pair._(_b(false))._(_n(0)))._(Pair._(_b(false))._(_n(1))))).toBe(false); }); it('(False, 1) eq (False, 0) is False', () => { expect($b(eq._(beq)._(neq)._(Pair._(_b(false))._(_n(1)))._(Pair._(_b(false))._(_n(0))))).toBe(false); }); it('(False, 0) eq (True, 0) is True', () => { expect($b(eq._(beq)._(neq)._(Pair._(_b(false))._(_n(0)))._(Pair._(_b(true))._(_n(0))))).toBe(false); }); it('(True, 0) eq (False, 0) is True', () => { expect($b(eq._(beq)._(neq)._(Pair._(_b(true))._(_n(0)))._(Pair._(_b(false))._(_n(0))))).toBe(false); }); it('ignores second if first not equal', () => { expect($b(eq._(beq)._(undef)._(Pair._(_b(false))._(undef))._(Pair._(_b(true))._(undef)))).toBe(false); }); }); describe('ge', () => { it('(False, 0) ge (False, 0) is True', () => { expect($b(ge._(bcmp)._(ncmp)._(Pair._(_b(false))._(_n(0)))._(Pair._(_b(false))._(_n(0))))).toBe(true); }); it('(False, 0) ge (False, 1) is False', () => { expect($b(ge._(bcmp)._(ncmp)._(Pair._(_b(false))._(_n(0)))._(Pair._(_b(false))._(_n(1))))).toBe(false); }); it('(False, 1) ge (False, 0) is True', () => { expect($b(ge._(bcmp)._(ncmp)._(Pair._(_b(false))._(_n(1)))._(Pair._(_b(false))._(_n(0))))).toBe(true); }); it('(False, 0) ge (True, 0) is False', () => { expect($b(ge._(bcmp)._(ncmp)._(Pair._(_b(false))._(_n(0)))._(Pair._(_b(true))._(_n(0))))).toBe(false); }); it('(True, 0) ge (False, 0) is True', () => { expect($b(ge._(bcmp)._(ncmp)._(Pair._(_b(true))._(_n(0)))._(Pair._(_b(false))._(_n(0))))).toBe(true); }); it('ignores second if first not equal', () => { expect($b(ge._(bcmp)._(undef)._(Pair._(_b(false))._(undef))._(Pair._(_b(true))._(undef)))).toBe(false); }); }); describe('gt', () => { it('(False, 0) gt (False, 0) is False', () => { expect($b(gt._(bcmp)._(ncmp)._(Pair._(_b(false))._(_n(0)))._(Pair._(_b(false))._(_n(0))))).toBe(false); }); it('(False, 0) gt (False, 1) is False', () => { expect($b(gt._(bcmp)._(ncmp)._(Pair._(_b(false))._(_n(0)))._(Pair._(_b(false))._(_n(1))))).toBe(false); }); it('(False, 1) gt (False, 0) is True', () => { expect($b(gt._(bcmp)._(ncmp)._(Pair._(_b(false))._(_n(1)))._(Pair._(_b(false))._(_n(0))))).toBe(true); }); it('(False, 0) gt (True, 0) is False', () => { expect($b(gt._(bcmp)._(ncmp)._(Pair._(_b(false))._(_n(0)))._(Pair._(_b(true))._(_n(0))))).toBe(false); }); it('(True, 0) gt (False, 0) is True', () => { expect($b(gt._(bcmp)._(ncmp)._(Pair._(_b(true))._(_n(0)))._(Pair._(_b(false))._(_n(0))))).toBe(true); }); it('ignores second if first not equal', () => { expect($b(gt._(bcmp)._(undef)._(Pair._(_b(false))._(undef))._(Pair._(_b(true))._(undef)))).toBe(false); }); }); describe('show', () => { it('show (False, 0) is "(False, 0)"', () => { expect(toString(show._(bshow)._(nshow)._(Pair._(_b(false))._(_n(0))))).toBe('(False, 0)'); }); it('show (False, 1) is "(False, 1)"', () => { expect(toString(show._(bshow)._(nshow)._(Pair._(_b(false))._(_n(1))))).toBe('(False, 1)'); }); it('show (True, 0) is "(True, 0)"', () => { expect(toString(show._(bshow)._(nshow)._(Pair._(_b(true))._(_n(0))))).toBe('(True, 0)'); }); it('show (True, 1) is "(True, 1)"', () => { expect(toString(show._(bshow)._(nshow)._(Pair._(_b(true))._(_n(1))))).toBe('(True, 1)'); }); }); });