Subversion Repositories SmartDukaan

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
12345 anikendra 1
<?php
2
/**
3
 * SetTest file
4
 *
5
 * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
6
 * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
7
 *
8
 * Licensed under The MIT License
9
 * For full copyright and license information, please see the LICENSE.txt
10
 * Redistributions of files must retain the above copyright notice
11
 *
12
 * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
13
 * @link          http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
14
 * @package       Cake.Test.Case.Utility
15
 * @since         CakePHP(tm) v 1.2.0.4206
16
 * @license       http://www.opensource.org/licenses/mit-license.php MIT License
17
 */
18
 
19
App::uses('Set', 'Utility');
20
App::uses('Model', 'Model');
21
 
22
/**
23
 * SetTest class
24
 *
25
 * @package       Cake.Test.Case.Utility
26
 */
27
class SetTest extends CakeTestCase {
28
 
29
/**
30
 * testNumericKeyExtraction method
31
 *
32
 * @return void
33
 */
34
	public function testNumericKeyExtraction() {
35
		$data = array('plugin' => null, 'controller' => '', 'action' => '', 1, 'whatever');
36
		$this->assertEquals(array(1, 'whatever'), Set::extract($data, '{n}'));
37
		$this->assertEquals(array('plugin' => null, 'controller' => '', 'action' => ''), Set::diff($data, Set::extract($data, '{n}')));
38
	}
39
 
40
/**
41
 * testEnum method
42
 *
43
 * @return void
44
 */
45
	public function testEnum() {
46
		$result = Set::enum(1, 'one, two');
47
		$this->assertEquals('two', $result);
48
		$result = Set::enum(2, 'one, two');
49
		$this->assertNull($result);
50
 
51
		$set = array('one', 'two');
52
		$result = Set::enum(0, $set);
53
		$this->assertEquals('one', $result);
54
		$result = Set::enum(1, $set);
55
		$this->assertEquals('two', $result);
56
 
57
		$result = Set::enum(1, array('one', 'two'));
58
		$this->assertEquals('two', $result);
59
		$result = Set::enum(2, array('one', 'two'));
60
		$this->assertNull($result);
61
 
62
		$result = Set::enum('first', array('first' => 'one', 'second' => 'two'));
63
		$this->assertEquals('one', $result);
64
		$result = Set::enum('third', array('first' => 'one', 'second' => 'two'));
65
		$this->assertNull($result);
66
 
67
		$result = Set::enum('no', array('no' => 0, 'yes' => 1));
68
		$this->assertEquals(0, $result);
69
		$result = Set::enum('not sure', array('no' => 0, 'yes' => 1));
70
		$this->assertNull($result);
71
 
72
		$result = Set::enum(0);
73
		$this->assertEquals('no', $result);
74
		$result = Set::enum(1);
75
		$this->assertEquals('yes', $result);
76
		$result = Set::enum(2);
77
		$this->assertNull($result);
78
	}
79
 
80
/**
81
 * testFilter method
82
 *
83
 * @see Hash test cases, as Set::filter() is just a proxy.
84
 * @return void
85
 */
86
	public function testFilter() {
87
		$result = Set::filter(array('0', false, true, 0, array('one thing', 'I can tell you', 'is you got to be', false)));
88
		$expected = array('0', 2 => true, 3 => 0, 4 => array('one thing', 'I can tell you', 'is you got to be'));
89
		$this->assertSame($expected, $result);
90
	}
91
 
92
/**
93
 * testNumericArrayCheck method
94
 *
95
 * @see Hash test cases, as Set::numeric() is just a proxy.
96
 * @return void
97
 */
98
	public function testNumericArrayCheck() {
99
		$data = array('one');
100
		$this->assertTrue(Set::numeric(array_keys($data)));
101
	}
102
 
103
/**
104
 * testKeyCheck method
105
 *
106
 * @return void
107
 */
108
	public function testKeyCheck() {
109
		$data = array('Multi' => array('dimensonal' => array('array')));
110
		$this->assertTrue(Set::check($data, 'Multi.dimensonal'));
111
		$this->assertFalse(Set::check($data, 'Multi.dimensonal.array'));
112
 
113
		$data = array(
114
			array(
115
				'Article' => array('id' => '1', 'user_id' => '1', 'title' => 'First Article', 'body' => 'First Article Body', 'published' => 'Y', 'created' => '2007-03-18 10:39:23', 'updated' => '2007-03-18 10:41:31'),
116
				'User' => array('id' => '1', 'user' => 'mariano', 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'),
117
				'Comment' => array(
118
					array('id' => '1', 'article_id' => '1', 'user_id' => '2', 'comment' => 'First Comment for First Article', 'published' => 'Y', 'created' => '2007-03-18 10:45:23', 'updated' => '2007-03-18 10:47:31'),
119
					array('id' => '2', 'article_id' => '1', 'user_id' => '4', 'comment' => 'Second Comment for First Article', 'published' => 'Y', 'created' => '2007-03-18 10:47:23', 'updated' => '2007-03-18 10:49:31'),
120
				),
121
				'Tag' => array(
122
					array('id' => '1', 'tag' => 'tag1', 'created' => '2007-03-18 12:22:23', 'updated' => '2007-03-18 12:24:31'),
123
					array('id' => '2', 'tag' => 'tag2', 'created' => '2007-03-18 12:24:23', 'updated' => '2007-03-18 12:26:31')
124
				)
125
			),
126
			array(
127
				'Article' => array('id' => '3', 'user_id' => '1', 'title' => 'Third Article', 'body' => 'Third Article Body', 'published' => 'Y', 'created' => '2007-03-18 10:43:23', 'updated' => '2007-03-18 10:45:31'),
128
				'User' => array('id' => '1', 'user' => 'mariano', 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'),
129
				'Comment' => array(),
130
				'Tag' => array()
131
			)
132
		);
133
		$this->assertTrue(Set::check($data, '0.Article.user_id'));
134
		$this->assertTrue(Set::check($data, '0.Comment.0.id'));
135
		$this->assertFalse(Set::check($data, '0.Comment.0.id.0'));
136
		$this->assertTrue(Set::check($data, '0.Article.user_id'));
137
		$this->assertFalse(Set::check($data, '0.Article.user_id.a'));
138
	}
139
 
140
/**
141
 * testMerge method
142
 *
143
 * @return void
144
 */
145
	public function testMerge() {
146
		$r = Set::merge(array('foo'));
147
		$this->assertEquals(array('foo'), $r);
148
 
149
		$r = Set::merge('foo');
150
		$this->assertEquals(array('foo'), $r);
151
 
152
		$r = Set::merge('foo', 'bar');
153
		$this->assertEquals(array('foo', 'bar'), $r);
154
 
155
		$r = Set::merge(array('foo'), array(), array('bar'));
156
		$this->assertEquals(array('foo', 'bar'), $r);
157
 
158
		$r = Set::merge('foo', array('user' => 'bob', 'no-bar'), 'bar');
159
		$this->assertEquals(array('foo', 'user' => 'bob', 'no-bar', 'bar'), $r);
160
 
161
		$a = array('foo', 'foo2');
162
		$b = array('bar', 'bar2');
163
		$this->assertEquals(array('foo', 'foo2', 'bar', 'bar2'), Set::merge($a, $b));
164
 
165
		$a = array('foo' => 'bar', 'bar' => 'foo');
166
		$b = array('foo' => 'no-bar', 'bar' => 'no-foo');
167
		$this->assertEquals(array('foo' => 'no-bar', 'bar' => 'no-foo'), Set::merge($a, $b));
168
 
169
		$a = array('users' => array('bob', 'jim'));
170
		$b = array('users' => array('lisa', 'tina'));
171
		$this->assertEquals(array('users' => array('bob', 'jim', 'lisa', 'tina')), Set::merge($a, $b));
172
 
173
		$a = array('users' => array('jim', 'bob'));
174
		$b = array('users' => 'none');
175
		$this->assertEquals(array('users' => 'none'), Set::merge($a, $b));
176
 
177
		$a = array('users' => array('lisa' => array('id' => 5, 'pw' => 'secret')), 'cakephp');
178
		$b = array('users' => array('lisa' => array('pw' => 'new-pass', 'age' => 23)), 'ice-cream');
179
		$this->assertEquals(array('users' => array('lisa' => array('id' => 5, 'pw' => 'new-pass', 'age' => 23)), 'cakephp', 'ice-cream'), Set::merge($a, $b));
180
 
181
		$c = array('users' => array('lisa' => array('pw' => 'you-will-never-guess', 'age' => 25, 'pet' => 'dog')), 'chocolate');
182
		$expected = array('users' => array('lisa' => array('id' => 5, 'pw' => 'you-will-never-guess', 'age' => 25, 'pet' => 'dog')), 'cakephp', 'ice-cream', 'chocolate');
183
		$this->assertEquals($expected, Set::merge($a, $b, $c));
184
 
185
		$this->assertEquals($expected, Set::merge($a, $b, array(), $c));
186
 
187
		$r = Set::merge($a, $b, $c);
188
		$this->assertEquals($expected, $r);
189
 
190
		$a = array('Tree', 'CounterCache',
191
				'Upload' => array('folder' => 'products',
192
					'fields' => array('image_1_id', 'image_2_id', 'image_3_id', 'image_4_id', 'image_5_id')));
193
		$b = array('Cacheable' => array('enabled' => false),
194
				'Limit',
195
				'Bindable',
196
				'Validator',
197
				'Transactional');
198
 
199
		$expected = array('Tree', 'CounterCache',
200
				'Upload' => array('folder' => 'products',
201
					'fields' => array('image_1_id', 'image_2_id', 'image_3_id', 'image_4_id', 'image_5_id')),
202
				'Cacheable' => array('enabled' => false),
203
				'Limit',
204
				'Bindable',
205
				'Validator',
206
				'Transactional');
207
 
208
		$this->assertEquals($expected, Set::merge($a, $b));
209
 
210
		$expected = array('Tree' => null, 'CounterCache' => null,
211
				'Upload' => array('folder' => 'products',
212
					'fields' => array('image_1_id', 'image_2_id', 'image_3_id', 'image_4_id', 'image_5_id')),
213
				'Cacheable' => array('enabled' => false),
214
				'Limit' => null,
215
				'Bindable' => null,
216
				'Validator' => null,
217
				'Transactional' => null);
218
 
219
		$this->assertEquals($expected, Set::normalize(Set::merge($a, $b)));
220
	}
221
 
222
/**
223
 * testSort method
224
 *
225
 * @return void
226
 */
227
	public function testSort() {
228
		$result = Set::sort(array(), '{n}.name', 'asc');
229
		$this->assertEquals(array(), $result);
230
 
231
		$a = array(
232
 
233
			1 => array('Person' => array('name' => 'Tracy'), 'Friend' => array(array('name' => 'Lindsay')))
234
		);
235
		$b = array(
236
 
237
			1 => array('Person' => array('name' => 'Jeff'), 'Friend' => array(array('name' => 'Nate')))
238
 
239
		);
240
		$a = Set::sort($a, '{n}.Friend.{n}.name', 'asc');
241
		$this->assertEquals($a, $b);
242
 
243
		$b = array(
244
 
245
			1 => array('Person' => array('name' => 'Tracy'), 'Friend' => array(array('name' => 'Lindsay')))
246
		);
247
		$a = array(
248
 
249
			1 => array('Person' => array('name' => 'Jeff'), 'Friend' => array(array('name' => 'Nate')))
250
 
251
		);
252
		$a = Set::sort($a, '{n}.Friend.{n}.name', 'desc');
253
		$this->assertEquals($a, $b);
254
 
255
		$a = array(
256
 
257
			1 => array('Person' => array('name' => 'Tracy'), 'Friend' => array(array('name' => 'Lindsay'))),
258
			2 => array('Person' => array('name' => 'Adam'), 'Friend' => array(array('name' => 'Bob')))
259
		);
260
		$b = array(
261
 
262
			1 => array('Person' => array('name' => 'Jeff'), 'Friend' => array(array('name' => 'Nate'))),
263
			2 => array('Person' => array('name' => 'Tracy'), 'Friend' => array(array('name' => 'Lindsay')))
264
		);
265
		$a = Set::sort($a, '{n}.Person.name', 'asc');
266
		$this->assertEquals($a, $b);
267
 
268
		$a = array(
269
			array(7, 6, 4),
270
			array(3, 4, 5),
271
			array(3, 2, 1),
272
		);
273
 
274
		$b = array(
275
			array(3, 2, 1),
276
			array(3, 4, 5),
277
			array(7, 6, 4),
278
		);
279
 
280
		$a = Set::sort($a, '{n}.{n}', 'asc');
281
		$this->assertEquals($a, $b);
282
 
283
		$a = array(
284
			array(7, 6, 4),
285
			array(3, 4, 5),
286
			array(3, 2, array(1, 1, 1)),
287
		);
288
 
289
		$b = array(
290
			array(3, 2, array(1, 1, 1)),
291
			array(3, 4, 5),
292
			array(7, 6, 4),
293
		);
294
 
295
		$a = Set::sort($a, '{n}', 'asc');
296
		$this->assertEquals($a, $b);
297
 
298
		$a = array(
299
 
300
			1 => array('Shirt' => array('color' => 'black'))
301
		);
302
		$b = array(
303
 
304
			1 => array('Person' => array('name' => 'Jeff')),
305
		);
306
		$a = Set::sort($a, '{n}.Person.name', 'ASC');
307
		$this->assertEquals($a, $b);
308
 
309
		$names = array(
310
			array('employees' => array(array('name' => array('first' => 'John', 'last' => 'Doe')))),
311
			array('employees' => array(array('name' => array('first' => 'Jane', 'last' => 'Doe')))),
312
			array('employees' => array(array('name' => array()))),
313
			array('employees' => array(array('name' => array())))
314
		);
315
		$result = Set::sort($names, '{n}.employees.0.name', 'asc', 1);
316
		$expected = array(
317
			array('employees' => array(array('name' => array('first' => 'John', 'last' => 'Doe')))),
318
			array('employees' => array(array('name' => array('first' => 'Jane', 'last' => 'Doe')))),
319
			array('employees' => array(array('name' => array()))),
320
			array('employees' => array(array('name' => array())))
321
		);
322
		$this->assertEquals($expected, $result);
323
 
324
		$menus = array(
325
			'blogs' => array('title' => 'Blogs', 'weight' => 3),
326
			'comments' => array('title' => 'Comments', 'weight' => 2),
327
			'users' => array('title' => 'Users', 'weight' => 1),
328
			);
329
		$expected = array(
330
			'users' => array('title' => 'Users', 'weight' => 1),
331
			'comments' => array('title' => 'Comments', 'weight' => 2),
332
			'blogs' => array('title' => 'Blogs', 'weight' => 3),
333
			);
334
		$result = Set::sort($menus, '{[a-z]+}.weight', 'ASC');
335
		$this->assertEquals($expected, $result);
336
	}
337
 
338
/**
339
 * test sorting with string keys.
340
 *
341
 * @return void
342
 */
343
	public function testSortString() {
344
		$toSort = array(
345
			'four' => array('number' => 4, 'some' => 'foursome'),
346
			'six' => array('number' => 6, 'some' => 'sixsome'),
347
			'five' => array('number' => 5, 'some' => 'fivesome'),
348
			'two' => array('number' => 2, 'some' => 'twosome'),
349
			'three' => array('number' => 3, 'some' => 'threesome')
350
		);
351
		$sorted = Set::sort($toSort, '{s}.number', 'asc');
352
		$expected = array(
353
			'two' => array('number' => 2, 'some' => 'twosome'),
354
			'three' => array('number' => 3, 'some' => 'threesome'),
355
			'four' => array('number' => 4, 'some' => 'foursome'),
356
			'five' => array('number' => 5, 'some' => 'fivesome'),
357
			'six' => array('number' => 6, 'some' => 'sixsome')
358
		);
359
		$this->assertEquals($expected, $sorted);
360
	}
361
 
362
/**
363
 * test sorting with out of order keys.
364
 *
365
 * @return void
366
 */
367
	public function testSortWithOutOfOrderKeys() {
368
		$data = array(
369
			9 => array('class' => 510, 'test2' => 2),
370
			1 => array('class' => 500, 'test2' => 1),
371
			2 => array('class' => 600, 'test2' => 2),
372
			5 => array('class' => 625, 'test2' => 4),
373
 
374
		);
375
		$expected = array(
376
			array('class' => 500, 'test2' => 1),
377
			array('class' => 510, 'test2' => 2),
378
			array('class' => 600, 'test2' => 2),
379
			array('class' => 605, 'test2' => 3),
380
			array('class' => 625, 'test2' => 4),
381
		);
382
		$result = Set::sort($data, '{n}.class', 'asc');
383
		$this->assertEquals($expected, $result);
384
 
385
		$result = Set::sort($data, '{n}.test2', 'asc');
386
		$this->assertEquals($expected, $result);
387
	}
388
 
389
/**
390
 * testExtract method
391
 *
392
 * @return void
393
 */
394
	public function testExtract() {
395
		$a = array(
396
			array(
397
				'Article' => array('id' => '1', 'user_id' => '1', 'title' => 'First Article', 'body' => 'First Article Body', 'published' => 'Y', 'created' => '2007-03-18 10:39:23', 'updated' => '2007-03-18 10:41:31'),
398
				'User' => array('id' => '1', 'user' => 'mariano', 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'),
399
				'Comment' => array(
400
					array('id' => '1', 'article_id' => '1', 'user_id' => '2', 'comment' => 'First Comment for First Article', 'published' => 'Y', 'created' => '2007-03-18 10:45:23', 'updated' => '2007-03-18 10:47:31'),
401
					array('id' => '2', 'article_id' => '1', 'user_id' => '4', 'comment' => 'Second Comment for First Article', 'published' => 'Y', 'created' => '2007-03-18 10:47:23', 'updated' => '2007-03-18 10:49:31'),
402
				),
403
				'Tag' => array(
404
					array('id' => '1', 'tag' => 'tag1', 'created' => '2007-03-18 12:22:23', 'updated' => '2007-03-18 12:24:31'),
405
					array('id' => '2', 'tag' => 'tag2', 'created' => '2007-03-18 12:24:23', 'updated' => '2007-03-18 12:26:31')
406
				),
407
				'Deep' => array(
408
					'Nesting' => array(
409
						'test' => array(
410
							1 => 'foo',
411
							2 => array(
412
								'and' => array('more' => 'stuff')
413
							)
414
						)
415
					)
416
				)
417
			),
418
			array(
419
				'Article' => array('id' => '3', 'user_id' => '1', 'title' => 'Third Article', 'body' => 'Third Article Body', 'published' => 'Y', 'created' => '2007-03-18 10:43:23', 'updated' => '2007-03-18 10:45:31'),
420
				'User' => array('id' => '2', 'user' => 'mariano', 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'),
421
				'Comment' => array(),
422
				'Tag' => array()
423
			),
424
			array(
425
				'Article' => array('id' => '3', 'user_id' => '1', 'title' => 'Third Article', 'body' => 'Third Article Body', 'published' => 'Y', 'created' => '2007-03-18 10:43:23', 'updated' => '2007-03-18 10:45:31'),
426
				'User' => array('id' => '3', 'user' => 'mariano', 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'),
427
				'Comment' => array(),
428
				'Tag' => array()
429
			),
430
			array(
431
				'Article' => array('id' => '3', 'user_id' => '1', 'title' => 'Third Article', 'body' => 'Third Article Body', 'published' => 'Y', 'created' => '2007-03-18 10:43:23', 'updated' => '2007-03-18 10:45:31'),
432
				'User' => array('id' => '4', 'user' => 'mariano', 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'),
433
				'Comment' => array(),
434
				'Tag' => array()
435
			),
436
			array(
437
				'Article' => array('id' => '3', 'user_id' => '1', 'title' => 'Third Article', 'body' => 'Third Article Body', 'published' => 'Y', 'created' => '2007-03-18 10:43:23', 'updated' => '2007-03-18 10:45:31'),
438
				'User' => array('id' => '5', 'user' => 'mariano', 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'),
439
				'Comment' => array(),
440
				'Tag' => array()
441
			)
442
		);
443
		$b = array('Deep' => $a[0]['Deep']);
444
		$c = array(
445
			array('a' => array('I' => array('a' => 1))),
446
			array(
447
				'a' => array(
448
					2
449
				)
450
			),
451
			array('a' => array('II' => array('a' => 3, 'III' => array('a' => array('foo' => 4))))),
452
		);
453
 
454
		$expected = array(array('a' => $c[2]['a']));
455
		$r = Set::extract('/a/II[a=3]/..', $c);
456
		$this->assertEquals($expected, $r);
457
 
458
		$expected = array(1, 2, 3, 4, 5);
459
		$this->assertEquals($expected, Set::extract('/User/id', $a));
460
 
461
		$expected = array(1, 2, 3, 4, 5);
462
		$this->assertEquals($expected, Set::extract('/User/id', $a));
463
 
464
		$expected = array(
465
			array('id' => 1), array('id' => 2), array('id' => 3), array('id' => 4), array('id' => 5)
466
		);
467
 
468
		$r = Set::extract('/User/id', $a, array('flatten' => false));
469
		$this->assertEquals($expected, $r);
470
 
471
		$expected = array(array('test' => $a[0]['Deep']['Nesting']['test']));
472
		$this->assertEquals($expected, Set::extract('/Deep/Nesting/test', $a));
473
		$this->assertEquals($expected, Set::extract('/Deep/Nesting/test', $b));
474
 
475
		$expected = array(array('test' => $a[0]['Deep']['Nesting']['test']));
476
		$r = Set::extract('/Deep/Nesting/test/1/..', $a);
477
		$this->assertEquals($expected, $r);
478
 
479
		$expected = array(array('test' => $a[0]['Deep']['Nesting']['test']));
480
		$r = Set::extract('/Deep/Nesting/test/2/and/../..', $a);
481
		$this->assertEquals($expected, $r);
482
 
483
		$expected = array(array('test' => $a[0]['Deep']['Nesting']['test']));
484
		$r = Set::extract('/Deep/Nesting/test/2/../../../Nesting/test/2/..', $a);
485
		$this->assertEquals($expected, $r);
486
 
487
		$expected = array(2);
488
		$r = Set::extract('/User[2]/id', $a);
489
		$this->assertEquals($expected, $r);
490
 
491
		$expected = array(4, 5);
492
		$r = Set::extract('/User[id>3]/id', $a);
493
		$this->assertEquals($expected, $r);
494
 
495
		$expected = array(2, 3);
496
		$r = Set::extract('/User[id>1][id<=3]/id', $a);
497
		$this->assertEquals($expected, $r);
498
 
499
		$expected = array(array('I'), array('II'));
500
		$r = Set::extract('/a/@*', $c);
501
		$this->assertEquals($expected, $r);
502
 
503
		$single = array(
504
			'User' => array(
505
				'id' => 4,
506
				'name' => 'Neo',
507
			)
508
		);
509
		$tricky = array(
510
 
511
				'User' => array(
512
					'id' => 1,
513
					'name' => 'John',
514
				)
515
			),
516
			1 => array(
517
				'User' => array(
518
					'id' => 2,
519
					'name' => 'Bob',
520
				)
521
			),
522
			2 => array(
523
				'User' => array(
524
					'id' => 3,
525
					'name' => 'Tony',
526
				)
527
			),
528
			'User' => array(
529
				'id' => 4,
530
				'name' => 'Neo',
531
			)
532
		);
533
 
534
		$expected = array(1, 2, 3, 4);
535
		$r = Set::extract('/User/id', $tricky);
536
		$this->assertEquals($expected, $r);
537
 
538
		$expected = array(4);
539
		$r = Set::extract('/User/id', $single);
540
		$this->assertEquals($expected, $r);
541
 
542
		$expected = array(1, 3);
543
		$r = Set::extract('/User[name=/n/]/id', $tricky);
544
		$this->assertEquals($expected, $r);
545
 
546
		$expected = array(4);
547
		$r = Set::extract('/User[name=/N/]/id', $tricky);
548
		$this->assertEquals($expected, $r);
549
 
550
		$expected = array(1, 3, 4);
551
		$r = Set::extract('/User[name=/N/i]/id', $tricky);
552
		$this->assertEquals($expected, $r);
553
 
554
		$expected = array(array('id', 'name'), array('id', 'name'), array('id', 'name'), array('id', 'name'));
555
		$r = Set::extract('/User/@*', $tricky);
556
		$this->assertEquals($expected, $r);
557
 
558
		$common = array(
559
			array(
560
				'Article' => array(
561
					'id' => 1,
562
					'name' => 'Article 1',
563
				),
564
				'Comment' => array(
565
					array(
566
						'id' => 1,
567
						'user_id' => 5,
568
						'article_id' => 1,
569
						'text' => 'Comment 1',
570
					),
571
					array(
572
						'id' => 2,
573
						'user_id' => 23,
574
						'article_id' => 1,
575
						'text' => 'Comment 2',
576
					),
577
					array(
578
						'id' => 3,
579
						'user_id' => 17,
580
						'article_id' => 1,
581
						'text' => 'Comment 3',
582
					),
583
				),
584
			),
585
			array(
586
				'Article' => array(
587
					'id' => 2,
588
					'name' => 'Article 2',
589
				),
590
				'Comment' => array(
591
					array(
592
						'id' => 4,
593
						'user_id' => 2,
594
						'article_id' => 2,
595
						'text' => 'Comment 4',
596
						'addition' => '',
597
					),
598
					array(
599
						'id' => 5,
600
						'user_id' => 23,
601
						'article_id' => 2,
602
						'text' => 'Comment 5',
603
						'addition' => 'foo',
604
					),
605
				),
606
			),
607
			array(
608
				'Article' => array(
609
					'id' => 3,
610
					'name' => 'Article 3',
611
				),
612
				'Comment' => array(),
613
			)
614
		);
615
 
616
		$r = Set::extract('/Comment/id', $common);
617
		$expected = array(1, 2, 3, 4, 5);
618
		$this->assertEquals($expected, $r);
619
 
620
		$expected = array(1, 2, 4, 5);
621
		$r = Set::extract('/Comment[id!=3]/id', $common);
622
		$this->assertEquals($expected, $r);
623
 
624
		$r = Set::extract('/', $common);
625
		$this->assertEquals($r, $common);
626
 
627
		$expected = array(1, 2, 4, 5);
628
		$r = Set::extract($common, '/Comment[id!=3]/id');
629
		$this->assertEquals($expected, $r);
630
 
631
		$expected = array($common[0]['Comment'][2]);
632
		$r = Set::extract($common, '/Comment/2');
633
		$this->assertEquals($expected, $r);
634
 
635
		$expected = array($common[0]['Comment'][0]);
636
		$r = Set::extract($common, '/Comment[1]/.[id=1]');
637
		$this->assertEquals($expected, $r);
638
 
639
		$expected = array($common[1]['Comment'][1]);
640
		$r = Set::extract($common, '/1/Comment/.[2]');
641
		$this->assertEquals($expected, $r);
642
 
643
		$expected = array();
644
		$r = Set::extract('/User/id', array());
645
		$this->assertEquals($expected, $r);
646
 
647
		$expected = array(5);
648
		$r = Set::extract('/Comment/id[:last]', $common);
649
		$this->assertEquals($expected, $r);
650
 
651
		$expected = array(1);
652
		$r = Set::extract('/Comment/id[:first]', $common);
653
		$this->assertEquals($expected, $r);
654
 
655
		$expected = array(3);
656
		$r = Set::extract('/Article[:last]/id', $common);
657
		$this->assertEquals($expected, $r);
658
 
659
		$expected = array(array('Comment' => $common[1]['Comment'][0]));
660
		$r = Set::extract('/Comment[addition=]', $common);
661
		$this->assertEquals($expected, $r);
662
 
663
		$habtm = array(
664
			array(
665
				'Post' => array(
666
					'id' => 1,
667
					'title' => 'great post',
668
				),
669
				'Comment' => array(
670
					array(
671
						'id' => 1,
672
						'text' => 'foo',
673
						'User' => array(
674
							'id' => 1,
675
							'name' => 'bob'
676
						),
677
					),
678
					array(
679
						'id' => 2,
680
						'text' => 'bar',
681
						'User' => array(
682
							'id' => 2,
683
							'name' => 'tod'
684
						),
685
					),
686
				),
687
			),
688
			array(
689
				'Post' => array(
690
					'id' => 2,
691
					'title' => 'fun post',
692
				),
693
				'Comment' => array(
694
					array(
695
						'id' => 3,
696
						'text' => '123',
697
						'User' => array(
698
							'id' => 3,
699
							'name' => 'dan'
700
						),
701
					),
702
					array(
703
						'id' => 4,
704
						'text' => '987',
705
						'User' => array(
706
							'id' => 4,
707
							'name' => 'jim'
708
						),
709
					),
710
				),
711
			),
712
		);
713
 
714
		$r = Set::extract('/Comment/User[name=/bob|dan/]/..', $habtm);
715
		$this->assertEquals('bob', $r[0]['Comment']['User']['name']);
716
		$this->assertEquals('dan', $r[1]['Comment']['User']['name']);
717
		$this->assertEquals(2, count($r));
718
 
719
		$r = Set::extract('/Comment/User[name=/bob|tod/]/..', $habtm);
720
		$this->assertEquals('bob', $r[0]['Comment']['User']['name']);
721
 
722
		$this->assertEquals('tod', $r[1]['Comment']['User']['name']);
723
		$this->assertEquals(2, count($r));
724
 
725
		$tree = array(
726
			array(
727
				'Category' => array('name' => 'Category 1'),
728
				'children' => array(array('Category' => array('name' => 'Category 1.1')))
729
			),
730
			array(
731
				'Category' => array('name' => 'Category 2'),
732
				'children' => array(
733
					array('Category' => array('name' => 'Category 2.1')),
734
					array('Category' => array('name' => 'Category 2.2'))
735
				)
736
			),
737
			array(
738
				'Category' => array('name' => 'Category 3'),
739
				'children' => array(array('Category' => array('name' => 'Category 3.1')))
740
			)
741
		);
742
 
743
		$expected = array(array('Category' => $tree[1]['Category']));
744
		$r = Set::extract('/Category[name=Category 2]', $tree);
745
		$this->assertEquals($expected, $r);
746
 
747
		$expected = array(
748
			array('Category' => $tree[1]['Category'], 'children' => $tree[1]['children'])
749
		);
750
		$r = Set::extract('/Category[name=Category 2]/..', $tree);
751
		$this->assertEquals($expected, $r);
752
 
753
		$expected = array(
754
			array('children' => $tree[1]['children'][0]),
755
			array('children' => $tree[1]['children'][1])
756
		);
757
		$r = Set::extract('/Category[name=Category 2]/../children', $tree);
758
		$this->assertEquals($expected, $r);
759
 
760
		$habtm = array(
761
			array(
762
				'Post' => array(
763
					'id' => 1,
764
					'title' => 'great post',
765
				),
766
				'Comment' => array(
767
					array(
768
						'id' => 1,
769
						'text' => 'foo',
770
						'User' => array(
771
							'id' => 1,
772
							'name' => 'bob'
773
						),
774
					),
775
					array(
776
						'id' => 2,
777
						'text' => 'bar',
778
						'User' => array(
779
							'id' => 2,
780
							'name' => 'tod'
781
						),
782
					),
783
				),
784
			),
785
			array(
786
				'Post' => array(
787
					'id' => 2,
788
					'title' => 'fun post',
789
				),
790
				'Comment' => array(
791
					array(
792
						'id' => 3,
793
						'text' => '123',
794
						'User' => array(
795
							'id' => 3,
796
							'name' => 'dan'
797
						),
798
					),
799
					array(
800
						'id' => 4,
801
						'text' => '987',
802
						'User' => array(
803
							'id' => 4,
804
							'name' => 'jim'
805
						),
806
					),
807
				),
808
			),
809
		);
810
 
811
		$r = Set::extract('/Comment/User[name=/\w+/]/..', $habtm);
812
		$this->assertEquals('bob', $r[0]['Comment']['User']['name']);
813
		$this->assertEquals('tod', $r[1]['Comment']['User']['name']);
814
		$this->assertEquals('dan', $r[2]['Comment']['User']['name']);
815
		$this->assertEquals('dan', $r[3]['Comment']['User']['name']);
816
		$this->assertEquals(4, count($r));
817
 
818
		$r = Set::extract('/Comment/User[name=/[a-z]+/]/..', $habtm);
819
		$this->assertEquals('bob', $r[0]['Comment']['User']['name']);
820
		$this->assertEquals('tod', $r[1]['Comment']['User']['name']);
821
		$this->assertEquals('dan', $r[2]['Comment']['User']['name']);
822
		$this->assertEquals('dan', $r[3]['Comment']['User']['name']);
823
		$this->assertEquals(4, count($r));
824
 
825
		$r = Set::extract('/Comment/User[name=/bob|dan/]/..', $habtm);
826
		$this->assertEquals('bob', $r[0]['Comment']['User']['name']);
827
		$this->assertEquals('dan', $r[1]['Comment']['User']['name']);
828
		$this->assertEquals(2, count($r));
829
 
830
		$r = Set::extract('/Comment/User[name=/bob|tod/]/..', $habtm);
831
		$this->assertEquals('bob', $r[0]['Comment']['User']['name']);
832
		$this->assertEquals('tod', $r[1]['Comment']['User']['name']);
833
		$this->assertEquals(2, count($r));
834
 
835
		$mixedKeys = array(
836
			'User' => array(
837
 
838
					'id' => 4,
839
					'name' => 'Neo'
840
				),
841
				1 => array(
842
					'id' => 5,
843
					'name' => 'Morpheus'
844
				),
845
				'stringKey' => array()
846
			)
847
		);
848
		$expected = array('Neo', 'Morpheus');
849
		$r = Set::extract('/User/name', $mixedKeys);
850
		$this->assertEquals($expected, $r);
851
 
852
		$f = array(
853
			array(
854
				'file' => array(
855
					'name' => 'zipfile.zip',
856
					'type' => 'application/zip',
857
					'tmp_name' => '/tmp/php178.tmp',
858
					'error' => 0,
859
					'size' => '564647'
860
				)
861
			),
862
			array(
863
				'file' => array(
864
					'name' => 'zipfile2.zip',
865
					'type' => 'application/x-zip-compressed',
866
					'tmp_name' => '/tmp/php179.tmp',
867
					'error' => 0,
868
					'size' => '354784'
869
				)
870
			),
871
			array(
872
				'file' => array(
873
					'name' => 'picture.jpg',
874
					'type' => 'image/jpeg',
875
					'tmp_name' => '/tmp/php180.tmp',
876
					'error' => 0,
877
					'size' => '21324'
878
				)
879
			)
880
		);
881
		$expected = array(array('name' => 'zipfile2.zip', 'type' => 'application/x-zip-compressed', 'tmp_name' => '/tmp/php179.tmp', 'error' => 0, 'size' => '354784'));
882
		$r = Set::extract('/file/.[type=application/x-zip-compressed]', $f);
883
		$this->assertEquals($expected, $r);
884
 
885
		$expected = array(array('name' => 'zipfile.zip', 'type' => 'application/zip', 'tmp_name' => '/tmp/php178.tmp', 'error' => 0, 'size' => '564647'));
886
		$r = Set::extract('/file/.[type=application/zip]', $f);
887
		$this->assertEquals($expected, $r);
888
 
889
		$f = array(
890
			array(
891
				'file' => array(
892
					'name' => 'zipfile.zip',
893
					'type' => 'application/zip',
894
					'tmp_name' => '/tmp/php178.tmp',
895
					'error' => 0,
896
					'size' => '564647'
897
				)
898
			),
899
			array(
900
				'file' => array(
901
					'name' => 'zipfile2.zip',
902
					'type' => 'application/x zip compressed',
903
					'tmp_name' => '/tmp/php179.tmp',
904
					'error' => 0,
905
					'size' => '354784'
906
				)
907
			),
908
			array(
909
				'file' => array(
910
					'name' => 'picture.jpg',
911
					'type' => 'image/jpeg',
912
					'tmp_name' => '/tmp/php180.tmp',
913
					'error' => 0,
914
					'size' => '21324'
915
				)
916
			)
917
		);
918
		$expected = array(array('name' => 'zipfile2.zip', 'type' => 'application/x zip compressed', 'tmp_name' => '/tmp/php179.tmp', 'error' => 0, 'size' => '354784'));
919
		$r = Set::extract('/file/.[type=application/x zip compressed]', $f);
920
		$this->assertEquals($expected, $r);
921
 
922
		$expected = array(
923
			array('name' => 'zipfile.zip', 'type' => 'application/zip', 'tmp_name' => '/tmp/php178.tmp', 'error' => 0, 'size' => '564647'),
924
			array('name' => 'zipfile2.zip', 'type' => 'application/x zip compressed', 'tmp_name' => '/tmp/php179.tmp', 'error' => 0, 'size' => '354784')
925
		);
926
		$r = Set::extract('/file/.[tmp_name=/tmp\/php17/]', $f);
927
		$this->assertEquals($expected, $r);
928
 
929
		$hasMany = array(
930
			'Node' => array(
931
				'id' => 1,
932
				'name' => 'First',
933
				'state' => 50
934
			),
935
			'ParentNode' => array(
936
 
937
					'id' => 2,
938
					'name' => 'Second',
939
					'state' => 60,
940
				)
941
			)
942
		);
943
		$result = Set::extract('/ParentNode/name', $hasMany);
944
		$expected = array('Second');
945
		$this->assertEquals($expected, $result);
946
 
947
		$data = array(
948
			array(
949
				'Category' => array(
950
					'id' => 1,
951
					'name' => 'First'
952
				),
953
 
954
					'value' => 50
955
				)
956
			),
957
			array(
958
				'Category' => array(
959
					'id' => 2,
960
					'name' => 'Second'
961
				),
962
 
963
					'value' => 60
964
				)
965
			)
966
		);
967
		$expected = array(
968
			array(
969
				'Category' => array(
970
					'id' => 1,
971
					'name' => 'First'
972
				),
973
 
974
					'value' => 50
975
				)
976
			)
977
		);
978
		$result = Set::extract('/Category[id=1]/..', $data);
979
		$this->assertEquals($expected, $result);
980
 
981
		$data = array(
982
			array(
983
				'ChildNode' => array('id' => 1),
984
				array('name' => 'Item 1')
985
			),
986
			array(
987
				'ChildNode' => array('id' => 2),
988
				array('name' => 'Item 2')
989
			),
990
		);
991
 
992
		$expected = array(
993
			'Item 1',
994
			'Item 2'
995
		);
996
		$result = Set::extract('/0/name', $data);
997
		$this->assertEquals($expected, $result);
998
 
999
		$data = array(
1000
			array('A1', 'B1'),
1001
			array('A2', 'B2')
1002
		);
1003
		$expected = array('A1', 'A2');
1004
		$result = Set::extract('/0', $data);
1005
		$this->assertEquals($expected, $result);
1006
	}
1007
 
1008
/**
1009
 * test parent selectors with extract
1010
 *
1011
 * @return void
1012
 */
1013
	public function testExtractParentSelector() {
1014
		$tree = array(
1015
			array(
1016
				'Category' => array(
1017
					'name' => 'Category 1'
1018
				),
1019
				'children' => array(
1020
					array(
1021
						'Category' => array(
1022
							'name' => 'Category 1.1'
1023
						)
1024
					)
1025
				)
1026
			),
1027
			array(
1028
				'Category' => array(
1029
					'name' => 'Category 2'
1030
				),
1031
				'children' => array(
1032
					array(
1033
						'Category' => array(
1034
							'name' => 'Category 2.1'
1035
						)
1036
					),
1037
					array(
1038
						'Category' => array(
1039
							'name' => 'Category 2.2'
1040
						)
1041
					),
1042
				)
1043
			),
1044
			array(
1045
				'Category' => array(
1046
					'name' => 'Category 3'
1047
				),
1048
				'children' => array(
1049
					array(
1050
						'Category' => array(
1051
							'name' => 'Category 3.1'
1052
						)
1053
					)
1054
				)
1055
			)
1056
		);
1057
		$expected = array(array('Category' => $tree[1]['Category']));
1058
		$r = Set::extract('/Category[name=Category 2]', $tree);
1059
		$this->assertEquals($expected, $r);
1060
 
1061
		$expected = array(array('Category' => $tree[1]['Category'], 'children' => $tree[1]['children']));
1062
		$r = Set::extract('/Category[name=Category 2]/..', $tree);
1063
		$this->assertEquals($expected, $r);
1064
 
1065
		$expected = array(array('children' => $tree[1]['children'][0]), array('children' => $tree[1]['children'][1]));
1066
		$r = Set::extract('/Category[name=Category 2]/../children', $tree);
1067
		$this->assertEquals($expected, $r);
1068
 
1069
		$single = array(
1070
			array(
1071
				'CallType' => array(
1072
					'name' => 'Internal Voice'
1073
				),
1074
				'x' => array(
1075
					'hour' => 7
1076
				)
1077
			)
1078
		);
1079
 
1080
		$expected = array(7);
1081
		$r = Set::extract('/CallType[name=Internal Voice]/../x/hour', $single);
1082
		$this->assertEquals($expected, $r);
1083
 
1084
		$multiple = array(
1085
			array(
1086
				'CallType' => array(
1087
					'name' => 'Internal Voice'
1088
				),
1089
				'x' => array(
1090
					'hour' => 7
1091
				)
1092
			),
1093
			array(
1094
				'CallType' => array(
1095
					'name' => 'Internal Voice'
1096
				),
1097
				'x' => array(
1098
					'hour' => 2
1099
				)
1100
			),
1101
			array(
1102
				'CallType' => array(
1103
					'name' => 'Internal Voice'
1104
				),
1105
				'x' => array(
1106
					'hour' => 1
1107
				)
1108
			)
1109
		);
1110
 
1111
		$expected = array(7, 2, 1);
1112
		$r = Set::extract('/CallType[name=Internal Voice]/../x/hour', $multiple);
1113
		$this->assertEquals($expected, $r);
1114
 
1115
		$a = array(
1116
			'Model' => array(
1117
				'0' => array(
1118
					'id' => 18,
1119
					'SubModelsModel' => array(
1120
						'id' => 1,
1121
						'submodel_id' => 66,
1122
						'model_id' => 18,
1123
						'type' => 1
1124
					),
1125
				),
1126
				'1' => array(
1127
					'id' => 0,
1128
					'SubModelsModel' => array(
1129
						'id' => 2,
1130
						'submodel_id' => 66,
1131
						'model_id' => 0,
1132
						'type' => 1
1133
					),
1134
				),
1135
				'2' => array(
1136
					'id' => 17,
1137
					'SubModelsModel' => array(
1138
						'id' => 3,
1139
						'submodel_id' => 66,
1140
						'model_id' => 17,
1141
						'type' => 2
1142
					),
1143
				),
1144
				'3' => array(
1145
					'id' => 0,
1146
					'SubModelsModel' => array(
1147
						'id' => 4,
1148
						'submodel_id' => 66,
1149
						'model_id' => 0,
1150
						'type' => 2
1151
					)
1152
				)
1153
			)
1154
		);
1155
 
1156
		$expected = array(
1157
			array(
1158
				'Model' => array(
1159
					'id' => 17,
1160
					'SubModelsModel' => array(
1161
						'id' => 3,
1162
						'submodel_id' => 66,
1163
						'model_id' => 17,
1164
						'type' => 2
1165
					),
1166
				)
1167
			),
1168
			array(
1169
				'Model' => array(
1170
					'id' => 0,
1171
					'SubModelsModel' => array(
1172
						'id' => 4,
1173
						'submodel_id' => 66,
1174
						'model_id' => 0,
1175
						'type' => 2
1176
					)
1177
				)
1178
			)
1179
		);
1180
		$r = Set::extract('/Model/SubModelsModel[type=2]/..', $a);
1181
		$this->assertEquals($expected, $r);
1182
	}
1183
 
1184
/**
1185
 * test that extract() still works when arrays don't contain a 0 index.
1186
 *
1187
 * @return void
1188
 */
1189
	public function testExtractWithNonZeroArrays() {
1190
		$nonZero = array(
1191
			1 => array(
1192
				'User' => array(
1193
					'id' => 1,
1194
					'name' => 'John',
1195
				)
1196
			),
1197
			2 => array(
1198
				'User' => array(
1199
					'id' => 2,
1200
					'name' => 'Bob',
1201
				)
1202
			),
1203
			3 => array(
1204
				'User' => array(
1205
					'id' => 3,
1206
					'name' => 'Tony',
1207
				)
1208
			)
1209
		);
1210
		$expected = array(1, 2, 3);
1211
		$r = Set::extract('/User/id', $nonZero);
1212
		$this->assertEquals($expected, $r);
1213
 
1214
		$expected = array(
1215
			array('User' => array('id' => 1, 'name' => 'John')),
1216
			array('User' => array('id' => 2, 'name' => 'Bob')),
1217
			array('User' => array('id' => 3, 'name' => 'Tony')),
1218
		);
1219
		$result = Set::extract('/User', $nonZero);
1220
		$this->assertEquals($expected, $result);
1221
 
1222
		$nonSequential = array(
1223
			'User' => array(
1224
 
1225
				2 => array('id' => 2),
1226
				6 => array('id' => 3),
1227
				9 => array('id' => 4),
1228
				3 => array('id' => 5),
1229
			),
1230
		);
1231
 
1232
		$nonZero = array(
1233
			'User' => array(
1234
				2 => array('id' => 1),
1235
				4 => array('id' => 2),
1236
				6 => array('id' => 3),
1237
				9 => array('id' => 4),
1238
				3 => array('id' => 5),
1239
			),
1240
		);
1241
 
1242
		$expected = array(1, 2, 3, 4, 5);
1243
		$this->assertEquals($expected, Set::extract('/User/id', $nonSequential));
1244
 
1245
		$result = Set::extract('/User/id', $nonZero);
1246
		$this->assertEquals($expected, $result, 'Failed non zero array key extract');
1247
 
1248
		$expected = array(1, 2, 3, 4, 5);
1249
		$this->assertEquals($expected, Set::extract('/User/id', $nonSequential));
1250
 
1251
		$result = Set::extract('/User/id', $nonZero);
1252
		$this->assertEquals($expected, $result, 'Failed non zero array key extract');
1253
 
1254
		$startingAtOne = array(
1255
			'Article' => array(
1256
				1 => array(
1257
					'id' => 1,
1258
					'approved' => 1,
1259
				),
1260
			)
1261
		);
1262
 
1263
		$expected = array(0 => array('Article' => array('id' => 1, 'approved' => 1)));
1264
		$result = Set::extract('/Article[approved=1]', $startingAtOne);
1265
		$this->assertEquals($expected, $result);
1266
 
1267
		$items = array(
1268
			240 => array(
1269
				'A' => array(
1270
					'field1' => 'a240',
1271
					'field2' => 'a240',
1272
				),
1273
				'B' => array(
1274
					'field1' => 'b240',
1275
					'field2' => 'b240'
1276
				),
1277
			)
1278
		);
1279
 
1280
		$expected = array(
1281
 
1282
		);
1283
 
1284
		$result = Set::extract('/B/field1', $items);
1285
		$this->assertSame($expected, $result);
1286
		$this->assertSame($result, Set::extract('{n}.B.field1', $items));
1287
	}
1288
 
1289
/**
1290
 * testExtractWithArrays method
1291
 *
1292
 * @return void
1293
 */
1294
	public function testExtractWithArrays() {
1295
		$data = array(
1296
			'Level1' => array(
1297
				'Level2' => array('test1', 'test2'),
1298
				'Level2bis' => array('test3', 'test4')
1299
			)
1300
		);
1301
		$this->assertEquals(array(array('Level2' => array('test1', 'test2'))), Set::extract('/Level1/Level2', $data));
1302
		$this->assertEquals(array(array('Level2bis' => array('test3', 'test4'))), Set::extract('/Level1/Level2bis', $data));
1303
	}
1304
 
1305
/**
1306
 * test extract() with elements that have non-array children.
1307
 *
1308
 * @return void
1309
 */
1310
	public function testExtractWithNonArrayElements() {
1311
		$data = array(
1312
			'node' => array(
1313
				array('foo'),
1314
				'bar'
1315
			)
1316
		);
1317
		$result = Set::extract('/node', $data);
1318
		$expected = array(
1319
			array('node' => array('foo')),
1320
			'bar'
1321
		);
1322
		$this->assertEquals($expected, $result);
1323
 
1324
		$data = array(
1325
			'node' => array(
1326
				'foo' => array('bar'),
1327
				'bar' => array('foo')
1328
			)
1329
		);
1330
		$result = Set::extract('/node', $data);
1331
		$expected = array(
1332
			array('foo' => array('bar')),
1333
			array('bar' => array('foo')),
1334
		);
1335
		$this->assertEquals($expected, $result);
1336
 
1337
		$data = array(
1338
			'node' => array(
1339
				'foo' => array(
1340
					'bar'
1341
				),
1342
				'bar' => 'foo'
1343
			)
1344
		);
1345
		$result = Set::extract('/node', $data);
1346
		$expected = array(
1347
			array('foo' => array('bar')),
1348
			'foo'
1349
		);
1350
		$this->assertEquals($expected, $result);
1351
	}
1352
 
1353
/**
1354
 * Test that extract() + matching can hit null things.
1355
 *
1356
 * @return void
1357
 */
1358
	public function testExtractMatchesNull() {
1359
		$data = array(
1360
			'Country' => array(
1361
				array('name' => 'Canada'),
1362
				array('name' => 'Australia'),
1363
				array('name' => null),
1364
			)
1365
		);
1366
		$result = Set::extract('/Country[name=/Canada|^$/]', $data);
1367
		$expected = array(
1368
			array(
1369
				'Country' => array(
1370
					'name' => 'Canada',
1371
				),
1372
			),
1373
			array(
1374
				'Country' => array(
1375
					'name' => null,
1376
				),
1377
			),
1378
		);
1379
		$this->assertEquals($expected, $result);
1380
	}
1381
 
1382
/**
1383
 * testMatches method
1384
 *
1385
 * @return void
1386
 */
1387
	public function testMatches() {
1388
		$a = array(
1389
			array('Article' => array('id' => 1, 'title' => 'Article 1')),
1390
			array('Article' => array('id' => 2, 'title' => 'Article 2')),
1391
			array('Article' => array('id' => 3, 'title' => 'Article 3'))
1392
		);
1393
 
1394
		$this->assertTrue(Set::matches(array('id=2'), $a[1]['Article']));
1395
		$this->assertFalse(Set::matches(array('id>2'), $a[1]['Article']));
1396
		$this->assertTrue(Set::matches(array('id>=2'), $a[1]['Article']));
1397
		$this->assertFalse(Set::matches(array('id>=3'), $a[1]['Article']));
1398
		$this->assertTrue(Set::matches(array('id<=2'), $a[1]['Article']));
1399
		$this->assertFalse(Set::matches(array('id<2'), $a[1]['Article']));
1400
		$this->assertTrue(Set::matches(array('id>1'), $a[1]['Article']));
1401
		$this->assertTrue(Set::matches(array('id>1', 'id<3', 'id!=0'), $a[1]['Article']));
1402
 
1403
		$this->assertTrue(Set::matches(array('3'), null, 3));
1404
		$this->assertTrue(Set::matches(array('5'), null, 5));
1405
 
1406
		$this->assertTrue(Set::matches(array('id'), $a[1]['Article']));
1407
		$this->assertTrue(Set::matches(array('id', 'title'), $a[1]['Article']));
1408
		$this->assertFalse(Set::matches(array('non-existant'), $a[1]['Article']));
1409
 
1410
		$this->assertTrue(Set::matches('/Article[id=2]', $a));
1411
		$this->assertFalse(Set::matches('/Article[id=4]', $a));
1412
		$this->assertTrue(Set::matches(array(), $a));
1413
 
1414
		$r = array(
1415
			'Attachment' => array(
1416
				'keep' => array()
1417
			),
1418
			'Comment' => array(
1419
				'keep' => array(
1420
					'Attachment' => array(
1421
						'fields' => array(
1422
 
1423
						),
1424
					),
1425
				)
1426
			),
1427
			'User' => array(
1428
				'keep' => array()
1429
			),
1430
			'Article' => array(
1431
				'keep' => array(
1432
					'Comment' => array(
1433
						'fields' => array(
1434
 
1435
							1 => 'published',
1436
						),
1437
					),
1438
					'User' => array(
1439
						'fields' => array(
1440
 
1441
						),
1442
					),
1443
				)
1444
			)
1445
		);
1446
 
1447
		$this->assertTrue(Set::matches('/Article/keep/Comment', $r));
1448
		$this->assertEquals(array('comment', 'published'), Set::extract('/Article/keep/Comment/fields', $r));
1449
		$this->assertEquals(array('user'), Set::extract('/Article/keep/User/fields', $r));
1450
	}
1451
 
1452
/**
1453
 * testSetExtractReturnsEmptyArray method
1454
 *
1455
 * @return void
1456
 */
1457
	public function testSetExtractReturnsEmptyArray() {
1458
		$this->assertEquals(Set::extract(array(), '/Post/id'), array());
1459
 
1460
		$this->assertEquals(Set::extract('/Post/id', array()), array());
1461
 
1462
		$this->assertEquals(Set::extract('/Post/id', array(
1463
			array('Post' => array('name' => 'bob')),
1464
			array('Post' => array('name' => 'jim'))
1465
		)), array());
1466
 
1467
		$this->assertEquals(Set::extract(array(), 'Message.flash'), null);
1468
	}
1469
 
1470
/**
1471
 * testClassicExtract method
1472
 *
1473
 * @return void
1474
 */
1475
	public function testClassicExtract() {
1476
		$a = array(
1477
			array('Article' => array('id' => 1, 'title' => 'Article 1')),
1478
			array('Article' => array('id' => 2, 'title' => 'Article 2')),
1479
			array('Article' => array('id' => 3, 'title' => 'Article 3'))
1480
		);
1481
 
1482
		$result = Set::extract($a, '{n}.Article.id');
1483
		$expected = array(1, 2, 3);
1484
		$this->assertEquals($expected, $result);
1485
 
1486
		$result = Set::extract($a, '{n}.Article.title');
1487
		$expected = array('Article 1', 'Article 2', 'Article 3');
1488
		$this->assertEquals($expected, $result);
1489
 
1490
		$result = Set::extract($a, '1.Article.title');
1491
		$expected = 'Article 2';
1492
		$this->assertEquals($expected, $result);
1493
 
1494
		$result = Set::extract($a, '3.Article.title');
1495
		$expected = null;
1496
		$this->assertEquals($expected, $result);
1497
 
1498
		$a = array(
1499
			array(
1500
				'Article' => array('id' => 1, 'title' => 'Article 1',
1501
				'User' => array('id' => 1, 'username' => 'mariano.iglesias'))
1502
			),
1503
			array(
1504
				'Article' => array('id' => 2, 'title' => 'Article 2',
1505
				'User' => array('id' => 1, 'username' => 'mariano.iglesias'))
1506
			),
1507
			array(
1508
				'Article' => array('id' => 3, 'title' => 'Article 3',
1509
				'User' => array('id' => 2, 'username' => 'phpnut'))
1510
			)
1511
		);
1512
 
1513
		$result = Set::extract($a, '{n}.Article.User.username');
1514
		$expected = array('mariano.iglesias', 'mariano.iglesias', 'phpnut');
1515
		$this->assertEquals($expected, $result);
1516
 
1517
		$a = array(
1518
			array(
1519
				'Article' => array(
1520
					'id' => 1, 'title' => 'Article 1',
1521
					'Comment' => array(
1522
						array('id' => 10, 'title' => 'Comment 10'),
1523
						array('id' => 11, 'title' => 'Comment 11'),
1524
						array('id' => 12, 'title' => 'Comment 12')
1525
					)
1526
				)
1527
			),
1528
			array(
1529
				'Article' => array(
1530
					'id' => 2, 'title' => 'Article 2',
1531
					'Comment' => array(
1532
						array('id' => 13, 'title' => 'Comment 13'),
1533
						array('id' => 14, 'title' => 'Comment 14')
1534
					)
1535
				)
1536
			),
1537
			array('Article' => array('id' => 3, 'title' => 'Article 3'))
1538
		);
1539
 
1540
		$result = Set::extract($a, '{n}.Article.Comment.{n}.id');
1541
		$expected = array(array(10, 11, 12), array(13, 14), null);
1542
		$this->assertEquals($expected, $result);
1543
 
1544
		$result = Set::extract($a, '{n}.Article.Comment.{n}.title');
1545
		$expected = array(
1546
			array('Comment 10', 'Comment 11', 'Comment 12'),
1547
			array('Comment 13', 'Comment 14'),
1548
			null
1549
		);
1550
		$this->assertEquals($expected, $result);
1551
 
1552
		$a = array(array('1day' => '20 sales'), array('1day' => '2 sales'));
1553
		$result = Set::extract($a, '{n}.1day');
1554
		$expected = array('20 sales', '2 sales');
1555
		$this->assertEquals($expected, $result);
1556
 
1557
		$a = array(
1558
			'pages' => array('name' => 'page'),
1559
			'fruites' => array('name' => 'fruit'),
1560
 
1561
		);
1562
		$result = Set::extract($a, '{s}.name');
1563
		$expected = array('page', 'fruit');
1564
		$this->assertEquals($expected, $result);
1565
 
1566
		$a = array(
1567
 
1568
			1 => array('fruites' => array('name' => 'fruit')),
1569
			'test' => array(array('name' => 'jippi')),
1570
			'dot.test' => array(array('name' => 'jippi'))
1571
		);
1572
 
1573
		$result = Set::extract($a, '{n}.{s}.name');
1574
		$expected = array(0 => array('page'), 1 => array('fruit'));
1575
		$this->assertEquals($expected, $result);
1576
 
1577
		$result = Set::extract($a, '{s}.{n}.name');
1578
		$expected = array(array('jippi'), array('jippi'));
1579
		$this->assertEquals($expected, $result);
1580
 
1581
		$result = Set::extract($a, '{\w+}.{\w+}.name');
1582
		$expected = array(
1583
			array('pages' => 'page'),
1584
			array('fruites' => 'fruit'),
1585
			'test' => array('jippi'),
1586
			'dot.test' => array('jippi')
1587
		);
1588
		$this->assertEquals($expected, $result);
1589
 
1590
		$result = Set::extract($a, '{\d+}.{\w+}.name');
1591
		$expected = array(array('pages' => 'page'), array('fruites' => 'fruit'));
1592
		$this->assertEquals($expected, $result);
1593
 
1594
		$result = Set::extract($a, '{n}.{\w+}.name');
1595
		$expected = array(array('pages' => 'page'), array('fruites' => 'fruit'));
1596
		$this->assertEquals($expected, $result);
1597
 
1598
		$result = Set::extract($a, '{s}.{\d+}.name');
1599
		$expected = array(array('jippi'), array('jippi'));
1600
		$this->assertEquals($expected, $result);
1601
 
1602
		$result = Set::extract($a, '{s}');
1603
		$expected = array(array(array('name' => 'jippi')), array(array('name' => 'jippi')));
1604
		$this->assertEquals($expected, $result);
1605
 
1606
		$result = Set::extract($a, '{[a-z]}');
1607
		$expected = array(
1608
			'test' => array(array('name' => 'jippi')),
1609
			'dot.test' => array(array('name' => 'jippi'))
1610
		);
1611
		$this->assertEquals($expected, $result);
1612
 
1613
		$result = Set::extract($a, '{dot\.test}.{n}');
1614
		$expected = array('dot.test' => array(array('name' => 'jippi')));
1615
		$this->assertEquals($expected, $result);
1616
 
1617
		$a = new stdClass();
1618
		$a->articles = array(
1619
			array('Article' => array('id' => 1, 'title' => 'Article 1')),
1620
			array('Article' => array('id' => 2, 'title' => 'Article 2')),
1621
			array('Article' => array('id' => 3, 'title' => 'Article 3'))
1622
		);
1623
 
1624
		$result = Set::extract($a, 'articles.{n}.Article.id');
1625
		$expected = array(1, 2, 3);
1626
		$this->assertEquals($expected, $result);
1627
 
1628
		$result = Set::extract($a, 'articles.{n}.Article.title');
1629
		$expected = array('Article 1', 'Article 2', 'Article 3');
1630
		$this->assertEquals($expected, $result);
1631
 
1632
		$a = new ArrayObject();
1633
		$a['articles'] = array(
1634
			array('Article' => array('id' => 1, 'title' => 'Article 1')),
1635
			array('Article' => array('id' => 2, 'title' => 'Article 2')),
1636
			array('Article' => array('id' => 3, 'title' => 'Article 3'))
1637
		);
1638
 
1639
		$result = Set::extract($a, 'articles.{n}.Article.id');
1640
		$expected = array(1, 2, 3);
1641
		$this->assertEquals($expected, $result);
1642
 
1643
		$result = Set::extract($a, 'articles.{n}.Article.title');
1644
		$expected = array('Article 1', 'Article 2', 'Article 3');
1645
		$this->assertEquals($expected, $result);
1646
 
1647
		$result = Set::extract($a, 'articles.0.Article.title');
1648
		$expected = 'Article 1';
1649
		$this->assertEquals($expected, $result);
1650
	}
1651
 
1652
/**
1653
 * test classicExtract with keys that exceed 32bit max int.
1654
 *
1655
 * @return void
1656
 */
1657
	public function testClassicExtractMaxInt() {
1658
		$data = array(
1659
			'Data' => array(
1660
				'13376924712' => 'abc'
1661
			)
1662
		);
1663
		$this->assertEquals('abc', Set::classicExtract($data, 'Data.13376924712'));
1664
	}
1665
 
1666
/**
1667
 * testInsert method
1668
 *
1669
 * @see Hash tests, as Set::insert() is just a proxy.
1670
 * @return void
1671
 */
1672
	public function testInsert() {
1673
		$a = array(
1674
			'pages' => array('name' => 'page')
1675
		);
1676
 
1677
		$result = Set::insert($a, 'files', array('name' => 'files'));
1678
		$expected = array(
1679
			'pages' => array('name' => 'page'),
1680
			'files' => array('name' => 'files')
1681
		);
1682
		$this->assertEquals($expected, $result);
1683
	}
1684
 
1685
/**
1686
 * testRemove method
1687
 *
1688
 * @return void
1689
 */
1690
	public function testRemove() {
1691
		$a = array(
1692
			'pages' => array('name' => 'page'),
1693
			'files' => array('name' => 'files')
1694
		);
1695
 
1696
		$result = Set::remove($a, 'files');
1697
		$expected = array(
1698
			'pages' => array('name' => 'page')
1699
		);
1700
		$this->assertEquals($expected, $result);
1701
	}
1702
 
1703
/**
1704
 * testCheck method
1705
 *
1706
 * @return void
1707
 */
1708
	public function testCheck() {
1709
		$set = array(
1710
			'My Index 1' => array('First' => 'The first item')
1711
		);
1712
		$this->assertTrue(Set::check($set, 'My Index 1.First'));
1713
		$this->assertTrue(Set::check($set, 'My Index 1'));
1714
		$this->assertEquals(Set::check($set, array()), $set);
1715
 
1716
		$set = array(
1717
			'My Index 1' => array('First' => array('Second' => array('Third' => array('Fourth' => 'Heavy. Nesting.'))))
1718
		);
1719
		$this->assertTrue(Set::check($set, 'My Index 1.First.Second'));
1720
		$this->assertTrue(Set::check($set, 'My Index 1.First.Second.Third'));
1721
		$this->assertTrue(Set::check($set, 'My Index 1.First.Second.Third.Fourth'));
1722
		$this->assertFalse(Set::check($set, 'My Index 1.First.Seconds.Third.Fourth'));
1723
	}
1724
 
1725
/**
1726
 * testWritingWithFunkyKeys method
1727
 *
1728
 * @return void
1729
 */
1730
	public function testWritingWithFunkyKeys() {
1731
		$set = Set::insert(array(), 'Session Test', "test");
1732
		$this->assertEquals('test', Set::extract($set, 'Session Test'));
1733
 
1734
		$set = Set::remove($set, 'Session Test');
1735
		$this->assertFalse(Set::check($set, 'Session Test'));
1736
 
1737
		$expected = array('Session Test' => array('Test Case' => 'test'));
1738
		$this->assertEquals($expected, Set::insert(array(), 'Session Test.Test Case', "test"));
1739
		$this->assertTrue(Set::check($expected, 'Session Test.Test Case'));
1740
	}
1741
 
1742
/**
1743
 * testDiff method
1744
 *
1745
 * @return void
1746
 */
1747
	public function testDiff() {
1748
		$a = array(
1749
 
1750
			1 => array('name' => 'about')
1751
		);
1752
		$b = array(
1753
 
1754
			1 => array('name' => 'about'),
1755
			2 => array('name' => 'contact')
1756
		);
1757
 
1758
		$result = Set::diff($a, $b);
1759
		$expected = array(
1760
			2 => array('name' => 'contact')
1761
		);
1762
		$this->assertEquals($expected, $result);
1763
 
1764
		$result = Set::diff($a, array());
1765
		$expected = $a;
1766
		$this->assertEquals($expected, $result);
1767
 
1768
		$result = Set::diff(array(), $b);
1769
		$expected = $b;
1770
		$this->assertEquals($expected, $result);
1771
 
1772
		$b = array(
1773
 
1774
			1 => array('name' => 'about')
1775
		);
1776
 
1777
		$result = Set::diff($a, $b);
1778
		$expected = array(
1779
 
1780
		);
1781
		$this->assertEquals($expected, $result);
1782
 
1783
		$a = array();
1784
		$b = array('name' => 'bob', 'address' => 'home');
1785
		$result = Set::diff($a, $b);
1786
		$this->assertEquals($b, $result);
1787
 
1788
		$a = array('name' => 'bob', 'address' => 'home');
1789
		$b = array();
1790
		$result = Set::diff($a, $b);
1791
		$this->assertEquals($a, $result);
1792
 
1793
		$a = array('key' => true, 'another' => false, 'name' => 'me');
1794
		$b = array('key' => 1, 'another' => 0);
1795
		$expected = array('name' => 'me');
1796
		$result = Set::diff($a, $b);
1797
		$this->assertEquals($expected, $result);
1798
 
1799
		$a = array('key' => 'value', 'another' => null, 'name' => 'me');
1800
		$b = array('key' => 'differentValue', 'another' => null);
1801
		$expected = array('key' => 'value', 'name' => 'me');
1802
		$result = Set::diff($a, $b);
1803
		$this->assertEquals($expected, $result);
1804
 
1805
		$a = array('key' => 'value', 'another' => null, 'name' => 'me');
1806
		$b = array('key' => 'differentValue', 'another' => 'value');
1807
		$expected = array('key' => 'value', 'another' => null, 'name' => 'me');
1808
		$result = Set::diff($a, $b);
1809
		$this->assertEquals($expected, $result);
1810
 
1811
		$a = array('key' => 'value', 'another' => null, 'name' => 'me');
1812
		$b = array('key' => 'differentValue', 'another' => 'value');
1813
		$expected = array('key' => 'differentValue', 'another' => 'value', 'name' => 'me');
1814
		$result = Set::diff($b, $a);
1815
		$this->assertEquals($expected, $result);
1816
 
1817
		$a = array('key' => 'value', 'another' => null, 'name' => 'me');
1818
		$b = array(0 => 'differentValue', 1 => 'value');
1819
		$expected = $a + $b;
1820
		$result = Set::diff($a, $b);
1821
		$this->assertEquals($expected, $result);
1822
	}
1823
 
1824
/**
1825
 * testContains method
1826
 *
1827
 * @return void
1828
 */
1829
	public function testContains() {
1830
		$a = array(
1831
 
1832
			1 => array('name' => 'about')
1833
		);
1834
		$b = array(
1835
 
1836
			1 => array('name' => 'about'),
1837
			2 => array('name' => 'contact'),
1838
			'a' => 'b'
1839
		);
1840
 
1841
		$this->assertTrue(Set::contains($a, $a));
1842
		$this->assertFalse(Set::contains($a, $b));
1843
		$this->assertTrue(Set::contains($b, $a));
1844
	}
1845
 
1846
/**
1847
 * testCombine method
1848
 *
1849
 * @return void
1850
 */
1851
	public function testCombine() {
1852
		$result = Set::combine(array(), '{n}.User.id', '{n}.User.Data');
1853
		$this->assertTrue(empty($result));
1854
		$result = Set::combine('', '{n}.User.id', '{n}.User.Data');
1855
		$this->assertTrue(empty($result));
1856
 
1857
		$a = array(
1858
			array('User' => array('id' => 2, 'group_id' => 1,
1859
				'Data' => array('user' => 'mariano.iglesias', 'name' => 'Mariano Iglesias'))),
1860
			array('User' => array('id' => 14, 'group_id' => 2,
1861
				'Data' => array('user' => 'phpnut', 'name' => 'Larry E. Masters'))),
1862
			array('User' => array('id' => 25, 'group_id' => 1,
1863
				'Data' => array('user' => 'gwoo', 'name' => 'The Gwoo'))));
1864
		$result = Set::combine($a, '{n}.User.id');
1865
		$expected = array(2 => null, 14 => null, 25 => null);
1866
		$this->assertEquals($expected, $result);
1867
 
1868
		$result = Set::combine($a, '{n}.User.id', '{n}.User.non-existant');
1869
		$expected = array(2 => null, 14 => null, 25 => null);
1870
		$this->assertEquals($expected, $result);
1871
 
1872
		$result = Set::combine($a, '{n}.User.id', '{n}.User.Data');
1873
		$expected = array(
1874
			2 => array('user' => 'mariano.iglesias', 'name' => 'Mariano Iglesias'),
1875
			14 => array('user' => 'phpnut', 'name' => 'Larry E. Masters'),
1876
			25 => array('user' => 'gwoo', 'name' => 'The Gwoo'));
1877
		$this->assertEquals($expected, $result);
1878
 
1879
		$result = Set::combine($a, '{n}.User.id', '{n}.User.Data.name');
1880
		$expected = array(
1881
			2 => 'Mariano Iglesias',
1882
			14 => 'Larry E. Masters',
1883
			25 => 'The Gwoo');
1884
		$this->assertEquals($expected, $result);
1885
 
1886
		$result = Set::combine($a, '{n}.User.id', '{n}.User.Data', '{n}.User.group_id');
1887
		$expected = array(
1888
			1 => array(
1889
				2 => array('user' => 'mariano.iglesias', 'name' => 'Mariano Iglesias'),
1890
				25 => array('user' => 'gwoo', 'name' => 'The Gwoo')),
1891
			2 => array(
1892
				14 => array('user' => 'phpnut', 'name' => 'Larry E. Masters')));
1893
		$this->assertEquals($expected, $result);
1894
 
1895
		$result = Set::combine($a, '{n}.User.id', '{n}.User.Data.name', '{n}.User.group_id');
1896
		$expected = array(
1897
			1 => array(
1898
				2 => 'Mariano Iglesias',
1899
				25 => 'The Gwoo'),
1900
			2 => array(
1901
				14 => 'Larry E. Masters'));
1902
		$this->assertEquals($expected, $result);
1903
 
1904
		$result = Set::combine($a, '{n}.User.id');
1905
		$expected = array(2 => null, 14 => null, 25 => null);
1906
		$this->assertEquals($expected, $result);
1907
 
1908
		$result = Set::combine($a, '{n}.User.id', '{n}.User.Data');
1909
		$expected = array(
1910
			2 => array('user' => 'mariano.iglesias', 'name' => 'Mariano Iglesias'),
1911
			14 => array('user' => 'phpnut', 'name' => 'Larry E. Masters'),
1912
			25 => array('user' => 'gwoo', 'name' => 'The Gwoo'));
1913
		$this->assertEquals($expected, $result);
1914
 
1915
		$result = Set::combine($a, '{n}.User.id', '{n}.User.Data.name');
1916
		$expected = array(2 => 'Mariano Iglesias', 14 => 'Larry E. Masters', 25 => 'The Gwoo');
1917
		$this->assertEquals($expected, $result);
1918
 
1919
		$result = Set::combine($a, '{n}.User.id', '{n}.User.Data', '{n}.User.group_id');
1920
		$expected = array(
1921
			1 => array(
1922
				2 => array('user' => 'mariano.iglesias', 'name' => 'Mariano Iglesias'),
1923
				25 => array('user' => 'gwoo', 'name' => 'The Gwoo')),
1924
			2 => array(
1925
				14 => array('user' => 'phpnut', 'name' => 'Larry E. Masters')));
1926
		$this->assertEquals($expected, $result);
1927
 
1928
		$result = Set::combine($a, '{n}.User.id', '{n}.User.Data.name', '{n}.User.group_id');
1929
		$expected = array(
1930
			1 => array(
1931
				2 => 'Mariano Iglesias',
1932
				25 => 'The Gwoo'),
1933
			2 => array(
1934
				14 => 'Larry E. Masters'));
1935
		$this->assertEquals($expected, $result);
1936
 
1937
		$result = Set::combine($a, '{n}.User.id', array('{0}: {1}', '{n}.User.Data.user', '{n}.User.Data.name'), '{n}.User.group_id');
1938
		$expected = array(
1939
			1 => array(
1940
				2 => 'mariano.iglesias: Mariano Iglesias',
1941
				25 => 'gwoo: The Gwoo'),
1942
			2 => array(14 => 'phpnut: Larry E. Masters'));
1943
		$this->assertEquals($expected, $result);
1944
 
1945
		$result = Set::combine($a, array('{0}: {1}', '{n}.User.Data.user', '{n}.User.Data.name'), '{n}.User.id');
1946
		$expected = array('mariano.iglesias: Mariano Iglesias' => 2, 'phpnut: Larry E. Masters' => 14, 'gwoo: The Gwoo' => 25);
1947
		$this->assertEquals($expected, $result);
1948
 
1949
		$result = Set::combine($a, array('{1}: {0}', '{n}.User.Data.user', '{n}.User.Data.name'), '{n}.User.id');
1950
		$expected = array('Mariano Iglesias: mariano.iglesias' => 2, 'Larry E. Masters: phpnut' => 14, 'The Gwoo: gwoo' => 25);
1951
		$this->assertEquals($expected, $result);
1952
 
1953
		$result = Set::combine($a, array('%1$s: %2$d', '{n}.User.Data.user', '{n}.User.id'), '{n}.User.Data.name');
1954
		$expected = array('mariano.iglesias: 2' => 'Mariano Iglesias', 'phpnut: 14' => 'Larry E. Masters', 'gwoo: 25' => 'The Gwoo');
1955
		$this->assertEquals($expected, $result);
1956
 
1957
		$result = Set::combine($a, array('%2$d: %1$s', '{n}.User.Data.user', '{n}.User.id'), '{n}.User.Data.name');
1958
		$expected = array('2: mariano.iglesias' => 'Mariano Iglesias', '14: phpnut' => 'Larry E. Masters', '25: gwoo' => 'The Gwoo');
1959
		$this->assertEquals($expected, $result);
1960
 
1961
		$b = new stdClass();
1962
		$b->users = array(
1963
			array('User' => array('id' => 2, 'group_id' => 1,
1964
				'Data' => array('user' => 'mariano.iglesias', 'name' => 'Mariano Iglesias'))),
1965
			array('User' => array('id' => 14, 'group_id' => 2,
1966
				'Data' => array('user' => 'phpnut', 'name' => 'Larry E. Masters'))),
1967
			array('User' => array('id' => 25, 'group_id' => 1,
1968
				'Data' => array('user' => 'gwoo', 'name' => 'The Gwoo'))));
1969
		$result = Set::combine($b, 'users.{n}.User.id');
1970
		$expected = array(2 => null, 14 => null, 25 => null);
1971
		$this->assertEquals($expected, $result);
1972
 
1973
		$result = Set::combine($b, 'users.{n}.User.id', 'users.{n}.User.non-existant');
1974
		$expected = array(2 => null, 14 => null, 25 => null);
1975
		$this->assertEquals($expected, $result);
1976
 
1977
		$result = Set::combine($a, 'fail', 'fail');
1978
		$this->assertSame(array(), $result);
1979
	}
1980
 
1981
/**
1982
 * testMapReverse method
1983
 *
1984
 * @return void
1985
 */
1986
	public function testMapReverse() {
1987
		$result = Set::reverse(null);
1988
		$this->assertEquals(null, $result);
1989
 
1990
		$result = Set::reverse(false);
1991
		$this->assertEquals(false, $result);
1992
 
1993
		$expected = array(
1994
		'Array1' => array(
1995
				'Array1Data1' => 'Array1Data1 value 1', 'Array1Data2' => 'Array1Data2 value 2'),
1996
		'Array2' => array(
1997
 
1998
				1 => array('Array2Data1' => 2, 'Array2Data2' => 'Array2Data2 value 2', 'Array2Data3' => 'Array2Data3 value 2', 'Array2Data4' => 'Array2Data4 value 4'),
1999
				2 => array('Array2Data1' => 3, 'Array2Data2' => 'Array2Data2 value 2', 'Array2Data3' => 'Array2Data3 value 2', 'Array2Data4' => 'Array2Data4 value 4'),
2000
				3 => array('Array2Data1' => 4, 'Array2Data2' => 'Array2Data2 value 2', 'Array2Data3' => 'Array2Data3 value 2', 'Array2Data4' => 'Array2Data4 value 4'),
2001
				4 => array('Array2Data1' => 5, 'Array2Data2' => 'Array2Data2 value 2', 'Array2Data3' => 'Array2Data3 value 2', 'Array2Data4' => 'Array2Data4 value 4')),
2002
		'Array3' => array(
2003
 
2004
				1 => array('Array3Data1' => 2, 'Array3Data2' => 'Array3Data2 value 2', 'Array3Data3' => 'Array3Data3 value 2', 'Array3Data4' => 'Array3Data4 value 4'),
2005
				2 => array('Array3Data1' => 3, 'Array3Data2' => 'Array3Data2 value 2', 'Array3Data3' => 'Array3Data3 value 2', 'Array3Data4' => 'Array3Data4 value 4'),
2006
				3 => array('Array3Data1' => 4, 'Array3Data2' => 'Array3Data2 value 2', 'Array3Data3' => 'Array3Data3 value 2', 'Array3Data4' => 'Array3Data4 value 4'),
2007
				4 => array('Array3Data1' => 5, 'Array3Data2' => 'Array3Data2 value 2', 'Array3Data3' => 'Array3Data3 value 2', 'Array3Data4' => 'Array3Data4 value 4')));
2008
		$map = Set::map($expected, true);
2009
		$this->assertEquals($expected['Array1']['Array1Data1'], $map->Array1->Array1Data1);
2010
		$this->assertEquals($expected['Array2'][0]['Array2Data1'], $map->Array2[0]->Array2Data1);
2011
 
2012
		$result = Set::reverse($map);
2013
		$this->assertEquals($expected, $result);
2014
 
2015
		$expected = array(
2016
			'Post' => array('id' => 1, 'title' => 'First Post'),
2017
			'Comment' => array(
2018
				array('id' => 1, 'title' => 'First Comment'),
2019
				array('id' => 2, 'title' => 'Second Comment')
2020
			),
2021
			'Tag' => array(
2022
				array('id' => 1, 'title' => 'First Tag'),
2023
				array('id' => 2, 'title' => 'Second Tag')
2024
			),
2025
		);
2026
		$map = Set::map($expected);
2027
		$this->assertEquals($expected['Post']['title'], $map->title);
2028
		foreach ($map->Comment as $comment) {
2029
			$ids[] = $comment->id;
2030
		}
2031
		$this->assertEquals(array(1, 2), $ids);
2032
 
2033
		$expected = array(
2034
		'Array1' => array(
2035
				'Array1Data1' => 'Array1Data1 value 1', 'Array1Data2' => 'Array1Data2 value 2', 'Array1Data3' => 'Array1Data3 value 3', 'Array1Data4' => 'Array1Data4 value 4',
2036
				'Array1Data5' => 'Array1Data5 value 5', 'Array1Data6' => 'Array1Data6 value 6', 'Array1Data7' => 'Array1Data7 value 7', 'Array1Data8' => 'Array1Data8 value 8'),
2037
		'string' => 1,
2038
		'another' => 'string',
2039
		'some' => 'thing else',
2040
		'Array2' => array(
2041
 
2042
				1 => array('Array2Data1' => 2, 'Array2Data2' => 'Array2Data2 value 2', 'Array2Data3' => 'Array2Data3 value 2', 'Array2Data4' => 'Array2Data4 value 4'),
2043
				2 => array('Array2Data1' => 3, 'Array2Data2' => 'Array2Data2 value 2', 'Array2Data3' => 'Array2Data3 value 2', 'Array2Data4' => 'Array2Data4 value 4'),
2044
				3 => array('Array2Data1' => 4, 'Array2Data2' => 'Array2Data2 value 2', 'Array2Data3' => 'Array2Data3 value 2', 'Array2Data4' => 'Array2Data4 value 4'),
2045
				4 => array('Array2Data1' => 5, 'Array2Data2' => 'Array2Data2 value 2', 'Array2Data3' => 'Array2Data3 value 2', 'Array2Data4' => 'Array2Data4 value 4')),
2046
		'Array3' => array(
2047
 
2048
				1 => array('Array3Data1' => 2, 'Array3Data2' => 'Array3Data2 value 2', 'Array3Data3' => 'Array3Data3 value 2', 'Array3Data4' => 'Array3Data4 value 4'),
2049
				2 => array('Array3Data1' => 3, 'Array3Data2' => 'Array3Data2 value 2', 'Array3Data3' => 'Array3Data3 value 2', 'Array3Data4' => 'Array3Data4 value 4'),
2050
				3 => array('Array3Data1' => 4, 'Array3Data2' => 'Array3Data2 value 2', 'Array3Data3' => 'Array3Data3 value 2', 'Array3Data4' => 'Array3Data4 value 4'),
2051
				4 => array('Array3Data1' => 5, 'Array3Data2' => 'Array3Data2 value 2', 'Array3Data3' => 'Array3Data3 value 2', 'Array3Data4' => 'Array3Data4 value 4')));
2052
		$map = Set::map($expected, true);
2053
		$result = Set::reverse($map);
2054
		$this->assertEquals($expected, $result);
2055
 
2056
		$expected = array(
2057
		'Array1' => array(
2058
				'Array1Data1' => 'Array1Data1 value 1', 'Array1Data2' => 'Array1Data2 value 2', 'Array1Data3' => 'Array1Data3 value 3', 'Array1Data4' => 'Array1Data4 value 4',
2059
				'Array1Data5' => 'Array1Data5 value 5', 'Array1Data6' => 'Array1Data6 value 6', 'Array1Data7' => 'Array1Data7 value 7', 'Array1Data8' => 'Array1Data8 value 8'),
2060
		'string' => 1,
2061
		'another' => 'string',
2062
		'some' => 'thing else',
2063
		'Array2' => array(
2064
 
2065
				1 => array('Array2Data1' => 2, 'Array2Data2' => 'Array2Data2 value 2', 'Array2Data3' => 'Array2Data3 value 2', 'Array2Data4' => 'Array2Data4 value 4'),
2066
				2 => array('Array2Data1' => 3, 'Array2Data2' => 'Array2Data2 value 2', 'Array2Data3' => 'Array2Data3 value 2', 'Array2Data4' => 'Array2Data4 value 4'),
2067
				3 => array('Array2Data1' => 4, 'Array2Data2' => 'Array2Data2 value 2', 'Array2Data3' => 'Array2Data3 value 2', 'Array2Data4' => 'Array2Data4 value 4'),
2068
				4 => array('Array2Data1' => 5, 'Array2Data2' => 'Array2Data2 value 2', 'Array2Data3' => 'Array2Data3 value 2', 'Array2Data4' => 'Array2Data4 value 4')),
2069
		'string2' => 1,
2070
		'another2' => 'string',
2071
		'some2' => 'thing else',
2072
		'Array3' => array(
2073
 
2074
				1 => array('Array3Data1' => 2, 'Array3Data2' => 'Array3Data2 value 2', 'Array3Data3' => 'Array3Data3 value 2', 'Array3Data4' => 'Array3Data4 value 4'),
2075
				2 => array('Array3Data1' => 3, 'Array3Data2' => 'Array3Data2 value 2', 'Array3Data3' => 'Array3Data3 value 2', 'Array3Data4' => 'Array3Data4 value 4'),
2076
				3 => array('Array3Data1' => 4, 'Array3Data2' => 'Array3Data2 value 2', 'Array3Data3' => 'Array3Data3 value 2', 'Array3Data4' => 'Array3Data4 value 4'),
2077
				4 => array('Array3Data1' => 5, 'Array3Data2' => 'Array3Data2 value 2', 'Array3Data3' => 'Array3Data3 value 2', 'Array3Data4' => 'Array3Data4 value 4')),
2078
		'string3' => 1,
2079
		'another3' => 'string',
2080
		'some3' => 'thing else');
2081
		$map = Set::map($expected, true);
2082
		$result = Set::reverse($map);
2083
		$this->assertEquals($expected, $result);
2084
 
2085
		$expected = array('User' => array('psword' => 'whatever', 'Icon' => array('id' => 851)));
2086
		$map = Set::map($expected);
2087
		$result = Set::reverse($map);
2088
		$this->assertEquals($expected, $result);
2089
 
2090
		$expected = array('User' => array('psword' => 'whatever', 'Icon' => array('id' => 851)));
2091
		$class = new stdClass;
2092
		$class->User = new stdClass;
2093
		$class->User->psword = 'whatever';
2094
		$class->User->Icon = new stdClass;
2095
		$class->User->Icon->id = 851;
2096
		$result = Set::reverse($class);
2097
		$this->assertEquals($expected, $result);
2098
 
2099
		$expected = array('User' => array('psword' => 'whatever', 'Icon' => array('id' => 851), 'Profile' => array('name' => 'Some Name', 'address' => 'Some Address')));
2100
		$class = new stdClass;
2101
		$class->User = new stdClass;
2102
		$class->User->psword = 'whatever';
2103
		$class->User->Icon = new stdClass;
2104
		$class->User->Icon->id = 851;
2105
		$class->User->Profile = new stdClass;
2106
		$class->User->Profile->name = 'Some Name';
2107
		$class->User->Profile->address = 'Some Address';
2108
 
2109
		$result = Set::reverse($class);
2110
		$this->assertEquals($expected, $result);
2111
 
2112
		$expected = array('User' => array('psword' => 'whatever',
2113
						'Icon' => array('id' => 851),
2114
						'Profile' => array('name' => 'Some Name', 'address' => 'Some Address'),
2115
						'Comment' => array(
2116
								array('id' => 1, 'article_id' => 1, 'user_id' => 1, 'comment' => 'First Comment for First Article', 'published' => 'Y', 'created' => '2007-03-18 10:47:23', 'updated' => '2007-03-18 10:49:31'),
2117
								array('id' => 2, 'article_id' => 1, 'user_id' => 2, 'comment' => 'Second Comment for First Article', 'published' => 'Y', 'created' => '2007-03-18 10:47:23', 'updated' => '2007-03-18 10:49:31'))));
2118
 
2119
		$class = new stdClass;
2120
		$class->User = new stdClass;
2121
		$class->User->psword = 'whatever';
2122
		$class->User->Icon = new stdClass;
2123
		$class->User->Icon->id = 851;
2124
		$class->User->Profile = new stdClass;
2125
		$class->User->Profile->name = 'Some Name';
2126
		$class->User->Profile->address = 'Some Address';
2127
		$class->User->Comment = new stdClass;
2128
		$class->User->Comment->{'0'} = new stdClass;
2129
		$class->User->Comment->{'0'}->id = 1;
2130
		$class->User->Comment->{'0'}->article_id = 1;
2131
		$class->User->Comment->{'0'}->user_id = 1;
2132
		$class->User->Comment->{'0'}->comment = 'First Comment for First Article';
2133
		$class->User->Comment->{'0'}->published = 'Y';
2134
		$class->User->Comment->{'0'}->created = '2007-03-18 10:47:23';
2135
		$class->User->Comment->{'0'}->updated = '2007-03-18 10:49:31';
2136
		$class->User->Comment->{'1'} = new stdClass;
2137
		$class->User->Comment->{'1'}->id = 2;
2138
		$class->User->Comment->{'1'}->article_id = 1;
2139
		$class->User->Comment->{'1'}->user_id = 2;
2140
		$class->User->Comment->{'1'}->comment = 'Second Comment for First Article';
2141
		$class->User->Comment->{'1'}->published = 'Y';
2142
		$class->User->Comment->{'1'}->created = '2007-03-18 10:47:23';
2143
		$class->User->Comment->{'1'}->updated = '2007-03-18 10:49:31';
2144
 
2145
		$result = Set::reverse($class);
2146
		$this->assertEquals($expected, $result);
2147
 
2148
		$expected = array('User' => array('psword' => 'whatever',
2149
						'Icon' => array('id' => 851),
2150
						'Profile' => array('name' => 'Some Name', 'address' => 'Some Address'),
2151
						'Comment' => array(
2152
								array('id' => 1, 'article_id' => 1, 'user_id' => 1, 'comment' => 'First Comment for First Article', 'published' => 'Y', 'created' => '2007-03-18 10:47:23', 'updated' => '2007-03-18 10:49:31'),
2153
								array('id' => 2, 'article_id' => 1, 'user_id' => 2, 'comment' => 'Second Comment for First Article', 'published' => 'Y', 'created' => '2007-03-18 10:47:23', 'updated' => '2007-03-18 10:49:31'))));
2154
 
2155
		// @codingStandardsIgnoreStart
2156
		$class = new stdClass;
2157
		$class->User = new stdClass;
2158
		$class->User->psword = 'whatever';
2159
		$class->User->Icon = new stdClass;
2160
		$class->User->Icon->id = 851;
2161
		$class->User->Profile = new stdClass;
2162
		$class->User->Profile->name = 'Some Name';
2163
		$class->User->Profile->address = 'Some Address';
2164
		$class->User->Comment = array();
2165
		$comment = new stdClass;
2166
		$comment->id = 1;
2167
		$comment->article_id = 1;
2168
		$comment->user_id = 1;
2169
		$comment->comment = 'First Comment for First Article';
2170
		$comment->published = 'Y';
2171
		$comment->created = '2007-03-18 10:47:23';
2172
		$comment->updated = '2007-03-18 10:49:31';
2173
		$comment2 = new stdClass;
2174
		$comment2->id = 2;
2175
		$comment2->article_id = 1;
2176
		$comment2->user_id = 2;
2177
		$comment2->comment = 'Second Comment for First Article';
2178
		$comment2->published = 'Y';
2179
		$comment2->created = '2007-03-18 10:47:23';
2180
		$comment2->updated = '2007-03-18 10:49:31';
2181
		// @codingStandardsIgnoreEnd
2182
		$class->User->Comment = array($comment, $comment2);
2183
		$result = Set::reverse($class);
2184
		$this->assertEquals($expected, $result);
2185
 
2186
		$class = new stdClass;
2187
		$class->User = new stdClass;
2188
		$class->User->id = 100;
2189
		$class->someString = 'this is some string';
2190
		$class->Profile = new stdClass;
2191
		$class->Profile->name = 'Joe Mamma';
2192
 
2193
		$result = Set::reverse($class);
2194
		$expected = array(
2195
			'User' => array('id' => '100'),
2196
			'someString' => 'this is some string',
2197
			'Profile' => array('name' => 'Joe Mamma')
2198
		);
2199
		$this->assertEquals($expected, $result);
2200
 
2201
		// @codingStandardsIgnoreStart
2202
		$class = new stdClass;
2203
		$class->User = new stdClass;
2204
		$class->User->id = 100;
2205
		$class->User->_name_ = 'User';
2206
		$class->Profile = new stdClass;
2207
		$class->Profile->name = 'Joe Mamma';
2208
		$class->Profile->_name_ = 'Profile';
2209
		// @codingStandardsIgnoreEnd
2210
 
2211
		$result = Set::reverse($class);
2212
		$expected = array('User' => array('id' => '100'), 'Profile' => array('name' => 'Joe Mamma'));
2213
		$this->assertEquals($expected, $result);
2214
	}
2215
 
2216
/**
2217
 * testFormatting method
2218
 *
2219
 * @return void
2220
 */
2221
	public function testFormatting() {
2222
		$data = array(
2223
			array('Person' => array('first_name' => 'Nate', 'last_name' => 'Abele', 'city' => 'Boston', 'state' => 'MA', 'something' => '42')),
2224
			array('Person' => array('first_name' => 'Larry', 'last_name' => 'Masters', 'city' => 'Boondock', 'state' => 'TN', 'something' => '{0}')),
2225
			array('Person' => array('first_name' => 'Garrett', 'last_name' => 'Woodworth', 'city' => 'Venice Beach', 'state' => 'CA', 'something' => '{1}')));
2226
 
2227
		$result = Set::format($data, '{1}, {0}', array('{n}.Person.first_name', '{n}.Person.last_name'));
2228
		$expected = array('Abele, Nate', 'Masters, Larry', 'Woodworth, Garrett');
2229
		$this->assertEquals($expected, $result);
2230
 
2231
		$result = Set::format($data, '{0}, {1}', array('{n}.Person.last_name', '{n}.Person.first_name'));
2232
		$this->assertEquals($expected, $result);
2233
 
2234
		$result = Set::format($data, '{0}, {1}', array('{n}.Person.city', '{n}.Person.state'));
2235
		$expected = array('Boston, MA', 'Boondock, TN', 'Venice Beach, CA');
2236
		$this->assertEquals($expected, $result);
2237
 
2238
		$result = Set::format($data, '{{0}, {1}}', array('{n}.Person.city', '{n}.Person.state'));
2239
		$expected = array('{Boston, MA}', '{Boondock, TN}', '{Venice Beach, CA}');
2240
		$this->assertEquals($expected, $result);
2241
 
2242
		$result = Set::format($data, '{{0}, {1}}', array('{n}.Person.something', '{n}.Person.something'));
2243
		$expected = array('{42, 42}', '{{0}, {0}}', '{{1}, {1}}');
2244
		$this->assertEquals($expected, $result);
2245
 
2246
		$result = Set::format($data, '{%2$d, %1$s}', array('{n}.Person.something', '{n}.Person.something'));
2247
		$expected = array('{42, 42}', '{0, {0}}', '{0, {1}}');
2248
		$this->assertEquals($expected, $result);
2249
 
2250
		$result = Set::format($data, '{%1$s, %1$s}', array('{n}.Person.something', '{n}.Person.something'));
2251
		$expected = array('{42, 42}', '{{0}, {0}}', '{{1}, {1}}');
2252
		$this->assertEquals($expected, $result);
2253
 
2254
		$result = Set::format($data, '%2$d, %1$s', array('{n}.Person.first_name', '{n}.Person.something'));
2255
		$expected = array('42, Nate', '0, Larry', '0, Garrett');
2256
		$this->assertEquals($expected, $result);
2257
 
2258
		$result = Set::format($data, '%1$s, %2$d', array('{n}.Person.first_name', '{n}.Person.something'));
2259
		$expected = array('Nate, 42', 'Larry, 0', 'Garrett, 0');
2260
		$this->assertEquals($expected, $result);
2261
	}
2262
 
2263
/**
2264
 * testFormattingNullValues method
2265
 *
2266
 * @return void
2267
 */
2268
	public function testFormattingNullValues() {
2269
		$data = array(
2270
			array('Person' => array('first_name' => 'Nate', 'last_name' => 'Abele', 'city' => 'Boston', 'state' => 'MA', 'something' => '42')),
2271
			array('Person' => array('first_name' => 'Larry', 'last_name' => 'Masters', 'city' => 'Boondock', 'state' => 'TN', 'something' => null)),
2272
			array('Person' => array('first_name' => 'Garrett', 'last_name' => 'Woodworth', 'city' => 'Venice Beach', 'state' => 'CA', 'something' => null)));
2273
 
2274
		$result = Set::format($data, '%s', array('{n}.Person.something'));
2275
		$expected = array('42', '', '');
2276
		$this->assertEquals($expected, $result);
2277
 
2278
		$result = Set::format($data, '{0}, {1}', array('{n}.Person.city', '{n}.Person.something'));
2279
		$expected = array('Boston, 42', 'Boondock, ', 'Venice Beach, ');
2280
		$this->assertEquals($expected, $result);
2281
	}
2282
 
2283
/**
2284
 * testCountDim method
2285
 *
2286
 * @return void
2287
 */
2288
	public function testCountDim() {
2289
		$data = array('one', '2', 'three');
2290
		$result = Set::countDim($data);
2291
		$this->assertEquals(1, $result);
2292
 
2293
		$data = array('1' => '1.1', '2', '3');
2294
		$result = Set::countDim($data);
2295
		$this->assertEquals(1, $result);
2296
 
2297
		$data = array('1' => array('1.1' => '1.1.1'), '2', '3' => array('3.1' => '3.1.1'));
2298
		$result = Set::countDim($data);
2299
		$this->assertEquals(2, $result);
2300
 
2301
		$data = array('1' => '1.1', '2', '3' => array('3.1' => '3.1.1'));
2302
		$result = Set::countDim($data);
2303
		$this->assertEquals(1, $result);
2304
 
2305
		$data = array('1' => '1.1', '2', '3' => array('3.1' => '3.1.1'));
2306
		$result = Set::countDim($data, true);
2307
		$this->assertEquals(2, $result);
2308
 
2309
		$data = array('1' => array('1.1' => '1.1.1'), '2', '3' => array('3.1' => array('3.1.1' => '3.1.1.1')));
2310
		$result = Set::countDim($data);
2311
		$this->assertEquals(2, $result);
2312
 
2313
		$data = array('1' => array('1.1' => '1.1.1'), '2', '3' => array('3.1' => array('3.1.1' => '3.1.1.1')));
2314
		$result = Set::countDim($data, true);
2315
		$this->assertEquals(3, $result);
2316
 
2317
		$data = array('1' => array('1.1' => '1.1.1'), array('2' => array('2.1' => array('2.1.1' => '2.1.1.1'))), '3' => array('3.1' => array('3.1.1' => '3.1.1.1')));
2318
		$result = Set::countDim($data, true);
2319
		$this->assertEquals(4, $result);
2320
 
2321
		$data = array('1' => array('1.1' => '1.1.1'), array('2' => array('2.1' => array('2.1.1' => array('2.1.1.1')))), '3' => array('3.1' => array('3.1.1' => '3.1.1.1')));
2322
		$result = Set::countDim($data, true);
2323
		$this->assertEquals(5, $result);
2324
 
2325
		$data = array('1' => array('1.1' => '1.1.1'), array('2' => array('2.1' => array('2.1.1' => array('2.1.1.1' => '2.1.1.1.1')))), '3' => array('3.1' => array('3.1.1' => '3.1.1.1')));
2326
		$result = Set::countDim($data, true);
2327
		$this->assertEquals(5, $result);
2328
 
2329
		$set = array('1' => array('1.1' => '1.1.1'), array('2' => array('2.1' => array('2.1.1' => array('2.1.1.1' => '2.1.1.1.1')))), '3' => array('3.1' => array('3.1.1' => '3.1.1.1')));
2330
		$result = Set::countDim($set, false, 0);
2331
		$this->assertEquals(2, $result);
2332
 
2333
		$result = Set::countDim($set, true);
2334
		$this->assertEquals(5, $result);
2335
	}
2336
 
2337
/**
2338
 * testMapNesting method
2339
 *
2340
 * @return void
2341
 */
2342
	public function testMapNesting() {
2343
		$expected = array(
2344
			array(
2345
				"IndexedPage" => array(
2346
					"id" => 1,
2347
					"url" => 'http://blah.com/',
2348
					'hash' => '68a9f053b19526d08e36c6a9ad150737933816a5',
2349
					'headers' => array(
2350
							'Date' => "Wed, 14 Nov 2007 15:51:42 GMT",
2351
							'Server' => "Apache",
2352
							'Expires' => "Thu, 19 Nov 1981 08:52:00 GMT",
2353
							'Cache-Control' => "private",
2354
							'Pragma' => "no-cache",
2355
							'Content-Type' => "text/html; charset=UTF-8",
2356
							'X-Original-Transfer-Encoding' => "chunked",
2357
							'Content-Length' => "50210",
2358
					),
2359
					'meta' => array(
2360
							'keywords' => array('testing', 'tests'),
2361
							'description' => 'describe me',
2362
					),
2363
					'get_vars' => '',
2364
					'post_vars' => array(),
2365
					'cookies' => array('PHPSESSID' => "dde9896ad24595998161ffaf9e0dbe2d"),
2366
					'redirect' => '',
2367
					'created' => "1195055503",
2368
					'updated' => "1195055503",
2369
				)
2370
			),
2371
			array(
2372
				"IndexedPage" => array(
2373
					"id" => 2,
2374
					"url" => 'http://blah.com/',
2375
					'hash' => '68a9f053b19526d08e36c6a9ad150737933816a5',
2376
					'headers' => array(
2377
						'Date' => "Wed, 14 Nov 2007 15:51:42 GMT",
2378
						'Server' => "Apache",
2379
						'Expires' => "Thu, 19 Nov 1981 08:52:00 GMT",
2380
						'Cache-Control' => "private",
2381
						'Pragma' => "no-cache",
2382
						'Content-Type' => "text/html; charset=UTF-8",
2383
						'X-Original-Transfer-Encoding' => "chunked",
2384
						'Content-Length' => "50210",
2385
					),
2386
					'meta' => array(
2387
							'keywords' => array('testing', 'tests'),
2388
							'description' => 'describe me',
2389
					),
2390
					'get_vars' => '',
2391
					'post_vars' => array(),
2392
					'cookies' => array('PHPSESSID' => "dde9896ad24595998161ffaf9e0dbe2d"),
2393
					'redirect' => '',
2394
					'created' => "1195055503",
2395
					'updated' => "1195055503",
2396
				),
2397
			)
2398
		);
2399
 
2400
		$mapped = Set::map($expected);
2401
		$ids = array();
2402
 
2403
		foreach ($mapped as $object) {
2404
			$ids[] = $object->id;
2405
		}
2406
		$this->assertEquals(array(1, 2), $ids);
2407
		$this->assertEquals($expected[0]['IndexedPage']['headers'], get_object_vars($mapped[0]->headers));
2408
 
2409
		$result = Set::reverse($mapped);
2410
		$this->assertEquals($expected, $result);
2411
 
2412
		$data = array(
2413
			array(
2414
				"IndexedPage" => array(
2415
					"id" => 1,
2416
					"url" => 'http://blah.com/',
2417
					'hash' => '68a9f053b19526d08e36c6a9ad150737933816a5',
2418
					'get_vars' => '',
2419
					'redirect' => '',
2420
					'created' => "1195055503",
2421
					'updated' => "1195055503",
2422
				)
2423
			),
2424
			array(
2425
				"IndexedPage" => array(
2426
					"id" => 2,
2427
					"url" => 'http://blah.com/',
2428
					'hash' => '68a9f053b19526d08e36c6a9ad150737933816a5',
2429
					'get_vars' => '',
2430
					'redirect' => '',
2431
					'created' => "1195055503",
2432
					'updated' => "1195055503",
2433
				),
2434
			)
2435
		);
2436
		$mapped = Set::map($data);
2437
 
2438
		// @codingStandardsIgnoreStart
2439
		$expected = new stdClass();
2440
		$expected->_name_ = 'IndexedPage';
2441
		$expected->id = 2;
2442
		$expected->url = 'http://blah.com/';
2443
		$expected->hash = '68a9f053b19526d08e36c6a9ad150737933816a5';
2444
		$expected->get_vars = '';
2445
		$expected->redirect = '';
2446
		$expected->created = '1195055503';
2447
		$expected->updated = '1195055503';
2448
		// @codingStandardsIgnoreEnd
2449
		$this->assertEquals($expected, $mapped[1]);
2450
 
2451
		$ids = array();
2452
 
2453
		foreach ($mapped as $object) {
2454
			$ids[] = $object->id;
2455
		}
2456
		$this->assertEquals(array(1, 2), $ids);
2457
 
2458
		$result = Set::map(null);
2459
		$expected = null;
2460
		$this->assertEquals($expected, $result);
2461
	}
2462
 
2463
/**
2464
 * testNestedMappedData method
2465
 *
2466
 * @return void
2467
 */
2468
	public function testNestedMappedData() {
2469
		$result = Set::map(array(
2470
				array(
2471
					'Post' => array('id' => '1', 'author_id' => '1', 'title' => 'First Post', 'body' => 'First Post Body', 'published' => 'Y', 'created' => '2007-03-18 10:39:23', 'updated' => '2007-03-18 10:41:31'),
2472
					'Author' => array('id' => '1', 'user' => 'mariano', 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31', 'test' => 'working'),
2473
				),
2474
				array(
2475
					'Post' => array('id' => '2', 'author_id' => '3', 'title' => 'Second Post', 'body' => 'Second Post Body', 'published' => 'Y', 'created' => '2007-03-18 10:41:23', 'updated' => '2007-03-18 10:43:31'),
2476
					'Author' => array('id' => '3', 'user' => 'larry', 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', 'created' => '2007-03-17 01:20:23', 'updated' => '2007-03-17 01:22:31', 'test' => 'working'),
2477
				)
2478
			));
2479
 
2480
		// @codingStandardsIgnoreStart
2481
		$expected = new stdClass;
2482
		$expected->_name_ = 'Post';
2483
		$expected->id = '1';
2484
		$expected->author_id = '1';
2485
		$expected->title = 'First Post';
2486
		$expected->body = 'First Post Body';
2487
		$expected->published = 'Y';
2488
		$expected->created = "2007-03-18 10:39:23";
2489
		$expected->updated = "2007-03-18 10:41:31";
2490
 
2491
		$expected->Author = new stdClass;
2492
		$expected->Author->id = '1';
2493
		$expected->Author->user = 'mariano';
2494
		$expected->Author->password = '5f4dcc3b5aa765d61d8327deb882cf99';
2495
		$expected->Author->created = '2007-03-17 01:16:23';
2496
		$expected->Author->updated = '2007-03-17 01:18:31';
2497
		$expected->Author->test = 'working';
2498
		$expected->Author->_name_ = 'Author';
2499
 
2500
		$expected2 = new stdClass;
2501
		$expected2->_name_ = 'Post';
2502
		$expected2->id = '2';
2503
		$expected2->author_id = '3';
2504
		$expected2->title = 'Second Post';
2505
		$expected2->body = 'Second Post Body';
2506
		$expected2->published = 'Y';
2507
		$expected2->created = "2007-03-18 10:41:23";
2508
		$expected2->updated = "2007-03-18 10:43:31";
2509
 
2510
		$expected2->Author = new stdClass;
2511
		$expected2->Author->id = '3';
2512
		$expected2->Author->user = 'larry';
2513
		$expected2->Author->password = '5f4dcc3b5aa765d61d8327deb882cf99';
2514
		$expected2->Author->created = '2007-03-17 01:20:23';
2515
		$expected2->Author->updated = '2007-03-17 01:22:31';
2516
		$expected2->Author->test = 'working';
2517
		$expected2->Author->_name_ = 'Author';
2518
		// @codingStandardsIgnoreEnd
2519
 
2520
		$test = array();
2521
		$test[0] = $expected;
2522
		$test[1] = $expected2;
2523
 
2524
		$this->assertEquals($test, $result);
2525
 
2526
		$result = Set::map(
2527
			array(
2528
				'Post' => array('id' => '1', 'author_id' => '1', 'title' => 'First Post', 'body' => 'First Post Body', 'published' => 'Y', 'created' => '2007-03-18 10:39:23', 'updated' => '2007-03-18 10:41:31'),
2529
				'Author' => array('id' => '1', 'user' => 'mariano', 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31', 'test' => 'working'),
2530
			)
2531
		);
2532
		// @codingStandardsIgnoreStart
2533
		$expected = new stdClass;
2534
		$expected->_name_ = 'Post';
2535
		$expected->id = '1';
2536
		$expected->author_id = '1';
2537
		$expected->title = 'First Post';
2538
		$expected->body = 'First Post Body';
2539
		$expected->published = 'Y';
2540
		$expected->created = "2007-03-18 10:39:23";
2541
		$expected->updated = "2007-03-18 10:41:31";
2542
 
2543
		$expected->Author = new stdClass;
2544
		$expected->Author->id = '1';
2545
		$expected->Author->user = 'mariano';
2546
		$expected->Author->password = '5f4dcc3b5aa765d61d8327deb882cf99';
2547
		$expected->Author->created = "2007-03-17 01:16:23";
2548
		$expected->Author->updated = "2007-03-17 01:18:31";
2549
		$expected->Author->test = 'working';
2550
		$expected->Author->_name_ = 'Author';
2551
		// @codingStandardsIgnoreEnd
2552
		$this->assertEquals($expected, $result);
2553
 
2554
		//Case where extra HABTM fields come back in a result
2555
		$data = array(
2556
			'User' => array(
2557
				'id' => 1,
2558
				'email' => 'user@example.com',
2559
				'first_name' => 'John',
2560
				'last_name' => 'Smith',
2561
			),
2562
			'Piece' => array(
2563
				array(
2564
					'id' => 1,
2565
					'title' => 'Moonlight Sonata',
2566
					'composer' => 'Ludwig van Beethoven',
2567
					'PiecesUser' => array(
2568
						'id' => 1,
2569
						'created' => '2008-01-01 00:00:00',
2570
						'modified' => '2008-01-01 00:00:00',
2571
						'piece_id' => 1,
2572
						'user_id' => 2,
2573
					)
2574
				),
2575
				array(
2576
					'id' => 2,
2577
					'title' => 'Moonlight Sonata 2',
2578
					'composer' => 'Ludwig van Beethoven',
2579
					'PiecesUser' => array(
2580
						'id' => 2,
2581
						'created' => '2008-01-01 00:00:00',
2582
						'modified' => '2008-01-01 00:00:00',
2583
						'piece_id' => 2,
2584
						'user_id' => 2,
2585
					)
2586
				)
2587
			)
2588
		);
2589
 
2590
		$result = Set::map($data);
2591
 
2592
		// @codingStandardsIgnoreStart
2593
		$expected = new stdClass();
2594
		$expected->_name_ = 'User';
2595
		$expected->id = 1;
2596
		$expected->email = 'user@example.com';
2597
		$expected->first_name = 'John';
2598
		$expected->last_name = 'Smith';
2599
 
2600
		$piece = new stdClass();
2601
		$piece->id = 1;
2602
		$piece->title = 'Moonlight Sonata';
2603
		$piece->composer = 'Ludwig van Beethoven';
2604
 
2605
		$piece->PiecesUser = new stdClass();
2606
		$piece->PiecesUser->id = 1;
2607
		$piece->PiecesUser->created = '2008-01-01 00:00:00';
2608
		$piece->PiecesUser->modified = '2008-01-01 00:00:00';
2609
		$piece->PiecesUser->piece_id = 1;
2610
		$piece->PiecesUser->user_id = 2;
2611
		$piece->PiecesUser->_name_ = 'PiecesUser';
2612
 
2613
		$piece->_name_ = 'Piece';
2614
 
2615
		$piece2 = new stdClass();
2616
		$piece2->id = 2;
2617
		$piece2->title = 'Moonlight Sonata 2';
2618
		$piece2->composer = 'Ludwig van Beethoven';
2619
 
2620
		$piece2->PiecesUser = new stdClass();
2621
		$piece2->PiecesUser->id = 2;
2622
		$piece2->PiecesUser->created = '2008-01-01 00:00:00';
2623
		$piece2->PiecesUser->modified = '2008-01-01 00:00:00';
2624
		$piece2->PiecesUser->piece_id = 2;
2625
		$piece2->PiecesUser->user_id = 2;
2626
		$piece2->PiecesUser->_name_ = 'PiecesUser';
2627
 
2628
		$piece2->_name_ = 'Piece';
2629
		// @codingStandardsIgnoreEnd
2630
 
2631
		$expected->Piece = array($piece, $piece2);
2632
 
2633
		$this->assertEquals($expected, $result);
2634
 
2635
		//Same data, but should work if _name_ has been manually defined:
2636
		$data = array(
2637
			'User' => array(
2638
				'id' => 1,
2639
				'email' => 'user@example.com',
2640
				'first_name' => 'John',
2641
				'last_name' => 'Smith',
2642
				'_name_' => 'FooUser',
2643
			),
2644
			'Piece' => array(
2645
				array(
2646
					'id' => 1,
2647
					'title' => 'Moonlight Sonata',
2648
					'composer' => 'Ludwig van Beethoven',
2649
					'_name_' => 'FooPiece',
2650
					'PiecesUser' => array(
2651
						'id' => 1,
2652
						'created' => '2008-01-01 00:00:00',
2653
						'modified' => '2008-01-01 00:00:00',
2654
						'piece_id' => 1,
2655
						'user_id' => 2,
2656
						'_name_' => 'FooPiecesUser',
2657
					)
2658
				),
2659
				array(
2660
					'id' => 2,
2661
					'title' => 'Moonlight Sonata 2',
2662
					'composer' => 'Ludwig van Beethoven',
2663
					'_name_' => 'FooPiece',
2664
					'PiecesUser' => array(
2665
						'id' => 2,
2666
						'created' => '2008-01-01 00:00:00',
2667
						'modified' => '2008-01-01 00:00:00',
2668
						'piece_id' => 2,
2669
						'user_id' => 2,
2670
						'_name_' => 'FooPiecesUser',
2671
					)
2672
				)
2673
			)
2674
		);
2675
 
2676
		$result = Set::map($data);
2677
 
2678
		// @codingStandardsIgnoreStart
2679
		$expected = new stdClass();
2680
		$expected->_name_ = 'FooUser';
2681
		$expected->id = 1;
2682
		$expected->email = 'user@example.com';
2683
		$expected->first_name = 'John';
2684
		$expected->last_name = 'Smith';
2685
 
2686
		$piece = new stdClass();
2687
		$piece->id = 1;
2688
		$piece->title = 'Moonlight Sonata';
2689
		$piece->composer = 'Ludwig van Beethoven';
2690
		$piece->_name_ = 'FooPiece';
2691
		$piece->PiecesUser = new stdClass();
2692
		$piece->PiecesUser->id = 1;
2693
		$piece->PiecesUser->created = '2008-01-01 00:00:00';
2694
		$piece->PiecesUser->modified = '2008-01-01 00:00:00';
2695
		$piece->PiecesUser->piece_id = 1;
2696
		$piece->PiecesUser->user_id = 2;
2697
		$piece->PiecesUser->_name_ = 'FooPiecesUser';
2698
 
2699
		$piece2 = new stdClass();
2700
		$piece2->id = 2;
2701
		$piece2->title = 'Moonlight Sonata 2';
2702
		$piece2->composer = 'Ludwig van Beethoven';
2703
		$piece2->_name_ = 'FooPiece';
2704
		$piece2->PiecesUser = new stdClass();
2705
		$piece2->PiecesUser->id = 2;
2706
		$piece2->PiecesUser->created = '2008-01-01 00:00:00';
2707
		$piece2->PiecesUser->modified = '2008-01-01 00:00:00';
2708
		$piece2->PiecesUser->piece_id = 2;
2709
		$piece2->PiecesUser->user_id = 2;
2710
		$piece2->PiecesUser->_name_ = 'FooPiecesUser';
2711
		// @codingStandardsIgnoreEnd
2712
 
2713
		$expected->Piece = array($piece, $piece2);
2714
 
2715
		$this->assertEquals($expected, $result);
2716
	}
2717
 
2718
/**
2719
 * testPushDiff method
2720
 *
2721
 * @return void
2722
 */
2723
	public function testPushDiff() {
2724
		$array1 = array('ModelOne' => array('id' => 1001, 'field_one' => 'a1.m1.f1', 'field_two' => 'a1.m1.f2'));
2725
		$array2 = array('ModelTwo' => array('id' => 1002, 'field_one' => 'a2.m2.f1', 'field_two' => 'a2.m2.f2'));
2726
 
2727
		$result = Set::pushDiff($array1, $array2);
2728
 
2729
		$this->assertEquals($array1 + $array2, $result);
2730
 
2731
		$array3 = array('ModelOne' => array('id' => 1003, 'field_one' => 'a3.m1.f1', 'field_two' => 'a3.m1.f2', 'field_three' => 'a3.m1.f3'));
2732
		$result = Set::pushDiff($array1, $array3);
2733
 
2734
		$expected = array('ModelOne' => array('id' => 1001, 'field_one' => 'a1.m1.f1', 'field_two' => 'a1.m1.f2', 'field_three' => 'a3.m1.f3'));
2735
		$this->assertEquals($expected, $result);
2736
 
2737
		$array1 = array(
2738
 
2739
				1 => array('ModelTwo' => array('id' => 1002, 'field_one' => 's1.1.m2.f2', 'field_two' => 's1.1.m2.f2')));
2740
		$array2 = array(
2741
 
2742
				1 => array('ModelTwo' => array('id' => 1002, 'field_one' => 's2.1.m2.f2', 'field_two' => 's2.1.m2.f2')));
2743
 
2744
		$result = Set::pushDiff($array1, $array2);
2745
		$this->assertEquals($array1, $result);
2746
 
2747
		$array3 = array(0 => array('ModelThree' => array('id' => 1003, 'field_one' => 's3.0.m3.f1', 'field_two' => 's3.0.m3.f2')));
2748
 
2749
		$result = Set::pushDiff($array1, $array3);
2750
		$expected = array(
2751
 
2752
						'ModelThree' => array('id' => 1003, 'field_one' => 's3.0.m3.f1', 'field_two' => 's3.0.m3.f2')),
2753
					1 => array('ModelTwo' => array('id' => 1002, 'field_one' => 's1.1.m2.f2', 'field_two' => 's1.1.m2.f2')));
2754
		$this->assertEquals($expected, $result);
2755
 
2756
		$result = Set::pushDiff($array1, null);
2757
		$this->assertEquals($array1, $result);
2758
 
2759
		$result = Set::pushDiff($array1, $array2);
2760
		$this->assertEquals($array1 + $array2, $result);
2761
	}
2762
 
2763
/**
2764
 * testSetApply method
2765
 * @return void
2766
 *
2767
 */
2768
	public function testApply() {
2769
		$data = array(
2770
			array('Movie' => array('id' => 1, 'title' => 'movie 3', 'rating' => 5)),
2771
			array('Movie' => array('id' => 1, 'title' => 'movie 1', 'rating' => 1)),
2772
			array('Movie' => array('id' => 1, 'title' => 'movie 2', 'rating' => 3))
2773
		);
2774
 
2775
		$result = Set::apply('/Movie/rating', $data, 'array_sum');
2776
		$expected = 9;
2777
		$this->assertEquals($expected, $result);
2778
 
2779
		$result = Set::apply('/Movie/rating', $data, 'array_product');
2780
		$expected = 15;
2781
		$this->assertEquals($expected, $result);
2782
 
2783
		$result = Set::apply('/Movie/title', $data, 'ucfirst', array('type' => 'map'));
2784
		$expected = array('Movie 3', 'Movie 1', 'Movie 2');
2785
		$this->assertEquals($expected, $result);
2786
 
2787
		$result = Set::apply('/Movie/title', $data, 'strtoupper', array('type' => 'map'));
2788
		$expected = array('MOVIE 3', 'MOVIE 1', 'MOVIE 2');
2789
		$this->assertEquals($expected, $result);
2790
 
2791
		$result = Set::apply('/Movie/rating', $data, array('SetTest', 'method'), array('type' => 'reduce'));
2792
		$expected = 9;
2793
		$this->assertEquals($expected, $result);
2794
 
2795
		$result = Set::apply('/Movie/rating', $data, 'strtoupper', array('type' => 'non existing type'));
2796
		$expected = null;
2797
		$this->assertEquals($expected, $result);
2798
	}
2799
 
2800
/**
2801
 * Helper method to test Set::apply()
2802
 *
2803
 * @return void
2804
 */
2805
	public static function method($val1, $val2) {
2806
		$val1 += $val2;
2807
		return $val1;
2808
	}
2809
 
2810
/**
2811
 * testXmlSetReverse method
2812
 *
2813
 * @return void
2814
 */
2815
	public function testXmlSetReverse() {
2816
		App::uses('Xml', 'Utility');
2817
 
2818
		$string = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2819
		<rss version="2.0">
2820
			<channel>
2821
			<title>Cake PHP Google Group</title>
2822
			<link>http://groups.google.com/group/cake-php</link>
2823
			<description>Search this group before posting anything. There are over 20,000 posts and it&amp;#39;s very likely your question was answered before. Visit the IRC channel #cakephp at irc.freenode.net for live chat with users and developers of Cake. If you post, tell us the version of Cake, PHP, and database.</description>
2824
			<language>en</language>
2825
				<item>
2826
				<title>constructng result array when using findall</title>
2827
				<link>http://groups.google.com/group/cake-php/msg/49bc00f3bc651b4f</link>
2828
				<description>i&#39;m using cakephp to construct a logical data model array that will be &lt;br&gt; passed to a flex app. I have the following model association: &lt;br&gt; ServiceDay-&amp;gt;(hasMany)ServiceTi me-&amp;gt;(hasMany)ServiceTimePrice. So what &lt;br&gt; the current output from my findall is something like this example: &lt;br&gt; &lt;p&gt;Array( &lt;br&gt; [0] =&amp;gt; Array(</description>
2829
				<guid isPermaLink="true">http://groups.google.com/group/cake-php/msg/49bc00f3bc651b4f</guid>
2830
				<author>bmil...@gmail.com(bpscrugs)</author>
2831
				<pubDate>Fri, 28 Dec 2007 00:44:14 UT</pubDate>
2832
				</item>
2833
				<item>
2834
				<title>Re: share views between actions?</title>
2835
				<link>http://groups.google.com/group/cake-php/msg/8b350d898707dad8</link>
2836
				<description>Then perhaps you might do us all a favour and refrain from replying to &lt;br&gt; things you do not understand. That goes especially for asinine comments. &lt;br&gt; Indeed. &lt;br&gt; To sum up: &lt;br&gt; No comment. &lt;br&gt; In my day, a simple &amp;quot;RTFM&amp;quot; would suffice. I&#39;ll keep in mind to ignore any &lt;br&gt; further responses from you. &lt;br&gt; You (and I) were referring to the *online documentation*, not other</description>
2837
				<guid isPermaLink="true">http://groups.google.com/group/cake-php/msg/8b350d898707dad8</guid>
2838
				<author>subtropolis.z...@gmail.com(subtropolis zijn)</author>
2839
				<pubDate>Fri, 28 Dec 2007 00:45:01 UT</pubDate>
2840
			 </item>
2841
		</channel>
2842
		</rss>';
2843
		$xml = Xml::build($string);
2844
		$result = Set::reverse($xml);
2845
		$expected = array('rss' => array(
2846
			'@version' => '2.0',
2847
			'channel' => array(
2848
				'title' => 'Cake PHP Google Group',
2849
				'link' => 'http://groups.google.com/group/cake-php',
2850
				'description' => 'Search this group before posting anything. There are over 20,000 posts and it&#39;s very likely your question was answered before. Visit the IRC channel #cakephp at irc.freenode.net for live chat with users and developers of Cake. If you post, tell us the version of Cake, PHP, and database.',
2851
				'language' => 'en',
2852
				'item' => array(
2853
					array(
2854
						'title' => 'constructng result array when using findall',
2855
						'link' => 'http://groups.google.com/group/cake-php/msg/49bc00f3bc651b4f',
2856
						'description' => "i'm using cakephp to construct a logical data model array that will be <br> passed to a flex app. I have the following model association: <br> ServiceDay-&gt;(hasMany)ServiceTi me-&gt;(hasMany)ServiceTimePrice. So what <br> the current output from my findall is something like this example: <br> <p>Array( <br> [0] =&gt; Array(",
2857
						'guid' => array('@isPermaLink' => 'true', '@' => 'http://groups.google.com/group/cake-php/msg/49bc00f3bc651b4f'),
2858
						'author' => 'bmil...@gmail.com(bpscrugs)',
2859
						'pubDate' => 'Fri, 28 Dec 2007 00:44:14 UT',
2860
					),
2861
					array(
2862
						'title' => 'Re: share views between actions?',
2863
						'link' => 'http://groups.google.com/group/cake-php/msg/8b350d898707dad8',
2864
						'description' => 'Then perhaps you might do us all a favour and refrain from replying to <br> things you do not understand. That goes especially for asinine comments. <br> Indeed. <br> To sum up: <br> No comment. <br> In my day, a simple &quot;RTFM&quot; would suffice. I\'ll keep in mind to ignore any <br> further responses from you. <br> You (and I) were referring to the *online documentation*, not other',
2865
						'guid' => array('@isPermaLink' => 'true', '@' => 'http://groups.google.com/group/cake-php/msg/8b350d898707dad8'),
2866
						'author' => 'subtropolis.z...@gmail.com(subtropolis zijn)',
2867
						'pubDate' => 'Fri, 28 Dec 2007 00:45:01 UT'
2868
					)
2869
				)
2870
			)
2871
		));
2872
		$this->assertEquals($expected, $result);
2873
		$string = '<data><post title="Title of this post" description="cool"/></data>';
2874
 
2875
		$xml = Xml::build($string);
2876
		$result = Set::reverse($xml);
2877
		$expected = array('data' => array('post' => array('@title' => 'Title of this post', '@description' => 'cool')));
2878
		$this->assertEquals($expected, $result);
2879
 
2880
		$xml = Xml::build('<example><item><title>An example of a correctly reversed SimpleXMLElement</title><desc/></item></example>');
2881
		$result = Set::reverse($xml);
2882
		$expected = array('example' =>
2883
			array(
2884
				'item' => array(
2885
					'title' => 'An example of a correctly reversed SimpleXMLElement',
2886
					'desc' => '',
2887
				)
2888
			)
2889
		);
2890
		$this->assertEquals($expected, $result);
2891
 
2892
		$xml = Xml::build('<example><item attr="123"><titles><title>title1</title><title>title2</title></titles></item></example>');
2893
		$result = Set::reverse($xml);
2894
		$expected =
2895
			array('example' => array(
2896
				'item' => array(
2897
					'@attr' => '123',
2898
					'titles' => array(
2899
						'title' => array('title1', 'title2')
2900
					)
2901
				)
2902
			)
2903
		);
2904
		$this->assertEquals($expected, $result);
2905
 
2906
		$xml = Xml::build('<example attr="ex_attr"><item attr="123"><titles>list</titles>textforitems</item></example>');
2907
		$result = Set::reverse($xml);
2908
		$expected =
2909
			array('example' => array(
2910
				'@attr' => 'ex_attr',
2911
				'item' => array(
2912
					'@attr' => '123',
2913
					'titles' => 'list',
2914
					'@' => 'textforitems'
2915
				)
2916
			)
2917
		);
2918
		$this->assertEquals($expected, $result);
2919
 
2920
		$string = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2921
		<rss version="2.0" xmlns:dc="http://www.cakephp.org/">
2922
			<channel>
2923
			<title>Cake PHP Google Group</title>
2924
			<link>http://groups.google.com/group/cake-php</link>
2925
			<description>Search this group before posting anything. There are over 20,000 posts and it&amp;#39;s very likely your question was answered before. Visit the IRC channel #cakephp at irc.freenode.net for live chat with users and developers of Cake. If you post, tell us the version of Cake, PHP, and database.</description>
2926
			<language>en</language>
2927
				<item>
2928
				<title>constructng result array when using findall</title>
2929
				<link>http://groups.google.com/group/cake-php/msg/49bc00f3bc651b4f</link>
2930
				<description>i&#39;m using cakephp to construct a logical data model array that will be &lt;br&gt; passed to a flex app. I have the following model association: &lt;br&gt; ServiceDay-&amp;gt;(hasMany)ServiceTi me-&amp;gt;(hasMany)ServiceTimePrice. So what &lt;br&gt; the current output from my findall is something like this example: &lt;br&gt; &lt;p&gt;Array( &lt;br&gt; [0] =&amp;gt; Array(</description>
2931
					<dc:creator>cakephp</dc:creator>
2932
				<category><![CDATA[cakephp]]></category>
2933
				<category><![CDATA[model]]></category>
2934
				<guid isPermaLink="true">http://groups.google.com/group/cake-php/msg/49bc00f3bc651b4f</guid>
2935
				<author>bmil...@gmail.com(bpscrugs)</author>
2936
				<pubDate>Fri, 28 Dec 2007 00:44:14 UT</pubDate>
2937
				</item>
2938
				<item>
2939
				<title>Re: share views between actions?</title>
2940
				<link>http://groups.google.com/group/cake-php/msg/8b350d898707dad8</link>
2941
				<description>Then perhaps you might do us all a favour and refrain from replying to &lt;br&gt; things you do not understand. That goes especially for asinine comments. &lt;br&gt; Indeed. &lt;br&gt; To sum up: &lt;br&gt; No comment. &lt;br&gt; In my day, a simple &amp;quot;RTFM&amp;quot; would suffice. I&#39;ll keep in mind to ignore any &lt;br&gt; further responses from you. &lt;br&gt; You (and I) were referring to the *online documentation*, not other</description>
2942
					<dc:creator>cakephp</dc:creator>
2943
				<category><![CDATA[cakephp]]></category>
2944
				<category><![CDATA[model]]></category>
2945
				<guid isPermaLink="true">http://groups.google.com/group/cake-php/msg/8b350d898707dad8</guid>
2946
				<author>subtropolis.z...@gmail.com(subtropolis zijn)</author>
2947
				<pubDate>Fri, 28 Dec 2007 00:45:01 UT</pubDate>
2948
			 </item>
2949
		</channel>
2950
		</rss>';
2951
 
2952
		$xml = Xml::build($string);
2953
		$result = Set::reverse($xml);
2954
 
2955
		$expected = array('rss' => array(
2956
			'@version' => '2.0',
2957
			'channel' => array(
2958
				'title' => 'Cake PHP Google Group',
2959
				'link' => 'http://groups.google.com/group/cake-php',
2960
				'description' => 'Search this group before posting anything. There are over 20,000 posts and it&#39;s very likely your question was answered before. Visit the IRC channel #cakephp at irc.freenode.net for live chat with users and developers of Cake. If you post, tell us the version of Cake, PHP, and database.',
2961
				'language' => 'en',
2962
				'item' => array(
2963
					array(
2964
						'title' => 'constructng result array when using findall',
2965
						'link' => 'http://groups.google.com/group/cake-php/msg/49bc00f3bc651b4f',
2966
						'description' => "i'm using cakephp to construct a logical data model array that will be <br> passed to a flex app. I have the following model association: <br> ServiceDay-&gt;(hasMany)ServiceTi me-&gt;(hasMany)ServiceTimePrice. So what <br> the current output from my findall is something like this example: <br> <p>Array( <br> [0] =&gt; Array(",
2967
						'dc:creator' => 'cakephp',
2968
						'category' => array('cakephp', 'model'),
2969
						'guid' => array('@isPermaLink' => 'true', '@' => 'http://groups.google.com/group/cake-php/msg/49bc00f3bc651b4f'),
2970
						'author' => 'bmil...@gmail.com(bpscrugs)',
2971
						'pubDate' => 'Fri, 28 Dec 2007 00:44:14 UT',
2972
					),
2973
					array(
2974
						'title' => 'Re: share views between actions?',
2975
						'link' => 'http://groups.google.com/group/cake-php/msg/8b350d898707dad8',
2976
						'description' => 'Then perhaps you might do us all a favour and refrain from replying to <br> things you do not understand. That goes especially for asinine comments. <br> Indeed. <br> To sum up: <br> No comment. <br> In my day, a simple &quot;RTFM&quot; would suffice. I\'ll keep in mind to ignore any <br> further responses from you. <br> You (and I) were referring to the *online documentation*, not other',
2977
						'dc:creator' => 'cakephp',
2978
						'category' => array('cakephp', 'model'),
2979
						'guid' => array('@isPermaLink' => 'true', '@' => 'http://groups.google.com/group/cake-php/msg/8b350d898707dad8'),
2980
						'author' => 'subtropolis.z...@gmail.com(subtropolis zijn)',
2981
						'pubDate' => 'Fri, 28 Dec 2007 00:45:01 UT'
2982
					)
2983
				)
2984
			)
2985
		));
2986
		$this->assertEquals($expected, $result);
2987
 
2988
		$text = '<?xml version="1.0" encoding="UTF-8"?>
2989
		<XRDS xmlns="xri://$xrds">
2990
		<XRD xml:id="oauth" xmlns="xri://$XRD*($v*2.0)" version="2.0">
2991
			<Type>xri://$xrds*simple</Type>
2992
			<Expires>2008-04-13T07:34:58Z</Expires>
2993
			<Service>
2994
				<Type>http://oauth.net/core/1.0/endpoint/authorize</Type>
2995
				<Type>http://oauth.net/core/1.0/parameters/auth-header</Type>
2996
				<Type>http://oauth.net/core/1.0/parameters/uri-query</Type>
2997
				<URI priority="10">https://ma.gnolia.com/oauth/authorize</URI>
2998
				<URI priority="20">http://ma.gnolia.com/oauth/authorize</URI>
2999
			</Service>
3000
		</XRD>
3001
		<XRD xmlns="xri://$XRD*($v*2.0)" version="2.0">
3002
			<Type>xri://$xrds*simple</Type>
3003
				<Service priority="10">
3004
					<Type>http://oauth.net/discovery/1.0</Type>
3005
					<URI>#oauth</URI>
3006
				</Service>
3007
		</XRD>
3008
		</XRDS>';
3009
 
3010
		$xml = Xml::build($text);
3011
		$result = Set::reverse($xml);
3012
 
3013
		$expected = array('XRDS' => array(
3014
			'XRD' => array(
3015
				array(
3016
					'@xml:id' => 'oauth',
3017
					'@version' => '2.0',
3018
					'Type' => 'xri://$xrds*simple',
3019
					'Expires' => '2008-04-13T07:34:58Z',
3020
					'Service' => array(
3021
						'Type' => array(
3022
							'http://oauth.net/core/1.0/endpoint/authorize',
3023
							'http://oauth.net/core/1.0/parameters/auth-header',
3024
							'http://oauth.net/core/1.0/parameters/uri-query'
3025
						),
3026
						'URI' => array(
3027
							array(
3028
								'@' => 'https://ma.gnolia.com/oauth/authorize',
3029
								'@priority' => '10',
3030
							),
3031
							array(
3032
								'@' => 'http://ma.gnolia.com/oauth/authorize',
3033
								'@priority' => '20'
3034
							)
3035
						)
3036
					)
3037
				),
3038
				array(
3039
					'@version' => '2.0',
3040
					'Type' => 'xri://$xrds*simple',
3041
					'Service' => array(
3042
						'@priority' => '10',
3043
						'Type' => 'http://oauth.net/discovery/1.0',
3044
						'URI' => '#oauth'
3045
					)
3046
				)
3047
			)
3048
		));
3049
		$this->assertEquals($expected, $result);
3050
	}
3051
 
3052
/**
3053
 * testStrictKeyCheck method
3054
 *
3055
 * @return void
3056
 */
3057
	public function testStrictKeyCheck() {
3058
		$set = array('a' => 'hi');
3059
		$this->assertFalse(Set::check($set, 'a.b'));
3060
	}
3061
 
3062
/**
3063
 * Tests Set::flatten
3064
 *
3065
 * @see Hash test cases, as Set::flatten() is just a proxy.
3066
 * @return void
3067
 */
3068
	public function testFlatten() {
3069
		$data = array('Larry', 'Curly', 'Moe');
3070
		$result = Set::flatten($data);
3071
		$this->assertEquals($data, $result);
3072
 
3073
		$data[9] = 'Shemp';
3074
		$result = Set::flatten($data);
3075
		$this->assertEquals($data, $result);
3076
 
3077
		$data = array(
3078
			array(
3079
				'Post' => array('id' => '1', 'author_id' => null, 'title' => 'First Post'),
3080
				'Author' => array(),
3081
			)
3082
		);
3083
		$result = Set::flatten($data);
3084
		$expected = array(
3085
			'0.Post.id' => '1',
3086
			'0.Post.author_id' => null,
3087
			'0.Post.title' => 'First Post',
3088
			'0.Author' => array()
3089
		);
3090
		$this->assertEquals($expected, $result);
3091
	}
3092
 
3093
/**
3094
 * Tests Set::expand
3095
 *
3096
 * @return void
3097
 */
3098
	public function testExpand() {
3099
		$data = array('My', 'Array', 'To', 'Flatten');
3100
		$flat = Set::flatten($data);
3101
		$result = Set::expand($flat);
3102
		$this->assertEquals($data, $result);
3103
	}
3104
 
3105
/**
3106
 * test normalization
3107
 *
3108
 * @return void
3109
 */
3110
	public function testNormalizeStrings() {
3111
		$result = Set::normalize('one,two,three');
3112
		$expected = array('one' => null, 'two' => null, 'three' => null);
3113
		$this->assertEquals($expected, $result);
3114
 
3115
		$result = Set::normalize('one two three', true, ' ');
3116
		$expected = array('one' => null, 'two' => null, 'three' => null);
3117
		$this->assertEquals($expected, $result);
3118
 
3119
		$result = Set::normalize('one  ,  two   ,  three   ', true, ',', true);
3120
		$expected = array('one' => null, 'two' => null, 'three' => null);
3121
		$this->assertEquals($expected, $result);
3122
	}
3123
 
3124
/**
3125
 * test normalizing arrays
3126
 *
3127
 * @return void
3128
 */
3129
	public function testNormalizeArrays() {
3130
		$result = Set::normalize(array('one', 'two', 'three'));
3131
		$expected = array('one' => null, 'two' => null, 'three' => null);
3132
		$this->assertEquals($expected, $result);
3133
 
3134
		$result = Set::normalize(array('one', 'two', 'three'), false);
3135
		$expected = array('one', 'two', 'three');
3136
		$this->assertEquals($expected, $result);
3137
 
3138
		$result = Set::normalize(array('one' => 1, 'two' => 2, 'three' => 3, 'four'), false);
3139
		$expected = array('one' => 1, 'two' => 2, 'three' => 3, 'four' => null);
3140
		$this->assertEquals($expected, $result);
3141
 
3142
		$result = Set::normalize(array('one' => 1, 'two' => 2, 'three' => 3, 'four'));
3143
		$expected = array('one' => 1, 'two' => 2, 'three' => 3, 'four' => null);
3144
		$this->assertEquals($expected, $result);
3145
 
3146
		$result = Set::normalize(array('one' => array('a', 'b', 'c' => 'cee'), 'two' => 2, 'three'));
3147
		$expected = array('one' => array('a', 'b', 'c' => 'cee'), 'two' => 2, 'three' => null);
3148
		$this->assertEquals($expected, $result);
3149
	}
3150
 
3151
/**
3152
 * test Set nest with a normal model result set. For kicks rely on Set nest detecting the key names
3153
 * automatically
3154
 *
3155
 * @return void
3156
 */
3157
	public function testNestModel() {
3158
		$input = array(
3159
			array(
3160
				'ModelName' => array(
3161
					'id' => 1,
3162
					'parent_id' => null
3163
				),
3164
			),
3165
			array(
3166
				'ModelName' => array(
3167
					'id' => 2,
3168
					'parent_id' => 1
3169
				),
3170
			),
3171
			array(
3172
				'ModelName' => array(
3173
					'id' => 3,
3174
					'parent_id' => 1
3175
				),
3176
			),
3177
			array(
3178
				'ModelName' => array(
3179
					'id' => 4,
3180
					'parent_id' => 1
3181
				),
3182
			),
3183
			array(
3184
				'ModelName' => array(
3185
					'id' => 5,
3186
					'parent_id' => 1
3187
				),
3188
			),
3189
			array(
3190
				'ModelName' => array(
3191
					'id' => 6,
3192
					'parent_id' => null
3193
				),
3194
			),
3195
			array(
3196
				'ModelName' => array(
3197
					'id' => 7,
3198
					'parent_id' => 6
3199
				),
3200
			),
3201
			array(
3202
				'ModelName' => array(
3203
					'id' => 8,
3204
					'parent_id' => 6
3205
				),
3206
			),
3207
			array(
3208
				'ModelName' => array(
3209
					'id' => 9,
3210
					'parent_id' => 6
3211
				),
3212
			),
3213
			array(
3214
				'ModelName' => array(
3215
					'id' => 10,
3216
					'parent_id' => 6
3217
				)
3218
			)
3219
		);
3220
		$expected = array(
3221
			array(
3222
				'ModelName' => array(
3223
					'id' => 1,
3224
					'parent_id' => null
3225
				),
3226
				'children' => array(
3227
					array(
3228
						'ModelName' => array(
3229
							'id' => 2,
3230
							'parent_id' => 1
3231
						),
3232
						'children' => array()
3233
					),
3234
					array(
3235
						'ModelName' => array(
3236
							'id' => 3,
3237
							'parent_id' => 1
3238
						),
3239
						'children' => array()
3240
					),
3241
					array(
3242
						'ModelName' => array(
3243
							'id' => 4,
3244
							'parent_id' => 1
3245
						),
3246
						'children' => array()
3247
					),
3248
					array(
3249
						'ModelName' => array(
3250
							'id' => 5,
3251
							'parent_id' => 1
3252
						),
3253
						'children' => array()
3254
					),
3255
 
3256
				)
3257
			),
3258
			array(
3259
				'ModelName' => array(
3260
					'id' => 6,
3261
					'parent_id' => null
3262
				),
3263
				'children' => array(
3264
					array(
3265
						'ModelName' => array(
3266
							'id' => 7,
3267
							'parent_id' => 6
3268
						),
3269
						'children' => array()
3270
					),
3271
					array(
3272
						'ModelName' => array(
3273
							'id' => 8,
3274
							'parent_id' => 6
3275
						),
3276
						'children' => array()
3277
					),
3278
					array(
3279
						'ModelName' => array(
3280
							'id' => 9,
3281
							'parent_id' => 6
3282
						),
3283
						'children' => array()
3284
					),
3285
					array(
3286
						'ModelName' => array(
3287
							'id' => 10,
3288
							'parent_id' => 6
3289
						),
3290
						'children' => array()
3291
					)
3292
				)
3293
			)
3294
		);
3295
		$result = Set::nest($input);
3296
		$this->assertEquals($expected, $result);
3297
	}
3298
 
3299
/**
3300
 * test Set nest with a normal model result set, and a nominated root id
3301
 *
3302
 * @return void
3303
 */
3304
	public function testNestModelExplicitRoot() {
3305
		$input = array(
3306
			array(
3307
				'ModelName' => array(
3308
					'id' => 1,
3309
					'parent_id' => null
3310
				),
3311
			),
3312
			array(
3313
				'ModelName' => array(
3314
					'id' => 2,
3315
					'parent_id' => 1
3316
				),
3317
			),
3318
			array(
3319
				'ModelName' => array(
3320
					'id' => 3,
3321
					'parent_id' => 1
3322
				),
3323
			),
3324
			array(
3325
				'ModelName' => array(
3326
					'id' => 4,
3327
					'parent_id' => 1
3328
				),
3329
			),
3330
			array(
3331
				'ModelName' => array(
3332
					'id' => 5,
3333
					'parent_id' => 1
3334
				),
3335
			),
3336
			array(
3337
				'ModelName' => array(
3338
					'id' => 6,
3339
					'parent_id' => null
3340
				),
3341
			),
3342
			array(
3343
				'ModelName' => array(
3344
					'id' => 7,
3345
					'parent_id' => 6
3346
				),
3347
			),
3348
			array(
3349
				'ModelName' => array(
3350
					'id' => 8,
3351
					'parent_id' => 6
3352
				),
3353
			),
3354
			array(
3355
				'ModelName' => array(
3356
					'id' => 9,
3357
					'parent_id' => 6
3358
				),
3359
			),
3360
			array(
3361
				'ModelName' => array(
3362
					'id' => 10,
3363
					'parent_id' => 6
3364
				)
3365
			)
3366
		);
3367
		$expected = array(
3368
			array(
3369
				'ModelName' => array(
3370
					'id' => 6,
3371
					'parent_id' => null
3372
				),
3373
				'children' => array(
3374
					array(
3375
						'ModelName' => array(
3376
							'id' => 7,
3377
							'parent_id' => 6
3378
						),
3379
						'children' => array()
3380
					),
3381
					array(
3382
						'ModelName' => array(
3383
							'id' => 8,
3384
							'parent_id' => 6
3385
						),
3386
						'children' => array()
3387
					),
3388
					array(
3389
						'ModelName' => array(
3390
							'id' => 9,
3391
							'parent_id' => 6
3392
						),
3393
						'children' => array()
3394
					),
3395
					array(
3396
						'ModelName' => array(
3397
							'id' => 10,
3398
							'parent_id' => 6
3399
						),
3400
						'children' => array()
3401
					)
3402
				)
3403
			)
3404
		);
3405
		$result = Set::nest($input, array('root' => 6));
3406
		$this->assertEquals($expected, $result);
3407
	}
3408
 
3409
/**
3410
 * test Set nest with a 1d array - this method should be able to handle any type of array input
3411
 *
3412
 * @return void
3413
 */
3414
	public function testNest1Dimensional() {
3415
		$input = array(
3416
			array(
3417
				'id' => 1,
3418
				'parent_id' => null
3419
			),
3420
			array(
3421
				'id' => 2,
3422
				'parent_id' => 1
3423
			),
3424
			array(
3425
				'id' => 3,
3426
				'parent_id' => 1
3427
			),
3428
			array(
3429
				'id' => 4,
3430
				'parent_id' => 1
3431
			),
3432
			array(
3433
				'id' => 5,
3434
				'parent_id' => 1
3435
			),
3436
			array(
3437
				'id' => 6,
3438
				'parent_id' => null
3439
			),
3440
			array(
3441
				'id' => 7,
3442
				'parent_id' => 6
3443
			),
3444
			array(
3445
				'id' => 8,
3446
				'parent_id' => 6
3447
			),
3448
			array(
3449
				'id' => 9,
3450
				'parent_id' => 6
3451
			),
3452
			array(
3453
				'id' => 10,
3454
				'parent_id' => 6
3455
			)
3456
		);
3457
		$expected = array(
3458
			array(
3459
				'id' => 1,
3460
				'parent_id' => null,
3461
				'children' => array(
3462
					array(
3463
						'id' => 2,
3464
						'parent_id' => 1,
3465
						'children' => array()
3466
					),
3467
					array(
3468
						'id' => 3,
3469
						'parent_id' => 1,
3470
						'children' => array()
3471
					),
3472
					array(
3473
						'id' => 4,
3474
						'parent_id' => 1,
3475
						'children' => array()
3476
					),
3477
					array(
3478
						'id' => 5,
3479
						'parent_id' => 1,
3480
						'children' => array()
3481
					),
3482
 
3483
				)
3484
			),
3485
			array(
3486
				'id' => 6,
3487
				'parent_id' => null,
3488
				'children' => array(
3489
					array(
3490
						'id' => 7,
3491
						'parent_id' => 6,
3492
						'children' => array()
3493
					),
3494
					array(
3495
						'id' => 8,
3496
						'parent_id' => 6,
3497
						'children' => array()
3498
					),
3499
					array(
3500
						'id' => 9,
3501
						'parent_id' => 6,
3502
						'children' => array()
3503
					),
3504
					array(
3505
						'id' => 10,
3506
						'parent_id' => 6,
3507
						'children' => array()
3508
					)
3509
				)
3510
			)
3511
		);
3512
		$result = Set::nest($input, array('idPath' => '/id', 'parentPath' => '/parent_id'));
3513
		$this->assertEquals($expected, $result);
3514
	}
3515
 
3516
/**
3517
 * test Set nest with no specified parent data.
3518
 *
3519
 * The result should be the same as the input.
3520
 * For an easier comparison, unset all the empty children arrays from the result
3521
 *
3522
 * @return void
3523
 */
3524
	public function testMissingParent() {
3525
		$input = array(
3526
			array(
3527
				'id' => 1,
3528
			),
3529
			array(
3530
				'id' => 2,
3531
			),
3532
			array(
3533
				'id' => 3,
3534
			),
3535
			array(
3536
				'id' => 4,
3537
			),
3538
			array(
3539
				'id' => 5,
3540
			),
3541
			array(
3542
				'id' => 6,
3543
			),
3544
			array(
3545
				'id' => 7,
3546
			),
3547
			array(
3548
				'id' => 8,
3549
			),
3550
			array(
3551
				'id' => 9,
3552
			),
3553
			array(
3554
				'id' => 10,
3555
			)
3556
		);
3557
 
3558
		$result = Set::nest($input, array('idPath' => '/id', 'parentPath' => '/parent_id'));
3559
		foreach ($result as &$row) {
3560
			if (empty($row['children'])) {
3561
				unset($row['children']);
3562
			}
3563
		}
3564
		$this->assertEquals($input, $result);
3565
	}
3566
}