test_diffing_listtolibrary.js
Go to the documentation of this file.
1 /*
2  *=BEGIN SONGBIRD GPL
3  *
4  * This file is part of the Songbird web player.
5  *
6  * Copyright(c) 2005-2010 POTI, Inc.
7  * http://www.songbirdnest.com
8  *
9  * This file may be licensed under the terms of of the
10  * GNU General Public License Version 2 (the ``GPL'').
11  *
12  * Software distributed under the License is distributed
13  * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
14  * express or implied. See the GPL for the specific language
15  * governing rights and limitations.
16  *
17  * You should have received a copy of the GPL along with this
18  * program. If not, go to http://www.gnu.org/licenses/gpl.html
19  * or write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21  *
22  *=END SONGBIRD GPL
23  */
24 
25 
30 var SB_NS = "http://songbirdnest.com/data/1.0#";
31 
32 function createPropertyArray() {
33  return Cc["@songbirdnest.com/Songbird/Properties/MutablePropertyArray;1"]
34  .createInstance(Ci.sbIMutablePropertyArray);
35 }
36 
37 function appendPropertiesToArray(aProperties, aPropertyArray) {
38  for (var propName in aProperties) {
39  aPropertyArray.appendProperty(SB_NS + propName, aProperties[propName]);
40  }
41  return;
42 }
43 
44 function makeItACopy(source, destination)
45 {
46  destination.setProperty(SBProperties.originItemGuid, source.guid);
47  destination.setProperty(SBProperties.originLibraryGuid, source.library.guid);
48 }
49 
50 function runTest () {
51  Components.utils.import("resource://app/jsmodules/sbProperties.jsm");
52  var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
53 
54  var itemAURI = ios.newURI("file:///alpha.mp3", null, null);
55  var itemAProperties =
56  { artistName: "A", albumName: "Alpha", trackName: "Track Alpha", trackNumber: "1", year: "2000"};
57 
58  var itemBURI = ios.newURI("file:///ecto.mp3", null, null);
59  var itemBProperties =
60  { artistName: "E", albumName: "Ecto", trackName: "Track Ecto", trackNumber: "2", year: "2004"};
61 
62  var itemCURI = ios.newURI("file:///beta.mp3", null, null);
63  var itemCProperties =
64  { artistName: "B", albumName: "Beta", trackName: "Track Beta", trackNumber: "2", year: "2001"};
65 
66  var itemDURI = ios.newURI("file:///cent.mp3", null, null);
67  var itemDProperties =
68  { artistName: "C", albumName: "Cent", trackName: "Track Cent", trackNumber: "3", year: "2002", composerName: "Centos" };
69 
70  var itemEURI = ios.newURI("file:///femto.mp3", null, null);
71  var itemEProperties =
72  { artistName: "F", albumName: "Femto", trackName: "Track Femto", trackNumber: "7", year: "1998", genre: "electronic" };
73 
74  var itemEEURI = ios.newURI("file:///femto.mp3", null, null);
75  var itemEEProperties =
76  { artistName: "Full", albumName: "Femto", trackName: "Track Femto Super", trackNumber: "7", year: "1998", genre: "techno" };
77 
78  var itemFURI = ios.newURI("file:///delta.mp3", null, null);
79  var itemFProperties =
80  { artistName: "D", albumName: "Delta", trackName: "Track Delta", trackNumber: "5", year: "2008"};
81 
82  // Source items:
83  // Item A (A, B)
84  // Item B (A)
85  // Item C (A, B)
86  // Item D (B)
87  // Item E (Ax2)
88  // Item EE (B) copy of E
89  //
90  // Destination Items:
91  // Item B
92  // Item D
93  // Item EE
94  // Item F
95 
96  var diffingService = Cc["@songbirdnest.com/Songbird/Library/DiffingService;1"]
97  .getService(Ci.sbILibraryDiffingService);
98 
99  var sourceDBGUID = "test_multilist_source";
100  var destinationDBGUID = "test_multilist_destination";
101 
102  var sourceLibrary = createLibrary(sourceDBGUID, null, false);
103  var destinationLibrary = createLibrary(destinationDBGUID, null, false);
104 
105  var itemProperties = createPropertyArray();
106  appendPropertiesToArray(itemAProperties, itemProperties);
107  var itemA = sourceLibrary.createMediaItem(itemAURI,
108  itemProperties);
109 
110  itemProperties = createPropertyArray();
111  appendPropertiesToArray(itemBProperties, itemProperties);
112  var itemB = destinationLibrary.createMediaItem(itemBURI,
113  itemProperties);
114 
115  itemProperties = createPropertyArray();
116  appendPropertiesToArray(itemCProperties, itemProperties);
117  var itemC = sourceLibrary.createMediaItem(itemCURI,
118  itemProperties);
119 
120  itemProperties = createPropertyArray();
121  appendPropertiesToArray(itemDProperties, itemProperties);
122  var itemD = destinationLibrary.createMediaItem(itemDURI,
123  itemProperties);
124 
125  itemProperties = createPropertyArray();
126  appendPropertiesToArray(itemEProperties, itemProperties);
127  var itemE = sourceLibrary.createMediaItem(itemEURI,
128  itemProperties);
129 
130  itemProperties = createPropertyArray();
131  appendPropertiesToArray(itemEEProperties, itemProperties);
132  var itemEE = destinationLibrary.createMediaItem(itemEEURI,
133  itemProperties);
134  makeItACopy(itemE, itemEE);
135 
136  itemProperties = createPropertyArray();
137  appendPropertiesToArray(itemFProperties, itemProperties);
138  var itemF = destinationLibrary.createMediaItem(itemFURI,
139  itemProperties);
140 
141 
142  // ItemB and ItemE added
143  // ItemD deleted
144 
145  // Setup the first source list.
146  var sourceMediaListA = sourceLibrary.createMediaList("simple");
147  sourceMediaListA.name = "The List";
148  sourceMediaListA.add(itemA);
149  sourceMediaListA.add(itemB);
150  sourceMediaListA.add(itemC);
151  sourceMediaListA.add(itemE);
152  sourceMediaListA.add(itemE);
153 
154  // Setup the second source list.
155  var sourceMediaListB = sourceLibrary.createMediaList("simple");
156  sourceMediaListB.name = "The Wrong Name";
157  sourceMediaListB.add(itemA);
158  sourceMediaListB.add(itemC);
159  sourceMediaListB.add(itemD);
160  sourceMediaListB.add(itemEE);
161  sourceMediaListB.add(itemD);
162 
163  var sourceMediaLists = Cc["@songbirdnest.com/moz/xpcom/threadsafe-array;1"]
164  .createInstance(Ci.nsIMutableArray);
165  sourceMediaLists.appendElement(sourceMediaListA, false);
166  sourceMediaLists.appendElement(sourceMediaListB, false);
167 
168  var libraryChangeset = diffingService.createMultiChangeset(sourceMediaLists,
169  destinationLibrary);
170 
171  var sourceLists = libraryChangeset.sourceLists;
172  assertEqual(sourceLists.length, 2, "There should only be two source lists!");
173 
174  var sourceList = sourceLists.queryElementAt(0, Ci.sbIMediaList);
175  assertEqual(sourceList,
176  sourceMediaListA,
177  "Source list should be equal to the source media list!");
178 
179  sourceList = sourceLists.queryElementAt(1, Ci.sbIMediaList);
180  assertEqual(sourceList,
181  sourceMediaListB,
182  "Source list should be equal to the source media list!");
183 
184  var destinationList = libraryChangeset.destinationList;
185  assertEqual(destinationList.QueryInterface(Ci.sbILibrary),
186  destinationLibrary,
187  "Destination list should be equal to destination library!");
188 
189  var changes = libraryChangeset.changes;
190  log("There are " + changes.length + " changes present in the changeset.");
191 
192  var addedOps = 0;
193  var addedListOps = 0;
194  var addedChanges = [];
195 
196  var deletedOps = 0;
197  var deletedChanges = [];
198 
199  var movedOps = 0;
200  var movedChanges = [];
201 
202  var modifiedOps = 0;
203  var unknownOps = 0;
204 
205  var changesEnum = changes.enumerate();
206  while(changesEnum.hasMoreElements()) {
207  var changeSupports = changesEnum.getNext();
208  var change = changeSupports.QueryInterface(Ci.sbILibraryChange);
209 
210  switch(change.operation) {
211  case Ci.sbIChangeOperation.ADDED:
212  addedOps++;
213  if (change.itemIsList)
214  addedListOps++;
215  addedChanges.push(change);
216  break;
217  case Ci.sbIChangeOperation.DELETED:
218  deletedOps++;
219  deletedChanges.push(change);
220  break;
221  case Ci.sbIChangeOperation.MODIFIED:
222  modifiedOps++;
223  break;
224  case Ci.sbIChangeOperation.MOVED:
225  movedOps++;
226  movedChanges.push(change);
227  break;
228  default:
229  unknownOps++;
230  }
231  }
232 
233  log("There are " + addedOps + " added operations.");
234  assertEqual(addedOps, 4, "There should be 4 added operations");
235 
236  log("There are " + addedListOps + " added list operations.");
237  assertEqual(addedListOps, 2, "There should be 2 added list operations");
238 
239  log("There are " + deletedOps + " deleted operations.");
240  assertEqual(deletedOps, 1, "There should be 1 deleted operations");
241 
242  log("There are " + modifiedOps + " modified operations.");
243  assertEqual(modifiedOps, 1, "There should 1 modified operations");
244 
245  log("There are " + movedOps + " moved operations.");
246  assertEqual(movedOps, 0, "There should be 0 moved operations.");
247 
248 }
249 
const Cc
function appendPropertiesToArray(aProperties, aPropertyArray)
function log(s)
function createPropertyArray()
function assertEqual(aExpected, aActual, aMessage)
const char * propName
function runTest()
Advanced DataRemote unit tests.
return null
Definition: FeedWriter.js:1143
function createLibrary(databaseGuid, databaseLocation)
Definition: test_load.js:151
var SB_NS
Test file.
function makeItACopy(source, destination)
const Ci
var ios
Definition: head_feeds.js:5