// 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.codeInspection.tests.kotlin;
import com.intellij.codeInspection.blockingCallsDetection.BlockingMethodInNonBlockingContextInspection;
import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase;
import org.jetbrains.kotlin.idea.test.ExpectedPluginModeProvider;
import org.jetbrains.kotlin.idea.test.ExpectedPluginModeProviderKt;
import static com.intellij.codeInspection.blockingCallsDetection.BlockingMethodInNonBlockingContextInspection.DEFAULT_BLOCKING_ANNOTATIONS;
import static com.intellij.codeInspection.blockingCallsDetection.BlockingMethodInNonBlockingContextInspection.DEFAULT_NONBLOCKING_ANNOTATIONS;
public abstract class KotlinBlockingCallDetectionTest extends JavaCodeInsightFixtureTestCase implements ExpectedPluginModeProvider {
@Override
protected void setUp() throws Exception {
ExpectedPluginModeProviderKt.setUpWithKotlinPlugin(this, getTestRootDisposable(), super::setUp);
BlockingMethodInNonBlockingContextInspection myInspection = new BlockingMethodInNonBlockingContextInspection();
myInspection.myBlockingAnnotations = DEFAULT_BLOCKING_ANNOTATIONS;
myInspection.myNonBlockingAnnotations = DEFAULT_NONBLOCKING_ANNOTATIONS;
myFixture.enableInspections(myInspection);
}
public void testKotlinAnnotationDetection() {
myFixture.addClass("package org.jetbrains.annotations;\n" +
"public @interface Blocking {}");
myFixture.addClass("package org.jetbrains.annotations;\n" +
"public @interface NonBlocking {}");
myFixture.addFileToProject("/TestKotlinAnnotationDetection.kt",
"""
import org.jetbrains.annotations.Blocking
import org.jetbrains.annotations.NonBlocking
@NonBlocking
fun nonBlockingFunction() {
blockingFunction();
}
@Blocking
fun blockingFunction() {}""");
myFixture.testHighlighting(true, false, true, "TestKotlinAnnotationDetection.kt");
}
public void testKotlinThrowsTypeDetection() {
myFixture.addClass("package org.jetbrains.annotations;\n" +
"public @interface NonBlocking {}");
myFixture.configureByText("/TestKotlinThrowsTypeDetection.kt",
"""
import org.jetbrains.annotations.NonBlocking
import java.net.URL
@NonBlocking
fun nonBlockingFunction() {
Thread.sleep(111);
\s
URL("https://example.com")
}""");
myFixture.checkHighlighting(true, false, true);
}
public void testDelegatingConstructor() {
myFixture.addClass("package org.jetbrains.annotations;\n" +
"public @interface Blocking {}");
myFixture.addClass("package org.jetbrains.annotations;\n" +
"public @interface NonBlocking {}");
myFixture.addClass("""
import org.jetbrains.annotations.*;
public class BlockingCtrClass {
@Blocking
BlockingCtrClass() {
}
public static class Intermediate extends BlockingCtrClass {}
}
"""
);
myFixture.configureByText("file.kt",
"""
import org.jetbrains.annotations.*
class NonBlockingCtrClass : BlockingCtrClass {
@NonBlocking
constructor() {}
}
class NonBlockingCtrClassWithIntermediate : BlockingCtrClass.Intermediate {
@NonBlocking
constructor() {}
}
class NonBlockingCtrClassExplicit @NonBlocking constructor() : BlockingCtrClass()
class NonBlockingCtrClassExplicit2 : BlockingCtrClass {
@NonBlocking
constructor() : super()
}
open class KotlinBlockingCtr @Blocking constructor()
class NonBlockingCtr : KotlinBlockingCtr {
@NonBlocking
constructor() {}
}
""");
myFixture.testHighlighting(true, false, true, "file.kt");
}
}