1--TEST--
2Test key(), current(), next() & reset() functions
3--FILE--
4<?php
5/* Prototype & Usage:
6   mixed key ( array &$array ) -> returns the index element of the current array position
7   mixed current ( array &$array ) -> returns the current element in the array
8   mixed next ( array &$array ) -> similar to current() but advances the internal pointer to next element
9   mixed reset ( array &$array ) -> Reset the internal pointer to first element
10*/
11
12$basic_arrays = array (
13  array(0),  // array with element as 0
14  array(1),  // array with single element
15  array(1,2, 3, -1, -2, -3),               // array of integers
16  array(1.1, 2.2, 3.3, -1.1, -2.2, -3.3),  // array of floats
17  array('a', 'b', 'c', "ab", "ac", "ad"),  // string array
18  array("a" => "apple", "b" => "book", "c" => "cook"),  // associative array
19  array('d' => 'drink', 'p' => 'port', 's' => 'set'),   // another associative array
20  array(1 => 'One', 2 => 'two', 3 => "three")           // associative array with key as integers
21);
22
23$varient_arrays = array (
24   array(),    // empty array
25   array(""),  // array with null string
26   array(NULL),// array with NULL
27   array(null),// array with null
28   array(NULL, true, null, "", 1), // mixed array
29   array(-1.5 => "test", -2 => "rest", 2.5 => "two",
30         "" => "string", 0 => "zero", "" => "" ) // mixed array
31);
32
33echo "*** Testing basic operations ***\n";
34$loop_count = 1;
35foreach ($basic_arrays as $sub_array )  {
36  echo "-- Iteration $loop_count --\n";
37  $loop_count++;
38  $c = count ($sub_array);
39  $c++; // increment by one to create the situation of accessing beyond array size
40  while ( $c ) {
41    var_dump( current($sub_array)); // current element
42    var_dump( key($sub_array) );    // key of the current element
43    var_dump( next($sub_array) );   // move to next element
44    $c --;
45  }
46  var_dump( reset($sub_array) );    // reset the internal pointer to first element
47  var_dump( key($sub_array) );      // access the array after reset
48  var_dump( $sub_array );           // dump the array to see that its intact
49
50  echo "\n";
51}
52
53echo "\n*** Testing possible variations ***\n";
54$loop_count = 1;
55foreach ($varient_arrays as $sub_array )  {
56  echo "-- Iteration $loop_count --\n";
57  $loop_count++;
58  $c = count ($sub_array);
59  $c++; // increment by one to create the situation of accessing beyond array size
60  while ( $c ) {
61    var_dump( current($sub_array)); // current element
62    var_dump( key($sub_array) );    // key of the current element
63    var_dump( next($sub_array) );   // move to next element
64    $c --;
65  }
66  var_dump( reset($sub_array) );    // reset the internal pointer to first element
67  var_dump( key($sub_array) );      // access the array after reset
68  var_dump( $sub_array );           // dump the array to see that its intact
69  echo "\n";
70}
71
72/*test these functions on array which is already unset */
73echo "\n-- Testing variation: when array is unset --\n";
74$unset_array = array (1);
75unset($unset_array);
76
77var_dump( current($unset_array) );
78var_dump( key($unset_array) );
79var_dump( next($unset_array) );
80var_dump( reset($unset_array) );
81
82
83echo "\n*** Testing error conditions ***\n";
84//Zero argument, expected 1 argument
85var_dump( key() );
86var_dump( current() );
87var_dump( reset() );
88var_dump( next() );
89
90// args more than expected, expected 1 argument
91$temp_array = array(1);
92var_dump( key($temp_array, $temp_array) );
93var_dump( current($temp_array, $temp_array) );
94var_dump( reset($temp_array, $temp_array) );
95var_dump( next($temp_array, $temp_array) );
96
97// invalid args type, valid argument: array
98$int_var = 1;
99$float_var = 1.5;
100$string = "string";
101var_dump( key($int_var) );
102var_dump( key($float_var) );
103var_dump( key($string) );
104
105var_dump( current($int_var) );
106var_dump( current($float_var) );
107var_dump( current($string) );
108
109var_dump( next($int_var) );
110var_dump( next($float_var) );
111var_dump( next($string) );
112
113var_dump( reset($int_var) );
114var_dump( reset($float_var) );
115var_dump( reset($string) );
116
117echo "Done\n";
118?>
119--EXPECTF--
120*** Testing basic operations ***
121-- Iteration 1 --
122int(0)
123int(0)
124bool(false)
125bool(false)
126NULL
127bool(false)
128int(0)
129int(0)
130array(1) {
131  [0]=>
132  int(0)
133}
134
135-- Iteration 2 --
136int(1)
137int(0)
138bool(false)
139bool(false)
140NULL
141bool(false)
142int(1)
143int(0)
144array(1) {
145  [0]=>
146  int(1)
147}
148
149-- Iteration 3 --
150int(1)
151int(0)
152int(2)
153int(2)
154int(1)
155int(3)
156int(3)
157int(2)
158int(-1)
159int(-1)
160int(3)
161int(-2)
162int(-2)
163int(4)
164int(-3)
165int(-3)
166int(5)
167bool(false)
168bool(false)
169NULL
170bool(false)
171int(1)
172int(0)
173array(6) {
174  [0]=>
175  int(1)
176  [1]=>
177  int(2)
178  [2]=>
179  int(3)
180  [3]=>
181  int(-1)
182  [4]=>
183  int(-2)
184  [5]=>
185  int(-3)
186}
187
188-- Iteration 4 --
189float(1.1)
190int(0)
191float(2.2)
192float(2.2)
193int(1)
194float(3.3)
195float(3.3)
196int(2)
197float(-1.1)
198float(-1.1)
199int(3)
200float(-2.2)
201float(-2.2)
202int(4)
203float(-3.3)
204float(-3.3)
205int(5)
206bool(false)
207bool(false)
208NULL
209bool(false)
210float(1.1)
211int(0)
212array(6) {
213  [0]=>
214  float(1.1)
215  [1]=>
216  float(2.2)
217  [2]=>
218  float(3.3)
219  [3]=>
220  float(-1.1)
221  [4]=>
222  float(-2.2)
223  [5]=>
224  float(-3.3)
225}
226
227-- Iteration 5 --
228string(1) "a"
229int(0)
230string(1) "b"
231string(1) "b"
232int(1)
233string(1) "c"
234string(1) "c"
235int(2)
236string(2) "ab"
237string(2) "ab"
238int(3)
239string(2) "ac"
240string(2) "ac"
241int(4)
242string(2) "ad"
243string(2) "ad"
244int(5)
245bool(false)
246bool(false)
247NULL
248bool(false)
249string(1) "a"
250int(0)
251array(6) {
252  [0]=>
253  string(1) "a"
254  [1]=>
255  string(1) "b"
256  [2]=>
257  string(1) "c"
258  [3]=>
259  string(2) "ab"
260  [4]=>
261  string(2) "ac"
262  [5]=>
263  string(2) "ad"
264}
265
266-- Iteration 6 --
267string(5) "apple"
268string(1) "a"
269string(4) "book"
270string(4) "book"
271string(1) "b"
272string(4) "cook"
273string(4) "cook"
274string(1) "c"
275bool(false)
276bool(false)
277NULL
278bool(false)
279string(5) "apple"
280string(1) "a"
281array(3) {
282  ["a"]=>
283  string(5) "apple"
284  ["b"]=>
285  string(4) "book"
286  ["c"]=>
287  string(4) "cook"
288}
289
290-- Iteration 7 --
291string(5) "drink"
292string(1) "d"
293string(4) "port"
294string(4) "port"
295string(1) "p"
296string(3) "set"
297string(3) "set"
298string(1) "s"
299bool(false)
300bool(false)
301NULL
302bool(false)
303string(5) "drink"
304string(1) "d"
305array(3) {
306  ["d"]=>
307  string(5) "drink"
308  ["p"]=>
309  string(4) "port"
310  ["s"]=>
311  string(3) "set"
312}
313
314-- Iteration 8 --
315string(3) "One"
316int(1)
317string(3) "two"
318string(3) "two"
319int(2)
320string(5) "three"
321string(5) "three"
322int(3)
323bool(false)
324bool(false)
325NULL
326bool(false)
327string(3) "One"
328int(1)
329array(3) {
330  [1]=>
331  string(3) "One"
332  [2]=>
333  string(3) "two"
334  [3]=>
335  string(5) "three"
336}
337
338
339*** Testing possible variations ***
340-- Iteration 1 --
341bool(false)
342NULL
343bool(false)
344bool(false)
345NULL
346array(0) {
347}
348
349-- Iteration 2 --
350string(0) ""
351int(0)
352bool(false)
353bool(false)
354NULL
355bool(false)
356string(0) ""
357int(0)
358array(1) {
359  [0]=>
360  string(0) ""
361}
362
363-- Iteration 3 --
364NULL
365int(0)
366bool(false)
367bool(false)
368NULL
369bool(false)
370NULL
371int(0)
372array(1) {
373  [0]=>
374  NULL
375}
376
377-- Iteration 4 --
378NULL
379int(0)
380bool(false)
381bool(false)
382NULL
383bool(false)
384NULL
385int(0)
386array(1) {
387  [0]=>
388  NULL
389}
390
391-- Iteration 5 --
392NULL
393int(0)
394bool(true)
395bool(true)
396int(1)
397NULL
398NULL
399int(2)
400string(0) ""
401string(0) ""
402int(3)
403int(1)
404int(1)
405int(4)
406bool(false)
407bool(false)
408NULL
409bool(false)
410NULL
411int(0)
412array(5) {
413  [0]=>
414  NULL
415  [1]=>
416  bool(true)
417  [2]=>
418  NULL
419  [3]=>
420  string(0) ""
421  [4]=>
422  int(1)
423}
424
425-- Iteration 6 --
426string(4) "test"
427int(-1)
428string(4) "rest"
429string(4) "rest"
430int(-2)
431string(3) "two"
432string(3) "two"
433int(2)
434string(0) ""
435string(0) ""
436string(0) ""
437string(4) "zero"
438string(4) "zero"
439int(0)
440bool(false)
441bool(false)
442NULL
443bool(false)
444string(4) "test"
445int(-1)
446array(5) {
447  [-1]=>
448  string(4) "test"
449  [-2]=>
450  string(4) "rest"
451  [2]=>
452  string(3) "two"
453  [""]=>
454  string(0) ""
455  [0]=>
456  string(4) "zero"
457}
458
459
460-- Testing variation: when array is unset --
461
462Notice: Undefined variable: unset_array in %s on line %d
463
464Warning: current() expects parameter 1 to be array, null given in %s on line %d
465NULL
466
467Notice: Undefined variable: unset_array in %s on line %d
468
469Warning: key() expects parameter 1 to be array, null given in %s on line %d
470NULL
471
472Warning: next() expects parameter 1 to be array, null given in %s on line %d
473NULL
474
475Warning: reset() expects parameter 1 to be array, null given in %s on line %d
476NULL
477
478*** Testing error conditions ***
479
480Warning: key() expects exactly 1 parameter, 0 given in %s on line %d
481NULL
482
483Warning: current() expects exactly 1 parameter, 0 given in %s on line %d
484NULL
485
486Warning: reset() expects exactly 1 parameter, 0 given in %s on line %d
487NULL
488
489Warning: next() expects exactly 1 parameter, 0 given in %s on line %d
490NULL
491
492Warning: key() expects exactly 1 parameter, 2 given in %s on line %d
493NULL
494
495Warning: current() expects exactly 1 parameter, 2 given in %s on line %d
496NULL
497
498Warning: reset() expects exactly 1 parameter, 2 given in %s on line %d
499NULL
500
501Warning: next() expects exactly 1 parameter, 2 given in %s on line %d
502NULL
503
504Warning: key() expects parameter 1 to be array, int given in %s on line %d
505NULL
506
507Warning: key() expects parameter 1 to be array, float given in %s on line %d
508NULL
509
510Warning: key() expects parameter 1 to be array, string given in %s on line %d
511NULL
512
513Warning: current() expects parameter 1 to be array, int given in %s on line %d
514NULL
515
516Warning: current() expects parameter 1 to be array, float given in %s on line %d
517NULL
518
519Warning: current() expects parameter 1 to be array, string given in %s on line %d
520NULL
521
522Warning: next() expects parameter 1 to be array, int given in %s on line %d
523NULL
524
525Warning: next() expects parameter 1 to be array, float given in %s on line %d
526NULL
527
528Warning: next() expects parameter 1 to be array, string given in %s on line %d
529NULL
530
531Warning: reset() expects parameter 1 to be array, int given in %s on line %d
532NULL
533
534Warning: reset() expects parameter 1 to be array, float given in %s on line %d
535NULL
536
537Warning: reset() expects parameter 1 to be array, string given in %s on line %d
538NULL
539Done
540