/// SPDX-License-Identifier: GPL-3.0-or-later /// SPDX-FileCopyrightText: Copyright © 2016-2021 Tony Garnock-Jones "use strict"; const assert = require('assert'); const Immutable = require('immutable'); const Bag = require('../src/bag.js'); describe('immutable bag', function () { it('should be initializable from a set', function () { var b = Bag.fromSet(Immutable.Set(['a', 'b', 'c'])); assert.strictEqual(b.count(), 3); assert.strictEqual(Bag.get(b, 'a'), 1); assert.strictEqual(Bag.get(b, 'z'), 0); }); it('should be initializable from an array', function () { var b = Bag.fromSet(['a', 'b', 'c', 'a']); assert.strictEqual(b.count(), 3); assert.strictEqual(Bag.get(b, 'a'), 1); assert.strictEqual(Bag.get(b, 'z'), 0); }); it('should be immutable', function () { var b = Bag.Bag(); Bag.change(b, 'a', 1); Bag.change(b, 'a', 1); assert(Immutable.is(b, Bag.Bag())); }); it('should count up', function () { var b = Bag.Bag(); var change1, change2; ({bag: b, net: change1} = Bag.change(b, 'a', 1)); ({bag: b, net: change2} = Bag.change(b, 'a', 1)); assert.strictEqual(change1, Bag.ABSENT_TO_PRESENT); assert.strictEqual(change2, Bag.PRESENT_TO_PRESENT); assert.strictEqual(Bag.get(b, 'a'), 2); assert.strictEqual(Bag.get(b, 'z'), 0); }); it('should count down', function () { var b = Bag.fromSet(['a']); var c1, c2, c3, c4; ({bag: b, net: c1} = Bag.change(b, 'a', 1)); ({bag: b, net: c2} = Bag.change(b, 'a', -1)); assert.strictEqual(b.count(), 1); assert.strictEqual(c1, Bag.PRESENT_TO_PRESENT); assert.strictEqual(c2, Bag.PRESENT_TO_PRESENT); ({bag: b, net: c3} = Bag.change(b, 'a', -1)); assert.strictEqual(b.count(), 0); assert.strictEqual(c3, Bag.PRESENT_TO_ABSENT); assert.strictEqual(Bag.get(b, 'a'), 0); assert.strictEqual(Bag.get(b, 'z'), 0); ({bag: b, net: c4} = Bag.change(b, 'a', -1)); assert.strictEqual(b.count(), 1); assert.strictEqual(c4, Bag.ABSENT_TO_PRESENT); assert.strictEqual(Bag.get(b, 'a'), -1); }); it('should be clamped', function() { var b = Bag.fromSet(['a']); ({bag: b} = Bag.change(b, 'a', -1, true)); ({bag: b} = Bag.change(b, 'a', -1, true)); ({bag: b} = Bag.change(b, 'a', -1, true)); ({bag: b} = Bag.change(b, 'a', -1, true)); assert.strictEqual(b.count(), 0); assert.strictEqual(Bag.get(b, 'a'), 0); }); }); describe('mutable bag', function () { it('should be initializable from a set', function () { var b = new Bag.MutableBag(Immutable.Set(['a', 'b', 'c'])); assert.strictEqual(b.count(), 3); assert.strictEqual(b.get('a'), 1); assert.strictEqual(b.get('z'), 0); }); it('should be initializable from an array', function () { var b = new Bag.MutableBag(['a', 'b', 'c', 'a']); assert.strictEqual(b.count(), 3); assert.strictEqual(b.get('a'), 1); assert.strictEqual(b.get('z'), 0); }); it('should be mutable', function () { var b = new Bag.MutableBag(); b.change('a', 1); b.change('a', 1); assert.strictEqual(b.get('a'), 2); assert.strictEqual(b.get('z'), 0); }); it('should count up', function () { var b = new Bag.MutableBag(); assert.strictEqual(b.change('a', 1), Bag.ABSENT_TO_PRESENT); assert.strictEqual(b.change('a', 1), Bag.PRESENT_TO_PRESENT); assert.strictEqual(b.get('a'), 2); assert.strictEqual(b.get('z'), 0); }); it('should count down', function () { var b = new Bag.MutableBag(['a']); assert.strictEqual(b.change('a', 1), Bag.PRESENT_TO_PRESENT); assert.strictEqual(b.change('a', -1), Bag.PRESENT_TO_PRESENT); assert.strictEqual(b.count(), 1); assert.strictEqual(b.change('a', -1), Bag.PRESENT_TO_ABSENT); assert.strictEqual(b.count(), 0); assert.strictEqual(b.get('a'), 0); assert.strictEqual(b.get('z'), 0); assert.strictEqual(b.change('a', -1), Bag.ABSENT_TO_PRESENT); assert.strictEqual(b.count(), 1); assert.strictEqual(b.get('a'), -1); }); });