/******************************************************************************* * 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.*; import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.Matchers.*; import java.util.Collection; import java.util.Set; import java.util.jar.JarFile; import org.junit.Test; import cuchaz.enigma.analysis.Access; import cuchaz.enigma.analysis.ClassImplementationsTreeNode; import cuchaz.enigma.analysis.ClassInheritanceTreeNode; import cuchaz.enigma.analysis.EntryReference; import cuchaz.enigma.analysis.JarIndex; import cuchaz.enigma.analysis.MethodImplementationsTreeNode; import cuchaz.enigma.analysis.MethodInheritanceTreeNode; import cuchaz.enigma.mapping.BehaviorEntry; import cuchaz.enigma.mapping.FieldEntry; import cuchaz.enigma.mapping.MethodEntry; import cuchaz.enigma.mapping.Translator; public class TestJarIndexLoneClass { private JarIndex m_index; public TestJarIndexLoneClass( ) throws Exception { m_index = new JarIndex(); m_index.indexJar( new JarFile( "build/libs/testLoneClass.obf.jar" ), false ); } @Test public void obfEntries( ) { assertThat( m_index.getObfClassEntries(), containsInAnyOrder( newClass( "cuchaz/enigma/inputs/Keep" ), newClass( "none/a" ) ) ); } @Test public void translationIndex( ) { assertThat( m_index.getTranslationIndex().getSuperclassName( "none/a" ), is( nullValue() ) ); assertThat( m_index.getTranslationIndex().getSuperclassName( "cuchaz/enigma/inputs/Keep" ), is( nullValue() ) ); assertThat( m_index.getTranslationIndex().getAncestry( "none/a" ), is( empty() ) ); assertThat( m_index.getTranslationIndex().getAncestry( "cuchaz/enigma/inputs/Keep" ), is( empty() ) ); assertThat( m_index.getTranslationIndex().getSubclassNames( "none/a" ), is( empty() ) ); assertThat( m_index.getTranslationIndex().getSubclassNames( "cuchaz/enigma/inputs/Keep" ), is( empty() ) ); } @Test public void access( ) { assertThat( m_index.getAccess( newField( "none/a", "a" ) ), is( Access.Private ) ); assertThat( m_index.getAccess( newMethod( "none/a", "a", "()Ljava/lang/String;" ) ), is( Access.Public ) ); assertThat( m_index.getAccess( newField( "none/a", "b" ) ), is( nullValue() ) ); } @Test public void classInheritance( ) { ClassInheritanceTreeNode node = m_index.getClassInheritance( new Translator(), newClass( "none/a" ) ); assertThat( node, is( not( nullValue() ) ) ); assertThat( node.getObfClassName(), is( "none/a" ) ); assertThat( node.getChildCount(), is( 0 ) ); } @Test public void methodInheritance( ) { MethodEntry source = newMethod( "none/a", "a", "()Ljava/lang/String;" ); MethodInheritanceTreeNode node = m_index.getMethodInheritance( new Translator(), source ); assertThat( node, is( not( nullValue() ) ) ); assertThat( node.getMethodEntry(), is( source ) ); assertThat( node.getChildCount(), is( 0 ) ); } @Test public void classImplementations( ) { ClassImplementationsTreeNode node = m_index.getClassImplementations( new Translator(), newClass( "none/a" ) ); assertThat( node, is( nullValue() ) ); } @Test public void methodImplementations( ) { MethodEntry source = newMethod( "none/a", "a", "()Ljava/lang/String;" ); MethodImplementationsTreeNode node = m_index.getMethodImplementations( new Translator(), source ); assertThat( node, is( nullValue() ) ); } @Test public void relatedMethodImplementations( ) { Set entries = m_index.getRelatedMethodImplementations( newMethod( "none/a", "a", "()Ljava/lang/String;" ) ); assertThat( entries, containsInAnyOrder( newMethod( "none/a", "a", "()Ljava/lang/String;" ) ) ); } @Test @SuppressWarnings( "unchecked" ) public void fieldReferences( ) { FieldEntry source = newField( "none/a", "a" ); Collection> references = m_index.getFieldReferences( source ); assertThat( references, containsInAnyOrder( newFieldReferenceByConstructor( source, "none/a", "(Ljava/lang/String;)V" ), newFieldReferenceByMethod( source, "none/a", "a", "()Ljava/lang/String;" ) ) ); } @Test public void behaviorReferences( ) { assertThat( m_index.getBehaviorReferences( newMethod( "none/a", "a", "()Ljava/lang/String;" ) ), is( empty() ) ); } @Test public void innerClasses( ) { assertThat( m_index.getInnerClasses( "none/a" ), is( empty() ) ); } @Test public void outerClass( ) { assertThat( m_index.getOuterClass( "a" ), is( nullValue() ) ); } @Test public void isAnonymousClass( ) { assertThat( m_index.isAnonymousClass( "none/a" ), is( false ) ); } @Test public void interfaces( ) { assertThat( m_index.getInterfaces( "none/a" ), is( empty() ) ); } @Test public void implementingClasses( ) { assertThat( m_index.getImplementingClasses( "none/a" ), is( empty() ) ); } @Test public void isInterface( ) { assertThat( m_index.isInterface( "none/a" ), is( false ) ); } @Test public void bridgeMethods( ) { assertThat( m_index.getBridgeMethod( newMethod( "none/a", "a", "()Ljava/lang/String;" ) ), is( nullValue() ) ); } @Test public void contains( ) { assertThat( m_index.containsObfClass( newClass( "none/a" ) ), is( true ) ); assertThat( m_index.containsObfClass( newClass( "none/b" ) ), is( false ) ); assertThat( m_index.containsObfField( newField( "none/a", "a" ) ), is( true ) ); assertThat( m_index.containsObfField( newField( "none/a", "b" ) ), is( false ) ); assertThat( m_index.containsObfBehavior( newMethod( "none/a", "a", "()Ljava/lang/String;" ) ), is( true ) ); assertThat( m_index.containsObfBehavior( newMethod( "none/a", "b", "()Ljava/lang/String;" ) ), is( false ) ); } }