import evolve from '../../fp/evolve'
import add from '../../math/add'
const eq = (x, y, msg) => expect(x).toEqual(y)
describe('evolve', () => {
it('creates a new object by evolving the `object` according to the `transformation` functions', () => {
const transf = { elapsed: add(1), remaining: add(-1) }
const object = { name: 'Tomato', elapsed: 100, remaining: 1400 }
const expected = { name: 'Tomato', elapsed: 101, remaining: 1399 }
eq(evolve(transf, object), expected)
})
it('does not invoke function if object does not contain the key', () => {
const transf = { n: add(1), m: add(1) }
const object = { m: 3 }
const expected = { m: 4 }
eq(evolve(transf, object), expected)
})
it('is not destructive', () => {
const transf = { elapsed: add(1), remaining: add(-1) }
const object = { name: 'Tomato', elapsed: 100, remaining: 1400 }
const expected = { name: 'Tomato', elapsed: 100, remaining: 1400 }
evolve(transf, object)
eq(object, expected)
})
it('is recursive', () => {
const transf = { nested: { second: add(-1), third: add(1) } }
const object = { first: 1, nested: { second: 2, third: 3 } }
const expected = { first: 1, nested: { second: 1, third: 4 } }
eq(evolve(transf, object), expected)
})
it('is curried', () => {
const tick = evolve({ elapsed: add(1), remaining: add(-1) })
const object = { name: 'Tomato', elapsed: 100, remaining: 1400 }
const expected = { name: 'Tomato', elapsed: 101, remaining: 1399 }
eq(tick(object), expected)
})
it('ignores primitive value transformations', () => {
const transf = { n: 2, m: 'foo' }
const object = { n: 0, m: 1 }
const expected = { n: 0, m: 1 }
eq(evolve(transf, object), expected)
})
it('ignores null transformations', () => {
const transf = { n: null }
const object = { n: 0 }
const expected = { n: 0 }
eq(evolve(transf, object), expected)
})
})