Lambda calculus-like library written in TypeScript.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
jlc/test/pair.spec.ts

230 lines
8.5 KiB

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, show as bshow, not } from '../src/bool';
import { toNumber as $n, fromNumber as _n, cmp as ncmp, eq as neq, show as nshow, succ } from '../src/num';
import { Pair, both, cmp, eq, first, fst, ge, gt, le, lt, second, show, snd } from '../src/pair';
import { toString as $s } from '../src/string';
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($s(show._(bshow)._(nshow)._(Pair._(_b(false))._(_n(0))))).toBe('(False, 0)');
});
it('show (False, 1) is "(False, 1)"', () => {
expect($s(show._(bshow)._(nshow)._(Pair._(_b(false))._(_n(1))))).toBe('(False, 1)');
});
it('show (True, 0) is "(True, 0)"', () => {
expect($s(show._(bshow)._(nshow)._(Pair._(_b(true))._(_n(0))))).toBe('(True, 0)');
});
it('show (True, 1) is "(True, 1)"', () => {
expect($s(show._(bshow)._(nshow)._(Pair._(_b(true))._(_n(1))))).toBe('(True, 1)');
});
});
});