package com.intellij.codeInspection.tests.java import com.intellij.codeInspection.tests.JavaApiUsageInspectionTestBase import com.intellij.codeInspection.tests.JvmLanguage import com.intellij.pom.java.LanguageLevel /** * This is a base test case for test cases that highlight all the use of API * that were introduced in later language levels comparing to the current language level * * In order to add a new test case: *
    *
  1. Go to "community/jvm/jvm-analysis-java-tests/testData/codeInspection/apiUsage"
  2. *
  3. Add a new file(s) to "./src" that contains new API. It's better to define the new API as native methods.
  4. *
  5. Set JAVA_HOME to jdk 1.8. In this case it's possible to redefine JDK's own classes like String or Class
  6. *
  7. Invoke "./compile.sh". The new class(es) will appear in "./classes"
  8. *
*/ class JavaJavaApiUsageInspectionTest : JavaApiUsageInspectionTestBase() { fun `test constructor`() { myFixture.setLanguageLevel(LanguageLevel.JDK_1_4) myFixture.testHighlighting(JvmLanguage.JAVA, """ class Constructor { void foo() { throw new IllegalArgumentException("", new RuntimeException()); } } """.trimIndent()) } fun `test ignored`() { myFixture.setLanguageLevel(LanguageLevel.JDK_1_6) myFixture.addClass(""" package java.awt.geom; public class GeneralPath { public void moveTo(int x, int y) { } } """.trimIndent()) myFixture.testHighlighting(JvmLanguage.JAVA, """ import java.awt.geom.GeneralPath; class Ignored { void foo() { GeneralPath path = new GeneralPath(); path.moveTo(0,0); } } """.trimIndent()) } fun `test qualified reference`() { myFixture.setLanguageLevel(LanguageLevel.JDK_1_6) myFixture.testHighlighting(JvmLanguage.JAVA, """ import java.nio.charset.StandardCharsets; import java.nio.charset.Charset; class Main { void foo() { Charset utf = StandardCharsets.UTF_8; } } """.trimIndent()) } fun `test annotation`() { myFixture.setLanguageLevel(LanguageLevel.JDK_1_6) myFixture.testHighlighting(JvmLanguage.JAVA, """ class Annotation { @SafeVarargs public final void a(java.util.List... ls) {} } """.trimIndent()) } fun `test override annotation`() { myFixture.setLanguageLevel(LanguageLevel.JDK_1_6) myFixture.testHighlighting(JvmLanguage.JAVA, """ import java.util.Map; abstract class OverrideAnnotation implements Map { @Override public String getOrDefault(Object key, String defaultValue) { return null; } } """.trimIndent()) } fun `test minimum since highlighting`() { myFixture.setLanguageLevel(LanguageLevel.JDK_1_7) myFixture.testHighlighting(JvmLanguage.JAVA, """ import java.util.stream.IntStream; class MinimumSince { void test() { "foo".chars(); } } """.trimIndent()) } fun `test no highlighting in javadoc`() { myFixture.setLanguageLevel(LanguageLevel.JDK_1_7) myFixture.testHighlighting(JvmLanguage.JAVA, """ class Javadoc { /** * {@link java.util.function.Predicate} */ void test() { return; } } """.trimIndent()) } fun `test minimum since no highlighting`() { myFixture.setLanguageLevel(LanguageLevel.JDK_1_8) myFixture.testHighlighting(JvmLanguage.JAVA, """ import java.util.stream.IntStream; class MinimumSince { void test() { "foo".chars(); } } """.trimIndent()) } fun `test default methods`() { myFixture.setLanguageLevel(LanguageLevel.JDK_1_6) myFixture.testHighlighting(JvmLanguage.JAVA, """ import java.util.Iterator; class DefaultMethods implements Iterator { @Override public boolean hasNext() { return false; } @Override public String next() { return null; } static class T implements Iterator { @Override public boolean hasNext() { return false; } @Override public String next() { return null; } @Override public void remove() {} } { Iterator it = new Iterator() { @Override public boolean hasNext(){ return false; } @Override public String next(){ return null; } }; } } """.trimIndent()) } fun `test raw inherit from newly generified`() { myFixture.setLanguageLevel(LanguageLevel.JDK_1_6) myFixture.addClass(""" package javax.swing; public class AbstractListModel {} """.trimIndent()) myFixture.testHighlighting(JvmLanguage.JAVA, """ class RawInheritFromNewlyGenerified { private AbstractCCM myModel; } abstract class AbstractCCM extends javax.swing.AbstractListModel { } """.trimIndent()) } fun `test generified`() { myFixture.setLanguageLevel(LanguageLevel.JDK_1_6) myFixture.addClass(""" package javax.swing; public interface ListModel { } """.trimIndent()) myFixture.addClass(""" package javax.swing; public class AbstractListModel implements ListModel { } """.trimIndent()) myFixture.testHighlighting(JvmLanguage.JAVA, """ import javax.swing.AbstractListModel; abstract class AbstractCCM extends AbstractListModel { } """.trimIndent()) } }