package com.intellij.codeInspection.tests.java import com.intellij.jvm.analysis.internal.testFramework.JavaApiUsageInspectionTestBase import com.intellij.jvm.analysis.testFramework.JvmLanguage import com.intellij.pom.java.LanguageLevel 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, """ import java.lang.SafeVarargs; 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()) } fun `test language level 14`() { myFixture.setLanguageLevel(LanguageLevel.JDK_14) myFixture.testHighlighting(JvmLanguage.JAVA, """ class Main { { g("%s".formatted(1), "".stripIndent(), "".translateEscapes()); } private void g(String formatted, String stripIndent, String translateEscapes) {} } """.trimIndent()) } fun `test language level 15`() { myFixture.setLanguageLevel(LanguageLevel.JDK_15) myFixture.testHighlighting(JvmLanguage.JAVA, """ class Main { { String.class.isRecord(); Class.class.getRecordComponents(); } } """.trimIndent()) } fun `test language level 16`() { myFixture.setLanguageLevel(LanguageLevel.JDK_16) myFixture.testHighlighting(JvmLanguage.JAVA, """ class Main { { String.class.isRecord(); String.class.isSealed(); } } """.trimIndent()) } fun `test language level 17`() { myFixture.setLanguageLevel(LanguageLevel.JDK_17) myFixture.testHighlighting(JvmLanguage.JAVA, """ import java.time.Duration; class Main { { try { Thread.sleep(Duration.ofSeconds(5)); } catch (InterruptedException e) { } } } """.trimIndent()) } fun `test override with different since version`() { myFixture.setLanguageLevel(LanguageLevel.JDK_1_8) myFixture.testHighlighting(JvmLanguage.JAVA, """ import java.io.FilterOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; class Main { public static void main(String[] args) throws IOException { byte[] buff = "hello\n".getBytes(StandardCharsets.UTF_8); System.out.write(buff); // call to PrintStream in JDK 14 ((FilterOutputStream) System.out).write(buff); // call to FilterOutputStream in JDK below 14 } } """.trimIndent()) } }