Java tutorial
/******************************************************************************* * Copyright (c) 2011 GK Software AG and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Stephan Herrmann - initial API and implementation *******************************************************************************/ package org.eclipse.objectteams.jdt.nullity.tests; import java.io.IOException; import java.net.URL; import junit.framework.Test; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.Platform; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.tests.model.ReconcilerTests; import org.eclipse.objectteams.internal.jdt.nullity.NullCompilerOptions; public class NullAnnotationModelTests extends ReconcilerTests { String ANNOTATION_LIB; public static Test suite() { return buildModelTestSuite(NullAnnotationModelTests.class); } public NullAnnotationModelTests(String name) { super(name); } static { // TESTS_NAMES = new String[] { "testConvertedSourceType1" }; } @Override public void setUp() throws Exception { super.setUp(); ANNOTATION_LIB = testJarPath("nullAnnotations.jar"); } protected String testJarPath(String jarName) throws IOException { URL libEntry = Platform.getBundle("org.eclipse.objectteams.jdt.nullity.tests").getEntry("/lib/" + jarName); return FileLocator.toFileURL(libEntry).getPath(); } public void testConvertedSourceType1() throws CoreException, InterruptedException { try { // Resources creation IJavaProject p = createJavaProject("P", new String[] { "" }, new String[] { "JCL15_LIB", ANNOTATION_LIB }, "bin", "1.5"); p.setOption(NullCompilerOptions.OPTION_AnnotationBasedNullAnalysis, JavaCore.ENABLED); p.setOption(NullCompilerOptions.OPTION_NonNullIsDefault, NullCompilerOptions.ENABLED); this.createFolder("/P/p1"); String c1SourceString = "package p1;\n" + "import org.eclipse.jdt.annotation.*;\n" + "public class C1 {\n" + " public String foo(@Nullable Object arg) {\n" + // this is consumed via SourceTypeConverter " return arg == null ? \"\" : arg.toString();\n" + " }\n" + "}\n"; this.createFile("/P/p1/C1.java", c1SourceString); this.createFolder("/P/p2"); String c2SourceString = "package p2;\n" + "public class C2 {\n" + " String bar(p1.C1 c, C2 c2) {;\n" + " return c.foo(null);\n" + // don't complain despite default nonnull, foo has explicit @Nullable " }\n" + " String foo(Object arg) {\n" + " return arg == null ? null : arg.toString();\n" + " }\n" + "}\n"; this.createFile("/P/p2/C2.java", c2SourceString); char[] c2SourceChars = c2SourceString.toCharArray(); this.problemRequestor.initialize(c2SourceChars); getCompilationUnit("/P/p2/C2.java").getWorkingCopy(this.wcOwner, null); assertProblems("Unexpected problems", "----------\n" + "1. WARNING in /P/p2/C2.java (at line 7)\n" + " return arg == null ? null : arg.toString();\n" + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + "Potential type mismatch: required \'@NonNull String\' but nullness of the provided value is unknown\n" + "----------\n"); } finally { deleteProject("P"); } } public void testBinaryType1() throws CoreException, InterruptedException, IOException { try { // Resources creation IJavaProject p = createJavaProject("P", new String[] { "" }, new String[] { "JCL15_LIB", ANNOTATION_LIB, testJarPath("example.jar") }, "bin", "1.5"); p.setOption(NullCompilerOptions.OPTION_AnnotationBasedNullAnalysis, JavaCore.ENABLED); p.setOption(NullCompilerOptions.OPTION_NonNullIsDefault, NullCompilerOptions.ENABLED); // example.jar contains p1/C1.java just like testConvertedSourceType1() this.createFolder("/P/p2"); String c2SourceString = "package p2;\n" + "public class C2 {\n" + " String bar(p1.C1 c) {;\n" + " return c.foo(null);\n" + // don't complain despite default nonnull, foo has explicit @Nullable " }\n" + " String foo(Object arg) {\n" + " return arg == null ? null : arg.toString();\n" + " }\n" + "}\n"; this.createFile("/P/p2/C2.java", c2SourceString); char[] c2SourceChars = c2SourceString.toCharArray(); this.problemRequestor.initialize(c2SourceChars); getCompilationUnit("/P/p2/C2.java").getWorkingCopy(this.wcOwner, null); assertProblems("Unexpected problems", "----------\n" + "1. WARNING in /P/p2/C2.java (at line 7)\n" + " return arg == null ? null : arg.toString();\n" + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + "Potential type mismatch: required \'@NonNull String\' but nullness of the provided value is unknown\n" + "----------\n"); } finally { deleteProject("P"); } } }