'use strict'; const test = require('tape'); const { suc, add, mul, exp, pre, sub, ntc, ctn, } = require('../churchnumerals'); test('ctn', (t) => { t.plan(4); t.equal(ctn(f => x => x), 0); t.equal(ctn(f => x => f(x)), 1); t.equal(ctn(f => x => f(f(f(f(x))))), 4); t.equal(ctn(f => x => f(f(f(f(f(f(f(x)))))))), 7); }); test('ntc+ctn', (t) => { t.plan(6); t.equal(ctn(ntc(-10)), 0); t.equal(ctn(ntc(0)), 0); t.equal(ctn(ntc(1)), 1); t.equal(ctn(ntc(10)), 10); t.equal(ctn(ntc(100)), 100); t.equal(ctn(ntc(1000)), 1000); }); test('suc', (t) => { t.plan(5); t.equal(ctn(suc(ntc(0))), 1); t.equal(ctn(suc(ntc(1))), 2); t.equal(ctn(suc(ntc(10))), 11); t.equal(ctn(suc(ntc(100))), 101); t.equal(ctn(suc(ntc(1000))), 1001); }); test('add', (t) => { t.plan(6); t.equal(ctn(add(ntc(0))(ntc(0))), 0); t.equal(ctn(add(ntc(3))(ntc(0))), 3); t.equal(ctn(add(ntc(0))(ntc(4))), 4); t.equal(ctn(add(ntc(2))(ntc(6))), 8); t.equal(ctn(add(ntc(100))(ntc(20))), 120); t.equal(ctn(add(ntc(100))(ntc(1000))), 1100); }); test('mul', (t) => { t.plan(5); t.equal(ctn(mul(ntc(0))(ntc(0))), 0); t.equal(ctn(mul(ntc(3))(ntc(0))), 0); t.equal(ctn(mul(ntc(0))(ntc(4))), 0); t.equal(ctn(mul(ntc(2))(ntc(6))), 12); t.equal(ctn(mul(ntc(100))(ntc(20))), 2000); }); test('exp', (t) => { t.plan(6); t.equal(ctn(exp(ntc(0))(ntc(0))), 1); t.equal(ctn(exp(ntc(3))(ntc(0))), 1); t.equal(ctn(exp(ntc(0))(ntc(4))), 0); t.equal(ctn(exp(ntc(2))(ntc(6))), 64); t.equal(ctn(exp(ntc(100))(ntc(3))), 1000000); t.equal(ctn(exp(ntc(2))(ntc(20))), 1048576); }); test('pre', (t) => { t.plan(5); t.equal(ctn(pre(ntc(0))), 0); t.equal(ctn(pre(ntc(1))), 0); t.equal(ctn(pre(ntc(7))), 6); t.equal(ctn(pre(ntc(100))), 99); t.equal(ctn(pre(ntc(1000))), 999); }); test('sub', (t) => { t.plan(6); t.equal(ctn(sub(ntc(0))(ntc(0))), 0); t.equal(ctn(sub(ntc(3))(ntc(0))), 3); t.equal(ctn(sub(ntc(0))(ntc(4))), 0); t.equal(ctn(sub(ntc(2))(ntc(6))), 0); t.equal(ctn(sub(ntc(100))(ntc(20))), 80); t.equal(ctn(sub(ntc(1000))(ntc(100))), 900); });