forked from mystiq/hydrogen-web
finish ObservableMap and add tests
This commit is contained in:
parent
1441abbf7e
commit
d5b88cbbe6
2 changed files with 102 additions and 15 deletions
|
@ -1,16 +1,19 @@
|
|||
import BaseObservableMap from "./map/BaseObservableMap.js";
|
||||
|
||||
export default class ObservableMap extends BaseObservableMap {
|
||||
constructor(initialValues) {
|
||||
constructor(keyFn, initialValues) {
|
||||
super();
|
||||
this._keyFn = keyFn;
|
||||
this._values = new Map(initialValues);
|
||||
}
|
||||
|
||||
update(key, params) {
|
||||
const value = this._values.get(key);
|
||||
if (value !== undefined) {
|
||||
this._values.add(key, value);
|
||||
this.emitChange(key, value, params);
|
||||
// could be the same value, so it's already updated
|
||||
// but we don't assume this here
|
||||
this._values.set(key, value);
|
||||
this.emitUpdate(key, value, params);
|
||||
return true;
|
||||
}
|
||||
return false; // or return existing value?
|
||||
|
@ -18,7 +21,7 @@ export default class ObservableMap extends BaseObservableMap {
|
|||
|
||||
add(key, value) {
|
||||
if (!this._values.has(key)) {
|
||||
this._values.add(key, value);
|
||||
this._values.set(key, value);
|
||||
this.emitAdd(key, value);
|
||||
return true;
|
||||
}
|
||||
|
@ -50,6 +53,92 @@ export default class ObservableMap extends BaseObservableMap {
|
|||
}
|
||||
|
||||
[Symbol.iterator]() {
|
||||
return this._values.entries()[Symbol.iterator];
|
||||
return this._values.entries();
|
||||
}
|
||||
}
|
||||
|
||||
export function tests() {
|
||||
return {
|
||||
test_add(assert) {
|
||||
let fired = 0;
|
||||
const map = new ObservableMap();
|
||||
map.subscribe({
|
||||
onAdd(key, value) {
|
||||
fired += 1;
|
||||
assert.equal(key, 1);
|
||||
assert.deepEqual(value, {value: 5});
|
||||
}
|
||||
});
|
||||
map.add(1, {value: 5});
|
||||
assert.equal(map.size, 1);
|
||||
assert.equal(fired, 1);
|
||||
},
|
||||
|
||||
test_update(assert) {
|
||||
let fired = 0;
|
||||
const map = new ObservableMap();
|
||||
const value = {number: 5};
|
||||
map.add(1, value);
|
||||
map.subscribe({
|
||||
onUpdate(key, value, params) {
|
||||
fired += 1;
|
||||
assert.equal(key, 1);
|
||||
assert.deepEqual(value, {number: 6});
|
||||
assert.equal(params, "test");
|
||||
}
|
||||
});
|
||||
value.number = 6;
|
||||
map.update(1, "test");
|
||||
assert.equal(fired, 1);
|
||||
},
|
||||
|
||||
test_update_unknown(assert) {
|
||||
let fired = 0;
|
||||
const map = new ObservableMap(v => v.id);
|
||||
map.subscribe({
|
||||
onUpdate() { fired += 1; }
|
||||
});
|
||||
const result = map.update(1);
|
||||
assert.equal(fired, 0);
|
||||
assert.equal(result, false);
|
||||
},
|
||||
|
||||
test_remove(assert) {
|
||||
let fired = 0;
|
||||
const map = new ObservableMap();
|
||||
const value = {value: 5};
|
||||
map.add(1, value);
|
||||
map.subscribe({
|
||||
onRemove(key, value) {
|
||||
fired += 1;
|
||||
assert.equal(key, 1);
|
||||
assert.deepEqual(value, {value: 5});
|
||||
}
|
||||
});
|
||||
map.remove(1);
|
||||
assert.equal(map.size, 0);
|
||||
assert.equal(fired, 1);
|
||||
},
|
||||
|
||||
test_iterate(assert) {
|
||||
const results = [];
|
||||
const map = new ObservableMap();
|
||||
map.add(1, {number: 5});
|
||||
map.add(2, {number: 6});
|
||||
map.add(3, {number: 7});
|
||||
for (let e of map) {
|
||||
results.push(e);
|
||||
}
|
||||
assert.equal(results.length, 3);
|
||||
assert.equal(results.find(([key]) => key === 1)[1].number, 5);
|
||||
assert.equal(results.find(([key]) => key === 2)[1].number, 6);
|
||||
assert.equal(results.find(([key]) => key === 3)[1].number, 7);
|
||||
},
|
||||
test_size(assert) {
|
||||
const map = new ObservableMap();
|
||||
map.add(1, {number: 5});
|
||||
map.add(2, {number: 6});
|
||||
assert.equal(map.size, 2);
|
||||
},
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
import MapOperator from "./operators/MapOperator.js";
|
||||
import SortOperator from "./operators/SortOperator.js";
|
||||
import BaseObservableCollection from "../BaseObservableCollection.js";
|
||||
|
||||
export default class BaseObservableMap extends BaseObservableCollection {
|
||||
|
@ -16,9 +14,9 @@ export default class BaseObservableMap extends BaseObservableCollection {
|
|||
}
|
||||
}
|
||||
|
||||
emitChange(key, value, ...params) {
|
||||
emitUpdate(key, value, ...params) {
|
||||
for(let h of this._handlers) {
|
||||
h.onChange(key, value, ...params);
|
||||
h.onUpdate(key, value, ...params);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -28,11 +26,11 @@ export default class BaseObservableMap extends BaseObservableCollection {
|
|||
}
|
||||
}
|
||||
|
||||
map(mapper, updater) {
|
||||
return new MapOperator(this, mapper, updater);
|
||||
}
|
||||
// map(mapper, updater) {
|
||||
// return new MapOperator(this, mapper, updater);
|
||||
// }
|
||||
|
||||
sort(comparator) {
|
||||
return new SortOperator(this, comparator);
|
||||
}
|
||||
// sort(comparator) {
|
||||
// return new SortOperator(this, comparator);
|
||||
// }
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue