From f99269157deb0fcf48f3ef887a0564ed90e00ea6 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Wed, 9 May 2018 15:17:37 +0200 Subject: [PATCH] junit 5: warn for static nested classes annotated with @Nested (IDEA-187572) --- .../siyeh/InspectionGadgetsBundle.properties | 3 +- plugins/junit/src/META-INF/plugin.xml | 5 +++ .../JUnit5MalformedNestedClassInspection.kt | 33 +++++++++++++++++++ .../JUnit5MalformedNestedClass.html | 8 +++++ .../JUnit5MalformedNestedClassTest.kt | 32 ++++++++++++++++++ .../malformedNested/Malformed.java | 4 +++ 6 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 plugins/junit/src/com/intellij/execution/junit/codeInsight/JUnit5MalformedNestedClassInspection.kt create mode 100644 plugins/junit/src/inspectionDescriptions/JUnit5MalformedNestedClass.html create mode 100644 plugins/junit/test/com/intellij/execution/junit/codeInsight/JUnit5MalformedNestedClassTest.kt create mode 100644 plugins/junit/testData/codeInsight/malformedNested/Malformed.java diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties index 6bc90de67fd6..814c36076066 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties @@ -2282,4 +2282,5 @@ inspection.list.remove.in.loop.fix.family.name=Replace with 'List.subList().clea inspection.serializable.can.have.default.serial.uid='Serializable' can have default generated 'serialVersionUID' inspection.serializable.can.have.default.serial.uid.message='serialVersionUID' differs from default generated -inspection.serializable.can.have.default.serial.uid.fix.name=Change 'serialVersionUID' to generated by signature \ No newline at end of file +inspection.serializable.can.have.default.serial.uid.fix.name=Change 'serialVersionUID' to generated by signature +junit5.nested.test.display.name=JUnit 5 malformed @Nested class \ No newline at end of file diff --git a/plugins/junit/src/META-INF/plugin.xml b/plugins/junit/src/META-INF/plugin.xml index 115c3b43cdb7..458f185e3dab 100644 --- a/plugins/junit/src/META-INF/plugin.xml +++ b/plugins/junit/src/META-INF/plugin.xml @@ -92,6 +92,11 @@ groupBundle="messages.InspectionsBundle" groupKey="group.names.junit.issues" enabledByDefault="true" level="WARNING" implementationClass="com.intellij.execution.junit.codeInsight.JUnit5MalformedRepeatedTestInspection"/> + + diff --git a/plugins/junit/src/com/intellij/execution/junit/codeInsight/JUnit5MalformedNestedClassInspection.kt b/plugins/junit/src/com/intellij/execution/junit/codeInsight/JUnit5MalformedNestedClassInspection.kt new file mode 100644 index 000000000000..d32bec2979c4 --- /dev/null +++ b/plugins/junit/src/com/intellij/execution/junit/codeInsight/JUnit5MalformedNestedClassInspection.kt @@ -0,0 +1,33 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.execution.junit.codeInsight + +import com.intellij.codeInspection.IntentionWrapper +import com.intellij.codeInspection.ProblemHighlightType +import com.intellij.lang.jvm.DefaultJvmElementVisitor +import com.intellij.lang.jvm.JvmClass +import com.intellij.lang.jvm.JvmElementVisitor +import com.intellij.lang.jvm.JvmModifier +import com.intellij.lang.jvm.actions.MemberRequest +import com.intellij.lang.jvm.actions.createModifierActions +import com.intellij.lang.jvm.inspection.JvmLocalInspection +import com.intellij.openapi.project.Project +import com.siyeh.ig.junit.JUnitCommonClassNames + +class JUnit5MalformedNestedClassInspection : JvmLocalInspection() { + override fun buildVisitor(project: Project, sink: JvmLocalInspection.HighlightSink, isOnTheFly: Boolean): JvmElementVisitor? { + return object : DefaultJvmElementVisitor { + override fun visitClass(clazz: JvmClass): Boolean { + if (clazz.containingClass != null && + clazz.hasModifier(JvmModifier.STATIC) && + clazz.hasAnnotation(JUnitCommonClassNames.ORG_JUNIT_JUPITER_API_NESTED)) { + + val fixes = createModifierActions(clazz, MemberRequest.Modifier(JvmModifier.STATIC, false)).toTypedArray() + sink.highlight("Only non-static nested classes can serve as @Nested test classes.", + ProblemHighlightType.GENERIC_ERROR_OR_WARNING, + *IntentionWrapper.wrapToQuickFixes(fixes, clazz.sourceElement!!.containingFile)) + } + return true + } + } + } +} \ No newline at end of file diff --git a/plugins/junit/src/inspectionDescriptions/JUnit5MalformedNestedClass.html b/plugins/junit/src/inspectionDescriptions/JUnit5MalformedNestedClass.html new file mode 100644 index 000000000000..d9e8e9e15a59 --- /dev/null +++ b/plugins/junit/src/inspectionDescriptions/JUnit5MalformedNestedClass.html @@ -0,0 +1,8 @@ + + +Reports static inner classes annotated with @Nested. + +

+ New in 2018.2 + + \ No newline at end of file diff --git a/plugins/junit/test/com/intellij/execution/junit/codeInsight/JUnit5MalformedNestedClassTest.kt b/plugins/junit/test/com/intellij/execution/junit/codeInsight/JUnit5MalformedNestedClassTest.kt new file mode 100644 index 000000000000..42e45688f65d --- /dev/null +++ b/plugins/junit/test/com/intellij/execution/junit/codeInsight/JUnit5MalformedNestedClassTest.kt @@ -0,0 +1,32 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.execution.junit.codeInsight + +import com.intellij.codeInspection.InspectionProfileEntry +import com.intellij.testFramework.LightProjectDescriptor +import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase +import com.siyeh.ig.LightInspectionTestCase + +class JUnit5MalformedNestedClassTest : LightInspectionTestCase() { + override fun getInspection(): InspectionProfileEntry? { + return JUnit5MalformedNestedClassInspection() + } + + @Throws(Exception::class) + override fun setUp() { + super.setUp() + addEnvironmentClass("package org.junit.jupiter.api;" + + "public @interface Nested {}") + } + + fun testMalformed() { + doTest() + } + + override fun getBasePath(): String { + return "/plugins/junit/testData/codeInsight/malformedNested" + } + + override fun getProjectDescriptor(): LightProjectDescriptor { + return LightCodeInsightFixtureTestCase.JAVA_8 + } +} diff --git a/plugins/junit/testData/codeInsight/malformedNested/Malformed.java b/plugins/junit/testData/codeInsight/malformedNested/Malformed.java new file mode 100644 index 000000000000..1e581400107a --- /dev/null +++ b/plugins/junit/testData/codeInsight/malformedNested/Malformed.java @@ -0,0 +1,4 @@ +class A { + @org.junit.jupiter.api.Nested + static class B {} +} \ No newline at end of file