test_simplemedialistnotifications.js
Go to the documentation of this file.
1 /*
2 //
3 // BEGIN SONGBIRD GPL
4 //
5 // This file is part of the Songbird web player.
6 //
7 // Copyright(c) 2005-2008 POTI, Inc.
8 // http://songbirdnest.com
9 //
10 // This file may be licensed under the terms of of the
11 // GNU General Public License Version 2 (the "GPL").
12 //
13 // Software distributed under the License is distributed
14 // on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
15 // express or implied. See the GPL for the specific language
16 // governing rights and limitations.
17 //
18 // You should have received a copy of the GPL along with this
19 // program. If not, go to http://www.gnu.org/licenses/gpl.html
20 // or write to the Free Software Foundation, Inc.,
21 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22 //
23 // END SONGBIRD GPL
24 //
25 */
26 
31 function runTest () {
32 
33  Components.utils.import("resource://app/jsmodules/ArrayConverter.jsm");
34 
35  var databaseGUID = "test_simplemedialistnotifications";
36  var library = createLibrary(databaseGUID, null, false);
37 
38  var item = library.createMediaItem(newURI("http://foo.example.com/"));
39  var list = library.createMediaList("simple");
40 
41  var libraryListener = new TestMediaListListener();
42  library.addListener(libraryListener, false);
43  var listListener = new TestMediaListListener();
44  list.addListener(listListener, false);
45 
46  // test onItemUpdated
47  var prop = "http://songbirdnest.com/data/1.0#albumName";
48  item.setProperty(prop, "foo");
49  assertTrue(item.equals(libraryListener.updatedItem));
50  assertEqual(listListener.updatedItem, null);
51 
52  libraryListener.reset();
53  listListener.reset();
54 
55  // test onAdded
56  list.add(item);
57  assertEqual(libraryListener.added.length, 0);
58  assertTrue(item.equals(listListener.added[0].item));
59  assertEqual(listListener.added[0].index, 0);
60 
61  libraryListener.reset();
62  listListener.reset();
63 
64  var anotheritem = library.createMediaItem(newURI("http://foo.example.com/1"));
65  list.add(anotheritem);
66  assertTrue(anotheritem.equals(listListener.added[0].item));
67  assertEqual(listListener.added[0].index, 1);
68 
69  libraryListener.reset();
70  listListener.reset();
71 
72  var otheritem2 = library.createMediaItem(newURI("http://foo.example.com/2"));
73  var otheritem3 = library.createMediaItem(newURI("http://foo.example.com/3"));
74  var e = ArrayConverter.enumerator([otheritem2, otheritem3]);
75  list.addSome(e);
76  assertTrue(otheritem2.equals(listListener.added[0].item));
77  assertEqual(listListener.added[0].index, 2);
78  assertTrue(otheritem3.equals(listListener.added[1].item));
79  assertEqual(listListener.added[1].index, 3);
80 
81  libraryListener.reset();
82  listListener.reset();
83 
84  var otheritem4 = library.createMediaItem(newURI("http://foo.example.com/4"));
85  list.insertBefore(2, otheritem4);
86  assertTrue(otheritem4.equals(listListener.added[0].item));
87  assertEqual(listListener.added[0].index, 2);
88 
89  libraryListener.reset();
90  listListener.reset();
91 
92  var otheritem5 = library.createMediaItem(newURI("http://foo.example.com/5"));
93  var otheritem6 = library.createMediaItem(newURI("http://foo.example.com/6"));
94  var e = ArrayConverter.enumerator([otheritem5, otheritem6]);
95  list.insertSomeBefore(3, e);
96  assertTrue(otheritem5.equals(listListener.added[0].item));
97  assertEqual(listListener.added[0].index, 3);
98  assertTrue(otheritem6.equals(listListener.added[1].item));
99  assertEqual(listListener.added[1].index, 4);
100 
101  libraryListener.reset();
102  listListener.reset();
103 
104  item.setProperty(prop, "foo");
105 
106  assertTrue(item.equals(libraryListener.updatedItem));
107  assertTrue(item.equals(listListener.updatedItem));
108 
109  // test moving
110  list.clear();
111  var item1 = library.createMediaItem(newURI("http://foo.example.com/"));
112  var item2 = library.createMediaItem(newURI("http://foo.example.com/"));
113  var item3 = library.createMediaItem(newURI("http://foo.example.com/"));
114  var item4 = library.createMediaItem(newURI("http://foo.example.com/"));
115  list.add(item1);
116  list.add(item2);
117  list.add(item3);
118  list.add(item4);
119 
120  libraryListener.reset();
121  listListener.reset();
122 
123  // move one item up
124  list.moveBefore(2, 0);
125  assertEqual(listListener.movedItemFromIndex[0], 2);
126  assertEqual(listListener.movedItemToIndex[0], 0);
127  assertEqual(libraryListener.movedItemFromIndex.length, 0);
128  assertEqual(libraryListener.movedItemToIndex.length, 0);
129 
130  libraryListener.reset();
131  listListener.reset();
132 
133  // move one item down
134  list.moveBefore(0, 3);
135  assertEqual(listListener.movedItemFromIndex[0], 0);
136  assertEqual(listListener.movedItemToIndex[0], 2);
137  assertEqual(libraryListener.movedItemFromIndex.length, 0);
138  assertEqual(libraryListener.movedItemToIndex.length, 0);
139 
140  libraryListener.reset();
141  listListener.reset();
142 
143  // move one item last
144  list.moveLast(1);
145  assertEqual(listListener.movedItemFromIndex[0], 1);
146  assertEqual(listListener.movedItemToIndex[0], 3);
147  assertEqual(libraryListener.movedItemFromIndex.length, 0);
148  assertEqual(libraryListener.movedItemToIndex.length, 0);
149 
150  libraryListener.reset();
151  listListener.reset();
152 
153  // move two items up
154  var a = [2, 3];
155  list.moveSomeBefore(a, a.length, 0);
156  assertEqual(listListener.movedItemFromIndex[0], 2);
157  assertEqual(listListener.movedItemToIndex[0], 0);
158  assertEqual(listListener.movedItemFromIndex[1], 3);
159  assertEqual(listListener.movedItemToIndex[1], 1);
160  assertEqual(libraryListener.movedItemFromIndex.length, 0);
161  assertEqual(libraryListener.movedItemToIndex.length, 0);
162 
163  libraryListener.reset();
164  listListener.reset();
165 
166  // move two items down
167  a = [0, 1];
168  list.moveSomeBefore(a, a.length, 3);
169  assertEqual(listListener.movedItemFromIndex[0], 0);
170  assertEqual(listListener.movedItemToIndex[0], 2);
171  assertEqual(listListener.movedItemFromIndex[1], 0);
172  assertEqual(listListener.movedItemToIndex[1], 2);
173  assertEqual(libraryListener.movedItemFromIndex.length, 0);
174  assertEqual(libraryListener.movedItemToIndex.length, 0);
175 
176  libraryListener.reset();
177  listListener.reset();
178 
179  // move two items last
180  a = [0, 1];
181  list.moveSomeLast(a, a.length);
182  assertEqual(listListener.movedItemFromIndex[0], 0);
183  assertEqual(listListener.movedItemToIndex[0], 3);
184  assertEqual(listListener.movedItemFromIndex[1], 0);
185  assertEqual(listListener.movedItemToIndex[1], 3);
186 
187  list.clear();
188  libraryListener.reset();
189  listListener.reset();
190 
191  // test onBeforeItemRemoved/onAfterItemRemoved
192  library.remove(item);
193  assertTrue(item.equals(libraryListener.removedBefore[0].item));
194  assertTrue(item.equals(libraryListener.removedAfter[0].item));
195  assertEqual(listListener.removedBefore.length, 0);
196  assertEqual(listListener.removedAfter.length, 0);
197 
198  list.clear();
199  item1 = library.createMediaItem(newURI("http://foo.example.com/r1"));
200  item2 = library.createMediaItem(newURI("http://foo.example.com/r2"));
201  item3 = library.createMediaItem(newURI("http://foo.example.com/r3"));
202  item4 = library.createMediaItem(newURI("http://foo.example.com/r4"));
203  var item5 = library.createMediaItem(newURI("http://foo.example.com/r5"));
204  var item6 = library.createMediaItem(newURI("http://foo.example.com/r6"));
205  list.add(item1);
206  list.add(item2);
207  list.add(item3);
208  list.add(item4);
209  list.add(item5);
210  list.add(item6);
211  libraryListener.reset();
212  listListener.reset();
213 
214  list.remove(item4);
215 
216  assertEqual(libraryListener.removedBefore.length, 0);
217  assertEqual(libraryListener.removedAfter.length, 0);
218  assertTrue(item4.equals(listListener.removedBefore[0].item));
219  assertEqual(listListener.removedBefore[0].index, 3);
220  assertTrue(item4.equals(listListener.removedAfter[0].item));
221  assertEqual(listListener.removedAfter[0].index, 3);
222 
223  libraryListener.reset();
224  listListener.reset();
225 
226  // Test that items removed from the library that are in a list are notified
227  // properly
228  var oldIndex = library.indexOf(item2, 0);
229  library.remove(item2);
230 
231  assertTrue(item2.equals(libraryListener.removedBefore[0].item));
232  assertEqual(libraryListener.removedBefore[0].index, oldIndex);
233  assertTrue(item2.equals(libraryListener.removedAfter[0].item));
234  assertEqual(libraryListener.removedAfter[0].index, oldIndex);
235 
236  assertTrue(item2.equals(listListener.removedBefore[0].item));
237  assertEqual(listListener.removedBefore[0].index, 1);
238  assertTrue(item2.equals(listListener.removedAfter[0].item));
239  assertEqual(listListener.removedAfter[0].index, 1);
240 
241  libraryListener.reset();
242  listListener.reset();
243 
244  var e = ArrayConverter.enumerator([item5, item6]);
245  list.removeSome(e);
246 
247  assertTrue(item5.equals(listListener.removedBefore[0].item));
248  assertEqual(listListener.removedBefore[0].index, 2);
249  assertTrue(item5.equals(listListener.removedAfter[0].item));
250  assertEqual(listListener.removedAfter[0].index, 2);
251 
252  assertTrue(item6.equals(listListener.removedBefore[1].item));
253  assertEqual(listListener.removedBefore[1].index, 3);
254  assertTrue(item6.equals(listListener.removedAfter[1].item));
255  assertEqual(listListener.removedAfter[1].index, 3);
256 
257  libraryListener.reset();
258  listListener.reset();
259 
260  list.removeByIndex(1);
261  assertTrue(item3.equals(listListener.removedBefore[0].item));
262  assertEqual(listListener.removedBefore[0].index, 1);
263  assertTrue(item3.equals(listListener.removedAfter[0].item));
264  assertEqual(listListener.removedAfter[0].index, 1);
265 
266  // test clear
267  item = library.createMediaItem(newURI("http://foo.example.com/"));
268  list.add(item);
269  libraryListener.reset();
270  listListener.reset();
271 
272  list.clear();
273  assertFalse(libraryListener.listCleared);
274  assertTrue(listListener.listCleared);
275 
276  libraryListener.reset();
277  listListener.reset();
278 
279  library.clear();
280  assertTrue(libraryListener.listCleared);
281  assertTrue(listListener.listCleared);
282 
283  item = library.createMediaItem(newURI("http://foo.example.com/"));
284  list = library.createMediaList("simple");
285  list.addListener(listListener, false);
286 
287  libraryListener.reset();
288  listListener.reset();
289 
290  // test begin/end update batch
291  library.runInBatchMode(function() {});
292 
293  assertTrue(library.equals(libraryListener.batchBeginList));
294  assertTrue(library.equals(libraryListener.batchEndList));
295  assertEqual(listListener.batchBeginList, null);
296  assertEqual(listListener.batchEndList, null);
297 
298  libraryListener.reset();
299  listListener.reset();
300 
301  list.runInBatchMode(function() {});
302  assertEqual(libraryListener.batchBeginList, null);
303  assertEqual(libraryListener.batchEndList, null);
304  assertTrue(list.equals(listListener.batchBeginList));
305  assertTrue(list.equals(listListener.batchEndList));
306 
307  list.removeListener(listListener);
308  library.removeListener(libraryListener);
309 
310  // Test cross-library operations
311  var databaseGUID2 = "test_simplemedialistnotifications2";
312  var library2 = createLibrary(databaseGUID2, null, false);
313  var list2 = library2.createMediaList("simple");
314 
315  var libraryListener2 = new TestMediaListListener();
316  library2.addListener(libraryListener2, false);
317 
318  library2.add(item);
319 
320  assertEqual(item.contentSrc.spec, libraryListener2.added[0].item.contentSrc.spec);
321  assertFalse(item.equals(libraryListener2.added[0].item));
322  assertTrue(libraryListener2.added[0].item.library.equals(library2));
323 
324  library2.remove(libraryListener2.added[0].item);
325  libraryListener2.reset();
326 
327  var listListener2 = new TestMediaListListener();
328  list2.addListener(listListener2, false);
329 
330  list2.add(item);
331 
332  assertEqual(item.contentSrc.spec, libraryListener2.added[0].item.contentSrc.spec);
333  assertFalse(item.equals(libraryListener2.added[0].item));
334  assertEqual(item.contentSrc.spec, listListener2.added[0].item.contentSrc.spec);
335  assertFalse(item.equals(listListener2.added[0].item));
336 
337  // Assert that the items received by the listener are from library2
338  assertTrue(libraryListener2.added[0].list.library.equals(library2));
339  assertTrue(libraryListener2.added[0].item.library.equals(library2));
340  assertTrue(listListener2.added[0].list.library.equals(library2));
341  assertTrue(listListener2.added[0].item.library.equals(library2));
342 
343  libraryListener2.reset();
344  listListener2.reset();
345 
346  list2.add(item);
347 
348  assertEqual(item.contentSrc.spec, listListener2.added[0].item.contentSrc.spec);
349  assertFalse(item.equals(listListener2.added[0].item));
350 
351  libraryListener2.reset();
352  listListener2.reset();
353  list2.removeListener(listListener2);
354  library2.removeListener(libraryListener2);
355  library2.clear();
356 
357  var listToCopy = library.createMediaList("simple");
358  listToCopy.add(item);
359 
360  var listener = {
361  adds: [],
362  listened: [],
363  onItemAdded: function onItemAdded(list, item) {
364  this.adds.push({list: list, item: item});
365  if (item instanceof Ci.sbIMediaList) {
366  var l = item.QueryInterface(Ci.sbIMediaList);
367  l.addListener(this, false);
368  this.listened.push(l);
369  }
370  return false;
371  },
372  onBatchBegin: function onBatchBegin(list) {
373  },
374  onBatchEnd: function onBatchEnd(list) {
375  },
376  reset: function() {
377  this.listened.forEach(function(e) {
378  e.removeListener(this);
379  }, this);
380  this.adds = [];
381  this.listened = [];
382  }
383  };
384  library2.addListener(listener, false);
385 
386  var copiedList = library2.copyMediaList("simple", listToCopy, false);
387 
388  assertEqual(listener.adds.length, 3);
389 
390  // The first onItemAdded should be for the new list getting created
391  assertTrue(listener.adds[0].list.equals(library2));
392  assertTrue(listener.adds[0].item.equals(copiedList));
393  assertTrue(listener.adds[0].item.library.equals(library2));
394 
395  // The second onItemAdded is for the item getting added to the library
396  assertTrue(listener.adds[1].list.equals(library2));
397  assertTrue(listener.adds[1].item.library.equals(library2));
398 
399  // The third onItemAdded is the new item getting added to the new list
400  assertTrue(listener.adds[2].list.equals(copiedList));
401  assertTrue(listener.adds[2].list.library.equals(library2));
402  assertTrue(listener.adds[2].item.equals(listener.adds[1].item));
403  assertTrue(listener.adds[2].item.library.equals(library2));
404 
405  // Add some items to library2's list so we can test insert
406  list2 = library2.createMediaList("simple");
407  listListener2 = new TestMediaListListener();
408  list2.addListener(listListener2, false);
409  list2.add(library2.createMediaItem(newURI("http://bar.com/1.mp3")));
410  list2.add(library2.createMediaItem(newURI("http://bar.com/2.mp3")));
411 
412  listener.reset();
413  listListener2.reset();
414 
415  // Test using insertBefore to insert a foreign item
416  var foreignItem = library.createMediaItem(newURI("http://foo.example.com/f.mp3"));
417  list2.insertBefore(1, foreignItem);
418 
419  // The first onItemAdded should be for the new item getting created
420  assertTrue(listener.adds[0].list.equals(library2));
421  assertTrue(listener.adds[0].list.library.equals(library2));
422  assertTrue(listener.adds[0].item.library.equals(library2));
423  assertEqual(listener.adds[0].item.contentSrc.spec, foreignItem.contentSrc.spec);
424 
425  // The second onItemAdded is for the item getting added to the list
426  assertTrue(listListener2.added[0].list.equals(list2));
427  assertTrue(listListener2.added[0].list.library.equals(library2));
428  assertTrue(listListener2.added[0].item.library.equals(library2));
429  assertTrue(listListener2.added[0].item.equals(listener.adds[0].item));
430 
431  listener.reset();
432  listListener2.reset();
433 
434  var foreignItem2 = library.createMediaItem(newURI("http://foo.example.com/f2.mp3"));
435  var foreignItem3 = library.createMediaItem(newURI("http://foo.example.com/f3.mp3"));
436  var e = ArrayConverter.enumerator([foreignItem2, foreignItem3]);
437  list2.insertSomeBefore(1, e);
438 
439  // The first onItemAddeds should be for the new items getting created
440  assertTrue(listener.adds[0].list.equals(library2));
441  assertTrue(listener.adds[0].list.library.equals(library2));
442  assertTrue(listener.adds[0].item.library.equals(library2));
443  assertEqual(listener.adds[0].item.contentSrc.spec, foreignItem2.contentSrc.spec);
444 
445  assertTrue(listener.adds[1].list.equals(library2));
446  assertTrue(listener.adds[1].list.library.equals(library2));
447  assertTrue(listener.adds[1].item.library.equals(library2));
448  assertEqual(listener.adds[1].item.contentSrc.spec, foreignItem3.contentSrc.spec);
449 
450  // The second onItemAddeds are for the items getting added to the list
451  assertTrue(listListener2.added[0].list.equals(list2));
452  assertTrue(listListener2.added[0].list.library.equals(library2));
453  assertTrue(listListener2.added[0].item.library.equals(library2));
454  assertTrue(listListener2.added[0].item.equals(listener.adds[0].item));
455 
456  assertTrue(listListener2.added[1].list.equals(list2));
457  assertTrue(listListener2.added[1].list.library.equals(library2));
458  assertTrue(listListener2.added[1].item.library.equals(library2));
459  assertTrue(listListener2.added[1].item.equals(listener.adds[1].item));
460 
461  // Clean up listeners
462  listener.reset();
463  library2.removeListener(listener);
464  list2.removeListener(listListener2);
465 }
function runTest()
Test file.
function assertTrue(aTest, aMessage)
function assertEqual(aExpected, aActual, aMessage)
return null
Definition: FeedWriter.js:1143
function createLibrary(databaseGuid, databaseLocation)
Definition: test_load.js:151
function newURI(aURLString)
function assertFalse(aTest, aMessage)
const Ci
function TestMediaListListener()