summaryrefslogtreecommitdiff
path: root/src/test/java/cuchaz/enigma/TestJarIndexInheritanceTree.java
diff options
context:
space:
mode:
authorGravatar Gegy2019-01-24 14:48:32 +0200
committerGravatar Adrian Siekierka2019-01-24 13:48:32 +0100
commit00fcd0550fcdda621c2e4662f6ddd55ce673b931 (patch)
tree6f9e4c24dbcc6d118fceec56adf7bf9d747a485c /src/test/java/cuchaz/enigma/TestJarIndexInheritanceTree.java
parentmark as 0.13.0-SNAPSHOT for preliminary development (diff)
downloadenigma-fork-00fcd0550fcdda621c2e4662f6ddd55ce673b931.tar.gz
enigma-fork-00fcd0550fcdda621c2e4662f6ddd55ce673b931.tar.xz
enigma-fork-00fcd0550fcdda621c2e4662f6ddd55ce673b931.zip
[WIP] Mapping rework (#91)
* Move packages * Mapping & entry refactor: first pass * Fix deobf -> obf tree remapping * Resolve various issues * Give all entries the potential for parents and treat inner classes as children * Deobf UI tree elements * Tests pass * Sort mapping output * Fix delta tracking * Index separation and first pass for #97 * Keep track of remapped jar index * Fix child entries not being remapped * Drop non-root entries * Track dropped mappings * Fix enigma mapping ordering * EntryTreeNode interface * Small tweaks * Naive full index remap on rename * Entries can resolve to more than one root entry * Support alternative resolution strategies * Bridge method resolution * Tests pass * Fix mappings being used where there are none * Fix methods with different descriptors being considered unique. closes #89
Diffstat (limited to 'src/test/java/cuchaz/enigma/TestJarIndexInheritanceTree.java')
-rw-r--r--src/test/java/cuchaz/enigma/TestJarIndexInheritanceTree.java118
1 files changed, 64 insertions, 54 deletions
diff --git a/src/test/java/cuchaz/enigma/TestJarIndexInheritanceTree.java b/src/test/java/cuchaz/enigma/TestJarIndexInheritanceTree.java
index 23df1a9..36595a3 100644
--- a/src/test/java/cuchaz/enigma/TestJarIndexInheritanceTree.java
+++ b/src/test/java/cuchaz/enigma/TestJarIndexInheritanceTree.java
@@ -11,12 +11,22 @@
11 11
12package cuchaz.enigma; 12package cuchaz.enigma;
13 13
14import cuchaz.enigma.analysis.*; 14import cuchaz.enigma.analysis.EntryReference;
15import cuchaz.enigma.mapping.entry.*; 15import cuchaz.enigma.analysis.ParsedJar;
16import cuchaz.enigma.analysis.index.EntryIndex;
17import cuchaz.enigma.analysis.index.InheritanceIndex;
18import cuchaz.enigma.analysis.index.JarIndex;
19import cuchaz.enigma.translation.mapping.EntryResolver;
20import cuchaz.enigma.translation.mapping.IndexEntryResolver;
21import cuchaz.enigma.translation.representation.AccessFlags;
22import cuchaz.enigma.translation.representation.entry.ClassEntry;
23import cuchaz.enigma.translation.representation.entry.FieldEntry;
24import cuchaz.enigma.translation.representation.entry.MethodDefEntry;
25import cuchaz.enigma.translation.representation.entry.MethodEntry;
16import org.junit.Test; 26import org.junit.Test;
27import org.objectweb.asm.Opcodes;
17 28
18import java.util.Collection; 29import java.util.Collection;
19import java.util.Set;
20import java.util.jar.JarFile; 30import java.util.jar.JarFile;
21 31
22import static cuchaz.enigma.TestEntryFactory.*; 32import static cuchaz.enigma.TestEntryFactory.*;
@@ -27,7 +37,6 @@ public class TestJarIndexInheritanceTree {
27 37
28 private JarIndex index; 38 private JarIndex index;
29 39
30 private ClassEntry objectClass = newClass("java/lang/Object");
31 private ClassEntry baseClass = newClass("a"); 40 private ClassEntry baseClass = newClass("a");
32 private ClassEntry subClassA = newClass("b"); 41 private ClassEntry subClassA = newClass("b");
33 private ClassEntry subClassAA = newClass("d"); 42 private ClassEntry subClassAA = newClass("d");
@@ -37,13 +46,13 @@ public class TestJarIndexInheritanceTree {
37 46
38 public TestJarIndexInheritanceTree() 47 public TestJarIndexInheritanceTree()
39 throws Exception { 48 throws Exception {
40 index = new JarIndex(new ReferencedEntryPool()); 49 index = JarIndex.empty();
41 index.indexJar(new ParsedJar(new JarFile("build/test-obf/inheritanceTree.jar")), false); 50 index.indexJar(new ParsedJar(new JarFile("build/test-obf/inheritanceTree.jar")), s -> {});
42 } 51 }
43 52
44 @Test 53 @Test
45 public void obfEntries() { 54 public void obfEntries() {
46 assertThat(index.getObfClassEntries(), containsInAnyOrder( 55 assertThat(index.getEntryIndex().getClasses(), containsInAnyOrder(
47 newClass("cuchaz/enigma/inputs/Keep"), baseClass, subClassA, subClassAA, subClassB 56 newClass("cuchaz/enigma/inputs/Keep"), baseClass, subClassA, subClassAA, subClassB
48 )); 57 ));
49 } 58 }
@@ -51,67 +60,68 @@ public class TestJarIndexInheritanceTree {
51 @Test 60 @Test
52 public void translationIndex() { 61 public void translationIndex() {
53 62
54 TranslationIndex index = this.index.getTranslationIndex(); 63 InheritanceIndex index = this.index.getInheritanceIndex();
55 64
56 // base class 65 // base class
57 assertThat(index.getSuperclass(baseClass), is(objectClass)); 66 assertThat(index.getParents(baseClass), is(empty()));
58 assertThat(index.getAncestry(baseClass), contains(objectClass)); 67 assertThat(index.getAncestors(baseClass), is(empty()));
59 assertThat(index.getSubclass(baseClass), containsInAnyOrder(subClassA, subClassB 68 assertThat(index.getChildren(baseClass), containsInAnyOrder(subClassA, subClassB
60 )); 69 ));
61 70
62 // subclass a 71 // subclass a
63 assertThat(index.getSuperclass(subClassA), is(baseClass)); 72 assertThat(index.getParents(subClassA), contains(baseClass));
64 assertThat(index.getAncestry(subClassA), contains(baseClass, objectClass)); 73 assertThat(index.getAncestors(subClassA), containsInAnyOrder(baseClass));
65 assertThat(index.getSubclass(subClassA), contains(subClassAA)); 74 assertThat(index.getChildren(subClassA), contains(subClassAA));
66 75
67 // subclass aa 76 // subclass aa
68 assertThat(index.getSuperclass(subClassAA), is(subClassA)); 77 assertThat(index.getParents(subClassAA), contains(subClassA));
69 assertThat(index.getAncestry(subClassAA), contains(subClassA, baseClass, objectClass)); 78 assertThat(index.getAncestors(subClassAA), containsInAnyOrder(subClassA, baseClass));
70 assertThat(index.getSubclass(subClassAA), is(empty())); 79 assertThat(index.getChildren(subClassAA), is(empty()));
71 80
72 // subclass b 81 // subclass b
73 assertThat(index.getSuperclass(subClassB), is(baseClass)); 82 assertThat(index.getParents(subClassB), contains(baseClass));
74 assertThat(index.getAncestry(subClassB), contains(baseClass, objectClass)); 83 assertThat(index.getAncestors(subClassB), containsInAnyOrder(baseClass));
75 assertThat(index.getSubclass(subClassB), is(empty())); 84 assertThat(index.getChildren(subClassB), is(empty()));
76 } 85 }
77 86
78 @Test 87 @Test
79 public void access() { 88 public void access() {
80 assertThat(index.getAccess(nameField), is(Access.PRIVATE)); 89 assertThat(index.getEntryIndex().getFieldAccess(nameField), is(new AccessFlags(Opcodes.ACC_PRIVATE)));
81 assertThat(index.getAccess(numThingsField), is(Access.PRIVATE)); 90 assertThat(index.getEntryIndex().getFieldAccess(numThingsField), is(new AccessFlags(Opcodes.ACC_PRIVATE)));
82 } 91 }
83 92
84 @Test 93 @Test
85 public void relatedMethodImplementations() { 94 public void relatedMethodImplementations() {
86 95
87 Set<MethodEntry> entries; 96 Collection<MethodEntry> entries;
88 97
98 EntryResolver resolver = new IndexEntryResolver(index);
89 // getName() 99 // getName()
90 entries = index.getRelatedMethodImplementations(newMethod(baseClass, "a", "()Ljava/lang/String;")); 100 entries = resolver.resolveEquivalentMethods(newMethod(baseClass, "a", "()Ljava/lang/String;"));
91 assertThat(entries, containsInAnyOrder( 101 assertThat(entries, containsInAnyOrder(
92 newMethod(baseClass, "a", "()Ljava/lang/String;"), 102 newMethod(baseClass, "a", "()Ljava/lang/String;"),
93 newMethod(subClassAA, "a", "()Ljava/lang/String;") 103 newMethod(subClassAA, "a", "()Ljava/lang/String;")
94 )); 104 ));
95 entries = index.getRelatedMethodImplementations(newMethod(subClassAA, "a", "()Ljava/lang/String;")); 105 entries = resolver.resolveEquivalentMethods(newMethod(subClassAA, "a", "()Ljava/lang/String;"));
96 assertThat(entries, containsInAnyOrder( 106 assertThat(entries, containsInAnyOrder(
97 newMethod(baseClass, "a", "()Ljava/lang/String;"), 107 newMethod(baseClass, "a", "()Ljava/lang/String;"),
98 newMethod(subClassAA, "a", "()Ljava/lang/String;") 108 newMethod(subClassAA, "a", "()Ljava/lang/String;")
99 )); 109 ));
100 110
101 // doBaseThings() 111 // doBaseThings()
102 entries = index.getRelatedMethodImplementations(newMethod(baseClass, "a", "()V")); 112 entries = resolver.resolveEquivalentMethods(newMethod(baseClass, "a", "()V"));
103 assertThat(entries, containsInAnyOrder( 113 assertThat(entries, containsInAnyOrder(
104 newMethod(baseClass, "a", "()V"), 114 newMethod(baseClass, "a", "()V"),
105 newMethod(subClassAA, "a", "()V"), 115 newMethod(subClassAA, "a", "()V"),
106 newMethod(subClassB, "a", "()V") 116 newMethod(subClassB, "a", "()V")
107 )); 117 ));
108 entries = index.getRelatedMethodImplementations(newMethod(subClassAA, "a", "()V")); 118 entries = resolver.resolveEquivalentMethods(newMethod(subClassAA, "a", "()V"));
109 assertThat(entries, containsInAnyOrder( 119 assertThat(entries, containsInAnyOrder(
110 newMethod(baseClass, "a", "()V"), 120 newMethod(baseClass, "a", "()V"),
111 newMethod(subClassAA, "a", "()V"), 121 newMethod(subClassAA, "a", "()V"),
112 newMethod(subClassB, "a", "()V") 122 newMethod(subClassB, "a", "()V")
113 )); 123 ));
114 entries = index.getRelatedMethodImplementations(newMethod(subClassB, "a", "()V")); 124 entries = resolver.resolveEquivalentMethods(newMethod(subClassB, "a", "()V"));
115 assertThat(entries, containsInAnyOrder( 125 assertThat(entries, containsInAnyOrder(
116 newMethod(baseClass, "a", "()V"), 126 newMethod(baseClass, "a", "()V"),
117 newMethod(subClassAA, "a", "()V"), 127 newMethod(subClassAA, "a", "()V"),
@@ -119,7 +129,7 @@ public class TestJarIndexInheritanceTree {
119 )); 129 ));
120 130
121 // doBThings 131 // doBThings
122 entries = index.getRelatedMethodImplementations(newMethod(subClassB, "b", "()V")); 132 entries = resolver.resolveEquivalentMethods(newMethod(subClassB, "b", "()V"));
123 assertThat(entries, containsInAnyOrder(newMethod(subClassB, "b", "()V"))); 133 assertThat(entries, containsInAnyOrder(newMethod(subClassB, "b", "()V")));
124 } 134 }
125 135
@@ -129,14 +139,14 @@ public class TestJarIndexInheritanceTree {
129 Collection<EntryReference<FieldEntry, MethodDefEntry>> references; 139 Collection<EntryReference<FieldEntry, MethodDefEntry>> references;
130 140
131 // name 141 // name
132 references = index.getFieldReferences(nameField); 142 references = index.getReferenceIndex().getReferencesToField(nameField);
133 assertThat(references, containsInAnyOrder( 143 assertThat(references, containsInAnyOrder(
134 newFieldReferenceByMethod(nameField, baseClass.getName(), "<init>", "(Ljava/lang/String;)V"), 144 newFieldReferenceByMethod(nameField, baseClass.getName(), "<init>", "(Ljava/lang/String;)V"),
135 newFieldReferenceByMethod(nameField, baseClass.getName(), "a", "()Ljava/lang/String;") 145 newFieldReferenceByMethod(nameField, baseClass.getName(), "a", "()Ljava/lang/String;")
136 )); 146 ));
137 147
138 // numThings 148 // numThings
139 references = index.getFieldReferences(numThingsField); 149 references = index.getReferenceIndex().getReferencesToField(numThingsField);
140 assertThat(references, containsInAnyOrder( 150 assertThat(references, containsInAnyOrder(
141 newFieldReferenceByMethod(numThingsField, subClassB.getName(), "<init>", "()V"), 151 newFieldReferenceByMethod(numThingsField, subClassB.getName(), "<init>", "()V"),
142 newFieldReferenceByMethod(numThingsField, subClassB.getName(), "b", "()V") 152 newFieldReferenceByMethod(numThingsField, subClassB.getName(), "b", "()V")
@@ -152,7 +162,7 @@ public class TestJarIndexInheritanceTree {
152 162
153 // baseClass constructor 163 // baseClass constructor
154 source = newMethod(baseClass, "<init>", "(Ljava/lang/String;)V"); 164 source = newMethod(baseClass, "<init>", "(Ljava/lang/String;)V");
155 references = index.getMethodsReferencing(source); 165 references = index.getReferenceIndex().getReferencesToMethod(source);
156 assertThat(references, containsInAnyOrder( 166 assertThat(references, containsInAnyOrder(
157 newBehaviorReferenceByMethod(source, subClassA.getName(), "<init>", "(Ljava/lang/String;)V"), 167 newBehaviorReferenceByMethod(source, subClassA.getName(), "<init>", "(Ljava/lang/String;)V"),
158 newBehaviorReferenceByMethod(source, subClassB.getName(), "<init>", "()V") 168 newBehaviorReferenceByMethod(source, subClassB.getName(), "<init>", "()V")
@@ -160,14 +170,14 @@ public class TestJarIndexInheritanceTree {
160 170
161 // subClassA constructor 171 // subClassA constructor
162 source = newMethod(subClassA, "<init>", "(Ljava/lang/String;)V"); 172 source = newMethod(subClassA, "<init>", "(Ljava/lang/String;)V");
163 references = index.getMethodsReferencing(source); 173 references = index.getReferenceIndex().getReferencesToMethod(source);
164 assertThat(references, containsInAnyOrder( 174 assertThat(references, containsInAnyOrder(
165 newBehaviorReferenceByMethod(source, subClassAA.getName(), "<init>", "()V") 175 newBehaviorReferenceByMethod(source, subClassAA.getName(), "<init>", "()V")
166 )); 176 ));
167 177
168 // baseClass.getName() 178 // baseClass.getName()
169 source = newMethod(baseClass, "a", "()Ljava/lang/String;"); 179 source = newMethod(baseClass, "a", "()Ljava/lang/String;");
170 references = index.getMethodsReferencing(source); 180 references = index.getReferenceIndex().getReferencesToMethod(source);
171 assertThat(references, containsInAnyOrder( 181 assertThat(references, containsInAnyOrder(
172 newBehaviorReferenceByMethod(source, subClassAA.getName(), "a", "()Ljava/lang/String;"), 182 newBehaviorReferenceByMethod(source, subClassAA.getName(), "a", "()Ljava/lang/String;"),
173 newBehaviorReferenceByMethod(source, subClassB.getName(), "a", "()V") 183 newBehaviorReferenceByMethod(source, subClassB.getName(), "a", "()V")
@@ -175,7 +185,7 @@ public class TestJarIndexInheritanceTree {
175 185
176 // subclassAA.getName() 186 // subclassAA.getName()
177 source = newMethod(subClassAA, "a", "()Ljava/lang/String;"); 187 source = newMethod(subClassAA, "a", "()Ljava/lang/String;");
178 references = index.getMethodsReferencing(source); 188 references = index.getReferenceIndex().getReferencesToMethod(source);
179 assertThat(references, containsInAnyOrder( 189 assertThat(references, containsInAnyOrder(
180 newBehaviorReferenceByMethod(source, subClassAA.getName(), "a", "()V") 190 newBehaviorReferenceByMethod(source, subClassAA.getName(), "a", "()V")
181 )); 191 ));
@@ -183,35 +193,35 @@ public class TestJarIndexInheritanceTree {
183 193
184 @Test 194 @Test
185 public void containsEntries() { 195 public void containsEntries() {
186 196 EntryIndex entryIndex = index.getEntryIndex();
187 // classes 197 // classes
188 assertThat(index.containsObfClass(baseClass), is(true)); 198 assertThat(entryIndex.hasClass(baseClass), is(true));
189 assertThat(index.containsObfClass(subClassA), is(true)); 199 assertThat(entryIndex.hasClass(subClassA), is(true));
190 assertThat(index.containsObfClass(subClassAA), is(true)); 200 assertThat(entryIndex.hasClass(subClassAA), is(true));
191 assertThat(index.containsObfClass(subClassB), is(true)); 201 assertThat(entryIndex.hasClass(subClassB), is(true));
192 202
193 // fields 203 // fields
194 assertThat(index.containsObfField(nameField), is(true)); 204 assertThat(entryIndex.hasField(nameField), is(true));
195 assertThat(index.containsObfField(numThingsField), is(true)); 205 assertThat(entryIndex.hasField(numThingsField), is(true));
196 206
197 // methods 207 // methods
198 // getName() 208 // getName()
199 assertThat(index.containsObfMethod(newMethod(baseClass, "a", "()Ljava/lang/String;")), is(true)); 209 assertThat(entryIndex.hasMethod(newMethod(baseClass, "a", "()Ljava/lang/String;")), is(true));
200 assertThat(index.containsObfMethod(newMethod(subClassA, "a", "()Ljava/lang/String;")), is(false)); 210 assertThat(entryIndex.hasMethod(newMethod(subClassA, "a", "()Ljava/lang/String;")), is(false));
201 assertThat(index.containsObfMethod(newMethod(subClassAA, "a", "()Ljava/lang/String;")), is(true)); 211 assertThat(entryIndex.hasMethod(newMethod(subClassAA, "a", "()Ljava/lang/String;")), is(true));
202 assertThat(index.containsObfMethod(newMethod(subClassB, "a", "()Ljava/lang/String;")), is(false)); 212 assertThat(entryIndex.hasMethod(newMethod(subClassB, "a", "()Ljava/lang/String;")), is(false));
203 213
204 // doBaseThings() 214 // doBaseThings()
205 assertThat(index.containsObfMethod(newMethod(baseClass, "a", "()V")), is(true)); 215 assertThat(entryIndex.hasMethod(newMethod(baseClass, "a", "()V")), is(true));
206 assertThat(index.containsObfMethod(newMethod(subClassA, "a", "()V")), is(false)); 216 assertThat(entryIndex.hasMethod(newMethod(subClassA, "a", "()V")), is(false));
207 assertThat(index.containsObfMethod(newMethod(subClassAA, "a", "()V")), is(true)); 217 assertThat(entryIndex.hasMethod(newMethod(subClassAA, "a", "()V")), is(true));
208 assertThat(index.containsObfMethod(newMethod(subClassB, "a", "()V")), is(true)); 218 assertThat(entryIndex.hasMethod(newMethod(subClassB, "a", "()V")), is(true));
209 219
210 // doBThings() 220 // doBThings()
211 assertThat(index.containsObfMethod(newMethod(baseClass, "b", "()V")), is(false)); 221 assertThat(entryIndex.hasMethod(newMethod(baseClass, "b", "()V")), is(false));
212 assertThat(index.containsObfMethod(newMethod(subClassA, "b", "()V")), is(false)); 222 assertThat(entryIndex.hasMethod(newMethod(subClassA, "b", "()V")), is(false));
213 assertThat(index.containsObfMethod(newMethod(subClassAA, "b", "()V")), is(false)); 223 assertThat(entryIndex.hasMethod(newMethod(subClassAA, "b", "()V")), is(false));
214 assertThat(index.containsObfMethod(newMethod(subClassB, "b", "()V")), is(true)); 224 assertThat(entryIndex.hasMethod(newMethod(subClassB, "b", "()V")), is(true));
215 225
216 } 226 }
217} 227}