Files
zulip/zerver/tests/frontend/node/dict.js
Zev Benjamin 3f95e54dc1 dict: Add setdefault method
This is like Python's dict.setdefault.  I don't love the name, but
the consistency is nice.

We have lots of places where we do things like:

    if (! dict.has('foo')) {
      dict.set('foo', []);
    }

    var arr = dict.get('foo');
    arr.push(3);

We can now write:

    var arr = dict.setdefault('foo', []);
    arr.push(3);

(imported from commit b8933809c69ba47ec346ed51d53966793403e56c)
2013-08-21 14:11:39 -04:00

104 lines
2.6 KiB
JavaScript

global._ = require('third/underscore/underscore.js');
global.util = require('js/util.js');
var Dict = require('js/dict.js');
var assert = require('assert');
var _ = global._;
(function test_basic() {
var d = new Dict();
assert.deepEqual(d.keys(), []);
d.set('foo', 'bar');
assert.equal(d.get('foo'), 'bar');
d.set('foo', 'baz');
assert.equal(d.get('foo'), 'baz');
d.set('bar', 'qux');
assert.equal(d.get('foo'), 'baz');
assert.equal(d.get('bar'), 'qux');
assert.equal(d.has('bar'), true);
assert.equal(d.has('baz'), false);
assert.deepEqual(d.keys(), ['foo', 'bar']);
assert.deepEqual(d.values(), ['baz', 'qux']);
assert.deepEqual(d.items(), [['foo', 'baz'], ['bar', 'qux']]);
d.del('bar');
assert.equal(d.has('bar'), false);
assert.strictEqual(d.get('bar'), undefined);
assert.deepEqual(d.keys(), ['foo']);
var val = ['foo'];
var res = d.set('abc', val);
assert.equal(val, res);
}());
(function test_restricted_keys() {
var d = new Dict();
assert.equal(d.has('__proto__'), false);
assert.equal(d.has('hasOwnProperty'), false);
assert.equal(d.has('toString'), false);
assert.strictEqual(d.get('__proto__'), undefined);
assert.strictEqual(d.get('hasOwnProperty'), undefined);
assert.strictEqual(d.get('toString'), undefined);
d.set('hasOwnProperty', function () {return true;});
assert.equal(d.has('blah'), false);
d.set('__proto__', 'foo');
d.set('foo', 'bar');
assert.equal(d.get('foo'), 'bar');
}());
(function test_construction() {
var d1 = new Dict();
assert.deepEqual(d1.items(), []);
var d2 = Dict.from({foo: 'bar', baz: 'qux'});
assert.deepEqual(d2.items(), [['foo', 'bar'], ['baz', 'qux']]);
var d3 = d2.clone();
d3.del('foo');
assert.deepEqual(d2.items(), [['foo', 'bar'], ['baz', 'qux']]);
assert.deepEqual(d3.items(), [['baz', 'qux']]);
}());
(function test_each() {
var d = new Dict();
d.set('apple', 40);
d.set('banana', 50);
d.set('carrot', 60);
var unseen_keys = d.keys();
var cnt = 0;
d.each(function (v, k) {
assert.equal(v, d.get(k));
unseen_keys = _.without(unseen_keys, k);
cnt += 1;
});
assert.equal(cnt, d.keys().length);
assert.equal(unseen_keys.length, 0);
}());
(function test_setdefault() {
var d = new Dict();
var val = ['foo'];
var res = d.setdefault('foo', val);
assert.equal(res, val);
assert.equal(d.has('foo'), true);
assert.equal(d.get('foo'), val);
var val2 = ['foo2'];
res = d.setdefault('foo', val2);
assert.equal(res, val);
assert.equal(d.get('foo'), val);
}());