Improve testData generator for reserved words.
Cashing iterator in CyclicStream. Detect generating unexpected testdata file(e.g. may caused because of bug in stdlib).
This commit is contained in:
+43
-12
@@ -39,8 +39,10 @@ fun main(args: Array<String>) {
|
||||
generateTestDataForReservedWords()
|
||||
}
|
||||
|
||||
val TEST_DATA_DIR_FOR_RESERVED_WORDS = "js/js.translator/testData/reservedWords/cases"
|
||||
|
||||
fun generateTestDataForReservedWords() {
|
||||
generate("js/js.translator/testData/reservedWords/cases") {
|
||||
generate(TEST_DATA_DIR_FOR_RESERVED_WORDS) {
|
||||
suite("toplevel",
|
||||
"""
|
||||
$DEFINITION_MARKER
|
||||
@@ -239,10 +241,29 @@ class TestDataBuilder() {
|
||||
}
|
||||
|
||||
fun generate(testDataDirPath: String) {
|
||||
|
||||
fun File.readLinesOrNull() = if (!exists()) null else readLines()
|
||||
|
||||
val testDataDir = File(testDataDirPath)
|
||||
|
||||
val shouldBeEscapedFile = File("$testDataDirPath/SHOULD_BE_ESCAPED.txt")
|
||||
val shouldNotBeEscapedFile = File("$testDataDirPath/SHOULD_NOT_BE_ESCAPED.txt")
|
||||
|
||||
val shouldBeEscapedFromFile = shouldBeEscapedFile.readLinesOrNull()?.drop(1)
|
||||
val shouldNotBeEscapedFromFile = shouldNotBeEscapedFile.readLinesOrNull()?.drop(1)
|
||||
|
||||
val isCreatingFromScratch = shouldBeEscapedFromFile != SHOULD_BE_ESCAPED || shouldNotBeEscapedFromFile != SHOULD_NOT_BE_ESCAPED
|
||||
|
||||
if (!testDataDir.exists() && !testDataDir.mkdirs()) {
|
||||
println("Unable to find or create test data dir: '$testDataDirPath'.")
|
||||
return
|
||||
error("Unable to find or create test data directory: '$testDataDirPath'.")
|
||||
}
|
||||
else if (isCreatingFromScratch) {
|
||||
if (testDataDir.listFiles()?.all { it.delete() } ?: true) {
|
||||
println("Create testdata files from scratch.")
|
||||
}
|
||||
else {
|
||||
error("Can not clean testdata directory.")
|
||||
}
|
||||
}
|
||||
|
||||
for (suite in suites) {
|
||||
@@ -264,10 +285,19 @@ class TestDataBuilder() {
|
||||
|
||||
val fileName = "${suite.name.decapitalize()}${case.name.capitalize()}${keyword.capitalize()}.kt"
|
||||
|
||||
File(testDataDirPath + "/" + fileName).writeText(out)
|
||||
val testDataFile = File(testDataDirPath + "/" + fileName)
|
||||
|
||||
assert(isCreatingFromScratch xor testDataFile.exists(), "Unexpected file name: $fileName")
|
||||
|
||||
testDataFile.writeText(out)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isCreatingFromScratch) {
|
||||
shouldBeEscapedFile.writeText("$PREAMBLE_MESSAGE\n${SHOULD_BE_ESCAPED.join("\n")}")
|
||||
shouldNotBeEscapedFile.writeText("$PREAMBLE_MESSAGE\n${SHOULD_NOT_BE_ESCAPED.join("\n")}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -283,9 +313,10 @@ val DECLARATION_INIT_MARKER = "DECLARATION_INIT"
|
||||
val TEST_BLOCK_MARKER = "TEST_BLOCK"
|
||||
val KEYWORD_MARKER = "KEYWORD"
|
||||
|
||||
val PREAMBLE_MESSAGE = "NOTE THIS FILE IS AUTO-GENERATED by the generateTestDataForReservedWords.kt. DO NOT EDIT!"
|
||||
val PREAMBLE = """package foo
|
||||
|
||||
// NOTE THIS FILE IS AUTO-GENERATED by the generateTestDataForReservedWords.kt. DO NOT EDIT!
|
||||
// $PREAMBLE_MESSAGE
|
||||
"""
|
||||
|
||||
fun testRenamed(reference: String = "$KEYWORD_MARKER") = "testRenamed(\"$KEYWORD_MARKER\", { $reference })"
|
||||
@@ -299,11 +330,8 @@ val testNotRenamedByRef = testNotRenamed("::$KEYWORD_MARKER")
|
||||
|
||||
// KEYWORDS
|
||||
|
||||
val ALL_KEYWORDS = JsFunctionScope.RESERVED_WORDS.toList()
|
||||
|
||||
val SHOULD_BE_ESCAPED = (ALL_KEYWORDS.filter { it in KeywordStringsGenerated.KEYWORDS } union setOf("catch", "finally")).toSortedList()
|
||||
val SHOULD_NOT_BE_ESCAPED = ALL_KEYWORDS.filter { it !in SHOULD_BE_ESCAPED }.toSortedList()
|
||||
|
||||
val SHOULD_BE_ESCAPED = JsFunctionScope.RESERVED_WORDS.filter { it in KeywordStringsGenerated.KEYWORDS }.toSortedList()
|
||||
val SHOULD_NOT_BE_ESCAPED = JsFunctionScope.RESERVED_WORDS.filter { it !in SHOULD_BE_ESCAPED }.toSortedList()
|
||||
|
||||
// all keywords by portions
|
||||
|
||||
@@ -321,11 +349,14 @@ fun <T> List<T>.cyclicStream() = CyclicStream(this)
|
||||
|
||||
class CyclicStream<T>(val c: List<T>) : Stream<T> {
|
||||
var i = 0
|
||||
override fun iterator(): Iterator<T> = object : Iterator<T>{
|
||||
|
||||
val iterator = object : Iterator<T> {
|
||||
override fun next(): T {
|
||||
i = if (i >= c.size) 0 else i
|
||||
i = if (i >= c.size()) 0 else i
|
||||
return c[i++]
|
||||
}
|
||||
override fun hasNext(): Boolean = true
|
||||
}
|
||||
|
||||
override fun iterator(): Iterator<T> = iterator
|
||||
}
|
||||
Reference in New Issue
Block a user