diff --git a/pom.xml b/pom.xml index 985ec73a4d..dd910da92e 100644 --- a/pom.xml +++ b/pom.xml @@ -47,6 +47,13 @@ 4.12 test + + net.runelite.rs + api + 1.0-SNAPSHOT + test + jar + diff --git a/src/test/java/net/runelite/deob/runeloader/CheckMappings.java b/src/test/java/net/runelite/deob/runeloader/CheckMappings.java index a3aac12b78..ef7b8ffe2b 100644 --- a/src/test/java/net/runelite/deob/runeloader/CheckMappings.java +++ b/src/test/java/net/runelite/deob/runeloader/CheckMappings.java @@ -1,18 +1,115 @@ package net.runelite.deob.runeloader; +import com.google.common.base.Objects; import java.io.File; import java.io.IOException; +import java.lang.reflect.Field; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.List; +import net.runelite.deob.runeloader.inject.GetterInjectInstruction; import net.runelite.deob.runeloader.inject.InjectionModscript; +import net.runelite.mapping.ObfuscatedGetter; +import net.runelite.mapping.ObfuscatedName; +import org.junit.Assert; +import org.junit.Before; import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class CheckMappings { + private static final Logger logger = LoggerFactory.getLogger(CheckMappings.class); + private static final File CLIENT = new File("/Users/adam/w/rs/07/rs-client-1.0-SNAPSHOT.jar"); private static final File RL_INJECTION = new File("/Users/adam/w/rs/07/rl/injection.json"); + + private final List classes = new ArrayList<>(); + + @Before + public void before() throws MalformedURLException, ClassNotFoundException + { + ClassLoader loader = new URLClassLoader(new URL[] { CLIENT.toURL() }); + Class c = loader.loadClass("net.runelite.rs.client.client"); + classes.add(c); + + for (int i = 0; i < 230; ++i) + { + try + { + c = loader.loadClass("net.runelite.rs.client.class" + i); + classes.add(c); + } + catch (ClassNotFoundException ex) + { + } + } + } + + private Class findClassWithObfuscatedName(String name) + { + for (Class c : classes) + { + if (c.getName().equals("net.runelite.rs.client.client") && name.equals("client")) + return c; + + ObfuscatedName oc = (ObfuscatedName) c.getDeclaredAnnotation(ObfuscatedName.class); + if (oc == null) + continue; + + if (oc.value().equals(name)) + return c; + } + return null; + } + + private Field findFieldWithObfuscatedName(Class c, String name) + { + for (Field f : c.getDeclaredFields()) + { + ObfuscatedName oc = (ObfuscatedName) f.getDeclaredAnnotation(ObfuscatedName.class); + if (oc == null) + continue; + + if (oc.value().equals(name)) + return f; + } + return null; + } + + private Integer getIntegerMultiplier(Field f) + { + ObfuscatedGetter getter = (ObfuscatedGetter) f.getDeclaredAnnotation(ObfuscatedGetter.class); + if (getter == null) + return null; + return getter.intValue(); + } + @Test public void checkMappings() throws IOException { InjectionModscript mod = InjectionModscript.load(RL_INJECTION); + + for (int i = 0; i < mod.getGetterInjects().size(); ++i) + { + GetterInjectInstruction gii = (GetterInjectInstruction) mod.getGetterInjects().get(i); + + Class c = this.findClassWithObfuscatedName(gii.getGetterClassName()); + Assert.assertNotNull(c); + + Field f = this.findFieldWithObfuscatedName(c, gii.getGetterFieldName()); + Assert.assertNotNull(f); + + Integer mul = gii.getMultiplier(), + myMul = this.getIntegerMultiplier(f); + + if (myMul != null && myMul == 0) + myMul = null; + + Assert.assertTrue(Objects.equal(mul, myMul)); + } } } diff --git a/src/test/java/net/runelite/deob/runeloader/inject/InjectionModscript.java b/src/test/java/net/runelite/deob/runeloader/inject/InjectionModscript.java index 6e2b9c3719..d805bfa17b 100644 --- a/src/test/java/net/runelite/deob/runeloader/inject/InjectionModscript.java +++ b/src/test/java/net/runelite/deob/runeloader/inject/InjectionModscript.java @@ -9,7 +9,7 @@ import java.util.List; import org.objectweb.asm.tree.AbstractInsnNode; public class InjectionModscript { - private List getterInjects = new LinkedList(); + private List getterInjects = new LinkedList<>(); private List superChangeInjects = new LinkedList(); private List addInterfaceInjects = new LinkedList(); private List methodMods = new LinkedList();