Home Reference Source Test

specs/predicate-combinator.spec.js

import { assert, expect } from 'chai';

import { or, and, not, notOr } from '../src/Predicate-Combinator';


/** @test {Predicate-Combinator} */
describe('Predicate Combinator Library Tests', () => {

  /** @test {Predicate-Combinator#or} */
  it('test: .or(...predicates) - with number', () => {
    const negative = number => number < 0
        , positive = number => number > 0
        , notZero = or(negative, positive);

    assert.isFalse(notZero(0));
    assert.isTrue(notZero(-3));
    assert.isTrue(notZero(3));
  });

  /** @test {Predicate-Combinator#or} */
  it('test: .or(...predicates) - with array', () => {
    const data = [1,4,0,1,2,0]
        , negative = number => number < 0
        , positive = number => number > 0
        , notZero = or(negative, positive);

    expect(data.filter(notZero)).to.deep.equal([1,4,1,2]);
    assert.isTrue(data.some(notZero));
    assert.isFalse(data.every(notZero));
  });

  /** @test {Predicate-Combinator#not} */
  it('test: .not(...predicates) - with number', () => {
    const negative = number => number < 0
        , positive = number => number > 0
        , isZero = not(negative, positive);

    assert.isTrue(isZero(0));
    assert.isFalse(isZero(-3));
    assert.isFalse(isZero(3));
  });

  /** @test {Predicate-Combinator#not} */
  it('test: .not(...predicates) - with array', () => {
    const data = [1,4,0,1,2,0]
        , negative = number => number < 0
        , positive = number => number > 0
        , isZero = not(negative, positive);

    expect(data.filter(isZero)).to.deep.equal([0,0]);
    assert.isTrue(data.some(isZero));
    assert.isFalse(data.every(isZero));
  });

  /** @test {Predicate-Combinator#and} */
  it('test: .and(...predicates) - with string', () => {
    const isGreeting = str => str.indexOf('Hello') > -1
        , hasWorld = str => str.indexOf('World') > -1
        , isHelloWorld = and(isGreeting, hasWorld);

    assert.isTrue(isHelloWorld('Hello World'));
    assert.isFalse(isHelloWorld('Hello'));
    assert.isFalse(isHelloWorld('World'));
    assert.isFalse(isHelloWorld('Not a Greeting'));
  });

  /** @test {Predicate-Combinator#and} */
  it('test: .and(...predicates) - with array', () => {
    const data = ['Hello', 'World', 'Hello World', 'Not Greeting']
        , isGreeting = str => str.indexOf('Hello') > -1
        , hasWorld = str => str.indexOf('World') > -1
        , isHelloWorld = and(isGreeting, hasWorld);


    expect(data.filter(isHelloWorld)).to.deep.equal(['Hello World']);
    assert.isTrue(data.some(isHelloWorld));
    assert.isFalse(data.every(isHelloWorld));
  });

  /** @test {Predicate-Combinator#notOr} */
  it('test: .notOr(...predicates)', () => {
    const isGreeting = str => str.indexOf('Hello') > -1
        , hasWorld = str => str.indexOf('World') > -1;

    assert.isFalse(notOr(isGreeting, hasWorld)('Hello'));
    assert.isFalse(notOr(isGreeting, hasWorld)('World'));
    assert.isTrue(notOr(isGreeting, hasWorld)('Else'));
  });
});