UNPKG

@eluvio/elv-js-helpers

Version:

A collection of Javascript helper functions used by several Eluvio libraries.

145 lines (118 loc) 6.39 kB
const TH = require('../../../test-helpers') const assertBounded = TH.requireSrcFile('ModelAssertion/assertBounded') describe('assertBounded', () => { const NumberModel = TH.requireSrcFile('Model/NumberModel') const [assertPositiveNumberFn, assertPositiveErrMsgFn] = assertBounded(NumberModel, 0, null, false, null) const [assertNegativeNumberFn, assertNegativeErrMsgFn] = assertBounded(NumberModel, null, 0, null, false) const [assertNonPositiveNumberFn, assertNonPositiveErrMsgFn] = assertBounded(NumberModel, null, 0, null, true) const [assertNonNegativeNumberFn, assertNonNegativeErrMsgFn] = assertBounded(NumberModel, 0, null, true, null) // all numbers except Infinity and -Infinity const [assertFiniteNumberFn, assertFiniteErrMsgFn] = assertBounded(NumberModel, -Infinity, Infinity, false, false) // all numbers valid, syntax 1 const [assertAnyNumberFn1, assertAnyNumberErrMsgFn1] = assertBounded(NumberModel, -Infinity, Infinity, true, true) // all numbers valid, syntax 2 - err msg returned is just a string const [assertAnyNumberFn2, assertAnyNumberErrMsg2] = assertBounded(NumberModel, null, null, null, null) it('should generate an assertion that returns expected value for inputs that are instances of underlying Model', () => { assertPositiveNumberFn(-Infinity).should.be.false assertPositiveNumberFn(-1.5).should.be.false assertPositiveNumberFn(-1).should.be.false assertPositiveNumberFn(0).should.be.false assertPositiveNumberFn(1).should.be.true assertPositiveNumberFn(1.5).should.be.true assertPositiveNumberFn(Infinity).should.be.true assertNegativeNumberFn(-Infinity).should.be.true assertNegativeNumberFn(-1.5).should.be.true assertNegativeNumberFn(-1).should.be.true assertNegativeNumberFn(0).should.be.false assertNegativeNumberFn(1).should.be.false assertNegativeNumberFn(1.5).should.be.false assertNegativeNumberFn(Infinity).should.be.false assertNonPositiveNumberFn(-Infinity).should.be.true assertNonPositiveNumberFn(-1.5).should.be.true assertNonPositiveNumberFn(-1).should.be.true assertNonPositiveNumberFn(0).should.be.true assertNonPositiveNumberFn(1).should.be.false assertNonPositiveNumberFn(1.5).should.be.false assertNonPositiveNumberFn(Infinity).should.be.false assertNonNegativeNumberFn(-Infinity).should.be.false assertNonNegativeNumberFn(-1.5).should.be.false assertNonNegativeNumberFn(-1).should.be.false assertNonNegativeNumberFn(0).should.be.true assertNonNegativeNumberFn(1).should.be.true assertNonNegativeNumberFn(1.5).should.be.true assertNonNegativeNumberFn(Infinity).should.be.true assertFiniteNumberFn(-Infinity).should.be.false assertFiniteNumberFn(-1.5).should.be.true assertFiniteNumberFn(-1).should.be.true assertFiniteNumberFn(0).should.be.true assertFiniteNumberFn(1).should.be.true assertFiniteNumberFn(1.5).should.be.true assertFiniteNumberFn(Infinity).should.be.false assertAnyNumberFn1(-Infinity).should.be.true assertAnyNumberFn1(-1.5).should.be.true assertAnyNumberFn1(1).should.be.true assertAnyNumberFn1(0).should.be.true assertAnyNumberFn1(1).should.be.true assertAnyNumberFn1(1.5).should.be.true assertAnyNumberFn1(Infinity).should.be.true assertAnyNumberFn2(-Infinity).should.be.true assertAnyNumberFn2(-1.5).should.be.true assertAnyNumberFn2(1).should.be.true assertAnyNumberFn2(0).should.be.true assertAnyNumberFn2(1).should.be.true assertAnyNumberFn2(1.5).should.be.true assertAnyNumberFn2(Infinity).should.be.true }) it('should generate an assertion that returns true for values that are not instances of the underlying Model', () => { [ assertPositiveNumberFn, assertNegativeNumberFn, assertNonPositiveNumberFn, assertNonNegativeNumberFn, assertFiniteNumberFn, assertAnyNumberFn1, assertAnyNumberFn2 ].map( f => { f([1]).should.be.true f('a').should.be.true f(null).should.be.true f(undefined).should.be.true } ) }) it('should generate an assertion error message function that returns message with bad value and (if available) attribute name', () => { // note that in real life the offending value would be numeric, and assertAnyNumberErrMsgFn1 and // assertAnyNumberErrMsgFn2 should never actually get called assertPositiveErrMsgFn(false, NaN, null).should.equal('Value must be > 0 (got: NaN)') assertPositiveErrMsgFn(false, NaN, 'pixelWidth').should.equal('pixelWidth must be > 0 (got: NaN)') assertNegativeErrMsgFn(false, NaN, null).should.equal('Value must be < 0 (got: NaN)') assertNegativeErrMsgFn(false, NaN, 'pixelWidth').should.equal('pixelWidth must be < 0 (got: NaN)') assertNonPositiveErrMsgFn(false, NaN, null).should.equal('Value must be <= 0 (got: NaN)') assertNonPositiveErrMsgFn(false, NaN, 'pixelWidth').should.equal('pixelWidth must be <= 0 (got: NaN)') assertNonNegativeErrMsgFn(false, NaN, null).should.equal('Value must be >= 0 (got: NaN)') assertNonNegativeErrMsgFn(false, NaN, 'pixelWidth').should.equal('pixelWidth must be >= 0 (got: NaN)') assertFiniteErrMsgFn(false, NaN, null).should.equal('Value must be > -Infinity and < Infinity (got: NaN)') assertFiniteErrMsgFn(false, NaN, 'pixelWidth').should.equal('pixelWidth must be > -Infinity and < Infinity (got: NaN)') assertAnyNumberErrMsgFn1(false, NaN, null).should.equal('Value must be >= -Infinity and <= Infinity (got: NaN)') assertAnyNumberErrMsgFn1(false, NaN, 'pixelWidth').should.equal('pixelWidth must be >= -Infinity and <= Infinity (got: NaN)') assertAnyNumberErrMsg2.should.equal('') }) it('should work as expected when used to extend a Model', () => { const NumberBetweenZeroAndOneModel = NumberModel.extend() .assert(...assertBounded(NumberModel, 0, 1, true, true)) .as('NumberBetweenZeroAndOne') TH.expect(() => NumberBetweenZeroAndOneModel(-1)).to.throw('Value must be >= 0 and <= 1 (got: -1)') NumberBetweenZeroAndOneModel(0).should.equal(0) NumberBetweenZeroAndOneModel(0.5).should.equal(0.5) NumberBetweenZeroAndOneModel(1).should.equal(1) TH.expect(() => NumberBetweenZeroAndOneModel(2)).to.throw('Value must be >= 0 and <= 1 (got: 2)') }) })