/* * Copyright 2000-2016 JetBrains s.r.o. * * 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.intellij.codeInspection; import com.intellij.JavaTestUtil; import com.intellij.codeInsight.NullableNotNullManager; import com.intellij.codeInspection.nullable.NullableStuffInspection; import com.intellij.openapi.Disposable; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.util.Disposer; import com.intellij.testFramework.IdeaTestUtil; import com.intellij.testFramework.LightProjectDescriptor; import com.intellij.testFramework.PsiTestUtil; import com.intellij.testFramework.fixtures.DefaultLightProjectDescriptor; import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; import org.jetbrains.annotations.NotNull; public class NullableStuffInspectionTest extends LightCodeInsightFixtureTestCase { private static final DefaultLightProjectDescriptor PROJECT_DESCRIPTOR = new DefaultLightProjectDescriptor() { @Override public Sdk getSdk() { return PsiTestUtil.addJdkAnnotations(IdeaTestUtil.getMockJdk18()); } }; private NullableStuffInspection myInspection = new NullableStuffInspection(); @NotNull @Override protected LightProjectDescriptor getProjectDescriptor() { return PROJECT_DESCRIPTOR; } @Override protected String getTestDataPath() { return JavaTestUtil.getJavaTestDataPath() + "/inspection/nullableProblems/"; } private void doTest() { myFixture.enableInspections(myInspection); myFixture.testHighlighting(true, false, true, getTestName(false) + ".java"); } public void setUp() throws Exception { super.setUp(); myInspection.REPORT_ANNOTATION_NOT_PROPAGATED_TO_OVERRIDERS = false; } @Override protected void tearDown() throws Exception { myInspection = null; super.tearDown(); } public void testProblems() throws Exception{ doTest(); } public void testProblems2() throws Exception{ doTest(); } public void testNullableFieldNotnullParam() throws Exception{ doTest(); } public void testNotNullFieldNullableParam() throws Exception{ doTest(); } public void testNotNullCustomException() throws Exception{ doTest(); } public void testNotNullFieldNotInitialized() throws Exception{ doTest(); } public void testNotNullFieldInitializedInLambda() { doTest(); } public void testNotNullFieldNotInitializedInOneConstructor() { doTest(); } public void testNotNullFieldNotInitializedSetting() { myInspection.REQUIRE_NOTNULL_FIELDS_INITIALIZED = false; doTest(); } public void testNotNullByDefaultFieldNotInitialized() { DataFlowInspectionTest.addJavaxNullabilityAnnotations(myFixture); doTest(); } public void testNotNullAnnotationChecksInChildClassMethods() { doTest(); } public void testGetterSetterProblems() throws Exception{ doTest(); } public void testOverriddenMethods() throws Exception{ myInspection.REPORT_ANNOTATION_NOT_PROPAGATED_TO_OVERRIDERS = true; doTest(); } public void testOverriddenViaMethodReference() { doTest(); } public void testOverridingExternalNotNull() { doTest(); } public void testIgnoreExternalNotNull() { myInspection.IGNORE_EXTERNAL_SUPER_NOTNULL = true; doTest(); } public void testNotNullParameterOverridesNotAnnotated() { myInspection.REPORT_NOTNULL_PARAMETERS_OVERRIDES_NOT_ANNOTATED = true; doTest(); } public void testHonorSuperParameterDefault() { DataFlowInspectionTest.addJavaxNullabilityAnnotations(myFixture); DataFlowInspectionTest.addJavaxDefaultNullabilityAnnotations(myFixture); myFixture.addFileToProject("foo/package-info.java", "@javax.annotation.ParametersAreNonnullByDefault package foo;"); myFixture.addClass("package foo; import javax.annotation.*; public interface NullableFunction { void fun(@Nullable Object o); }"); myFixture.addClass("package foo; public interface AnyFunction { void fun(Object o); }"); doTest(); } public void testHonorThisParameterDefault() { DataFlowInspectionTest.addJavaxNullabilityAnnotations(myFixture); DataFlowInspectionTest.addJavaxDefaultNullabilityAnnotations(myFixture); myFixture.addFileToProject("foo/package-info.java", "@javax.annotation.ParametersAreNonnullByDefault package foo;"); myFixture.configureFromExistingVirtualFile(myFixture.copyFileToProject(getTestName(false) + ".java", "foo/Classes.java")); myFixture.enableInspections(myInspection); myFixture.checkHighlighting(true, false, true); } public void testHonorCustomDefault() { DataFlowInspectionTest.addJavaxNullabilityAnnotations(myFixture); myFixture.addClass("package foo;" + "import static java.lang.annotation.ElementType.*;" + "@javax.annotation.meta.TypeQualifierDefault({PARAMETER, FIELD, METHOD, LOCAL_VARIABLE}) " + "@javax.annotation.Nonnull " + "public @interface NotNullByDefault {}"); myFixture.addFileToProject("foo/package-info.java", "@NotNullByDefault package foo;"); myFixture.configureFromExistingVirtualFile(myFixture.copyFileToProject(getTestName(false) + ".java", "foo/Classes.java")); myFixture.enableInspections(myInspection); myFixture.checkHighlighting(true, false, true); } public void testOverrideCustomDefault() { DataFlowInspectionTest.addJavaxNullabilityAnnotations(myFixture); myFixture.addClass("package custom;" + "public @interface CheckForNull {}"); final NullableNotNullManager nnnManager = NullableNotNullManager.getInstance(getProject()); nnnManager.setNullables("custom.CheckForNull"); Disposer.register(myFixture.getTestRootDisposable(), new Disposable() { @Override public void dispose() { nnnManager.setNullables(); } }); myFixture.addClass("package foo;" + "import static java.lang.annotation.ElementType.*;" + "@javax.annotation.meta.TypeQualifierDefault(METHOD) " + "@javax.annotation.Nonnull " + "public @interface ReturnValuesAreNonnullByDefault {}"); myFixture.addFileToProject("foo/package-info.java", "@ReturnValuesAreNonnullByDefault package foo;"); myFixture.configureFromExistingVirtualFile(myFixture.copyFileToProject(getTestName(false) + ".java", "foo/Classes.java")); myFixture.enableInspections(myInspection); myFixture.checkHighlighting(true, false, true); } public void testNullPassedToNotNullParameter() { doTest(); } public void testNullPassedToNotNullConstructorParameter() { doTest(); } public void testNullPassedAsPartNotNullAnnotatedOfVarArg() { doTest(); } public void testHonorParameterDefaultInSetters() { DataFlowInspectionTest.addJavaxNullabilityAnnotations(myFixture); DataFlowInspectionTest.addJavaxDefaultNullabilityAnnotations(myFixture); myFixture.addFileToProject("foo/package-info.java", "@javax.annotation.ParametersAreNonnullByDefault package foo;"); myFixture.configureFromExistingVirtualFile(myFixture.copyFileToProject(getTestName(false) + ".java", "foo/Classes.java")); myFixture.enableInspections(myInspection); myFixture.checkHighlighting(true, false, true); } public void testBeanValidationNotNull() { myFixture.addClass("package javax.annotation.constraints; public @interface NotNull{}"); DataFlowInspection8Test.setCustomAnnotations(getProject(), getTestRootDisposable(), "javax.annotation.constraints.NotNull", "javax.annotation.constraints.Nullable"); myInspection.REPORT_ANNOTATION_NOT_PROPAGATED_TO_OVERRIDERS = true; doTest(); } public void testForeachParameterNullability() { DataFlowInspection8Test.setupTypeUseAnnotations("typeUse", myFixture); doTest(); } public void testPassingNullableCollectionWhereNotNullIsExpected() { DataFlowInspection8Test.setupTypeUseAnnotations("typeUse", myFixture); doTest(); } public void testPassingNullableMapWhereNotNullIsExpected() { DataFlowInspection8Test.setupTypeUseAnnotations("typeUse", myFixture); doTest(); } public void testNotNullCollectionItemWithNullableSuperType() { DataFlowInspection8Test.setupTypeUseAnnotations("typeUse", myFixture); doTest(); } }