File tree 4 files changed +87
-10
lines changed
spec/drupol/phptree/Visitor
4 files changed +87
-10
lines changed Original file line number Diff line number Diff line change 4
4
5
5
namespace spec \drupol \phptree \Visitor ;
6
6
7
+ use drupol \phptree \Node \NaryNode ;
7
8
use drupol \phptree \Node \Node ;
9
+ use drupol \phptree \Node \ValueNode ;
10
+ use drupol \phptree \Render \GraphViz ;
11
+ use drupol \phptree \Visitor \BreadthFirstVisitor ;
8
12
use drupol \phptree \Visitor \PostOrderVisitor ;
13
+ use Fhaculty \Graph \Graph ;
9
14
use PhpSpec \ObjectBehavior ;
10
15
11
16
class PostOrderVisitorSpec extends ObjectBehavior
@@ -34,4 +39,37 @@ public function it_can_traverse_a_tree()
34
39
->traverse ($ tree )
35
40
->shouldYield (new \ArrayIterator ($ nodes ));
36
41
}
42
+
43
+ public function it_can_traverse_a_tree_with_a_specific_level ()
44
+ {
45
+ $ tree = new NaryNode (2 );
46
+
47
+ $ data = \range ('A ' , 'G ' );
48
+
49
+ $ nodes = [];
50
+ foreach ($ data as $ key => $ value ) {
51
+ $ nodes [$ value ] = new ValueNode ($ value );
52
+ }
53
+
54
+ $ tree ->add (...array_values ($ nodes ));
55
+
56
+ $ nodes ['root ' ] = $ tree ;
57
+
58
+ $ order = [
59
+ 7 => $ nodes ['root ' ],
60
+ ];
61
+
62
+ $ this
63
+ ->traverse ($ tree , 0 )
64
+ ->shouldYield (new \ArrayIterator ($ order ));
65
+
66
+ $ order = [
67
+ 3 => $ nodes ['A ' ],
68
+ 6 => $ nodes ['B ' ],
69
+ ];
70
+
71
+ $ this
72
+ ->traverse ($ tree , 1 )
73
+ ->shouldYield (new \ArrayIterator ($ order ));
74
+ }
37
75
}
Original file line number Diff line number Diff line change 4
4
5
5
namespace spec \drupol \phptree \Visitor ;
6
6
7
+ use drupol \phptree \Node \NaryNode ;
7
8
use drupol \phptree \Node \Node ;
9
+ use drupol \phptree \Node \ValueNode ;
8
10
use drupol \phptree \Visitor \PreOrderVisitor ;
9
11
use PhpSpec \ObjectBehavior ;
10
12
@@ -34,4 +36,37 @@ public function it_can_traverse_a_tree()
34
36
->traverse ($ tree )
35
37
->shouldYield (new \ArrayIterator ($ rootAndNodes ));
36
38
}
39
+
40
+ public function it_can_traverse_a_tree_with_a_specific_level ()
41
+ {
42
+ $ tree = new NaryNode (2 );
43
+
44
+ $ data = \range ('A ' , 'G ' );
45
+
46
+ $ nodes = [];
47
+ foreach ($ data as $ key => $ value ) {
48
+ $ nodes [$ value ] = new ValueNode ($ value );
49
+ }
50
+
51
+ $ tree ->add (...array_values ($ nodes ));
52
+
53
+ $ nodes ['root ' ] = $ tree ;
54
+
55
+ $ order = [
56
+ 0 => $ nodes ['root ' ],
57
+ ];
58
+
59
+ $ this
60
+ ->traverse ($ tree , 0 )
61
+ ->shouldYield (new \ArrayIterator ($ order ));
62
+
63
+ $ order = [
64
+ 1 => $ nodes ['A ' ],
65
+ 5 => $ nodes ['B ' ],
66
+ ];
67
+
68
+ $ this
69
+ ->traverse ($ tree , 1 )
70
+ ->shouldYield (new \ArrayIterator ($ order ));
71
+ }
37
72
}
Original file line number Diff line number Diff line change @@ -19,23 +19,25 @@ class PostOrderVisitor extends AbstractVisitor
19
19
/**
20
20
* {@inheritdoc}
21
21
*/
22
- public function traverse (NodeInterface $ node ): \Traversable
22
+ public function traverse (NodeInterface $ node, int $ level = null ): \Traversable
23
23
{
24
24
$ this ->index = 0 ;
25
25
26
- return $ this ->doTraverse ($ node );
26
+ return $ this ->doTraverse ($ node, $ level );
27
27
}
28
28
29
29
/**
30
30
* {@inheritdoc}
31
31
*/
32
- private function doTraverse (NodeInterface $ node ): \Traversable
32
+ private function doTraverse (NodeInterface $ node, int $ level = null ): \Traversable
33
33
{
34
34
foreach ($ node ->children () as $ child ) {
35
- yield from $ this ->doTraverse ($ child );
35
+ yield from $ this ->doTraverse ($ child, $ level );
36
36
$ this ->index ++;
37
37
}
38
38
39
- yield $ this ->index => $ node ;
39
+ if (null === $ level || $ level === $ node ->depth ()) {
40
+ yield $ this ->index => $ node ;
41
+ }
40
42
}
41
43
}
Original file line number Diff line number Diff line change @@ -19,23 +19,25 @@ class PreOrderVisitor extends AbstractVisitor
19
19
/**
20
20
* {@inheritdoc}
21
21
*/
22
- public function traverse (NodeInterface $ node ): \Traversable
22
+ public function traverse (NodeInterface $ node, int $ level = null ): \Traversable
23
23
{
24
24
$ this ->index = 0 ;
25
25
26
- return $ this ->doTraverse ($ node );
26
+ return $ this ->doTraverse ($ node, $ level );
27
27
}
28
28
29
29
/**
30
30
* {@inheritdoc}
31
31
*/
32
- private function doTraverse (NodeInterface $ node ): \Traversable
32
+ private function doTraverse (NodeInterface $ node, int $ level = null ): \Traversable
33
33
{
34
- yield $ this ->index => $ node ;
34
+ if (null === $ level || $ level === $ node ->depth ()) {
35
+ yield $ this ->index => $ node ;
36
+ }
35
37
36
38
foreach ($ node ->children () as $ child ) {
37
39
$ this ->index ++;
38
- yield from $ this ->doTraverse ($ child );
40
+ yield from $ this ->doTraverse ($ child, $ level );
39
41
}
40
42
}
41
43
}
You can’t perform that action at this time.
0 commit comments