summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/cuchaz/enigma/EntryFactory.java18
-rw-r--r--test/cuchaz/enigma/TestJarIndexInheritanceTree.java255
-rw-r--r--test/cuchaz/enigma/TestJarIndexLoneClass.java8
-rw-r--r--test/cuchaz/enigma/inputs/inheritanceTree/BaseClass.java18
-rw-r--r--test/cuchaz/enigma/inputs/inheritanceTree/SubclassA.java9
-rw-r--r--test/cuchaz/enigma/inputs/inheritanceTree/SubclassB.java24
-rw-r--r--test/cuchaz/enigma/inputs/inheritanceTree/SubsubclassAA.java21
7 files changed, 345 insertions, 8 deletions
diff --git a/test/cuchaz/enigma/EntryFactory.java b/test/cuchaz/enigma/EntryFactory.java
index b275719b..66f83dfd 100644
--- a/test/cuchaz/enigma/EntryFactory.java
+++ b/test/cuchaz/enigma/EntryFactory.java
@@ -40,13 +40,23 @@ public class EntryFactory
40 return new ConstructorEntry( newClass( className ), signature ); 40 return new ConstructorEntry( newClass( className ), signature );
41 } 41 }
42 42
43 public static EntryReference<FieldEntry,BehaviorEntry> newFieldReferenceByMethod( String fieldClassName, String fieldName, String callerClassName, String callerName, String callerSignature ) 43 public static EntryReference<FieldEntry,BehaviorEntry> newFieldReferenceByMethod( FieldEntry fieldEntry, String callerClassName, String callerName, String callerSignature )
44 { 44 {
45 return new EntryReference<FieldEntry,BehaviorEntry>( newField( fieldClassName, fieldName ), newMethod( callerClassName, callerName, callerSignature ) ); 45 return new EntryReference<FieldEntry,BehaviorEntry>( fieldEntry, newMethod( callerClassName, callerName, callerSignature ) );
46 } 46 }
47 47
48 public static EntryReference<FieldEntry,BehaviorEntry> newFieldReferenceByConstructor( String fieldClassName, String fieldName, String callerClassName, String callerSignature ) 48 public static EntryReference<FieldEntry,BehaviorEntry> newFieldReferenceByConstructor( FieldEntry fieldEntry, String callerClassName, String callerSignature )
49 { 49 {
50 return new EntryReference<FieldEntry,BehaviorEntry>( newField( fieldClassName, fieldName ), newConstructor( callerClassName, callerSignature ) ); 50 return new EntryReference<FieldEntry,BehaviorEntry>( fieldEntry, newConstructor( callerClassName, callerSignature ) );
51 }
52
53 public static EntryReference<BehaviorEntry,BehaviorEntry> newBehaviorReferenceByMethod( BehaviorEntry behaviorEntry, String callerClassName, String callerName, String callerSignature )
54 {
55 return new EntryReference<BehaviorEntry,BehaviorEntry>( behaviorEntry, newMethod( callerClassName, callerName, callerSignature ) );
56 }
57
58 public static EntryReference<BehaviorEntry,BehaviorEntry> newBehaviorReferenceByConstructor( BehaviorEntry behaviorEntry, String callerClassName, String callerSignature )
59 {
60 return new EntryReference<BehaviorEntry,BehaviorEntry>( behaviorEntry, newConstructor( callerClassName, callerSignature ) );
51 } 61 }
52} 62}
diff --git a/test/cuchaz/enigma/TestJarIndexInheritanceTree.java b/test/cuchaz/enigma/TestJarIndexInheritanceTree.java
new file mode 100644
index 00000000..5ded5df0
--- /dev/null
+++ b/test/cuchaz/enigma/TestJarIndexInheritanceTree.java
@@ -0,0 +1,255 @@
1/*******************************************************************************
2 * Copyright (c) 2014 Jeff Martin.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the GNU Public License v3.0
5 * which accompanies this distribution, and is available at
6 * http://www.gnu.org/licenses/gpl.html
7 *
8 * Contributors:
9 * Jeff Martin - initial API and implementation
10 ******************************************************************************/
11package cuchaz.enigma;
12
13import static cuchaz.enigma.EntryFactory.newBehaviorReferenceByConstructor;
14import static cuchaz.enigma.EntryFactory.newBehaviorReferenceByMethod;
15import static cuchaz.enigma.EntryFactory.newClass;
16import static cuchaz.enigma.EntryFactory.newFieldReferenceByConstructor;
17import static cuchaz.enigma.EntryFactory.newFieldReferenceByMethod;
18import static org.hamcrest.MatcherAssert.assertThat;
19import static org.hamcrest.Matchers.contains;
20import static org.hamcrest.Matchers.containsInAnyOrder;
21import static org.hamcrest.Matchers.empty;
22import static org.hamcrest.Matchers.is;
23import static org.hamcrest.Matchers.nullValue;
24
25import java.util.Collection;
26import java.util.Set;
27import java.util.jar.JarFile;
28
29import org.junit.Test;
30
31import cuchaz.enigma.analysis.Access;
32import cuchaz.enigma.analysis.EntryReference;
33import cuchaz.enigma.analysis.JarIndex;
34import cuchaz.enigma.analysis.TranslationIndex;
35import cuchaz.enigma.mapping.BehaviorEntry;
36import cuchaz.enigma.mapping.ClassEntry;
37import cuchaz.enigma.mapping.ConstructorEntry;
38import cuchaz.enigma.mapping.FieldEntry;
39import cuchaz.enigma.mapping.MethodEntry;
40
41public class TestJarIndexInheritanceTree
42{
43 private JarIndex m_index;
44
45 private ClassEntry m_baseClass = new ClassEntry( "none/a" );
46 private ClassEntry m_subClassA = new ClassEntry( "none/b" );
47 private ClassEntry m_subClassAA = new ClassEntry( "none/d" );
48 private ClassEntry m_subClassB = new ClassEntry( "none/c" );
49 private FieldEntry m_nameField = new FieldEntry( m_baseClass, "a" );
50 private FieldEntry m_numThingsField = new FieldEntry( m_subClassB, "a" );
51
52 public TestJarIndexInheritanceTree( )
53 throws Exception
54 {
55 m_index = new JarIndex();
56 m_index.indexJar( new JarFile( "build/libs/testInheritanceTree.obf.jar" ), false );
57 }
58
59 @Test
60 public void obfEntries( )
61 {
62 assertThat( m_index.getObfClassEntries(), containsInAnyOrder(
63 newClass( "cuchaz/enigma/inputs/Keep" ),
64 m_baseClass,
65 m_subClassA,
66 m_subClassAA,
67 m_subClassB
68 ) );
69 }
70
71 @Test
72 public void translationIndex( )
73 {
74 TranslationIndex index = m_index.getTranslationIndex();
75
76 // base class
77 assertThat( index.getSuperclassName( m_baseClass.getName() ), is( nullValue() ) );
78 assertThat( index.getAncestry( m_baseClass.getName() ), is( empty() ) );
79 assertThat( index.getSubclassNames( m_baseClass.getName() ), containsInAnyOrder(
80 m_subClassA.getName(),
81 m_subClassB.getName()
82 ) );
83
84 // subclass a
85 assertThat( index.getSuperclassName( m_subClassA.getName() ), is( m_baseClass.getName() ) );
86 assertThat( index.getAncestry( m_subClassA.getName() ), contains( m_baseClass.getName() ) );
87 assertThat( index.getSubclassNames( m_subClassA.getName() ), contains( m_subClassAA.getName() ) );
88
89 // subclass aa
90 assertThat( index.getSuperclassName( m_subClassAA.getName() ), is( m_subClassA.getName() ) );
91 assertThat( index.getAncestry( m_subClassAA.getName() ), contains(
92 m_subClassA.getName(),
93 m_baseClass.getName()
94 ) );
95 assertThat( index.getSubclassNames( m_subClassAA.getName() ), is( empty() ) );
96
97 // subclass b
98 assertThat( index.getSuperclassName( m_subClassB.getName() ), is( m_baseClass.getName() ) );
99 assertThat( index.getAncestry( m_subClassB.getName() ), contains( m_baseClass.getName() ) );
100 assertThat( index.getSubclassNames( m_subClassB.getName() ), is( empty() ) );
101 }
102
103 @Test
104 public void access( )
105 {
106 assertThat( m_index.getAccess( m_nameField ), is( Access.Private ) );
107 assertThat( m_index.getAccess( m_numThingsField ), is( Access.Private ) );
108 }
109
110 @Test
111 public void isImplemented( )
112 {
113 // getName()
114 assertThat( m_index.isMethodImplemented( new MethodEntry( m_baseClass, "a", "()Ljava/lang/String;" ) ), is( true ) );
115 assertThat( m_index.isMethodImplemented( new MethodEntry( m_subClassA, "a", "()Ljava/lang/String;" ) ), is( false ) );
116 assertThat( m_index.isMethodImplemented( new MethodEntry( m_subClassAA, "a", "()Ljava/lang/String;" ) ), is( true ) );
117 assertThat( m_index.isMethodImplemented( new MethodEntry( m_subClassB, "a", "()Ljava/lang/String;" ) ), is( false ) );
118
119 // doBaseThings()
120 assertThat( m_index.isMethodImplemented( new MethodEntry( m_baseClass, "a", "()V" ) ), is( true ) );
121 assertThat( m_index.isMethodImplemented( new MethodEntry( m_subClassA, "a", "()V" ) ), is( false ) );
122 assertThat( m_index.isMethodImplemented( new MethodEntry( m_subClassAA, "a", "()V" ) ), is( true ) );
123 assertThat( m_index.isMethodImplemented( new MethodEntry( m_subClassB, "a", "()V" ) ), is( true ) );
124
125 // doBThings()
126 assertThat( m_index.isMethodImplemented( new MethodEntry( m_baseClass, "b", "()V" ) ), is( false ) );
127 assertThat( m_index.isMethodImplemented( new MethodEntry( m_subClassA, "b", "()V" ) ), is( false ) );
128 assertThat( m_index.isMethodImplemented( new MethodEntry( m_subClassAA, "b", "()V" ) ), is( false ) );
129 assertThat( m_index.isMethodImplemented( new MethodEntry( m_subClassB, "b", "()V" ) ), is( true ) );
130 }
131
132 @Test
133 public void relatedMethodImplementations( )
134 {
135 Set<MethodEntry> entries;
136
137 // getName()
138 entries = m_index.getRelatedMethodImplementations( new MethodEntry( m_baseClass, "a", "()Ljava/lang/String;" ) );
139 assertThat( entries, containsInAnyOrder(
140 new MethodEntry( m_baseClass, "a", "()Ljava/lang/String;" ),
141 new MethodEntry( m_subClassAA, "a", "()Ljava/lang/String;" )
142 ) );
143 entries = m_index.getRelatedMethodImplementations( new MethodEntry( m_subClassAA, "a", "()Ljava/lang/String;" ) );
144 assertThat( entries, containsInAnyOrder(
145 new MethodEntry( m_baseClass, "a", "()Ljava/lang/String;" ),
146 new MethodEntry( m_subClassAA, "a", "()Ljava/lang/String;" )
147 ) );
148
149 // doBaseThings()
150 entries = m_index.getRelatedMethodImplementations( new MethodEntry( m_baseClass, "a", "()V" ) );
151 assertThat( entries, containsInAnyOrder(
152 new MethodEntry( m_baseClass, "a", "()V" ),
153 new MethodEntry( m_subClassAA, "a", "()V" ),
154 new MethodEntry( m_subClassB, "a", "()V" )
155 ) );
156 entries = m_index.getRelatedMethodImplementations( new MethodEntry( m_subClassAA, "a", "()V" ) );
157 assertThat( entries, containsInAnyOrder(
158 new MethodEntry( m_baseClass, "a", "()V" ),
159 new MethodEntry( m_subClassAA, "a", "()V" ),
160 new MethodEntry( m_subClassB, "a", "()V" )
161 ) );
162 entries = m_index.getRelatedMethodImplementations( new MethodEntry( m_subClassB, "a", "()V" ) );
163 assertThat( entries, containsInAnyOrder(
164 new MethodEntry( m_baseClass, "a", "()V" ),
165 new MethodEntry( m_subClassAA, "a", "()V" ),
166 new MethodEntry( m_subClassB, "a", "()V" )
167 ) );
168
169 // doBThings
170 entries = m_index.getRelatedMethodImplementations( new MethodEntry( m_subClassB, "b", "()V" ) );
171 assertThat( entries, containsInAnyOrder(
172 new MethodEntry( m_subClassB, "b", "()V" )
173 ) );
174 }
175
176 @Test
177 @SuppressWarnings( "unchecked" )
178 public void fieldReferences( )
179 {
180 Collection<EntryReference<FieldEntry,BehaviorEntry>> references;
181
182 // name
183 references = m_index.getFieldReferences( m_nameField );
184 assertThat( references, containsInAnyOrder(
185 newFieldReferenceByConstructor( m_nameField, m_baseClass.getName(), "(Ljava/lang/String;)V" ),
186 newFieldReferenceByMethod( m_nameField, m_baseClass.getName(), "a", "()Ljava/lang/String;" )
187 ) );
188
189 // numThings
190 references = m_index.getFieldReferences( m_numThingsField );
191 assertThat( references, containsInAnyOrder(
192 newFieldReferenceByConstructor( m_numThingsField, m_subClassB.getName(), "()V" ),
193 newFieldReferenceByMethod( m_numThingsField, m_subClassB.getName(), "b", "()V" )
194 ) );
195 }
196
197 @Test
198 @SuppressWarnings( "unchecked" )
199 public void behaviorReferences( )
200 {
201 BehaviorEntry source;
202 Collection<EntryReference<BehaviorEntry,BehaviorEntry>> references;
203
204 // baseClass constructor
205 source = new ConstructorEntry( m_baseClass, "(Ljava/lang/String;)V" );
206 references = m_index.getBehaviorReferences( source );
207 assertThat( references, containsInAnyOrder(
208 newBehaviorReferenceByConstructor( source, m_subClassA.getName(), "(Ljava/lang/String;)V" ),
209 newBehaviorReferenceByConstructor( source, m_subClassB.getName(), "()V" )
210 ) );
211
212 // subClassA constructor
213 source = new ConstructorEntry( m_subClassA, "(Ljava/lang/String;)V" );
214 references = m_index.getBehaviorReferences( source );
215 assertThat( references, containsInAnyOrder(
216 newBehaviorReferenceByConstructor( source, m_subClassAA.getName(), "()V" )
217 ) );
218
219 // baseClass.getName()
220 source = new MethodEntry( m_baseClass, "a", "()Ljava/lang/String;" );
221 references = m_index.getBehaviorReferences( source );
222 assertThat( references, containsInAnyOrder(
223 newBehaviorReferenceByMethod( source, m_subClassAA.getName(), "a", "()Ljava/lang/String;" )
224 ) );
225
226 // subclassAA.getName()
227 source = new MethodEntry( m_subClassAA, "a", "()Ljava/lang/String;" );
228 references = m_index.getBehaviorReferences( source );
229 assertThat( references, containsInAnyOrder(
230 newBehaviorReferenceByMethod( source, m_subClassAA.getName(), "a", "()V" )
231 ) );
232 }
233
234 @Test
235 public void containsEntries( )
236 {
237 // classes
238 assertThat( m_index.containsObfClass( m_baseClass ), is( true ) );
239 assertThat( m_index.containsObfClass( m_subClassA ), is( true ) );
240 assertThat( m_index.containsObfClass( m_subClassAA ), is( true ) );
241 assertThat( m_index.containsObfClass( m_subClassB ), is( true ) );
242
243 // fields
244 assertThat( m_index.containsObfField( m_nameField ), is( true ) );
245 assertThat( m_index.containsObfField( m_numThingsField ), is( true ) );
246
247 // methods
248 assertThat( m_index.containsObfMethod( new MethodEntry( m_baseClass, "a", "()Ljava/lang/String;" ) ), is( true ) );
249 assertThat( m_index.containsObfMethod( new MethodEntry( m_baseClass, "a", "()V" ) ), is( true ) );
250 assertThat( m_index.containsObfMethod( new MethodEntry( m_subClassAA, "a", "()Ljava/lang/String;" ) ), is( true ) );
251 assertThat( m_index.containsObfMethod( new MethodEntry( m_subClassAA, "a", "()V" ) ), is( true ) );
252 assertThat( m_index.containsObfMethod( new MethodEntry( m_subClassB, "a", "()V" ) ), is( true ) );
253 assertThat( m_index.containsObfMethod( new MethodEntry( m_subClassB, "b", "()V" ) ), is( true ) );
254 }
255}
diff --git a/test/cuchaz/enigma/TestJarIndexLoneClass.java b/test/cuchaz/enigma/TestJarIndexLoneClass.java
index 56031ddc..9236d0c1 100644
--- a/test/cuchaz/enigma/TestJarIndexLoneClass.java
+++ b/test/cuchaz/enigma/TestJarIndexLoneClass.java
@@ -95,7 +95,6 @@ public class TestJarIndexLoneClass
95 assertThat( node.getObfClassName(), is( "none/a" ) ); 95 assertThat( node.getObfClassName(), is( "none/a" ) );
96 assertThat( node.getChildCount(), is( 0 ) ); 96 assertThat( node.getChildCount(), is( 0 ) );
97 } 97 }
98
99 98
100 @Test 99 @Test
101 public void methodInheritance( ) 100 public void methodInheritance( )
@@ -133,10 +132,11 @@ public class TestJarIndexLoneClass
133 @SuppressWarnings( "unchecked" ) 132 @SuppressWarnings( "unchecked" )
134 public void fieldReferences( ) 133 public void fieldReferences( )
135 { 134 {
136 Collection<EntryReference<FieldEntry,BehaviorEntry>> references = m_index.getFieldReferences( newField( "none/a", "a" ) ); 135 FieldEntry source = newField( "none/a", "a" );
136 Collection<EntryReference<FieldEntry,BehaviorEntry>> references = m_index.getFieldReferences( source );
137 assertThat( references, containsInAnyOrder( 137 assertThat( references, containsInAnyOrder(
138 newFieldReferenceByConstructor( "none/a", "a", "none/a", "(Ljava/lang/String;)V" ), 138 newFieldReferenceByConstructor( source, "none/a", "(Ljava/lang/String;)V" ),
139 newFieldReferenceByMethod( "none/a", "a", "none/a", "a", "()Ljava/lang/String;" ) 139 newFieldReferenceByMethod( source, "none/a", "a", "()Ljava/lang/String;" )
140 ) ); 140 ) );
141 } 141 }
142 142
diff --git a/test/cuchaz/enigma/inputs/inheritanceTree/BaseClass.java b/test/cuchaz/enigma/inputs/inheritanceTree/BaseClass.java
new file mode 100644
index 00000000..a6b38454
--- /dev/null
+++ b/test/cuchaz/enigma/inputs/inheritanceTree/BaseClass.java
@@ -0,0 +1,18 @@
1package cuchaz.enigma.inputs.inheritanceTree;
2
3public abstract class BaseClass
4{
5 private String m_name;
6
7 protected BaseClass( String name )
8 {
9 m_name = name;
10 }
11
12 public String getName( )
13 {
14 return m_name;
15 }
16
17 public abstract void doBaseThings( );
18}
diff --git a/test/cuchaz/enigma/inputs/inheritanceTree/SubclassA.java b/test/cuchaz/enigma/inputs/inheritanceTree/SubclassA.java
new file mode 100644
index 00000000..f4780a26
--- /dev/null
+++ b/test/cuchaz/enigma/inputs/inheritanceTree/SubclassA.java
@@ -0,0 +1,9 @@
1package cuchaz.enigma.inputs.inheritanceTree;
2
3public abstract class SubclassA extends BaseClass
4{
5 protected SubclassA( String name )
6 {
7 super( name );
8 }
9}
diff --git a/test/cuchaz/enigma/inputs/inheritanceTree/SubclassB.java b/test/cuchaz/enigma/inputs/inheritanceTree/SubclassB.java
new file mode 100644
index 00000000..4001e7a3
--- /dev/null
+++ b/test/cuchaz/enigma/inputs/inheritanceTree/SubclassB.java
@@ -0,0 +1,24 @@
1package cuchaz.enigma.inputs.inheritanceTree;
2
3public class SubclassB extends BaseClass
4{
5 private int m_numThings;
6
7 protected SubclassB( )
8 {
9 super( "B" );
10
11 m_numThings = 4;
12 }
13
14 @Override
15 public void doBaseThings( )
16 {
17 System.out.println( "Base things by B!" );
18 }
19
20 public void doBThings( )
21 {
22 System.out.println( "" + m_numThings + " B things!" );
23 }
24}
diff --git a/test/cuchaz/enigma/inputs/inheritanceTree/SubsubclassAA.java b/test/cuchaz/enigma/inputs/inheritanceTree/SubsubclassAA.java
new file mode 100644
index 00000000..11196d16
--- /dev/null
+++ b/test/cuchaz/enigma/inputs/inheritanceTree/SubsubclassAA.java
@@ -0,0 +1,21 @@
1package cuchaz.enigma.inputs.inheritanceTree;
2
3public class SubsubclassAA extends SubclassA
4{
5 protected SubsubclassAA( )
6 {
7 super( "AA" );
8 }
9
10 @Override
11 public String getName( )
12 {
13 return "subsub" + super.getName();
14 }
15
16 @Override
17 public void doBaseThings( )
18 {
19 System.out.println( "Base things by " + getName() );
20 }
21}