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 
37 namespace Hoa\Protocol\Test\Unit\Node;
38 
39 use Hoa\Protocol as LUT;
40 use Hoa\Protocol\Node\Node as SUT;
41 use Hoa\Test;
42 
43 /**
44  * Class \Hoa\Protocol\Test\Unit\Node\Node.
45  *
46  * Test suite of the node class.
47  *
48  * @copyright  Copyright © 2007-2017 Hoa community
49  * @license    New BSD License
50  */
51 class Node extends Test\Unit\Suite
52 {
53     public function case_implements()
54     {
55         $this
56             ->when($result = new SUT())
57             ->then
58                 ->object($result)
59                     ->isInstanceOf('ArrayAccess')
60                     ->isInstanceOf('IteratorAggregate');
61     }
62 
63     public function case_empty_constructor()
64     {
65         $this
66             ->when($result = new SUT())
67             ->then
68                 ->variable($result->getName())
69                     ->isNull()
70                 ->array(iterator_to_array($result->getIterator()))
71                     ->isEmpty();
72     }
73 
74     public function case_constructor_with_a_name()
75     {
76         $this
77             ->given($name = 'foo')
78             ->when($result = new SUT($name))
79             ->then
80                 ->string($result->getName())
81                     ->isEqualTo($name)
82                 ->array(iterator_to_array($result->getIterator()))
83                     ->isEmpty();
84     }
85 
86     public function case_constructor_with_a_name_and_children()
87     {
88         $this
89             ->given(
90                 $name     = 'foo',
91                 $children = [new SUT('bar'), new SUT('baz')]
92             )
93             ->when($result = new SUT($name, '', $children))
94             ->then
95                 ->string($result->getName())
96                     ->isEqualTo($name)
97                 ->array(iterator_to_array($result->getIterator()))
98                     ->hasSize(2);
99     }
100 
101     public function case_offset_set()
102     {
103         $this
104             ->given(
105                 $root             = new SUT(),
106                 $name             = 'foo',
107                 $node             = new SUT(),
108                 $oldCountChildren = count(iterator_to_array($root->getIterator()))
109             )
110             ->when($result = $root->offsetSet($name, $node))
111             ->then
112                 ->integer(count(iterator_to_array($root->getIterator())))
113                     ->isEqualTo($oldCountChildren + 1)
114                 ->object($root[$name])
115                     ->isIdenticalTo($node);
116     }
117 
118     public function case_offset_set_not_a_node()
119     {
120         $this
121             ->given($root = new SUT())
122             ->exception(function () use ($root) {
123                 $root->offsetSet('foo', null);
124             })
125                 ->isInstanceOf('Hoa\Protocol\Exception');
126     }
127 
128     public function case_offset_set_no_name()
129     {
130         $this
131             ->given($root = new SUT())
132             ->exception(function () use ($root) {
133                 $root->offsetSet(null, new SUT());
134             })
135                 ->isInstanceOf('Hoa\Protocol\Exception');
136     }
137 
138     public function case_offset_get()
139     {
140         $this
141             ->given(
142                 $root        = new SUT(),
143                 $child       = new SUT(),
144                 $root['foo'] = $child
145             )
146             ->when($result = $root->offsetGet('foo'))
147             ->then
148             ->object($result)
149                 ->isIdenticalTo($child);
150     }
151 
152     public function case_offset_get_an_unknown_name()
153     {
154         $this
155             ->given($root = new SUT())
156             ->exception(function () use ($root) {
157                 $root->offsetGet('foo');
158             })
159                 ->isInstanceOf('Hoa\Protocol\Exception');
160     }
161 
162     public function case_offset_exists()
163     {
164         $this
165             ->given(
166                 $root        = new SUT(),
167                 $child       = new SUT(),
168                 $root['foo'] = $child
169             )
170             ->when($result = $root->offsetExists('foo'))
171             ->then
172                 ->boolean($result)
173                     ->isTrue();
174     }
175 
176     public function case_offset_not_exists()
177     {
178         $this
179             ->given($root = new SUT())
180             ->when($result = $root->offsetExists('foo'))
181             ->then
182                 ->boolean($result)
183                     ->isFalse();
184     }
185 
186     public function case_offset_unset()
187     {
188         $this
189             ->given(
190                 $root        = new SUT(),
191                 $child       = new SUT(),
192                 $root['foo'] = $child
193             )
194             ->when($result = $root->offsetUnset('foo'))
195             ->then
196                 ->boolean($root->offsetExists('foo'))
197                     ->isFalse();
198     }
199 
200     public function case_reach()
201     {
202         $this
203             ->given(
204                 $reach = 'bar',
205                 $node  = new SUT('foo', $reach)
206             )
207             ->when($result = $node->reach())
208             ->then
209                 ->string($result)
210                     ->isEqualTo($reach);
211     }
212 
213     public function case_reach_with_a_queue()
214     {
215         $this
216             ->given(
217                 $queue = 'baz',
218                 $node  = new SUT('foo', 'bar')
219             )
220             ->when($result = $node->reach('baz'))
221             ->then
222                 ->string($result)
223                     ->isEqualTo($queue);
224     }
225 
226     public function case_reach_id()
227     {
228         $this
229             ->given($node = new SUT())
230             ->exception(function () use ($node) {
231                 $node->reachId('foo');
232             })
233                 ->isInstanceOf('Hoa\Protocol\Exception');
234     }
235 
236     public function case_set_reach()
237     {
238         $this
239             ->given(
240                 $reach = 'bar',
241                 $node  = new SUT('foo', $reach)
242             )
243             ->when($result = $node->setReach('baz'))
244             ->then
245                 ->string($result)
246                     ->isEqualTo($reach)
247                 ->string($node->reach())
248                     ->isEqualTo('baz');
249     }
250 
251     public function case_get_name()
252     {
253         $this
254             ->given(
255                 $name = 'foo',
256                 $node = new SUT($name)
257             )
258             ->when($result = $node->getName())
259             ->then
260                 ->string($result)
261                     ->isEqualTo($name);
262     }
263 
264     public function case_get_iterator()
265     {
266         $this
267             ->given(
268                 $childA   = new SUT('bar'),
269                 $childB   = new SUT('baz'),
270                 $children = [$childA, $childB]
271             )
272             ->when($result = new SUT('foo', '', $children))
273             ->then
274                 ->object($result->getIterator())
275                     ->isInstanceOf('ArrayIterator')
276                 ->array(iterator_to_array($result->getIterator()))
277                     ->isEqualTo([
278                         'bar' => $childA,
279                         'baz' => $childB
280                     ]);
281     }
282 
283     public function case_get_root()
284     {
285         $this
286             ->when($result = SUT::getRoot())
287             ->then
288                 ->object($result)
289                     ->isIdenticalTo(LUT::getInstance());
290     }
291 
292     public function case_to_string_as_leaf()
293     {
294         $this
295             ->given($node = new SUT('foo'))
296             ->when($result = $node->__toString())
297             ->then
298                 ->string($result)
299                     ->isEqualTo('foo' . "\n");
300     }
301 
302     public function case_to_string_as_node()
303     {
304         $this
305             ->given(
306                 $node   = new SUT('foo'),
307                 $node[] = new SUT('bar'),
308                 $node[] = new SUT('baz')
309             )
310             ->when($result = $node->__toString())
311             ->then
312                 ->string($result)
313                     ->isEqualTo(
314                         'foo' . "\n" .
315                         '  bar' . "\n" .
316                         '  baz' . "\n"
317                     );
318     }
319 }
320