rjhilgefort
11/29/2017 - 3:21 PM

RedGreen

A factory for toggling between two names.

const RedGreen = require('./red-green');

it('gets value', () => {
  const redGreen = RedGreen();
  expect(redGreen.value).toEqual('red');
  expect(redGreen.value).toEqual('red');
});

it('resets to head value', () => {
  const redGreen = RedGreen();
  expect(redGreen.value).toEqual('red');
  expect(redGreen.reset().value).toEqual('red');
});

it('cycles through value', () => {
  const redGreen = RedGreen();
  expect(redGreen.value).toEqual('red');
  expect(redGreen.cycle().value).toEqual('green');
  expect(redGreen.cycle().value).toEqual('red');
});

it('accepts custom values', () => {
  const redGreen = RedGreen({ values: ['foo', 'bar'] });
  expect(redGreen.value).toEqual('foo');
  expect(redGreen.cycle().value).toEqual('bar');
  expect(redGreen.cycle().value).toEqual('foo');
});

it('handles more than two values ', () => {
  const redGreen = RedGreen({ values: ['foo', 'bar', 'baz', 'qux'] });
  expect(redGreen.value).toEqual('foo');
  expect(redGreen.cycle().value).toEqual('bar');
  expect(redGreen.cycle().value).toEqual('baz');
  expect(redGreen.cycle().value).toEqual('qux');
});
const RedGreen = ({
  values = ['red', 'green'],
} = {}) => {
  const _index = 0;
  return {
    values,
    _index,
    get value() {
      return this.values[this._index];
    },
    reset() {
      this._index = 0;
      return this;
    },
    cycle() {
      this._index += 1;
      if (this._index >= this.values.length) {
        this.reset();
      }
      return this;
    },
  };
};

module.exports = RedGreen;