Spring Support: Test framework

This commit is contained in:
Alexey Sedunov
2016-03-18 13:00:30 +03:00
parent d8a033e8a5
commit 161d11d9ec
5 changed files with 160 additions and 14 deletions
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.test.util
import com.intellij.openapi.util.io.FileUtil
import com.intellij.psi.*
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.testFramework.UsefulTestCase
import com.intellij.testFramework.fixtures.CodeInsightTestFixture
import com.intellij.util.SmartFMap
import org.jetbrains.kotlin.psi.KtDeclaration
@@ -73,4 +74,6 @@ fun PsiFile.findElementsByCommentPrefix(prefix: String): Map<PsiElement, String>
}
)
return result
}
}
inline fun <reified T: Any> Any?.assertInstanceOf() = UsefulTestCase.assertInstanceOf(this, T::class.java)
@@ -179,19 +179,22 @@ public class ConfigLibraryUtil {
);
}
public static void addLibrary(@NotNull Module module, @NotNull String libraryName, @NotNull String rootPath, @NotNull String[] jarPaths) {
NewLibraryEditor editor = new NewLibraryEditor();
editor.setName(libraryName);
for (String jarPath : jarPaths) {
editor.addRoot(VfsUtil.getUrlForLibraryRoot(new File(rootPath, jarPath)), OrderRootType.CLASSES);
}
addLibrary(editor, module);
}
public static void configureLibrariesByDirective(@NotNull Module module, String rootPath, String fileText) {
for (String libraryInfo : InTextDirectivesUtils.findListWithPrefixes(fileText, "// CONFIGURE_LIBRARY: ")) {
int i = libraryInfo.indexOf('@');
String libraryName = libraryInfo.substring(0, i);
String[] jarPaths = libraryInfo.substring(i + 1).split(";");
NewLibraryEditor editor = new NewLibraryEditor();
editor.setName(libraryName);
for (String jarPath : jarPaths) {
editor.addRoot(VfsUtil.getUrlForLibraryRoot(new File(rootPath, jarPath)), OrderRootType.CLASSES);
}
addLibrary(editor, module);
addLibrary(module, libraryName, rootPath, jarPaths);
}
}
@@ -0,0 +1,55 @@
/*
* Copyright 2010-2016 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.test
import com.intellij.openapi.module.Module
import com.intellij.util.SmartFMap
interface TestFixtureExtension {
fun setUp(module: Module)
fun tearDown()
companion object {
@Volatile
private var instances = SmartFMap.emptyMap<String, TestFixtureExtension>()
@Suppress("UNCHECKED_CAST")
fun loadFixture(className: String, module: Module): TestFixtureExtension {
instances[className]?.let { return it }
return (Class.forName(className).newInstance() as TestFixtureExtension).apply {
this.setUp(module)
instances = instances.plus(className, this)
}
}
inline fun <reified T : TestFixtureExtension> loadFixture(module: Module) = loadFixture(T::class.qualifiedName!!, module) as T
fun getFixture(className: String) = instances[className]
inline fun <reified T : TestFixtureExtension> getFixture() = getFixture(T::class.qualifiedName!!) as? T
fun unloadFixture(className: String) {
instances[className]?.let {
it.tearDown()
instances = instances.minus(className)
}
}
inline fun <reified T : TestFixtureExtension> unloadFixture() = unloadFixture(T::class.qualifiedName!!)
}
}
@@ -0,0 +1,65 @@
/*
* Copyright 2010-2016 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.spring.tests
import com.intellij.facet.impl.FacetUtil
import com.intellij.openapi.module.Module
import com.intellij.spring.facet.SpringFacet
import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
import org.jetbrains.kotlin.idea.test.TestFixtureExtension
import java.util.*
@Suppress("unused")
class SpringTestFixtureExtension() : TestFixtureExtension {
private var module: Module? = null
enum class SpringFramework(val version: String, vararg val artifactIds: String) {
FRAMEWORK_4_2_0(
"4.2.0.RELEASE",
"core", "beans", "context"
)
}
val SPRING_LIBRARY_ROOT = "${PluginTestCaseBase.getTestDataPathBase()}/spring/_lib"
override fun setUp(module: Module) {
this.module = module
val library = SpringFramework.FRAMEWORK_4_2_0
val libraryPath = "$SPRING_LIBRARY_ROOT/spring/${library.version}/"
val jarNames = HashSet<String>(library.artifactIds.size)
for (id in library.artifactIds) {
jarNames.add("spring-$id-${library.version}.jar")
}
ConfigLibraryUtil.addLibrary(module, "spring" + library.version, libraryPath, jarNames.toTypedArray())
FacetUtil.addFacet(module, SpringFacet.getSpringFacetType())
}
override fun tearDown() {
try {
// clear existing SpringFacet configuration before running next test
module?.let { SpringFacet.getInstance(it) }?.let {
it.removeFileSets()
FacetUtil.deleteFacet(it)
}
}
finally {
module = null
}
}
}
+25 -5
View File
@@ -135,7 +135,21 @@
<move file="dependencies/apache-ant-@{version}" tofile="dependencies/@{folderName}"/>
</sequential>
</macrodef>
<macrodef name="get-spring-library">
<attribute name="lib"/>
<attribute name="version"/>
<sequential>
<get-maven-library
server="http://central.maven.org/maven2"
prefix="org/springframework"
lib="@{lib}"
version="@{version}"
src="false"
dependencies="idea/testData/spring/_lib/spring/@{version}"/>
</sequential>
</macrodef>
<target name="make-native-platform-uberjar">
<property name="dependencies" value="dependencies"/>
<property name="download" value="${dependencies}/download"/>
@@ -143,7 +157,7 @@
<property name="version" value="${native-platform-lib-version}"/>
<property name="common.name" value="native-platform"/>
<property name="common.prefix" value="${server}/net/rubygrapefruit/${common.name}"/>
<macrodef name="get-lib">
<attribute name="suffix"/>
<sequential>
@@ -153,7 +167,7 @@
<mkdir dir="${dependencies}"/>
<mkdir dir="${download}"/>
<get-lib suffix=""/>
<get-lib suffix="-windows-amd64"/>
<get-lib suffix="-windows-i386"/>
@@ -175,9 +189,9 @@
<zipfileset src="${download}/${common.name}-freebsd-amd64.jar" includes="**" />
<zipfileset src="${download}/${common.name}-freebsd-i386.jar" includes="**" />
</jar>
</target>
<target name="fetch-third-party" depends="make-native-platform-uberjar">
<mkdir dir="dependencies"/>
<mkdir dir="dependencies/download"/>
@@ -320,6 +334,12 @@
<antcall target="override-version"/>
<download-or-build-markdown-parser/>
<sequential if:set="use.ultimate.by.default">
<get-spring-library lib="spring-core" version="4.2.0.RELEASE"/>
<get-spring-library lib="spring-beans" version="4.2.0.RELEASE"/>
<get-spring-library lib="spring-context" version="4.2.0.RELEASE"/>
</sequential>
</target>
<macrodef name="get_android_sdk">