[JS TESTS] Rewrite web demo tests using new test infrastructure
This commit is contained in:
+6
@@ -134,6 +134,12 @@ object JsEnvironmentConfigurationDirectives : SimpleDirectivesContainer() {
|
||||
applicability = DirectiveApplicability.Global,
|
||||
)
|
||||
|
||||
val MAIN_ARGS by valueDirective(
|
||||
description = "Specify arguments that will be passes to main fun",
|
||||
applicability = DirectiveApplicability.Global,
|
||||
parser = { it.subSequence(1, it.length - 1).split(",") }
|
||||
)
|
||||
|
||||
// Next directives are used only inside test system and must not be present in test file
|
||||
|
||||
val PATH_TO_TEST_DIR by stringDirective(
|
||||
|
||||
@@ -15,11 +15,11 @@ import org.jetbrains.kotlin.js.test.es6.semantics.AbstractIrJsCodegenBoxES6Test
|
||||
import org.jetbrains.kotlin.js.test.es6.semantics.AbstractIrJsCodegenInlineES6Test
|
||||
import org.jetbrains.kotlin.js.test.es6.semantics.AbstractIrJsTypeScriptExportES6Test
|
||||
import org.jetbrains.kotlin.js.test.ir.semantics.*
|
||||
import org.jetbrains.kotlin.js.test.semantics.*
|
||||
import org.jetbrains.kotlin.js.test.wasm.semantics.AbstractIrCodegenBoxWasmTest
|
||||
import org.jetbrains.kotlin.js.test.wasm.semantics.AbstractIrCodegenWasmJsInteropWasmTest
|
||||
import org.jetbrains.kotlin.js.test.wasm.semantics.AbstractJsTranslatorWasmTest
|
||||
import org.jetbrains.kotlin.js.testNew.*
|
||||
import org.jetbrains.kotlin.js.testNew.AbstractWebDemoExamplesTest
|
||||
import org.jetbrains.kotlin.test.TargetBackend
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
@@ -137,6 +137,10 @@ fun main(args: Array<String>) {
|
||||
testClass<AbstractMultiModuleOrderTest> {
|
||||
model("multiModuleOrder/")
|
||||
}
|
||||
|
||||
testClass<AbstractWebDemoExamplesTest> {
|
||||
model("webDemoExamples/")
|
||||
}
|
||||
}
|
||||
|
||||
testGroup("js/js.tests/tests-gen", "compiler/testData", testRunnerMethodName = "runTest0") {
|
||||
|
||||
-40
@@ -1,40 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.js.test.semantics
|
||||
|
||||
import com.google.common.collect.Lists
|
||||
import com.intellij.openapi.util.text.StringUtil
|
||||
import org.jetbrains.kotlin.js.facade.MainCallParameters
|
||||
import org.jetbrains.kotlin.js.test.BasicBoxTest
|
||||
import java.io.File
|
||||
import javax.script.ScriptException
|
||||
|
||||
abstract class AbstractWebDemoExamplesTest(relativePath: String) : BasicBoxTest(
|
||||
BasicBoxTest.TEST_DATA_DIR_PATH + "/$relativePath/",
|
||||
relativePath,
|
||||
generateNodeJsRunner = false
|
||||
) {
|
||||
override fun runGeneratedCode(
|
||||
jsFiles: List<String>,
|
||||
testModuleName: String?,
|
||||
testPackage: String?,
|
||||
testFunction: String,
|
||||
expectedResult: String,
|
||||
withModuleSystem: Boolean
|
||||
) {
|
||||
testChecker.checkStdout(jsFiles, expectedResult)
|
||||
}
|
||||
|
||||
@Throws(ScriptException::class)
|
||||
protected fun runMainAndCheckOutput(fileName: String, expectedResult: String, vararg args: String) {
|
||||
doTest(pathToTestDir + fileName, expectedResult, MainCallParameters.mainWithArguments(Lists.newArrayList(*args)))
|
||||
}
|
||||
|
||||
protected fun runMainAndCheckOutputWithExpectedFile(testName: String, testId: String, vararg args: String) {
|
||||
val expectedResult = StringUtil.convertLineSeparators(File(pathToTestDir + testName + testId + ".out").readText())
|
||||
doTest(pathToTestDir + testName + ".kt", expectedResult, MainCallParameters.mainWithArguments(Lists.newArrayList(*args)))
|
||||
}
|
||||
}
|
||||
@@ -1,93 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2015 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.js.test.semantics;
|
||||
|
||||
public final class WebDemoExamples1Test extends AbstractWebDemoExamplesTest {
|
||||
|
||||
public WebDemoExamples1Test() {
|
||||
super("webDemoExamples1/");
|
||||
}
|
||||
|
||||
public void testPrintArg() throws Exception {
|
||||
runMainAndCheckOutput("printArg.kt", "Hello, world!", "Hello, world!");
|
||||
}
|
||||
|
||||
|
||||
public void testWhileLoop() throws Exception {
|
||||
runMainAndCheckOutput("whileLoop.kt", "guest1\nguest2\nguest3\nguest4\n", "guest1", "guest2", "guest3", "guest4");
|
||||
}
|
||||
|
||||
|
||||
public void testIfAsExpression() throws Exception {
|
||||
runMainAndCheckOutput("ifAsExpression.kt", "20\n", "10", "20");
|
||||
}
|
||||
|
||||
|
||||
public void testObjectOrientedHello() throws Exception {
|
||||
runMainAndCheckOutput("objectOrientedHello.kt", "Hello, Pavel!\n", "Pavel");
|
||||
}
|
||||
|
||||
|
||||
public void testMultiLanguageHello() throws Exception {
|
||||
runMainAndCheckOutput("multiLanguageHello.kt", "Salut!\n", "FR");
|
||||
}
|
||||
|
||||
|
||||
public void testNullChecks() throws Exception {
|
||||
runMainAndCheckOutput("nullChecks.kt", "No number supplied");
|
||||
runMainAndCheckOutput("nullChecks.kt", "6", "2", "3");
|
||||
}
|
||||
|
||||
|
||||
public void testRanges() throws Exception {
|
||||
runMainAndCheckOutput("ranges.kt", "OK\n" +
|
||||
" 1 2 3 4 5\n" +
|
||||
"Out: array has only 3 elements. x = 4\n" +
|
||||
"Yes: array contains aaa\n" +
|
||||
"No: array doesn't contains ddd\n", "4");
|
||||
|
||||
runMainAndCheckOutput("ranges.kt", " 1 2 3 4 5\n" +
|
||||
"Out: array has only 3 elements. x = 10\n" +
|
||||
"Yes: array contains aaa\n" +
|
||||
"No: array doesn't contains ddd\n", "10");
|
||||
}
|
||||
|
||||
|
||||
public void testForLoop() throws Exception {
|
||||
runMainAndCheckOutput("forLoop.kt", "a\n" +
|
||||
"b\n" +
|
||||
"c\n" +
|
||||
"\n" +
|
||||
"a\n" +
|
||||
"b\n" +
|
||||
"c\n", "a", "b", "c");
|
||||
runMainAndCheckOutput("forLoop.kt", "123\n\n123\n", "123");
|
||||
}
|
||||
|
||||
|
||||
public void testIsCheck() throws Exception {
|
||||
runMainAndCheckOutput("isCheck.kt", "3\nnull\n");
|
||||
}
|
||||
|
||||
|
||||
public void testPatternMatching() throws Exception {
|
||||
runMainAndCheckOutput("patternMatching.kt", "Greeting\n" +
|
||||
"One\n" +
|
||||
"Not a string\n" +
|
||||
"Unknown\n");
|
||||
}
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2015 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.js.test.semantics;
|
||||
|
||||
public final class WebDemoExamples2Test extends AbstractWebDemoExamplesTest {
|
||||
|
||||
public WebDemoExamples2Test() {
|
||||
super("webDemoExamples2/");
|
||||
}
|
||||
|
||||
public void testBottles() throws Exception {
|
||||
runMainAndCheckOutputWithExpectedFile("bottles", "2", "2");
|
||||
runMainAndCheckOutputWithExpectedFile("bottles", "");
|
||||
}
|
||||
|
||||
public void testLife() throws Exception {
|
||||
runMainAndCheckOutputWithExpectedFile("life", "", "2");
|
||||
}
|
||||
|
||||
public void testBuilder() throws Exception {
|
||||
runMainAndCheckOutputWithExpectedFile("builder", "");
|
||||
runMainAndCheckOutputWithExpectedFile("builder", "1", "over9000");
|
||||
}
|
||||
}
|
||||
@@ -136,3 +136,22 @@ open class AbstractMultiModuleOrderTest : AbstractJsTest(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
open class AbstractWebDemoExamplesTest : AbstractJsTest(
|
||||
pathToTestDir = "${JsEnvironmentConfigurator.TEST_DATA_DIR_PATH}/webDemoExamples/",
|
||||
testGroupOutputDirPrefix = "webDemoExamples/"
|
||||
) {
|
||||
override fun configure(builder: TestConfigurationBuilder) {
|
||||
super.configure(builder)
|
||||
with(builder) {
|
||||
defaultDirectives {
|
||||
-JsEnvironmentConfigurationDirectives.GENERATE_NODE_JS_RUNNER
|
||||
JsEnvironmentConfigurationDirectives.DONT_RUN_GENERATED_CODE.with("JS")
|
||||
}
|
||||
|
||||
configureJsArtifactsHandlersStep {
|
||||
useHandlers(::MainCallWithArgumentsHandler)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+6
-2
@@ -5,6 +5,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.js.testNew.converters
|
||||
|
||||
import com.google.common.collect.Lists
|
||||
import com.intellij.openapi.util.io.FileUtil
|
||||
import com.intellij.openapi.util.text.StringUtil
|
||||
import org.jetbrains.kotlin.cli.common.output.writeAllTo
|
||||
@@ -82,8 +83,11 @@ class ClassicJsBackendFacade(
|
||||
|
||||
val units = unitsByPath.entries.sortedBy { it.key }.map { it.value }
|
||||
|
||||
val mainCallParameters = when (JsEnvironmentConfigurationDirectives.CALL_MAIN) {
|
||||
in module.directives -> MainCallParameters.mainWithArguments(listOf())
|
||||
val mainCallParameters = when {
|
||||
JsEnvironmentConfigurationDirectives.CALL_MAIN in module.directives -> MainCallParameters.mainWithArguments(listOf())
|
||||
JsEnvironmentConfigurationDirectives.MAIN_ARGS in module.directives -> {
|
||||
MainCallParameters.mainWithArguments(module.directives[JsEnvironmentConfigurationDirectives.MAIN_ARGS].first())
|
||||
}
|
||||
else -> MainCallParameters.noCall()
|
||||
}
|
||||
|
||||
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.js.testNew.handlers
|
||||
|
||||
import org.jetbrains.kotlin.js.testNew.utils.getOnlyJsFilesForRunner
|
||||
import org.jetbrains.kotlin.js.testNew.utils.getTestChecker
|
||||
import org.jetbrains.kotlin.test.services.TestServices
|
||||
import org.jetbrains.kotlin.test.services.moduleStructure
|
||||
|
||||
class MainCallWithArgumentsHandler(testServices: TestServices) : AbstractJsArtifactsCollector(testServices) {
|
||||
override fun processAfterAllModules(someAssertionWasFailed: Boolean) {
|
||||
if (someAssertionWasFailed) return
|
||||
|
||||
val testFile = testServices.moduleStructure.originalTestDataFiles.first()
|
||||
val expectedFile = testFile.parentFile.resolve(testFile.nameWithoutExtension + ".out")
|
||||
if (!expectedFile.exists()) {
|
||||
throw IllegalArgumentException("File ${expectedFile.absolutePath} with expected result doesn't exists")
|
||||
}
|
||||
val allJsFiles = getOnlyJsFilesForRunner(testServices, modulesToArtifact)
|
||||
|
||||
getTestChecker(testServices).checkStdout(allJsFiles, expectedFile.readText())
|
||||
}
|
||||
}
|
||||
+129
@@ -0,0 +1,129 @@
|
||||
/*
|
||||
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.js.testNew;
|
||||
|
||||
import com.intellij.testFramework.TestDataPath;
|
||||
import org.jetbrains.kotlin.test.util.KtTestUtil;
|
||||
import org.jetbrains.kotlin.test.TargetBackend;
|
||||
import org.jetbrains.kotlin.test.TestMetadata;
|
||||
import org.junit.jupiter.api.Nested;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/** This class is generated by {@link GenerateNewCompilerTests.kt}. DO NOT MODIFY MANUALLY */
|
||||
@SuppressWarnings("all")
|
||||
@TestMetadata("js/js.translator/testData/webDemoExamples")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
public class WebDemoExamplesTestGenerated extends AbstractWebDemoExamplesTest {
|
||||
@Test
|
||||
public void testAllFilesPresentInWebDemoExamples() throws Exception {
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/webDemoExamples"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("bottles.kt")
|
||||
public void testBottles() throws Exception {
|
||||
runTest("js/js.translator/testData/webDemoExamples/bottles.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("builder.kt")
|
||||
public void testBuilder() throws Exception {
|
||||
runTest("js/js.translator/testData/webDemoExamples/builder.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("forLoop1.kt")
|
||||
public void testForLoop1() throws Exception {
|
||||
runTest("js/js.translator/testData/webDemoExamples/forLoop1.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("forLoop2.kt")
|
||||
public void testForLoop2() throws Exception {
|
||||
runTest("js/js.translator/testData/webDemoExamples/forLoop2.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("ifAsExpression.kt")
|
||||
public void testIfAsExpression() throws Exception {
|
||||
runTest("js/js.translator/testData/webDemoExamples/ifAsExpression.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("isCheck.kt")
|
||||
public void testIsCheck() throws Exception {
|
||||
runTest("js/js.translator/testData/webDemoExamples/isCheck.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("life.kt")
|
||||
public void testLife() throws Exception {
|
||||
runTest("js/js.translator/testData/webDemoExamples/life.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("maze.kt")
|
||||
public void testMaze() throws Exception {
|
||||
runTest("js/js.translator/testData/webDemoExamples/maze.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("multiLanguageHello.kt")
|
||||
public void testMultiLanguageHello() throws Exception {
|
||||
runTest("js/js.translator/testData/webDemoExamples/multiLanguageHello.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("nullChecks1.kt")
|
||||
public void testNullChecks1() throws Exception {
|
||||
runTest("js/js.translator/testData/webDemoExamples/nullChecks1.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("nullChecks2.kt")
|
||||
public void testNullChecks2() throws Exception {
|
||||
runTest("js/js.translator/testData/webDemoExamples/nullChecks2.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("objectOrientedHello.kt")
|
||||
public void testObjectOrientedHello() throws Exception {
|
||||
runTest("js/js.translator/testData/webDemoExamples/objectOrientedHello.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("patternMatching.kt")
|
||||
public void testPatternMatching() throws Exception {
|
||||
runTest("js/js.translator/testData/webDemoExamples/patternMatching.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("printArg.kt")
|
||||
public void testPrintArg() throws Exception {
|
||||
runTest("js/js.translator/testData/webDemoExamples/printArg.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("ranges1.kt")
|
||||
public void testRanges1() throws Exception {
|
||||
runTest("js/js.translator/testData/webDemoExamples/ranges1.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("ranges2.kt")
|
||||
public void testRanges2() throws Exception {
|
||||
runTest("js/js.translator/testData/webDemoExamples/ranges2.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("whileLoop.kt")
|
||||
public void testWhileLoop() throws Exception {
|
||||
runTest("js/js.translator/testData/webDemoExamples/whileLoop.kt");
|
||||
}
|
||||
}
|
||||
+2
@@ -1,3 +1,5 @@
|
||||
// MAIN_ARGS: [2]
|
||||
|
||||
/**
|
||||
* This example implements the famous "99 Bottles of Beer" program
|
||||
* See http://99-bottles-of-beer.net/
|
||||
+2
@@ -1,3 +1,5 @@
|
||||
// MAIN_ARGS: [over9000]
|
||||
|
||||
/**
|
||||
* This is an example of a Type-Safe Groovy-style Builder
|
||||
*
|
||||
@@ -0,0 +1,11 @@
|
||||
// MAIN_ARGS: [a,b,c]
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
for (arg in args)
|
||||
println(arg)
|
||||
|
||||
// or
|
||||
println()
|
||||
for (i in args.indices)
|
||||
println(args[i])
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
a
|
||||
b
|
||||
c
|
||||
|
||||
a
|
||||
b
|
||||
c
|
||||
+2
@@ -1,3 +1,5 @@
|
||||
// MAIN_ARGS: [123]
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
for (arg in args)
|
||||
println(arg)
|
||||
@@ -0,0 +1,3 @@
|
||||
123
|
||||
|
||||
123
|
||||
+2
@@ -1,3 +1,5 @@
|
||||
// MAIN_ARGS: [10,20]
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
println(maxOf(args[0].toInt(), args[1].toInt()))
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
20
|
||||
+2
@@ -1,3 +1,5 @@
|
||||
// MAIN_ARGS: []
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
println(getStringLength("aaa"))
|
||||
println(getStringLength(1))
|
||||
@@ -0,0 +1,2 @@
|
||||
3
|
||||
null
|
||||
+2
@@ -1,3 +1,5 @@
|
||||
// MAIN_ARGS: [2]
|
||||
|
||||
/**
|
||||
* This is a straightforward implementation of The Game of Life
|
||||
* See http://en.wikipedia.org/wiki/Conway's_Game_of_Life
|
||||
+36
-46
@@ -1,3 +1,5 @@
|
||||
// MAIN_ARGS: []
|
||||
|
||||
/**
|
||||
* Let's Walk Through a Maze.
|
||||
*
|
||||
@@ -19,16 +21,19 @@
|
||||
* as I possibly can by finding a shortest path through the maze.
|
||||
*/
|
||||
|
||||
fun <E> MutableList<E>.offer(element: E) = this.add(element)
|
||||
fun <E> MutableList<E>.poll() = this.removeAt(0)
|
||||
|
||||
/**
|
||||
* This function looks for a path from max.start to maze.end through
|
||||
* free space (a path does not go through walls). One can move only
|
||||
* straightly up, down, left or right, no diagonal moves allowed.
|
||||
*/
|
||||
fun findPath(maze: Maze): List<Pair<Int, Int>>? {
|
||||
val previous = HashMap<Pair<Int, Int>, Pair<Int, Int>>
|
||||
val previous = HashMap<Pair<Int, Int>, Pair<Int, Int>>()
|
||||
|
||||
val queue = LinkedList<Pair<Int, Int>>
|
||||
val visited = HashSet<Pair<Int, Int>>
|
||||
val queue = ArrayDeque<Pair<Int, Int>>()
|
||||
val visited = HashSet<Pair<Int, Int>>()
|
||||
|
||||
queue.offer(maze.start)
|
||||
visited.add(maze.start)
|
||||
@@ -36,7 +41,7 @@ fun findPath(maze: Maze): List<Pair<Int, Int>>? {
|
||||
val cell = queue.poll()
|
||||
if (cell == maze.end) break
|
||||
|
||||
for (newCell in maze.neighbors(cell._1, cell._2)) {
|
||||
for (newCell in maze.neighbors(cell.first, cell.second)) {
|
||||
if (newCell in visited) continue
|
||||
previous[newCell] = cell
|
||||
queue.offer(newCell)
|
||||
@@ -49,7 +54,7 @@ fun findPath(maze: Maze): List<Pair<Int, Int>>? {
|
||||
val path = ArrayList<Pair<Int, Int>>()
|
||||
var current = previous[maze.end]
|
||||
while (current != maze.start) {
|
||||
path.add(0, current)
|
||||
path.add(0, current!!)
|
||||
current = previous[current]
|
||||
}
|
||||
return path
|
||||
@@ -59,7 +64,7 @@ fun findPath(maze: Maze): List<Pair<Int, Int>>? {
|
||||
* Find neighbors of the (i, j) cell that are not walls
|
||||
*/
|
||||
fun Maze.neighbors(i: Int, j: Int): List<Pair<Int, Int>> {
|
||||
val result = ArrayList<Pair<Int, Int>>
|
||||
val result = ArrayList<Pair<Int, Int>>()
|
||||
addIfFree(i - 1, j, result)
|
||||
addIfFree(i, j - 1, result)
|
||||
addIfFree(i + 1, j, result)
|
||||
@@ -67,7 +72,7 @@ fun Maze.neighbors(i: Int, j: Int): List<Pair<Int, Int>> {
|
||||
return result
|
||||
}
|
||||
|
||||
fun Maze.addIfFree(i: Int, j: Int, result: List<Pair<Int, Int>>) {
|
||||
fun Maze.addIfFree(i: Int, j: Int, result: MutableList<Pair<Int, Int>>) {
|
||||
if (i !in 0..height - 1) return
|
||||
if (j !in 0..width - 1) return
|
||||
if (walls[i][j]) return
|
||||
@@ -79,16 +84,16 @@ fun Maze.addIfFree(i: Int, j: Int, result: List<Pair<Int, Int>>) {
|
||||
* A data class that represents a maze
|
||||
*/
|
||||
class Maze(
|
||||
// Number or columns
|
||||
val width: Int,
|
||||
// Number of rows
|
||||
val height: Int,
|
||||
// true for a wall, false for free space
|
||||
val walls: Array<out Array<out Boolean>>,
|
||||
// The starting point (must not be a wall)
|
||||
val start: Pair<Int, Int>,
|
||||
// The target point (must not be a wall)
|
||||
val end: Pair<Int, Int>
|
||||
// Number or columns
|
||||
val width: Int,
|
||||
// Number of rows
|
||||
val height: Int,
|
||||
// true for a wall, false for free space
|
||||
val walls: Array<out Array<out Boolean>>,
|
||||
// The starting point (must not be a wall)
|
||||
val start: Pair<Int, Int>,
|
||||
// The target point (must not be a wall)
|
||||
val end: Pair<Int, Int>
|
||||
) {
|
||||
}
|
||||
|
||||
@@ -102,7 +107,7 @@ fun main(args: Array<String>) {
|
||||
O
|
||||
O
|
||||
O I
|
||||
""")
|
||||
""".trimIndent())
|
||||
printMaze("""
|
||||
OOOOOOOOOOO
|
||||
O $ O
|
||||
@@ -113,7 +118,7 @@ fun main(args: Array<String>) {
|
||||
O OOOOOOOOO
|
||||
O OO
|
||||
OOOOOO IO
|
||||
""")
|
||||
""".trimIndent())
|
||||
printMaze("""
|
||||
OOOOOOOOOOOOOOOOO
|
||||
O O
|
||||
@@ -124,7 +129,7 @@ fun main(args: Array<String>) {
|
||||
O O I O
|
||||
O O
|
||||
OOOOOOOOOOOOOOOOO
|
||||
""")
|
||||
""".trimIndent())
|
||||
}
|
||||
|
||||
// UTILITIES
|
||||
@@ -138,11 +143,11 @@ fun printMaze(str: String) {
|
||||
for (j in 0..maze.width - 1) {
|
||||
val cell = Pair(i, j)
|
||||
print(
|
||||
if (maze.walls[i][j]) "O"
|
||||
else if (cell == maze.start) "I"
|
||||
else if (cell == maze.end) "$"
|
||||
else if (path != null && path.contains(cell)) "~"
|
||||
else " "
|
||||
if (maze.walls[i][j]) "O"
|
||||
else if (cell == maze.start) "I"
|
||||
else if (cell == maze.end) "$"
|
||||
else if (path != null && path.contains(cell)) "~"
|
||||
else " "
|
||||
)
|
||||
}
|
||||
println("")
|
||||
@@ -171,12 +176,12 @@ fun printMaze(str: String) {
|
||||
*/
|
||||
fun makeMaze(s: String): Maze {
|
||||
val lines = s.split("\n")!!
|
||||
val w = max<String?>(lines.toList(), comparator<String?> { o1, o2 ->
|
||||
val l1: Int = o1?.size ?: 0
|
||||
val l2 = o2?.size ?: 0
|
||||
val w = lines.maxWithOrNull(Comparator { o1, o2 ->
|
||||
val l1: Int = o1?.length ?: 0
|
||||
val l2 = o2?.length ?: 0
|
||||
l1 - l2
|
||||
})!!
|
||||
val data = Array<Array<Boolean>>(lines.size) { Array<Boolean>(w.size) { false } }
|
||||
val data = Array<Array<Boolean>>(lines.size) { Array<Boolean>(w.length) { false } }
|
||||
|
||||
var start: Pair<Int, Int>? = null
|
||||
var end: Pair<Int, Int>? = null
|
||||
@@ -202,24 +207,9 @@ fun makeMaze(s: String): Maze {
|
||||
throw IllegalArgumentException("No goal point in the maze (should be indicated with a '$' sign)")
|
||||
}
|
||||
|
||||
return Maze(w.size, lines.size, data, start!!, end!!)
|
||||
return Maze(w.length, lines.size, data, start!!, end!!)
|
||||
}
|
||||
|
||||
|
||||
// An excerpt from the Standard Library
|
||||
val String?.indices: IntRange get() = IntRange(0, this!!.size)
|
||||
|
||||
fun <K, V> Map<K, V>.set(k: K, v: V) {
|
||||
put(k, v)
|
||||
}
|
||||
|
||||
fun comparator<T> (f: (T, T) -> Int): Comparator<T> = object : Comparator<T> {
|
||||
override fun compare(o1: T, o2: T): Int = f(o1, o2)
|
||||
override fun equals(p: Any?): Boolean = false
|
||||
}
|
||||
|
||||
fun <T, C : Collection<T>> Array<T>.to(result: C): C {
|
||||
for (elem in this)
|
||||
result.add(elem)
|
||||
return result
|
||||
}
|
||||
val String?.indices: IntRange get() = IntRange(0, this!!.length)
|
||||
+15
-20
@@ -7,39 +7,34 @@ I O $
|
||||
Result: No path
|
||||
|
||||
Maze:
|
||||
|
||||
O $
|
||||
O ~
|
||||
O ~
|
||||
O ~
|
||||
O ~~~~~~~~~I
|
||||
|
||||
O $
|
||||
O ~
|
||||
O ~
|
||||
O ~
|
||||
O ~~~~~~~~~I
|
||||
Result: Path found
|
||||
|
||||
Maze:
|
||||
|
||||
OOOOOOOOOOO
|
||||
O $~~~~~ O
|
||||
O $~~~~~ O
|
||||
OOOOOOO~OOO
|
||||
O ~~~ O
|
||||
O ~~~ O
|
||||
OOOOO~OOOOO
|
||||
O~~~~~ O
|
||||
O~~~~~ O
|
||||
O~OOOOOOOOO
|
||||
O~~~~~~ OO
|
||||
O~~~~~~ OO
|
||||
OOOOOO~~~IO
|
||||
|
||||
Result: Path found
|
||||
|
||||
Maze:
|
||||
|
||||
OOOOOOOOOOOOOOOOO
|
||||
O ~~~ O
|
||||
O$~~O~ O
|
||||
OOOOO~ O
|
||||
O ~~~~ O
|
||||
O ~~~ O
|
||||
O$~~O~ O
|
||||
OOOOO~ O
|
||||
O ~~~~ O
|
||||
O ~OOOOOOOOOOOOOO
|
||||
O ~ O I O
|
||||
O ~ O I O
|
||||
O ~~~~~~~~~~~~~ O
|
||||
OOOOOOOOOOOOOOOOO
|
||||
|
||||
Result: Path found
|
||||
|
||||
+2
@@ -1,3 +1,5 @@
|
||||
// MAIN_ARGS: [FR]
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val language = if (args.size == 0) "EN" else args[0]
|
||||
println(when (language) {
|
||||
@@ -0,0 +1 @@
|
||||
Salut!
|
||||
+2
@@ -1,3 +1,5 @@
|
||||
// MAIN_ARGS: []
|
||||
|
||||
// Return null if str does not hold a number
|
||||
fun myParseInt(str: String): Int? = str.toIntOrNull().also {
|
||||
if (it == null) println("One of arguments isn't Int")
|
||||
@@ -0,0 +1 @@
|
||||
No number supplied
|
||||
@@ -0,0 +1,21 @@
|
||||
// MAIN_ARGS: [2,3]
|
||||
|
||||
// Return null if str does not hold a number
|
||||
fun myParseInt(str: String): Int? = str.toIntOrNull().also {
|
||||
if (it == null) println("One of arguments isn't Int")
|
||||
}
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
if (args.size < 2) {
|
||||
print("No number supplied");
|
||||
}
|
||||
else {
|
||||
val x = myParseInt(args[0])
|
||||
val y = myParseInt(args[1])
|
||||
|
||||
// We cannot say 'x * y' now because they may hold nulls
|
||||
if (x != null && y != null) {
|
||||
print(x * y) // Now we can
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
6
|
||||
+2
@@ -1,3 +1,5 @@
|
||||
// MAIN_ARGS: [Pavel]
|
||||
|
||||
class Greeter(name: String) {
|
||||
val name = name
|
||||
fun greet() {
|
||||
@@ -0,0 +1 @@
|
||||
Hello, Pavel!
|
||||
+2
@@ -1,3 +1,5 @@
|
||||
// MAIN_ARGS: []
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
cases("Hello")
|
||||
cases(1)
|
||||
@@ -0,0 +1,4 @@
|
||||
Greeting
|
||||
One
|
||||
Not a string
|
||||
Unknown
|
||||
+2
@@ -1,3 +1,5 @@
|
||||
// MAIN_ARGS: [Hello_world!]
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
print(args[0]);
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
Hello_world!
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// MAIN_ARGS: [4]
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val x = args[0].toInt()
|
||||
@@ -0,0 +1,5 @@
|
||||
OK
|
||||
1 2 3 4 5
|
||||
Out: array has only 3 elements. x = 4
|
||||
Yes: array contains aaa
|
||||
No: array doesn't contains ddd
|
||||
@@ -0,0 +1,35 @@
|
||||
// MAIN_ARGS: [10]
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val x = args[0].toInt()
|
||||
//Check if a number lies within a range:
|
||||
val y = 10
|
||||
if (x in 1..y - 1)
|
||||
println("OK")
|
||||
|
||||
//Iterate over a range:
|
||||
for (a in 1..5)
|
||||
print(" ${a}")
|
||||
|
||||
//Check if a number is out of range:
|
||||
println()
|
||||
val array = mutableListOf<String>()
|
||||
|
||||
array.add("aaa")
|
||||
array.add("bbb")
|
||||
array.add("ccc")
|
||||
|
||||
if (x !in 0..array.size)
|
||||
println("Out: array has only ${array.size} elements. x = ${x}")
|
||||
|
||||
//Check if a collection contains an object:
|
||||
if ("aaa" in array) // collection.contains(obj) is called
|
||||
println("Yes: array contains aaa")
|
||||
|
||||
if ("ddd" in array) // collection.contains(obj) is called
|
||||
println("Yes: array contains ddd")
|
||||
else
|
||||
println("No: array doesn't contains ddd")
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
1 2 3 4 5
|
||||
Out: array has only 3 elements. x = 10
|
||||
Yes: array contains aaa
|
||||
No: array doesn't contains ddd
|
||||
+2
@@ -1,3 +1,5 @@
|
||||
// MAIN_ARGS: [guest1,guest2,guest3,guest4]
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
var i = 0
|
||||
while (i < args.size)
|
||||
@@ -0,0 +1,4 @@
|
||||
guest1
|
||||
guest2
|
||||
guest3
|
||||
guest4
|
||||
@@ -1,301 +0,0 @@
|
||||
The "99 bottles of beer" song
|
||||
|
||||
99 bottles of beer on the wall, 99 bottles of beer.
|
||||
Take one down, pass it around, 98 bottles of beer on the wall.
|
||||
|
||||
98 bottles of beer on the wall, 98 bottles of beer.
|
||||
Take one down, pass it around, 97 bottles of beer on the wall.
|
||||
|
||||
97 bottles of beer on the wall, 97 bottles of beer.
|
||||
Take one down, pass it around, 96 bottles of beer on the wall.
|
||||
|
||||
96 bottles of beer on the wall, 96 bottles of beer.
|
||||
Take one down, pass it around, 95 bottles of beer on the wall.
|
||||
|
||||
95 bottles of beer on the wall, 95 bottles of beer.
|
||||
Take one down, pass it around, 94 bottles of beer on the wall.
|
||||
|
||||
94 bottles of beer on the wall, 94 bottles of beer.
|
||||
Take one down, pass it around, 93 bottles of beer on the wall.
|
||||
|
||||
93 bottles of beer on the wall, 93 bottles of beer.
|
||||
Take one down, pass it around, 92 bottles of beer on the wall.
|
||||
|
||||
92 bottles of beer on the wall, 92 bottles of beer.
|
||||
Take one down, pass it around, 91 bottles of beer on the wall.
|
||||
|
||||
91 bottles of beer on the wall, 91 bottles of beer.
|
||||
Take one down, pass it around, 90 bottles of beer on the wall.
|
||||
|
||||
90 bottles of beer on the wall, 90 bottles of beer.
|
||||
Take one down, pass it around, 89 bottles of beer on the wall.
|
||||
|
||||
89 bottles of beer on the wall, 89 bottles of beer.
|
||||
Take one down, pass it around, 88 bottles of beer on the wall.
|
||||
|
||||
88 bottles of beer on the wall, 88 bottles of beer.
|
||||
Take one down, pass it around, 87 bottles of beer on the wall.
|
||||
|
||||
87 bottles of beer on the wall, 87 bottles of beer.
|
||||
Take one down, pass it around, 86 bottles of beer on the wall.
|
||||
|
||||
86 bottles of beer on the wall, 86 bottles of beer.
|
||||
Take one down, pass it around, 85 bottles of beer on the wall.
|
||||
|
||||
85 bottles of beer on the wall, 85 bottles of beer.
|
||||
Take one down, pass it around, 84 bottles of beer on the wall.
|
||||
|
||||
84 bottles of beer on the wall, 84 bottles of beer.
|
||||
Take one down, pass it around, 83 bottles of beer on the wall.
|
||||
|
||||
83 bottles of beer on the wall, 83 bottles of beer.
|
||||
Take one down, pass it around, 82 bottles of beer on the wall.
|
||||
|
||||
82 bottles of beer on the wall, 82 bottles of beer.
|
||||
Take one down, pass it around, 81 bottles of beer on the wall.
|
||||
|
||||
81 bottles of beer on the wall, 81 bottles of beer.
|
||||
Take one down, pass it around, 80 bottles of beer on the wall.
|
||||
|
||||
80 bottles of beer on the wall, 80 bottles of beer.
|
||||
Take one down, pass it around, 79 bottles of beer on the wall.
|
||||
|
||||
79 bottles of beer on the wall, 79 bottles of beer.
|
||||
Take one down, pass it around, 78 bottles of beer on the wall.
|
||||
|
||||
78 bottles of beer on the wall, 78 bottles of beer.
|
||||
Take one down, pass it around, 77 bottles of beer on the wall.
|
||||
|
||||
77 bottles of beer on the wall, 77 bottles of beer.
|
||||
Take one down, pass it around, 76 bottles of beer on the wall.
|
||||
|
||||
76 bottles of beer on the wall, 76 bottles of beer.
|
||||
Take one down, pass it around, 75 bottles of beer on the wall.
|
||||
|
||||
75 bottles of beer on the wall, 75 bottles of beer.
|
||||
Take one down, pass it around, 74 bottles of beer on the wall.
|
||||
|
||||
74 bottles of beer on the wall, 74 bottles of beer.
|
||||
Take one down, pass it around, 73 bottles of beer on the wall.
|
||||
|
||||
73 bottles of beer on the wall, 73 bottles of beer.
|
||||
Take one down, pass it around, 72 bottles of beer on the wall.
|
||||
|
||||
72 bottles of beer on the wall, 72 bottles of beer.
|
||||
Take one down, pass it around, 71 bottles of beer on the wall.
|
||||
|
||||
71 bottles of beer on the wall, 71 bottles of beer.
|
||||
Take one down, pass it around, 70 bottles of beer on the wall.
|
||||
|
||||
70 bottles of beer on the wall, 70 bottles of beer.
|
||||
Take one down, pass it around, 69 bottles of beer on the wall.
|
||||
|
||||
69 bottles of beer on the wall, 69 bottles of beer.
|
||||
Take one down, pass it around, 68 bottles of beer on the wall.
|
||||
|
||||
68 bottles of beer on the wall, 68 bottles of beer.
|
||||
Take one down, pass it around, 67 bottles of beer on the wall.
|
||||
|
||||
67 bottles of beer on the wall, 67 bottles of beer.
|
||||
Take one down, pass it around, 66 bottles of beer on the wall.
|
||||
|
||||
66 bottles of beer on the wall, 66 bottles of beer.
|
||||
Take one down, pass it around, 65 bottles of beer on the wall.
|
||||
|
||||
65 bottles of beer on the wall, 65 bottles of beer.
|
||||
Take one down, pass it around, 64 bottles of beer on the wall.
|
||||
|
||||
64 bottles of beer on the wall, 64 bottles of beer.
|
||||
Take one down, pass it around, 63 bottles of beer on the wall.
|
||||
|
||||
63 bottles of beer on the wall, 63 bottles of beer.
|
||||
Take one down, pass it around, 62 bottles of beer on the wall.
|
||||
|
||||
62 bottles of beer on the wall, 62 bottles of beer.
|
||||
Take one down, pass it around, 61 bottles of beer on the wall.
|
||||
|
||||
61 bottles of beer on the wall, 61 bottles of beer.
|
||||
Take one down, pass it around, 60 bottles of beer on the wall.
|
||||
|
||||
60 bottles of beer on the wall, 60 bottles of beer.
|
||||
Take one down, pass it around, 59 bottles of beer on the wall.
|
||||
|
||||
59 bottles of beer on the wall, 59 bottles of beer.
|
||||
Take one down, pass it around, 58 bottles of beer on the wall.
|
||||
|
||||
58 bottles of beer on the wall, 58 bottles of beer.
|
||||
Take one down, pass it around, 57 bottles of beer on the wall.
|
||||
|
||||
57 bottles of beer on the wall, 57 bottles of beer.
|
||||
Take one down, pass it around, 56 bottles of beer on the wall.
|
||||
|
||||
56 bottles of beer on the wall, 56 bottles of beer.
|
||||
Take one down, pass it around, 55 bottles of beer on the wall.
|
||||
|
||||
55 bottles of beer on the wall, 55 bottles of beer.
|
||||
Take one down, pass it around, 54 bottles of beer on the wall.
|
||||
|
||||
54 bottles of beer on the wall, 54 bottles of beer.
|
||||
Take one down, pass it around, 53 bottles of beer on the wall.
|
||||
|
||||
53 bottles of beer on the wall, 53 bottles of beer.
|
||||
Take one down, pass it around, 52 bottles of beer on the wall.
|
||||
|
||||
52 bottles of beer on the wall, 52 bottles of beer.
|
||||
Take one down, pass it around, 51 bottles of beer on the wall.
|
||||
|
||||
51 bottles of beer on the wall, 51 bottles of beer.
|
||||
Take one down, pass it around, 50 bottles of beer on the wall.
|
||||
|
||||
50 bottles of beer on the wall, 50 bottles of beer.
|
||||
Take one down, pass it around, 49 bottles of beer on the wall.
|
||||
|
||||
49 bottles of beer on the wall, 49 bottles of beer.
|
||||
Take one down, pass it around, 48 bottles of beer on the wall.
|
||||
|
||||
48 bottles of beer on the wall, 48 bottles of beer.
|
||||
Take one down, pass it around, 47 bottles of beer on the wall.
|
||||
|
||||
47 bottles of beer on the wall, 47 bottles of beer.
|
||||
Take one down, pass it around, 46 bottles of beer on the wall.
|
||||
|
||||
46 bottles of beer on the wall, 46 bottles of beer.
|
||||
Take one down, pass it around, 45 bottles of beer on the wall.
|
||||
|
||||
45 bottles of beer on the wall, 45 bottles of beer.
|
||||
Take one down, pass it around, 44 bottles of beer on the wall.
|
||||
|
||||
44 bottles of beer on the wall, 44 bottles of beer.
|
||||
Take one down, pass it around, 43 bottles of beer on the wall.
|
||||
|
||||
43 bottles of beer on the wall, 43 bottles of beer.
|
||||
Take one down, pass it around, 42 bottles of beer on the wall.
|
||||
|
||||
42 bottles of beer on the wall, 42 bottles of beer.
|
||||
Take one down, pass it around, 41 bottles of beer on the wall.
|
||||
|
||||
41 bottles of beer on the wall, 41 bottles of beer.
|
||||
Take one down, pass it around, 40 bottles of beer on the wall.
|
||||
|
||||
40 bottles of beer on the wall, 40 bottles of beer.
|
||||
Take one down, pass it around, 39 bottles of beer on the wall.
|
||||
|
||||
39 bottles of beer on the wall, 39 bottles of beer.
|
||||
Take one down, pass it around, 38 bottles of beer on the wall.
|
||||
|
||||
38 bottles of beer on the wall, 38 bottles of beer.
|
||||
Take one down, pass it around, 37 bottles of beer on the wall.
|
||||
|
||||
37 bottles of beer on the wall, 37 bottles of beer.
|
||||
Take one down, pass it around, 36 bottles of beer on the wall.
|
||||
|
||||
36 bottles of beer on the wall, 36 bottles of beer.
|
||||
Take one down, pass it around, 35 bottles of beer on the wall.
|
||||
|
||||
35 bottles of beer on the wall, 35 bottles of beer.
|
||||
Take one down, pass it around, 34 bottles of beer on the wall.
|
||||
|
||||
34 bottles of beer on the wall, 34 bottles of beer.
|
||||
Take one down, pass it around, 33 bottles of beer on the wall.
|
||||
|
||||
33 bottles of beer on the wall, 33 bottles of beer.
|
||||
Take one down, pass it around, 32 bottles of beer on the wall.
|
||||
|
||||
32 bottles of beer on the wall, 32 bottles of beer.
|
||||
Take one down, pass it around, 31 bottles of beer on the wall.
|
||||
|
||||
31 bottles of beer on the wall, 31 bottles of beer.
|
||||
Take one down, pass it around, 30 bottles of beer on the wall.
|
||||
|
||||
30 bottles of beer on the wall, 30 bottles of beer.
|
||||
Take one down, pass it around, 29 bottles of beer on the wall.
|
||||
|
||||
29 bottles of beer on the wall, 29 bottles of beer.
|
||||
Take one down, pass it around, 28 bottles of beer on the wall.
|
||||
|
||||
28 bottles of beer on the wall, 28 bottles of beer.
|
||||
Take one down, pass it around, 27 bottles of beer on the wall.
|
||||
|
||||
27 bottles of beer on the wall, 27 bottles of beer.
|
||||
Take one down, pass it around, 26 bottles of beer on the wall.
|
||||
|
||||
26 bottles of beer on the wall, 26 bottles of beer.
|
||||
Take one down, pass it around, 25 bottles of beer on the wall.
|
||||
|
||||
25 bottles of beer on the wall, 25 bottles of beer.
|
||||
Take one down, pass it around, 24 bottles of beer on the wall.
|
||||
|
||||
24 bottles of beer on the wall, 24 bottles of beer.
|
||||
Take one down, pass it around, 23 bottles of beer on the wall.
|
||||
|
||||
23 bottles of beer on the wall, 23 bottles of beer.
|
||||
Take one down, pass it around, 22 bottles of beer on the wall.
|
||||
|
||||
22 bottles of beer on the wall, 22 bottles of beer.
|
||||
Take one down, pass it around, 21 bottles of beer on the wall.
|
||||
|
||||
21 bottles of beer on the wall, 21 bottles of beer.
|
||||
Take one down, pass it around, 20 bottles of beer on the wall.
|
||||
|
||||
20 bottles of beer on the wall, 20 bottles of beer.
|
||||
Take one down, pass it around, 19 bottles of beer on the wall.
|
||||
|
||||
19 bottles of beer on the wall, 19 bottles of beer.
|
||||
Take one down, pass it around, 18 bottles of beer on the wall.
|
||||
|
||||
18 bottles of beer on the wall, 18 bottles of beer.
|
||||
Take one down, pass it around, 17 bottles of beer on the wall.
|
||||
|
||||
17 bottles of beer on the wall, 17 bottles of beer.
|
||||
Take one down, pass it around, 16 bottles of beer on the wall.
|
||||
|
||||
16 bottles of beer on the wall, 16 bottles of beer.
|
||||
Take one down, pass it around, 15 bottles of beer on the wall.
|
||||
|
||||
15 bottles of beer on the wall, 15 bottles of beer.
|
||||
Take one down, pass it around, 14 bottles of beer on the wall.
|
||||
|
||||
14 bottles of beer on the wall, 14 bottles of beer.
|
||||
Take one down, pass it around, 13 bottles of beer on the wall.
|
||||
|
||||
13 bottles of beer on the wall, 13 bottles of beer.
|
||||
Take one down, pass it around, 12 bottles of beer on the wall.
|
||||
|
||||
12 bottles of beer on the wall, 12 bottles of beer.
|
||||
Take one down, pass it around, 11 bottles of beer on the wall.
|
||||
|
||||
11 bottles of beer on the wall, 11 bottles of beer.
|
||||
Take one down, pass it around, 10 bottles of beer on the wall.
|
||||
|
||||
10 bottles of beer on the wall, 10 bottles of beer.
|
||||
Take one down, pass it around, 9 bottles of beer on the wall.
|
||||
|
||||
9 bottles of beer on the wall, 9 bottles of beer.
|
||||
Take one down, pass it around, 8 bottles of beer on the wall.
|
||||
|
||||
8 bottles of beer on the wall, 8 bottles of beer.
|
||||
Take one down, pass it around, 7 bottles of beer on the wall.
|
||||
|
||||
7 bottles of beer on the wall, 7 bottles of beer.
|
||||
Take one down, pass it around, 6 bottles of beer on the wall.
|
||||
|
||||
6 bottles of beer on the wall, 6 bottles of beer.
|
||||
Take one down, pass it around, 5 bottles of beer on the wall.
|
||||
|
||||
5 bottles of beer on the wall, 5 bottles of beer.
|
||||
Take one down, pass it around, 4 bottles of beer on the wall.
|
||||
|
||||
4 bottles of beer on the wall, 4 bottles of beer.
|
||||
Take one down, pass it around, 3 bottles of beer on the wall.
|
||||
|
||||
3 bottles of beer on the wall, 3 bottles of beer.
|
||||
Take one down, pass it around, 2 bottles of beer on the wall.
|
||||
|
||||
2 bottles of beer on the wall, 2 bottles of beer.
|
||||
Take one down, pass it around, 1 bottle of beer on the wall.
|
||||
|
||||
1 bottle of beer on the wall, 1 bottle of beer.
|
||||
Take one down, pass it around, no more bottles of beer on the wall.
|
||||
|
||||
No more bottles of beer on the wall, no more bottles of beer.
|
||||
Go to the store and buy some more, 99 bottles of beer on the wall.
|
||||
@@ -1,38 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>
|
||||
XML encoding with Kotlin
|
||||
</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>
|
||||
XML encoding with Kotlin
|
||||
</h1>
|
||||
<p>
|
||||
this format can be used as an alternative markup to XML
|
||||
</p>
|
||||
<a href="https://jetbrains.com/kotlin">
|
||||
Kotlin
|
||||
</a>
|
||||
<p>
|
||||
This is some
|
||||
<b>
|
||||
mixed
|
||||
</b>
|
||||
text. For more see the
|
||||
<a href="https://jetbrains.com/kotlin">
|
||||
Kotlin
|
||||
</a>
|
||||
project
|
||||
</p>
|
||||
<p>
|
||||
some text
|
||||
</p>
|
||||
<p>
|
||||
Command line arguments were:
|
||||
<ul>
|
||||
</ul>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user