test_nsIMutableArray.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. /* This Source Code Form is subject to the terms of the Mozilla Public
  2. * License, v. 2.0. If a copy of the MPL was not distributed with this
  3. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  4. var Ci = Components.interfaces;
  5. var Cr = Components.results;
  6. var Cc = Components.classes;
  7. var CC = Components.Constructor;
  8. var MutableArray = CC("@mozilla.org/array;1", "nsIMutableArray");
  9. var SupportsString = CC("@mozilla.org/supports-string;1", "nsISupportsString");
  10. function create_n_element_array(n)
  11. {
  12. var arr = new MutableArray();
  13. for (let i=0; i<n; i++) {
  14. let str = new SupportsString();
  15. str.data = "element " + i;
  16. arr.appendElement(str, false);
  17. }
  18. return arr;
  19. }
  20. function test_appending_null_actually_inserts()
  21. {
  22. var arr = new MutableArray();
  23. do_check_eq(0, arr.length);
  24. arr.appendElement(null, false);
  25. do_check_eq(1, arr.length);
  26. }
  27. function test_object_gets_appended()
  28. {
  29. var arr = new MutableArray();
  30. var str = new SupportsString();
  31. str.data = "hello";
  32. arr.appendElement(str, false);
  33. do_check_eq(1, arr.length);
  34. var obj = arr.queryElementAt(0, Ci.nsISupportsString);
  35. do_check_eq(str, obj);
  36. }
  37. function test_insert_at_beginning()
  38. {
  39. var arr = create_n_element_array(5);
  40. // just a sanity check
  41. do_check_eq(5, arr.length);
  42. var str = new SupportsString();
  43. str.data = "hello";
  44. arr.insertElementAt(str, 0, false);
  45. do_check_eq(6, arr.length);
  46. var obj = arr.queryElementAt(0, Ci.nsISupportsString);
  47. do_check_eq(str, obj);
  48. // check the data of all the other objects
  49. for (let i=1; i<arr.length; i++) {
  50. let obj = arr.queryElementAt(i, Ci.nsISupportsString);
  51. do_check_eq("element " + (i-1), obj.data);
  52. }
  53. }
  54. function test_replace_element()
  55. {
  56. var arr = create_n_element_array(5);
  57. // just a sanity check
  58. do_check_eq(5, arr.length);
  59. var str = new SupportsString();
  60. str.data = "hello";
  61. // replace first element
  62. arr.replaceElementAt(str, 0, false);
  63. do_check_eq(5, arr.length);
  64. var obj = arr.queryElementAt(0, Ci.nsISupportsString);
  65. do_check_eq(str, obj);
  66. // replace last element
  67. arr.replaceElementAt(str, arr.length - 1, false);
  68. do_check_eq(5, arr.length);
  69. obj = arr.queryElementAt(arr.length - 1, Ci.nsISupportsString);
  70. do_check_eq(str, obj);
  71. // replace after last element, should insert empty elements
  72. arr.replaceElementAt(str, 9, false);
  73. do_check_eq(10, arr.length);
  74. obj = arr.queryElementAt(9, Ci.nsISupportsString);
  75. do_check_eq(str, obj);
  76. // AFAIK there's no way to check the empty elements, since you can't QI them.
  77. }
  78. function test_clear()
  79. {
  80. var arr = create_n_element_array(5);
  81. // just a sanity check
  82. do_check_eq(5, arr.length);
  83. arr.clear();
  84. do_check_eq(0, arr.length);
  85. }
  86. function test_enumerate()
  87. {
  88. var arr = create_n_element_array(5);
  89. do_check_eq(5, arr.length);
  90. var en = arr.enumerate();
  91. var i = 0;
  92. while (en.hasMoreElements()) {
  93. let str = en.getNext();
  94. do_check_true(str instanceof Ci.nsISupportsString);
  95. do_check_eq(str.data, "element " + i);
  96. i++;
  97. }
  98. do_check_eq(arr.length, i);
  99. }
  100. function test_nssupportsarray_interop() {
  101. // Tests to check that an nsSupportsArray instance can behave like an
  102. // nsIArray.
  103. let test = Components.classes["@mozilla.org/supports-array;1"]
  104. .createInstance(Ci.nsISupportsArray);
  105. let str = new SupportsString();
  106. str.data = "element";
  107. test.AppendElement(str);
  108. // Now query to an nsIArray.
  109. let iarray = test.QueryInterface(Ci.nsIArray);
  110. do_check_neq(iarray, null);
  111. // Make sure |nsIArray.length| works.
  112. do_check_eq(iarray.length, 1);
  113. // Make sure |nsIArray.queryElementAt| works.
  114. let elm = iarray.queryElementAt(0, Ci.nsISupportsString);
  115. do_check_eq(elm.data, "element");
  116. // Make sure |nsIArray.indexOf| works.
  117. let idx = iarray.indexOf(0, str);
  118. do_check_eq(idx, 0);
  119. // Make sure |nsIArray.enumerate| works.
  120. let en = iarray.enumerate();
  121. do_check_neq(en, null);
  122. let i = 0;
  123. while (en.hasMoreElements()) {
  124. let str = en.getNext();
  125. do_check_true(str instanceof Ci.nsISupportsString);
  126. do_check_eq(str.data, "element");
  127. i++;
  128. }
  129. do_check_eq(iarray.length, i);
  130. }
  131. function test_nsiarrayextensions() {
  132. // Tests to check that the extensions that make an nsArray act like an
  133. // nsISupportsArray for iteration purposes works.
  134. // Note: we do not want to QI here, just want to make sure the magic glue
  135. // works as a drop-in replacement.
  136. let fake_nsisupports_array = create_n_element_array(5);
  137. // Check that |Count| works.
  138. do_check_eq(5, fake_nsisupports_array.Count());
  139. for (let i = 0; i < fake_nsisupports_array.Count(); i++) {
  140. // Check that the generic |GetElementAt| works.
  141. let elm = fake_nsisupports_array.GetElementAt(i);
  142. do_check_neq(elm, null);
  143. let str = elm.QueryInterface(Ci.nsISupportsString);
  144. do_check_neq(str, null);
  145. do_check_eq(str.data, "element " + i);
  146. }
  147. }
  148. var tests = [
  149. test_appending_null_actually_inserts,
  150. test_object_gets_appended,
  151. test_insert_at_beginning,
  152. test_replace_element,
  153. test_clear,
  154. test_enumerate,
  155. test_nssupportsarray_interop,
  156. test_nsiarrayextensions,
  157. ];
  158. function run_test() {
  159. for (var i = 0; i < tests.length; i++)
  160. tests[i]();
  161. }