package com.jetbrains.edu.java.generation
import com.intellij.lang.java.JavaLanguage
import com.intellij.openapi.application.runWriteAction
import com.intellij.openapi.roots.LanguageLevelProjectExtension
import com.intellij.pom.java.LanguageLevel
import com.jetbrains.edu.coursecreator.archive.CourseArchiveTestBase
import com.jetbrains.edu.jvm.JVM_LANGUAGE_LEVEL
import com.jetbrains.edu.learning.courseFormat.CourseMode
import org.junit.Test
@Suppress("NonFinalUtilityClass")
class JCreateCourseArchiveTest : CourseArchiveTestBase() {
/** Checks [com.jetbrains.edu.jvm.gradle.generation.macro.GradleCommandMacroProvider] */
@Test
fun `test custom command`() {
val course = courseWithFiles(
language = JavaLanguage.INSTANCE,
courseMode = CourseMode.EDUCATOR,
description = "my summary"
) {
lesson("lesson1") {
theoryTask("TheoryWithCustomRunConfiguration") {
javaTaskFile("src/Main.java", """
public class Main {
public static void main(String[] args) {
System.out.println(System.getenv("EXAMPLE_ENV"));
}
}
""")
// Need to verify that the plugin doesn't touch non-related run configuration files
xmlTaskFile("CustomGradleRun.run.xml", $$"""
true
true
false
""")
dir("runConfigurations") {
xmlTaskFile("CustomGradleRun.run.xml", $$"""
true
true
false
""")
}
}
}
}
withLanguageLevel(LanguageLevel.JDK_17) {
doTest(course)
}
}
@Test
fun `test do not override existing jdk level`() {
val course = courseWithFiles(
language = JavaLanguage.INSTANCE,
courseMode = CourseMode.EDUCATOR
) {
lesson("lesson1") {
theoryTask("task1") {
javaTaskFile("src/Main.java", """
public class Main {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
""")
}
}
}
course.environmentSettings = mapOf(JVM_LANGUAGE_LEVEL to LanguageLevel.JDK_17.toString())
withLanguageLevel(LanguageLevel.JDK_19) {
doTest(course)
}
}
private fun withLanguageLevel(level: LanguageLevel, action: () -> Unit) {
val languageLevelProjectExtension = LanguageLevelProjectExtension.getInstance(project)
val initialLevel = languageLevelProjectExtension.languageLevel
runWriteAction {
languageLevelProjectExtension.languageLevel = level
}
try {
action()
}
finally {
runWriteAction {
languageLevelProjectExtension.languageLevel = initialLevel
}
}
}
}