diff --git a/libraries/stdlib/validator/src/test/kotlin/NoInternalVisibilityInStdLibTest.kt b/libraries/stdlib/validator/src/test/kotlin/NoInternalVisibilityInStdLibTest.kt index 17bf7ee7dab..93651f04ea7 100644 --- a/libraries/stdlib/validator/src/test/kotlin/NoInternalVisibilityInStdLibTest.kt +++ b/libraries/stdlib/validator/src/test/kotlin/NoInternalVisibilityInStdLibTest.kt @@ -18,10 +18,6 @@ import org.junit.Test import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment import com.intellij.openapi.util.Disposer import org.jetbrains.jet.config.CompilerConfiguration -import org.jetbrains.jet.config.CommonConfigurationKeys -import org.jetbrains.jet.lang.resolve.java.TopDownAnalyzerFacadeForJVM -import org.jetbrains.jet.lang.resolve.BindingTraceContext -import org.jetbrains.jet.lang.resolve.name.Name import org.jetbrains.jet.lang.resolve.name.FqName import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorWithVisibility @@ -33,19 +29,31 @@ import java.util.ArrayList import org.jetbrains.jet.lang.psi.JetFile import org.jetbrains.jet.renderer.DescriptorRenderer import kotlin.test.fail -import org.jetbrains.jet.cli.jvm.JVMConfigurationKeys import org.jetbrains.jet.utils.PathUtil import org.jetbrains.jet.lang.resolve.DescriptorUtils import org.jetbrains.jet.lang.descriptors.ModuleDescriptor -import org.junit.Assert import java.util.HashSet +import org.jetbrains.jet.config.CommonConfigurationKeys +import org.jetbrains.jet.cli.jvm.JVMConfigurationKeys +import org.jetbrains.jet.lang.resolve.java.TopDownAnalyzerFacadeForJVM import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns +import org.jetbrains.jet.lang.resolve.BindingTraceContext +import org.jetbrains.k2js.config.LibrarySourcesConfig +import org.jetbrains.k2js.config.EcmaVersion +import org.jetbrains.k2js.analyze.TopDownAnalyzerFacadeForJS +import com.intellij.openapi.Disposable -// this list is not designed to contain all packages, it is need for sanity check in case test code breaks -private val PACKAGES_SHOULD_BE_VALIDATED = listOf("kotlin", "kotlin.concurrent", "kotlin.jvm") map { FqName(it) } +private val ANALYZE_PACKAGE_ROOTS_FOR_JVM = listOf("kotlin") +private val ANALYZE_PACKAGE_ROOTS_FOR_JS = listOf("kotlin", "jquery", "html5") + +// these lists are not designed to contain all packages, they need for sanity check in case test code breaks +private val ADDITIONALLY_REQUIRED_PACKAGES_FOR_JVM = listOf("kotlin.jvm", "kotlin.concurrent") +private val ADDITIONALLY_REQUIRED_PACKAGES_FOR_JS = listOf("kotlin.js", "kotlin.reflect") + +private val KOTLIN_ROOT_PATH = "../../../" class NoInternalVisibilityInStdLibTest { - private class OutputSink { + private class OutputSink(private val requiredPackages: List) { private val internalDescriptors = ArrayList() private val validatedPackages = HashSet() @@ -61,10 +69,10 @@ class NoInternalVisibilityInStdLibTest { println("Validated packages: ") validatedPackages.forEach { println(" $it") } - Assert.assertTrue( - "Some of the expected stdlib packages were not validated, check code of the test", - validatedPackages.containsAll(PACKAGES_SHOULD_BE_VALIDATED) - ) + if (!validatedPackages.containsAll(requiredPackages)) { + fail("Some of the expected stdlib packages were not validated: " + + requiredPackages.subtract(validatedPackages)) + } if (internalDescriptors.isEmpty()) return @@ -96,16 +104,19 @@ class NoInternalVisibilityInStdLibTest { } } - Test fun testNoInternalVisibility() { - val disposable = Disposer.newDisposable() - val module = try { + Test fun testJvmStdlib() { + doTest(ANALYZE_PACKAGE_ROOTS_FOR_JVM, ADDITIONALLY_REQUIRED_PACKAGES_FOR_JVM) { val configuration = CompilerConfiguration() configuration.add(CommonConfigurationKeys.SOURCE_ROOTS_KEY, "../src/kotlin") + configuration.add(CommonConfigurationKeys.SOURCE_ROOTS_KEY, "../src/generated") configuration.addAll(JVMConfigurationKeys.CLASSPATH_KEY, PathUtil.getJdkClassesRoots()) - val environment = JetCoreEnvironment.createForProduction(disposable, configuration) + + val environment = JetCoreEnvironment.createForProduction(it, configuration) + val module = TopDownAnalyzerFacadeForJVM.createJavaModule("") module.addDependencyOnModule(module) module.addDependencyOnModule(KotlinBuiltIns.getInstance().getBuiltInsModule()) + TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration( environment.getProject(), environment.getSourceFiles(), @@ -116,12 +127,41 @@ class NoInternalVisibilityInStdLibTest { null ).getModuleDescriptor() } + } + + Test fun testJsStdlibJar() { + doTest(ANALYZE_PACKAGE_ROOTS_FOR_JS, ADDITIONALLY_REQUIRED_PACKAGES_FOR_JS) { + val configuration = CompilerConfiguration() + val environment = JetCoreEnvironment.createForProduction(it, configuration) + val project = environment.getProject() + val pathToJsStdlibJar = KOTLIN_ROOT_PATH + PathUtil.getKotlinPathsForDistDirectory().getJsLibJarPath().path + val config = LibrarySourcesConfig(project, "testModule", listOf("@", pathToJsStdlibJar), EcmaVersion.defaultVersion(), false) + + TopDownAnalyzerFacadeForJS.analyzeFiles(listOf(), { true }, config).getModuleDescriptor() + } + } + + private fun doTest( + testPackages: List, + additionallyRequiredPackages: List, + createTestModule: (disposable: Disposable) -> ModuleDescriptor + ) { + val disposable = Disposer.newDisposable() + val module = try { + createTestModule(disposable) + } finally { Disposer.dispose(disposable) } - val kotlinPackage = module.getPackage(FqName("kotlin"))!! - val sink = OutputSink() - validateDescriptor(module, kotlinPackage, sink) + + val requiredPackages = testPackages + additionallyRequiredPackages + val sink = OutputSink(requiredPackages map { FqName(it) }) + + for (testPackage in testPackages) { + val packageView = module.getPackage(FqName(testPackage))!! + validateDescriptor(module, packageView, sink) + } + sink.reportErrors() } @@ -145,4 +185,4 @@ class NoInternalVisibilityInStdLibTest { } } } -} \ No newline at end of file +}