43
|
1 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverse;
|
|
2
|
|
3 import java.nio.ByteBuffer;
|
|
4 import org.junit.Assert;
|
|
5
|
|
6 import fj.data.List;
|
|
7
|
|
8 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
|
|
9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode;
|
|
10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath;
|
|
11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TraversableNodeWrapper;
|
54
|
12 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode;
|
43
|
13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultEvaluator;
|
|
14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Direction;
|
|
15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traversal;
|
|
16 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traverser;
|
|
17 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
|
|
18 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
|
|
19 import junit.framework.TestCase;
|
|
20
|
|
21 public abstract class TraverserTest extends TestCase
|
|
22 {
|
|
23 public abstract Traverser instance();
|
|
24
|
|
25 public void testTraverse()
|
|
26 {
|
|
27 int maxHeight = 3;
|
54
|
28 DefaultTreeNode root = createTree(0,0,maxHeight,new DefaultNodePath());
|
43
|
29
|
54
|
30 TraversableNodeWrapper<DefaultTreeNode> traversable = new TraversableNodeWrapper<DefaultTreeNode>(root);
|
43
|
31 Traverser traverser = instance();
|
|
32
|
|
33 // generate all pattern.
|
|
34 List<DefaultNodePath> paths = generatePathPattern(new DefaultNodePath(),0,maxHeight);
|
44
|
35 paths = paths.cons(new DefaultNodePath());
|
43
|
36
|
|
37 for(DefaultNodePath path : paths){
|
|
38 DefaultEvaluator evaluator = new DefaultEvaluator(path);
|
54
|
39 Either<Error,Traversal<TraversableNodeWrapper<DefaultTreeNode>>> ret = traverser.traverse(traversable,evaluator);
|
43
|
40 if(ret.isA()){
|
|
41 Assert.fail();
|
|
42 }
|
|
43
|
54
|
44 Traversal<TraversableNodeWrapper<DefaultTreeNode>> traversal = ret.b();
|
|
45 TraversableNodeWrapper<DefaultTreeNode> target = traversal.destination();
|
43
|
46 String expect = path.toString();
|
|
47 ByteBuffer value = target.getWrapped().getAttributes().get(key);
|
|
48 String actual = new String(value.array());
|
|
49 Assert.assertEquals(expect,actual);
|
|
50
|
44
|
51 List<DefaultNodePath> parts = path.inits();
|
43
|
52
|
54
|
53 for(Direction<TraversableNodeWrapper<DefaultTreeNode>> d : traversal){
|
44
|
54 DefaultNodePath part = parts.head();
|
|
55 parts = parts.tail();
|
43
|
56 value = d.getTarget().getWrapped().getAttributes().get(key);
|
|
57 String actualCurrentPathStr = new String(value.array());
|
44
|
58 String expectCurrentPathStr = part.toString();
|
43
|
59 Assert.assertEquals(expectCurrentPathStr,actualCurrentPathStr);
|
|
60 }
|
|
61 }
|
|
62 }
|
|
63
|
|
64 public List<DefaultNodePath> generatePathPattern(DefaultNodePath _cur,int _curHeight,int _maxHeight)
|
|
65 {
|
|
66 List<DefaultNodePath> paths = List.nil();
|
|
67 for(int p = 0;p <= _curHeight;p ++){
|
|
68 DefaultNodePath path = _cur.add(p);
|
|
69 if(_curHeight != _maxHeight - 1){
|
|
70 List<DefaultNodePath> newpaths = generatePathPattern(path,_curHeight+1,_maxHeight);
|
|
71 paths = paths.append(newpaths);
|
|
72 }
|
|
73 paths = paths.cons(path);
|
|
74 }
|
|
75
|
|
76 return paths;
|
|
77 }
|
|
78
|
|
79 public static String key = "KEY";
|
|
80 public static ByteBuffer value = ByteBuffer.wrap(key.getBytes());
|
54
|
81 public static DefaultTreeNode factory = new DefaultTreeNode(new DefaultNode());
|
43
|
82
|
54
|
83 public DefaultTreeNode createTree(int _curX,int _curY,int _maxHeight,NodePath _address)
|
43
|
84 {
|
54
|
85 DefaultTreeNode parent = factory.createNewNode();
|
|
86 Either<Error,DefaultTreeNode> either = parent.getAttributes().put(key,ByteBuffer.wrap(_address.toString().getBytes()));
|
43
|
87 if(either.isA()){
|
|
88 Assert.fail();
|
|
89 }
|
|
90 parent = either.b();
|
|
91
|
|
92 if(_curY == _maxHeight){
|
|
93 return parent;
|
|
94 }
|
|
95
|
|
96 for(int i = 0;i < _curY + 1;i ++){
|
54
|
97 DefaultTreeNode ch = createTree(i,_curY + 1,_maxHeight,_address.add(i));
|
43
|
98 either = parent.getChildren().addNewChildAt(i,ch);
|
|
99 if(either.isA()){
|
|
100 Assert.fail();
|
|
101 }
|
|
102
|
|
103 parent = either.b();
|
|
104 }
|
|
105
|
|
106 return parent;
|
|
107 }
|
|
108 }
|