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())
}
}