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

211 lines
7.8 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, 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';
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);
});
});
});