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;