ObservableArrayTest.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. /// <reference path="../../../src/tools/babylon.observable.ts" />
  2. var __extends = (this && this.__extends) || function (d, b) {
  3. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  4. function __() { this.constructor = d; }
  5. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  6. };
  7. var JasmineTest;
  8. (function (JasmineTest) {
  9. var ObservableArray = BABYLON.ObservableArray;
  10. var ArrayChanged = BABYLON.ArrayChanged;
  11. var PropertyChangedBase = BABYLON.PropertyChangedBase;
  12. var Customer = (function (_super) {
  13. __extends(Customer, _super);
  14. function Customer(firstName, lastName) {
  15. _super.call(this);
  16. this._firstName = firstName;
  17. this._lastName = lastName;
  18. }
  19. Object.defineProperty(Customer.prototype, "firstName", {
  20. get: function () {
  21. return this._firstName;
  22. },
  23. set: function (value) {
  24. if (this._firstName === value) {
  25. return;
  26. }
  27. var old = this._firstName;
  28. var oldDN = this.displayName;
  29. this._firstName = value;
  30. this.onPropertyChanged("firstName", old, value);
  31. this.onPropertyChanged("displayName", oldDN, this.displayName);
  32. },
  33. enumerable: true,
  34. configurable: true
  35. });
  36. Object.defineProperty(Customer.prototype, "lastName", {
  37. get: function () {
  38. return this._lastName;
  39. },
  40. set: function (value) {
  41. if (this._lastName === value) {
  42. return;
  43. }
  44. var old = this._lastName;
  45. var oldDN = this.displayName;
  46. this._lastName = value;
  47. this.onPropertyChanged("lastName", old, value);
  48. this.onPropertyChanged("displayName", oldDN, this.displayName);
  49. },
  50. enumerable: true,
  51. configurable: true
  52. });
  53. Object.defineProperty(Customer.prototype, "displayName", {
  54. get: function () {
  55. return this.firstName + " " + this.lastName;
  56. },
  57. enumerable: true,
  58. configurable: true
  59. });
  60. return Customer;
  61. }(PropertyChangedBase));
  62. describe("Tools - ObservableArray", function () {
  63. it("Push", function () {
  64. var oa = new ObservableArray(true);
  65. oa.push(new Customer("loic", "baumann"));
  66. oa.propertyChanged.add(function (e, c) {
  67. expect(e.oldValue).toBe(1, "PropChanged length is bad");
  68. expect(e.newValue).toBe(2, "PropChanged length is bad");
  69. });
  70. oa.arrayChanged.add(function (e, c) {
  71. expect(e.action).toBe(ArrayChanged.newItemsAction, "Wrong ArrayChanged action");
  72. expect(e.newItems.length).toBe(1);
  73. var item = e.newItems[0];
  74. expect(item.index).toEqual(1);
  75. expect(item.value.firstName).toBe("david");
  76. expect(e.newStartingIndex).toBe(1);
  77. });
  78. oa.push(new Customer("david", "catuhe"));
  79. expect(oa.length).toBe(2);
  80. var item = oa.getAt(1);
  81. expect(item).toBeDefined();
  82. expect(item.firstName).toBe("david");
  83. var triggerCounter = 0;
  84. oa.watchedObjectChanged.add(function (e, c) {
  85. if (triggerCounter === 0) {
  86. expect(e.propertyChanged.propertyName).toBe("firstName");
  87. expect(e.propertyChanged.oldValue).toBe("david");
  88. expect(e.propertyChanged.newValue).toBe("delta");
  89. ++triggerCounter;
  90. }
  91. else {
  92. expect(e.propertyChanged.propertyName).toBe("displayName");
  93. expect(e.propertyChanged.oldValue).toBe("david catuhe");
  94. expect(e.propertyChanged.newValue).toBe("delta catuhe");
  95. ++triggerCounter;
  96. }
  97. });
  98. });
  99. it("SetAt/GetAt", function () {
  100. var oa = new ObservableArray(true);
  101. var propChangedCount = 0;
  102. var co = oa.propertyChanged.add(function (e, c) {
  103. if (e.propertyName !== "length") {
  104. return;
  105. }
  106. expect(e.oldValue).toBe(e.newValue - ((e.oldValue === 3) ? 2 : 1), "bad length value reported in PropChanged");
  107. ++propChangedCount;
  108. expect(propChangedCount).toBeLessThan(5, "PropChanged notif sent during illegal item insertion");
  109. });
  110. var triggerCount = 0;
  111. var aco = oa.arrayChanged.add(function (e, c) {
  112. expect(e.action).toBe(ArrayChanged.newItemsAction, "Wrong ArrayChanged action");
  113. switch (triggerCount) {
  114. case 0:
  115. expect(e.newItems.length).toBe(1);
  116. expect(e.newItems[0].index).toEqual(0);
  117. expect(e.newItems[0].value.firstName).toEqual("Mike");
  118. expect(e.newStartingIndex).toBe(0);
  119. break;
  120. case 1:
  121. expect(e.newItems.length).toBe(1);
  122. expect(e.newItems[0].index).toEqual(1);
  123. expect(e.newItems[0].value.firstName).toEqual("Steven");
  124. expect(e.newStartingIndex).toBe(1);
  125. break;
  126. case 2:
  127. expect(e.newItems.length).toBe(1);
  128. expect(e.newItems[0].index).toEqual(2);
  129. expect(e.newItems[0].value.firstName).toEqual("John");
  130. expect(e.newStartingIndex).toBe(2);
  131. break;
  132. case 3:
  133. expect(e.newItems.length).toBe(1);
  134. expect(e.newItems[0].index).toEqual(4);
  135. expect(e.newItems[0].value.firstName).toEqual("Matthew");
  136. expect(e.newStartingIndex).toBe(4);
  137. break;
  138. default:
  139. fail("arrayChanged called abnormally");
  140. }
  141. ++triggerCount;
  142. });
  143. oa.setAt(0, new Customer("Mike", "Portnoy"));
  144. oa.setAt(1, new Customer("Steven", "Wilson"));
  145. oa.setAt(2, new Customer("John", "Petrucci"));
  146. oa.setAt(4, new Customer("Matthew", "Bellamy"));
  147. oa.setAt(-10, new Customer("Hilary", "Hahn"));
  148. oa.propertyChanged.remove(co);
  149. oa.arrayChanged.remove(aco);
  150. expect(oa.length).toBe(5);
  151. expect(oa.getAt(0).firstName).toBe("Mike");
  152. expect(oa.getAt(1).firstName).toBe("Steven");
  153. expect(oa.getAt(2).firstName).toBe("John");
  154. expect(oa.getAt(4).firstName).toBe("Matthew");
  155. triggerCount = 0;
  156. oa.arrayChanged.add(function (e, c) {
  157. expect(e.action).toBe((triggerCount < 2) ? ArrayChanged.changedItemAction : ArrayChanged.newItemsAction, "Wrong ArrayChanged action");
  158. switch (triggerCount) {
  159. case 0:
  160. expect(e.changedItems.length).toBe(1);
  161. expect(e.changedItems[0].index).toEqual(0);
  162. expect(e.changedItems[0].value.firstName).toEqual("MP");
  163. expect(e.changedStartingIndex).toBe(0);
  164. break;
  165. case 1:
  166. expect(e.changedItems.length).toBe(1);
  167. expect(e.changedItems[0].index).toEqual(1);
  168. expect(e.changedItems[0].value.firstName).toEqual("SW");
  169. expect(e.changedStartingIndex).toBe(1);
  170. break;
  171. case 2:
  172. expect(e.newItems.length).toBe(1);
  173. expect(e.newItems[0].index).toEqual(3);
  174. expect(e.newItems[0].value.firstName).toEqual("JP");
  175. expect(e.newStartingIndex).toBe(3);
  176. break;
  177. }
  178. ++triggerCount;
  179. });
  180. var cust0 = new Customer("MP", "Portnoy");
  181. var cust1 = new Customer("SW", "Wilson");
  182. var cust3 = new Customer("JP", "Petrucci");
  183. oa.setAt(0, cust0);
  184. oa.setAt(1, cust1);
  185. oa.setAt(3, cust3);
  186. var triggerCounter = 0;
  187. var propTriggered = false;
  188. oa.watchedObjectChanged.add(function (e, c) {
  189. propTriggered = true;
  190. if (e.propertyChanged.propertyName === "firstName") {
  191. expect(e.propertyChanged.newValue).not.toBe("MP");
  192. expect(e.propertyChanged.newValue).not.toBe("SW");
  193. expect(e.propertyChanged.newValue).not.toBe("JP");
  194. }
  195. if (triggerCounter === 0) {
  196. expect(e.propertyChanged.propertyName).toBe("firstName");
  197. expect(e.propertyChanged.oldValue).toBe("MP");
  198. expect(e.propertyChanged.newValue).toBe("BestDrummerInDaWorld");
  199. ++triggerCounter;
  200. }
  201. else {
  202. expect(e.propertyChanged.propertyName).toBe("displayName");
  203. expect(e.propertyChanged.oldValue).toBe("MP Portnoy");
  204. expect(e.propertyChanged.newValue).toBe("BestDrummerInDaWorld Portnoy");
  205. ++triggerCounter;
  206. }
  207. });
  208. cust0.firstName = "BestDrummerInDaWorld";
  209. expect(propTriggered).toBe(true, "no WatchedObjectChanged was called, not ok!");
  210. });
  211. it("Pop", function () {
  212. var oa = new ObservableArray(true);
  213. oa.push(new Customer("Myles", "Kennedy"));
  214. oa.propertyChanged.add(function (e, c) {
  215. expect(e.oldValue).toBe(1);
  216. expect(e.newValue).toBe(0);
  217. });
  218. oa.arrayChanged.add(function (e, c) {
  219. expect(e.action).toBe(ArrayChanged.removedItemsAction);
  220. expect(e.removedItems.length).toBe(1);
  221. expect(e.removedItems[0].index).toEqual(0);
  222. expect(e.removedItems[0].value.firstName).toEqual("Myles");
  223. expect(e.removedStartingIndex).toBe(0);
  224. });
  225. var pop = oa.pop();
  226. expect(pop.firstName).toBe("Myles");
  227. oa.watchedObjectChanged.add(function (e, c) {
  228. fail("watchedObject shouldn't be called as only a removed object had a property changed");
  229. });
  230. pop.firstName = "MK";
  231. });
  232. it("Concat", function () {
  233. var oa = new ObservableArray(false);
  234. oa.push("item0", "item1", "item2");
  235. oa.setAt(4, "item4");
  236. var noa = oa.concat("pipo0", "pipo1", "pipo2");
  237. var res = ["item0", "item1", "item2", "item4", "pipo0", "pipo1", "pipo2"];
  238. var i = 0;
  239. noa.forEach(function (v) {
  240. expect(v).toBe(res[i++]);
  241. });
  242. expect(noa.length).toBe(8);
  243. });
  244. it("Shift", function () {
  245. var oa = new ObservableArray(false);
  246. oa.push("item0", "item1", "item2");
  247. oa.propertyChanged.add(function (e, c) {
  248. expect(e.oldValue).toBe(3);
  249. expect(e.newValue).toBe(2);
  250. });
  251. oa.arrayChanged.add(function (e, c) {
  252. expect(e.action).toBe(ArrayChanged.replacedArrayAction);
  253. expect(e.removedItems.length).toBe(1);
  254. expect(e.removedItems[0]).toEqual({ index: 0, value: "item0" });
  255. expect(oa.getAt(0)).toEqual("item1");
  256. expect(oa.getAt(1)).toEqual("item2");
  257. expect(e.removedStartingIndex).toBe(0);
  258. });
  259. oa.shift();
  260. });
  261. it("Sort", function () {
  262. var oa = new ObservableArray(false);
  263. oa.push(3, 2, 4, 1);
  264. oa.propertyChanged.add(function (e, c) {
  265. fail("no propertyChanged should be fired");
  266. });
  267. oa.arrayChanged.add(function (e, c) {
  268. expect(e.action).toBe(ArrayChanged.replacedArrayAction);
  269. expect(oa.getAt(0)).toEqual(1);
  270. expect(oa.getAt(1)).toEqual(2);
  271. expect(oa.getAt(2)).toEqual(3);
  272. expect(oa.getAt(3)).toEqual(4);
  273. });
  274. oa.sort(function (a, b) { return a - b; });
  275. });
  276. });
  277. })(JasmineTest || (JasmineTest = {}));
  278. //# sourceMappingURL=ObservableArrayTest.js.map