/* * Copyright 2011 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.devtools.j2objc; import com.google.devtools.j2objc.util.HeaderMap; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.List; /** * Tests for {@link com.google.devtools.j2objc.J2ObjC#run(List)}. */ public class J2ObjCTest extends GenerationTest { String jarPath; String exampleJavaPath; String packageInfoPath; private static final String EXAMPLE_JAVA_SOURCE = "package com.google.devtools.j2objc.annotations;\n\n" + "import com.google.j2objc.annotations.ObjectiveCName;\n\n" + "@ObjectiveCName(\"foo\")\n" + "public class Example {\n" + "}\n"; @Override public void setUp() throws IOException { super.setUp(); List<String> classpathEntries = options.fileUtil().getClassPathEntries(); for (String entry : getComGoogleDevtoolsJ2objcPath()) { classpathEntries.add(entry); } jarPath = getResourceAsFile("util/example.jar"); exampleJavaPath = "com/google/devtools/j2objc/util/Example.java"; packageInfoPath = "com/google/devtools/j2objc/util/package-info.java"; addSourceFile( "package com.google.devtools.j2objc.util; public class Example {}", exampleJavaPath); addSourceFile( "@ObjectiveCName(\"CBT\")\n" + "package com.google.devtools.j2objc.util;\n" + "import com.google.j2objc.annotations.ObjectiveCName;", packageInfoPath); } // No assertions for packageInfoH--nothing interesting in it that other tests don't assert. private void makeAssertions(String exampleH, String exampleM, String packageInfoM) throws Exception { // These assertions should hold for any generated files, including (in the future) // combined jar generation. assertTranslation(exampleH, "Generated by the J2ObjC translator."); assertTranslation(exampleH, "interface CBTExample : NSObject"); assertTranslation(exampleH, "- (instancetype)init;"); assertTranslation(exampleH, "J2OBJC_EMPTY_STATIC_INIT(CBTExample)"); assertTranslation(exampleH, "J2OBJC_TYPE_LITERAL_HEADER(CBTExample)"); assertTranslation(exampleM, "@implementation CBTExample"); assertTranslation(exampleM, "- (instancetype)init {"); assertTranslation(exampleM, "+ (const J2ObjcClassInfo *)__metadata {"); assertTranslation(exampleM, "J2OBJC_CLASS_TYPE_LITERAL_SOURCE(CBTExample)"); assertTranslatedLines(packageInfoM, "+ (NSString *)__prefix {", " return @\"CBT\";", "}"); assertErrorCount(0); } private void makeAssertionsForJar() throws Exception { String exampleH = getTranslatedFile("com/google/test/Example.h"); String exampleM = getTranslatedFile("com/google/test/Example.m"); String packageInfoH = getTranslatedFile("com/google/test/package-info.h"); String packageInfoM = getTranslatedFile("com/google/test/package-info.m"); // Test the file header comments. assertTranslation(exampleH, "source: jar:file:"); assertTranslation(exampleM, "source: jar:file:"); assertTranslation(packageInfoH, "source: jar:file:"); assertTranslation(packageInfoM, "source: jar:file:"); assertTranslation(exampleH, jarPath); assertTranslation(exampleM, jarPath); assertTranslation(packageInfoH, jarPath); assertTranslation(packageInfoM, jarPath); assertTranslation(exampleH, "com/google/test/Example.java"); assertTranslation(exampleM, "com/google/test/Example.java"); assertTranslation(packageInfoH, "com/google/test/package-info.java"); assertTranslation(packageInfoM, "com/google/test/package-info.java"); assertNotInTranslation(packageInfoH, "J2ObjCTempDir"); assertNotInTranslation(packageInfoM, "J2ObjCTempDir"); // Test the includes assertTranslation(exampleH, "#pragma push_macro(\"INCLUDE_ALL_ComGoogleTestExample\")"); assertTranslation(exampleM, "#include \"com/google/test/Example.h\""); assertTranslation( packageInfoH, "#pragma push_macro(\"INCLUDE_ALL_ComGoogleTestPackage_info\")"); assertTranslation(packageInfoM, "@interface ComGoogleTestpackage_info : NSObject"); assertTranslation(packageInfoM, "@implementation ComGoogleTestpackage_info"); // All other assertions makeAssertions(exampleH, exampleM, packageInfoM); } public void testCompilingFromJar() throws Exception { J2ObjC.run(Collections.singletonList(jarPath), options); makeAssertionsForJar(); } public void testBatchCompilingFromJar() throws Exception { options.setBatchTranslateMaximum(2); J2ObjC.run(Collections.singletonList(jarPath), options); makeAssertionsForJar(); } // Make assertions for java files with default output locations. private void makeAssertionsForJavaFiles() throws Exception { String exampleH = getTranslatedFile("com/google/devtools/j2objc/util/Example.h"); String exampleM = getTranslatedFile("com/google/devtools/j2objc/util/Example.m"); String packageInfoH = getTranslatedFile("com/google/devtools/j2objc/util/package-info.h"); String packageInfoM = getTranslatedFile("com/google/devtools/j2objc/util/package-info.m"); assertTranslation(exampleM, "#include \"com/google/devtools/j2objc/util/Example.h\""); makeAssertionsForJavaFiles(exampleH, exampleM, packageInfoH, packageInfoM); } private void makeAssertionsForJavaFiles( String exampleH, String exampleM, String packageInfoH, String packageInfoM) throws Exception { // Test the file header comments. assertTranslation(exampleH, exampleJavaPath); assertTranslation(exampleM, exampleJavaPath); assertTranslation(packageInfoH, packageInfoPath); assertTranslation(packageInfoM, packageInfoPath); // Test the includes assertTranslation( exampleH, "#pragma push_macro(\"INCLUDE_ALL_ComGoogleDevtoolsJ2objcUtilExample\")"); assertTranslation( packageInfoM, "@interface ComGoogleDevtoolsJ2objcUtilpackage_info : NSObject"); assertTranslation(packageInfoH, "#pragma push_macro(\"INCLUDE_ALL_ComGoogleDevtoolsJ2objcUtilPackage_info\")"); assertTranslation(packageInfoM, "@implementation ComGoogleDevtoolsJ2objcUtilpackage_info"); // All other assertions makeAssertions(exampleH, exampleM, packageInfoM); } public void testCompilingFromFiles() throws Exception { J2ObjC.run(Arrays.asList(exampleJavaPath, packageInfoPath), options); makeAssertionsForJavaFiles(); } public void testBatchCompilingFromFiles() throws Exception { options.setBatchTranslateMaximum(2); J2ObjC.run(Arrays.asList(exampleJavaPath, packageInfoPath), options); makeAssertionsForJavaFiles(); } private void makeAssertionsForCombinedJar() throws Exception { String combinedH = getTranslatedFile(jarPath.replace(".jar", ".h")); String combinedM = getTranslatedFile(jarPath.replace(".jar", ".m")); makeAssertions(combinedH, combinedM, combinedM); } public void testCombinedJar() throws Exception { options.getHeaderMap().setCombineJars(); J2ObjC.run(Collections.singletonList(jarPath), options); makeAssertionsForCombinedJar(); } public void testSourceDirsOption() throws Exception { options.getHeaderMap().setOutputStyle(HeaderMap.OutputStyleOption.SOURCE); J2ObjC.run(Arrays.asList(exampleJavaPath, packageInfoPath), options); String exampleH = getTranslatedFile(exampleJavaPath.replace(".java", ".h")); String exampleM = getTranslatedFile(exampleJavaPath.replace(".java", ".m")); String packageInfoH = getTranslatedFile(packageInfoPath.replace(".java", ".h")); String packageInfoM = getTranslatedFile(packageInfoPath.replace(".java", ".m")); makeAssertionsForJavaFiles(exampleH, exampleM, packageInfoH, packageInfoM); } // Test a simple annotation processor on the classpath. public void testAnnotationProcessing() throws Exception { String processorPath = getResourceAsFile("annotations/Processor.jar"); options.fileUtil().getClassPathEntries().add(processorPath); String examplePath = addSourceFile(EXAMPLE_JAVA_SOURCE, "annotations/Example.java"); J2ObjC.run(Collections.singletonList(examplePath), options); assertErrorCount(0); String translatedAnnotationHeader = getTranslatedFile("ProcessingResult.h"); String translatedAnnotationImpl = getTranslatedFile("ProcessingResult.m"); // Our dummy annotation processor is very simple--it always creates a class with no package, // ProcessingResult, with a minimal implementation. assertTranslation(translatedAnnotationHeader, "@interface ProcessingResult : NSObject"); assertTranslation(translatedAnnotationHeader, "- (NSString *)getResult;"); assertTranslation(translatedAnnotationImpl, "@implementation ProcessingResult"); assertTranslation(translatedAnnotationImpl, "return @\"ObjectiveCName\""); } // Test a simple annotation processor on the processor path. public void testAnnotationProcessingWithProcessorPath() throws Exception { String processorPath = getResourceAsFile("annotations/Processor.jar"); options.getProcessorPathEntries().add(processorPath); String examplePath = addSourceFile(EXAMPLE_JAVA_SOURCE, "annotations/Example.java"); J2ObjC.run(Collections.singletonList(examplePath), options); assertErrorCount(0); } // Test a specified annotation processor. public void testSpecifiedAnnotationProcessing() throws Exception { String processorPath = getResourceAsFile("annotations/Processor.jar"); options.fileUtil().getClassPathEntries().add(processorPath); options.setProcessors("com.google.devtools.j2objc.annotations.J2ObjCTestProcessor"); String examplePath = addSourceFile(EXAMPLE_JAVA_SOURCE, "annotations/Example.java"); J2ObjC.run(Collections.singletonList(examplePath), options); assertErrorCount(0); } // Test for warning if compiling jar with -g. public void testJarSourceDebug() throws Exception { options.setEmitLineDirectives(true); J2ObjC.run(Collections.singletonList(jarPath), options); assertWarningCount(1); } }