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";
|
import BaseObservableMap from "./map/BaseObservableMap.js";
|
||||||
|
|
||||||
export default class ObservableMap extends BaseObservableMap {
|
export default class ObservableMap extends BaseObservableMap {
|
||||||
constructor(initialValues) {
|
constructor(keyFn, initialValues) {
|
||||||
super();
|
super();
|
||||||
|
this._keyFn = keyFn;
|
||||||
this._values = new Map(initialValues);
|
this._values = new Map(initialValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
update(key, params) {
|
update(key, params) {
|
||||||
const value = this._values.get(key);
|
const value = this._values.get(key);
|
||||||
if (value !== undefined) {
|
if (value !== undefined) {
|
||||||
this._values.add(key, value);
|
// could be the same value, so it's already updated
|
||||||
this.emitChange(key, value, params);
|
// but we don't assume this here
|
||||||
|
this._values.set(key, value);
|
||||||
|
this.emitUpdate(key, value, params);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false; // or return existing value?
|
return false; // or return existing value?
|
||||||
|
@ -18,7 +21,7 @@ export default class ObservableMap extends BaseObservableMap {
|
||||||
|
|
||||||
add(key, value) {
|
add(key, value) {
|
||||||
if (!this._values.has(key)) {
|
if (!this._values.has(key)) {
|
||||||
this._values.add(key, value);
|
this._values.set(key, value);
|
||||||
this.emitAdd(key, value);
|
this.emitAdd(key, value);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -50,6 +53,92 @@ export default class ObservableMap extends BaseObservableMap {
|
||||||
}
|
}
|
||||||
|
|
||||||
[Symbol.iterator]() {
|
[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";
|
import BaseObservableCollection from "../BaseObservableCollection.js";
|
||||||
|
|
||||||
export default class BaseObservableMap extends BaseObservableCollection {
|
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) {
|
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) {
|
// map(mapper, updater) {
|
||||||
return new MapOperator(this, mapper, updater);
|
// return new MapOperator(this, mapper, updater);
|
||||||
}
|
// }
|
||||||
|
|
||||||
sort(comparator) {
|
// sort(comparator) {
|
||||||
return new SortOperator(this, comparator);
|
// return new SortOperator(this, comparator);
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue