ObservableArrayTest.ts 14 KB

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