From 6736d9aac3e7d1591cba33852126abf79dd18a57 Mon Sep 17 00:00:00 2001 From: jeff Date: Sun, 14 Sep 2014 21:54:58 -0400 Subject: added test to check constructor references --- build.gradle | 12 +- .../enigma/TestJarIndexConstructorReferences.java | 129 +++++++++++++++++++++ .../enigma/inputs/constructors/BaseClass.java | 17 +++ test/cuchaz/enigma/inputs/constructors/Caller.java | 47 ++++++++ .../enigma/inputs/constructors/SubClass.java | 31 +++++ .../enigma/inputs/constructors/SubSubClass.java | 12 ++ 6 files changed, 246 insertions(+), 2 deletions(-) create mode 100644 test/cuchaz/enigma/TestJarIndexConstructorReferences.java create mode 100644 test/cuchaz/enigma/inputs/constructors/BaseClass.java create mode 100644 test/cuchaz/enigma/inputs/constructors/Caller.java create mode 100644 test/cuchaz/enigma/inputs/constructors/SubClass.java create mode 100644 test/cuchaz/enigma/inputs/constructors/SubSubClass.java diff --git a/build.gradle b/build.gradle index 1029429..767b032 100644 --- a/build.gradle +++ b/build.gradle @@ -82,8 +82,16 @@ task jarInheritanceTree( type: Jar ) { archiveName( "testInheritanceTree.jar" ) } +task jarConstructors( type: Jar ) { + from( sourceSets.test.output ) { + include( "cuchaz/enigma/inputs/Keep.class" ) + include( "cuchaz/enigma/inputs/constructors/**" ) + } + archiveName( "testConstructors.jar" ) +} + task obfTestCases( type: proguard.gradle.ProGuardTask ) { - dependsOn jarLoneClass, jarInheritanceTree + dependsOn jarLoneClass, jarInheritanceTree, jarConstructors libraryjars( "${System.getProperty('java.home')}/lib/rt.jar" ) overloadaggressively @@ -94,7 +102,7 @@ task obfTestCases( type: proguard.gradle.ProGuardTask ) { keep( "class cuchaz.enigma.inputs.Keep" ) - def jarNames = [ "LoneClass", "InheritanceTree" ]; + def jarNames = [ "LoneClass", "InheritanceTree", "Constructors" ]; jarNames.each() { injars( "build/libs/test${it}.jar" ) outjars( "build/libs/test${it}.obf.jar" ) diff --git a/test/cuchaz/enigma/TestJarIndexConstructorReferences.java b/test/cuchaz/enigma/TestJarIndexConstructorReferences.java new file mode 100644 index 0000000..38882a0 --- /dev/null +++ b/test/cuchaz/enigma/TestJarIndexConstructorReferences.java @@ -0,0 +1,129 @@ +/******************************************************************************* + * Copyright (c) 2014 Jeff Martin. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Public License v3.0 + * which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/gpl.html + * + * Contributors: + * Jeff Martin - initial API and implementation + ******************************************************************************/ +package cuchaz.enigma; + +import static cuchaz.enigma.EntryFactory.newBehaviorReferenceByConstructor; +import static cuchaz.enigma.EntryFactory.newBehaviorReferenceByMethod; +import static cuchaz.enigma.EntryFactory.newClass; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.is; + +import java.util.jar.JarFile; + +import org.junit.Test; + +import cuchaz.enigma.analysis.JarIndex; +import cuchaz.enigma.mapping.BehaviorEntry; +import cuchaz.enigma.mapping.ClassEntry; +import cuchaz.enigma.mapping.ConstructorEntry; + +public class TestJarIndexConstructorReferences +{ + private JarIndex m_index; + + private ClassEntry m_baseClass = new ClassEntry( "none/a" ); + private ClassEntry m_subClass = new ClassEntry( "none/c" ); + private ClassEntry m_subsubClass = new ClassEntry( "none/d" ); + private ClassEntry m_callerClass = new ClassEntry( "none/b" ); + + public TestJarIndexConstructorReferences( ) + throws Exception + { + m_index = new JarIndex(); + m_index.indexJar( new JarFile( "build/libs/testConstructors.obf.jar" ), false ); + } + + @Test + public void obfEntries( ) + { + assertThat( m_index.getObfClassEntries(), containsInAnyOrder( + newClass( "cuchaz/enigma/inputs/Keep" ), + m_baseClass, + m_subClass, + m_subsubClass, + m_callerClass + ) ); + } + + @Test + @SuppressWarnings( "unchecked" ) + public void baseDefault( ) + { + BehaviorEntry source = new ConstructorEntry( m_baseClass, "()V" ); + assertThat( m_index.getBehaviorReferences( source ), containsInAnyOrder( + newBehaviorReferenceByMethod( source, m_callerClass.getName(), "a", "()V" ), + newBehaviorReferenceByConstructor( source, m_subClass.getName(), "()V" ), + newBehaviorReferenceByConstructor( source, m_subClass.getName(), "(III)V" ) + ) ); + } + + @Test + @SuppressWarnings( "unchecked" ) + public void baseInt( ) + { + BehaviorEntry source = new ConstructorEntry( m_baseClass, "(I)V" ); + assertThat( m_index.getBehaviorReferences( source ), containsInAnyOrder( + newBehaviorReferenceByMethod( source, m_callerClass.getName(), "b", "()V" ) + ) ); + } + + @Test + @SuppressWarnings( "unchecked" ) + public void subDefault( ) + { + BehaviorEntry source = new ConstructorEntry( m_subClass, "()V" ); + assertThat( m_index.getBehaviorReferences( source ), containsInAnyOrder( + newBehaviorReferenceByMethod( source, m_callerClass.getName(), "c", "()V" ), + newBehaviorReferenceByConstructor( source, m_subClass.getName(), "(I)V" ) + ) ); + } + + @Test + @SuppressWarnings( "unchecked" ) + public void subInt( ) + { + BehaviorEntry source = new ConstructorEntry( m_subClass, "(I)V" ); + assertThat( m_index.getBehaviorReferences( source ), containsInAnyOrder( + newBehaviorReferenceByMethod( source, m_callerClass.getName(), "d", "()V" ), + newBehaviorReferenceByConstructor( source, m_subClass.getName(), "(II)V" ), + newBehaviorReferenceByConstructor( source, m_subsubClass.getName(), "(I)V" ) + ) ); + } + + @Test + @SuppressWarnings( "unchecked" ) + public void subIntInt( ) + { + BehaviorEntry source = new ConstructorEntry( m_subClass, "(II)V" ); + assertThat( m_index.getBehaviorReferences( source ), containsInAnyOrder( + newBehaviorReferenceByMethod( source, m_callerClass.getName(), "e", "()V" ) + ) ); + } + + @Test + public void subIntIntInt( ) + { + BehaviorEntry source = new ConstructorEntry( m_subClass, "(III)V" ); + assertThat( m_index.getBehaviorReferences( source ), is( empty() ) ); + } + + @Test + @SuppressWarnings( "unchecked" ) + public void subsubInt( ) + { + BehaviorEntry source = new ConstructorEntry( m_subsubClass, "(I)V" ); + assertThat( m_index.getBehaviorReferences( source ), containsInAnyOrder( + newBehaviorReferenceByMethod( source, m_callerClass.getName(), "f", "()V" ) + ) ); + } +} diff --git a/test/cuchaz/enigma/inputs/constructors/BaseClass.java b/test/cuchaz/enigma/inputs/constructors/BaseClass.java new file mode 100644 index 0000000..e6d8768 --- /dev/null +++ b/test/cuchaz/enigma/inputs/constructors/BaseClass.java @@ -0,0 +1,17 @@ +package cuchaz.enigma.inputs.constructors; + +// none/a +public class BaseClass +{ + // ()V + public BaseClass( ) + { + System.out.println( "Default constructor" ); + } + + // (I)V + public BaseClass( int i ) + { + System.out.println( "Int constructor " + i ); + } +} diff --git a/test/cuchaz/enigma/inputs/constructors/Caller.java b/test/cuchaz/enigma/inputs/constructors/Caller.java new file mode 100644 index 0000000..f356b1b --- /dev/null +++ b/test/cuchaz/enigma/inputs/constructors/Caller.java @@ -0,0 +1,47 @@ +package cuchaz.enigma.inputs.constructors; + +// none/b +public class Caller +{ + // a()V + public void callBaseDefault( ) + { + // none/a.()V + System.out.println( new BaseClass() ); + } + + // b()V + public void callBaseInt( ) + { + // none/a.(I)V + System.out.println( new BaseClass( 5 ) ); + } + + // c()V + public void callSubDefault( ) + { + // none/c.()V + System.out.println( new SubClass() ); + } + + // d()V + public void callSubInt( ) + { + // none/c.(I)V + System.out.println( new SubClass( 6 ) ); + } + + // e()V + public void callSubIntInt( ) + { + // none/c.(II)V + System.out.println( new SubClass( 4, 2 ) ); + } + + // f()V + public void callSubSubInt( ) + { + // none/d.(I)V + System.out.println( new SubSubClass( 3 ) ); + } +} diff --git a/test/cuchaz/enigma/inputs/constructors/SubClass.java b/test/cuchaz/enigma/inputs/constructors/SubClass.java new file mode 100644 index 0000000..2235de3 --- /dev/null +++ b/test/cuchaz/enigma/inputs/constructors/SubClass.java @@ -0,0 +1,31 @@ +package cuchaz.enigma.inputs.constructors; + +// none/c extends none/a +public class SubClass extends BaseClass +{ + // ()V + public SubClass( ) + { + // none/a.()V + } + + // (I)V + public SubClass( int num ) + { + // ()V + this(); + System.out.println( "SubClass " + num ); + } + + // (II)V + public SubClass( int a, int b ) + { + // (I)V + this( a + b ); + } + + public SubClass( int a, int b, int c ) + { + // none/a.()V + } +} diff --git a/test/cuchaz/enigma/inputs/constructors/SubSubClass.java b/test/cuchaz/enigma/inputs/constructors/SubSubClass.java new file mode 100644 index 0000000..a9445d8 --- /dev/null +++ b/test/cuchaz/enigma/inputs/constructors/SubSubClass.java @@ -0,0 +1,12 @@ +package cuchaz.enigma.inputs.constructors; + +// none/d extends none/c +public class SubSubClass extends SubClass +{ + // (I)V + public SubSubClass( int i ) + { + // none/c.(I)V + super( i ); + } +} -- cgit v1.2.3