1<?php
2
3/**
4 * Hoa
5 *
6 *
7 * @license
8 *
9 * New BSD License
10 *
11 * Copyright © 2007-2017, Hoa community. All rights reserved.
12 *
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions are met:
15 *     * Redistributions of source code must retain the above copyright
16 *       notice, this list of conditions and the following disclaimer.
17 *     * Redistributions in binary form must reproduce the above copyright
18 *       notice, this list of conditions and the following disclaimer in the
19 *       documentation and/or other materials provided with the distribution.
20 *     * Neither the name of the Hoa nor the names of its contributors may be
21 *       used to endorse or promote products derived from this software without
22 *       specific prior written permission.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE
28 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34 * POSSIBILITY OF SUCH DAMAGE.
35 */
36
37namespace Hoa\Iterator\Test\Unit;
38
39use Hoa\Iterator as LUT;
40use Hoa\Test;
41
42/**
43 * Class \Hoa\Iterator\Test\Unit\IteratorIterator.
44 *
45 * Test suite of the iterator iterator iterator (;-)).
46 *
47 * @copyright  Copyright © 2007-2017 Hoa community
48 * @license    New BSD License
49 */
50class IteratorIterator extends Test\Unit\Suite
51{
52    public function case_inner_iterator()
53    {
54        $this
55            ->given(
56                $iterator         = new LUT\Map([]),
57                $iteratoriterator = new LUT\IteratorIterator($iterator)
58            )
59            ->when($result = $iteratoriterator->getInnerIterator())
60            ->then
61                ->object($result)
62                    ->isIdenticalTo($iterator);
63    }
64
65    public function case_traverse()
66    {
67        $this
68            ->given(
69                $iterator         = new LUT\Map(['a', 'b', 'c']),
70                $iteratoriterator = new LUT\IteratorIterator($iterator)
71            )
72            ->when($result = iterator_to_array($iteratoriterator))
73            ->then
74                ->array($result)
75                    ->isEqualTo(['a', 'b', 'c']);
76    }
77
78    public function case_recursive_leaves_only()
79    {
80        $this
81            ->given(
82                $array = [
83                    'a' => ['b', 'c', 'd'],
84                    'e' => ['f', 'g', 'i']
85                ],
86                $iterator         = new LUT\Recursive\Map($array),
87                $iteratoriterator = new LUT\Recursive\Iterator(
88                    $iterator,
89                    LUT\Recursive\Iterator::LEAVES_ONLY
90                )
91            )
92            ->when($result = iterator_to_array($iteratoriterator, false))
93            ->then
94                ->array($result)
95                    ->isEqualTo(['b', 'c', 'd', 'f', 'g', 'i']);
96    }
97
98    public function case_recursive_self_first()
99    {
100        $this
101            ->given(
102                $array = [
103                    'a' => ['b', 'c', 'd'],
104                    'e' => ['f', 'g', 'i']
105                ],
106                $iterator         = new LUT\Recursive\Map($array),
107                $iteratoriterator = new LUT\Recursive\Iterator(
108                    $iterator,
109                    LUT\Recursive\Iterator::SELF_FIRST
110                )
111            )
112            ->when($result = iterator_to_array($iteratoriterator, false))
113            ->then
114                ->array($result)
115                    ->isEqualTo([
116                        ['b', 'c', 'd'],
117                        'b',
118                        'c',
119                        'd',
120                        ['f', 'g', 'i'],
121                        'f',
122                        'g',
123                        'i'
124                    ]);
125    }
126
127    public function case_recursive_child_first()
128    {
129        $this
130            ->given(
131                $array = [
132                    'a' => ['b', 'c', 'd'],
133                    'e' => ['f', 'g', 'i']
134                ],
135                $iterator         = new LUT\Recursive\Map($array),
136                $iteratoriterator = new LUT\Recursive\Iterator(
137                    $iterator,
138                    LUT\Recursive\Iterator::CHILD_FIRST
139                )
140            )
141            ->when($result = iterator_to_array($iteratoriterator, false))
142            ->then
143                ->array($result)
144                    ->isEqualTo([
145                        'b',
146                        'c',
147                        'd',
148                        ['b', 'c', 'd'],
149                        'f',
150                        'g',
151                        'i',
152                        ['f', 'g', 'i']
153                    ]);
154    }
155}
156