File: TestASTFactory.java

package info (click to toggle)
antlr 2.7.7%2Bdfsg-14
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 10,016 kB
  • sloc: java: 54,649; cs: 12,537; makefile: 8,854; cpp: 7,359; pascal: 5,273; sh: 4,333; python: 4,297; lisp: 1,969; xml: 220; lex: 192; ansic: 127
file content (144 lines) | stat: -rw-r--r-- 4,682 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144

import antlr.ASTFactory;
import antlr.CommonAST;
import antlr.Token;
import antlr.BaseAST;
import antlr.collections.AST;

/** Test the new heterogeneous token type to tree node mapping stuff.
 *  I'm not using jUnit because I don't want the dependency on that
 *  package for the moment.
 */
public class TestASTFactory {
	private ASTFactory factory=new ASTFactory();

	public static void main(String[] args) {
		TestASTFactory testHarness = new TestASTFactory();
		if ( !testHarness.testDefaultCreate() ) error("testDefaultCreate");
		else success("testDefaultCreate");
		if ( !testHarness.testSpecificHomoCreate() ) error("testSpecificHomoCreate");
		else success("testSpecificHomoCreate");
		if ( !testHarness.testDynamicHeteroCreate() ) error("testDynamicHeteroCreate");
		else success("testDynamicHeteroCreate");
		if ( !testHarness.testNodeDup() ) error("testNodeDup");
		else success("testNodeDup");
		if ( !testHarness.testHeteroTreeDup() ) error("testHeteroTreeDup");
		else success("testHeteroTreeDup");
	}

	public boolean testDefaultCreate() {
        AST t = factory.create();
		return checkNode(t, CommonAST.class, Token.INVALID_TYPE);
	}

	public boolean testSpecificHomoCreate() {
		factory.setASTNodeType("MyAST");
		AST t = factory.create();
		factory.setASTNodeType("antlr.CommonAST"); // put it back
		return checkNode(t, MyAST.class, Token.INVALID_TYPE);
	}

	public boolean testDynamicHeteroCreate() {
		factory.setTokenTypeASTNodeType(49,"ASTType49");
		AST t = factory.create(49);
		boolean a = checkNode(t, ASTType49.class, 49);
		AST u = factory.create(55);
		boolean b = checkNode(u, CommonAST.class, 55);
		AST v = factory.create(49,"","MyAST");
		boolean c = checkNode(v, MyAST.class, 49);
		factory.setTokenTypeASTNodeType(49,null); // undo setting
		return a&&b&&c;
	}

	public boolean testNodeDup() {
		AST t = factory.create();
		boolean a = t.equals(factory.dup(t));
		boolean b = !t.equals(null);
		AST u = factory.create(49,"","ASTType49");
		boolean c = checkNode(factory.dup(u),ASTType49.class, 49);
		boolean d = u.equals(factory.dup(u));
		return a&&b&&c&&d;
	}

	public boolean testHeteroTreeDup() {
		// create a tree and try to dup:
		// ( [type 1] [type 2] ( [type 49] [type 3 #2] ) [type 3] )
		AST x = factory.create(1,"[type 1]","MyAST"); // will be root
		AST y = factory.create(2,"[type 2]","MyAST");
		AST z = factory.create(3,"[type 3]","MyAST");
		AST sub = factory.create(49,"[type 49]","ASTType49");
		sub.addChild(factory.create(3,"[type 3 #2]","MyAST"));
		AST t = factory.make(new AST[] {x,y,sub,z});
		AST dup_t = factory.dupList(t);
        // check structure
		boolean a = dup_t.equalsList(t);
        // check types
        boolean b = equalsNodeTypesList(t,dup_t);

		return a&&b;
	}

	protected boolean checkNode(AST t, Class c, int tokenType) {
		if ( t==null ) {
			return false;
		}
		if ( t.getClass()!=c ) {
			return false;
		}
		if ( t.getType()!=tokenType ) {
			return false;
		}
		return true;
	}

	/** Is t an exact structural match of this tree with the same node
	 *  types?  'self' is considered the start of a sibling list.
     */
    protected boolean equalsNodeTypesList(AST self, AST t) {
		// System.out.println("self="+self+", t="+t);
		// System.out.println("self.class="+self.getClass()+", t.class="+t.getClass());
        AST sibling;

        // the empty tree is not a match of any non-null tree.
        if (t == null) {
            return false;
        }

        // Otherwise, start walking sibling lists.  First mismatch, return false.
        for (sibling = self;
			 sibling != null && t != null;
			 sibling = sibling.getNextSibling(), t = t.getNextSibling())
		{
			// System.out.println("sibling="+sibling+", t="+t);
            // as a quick optimization, check root types first.
            if ( sibling.getClass()!=t.getClass() ) {
                return false;
            }
            // if roots match, do full list match test on children.
            if (sibling.getFirstChild() != null) {
                if (!equalsNodeTypesList(sibling.getFirstChild(),
										 t.getFirstChild()))
				{
                    return false;
                }
            }
            // sibling has no kids, make sure t doesn't either
            else if (t.getFirstChild() != null) {
                return false;
            }
        }
        if (sibling == null && t == null) {
            return true;
        }
        // one sibling list has more than the other
        return false;
    }

	public static void error(String test) {
		System.out.println("Test "+test+" FAILED");
	}

	public static void success(String test) {
		System.out.println("Test "+test+" succeeded");
	}
}