Cross Reference: /yui3/src/test/docs/test-array-tests.mustache
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<div class="intro">
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove <p>This example shows how to use the <a href="index.html#arrayassert"><code>ArrayAssert</code></a> object, which
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove contains assertions designed to be used specifically with JavaScript Arrays and array-like objects.</p>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove</div>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<div class="example yui3-skin-sam">
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove {{>test-array-tests-source}}
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove</div>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<h2 class="first">Array Assertions</h2>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<p>This example uses the <code>Y.ArrayAssert</code> object to test methods on JavaScript's
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove built-in <code>Array</code> object. The intent of this example is to introduce <code>Y.ArrayAssert</code> and its methods
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove as an alternative to the generic methods available on <code>Y.Assert</code>.</p>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<p>The example begins by creating an example namespace and <code>Y.Test.Case</code>:</p>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove```
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan GroveY.namespace("example.test");
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan GroveY.example.test.ArrayTestCase = new Y.Test.Case({
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove name: "Array Tests",
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //-------------------------------------------------------------------------
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove // Setup and teardown
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //-------------------------------------------------------------------------
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove /*
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove * The setUp() method is used to setup data that necessary for a test to
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove * run. This method is called immediately before each test method is run,
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove * so it is run as many times as there are test methods.
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove */
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove setUp : function () {
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove this.data = new Array (0,1,2,3,4,5);
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove },
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove /*
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove * The tearDown() method is used to clean up the initialization that was done
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove * in the setUp() method. Ideally, it should free up all memory allocated in
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove * setUp(), anticipating any possible changes to the data. This method is called
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove * immediately after each test method is run.
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove */
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove tearDown : function () {
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove delete this.data;
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove },
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ...
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove});
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove```
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<p>This <code>TestCase</code> has a <code>setUp()</code> method that creates an array for all the tests to use, as well as
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove a <code>tearDown()</code> method that deletes the array after each test has been executed. This array is used throughout
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove the tests as a base for array manipulations.</p>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<h3>Testing <code>push()</code></h3>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<p>The first test is <code>testPush()</code>, which tests the functionality of the <code>Array</code> object's <code>push()</code> method
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove (other methods hidden for simpicity):</p>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove```
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan GroveY.example.test.ArrayTestCase = new Y.Test.Case({
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ...
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove testPush : function() {
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //shortcut variables
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove var ArrayAssert = Y.ArrayAssert;
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //do whatever data manipulation is necessary
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove this.data.push(6);
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //array-specific assertions
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ArrayAssert.isNotEmpty(this.data, "Array should not be empty.");
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ArrayAssert.contains(6, this.data, "Array should contain 6.");
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ArrayAssert.indexOf(6, this.data, 6, "The value in position 6 should be 6.");
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //check that all the values are there
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ArrayAssert.itemsAreEqual([0,1,2,3,4,5,6], this.data, "Arrays should be equal.");
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove },
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ...
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove});
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove```
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<p>The test begins by setting up a shortcut variables for <code>Y.ArrayAssert</code>, then pushes the value 6 onto
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove the <code>data</code> array (which was created by <code>setUp()</code>). Next, <code>Y.ArrayAssert.isNotEmpty()</code> determines if the
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove array has at least one item; this should definitely pass because the <code>push()</code> operation only adds values to the array. To determine
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove that the new value, 6, is in the array, <code>Y.ArrayAssert.contains()</code> is used. The first argument is the value to look for and the second
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove is the array to look in. To find out if the new value ended up where it should have (the last position, index 6), <code>Y.ArrayAssert.indexOf()</code>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove is used, passing in the value to search for as the first argument, the array to search in as the second, and the index at which the value should
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove occur as the final argument. Since 6 was pushed onto the end of an array that already had 6 items, it should end up at index 6 (the length of the
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove array minus one). As a final test, <code>Y.ArrayAssert.itemsAreEqual()</code> is used to determine that all of the items in the array are in the
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove correct place. The first argument of this method is an array that has all of the values that should be in the array you're testing. This assertion
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove passes only when the values in both arrays match up (the values are equal and the positions are the same).</p>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<h3>Testing <code>pop()</code></h3>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<p>The next test is <code>testPop()</code>, which tests the functionality of the <code>Array</code> object's <code>pop()</code> method:</p>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove```
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan GroveY.example.test.ArrayTestCase = new Y.Test.Case({
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ...
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove testPop : function() {
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //shortcut variables
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove var Assert = Y.Assert;
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove var ArrayAssert = Y.ArrayAssert;
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //do whatever data manipulation is necessary
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove var value = this.data.pop();
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //array shouldn't be empty
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ArrayAssert.isNotEmpty(this.data, "Array should not be empty.");
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //basic equality assertion - expected value, actual value, optional error message
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove Assert.areEqual(5, this.data.length, "Array should have 5 items.");
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove Assert.areEqual(5, value, "Value should be 5.");
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ArrayAssert.itemsAreSame([0,1,2,3,4], this.data, "Arrays should be equal.");
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove },
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ...
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove});
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove```
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<p>This test also starts out by creating some shortcut variables, for <code>Y.Assert</code> and <code>Y.ArrayAssert</code>. Next, the <code>pop()</code>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove method is called, storing the returned item in <code>value</code>. Since <code>pop()</code> should only remove a single item, <code>Y.ArrayAssert.isNotEmpty()</code>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove is called to ensure that only one item has been removed. After that, <code>Y.Assert.areEqual()</code> is called twice: once to check the
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove length of the array and once to confirm the value of the item that was removed from the array (which should be 5). The last assertion uses
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove <code>Y.ArrayAssert.itemsAreSame()</code>, which is similar to <code>Y.ArrayAssert.itemsAreEqual()</code> in that it compares values between two
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove arrays. The difference is that <code>Y.ArrayAssert.itemsAreSame()</code> uses strict equality (<code>===</code>) to compare values, ensuring that
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove no behind-the-scenes type conversions will occur (this makes <code>Y.ArrayAssert.itemsAreSame()</code> more useful for working with arrays of
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove objects).</p>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<h3>Testing <code>reverse()</code></h3>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<p>The next test is <code>testReverse()</code>, which tests the functionality of the <code>Array</code> object's <code>reverse()</code> method:</p>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove```
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan GroveY.example.test.ArrayTestCase = new Y.Test.Case({
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ...
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove testReverse : function() {
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //shortcut variables
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove var ArrayAssert = Y.ArrayAssert;
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //do whatever data manipulation is necessary
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove this.data = this.data.reverse();
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ArrayAssert.itemsAreEqual([5,4,3,2,1,0], this.data, "Arrays should be equal.");
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove },
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ...
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove});
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove```
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<p>The <code>testRemove()</code> method is very simple, calling <code>reverse()</code> on the array and then testing the result. Since
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove every item in the array has changed, the changes can be tested by calling <code>Y.ArrayAssert.itemsAreEqual()</code> once (instead of
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove calling <code>Y.ArrayAssert.indexOf()</code> multiple times). The first argument is an array with all the values in the reverse order
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove of the array that was created in <code>setUp()</code>. When compared with the second argument, the newly reversed array, the values in
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove each position should be equal.</p>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<h3>Testing <code>shift()</code></h3>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<p>The next test is <code>testShift()</code>, which tests the functionality of the <code>Array</code> object's <code>shift()</code> method:</p>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove```
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan GroveY.example.test.ArrayTestCase = new Y.Test.Case({
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ...
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove testShift : function() {
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //shortcut variables
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove var Assert = Y.Assert;
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove var ArrayAssert = Y.ArrayAssert;
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //do whatever data manipulation is necessary
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove var value = this.data.shift();
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //array shouldn't be empty
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ArrayAssert.isNotEmpty(this.data, "Array should not be empty.");
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //basic equality assertion - expected value, actual value, optional error message
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove Assert.areEqual(5, this.data.length, "Array should have 6 items.");
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove Assert.areEqual(0, value, "Value should be 0.");
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ArrayAssert.itemsAreEqual([1,2,3,4,5], this.data, "Arrays should be equal.");
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove },
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ...
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove});
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove```
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<p>The <code>shift()</code> method removes the first item in the array and returns it (similar to <code>pop()</code>, which removes the item
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove from the end). In the <code>testShift()</code> method, <code>shift()</code> is called and the item is stored in <code>value</code>. To ensure
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove that the rest of the array is still there, <code>Y.ArrayAssert.isNotEmpty()</code> is called. After that, <code>Array.areEqual()</code> is
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove called twice, once to test the length of the array and once to test the value that was returned from <code>shift()</code> (which should be
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove 0). As a last test, the entire array is tested using <code>Y.ArrayAssert.itemsAreEqual()</code> to ensure that all of the items have shifted
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove into the appropriate positions in the array.</p>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<h3>Testing <code>splice()</code></h3>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<p>The next test is <code>testSplice()</code>, which tests the functionality of the <code>Array</code> object's <code>splice()</code> method:</p>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove```
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan GroveY.example.test.ArrayTestCase = new Y.Test.Case({
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ...
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove testSplice : function() {
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //shortcut variables
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove var Assert = Y.Assert;
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove var ArrayAssert = Y.ArrayAssert;
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //do whatever data manipulation is necessary
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove var removed = this.data.splice(1, 2, 99, 100);
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //basic equality assertion - expected value, actual value, optional error message
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove Assert.areEqual(6, this.data.length, "Array should have 6 items.");
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //the new items should be there
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ArrayAssert.indexOf(99, this.data, 1, "Value at index 1 should be 99.");
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ArrayAssert.indexOf(100, this.data, 2, "Value at index 2 should be 100.");
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ArrayAssert.itemsAreEqual([0,99,100,3,4,5], this.data, "Arrays should be equal.");
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ArrayAssert.itemsAreEqual([1,2], removed, "Removed values should be an array containing 1 and 2.");
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove },
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ...
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove});
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove```
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<p>The <code>splice()</code> method is one of the most powerful <code>Array</code> manipulations. It can both remove and add any number of items
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove from an array at the same time. This test begins by splicing some values into the array. When calling <code>splice()</code>, the first argument
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove is 1, indicating that values should be inserted at index 1 of the array; the second argument is 2, indicating that two values should be
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove removed from the array (the value in index 1 and the value in index 2); the third and fourth arguments are values that should be inserted
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove into the array at the position given by the first argument. Essentially, values 1 and 2 should end up being replaced by values 99 and 100 in
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove the array.</p>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<p>The first test is to determine that the length of the array is still 6 (since the previous step removed two items and then inserted two, the
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove length should still be 6). After that, <code>Y.Assert.indexOf()</code> is called to determine that the values of 99 and 100 are in positions
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove 1 and 2, respectively. To ensure the integrity of the entire array, <code>Y.ArrayAssert.itemsAreEqual()</code> is called on the array, comparing
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove it to an array with the same values. The very last step is to test the value returned from <code>splice()</code>, which is an array containing
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove the removed values, 1 and 2. <code>Y.ArrayAssert.itemsAreEqual()</code> is appropriate for this task as well.</p>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<h3>Testing <code>unshift()</code></h3>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<p>The next test is <code>testUnshift()</code>, which tests the functionality of the <code>Array</code> object's <code>unshift()</code> method:</p>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove```
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan GroveY.example.test.ArrayTestCase = new Y.Test.Case({
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ...
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove testUnshift : function() {
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //shortcut variables
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove var Assert = Y.Assert;
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove var ArrayAssert = Y.ArrayAssert;
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //do whatever data manipulation is necessary
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove this.data.unshift(-1);
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //basic equality assertion - expected value, actual value, optional error message
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove Assert.areEqual(7, this.data.length, "Array should have 7 items.");
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove //the new item should be there
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ArrayAssert.indexOf(-1, this.data, 0, "First item should be -1.");
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ArrayAssert.itemsAreEqual([-1,0,1,2,3,4,5], this.data, "Arrays should be equal.");
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove },
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove ...
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove});
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove```
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<p>Working similar to <code>push()</code>, <code>unshift()</code> adds a value to the array, but the item is added to the front (index 0) instead of
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove the back. This test begins by adding the value -1 to the array. The first assertion determines if the length of the array has been incremented
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove to 7 to account for the new value. After that, <code>Y.ArrayAssert.indexOf()</code> is used to determine if the value has been placed in the
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove correct location. The final assertions tests that the entire array is expected by using <code>Y.ArrayAssert.itemsAreEqual()</code>.</p>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<h3>Running the tests</h3>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<p>With all of the tests defined, the last step is to run them:</p>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove```
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove//create the console
1ac6d38f8eef642ee4f7191b863a986f4cb7571fDav Glass(new Y.Test.Console({
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove verbose : true,
1ac6d38f8eef642ee4f7191b863a986f4cb7571fDav Glass newestOnTop : false,
1ac6d38f8eef642ee4f7191b863a986f4cb7571fDav Glass filters: {
1ac6d38f8eef642ee4f7191b863a986f4cb7571fDav Glass pass: true,
1ac6d38f8eef642ee4f7191b863a986f4cb7571fDav Glass fail: true
1ac6d38f8eef642ee4f7191b863a986f4cb7571fDav Glass }
1ac6d38f8eef642ee4f7191b863a986f4cb7571fDav Glass})).render('#testLogger');
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan GroveY.Test.Runner.add(Y.example.test.ArrayTestCase);
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove//run the tests
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan GroveY.Test.Runner.run();
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove```
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1ac6d38f8eef642ee4f7191b863a986f4cb7571fDav Glass<p>Before running the tests, it's necessary to create a <code>Y.Test.Console</code> object to display the results (otherwise the tests would run
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove but you wouldn't see the results). After that, the <code>Y.Test.Runner</code> is loaded with the <code>Y.Test.Case</code> object by calling
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove <code>add()</code> (any number of <code>Y.Test.Case</code> and <code>TestSuite</code> objects can be added to a <code>Y.Test.Runner</code>,
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove this example only adds one for simplicity). The very last step is to call <code>run()</code>, which begins executing the tests in its
1ac6d38f8eef642ee4f7191b863a986f4cb7571fDav Glass queue and displays the results in the <code>Y.Test.Console</code>.</p>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove<h2>Complete Example Source</h2>
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove```
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove{{>test-array-tests-source}}
1b7d9ee6f1128c8cb5e16c3a11ba045998296171Ryan Grove```