jaroslav@222: /** jaroslav@222: * Back 2 Browser Bytecode Translator jaroslav@222: * Copyright (C) 2012 Jaroslav Tulach jaroslav@222: * jaroslav@222: * This program is free software: you can redistribute it and/or modify jaroslav@222: * it under the terms of the GNU General Public License as published by jaroslav@222: * the Free Software Foundation, version 2 of the License. jaroslav@222: * jaroslav@222: * This program is distributed in the hope that it will be useful, jaroslav@222: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@222: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@222: * GNU General Public License for more details. jaroslav@222: * jaroslav@222: * You should have received a copy of the GNU General Public License jaroslav@222: * along with this program. Look for COPYING file in the top folder. jaroslav@222: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@222: */ jaroslav@222: package org.apidesign.vm4brwsr; jaroslav@222: jaroslav@222: import javax.script.Invocable; jaroslav@222: import org.testng.annotations.Test; jaroslav@222: import static org.testng.Assert.*; jaroslav@222: import org.testng.annotations.BeforeClass; jaroslav@222: jaroslav@222: /** jaroslav@222: * jaroslav@222: * @author Jaroslav Tulach jaroslav@222: */ jaroslav@222: public class ClassTest { jaroslav@222: jaroslav@222: @Test public void superClassEqualsGetSuperclass() { jaroslav@222: assertTrue(Classes.equalsClassesOfExceptions(), "Classes are equal"); jaroslav@222: } jaroslav@222: jaroslav@222: @Test public void jsSuperClassEqualsGetSuperclass() throws Exception { jaroslav@250: assertExec("Classes are equal", Classes.class, "equalsClassesOfExceptions__Z", Double.valueOf(1.0)); jaroslav@222: } jaroslav@222: jaroslav@222: @Test public void classesAreDifferent() { jaroslav@222: assertTrue(Classes.differenceInClasses(), "Classes are not equal"); jaroslav@222: } jaroslav@222: jaroslav@222: @Test public void jsClassesAreDifferent() throws Exception { jaroslav@250: assertExec("Classes are not equal", Classes.class, "differenceInClasses__Z", Double.valueOf(1.0)); jaroslav@222: } jaroslav@223: jaroslav@225: @Test public void javaInstanceName() throws Exception { jaroslav@225: assertEquals(Classes.classForInstance(), "java.io.IOException"); jaroslav@225: } jaroslav@225: @Test public void jsInstanceName() throws Exception { jaroslav@250: assertExec("I/O name", Classes.class, "classForInstance__Ljava_lang_String_2", "java.io.IOException"); jaroslav@225: } jaroslav@223: @Test public void javaName() throws Exception { jaroslav@223: assertEquals(Classes.name(), "java.io.IOException"); jaroslav@223: } jaroslav@223: @Test public void jsName() throws Exception { jaroslav@250: assertExec("I/O name", Classes.class, "name__Ljava_lang_String_2", "java.io.IOException"); jaroslav@223: } jaroslav@223: @Test public void javaSimpleName() throws Exception { jaroslav@223: assertEquals(Classes.simpleName(), "IOException"); jaroslav@223: } jaroslav@223: @Test public void jsGetsSimpleName() throws Exception { jaroslav@250: assertExec("I/O simple name", Classes.class, "simpleName__Ljava_lang_String_2", "IOException"); jaroslav@223: } jaroslav@223: @Test public void javaCanonicalName() { jaroslav@223: assertEquals(Classes.canonicalName(), "java.io.IOException"); jaroslav@223: } jaroslav@223: @Test public void jsCanonicalName() throws Exception { jaroslav@250: assertExec("I/O simple name", Classes.class, "canonicalName__Ljava_lang_String_2", "java.io.IOException"); jaroslav@223: } jaroslav@231: @Test public void javaNewInstance() throws Exception { jaroslav@231: assertTrue(Classes.newInstance()); jaroslav@231: } jaroslav@231: @Test public void jsNewInstance() throws Exception { jaroslav@250: assertExec("Check new instance", Classes.class, "newInstance__Z", Double.valueOf(1)); jaroslav@231: } jaroslav@397: @Test public void javaNoNewInstance() throws Exception { jaroslav@397: assertEquals("java.lang.InstantiationException:java.lang.Float", jaroslav@397: Classes.newInstanceNoPubConstructor() jaroslav@397: ); jaroslav@397: } jaroslav@397: @Test public void jsNoNewInstance() throws Exception { jaroslav@397: assertExec("Check problems with new instance", Classes.class, "newInstanceNoPubConstructor__Ljava_lang_String_2", jaroslav@397: "java.lang.InstantiationException:java.lang.Float" jaroslav@397: ); jaroslav@397: } jaroslav@235: @Test public void jsAnnotation() throws Exception { jaroslav@250: assertExec("Check class annotation", Classes.class, "getMarker__I", Double.valueOf(10)); jaroslav@235: } jaroslav@652: @Test public void jsArrayAnnotation() throws Exception { jaroslav@652: assertExec("Check array annotation", Classes.class, "getMarkerNicknames__Ljava_lang_String_2", Classes.getMarkerNicknames()); jaroslav@652: } jaroslav@653: @Test public void jsEnumAnnotation() throws Exception { jaroslav@653: assertExec("Check enum annotation", Classes.class, "getMarkerE__Ljava_lang_String_2", Classes.getMarkerE()); jaroslav@653: } jaroslav@654: @Test public void jsRetentionAnnotation() throws Exception { jaroslav@654: assertExec("Check enum annotation", Classes.class, "getRetention__Ljava_lang_String_2", Classes.getRetention()); jaroslav@654: } jaroslav@237: @Test public void jsStringAnnotation() throws Exception { jaroslav@250: assertExec("Check class annotation", Classes.class, "getNamer__Ljava_lang_String_2Z", "my text", true); jaroslav@237: } jaroslav@238: @Test public void jsStringAnnotationFromArray() throws Exception { jaroslav@250: assertExec("Check class annotation", Classes.class, "getNamer__Ljava_lang_String_2Z", "my text", false); jaroslav@238: } jaroslav@662: @Test public void jsInnerAnnotation() throws Exception { jaroslav@662: assertExec("Check inner annotation", Classes.class, "getInnerNamer__I", Double.valueOf(Classes.getInnerNamer())); jaroslav@662: } jaroslav@665: @Test public void jsInnerAnnotationFromArray() throws Exception { jaroslav@665: assertExec("Check inner annotation", Classes.class, "getInnerNamers__I", Double.valueOf(Classes.getInnerNamers())); jaroslav@665: } jaroslav@261: @Test public void javaInvokeMethod() throws Exception { jaroslav@265: assertEquals(Classes.reflectiveMethodCall(true, "name"), "java.io.IOException", "Calls the name() method via reflection"); jaroslav@261: } jaroslav@261: @Test public void jsInvokeMethod() throws Exception { jaroslav@261: assertExec("Calls the name() method via reflection", Classes.class, jaroslav@265: "reflectiveMethodCall__Ljava_lang_Object_2ZLjava_lang_String_2", jaroslav@265: "java.io.IOException", true, "name" jaroslav@264: ); jaroslav@264: } jaroslav@654: jaroslav@654: @Test public void jsMethodDeclaredInObject() throws Exception { jaroslav@654: assertExec("Defined in Object", Classes.class, jaroslav@654: "objectName__Ljava_lang_String_2", jaroslav@654: "java.lang.Object" jaroslav@654: ); jaroslav@654: } jaroslav@654: jaroslav@418: @Test public void jsInvokeParamMethod() throws Exception { jaroslav@418: assertExec("sums two numbers via reflection", Classes.class, jaroslav@418: "reflectiveSum__III", Double.valueOf(5), 2, 3 jaroslav@418: ); jaroslav@418: } jaroslav@264: @Test public void javaFindMethod() throws Exception { jaroslav@265: assertEquals(Classes.reflectiveMethodCall(false, "name"), "java.io.IOException", "Calls the name() method via reflection"); jaroslav@264: } jaroslav@264: @Test public void jsFindMethod() throws Exception { jaroslav@264: assertExec("Calls the name() method via reflection", Classes.class, jaroslav@265: "reflectiveMethodCall__Ljava_lang_Object_2ZLjava_lang_String_2", jaroslav@265: "java.io.IOException", false, "name" jaroslav@261: ); jaroslav@261: } jaroslav@354: @Test public void primitiveReturnType() throws Exception { jaroslav@354: assertExec("Tries to get an integer via reflection", Classes.class, jaroslav@355: "primitiveType__Ljava_lang_String_2Ljava_lang_String_2", jaroslav@355: Classes.primitiveType("primitive"), "primitive" jaroslav@355: ); jaroslav@355: } jaroslav@355: @Test public void primitiveBoolReturnType() throws Exception { jaroslav@355: assertExec("Tries to get an integer via reflection", Classes.class, jaroslav@355: "primitiveType__Ljava_lang_String_2Ljava_lang_String_2", jaroslav@355: Classes.primitiveType("primitiveB"), "primitiveB" jaroslav@354: ); jaroslav@354: } jaroslav@266: @Test public void javaAnnotatedMethod() throws Exception { jaroslav@266: assertEquals(Classes.reflectiveMethodCall(false, null), "java.io.IOException", "Calls the name() method via reflection"); jaroslav@266: } jaroslav@266: @Test public void jsAnnotatedMethod() throws Exception { jaroslav@266: assertExec("Calls the name() method via reflection", Classes.class, jaroslav@266: "reflectiveMethodCall__Ljava_lang_Object_2ZLjava_lang_String_2", jaroslav@266: "java.io.IOException", false, null jaroslav@266: ); jaroslav@266: } jaroslav@303: @Test public void jsClassParam() throws Exception { jaroslav@303: assertExec("Calls the nameOfIO()", Classes.class, jaroslav@303: "nameOfIO__Ljava_lang_String_2", jaroslav@303: "java.io.IOException" jaroslav@303: ); jaroslav@303: } jaroslav@355: @Test public void noInterface() throws Exception { jaroslav@355: assertExec("Calls Class.isInterface", Classes.class, jaroslav@355: "isInterface__ZLjava_lang_String_2", jaroslav@355: 0.0, "java.lang.String" jaroslav@355: ); jaroslav@355: } jaroslav@355: @Test public void isInterface() throws Exception { jaroslav@355: assertExec("Calls Class.isInterface", Classes.class, jaroslav@355: "isInterface__ZLjava_lang_String_2", jaroslav@355: 1.0, "java.lang.Runnable" jaroslav@355: ); jaroslav@355: } jaroslav@353: @Test public void integerType() throws Exception { jaroslav@353: assertExec("Computes the type", Classes.class, jaroslav@353: "intType__Ljava_lang_String_2", jaroslav@353: Classes.intType() jaroslav@353: ); jaroslav@353: } jaroslav@353: jaroslav@222: private static CharSequence codeSeq; jaroslav@222: private static Invocable code; jaroslav@222: jaroslav@222: @BeforeClass jaroslav@222: public void compileTheCode() throws Exception { jaroslav@222: if (codeSeq == null) { jaroslav@222: StringBuilder sb = new StringBuilder(); jaroslav@222: code = StaticMethodTest.compileClass(sb, "org/apidesign/vm4brwsr/Classes"); jaroslav@222: codeSeq = sb; jaroslav@222: } jaroslav@222: } jaroslav@222: jaroslav@222: private void assertExec( jaroslav@222: String msg, Class clazz, String method, Object expRes, Object... args jaroslav@222: ) throws Exception { jaroslav@222: StaticMethodTest.assertExec(code, codeSeq, msg, clazz, method, expRes, args); jaroslav@222: } jaroslav@222: jaroslav@222: }