mirror of
https://github.com/sigmasternchen/xtext-core
synced 2025-03-16 16:58:56 +00:00
[wizard] add a utility to update test expectations
This commit is contained in:
parent
4a43c1aaa9
commit
07cdb06281
3 changed files with 133 additions and 94 deletions
|
@ -12,8 +12,12 @@ import java.io.File
|
|||
import org.eclipse.xtext.xtext.wizard.ProjectDescriptor
|
||||
import org.eclipse.xtext.xtext.wizard.ProjectsCreator
|
||||
import org.eclipse.xtext.xtext.wizard.WizardConfiguration
|
||||
import org.eclipse.xtend.lib.annotations.Accessors
|
||||
import org.eclipse.xtext.util.Strings
|
||||
|
||||
class CliProjectsCreator implements ProjectsCreator {
|
||||
|
||||
@Accessors String lineDelimiter
|
||||
|
||||
override createProjects(WizardConfiguration config) {
|
||||
config.enabledProjects.forEach [
|
||||
|
@ -28,7 +32,8 @@ class CliProjectsCreator implements ProjectsCreator {
|
|||
val projectRelativePath = project.config.sourceLayout.getPathFor(outlet) + "/" + relativePath
|
||||
val file = new File(projectRoot, projectRelativePath)
|
||||
file.parentFile.mkdirs
|
||||
Files.write(content, file, project.config.encoding)
|
||||
val normalizedContent = content.replace(Strings.newLine, lineDelimiter)
|
||||
Files.write(normalizedContent, file, project.config.encoding)
|
||||
]
|
||||
project.sourceFolders.forEach [
|
||||
new File(projectRoot, it).mkdirs
|
||||
|
|
|
@ -22,7 +22,6 @@ import org.eclipse.xtext.xtext.wizard.LanguageDescriptor.FileExtensions
|
|||
import org.eclipse.xtext.xtext.wizard.ProjectLayout
|
||||
import org.eclipse.xtext.xtext.wizard.SourceLayout
|
||||
import org.eclipse.xtext.xtext.wizard.WizardConfiguration
|
||||
import org.junit.Before
|
||||
import org.junit.ComparisonFailure
|
||||
import org.junit.Rule
|
||||
import org.junit.Test
|
||||
|
@ -31,14 +30,79 @@ import org.junit.rules.TemporaryFolder
|
|||
import static org.junit.Assert.*
|
||||
|
||||
class CliWizardIntegrationTest {
|
||||
@Rule public TemporaryFolder temp = new TemporaryFolder
|
||||
|
||||
WizardConfiguration config
|
||||
CliProjectsCreator creator
|
||||
|
||||
@Before
|
||||
def void setup() {
|
||||
config = new WizardConfiguration => [
|
||||
|
||||
/**
|
||||
* Use this main method to update the expectations to whatever the wizard currently generates
|
||||
*/
|
||||
static def void main(String[] args) {
|
||||
val creator = newProjectCreator
|
||||
projectConfigs.forEach [ config |
|
||||
val targetLocation = new File("testdata/wizard-expectations", config.baseName)
|
||||
targetLocation.mkdirs
|
||||
org.eclipse.xtext.util.Files.sweepFolder(targetLocation)
|
||||
config.rootLocation = targetLocation.path
|
||||
creator.createProjects(config)
|
||||
println("Updating expectations for " + config.baseName)
|
||||
]
|
||||
}
|
||||
|
||||
static val projectConfigs = #[
|
||||
newProjectConfig => [
|
||||
baseName = "org.xtext.example.plainMaven"
|
||||
preferredBuildSystem = BuildSystem.MAVEN
|
||||
sourceLayout = SourceLayout.MAVEN
|
||||
projectLayout = ProjectLayout.HIERARCHICAL
|
||||
runtimeProject.testProject.enabled = true
|
||||
ideProject.enabled = true
|
||||
webProject.enabled = true
|
||||
],
|
||||
newProjectConfig => [
|
||||
baseName = "org.xtext.example.mavenTycho"
|
||||
preferredBuildSystem = BuildSystem.MAVEN
|
||||
sourceLayout = SourceLayout.PLAIN
|
||||
projectLayout = ProjectLayout.HIERARCHICAL
|
||||
runtimeProject.testProject.enabled = true
|
||||
uiProject.enabled = true
|
||||
uiProject.testProject.enabled = true
|
||||
ideProject.enabled = true
|
||||
webProject.enabled = true
|
||||
],
|
||||
newProjectConfig => [
|
||||
baseName = "org.xtext.example.gradle"
|
||||
preferredBuildSystem = BuildSystem.GRADLE
|
||||
sourceLayout = SourceLayout.MAVEN
|
||||
projectLayout = ProjectLayout.HIERARCHICAL
|
||||
runtimeProject.testProject.enabled = true
|
||||
ideProject.enabled = true
|
||||
webProject.enabled = true
|
||||
intellijProject.enabled = true
|
||||
],
|
||||
newProjectConfig => [
|
||||
baseName = "org.xtext.example.eclipsePlugin"
|
||||
preferredBuildSystem = BuildSystem.ECLIPSE
|
||||
sourceLayout = SourceLayout.PLAIN
|
||||
projectLayout = ProjectLayout.FLAT
|
||||
runtimeProject.testProject.enabled = true
|
||||
ideProject.enabled = true
|
||||
uiProject.enabled = true
|
||||
uiProject.testProject.enabled = true
|
||||
],
|
||||
newProjectConfig => [
|
||||
baseName = "org.xtext.example.full"
|
||||
preferredBuildSystem = BuildSystem.GRADLE
|
||||
sourceLayout = SourceLayout.PLAIN
|
||||
projectLayout = ProjectLayout.HIERARCHICAL
|
||||
runtimeProject.testProject.enabled = true
|
||||
uiProject.enabled = true
|
||||
uiProject.testProject.enabled = true
|
||||
ideProject.enabled = true
|
||||
webProject.enabled = true
|
||||
intellijProject.enabled = true
|
||||
]
|
||||
]
|
||||
|
||||
private static def newProjectConfig() {
|
||||
new WizardConfiguration => [
|
||||
xtextVersion = new XtextVersion("2.9.0-SNAPSHOT")
|
||||
encoding = Charsets.UTF_8
|
||||
language => [
|
||||
|
@ -46,132 +110,83 @@ class CliWizardIntegrationTest {
|
|||
fileExtensions = FileExtensions.fromString("mydsl")
|
||||
]
|
||||
]
|
||||
creator = new CliProjectsCreator
|
||||
}
|
||||
|
||||
|
||||
private static def newProjectCreator() {
|
||||
new CliProjectsCreator => [
|
||||
lineDelimiter = "\n"
|
||||
]
|
||||
}
|
||||
|
||||
@Rule public TemporaryFolder temp = new TemporaryFolder
|
||||
|
||||
WizardConfiguration config
|
||||
CliProjectsCreator creator
|
||||
|
||||
@Test
|
||||
def testPlainMavenProject() {
|
||||
config.baseName = "org.xtext.example.plainMaven"
|
||||
config.preferredBuildSystem = BuildSystem.MAVEN
|
||||
config.sourceLayout = SourceLayout.MAVEN
|
||||
config.projectLayout = ProjectLayout.HIERARCHICAL
|
||||
config.runtimeProject.testProject.enabled = true
|
||||
config.ideProject.enabled = true
|
||||
config.webProject.enabled = true
|
||||
validateCreatedProjects
|
||||
def testProjectCreation() {
|
||||
creator = newProjectCreator
|
||||
projectConfigs.forEach[config|
|
||||
this.config = config
|
||||
validateCreatedProjects
|
||||
]
|
||||
}
|
||||
|
||||
@Test
|
||||
def testMavenTychoProject() {
|
||||
config.baseName = "org.xtext.example.mavenTycho"
|
||||
config.preferredBuildSystem = BuildSystem.MAVEN
|
||||
config.sourceLayout = SourceLayout.PLAIN
|
||||
config.projectLayout = ProjectLayout.HIERARCHICAL
|
||||
config.runtimeProject.testProject.enabled = true
|
||||
config.uiProject.enabled = true
|
||||
config.uiProject.testProject.enabled = true
|
||||
config.ideProject.enabled = true
|
||||
config.webProject.enabled = true
|
||||
validateCreatedProjects
|
||||
}
|
||||
|
||||
@Test
|
||||
def testGradleProject() {
|
||||
config.baseName = "org.xtext.example.gradle"
|
||||
config.preferredBuildSystem = BuildSystem.GRADLE
|
||||
config.sourceLayout = SourceLayout.MAVEN
|
||||
config.projectLayout = ProjectLayout.HIERARCHICAL
|
||||
config.runtimeProject.testProject.enabled = true
|
||||
config.ideProject.enabled = true
|
||||
config.webProject.enabled = true
|
||||
config.intellijProject.enabled = true
|
||||
validateCreatedProjects
|
||||
}
|
||||
|
||||
@Test
|
||||
def testEclipsePluginProject() {
|
||||
config.baseName = "org.xtext.example.eclipsePlugin"
|
||||
config.preferredBuildSystem = BuildSystem.ECLIPSE
|
||||
config.sourceLayout = SourceLayout.PLAIN
|
||||
config.projectLayout = ProjectLayout.FLAT
|
||||
config.runtimeProject.testProject.enabled = true
|
||||
config.ideProject.enabled = true
|
||||
config.uiProject.enabled = true
|
||||
config.uiProject.testProject.enabled = true
|
||||
validateCreatedProjects
|
||||
}
|
||||
|
||||
@Test
|
||||
def testFullProject() {
|
||||
config.baseName = "org.xtext.example.full"
|
||||
config.preferredBuildSystem = BuildSystem.GRADLE
|
||||
config.sourceLayout = SourceLayout.PLAIN
|
||||
config.projectLayout = ProjectLayout.HIERARCHICAL
|
||||
config.runtimeProject.testProject.enabled = true
|
||||
config.uiProject.enabled = true
|
||||
config.uiProject.testProject.enabled = true
|
||||
config.ideProject.enabled = true
|
||||
config.webProject.enabled = true
|
||||
config.intellijProject.enabled = true
|
||||
validateCreatedProjects
|
||||
}
|
||||
|
||||
|
||||
private def void validateCreatedProjects() {
|
||||
val targetLocation = new File(temp.root, config.baseName)
|
||||
config.rootLocation = targetLocation.path
|
||||
creator.createProjects(config)
|
||||
|
||||
|
||||
val expectationLocation = new File("testdata/wizard-expectations", config.baseName)
|
||||
val expectedFiles= expectationLocation.toFileSet
|
||||
val expectedFiles = expectationLocation.toFileSet
|
||||
val actualFiles = targetLocation.toFileSet
|
||||
|
||||
|
||||
compareFileTrees(expectedFiles, actualFiles)
|
||||
}
|
||||
|
||||
|
||||
private def toFileSet(File root) {
|
||||
val allFiles = newArrayList
|
||||
collectAllFiles(root, allFiles)
|
||||
val generatedFiles = allFiles.map[
|
||||
val generatedFiles = allFiles.map [
|
||||
val relativePath = path.replace(root.path, "")
|
||||
toGeneratedFile(relativePath)
|
||||
];
|
||||
val Comparator<GeneratedFile> sortByPath = [$0.relativePath <=> $1.relativePath]
|
||||
newTreeSet(sortByPath, generatedFiles)
|
||||
}
|
||||
|
||||
|
||||
private def void collectAllFiles(File root, List<File> children) {
|
||||
children.add(root)
|
||||
if (root.isDirectory) {
|
||||
root.listFiles.forEach[collectAllFiles(children)]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private def toGeneratedFile(File file, String relativePath) {
|
||||
new GeneratedFile(relativePath, if (file.isDirectory) "" else Files.toString(file, config.encoding))
|
||||
new GeneratedFile(relativePath, if(file.isDirectory) "" else Files.toString(file, config.encoding))
|
||||
}
|
||||
|
||||
|
||||
private def compareFileTrees(Set<GeneratedFile> expectedFiles, Set<GeneratedFile> actualFiles) {
|
||||
val expectedFilesByPath = expectedFiles.toMap[relativePath]
|
||||
val actualFilesByPath = actualFiles.toMap[relativePath]
|
||||
|
||||
val difference = Sets.difference(expectedFiles, actualFiles)
|
||||
val missingFiles = difference.filter[expectedFiles.contains(it)]
|
||||
val unexpectedFiles = difference.filter[actualFiles.contains(it)]
|
||||
|
||||
val missingFiles = Sets.difference(actualFiles, expectedFiles)
|
||||
val unexpectedFiles = Sets.difference(expectedFiles, actualFiles)
|
||||
val comparableFiles = Sets.intersection(expectedFiles, actualFiles)
|
||||
|
||||
missingFiles.forEach[
|
||||
missingFiles.forEach [
|
||||
throw new ComparisonFailure('''Missing file: «relativePath»''', content, "")
|
||||
]
|
||||
unexpectedFiles.forEach[
|
||||
unexpectedFiles.forEach [
|
||||
throw new ComparisonFailure('''Unexpected file: «relativePath»''', "", content)
|
||||
]
|
||||
comparableFiles.forEach[
|
||||
comparableFiles.forEach [
|
||||
val expectedContent = LineDelimiters.toUnix(expectedFilesByPath.get(relativePath).content)
|
||||
val actualContent = LineDelimiters.toUnix(actualFilesByPath.get(relativePath).content)
|
||||
assertEquals(relativePath, expectedContent, actualContent)
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
@Data
|
||||
private static class GeneratedFile {
|
||||
String relativePath
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
|
||||
<id>jar-with-ecore-model</id>
|
||||
<formats>
|
||||
<format>jar</format>
|
||||
</formats>
|
||||
<includeBaseDirectory>false</includeBaseDirectory>
|
||||
<fileSets>
|
||||
<fileSet>
|
||||
<outputDirectory>/</outputDirectory>
|
||||
<directory>target/classes</directory>
|
||||
</fileSet>
|
||||
<fileSet>
|
||||
<outputDirectory>model/generated</outputDirectory>
|
||||
<directory>model/generated</directory>
|
||||
</fileSet>
|
||||
</fileSets>
|
||||
</assembly>
|
Loading…
Reference in a new issue