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()
|
generateTestDataForReservedWords()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val TEST_DATA_DIR_FOR_RESERVED_WORDS = "js/js.translator/testData/reservedWords/cases"
|
||||||
|
|
||||||
fun generateTestDataForReservedWords() {
|
fun generateTestDataForReservedWords() {
|
||||||
generate("js/js.translator/testData/reservedWords/cases") {
|
generate(TEST_DATA_DIR_FOR_RESERVED_WORDS) {
|
||||||
suite("toplevel",
|
suite("toplevel",
|
||||||
"""
|
"""
|
||||||
$DEFINITION_MARKER
|
$DEFINITION_MARKER
|
||||||
@@ -239,10 +241,29 @@ class TestDataBuilder() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun generate(testDataDirPath: String) {
|
fun generate(testDataDirPath: String) {
|
||||||
|
|
||||||
|
fun File.readLinesOrNull() = if (!exists()) null else readLines()
|
||||||
|
|
||||||
val testDataDir = File(testDataDirPath)
|
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()) {
|
if (!testDataDir.exists() && !testDataDir.mkdirs()) {
|
||||||
println("Unable to find or create test data dir: '$testDataDirPath'.")
|
error("Unable to find or create test data directory: '$testDataDirPath'.")
|
||||||
return
|
}
|
||||||
|
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) {
|
for (suite in suites) {
|
||||||
@@ -264,10 +285,19 @@ class TestDataBuilder() {
|
|||||||
|
|
||||||
val fileName = "${suite.name.decapitalize()}${case.name.capitalize()}${keyword.capitalize()}.kt"
|
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 TEST_BLOCK_MARKER = "TEST_BLOCK"
|
||||||
val KEYWORD_MARKER = "KEYWORD"
|
val KEYWORD_MARKER = "KEYWORD"
|
||||||
|
|
||||||
|
val PREAMBLE_MESSAGE = "NOTE THIS FILE IS AUTO-GENERATED by the generateTestDataForReservedWords.kt. DO NOT EDIT!"
|
||||||
val PREAMBLE = """package foo
|
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 })"
|
fun testRenamed(reference: String = "$KEYWORD_MARKER") = "testRenamed(\"$KEYWORD_MARKER\", { $reference })"
|
||||||
@@ -299,11 +330,8 @@ val testNotRenamedByRef = testNotRenamed("::$KEYWORD_MARKER")
|
|||||||
|
|
||||||
// KEYWORDS
|
// KEYWORDS
|
||||||
|
|
||||||
val ALL_KEYWORDS = JsFunctionScope.RESERVED_WORDS.toList()
|
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()
|
||||||
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()
|
|
||||||
|
|
||||||
|
|
||||||
// all keywords by portions
|
// all keywords by portions
|
||||||
|
|
||||||
@@ -321,11 +349,14 @@ fun <T> List<T>.cyclicStream() = CyclicStream(this)
|
|||||||
|
|
||||||
class CyclicStream<T>(val c: List<T>) : Stream<T> {
|
class CyclicStream<T>(val c: List<T>) : Stream<T> {
|
||||||
var i = 0
|
var i = 0
|
||||||
override fun iterator(): Iterator<T> = object : Iterator<T>{
|
|
||||||
|
val iterator = object : Iterator<T> {
|
||||||
override fun next(): T {
|
override fun next(): T {
|
||||||
i = if (i >= c.size) 0 else i
|
i = if (i >= c.size()) 0 else i
|
||||||
return c[i++]
|
return c[i++]
|
||||||
}
|
}
|
||||||
override fun hasNext(): Boolean = true
|
override fun hasNext(): Boolean = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun iterator(): Iterator<T> = iterator
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user