1 | define([ |
---|
2 | "doh", |
---|
3 | "dojo/_base/array", "dojo/_base/declare", "dojo/_base/lang", |
---|
4 | "dojo/store/Memory", "dojo/store/Observable" |
---|
5 | ], function(doh, array, declare, lang, Memory, Observable){ |
---|
6 | |
---|
7 | var MyStore = declare([Memory], { |
---|
8 | get: function(){ |
---|
9 | // need to make sure that this.inherited still works with Observable |
---|
10 | return this.inherited(arguments); |
---|
11 | } |
---|
12 | }); |
---|
13 | var memoryStore, store = new Observable(memoryStore = new MyStore({ /*dojo.store.Memory*/ |
---|
14 | data: [ |
---|
15 | {id: 0, name: "zero", even: true, prime: false}, |
---|
16 | {id: 1, name: "one", prime: false}, |
---|
17 | {id: 2, name: "two", even: true, prime: true}, |
---|
18 | {id: 3, name: "three", prime: true}, |
---|
19 | {id: 4, name: "four", even: true, prime: false}, |
---|
20 | {id: 5, name: "five", prime: true} |
---|
21 | ] |
---|
22 | })); |
---|
23 | var data = [], i; |
---|
24 | for(i = 1; i <= 100; i++){ |
---|
25 | data.push({id: i, name: "item " + i, order: i}); |
---|
26 | } |
---|
27 | var bigStore = Observable(new Memory({data:data})); |
---|
28 | doh.register("dojo.tests.store.Observable", |
---|
29 | [ |
---|
30 | function testGet(t){ |
---|
31 | t.is(store.get(1).name, "one"); |
---|
32 | t.is(store.get(4).name, "four"); |
---|
33 | t.t(store.get(5).prime); |
---|
34 | }, |
---|
35 | function testQuery(t){ |
---|
36 | var results = store.query({prime: true}); |
---|
37 | t.is(results.length, 3); |
---|
38 | var changes = [], secondChanges = []; |
---|
39 | var observer = results.observe(function(object, previousIndex, newIndex){ |
---|
40 | changes.push({previousIndex:previousIndex, newIndex:newIndex, object:object}); |
---|
41 | }); |
---|
42 | var secondObserver = results.observe(function(object, previousIndex, newIndex){ |
---|
43 | secondChanges.push({previousIndex:previousIndex, newIndex:newIndex, object:object}); |
---|
44 | }); |
---|
45 | var expectedChanges = [], |
---|
46 | expectedSecondChanges = []; |
---|
47 | var two = results[0]; |
---|
48 | two.prime = false; |
---|
49 | store.put(two); // should remove it from the array |
---|
50 | t.is(results.length, 2); |
---|
51 | expectedChanges.push({ |
---|
52 | previousIndex: 0, |
---|
53 | newIndex: -1, |
---|
54 | object:{ |
---|
55 | id: 2, |
---|
56 | name: "two", |
---|
57 | even: true, |
---|
58 | prime: false |
---|
59 | } |
---|
60 | }); |
---|
61 | expectedSecondChanges.push(expectedChanges[expectedChanges.length - 1]); |
---|
62 | secondObserver.cancel(); |
---|
63 | var one = store.get(1); |
---|
64 | one.prime = true; |
---|
65 | store.put(one); // should add it |
---|
66 | expectedChanges.push({ |
---|
67 | previousIndex: -1, |
---|
68 | "newIndex":2, |
---|
69 | object:{ |
---|
70 | id: 1, |
---|
71 | name: "one", |
---|
72 | prime: true |
---|
73 | } |
---|
74 | }); |
---|
75 | t.is(results.length, 3); |
---|
76 | store.add({// shouldn't be added |
---|
77 | id:6, name:"six" |
---|
78 | }); |
---|
79 | t.is(results.length, 3); |
---|
80 | store.add({// should be added |
---|
81 | id:7, name:"seven", prime:true |
---|
82 | }); |
---|
83 | t.is(results.length, 4); |
---|
84 | |
---|
85 | expectedChanges.push({ |
---|
86 | previousIndex: -1, |
---|
87 | "newIndex":3, |
---|
88 | "object":{ |
---|
89 | id:7, name:"seven", prime:true |
---|
90 | } |
---|
91 | }); |
---|
92 | store.remove(3); |
---|
93 | expectedChanges.push({ |
---|
94 | "previousIndex":0, |
---|
95 | newIndex: -1, |
---|
96 | object: {id: 3, name: "three", prime: true} |
---|
97 | }); |
---|
98 | t.is(results.length, 3); |
---|
99 | |
---|
100 | observer.remove(); // shouldn't get any more calls |
---|
101 | store.add({// should not be added |
---|
102 | id:11, name:"eleven", prime:true |
---|
103 | }); |
---|
104 | t.is(secondChanges, expectedSecondChanges); |
---|
105 | t.is(changes, expectedChanges); |
---|
106 | }, |
---|
107 | function testQueryWithZeroId(t){ |
---|
108 | var results = store.query({}); |
---|
109 | t.is(results.length, 8); |
---|
110 | var observer = results.observe(function(object, previousIndex, newIndex){ |
---|
111 | // we only do puts so previous & new indices must always been the same |
---|
112 | // unfortunately if id = 0, the previousIndex |
---|
113 | console.log("called with: "+previousIndex+", "+newIndex); |
---|
114 | t.is(previousIndex, newIndex); |
---|
115 | }, true); |
---|
116 | store.put({id: 5, name: "-FIVE-", prime: true}); |
---|
117 | store.put({id: 0, name: "-ZERO-", prime: false}); |
---|
118 | }, |
---|
119 | function testPaging(t){ |
---|
120 | var results, opts = {count: 25, sort: [{attribute: "order"}]}; |
---|
121 | results = window.results = [ |
---|
122 | bigStore.query({}, lang.delegate(opts, {start: 0})), |
---|
123 | bigStore.query({}, lang.delegate(opts, {start: 25})), |
---|
124 | bigStore.query({}, lang.delegate(opts, {start: 50})), |
---|
125 | bigStore.query({}, lang.delegate(opts, {start: 75})) |
---|
126 | ]; |
---|
127 | var observations = []; |
---|
128 | array.forEach(results, function(r, i){ |
---|
129 | r.observe(function(obj, from, to){ |
---|
130 | observations.push({from: from, to: to}); |
---|
131 | console.log(i, " observed: ", obj, from, to); |
---|
132 | }, true); |
---|
133 | }); |
---|
134 | bigStore.add({id: 101, name: "one oh one", order: 2.5}); |
---|
135 | t.is(results[0].length, 26); |
---|
136 | t.is(results[1].length, 25); |
---|
137 | t.is(results[2].length, 25); |
---|
138 | t.is(results[3].length, 25); |
---|
139 | t.is(observations.length, 1); |
---|
140 | bigStore.remove(101); |
---|
141 | t.is(observations.length, 2); |
---|
142 | t.is(results[0].length, 25); |
---|
143 | bigStore.add({id: 102, name: "one oh two", order: 26.5}); |
---|
144 | t.is(results[0].length, 25); |
---|
145 | t.is(results[1].length, 26); |
---|
146 | t.is(results[2].length, 25); |
---|
147 | t.is(observations.length, 3); |
---|
148 | }, |
---|
149 | function testType(t){ |
---|
150 | t.f(memoryStore == store); |
---|
151 | // TODO: use store.instanceOf() |
---|
152 | // t.t(store instanceof Observable); |
---|
153 | } |
---|
154 | ] |
---|
155 | ); |
---|
156 | }); |
---|