UNPKG

can

Version:

MIT-licensed, client-side, JavaScript framework that makes building rich web applications easy.

157 lines (153 loc) 5.14 kB
define([ "doh", "dojo/_base/array", "dojo/_base/declare", "dojo/_base/lang", "dojo/store/Memory", "dojo/store/Observable" ], function(doh, array, declare, lang, Memory, Observable){ var MyStore = declare([Memory], { get: function(){ // need to make sure that this.inherited still works with Observable return this.inherited(arguments); } }); var memoryStore, store = new Observable(memoryStore = new MyStore({ /*dojo.store.Memory*/ data: [ {id: 0, name: "zero", even: true, prime: false}, {id: 1, name: "one", prime: false}, {id: 2, name: "two", even: true, prime: true}, {id: 3, name: "three", prime: true}, {id: 4, name: "four", even: true, prime: false}, {id: 5, name: "five", prime: true} ] })); var data = [], i; for(i = 1; i <= 100; i++){ data.push({id: i, name: "item " + i, order: i}); } var bigStore = Observable(new Memory({data:data})); doh.register("dojo.tests.store.Observable", [ function testGet(t){ t.is(store.get(1).name, "one"); t.is(store.get(4).name, "four"); t.t(store.get(5).prime); }, function testQuery(t){ var results = store.query({prime: true}); t.is(results.length, 3); var changes = [], secondChanges = []; var observer = results.observe(function(object, previousIndex, newIndex){ changes.push({previousIndex:previousIndex, newIndex:newIndex, object:object}); }); var secondObserver = results.observe(function(object, previousIndex, newIndex){ secondChanges.push({previousIndex:previousIndex, newIndex:newIndex, object:object}); }); var expectedChanges = [], expectedSecondChanges = []; var two = results[0]; two.prime = false; store.put(two); // should remove it from the array t.is(results.length, 2); expectedChanges.push({ previousIndex: 0, newIndex: -1, object:{ id: 2, name: "two", even: true, prime: false } }); expectedSecondChanges.push(expectedChanges[expectedChanges.length - 1]); secondObserver.cancel(); var one = store.get(1); one.prime = true; store.put(one); // should add it expectedChanges.push({ previousIndex: -1, "newIndex":2, object:{ id: 1, name: "one", prime: true } }); t.is(results.length, 3); store.add({// shouldn't be added id:6, name:"six" }); t.is(results.length, 3); store.add({// should be added id:7, name:"seven", prime:true }); t.is(results.length, 4); expectedChanges.push({ previousIndex: -1, "newIndex":3, "object":{ id:7, name:"seven", prime:true } }); store.remove(3); expectedChanges.push({ "previousIndex":0, newIndex: -1, object: {id: 3, name: "three", prime: true} }); t.is(results.length, 3); observer.remove(); // shouldn't get any more calls store.add({// should not be added id:11, name:"eleven", prime:true }); t.is(secondChanges, expectedSecondChanges); t.is(changes, expectedChanges); }, function testQueryWithZeroId(t){ var results = store.query({}); t.is(results.length, 8); var observer = results.observe(function(object, previousIndex, newIndex){ // we only do puts so previous & new indices must always been the same // unfortunately if id = 0, the previousIndex console.log("called with: "+previousIndex+", "+newIndex); t.is(previousIndex, newIndex); }, true); store.put({id: 5, name: "-FIVE-", prime: true}); store.put({id: 0, name: "-ZERO-", prime: false}); }, function testPaging(t){ var results, opts = {count: 25, sort: [{attribute: "order"}]}; results = window.results = [ bigStore.query({}, lang.delegate(opts, {start: 0})), bigStore.query({}, lang.delegate(opts, {start: 25})), bigStore.query({}, lang.delegate(opts, {start: 50})), bigStore.query({}, lang.delegate(opts, {start: 75})) ]; var observations = []; array.forEach(results, function(r, i){ r.observe(function(obj, from, to){ observations.push({from: from, to: to}); console.log(i, " observed: ", obj, from, to); }, true); }); bigStore.add({id: 101, name: "one oh one", order: 2.5}); t.is(results[0].length, 26); t.is(results[1].length, 25); t.is(results[2].length, 25); t.is(results[3].length, 25); t.is(observations.length, 1); bigStore.remove(101); t.is(observations.length, 2); t.is(results[0].length, 25); bigStore.add({id: 102, name: "one oh two", order: 26.5}); t.is(results[0].length, 25); t.is(results[1].length, 26); t.is(results[2].length, 25); t.is(observations.length, 3); }, function testType(t){ t.f(memoryStore == store); // TODO: use store.instanceOf() // t.t(store instanceof Observable); } ] ); });