/*
* Copyright 2010-2017 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.idea.configuration;
import com.intellij.framework.library.LibraryVersionProperties;
import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.util.io.FileUtil;
import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments;
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments;
import org.jetbrains.kotlin.config.*;
import org.jetbrains.kotlin.idea.facet.FacetUtilsKt;
import org.jetbrains.kotlin.idea.facet.KotlinFacet;
import org.jetbrains.kotlin.idea.framework.JSLibraryStdPresentationProvider;
import org.jetbrains.kotlin.idea.framework.KotlinLibraryUtilKt;
import org.jetbrains.kotlin.idea.project.PlatformKt;
import org.jetbrains.kotlin.idea.versions.KotlinRuntimeLibraryUtilKt;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
public class ConfigureKotlinTest extends AbstractConfigureKotlinTest {
public void testNewLibrary_copyJar() {
doTestOneJavaModule(KotlinWithLibraryConfigurator.FileState.COPY);
}
public void testNewLibrary_doNotCopyJar() {
doTestOneJavaModule(KotlinWithLibraryConfigurator.FileState.DO_NOT_COPY);
}
public void testLibraryWithoutPaths_jarExists() {
doTestOneJavaModule(KotlinWithLibraryConfigurator.FileState.EXISTS);
}
public void testNewLibrary_jarExists() {
doTestOneJavaModule(KotlinWithLibraryConfigurator.FileState.EXISTS);
}
public void testLibraryWithoutPaths_copyJar() {
doTestOneJavaModule(KotlinWithLibraryConfigurator.FileState.COPY);
}
public void testLibraryWithoutPaths_doNotCopyJar() {
doTestOneJavaModule(KotlinWithLibraryConfigurator.FileState.DO_NOT_COPY);
}
@SuppressWarnings("ConstantConditions")
public void testTwoModules_exists() {
Module[] modules = getModules();
for (Module module : modules) {
if (module.getName().equals("module1")) {
configure(module, KotlinWithLibraryConfigurator.FileState.DO_NOT_COPY, JAVA_CONFIGURATOR);
assertConfigured(module, JAVA_CONFIGURATOR);
}
else if (module.getName().equals("module2")) {
assertNotConfigured(module, JAVA_CONFIGURATOR);
configure(module, KotlinWithLibraryConfigurator.FileState.EXISTS, JAVA_CONFIGURATOR);
assertConfigured(module, JAVA_CONFIGURATOR);
}
}
}
public void testLibraryNonDefault_libExistInDefault() throws IOException {
Module module = getModule();
// Move fake runtime jar to default library path to pretend library is already configured
FileUtil.copy(
new File(getProject().getBasePath() + "/lib/kotlin-runtime.jar"),
new File(JAVA_CONFIGURATOR.getDefaultPathToJarFile(getProject()) + "/kotlin-runtime.jar"));
assertNotConfigured(module, JAVA_CONFIGURATOR);
JAVA_CONFIGURATOR.configure(myProject, Collections.<Module>emptyList());
assertProperlyConfigured(module, JAVA_CONFIGURATOR);
}
public void testTwoModulesWithNonDefaultPath_doNotCopyInDefault() throws IOException {
doTestConfigureModulesWithNonDefaultSetup(JAVA_CONFIGURATOR);
assertEmpty(ConfigureKotlinInProjectUtilsKt.getNonConfiguredModules(myProject, JS_CONFIGURATOR));
}
public void testTwoModulesWithJSNonDefaultPath_doNotCopyInDefault() throws IOException {
doTestConfigureModulesWithNonDefaultSetup(JS_CONFIGURATOR);
assertEmpty(ConfigureKotlinInProjectUtilsKt.getNonConfiguredModules(myProject, JAVA_CONFIGURATOR));
}
public void testNewLibrary_jarExists_js() {
doTestOneJsModule(KotlinWithLibraryConfigurator.FileState.EXISTS);
}
public void testNewLibrary_copyJar_js() {
doTestOneJsModule(KotlinWithLibraryConfigurator.FileState.COPY);
}
public void testNewLibrary_doNotCopyJar_js() {
doTestOneJsModule(KotlinWithLibraryConfigurator.FileState.DO_NOT_COPY);
}
public void testJsLibraryWithoutPaths_jarExists() {
doTestOneJsModule(KotlinWithLibraryConfigurator.FileState.EXISTS);
}
public void testJsLibraryWithoutPaths_copyJar() {
doTestOneJsModule(KotlinWithLibraryConfigurator.FileState.COPY);
}
public void testJsLibraryWithoutPaths_doNotCopyJar() {
doTestOneJsModule(KotlinWithLibraryConfigurator.FileState.DO_NOT_COPY);
}
public void testProjectWithoutFacetWithRuntime106WithoutLanguageLevel() {
assertEquals(LanguageVersion.KOTLIN_1_0, PlatformKt.getLanguageVersionSettings(myProject, null).getLanguageVersion());
assertEquals(LanguageVersion.KOTLIN_1_0, PlatformKt.getLanguageVersionSettings(getModule()).getLanguageVersion());
}
public void testProjectWithoutFacetWithRuntime11WithoutLanguageLevel() {
assertEquals(LanguageVersion.KOTLIN_1_1, PlatformKt.getLanguageVersionSettings(myProject, null).getLanguageVersion());
assertEquals(LanguageVersion.KOTLIN_1_1, PlatformKt.getLanguageVersionSettings(getModule()).getLanguageVersion());
}
public void testProjectWithoutFacetWithRuntime11WithLanguageLevel10() {
assertEquals(LanguageVersion.KOTLIN_1_0, PlatformKt.getLanguageVersionSettings(myProject, null).getLanguageVersion());
assertEquals(LanguageVersion.KOTLIN_1_0, PlatformKt.getLanguageVersionSettings(getModule()).getLanguageVersion());
}
public void testProjectWithFacetWithRuntime11WithLanguageLevel10() {
assertEquals(LanguageVersion.KOTLIN_1_1, PlatformKt.getLanguageVersionSettings(myProject, null).getLanguageVersion());
assertEquals(LanguageVersion.KOTLIN_1_0, PlatformKt.getLanguageVersionSettings(getModule()).getLanguageVersion());
}
public void testJsLibraryVersion11() {
Library jsRuntime = KotlinRuntimeLibraryUtilKt.findAllUsedLibraries(myProject).keySet().iterator().next();
LibraryVersionProperties properties = KotlinLibraryUtilKt.getLibraryProperties(JSLibraryStdPresentationProvider.getInstance(), jsRuntime);
assertEquals("1.1.0", properties.getVersionString());
}
public void testJsLibraryVersion106() {
Library jsRuntime = KotlinRuntimeLibraryUtilKt.findAllUsedLibraries(myProject).keySet().iterator().next();
LibraryVersionProperties properties = KotlinLibraryUtilKt.getLibraryProperties(JSLibraryStdPresentationProvider.getInstance(), jsRuntime);
assertEquals("1.0.6", properties.getVersionString());
}
@SuppressWarnings("ConstantConditions")
public void testJvmProjectWithV1FacetConfig() {
KotlinFacetSettings settings = KotlinFacetSettingsProvider.Companion.getInstance(myProject).getInitializedSettings(getModule());
K2JVMCompilerArguments arguments = (K2JVMCompilerArguments) settings.getCompilerArguments();
assertEquals(false, settings.getUseProjectSettings());
assertEquals("1.1", settings.getLanguageLevel().getDescription());
assertEquals("1.0", settings.getApiLevel().getDescription());
assertEquals(TargetPlatformKind.Jvm.Companion.get(JvmTarget.JVM_1_8), settings.getTargetPlatformKind());
assertEquals("1.1", arguments.languageVersion);
assertEquals("1.0", arguments.apiVersion);
assertEquals(LanguageFeature.State.ENABLED_WITH_WARNING, CoroutineSupport.byCompilerArguments(arguments));
assertEquals("1.7", arguments.jvmTarget);
assertEquals("-version -Xallow-kotlin-package -Xskip-metadata-version-check", settings.getCompilerSettings().additionalArguments);
}
@SuppressWarnings("ConstantConditions")
public void testJsProjectWithV1FacetConfig() {
KotlinFacetSettings settings = KotlinFacetSettingsProvider.Companion.getInstance(myProject).getInitializedSettings(getModule());
K2JSCompilerArguments arguments = (K2JSCompilerArguments) settings.getCompilerArguments();
assertEquals(false, settings.getUseProjectSettings());
assertEquals("1.1", settings.getLanguageLevel().getDescription());
assertEquals("1.0", settings.getApiLevel().getDescription());
assertEquals(TargetPlatformKind.JavaScript.INSTANCE, settings.getTargetPlatformKind());
assertEquals("1.1", arguments.languageVersion);
assertEquals("1.0", arguments.apiVersion);
assertEquals(LanguageFeature.State.ENABLED_WITH_WARNING, CoroutineSupport.byCompilerArguments(arguments));
assertEquals("amd", arguments.moduleKind);
assertEquals("-version -meta-info", settings.getCompilerSettings().additionalArguments);
}
@SuppressWarnings("ConstantConditions")
public void testJvmProjectWithV2FacetConfig() {
KotlinFacetSettings settings = KotlinFacetSettingsProvider.Companion.getInstance(myProject).getInitializedSettings(getModule());
K2JVMCompilerArguments arguments = (K2JVMCompilerArguments) settings.getCompilerArguments();
assertEquals(false, settings.getUseProjectSettings());
assertEquals("1.1", settings.getLanguageLevel().getDescription());
assertEquals("1.0", settings.getApiLevel().getDescription());
assertEquals(TargetPlatformKind.Jvm.Companion.get(JvmTarget.JVM_1_8), settings.getTargetPlatformKind());
assertEquals("1.1", arguments.languageVersion);
assertEquals("1.0", arguments.apiVersion);
assertEquals(LanguageFeature.State.ENABLED, CoroutineSupport.byCompilerArguments(arguments));
assertEquals("1.7", arguments.jvmTarget);
assertEquals("-version -Xallow-kotlin-package -Xskip-metadata-version-check", settings.getCompilerSettings().additionalArguments);
}
@SuppressWarnings("ConstantConditions")
public void testJsProjectWithV2FacetConfig() {
KotlinFacetSettings settings = KotlinFacetSettingsProvider.Companion.getInstance(myProject).getInitializedSettings(getModule());
K2JSCompilerArguments arguments = (K2JSCompilerArguments) settings.getCompilerArguments();
assertEquals(false, settings.getUseProjectSettings());
assertEquals("1.1", settings.getLanguageLevel().getDescription());
assertEquals("1.0", settings.getApiLevel().getDescription());
assertEquals(TargetPlatformKind.JavaScript.INSTANCE, settings.getTargetPlatformKind());
assertEquals("1.1", arguments.languageVersion);
assertEquals("1.0", arguments.apiVersion);
assertEquals(LanguageFeature.State.ENABLED_WITH_ERROR, CoroutineSupport.byCompilerArguments(arguments));
assertEquals("amd", arguments.moduleKind);
assertEquals("-version -meta-info", settings.getCompilerSettings().additionalArguments);
}
@SuppressWarnings("ConstantConditions")
public void testJvmProjectWithV3FacetConfig() {
KotlinFacetSettings settings = KotlinFacetSettingsProvider.Companion.getInstance(myProject).getInitializedSettings(getModule());
K2JVMCompilerArguments arguments = (K2JVMCompilerArguments) settings.getCompilerArguments();
assertEquals(false, settings.getUseProjectSettings());
assertEquals("1.1", settings.getLanguageLevel().getDescription());
assertEquals("1.0", settings.getApiLevel().getDescription());
assertEquals(TargetPlatformKind.Jvm.Companion.get(JvmTarget.JVM_1_8), settings.getTargetPlatformKind());
assertEquals("1.1", arguments.languageVersion);
assertEquals("1.0", arguments.apiVersion);
assertEquals(LanguageFeature.State.ENABLED, CoroutineSupport.byCompilerArguments(arguments));
assertEquals("1.7", arguments.jvmTarget);
assertEquals("-version -Xallow-kotlin-package -Xskip-metadata-version-check", settings.getCompilerSettings().additionalArguments);
}
private void configureFacetAndCheckJvm(JvmTarget jvmTarget) {
IdeModifiableModelsProviderImpl modelsProvider = new IdeModifiableModelsProviderImpl(getProject());
try {
KotlinFacet facet = FacetUtilsKt.getOrCreateFacet(getModule(), modelsProvider, false, false);
TargetPlatformKind.Jvm platformKind = TargetPlatformKind.Jvm.Companion.get(jvmTarget);
FacetUtilsKt.configureFacet(
facet,
"1.1",
LanguageFeature.State.ENABLED,
platformKind,
modelsProvider
);
assertEquals(platformKind, facet.getConfiguration().getSettings().getTargetPlatformKind());
assertEquals(jvmTarget.getDescription(), ((K2JVMCompilerArguments) facet.getConfiguration().getSettings().getCompilerArguments()).jvmTarget);
}
finally {
modelsProvider.dispose();
}
}
@SuppressWarnings("ConstantConditions")
public void testJvm8InProjectJvm6InModule() {
configureFacetAndCheckJvm(JvmTarget.JVM_1_6);
}
@SuppressWarnings("ConstantConditions")
public void testJvm6InProjectJvm8InModule() {
configureFacetAndCheckJvm(JvmTarget.JVM_1_8);
}
}