Skip to content

Commit

Permalink
add law tests for non-expo types
Browse files Browse the repository at this point in the history
  • Loading branch information
evilsoft committed Jul 29, 2019
1 parent 098a1d2 commit 55a7c96
Show file tree
Hide file tree
Showing 21 changed files with 1,455 additions and 479 deletions.
72 changes: 56 additions & 16 deletions src/All/All.spec.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
const test = require('tape')
const MockCrock = require('../test/MockCrock')
const helpers = require('../test/helpers')
const laws = require('../test/laws')

const bindFunc = helpers.bindFunc

const equals = require('../core/equals')
const isFunction = require('../core/isFunction')
const isObject = require('../core/isObject')
const isString = require('../core/isString')
Expand Down Expand Up @@ -168,12 +170,22 @@ test('All concat properties (Semigroup)', t => {
const b = All(true)
const c = All('')

const left = a.concat(b).concat(c)
const right = a.concat(b.concat(c))
const concat = laws['concat']

t.ok(isFunction(a.concat), 'provides a concat function')
t.equal(left.valueOf(), right.valueOf(), 'associativity')
t.equal(a.concat(b).type(), a.type(), 'returns an All')
t.ok(concat.associativity(equals, a, b, c), 'associativity')

t.end()
})

test('All fantasy-land concat properties (Semigroup)', t => {
const a = All(7)
const b = All(true)
const c = All(34)

const concat = laws[fl.concat]

t.ok(concat.associativity(equals, a, b, c), 'associativity')

t.end()
})
Expand All @@ -190,14 +202,32 @@ test('All empty functionality', t => {
test('All equals properties (Setoid)', t => {
const a = All(true)
const b = All(true)
const c = All(false)
const d = All(true)
const c = All(true)
const d = All(false)

const equals = laws['equals']

t.ok(isFunction(All(5).equals), 'provides an equals function')
t.equal(a.equals(a), true, 'reflexivity')
t.equal(a.equals(b), b.equals(a), 'symmetry (equal)')
t.equal(a.equals(c), c.equals(a), 'symmetry (!equal)')
t.equal(a.equals(b) && b.equals(d), a.equals(d), 'transitivity')

t.ok(equals.reflexivity(a), 'reflexivity')
t.ok(equals.symmetry(a, b), 'symmetry (equal)')
t.ok(equals.symmetry(a, d), 'symmetry (!equal)')
t.ok(equals.transitivity(a, b, c), 'transitivity (equal)')
t.ok(equals.transitivity(a, d, c), 'transitivity (!equal)')

t.end()
})

test('All fantasy-land equals properties (Setoid)', t => {
const a = All(true)
const b = All(true)
const c = All(true)

const equals = laws[fl.equals]

t.ok(equals.reflexivity(a), 'reflexivity')
t.ok(equals.symmetry(a, b), 'symmetry')
t.ok(equals.transitivity(a, b, c), 'transitivity')

t.end()
})
Expand All @@ -219,16 +249,26 @@ test('All equals functionality', t => {
})

test('All empty properties (Monoid)', t => {
const m = All(3)
const m = All(false)

const empty = laws['empty']

t.ok(isFunction(m.concat), 'provides a concat function')
t.ok(isFunction(m.empty), 'provides an empty function')
t.ok(isFunction(m.constructor.empty), 'provides an empty function on constructor')

t.ok(empty.leftIdentity(equals, m), 'left identity')
t.ok(empty.rightIdentity(equals, m), 'right identity')

t.end()
})

test('All fantasy-land empty properties (Monoid)', t => {
const m = All(false)

const right = m.concat(m.empty())
const left = m.empty().concat(m)
const empty = laws[fl.empty]

t.equal(right.valueOf(), m.valueOf(), 'right identity')
t.equal(left.valueOf(), m.valueOf(), 'left identity')
t.ok(empty.leftIdentity(equals, m), 'left identity')
t.ok(empty.rightIdentity(equals, m), 'right identity')

t.end()
})
95 changes: 61 additions & 34 deletions src/Any/Any.spec.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
const test = require('tape')
const MockCrock = require('../test/MockCrock')
const helpers = require('../test/helpers')
const laws = require('../test/laws')

const bindFunc = helpers.bindFunc

const equals = require('../core/equals')
const isFunction = require('../core/isFunction')
const isObject = require('../core/isObject')
const isString = require('../core/isString')
Expand Down Expand Up @@ -110,6 +111,42 @@ test('Any @@type', t => {
t.end()
})

test('Any equals properties (Setoid)', t => {
const a = Any(true)
const b = Any(true)
const c = Any(true)
const d = Any(false)

const equals = laws['equals']

t.ok(isFunction(Any({}).equals), 'provides an equals function')

t.ok(equals.reflexivity(a), 'reflexivity')
t.ok(equals.symmetry(a, b), 'symmetry (equal)')
t.ok(equals.symmetry(a, d), 'symmetry (!equal)')
t.ok(equals.transitivity(a, b, c), 'transitivity (equal)')
t.ok(equals.transitivity(a, d, c), 'transitivity (!equal)')

t.end()
})

test('Any fantasy-land equals properties (Setoid)', t => {
const a = Any(true)
const b = Any(true)
const c = Any(true)
const d = Any(false)

const equals = laws[fl.equals]

t.ok(equals.reflexivity(a), 'reflexivity')
t.ok(equals.symmetry(a, b), 'symmetry (equal)')
t.ok(equals.symmetry(a, d), 'symmetry (!equal)')
t.ok(equals.transitivity(a, b, c), 'transitivity (equal)')
t.ok(equals.transitivity(a, d, c), 'transitivity (!equal)')

t.end()
})

test('Any concat functionality', t => {
const a = Any(true)
const b = Any(false)
Expand Down Expand Up @@ -166,58 +203,48 @@ test('Any concat properties (Semigroup)', t => {
const b = Any(true)
const c = Any('')

const left = a.concat(b).concat(c)
const right = a.concat(b.concat(c))
const concat = laws['concat']

t.ok(isFunction(a.concat), 'provides a concat function')
t.equal(left.valueOf(), right.valueOf(), 'associativity')
t.equal(a.concat(b).type(), a.type(), 'returns an Any')

t.ok(concat.associativity(equals, a, b, c), 'associativity')

t.end()
})

test('Any empty properties (Monoid)', t => {
const m = Any(3)

t.ok(isFunction(m.concat), 'provides a concat function')
t.ok(isFunction(m.empty), 'provides an empty function')
test('Any fantasy-land concat properties (Semigroup)', t => {
const a = Any(10)
const b = Any(true)
const c = Any('string')

const right = m.concat(m.empty())
const left = m.empty().concat(m)
const concat = laws[fl.concat]

t.equal(right.valueOf(), m.valueOf(), 'right identity')
t.equal(left.valueOf(), m.valueOf(), 'left identity')
t.ok(concat.associativity(equals, a, b, c), 'associativity')

t.end()
})

test('Any equals properties (Setoid)', t => {
const a = Any(true)
const b = Any(true)
const c = Any(false)
const d = Any(true)
test('Any empty properties (Monoid)', t => {
const m = Any(true)

t.ok(isFunction(Any({}).equals), 'provides an equals function')
t.equal(a.equals(a), true, 'reflexivity')
t.equal(a.equals(b), b.equals(a), 'symmetry (equal)')
t.equal(a.equals(c), c.equals(a), 'symmetry (!equal)')
t.equal(a.equals(b) && b.equals(d), a.equals(d), 'transitivity')
const empty = laws['empty']

t.ok(isFunction(m.concat), 'provides a concat function')
t.ok(isFunction(m.constructor.empty), 'provides an empty function on constructor')

t.ok(empty.leftIdentity(equals, m), 'left identity')
t.ok(empty.rightIdentity(equals, m), 'right identity')

t.end()
})

test('Any equals functionality', t => {
const a = Any(true)
const b = Any(true)
const c = Any(false)
test('Any fantasy-land empty properties (Monoid)', t => {
const m = Any(true)

const value = {}
const nonAny = MockCrock(value)
const empty = laws[fl.empty]

t.equal(a.equals(c), false, 'returns false when 2 Anys are not equal')
t.equal(a.equals(b), true, 'returns true when 2 Anys are equal')
t.equal(a.equals(nonAny), false, 'returns false when passed a non-Any')
t.equal(c.equals(value), false, 'returns false when passed a simple value')
t.ok(empty.leftIdentity(equals, m), 'left identity')
t.ok(empty.rightIdentity(equals, m), 'right identity')

t.end()
})
Expand Down
75 changes: 58 additions & 17 deletions src/Assign/Assign.spec.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
const test = require('tape')
const MockCrock = require('../test/MockCrock')
const helpers = require('../test/helpers')
const laws = require('../test/laws')

const bindFunc = helpers.bindFunc

const equals = require('../core/equals')
const isFunction = require('../core/isFunction')
const isObject = require('../core/isObject')
const isString = require('../core/isString')
Expand Down Expand Up @@ -109,14 +111,35 @@ test('Assign @@type', t => {
test('Assign equals properties (Setoid)', t => {
const a = Assign({ a: 5 })
const b = Assign({ a: 5 })
const c = Assign({ a: 'not' })
const d = Assign({ a: 5 })
const c = Assign({ a: 5 })
const d = Assign({ a: 'not' })

const equals = laws['equals']

t.ok(isFunction(Assign({}).equals), 'provides an equals function')
t.equal(a.equals(a), true, 'reflexivity')
t.equal(a.equals(b), b.equals(a), 'symmetry (equal)')
t.equal(a.equals(c), c.equals(a), 'symmetry (!equal)')
t.equal(a.equals(b) && b.equals(d), a.equals(d), 'transitivity')

t.ok(equals.reflexivity(a), 'reflexivity')
t.ok(equals.symmetry(a, b), 'symmetry (equal)')
t.ok(equals.symmetry(a, d), 'symmetry (!equal)')
t.ok(equals.transitivity(a, b, c), 'transitivity (equal)')
t.ok(equals.transitivity(a, d, c), 'transitivity (!equal)')

t.end()
})

test('Assign fantasy-land equals properties (Setoid)', t => {
const a = Assign({ a: 5 })
const b = Assign({ a: 5 })
const c = Assign({ a: 5 })
const d = Assign({ a: 'not' })

const equals = laws[fl.equals]

t.ok(equals.reflexivity(a), 'reflexivity')
t.ok(equals.symmetry(a, b), 'symmetry (equal)')
t.ok(equals.symmetry(a, d), 'symmetry (!equal)')
t.ok(equals.transitivity(a, b, c), 'transitivity (equal)')
t.ok(equals.transitivity(a, d, c), 'transitivity (!equal)')

t.end()
})
Expand All @@ -142,13 +165,23 @@ test('Assign concat properties (Semigroup)', t => {
const b = Assign({ value: 'b' })
const c = Assign({ value: 'c' })

const left = a.concat(b).concat(c)
const right = a.concat(b.concat(c))
const concat = laws['concat']

t.ok(isFunction(Assign({}).concat), 'is a function')
t.ok(isFunction(Assign({}).concat), 'provides a concat function')

t.same(left.valueOf(), right.valueOf(), 'associativity')
t.equal(a.concat(b).type(), a.type(), 'returns Semigroup of the same type')
t.ok(concat.associativity(equals, a, b, c), 'associativity')

t.end()
})

test('Assign fantasy-land concat properties (Semigroup)', t => {
const a = Assign({ value: 'a' })
const b = Assign({ value: 'b' })
const c = Assign({ value: 'c' })

const concat = laws[fl.concat]

t.ok(concat.associativity(equals, a, b, c), 'associativity')

t.end()
})
Expand Down Expand Up @@ -209,16 +242,24 @@ test('Assign concat fantasy-land errors', t => {
test('Assign empty properties (Monoid)', t => {
const m = Assign({ value: 'm' })

const empty = laws['empty']

t.ok(isFunction(m.concat), 'provides a concat function')
t.ok(isFunction(m.empty), 'provides a empty function')
t.ok(isFunction(m.constructor.empty), 'provides an empty function on constructor')

t.ok(empty.leftIdentity(equals, m), 'left identity')
t.ok(empty.rightIdentity(equals, m), 'right identity')

t.end()
})

const right = m.concat(m.empty())
const left = m.empty().concat(m)
test('Assign fantasy-land empty properties (Monoid)', t => {
const m = Assign({ value: 'm' })

t.same(right.valueOf(), m.valueOf(), 'right identity')
t.same(left.valueOf(), m.valueOf(), 'left identity')
const empty = laws[fl.empty]

t.equal(m.empty().type(), m.type(), 'returns a Monoid of the same type')
t.ok(empty.leftIdentity(equals, m), 'left identity')
t.ok(empty.rightIdentity(equals, m), 'right identity')

t.end()
})
Expand Down

0 comments on commit 55a7c96

Please sign in to comment.