add more array based tests and JS compliant typesafe array constructor functions
This commit is contained in:
@@ -3,8 +3,33 @@ package kotlin
|
||||
import java.util.*
|
||||
|
||||
library("comparator")
|
||||
public fun comparator<T>(f : (T, T) -> Int) : Comparator<T> = js.noImpl
|
||||
public fun comparator<T>(f : (T, T) -> Int): Comparator<T> = js.noImpl
|
||||
|
||||
library("array")
|
||||
public fun <T> array(vararg value: T): Array<T> = js.noImpl
|
||||
|
||||
// "constructors" for primitive types array
|
||||
library("array")
|
||||
public fun doubleArray(vararg content : Double): DoubleArray = js.noImpl
|
||||
|
||||
library("array")
|
||||
public fun floatArray(vararg content : Float): FloatArray = js.noImpl
|
||||
|
||||
library("array")
|
||||
public fun longArray(vararg content : Long): LongArray = js.noImpl
|
||||
|
||||
library("array")
|
||||
public fun intArray(vararg content : Int): IntArray = js.noImpl
|
||||
|
||||
library("array")
|
||||
public fun charArray(vararg content : Char): CharArray = js.noImpl
|
||||
|
||||
library("array")
|
||||
public fun shortArray(vararg content : Short): ShortArray = js.noImpl
|
||||
|
||||
library("array")
|
||||
public fun byteArray(vararg content : Byte): ByteArray = js.noImpl
|
||||
|
||||
library("array")
|
||||
public fun booleanArray(vararg content : Boolean): BooleanArray = js.noImpl
|
||||
|
||||
|
||||
@@ -61,6 +61,7 @@ public class CompileMavenGeneratedJSLibrary extends SingleFileTranslationTest {
|
||||
if (generatedJsLibraryDir.exists() && generatedJsLibraryDir.isDirectory()) {
|
||||
generateJavaScriptFiles(EcmaVersion.all(),
|
||||
"libraries/stdlib/test",
|
||||
"ArraysTest.kt",
|
||||
"dom/DomTest.kt",
|
||||
"js/MapTest.kt",
|
||||
"js/JsDomTest.kt",
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
package test.arrays
|
||||
|
||||
import kotlin.test.*
|
||||
import org.junit.Test as test
|
||||
|
||||
class ArraysJVMTest {
|
||||
|
||||
test fun copyOf() {
|
||||
checkContent(booleanArray(true, false, true, false, true, false).copyOf().iterator(), 6) { it % 2 == 0 }
|
||||
checkContent(byteArray(0, 1, 2, 3, 4, 5).copyOf().iterator(), 6) { it.toByte() }
|
||||
checkContent(shortArray(0, 1, 2, 3, 4, 5).copyOf().iterator(), 6) { it.toShort() }
|
||||
checkContent(intArray(0, 1, 2, 3, 4, 5).copyOf().iterator(), 6) { it }
|
||||
checkContent(longArray(0, 1, 2, 3, 4, 5).copyOf().iterator(), 6) { it.toLong() }
|
||||
checkContent(floatArray(0.toFloat(), 1.toFloat(), 2.toFloat(), 3.toFloat()).copyOf().iterator(), 4) { it.toFloat() }
|
||||
checkContent(doubleArray(0.0, 1.0, 2.0, 3.0, 4.0, 5.0).copyOf().iterator(), 6) { it.toDouble() }
|
||||
checkContent(charArray('0', '1', '2', '3', '4', '5').copyOf().iterator(), 6) { (it + '0').toChar() }
|
||||
}
|
||||
|
||||
test fun copyOfRange() {
|
||||
checkContent(booleanArray(true, false, true, false, true, false).copyOfRange(0, 3).iterator(), 3) { it % 2 == 0 }
|
||||
checkContent(byteArray(0, 1, 2, 3, 4, 5).copyOfRange(0, 3).iterator(), 3) { it.toByte() }
|
||||
checkContent(shortArray(0, 1, 2, 3, 4, 5).copyOfRange(0, 3).iterator(), 3) { it.toShort() }
|
||||
checkContent(intArray(0, 1, 2, 3, 4, 5).copyOfRange(0, 3).iterator(), 3) { it }
|
||||
checkContent(longArray(0, 1, 2, 3, 4, 5).copyOfRange(0, 3).iterator(), 3) { it.toLong() }
|
||||
checkContent(floatArray(0.toFloat(), 1.toFloat(), 2.toFloat(), 3.toFloat()).copyOfRange(0, 3).iterator(), 3) { it.toFloat() }
|
||||
checkContent(doubleArray(0.0, 1.0, 2.0, 3.0, 4.0, 5.0).copyOfRange(0, 3).iterator(), 3) { it.toDouble() }
|
||||
checkContent(charArray('0', '1', '2', '3', '4', '5').copyOfRange(0, 3).iterator(), 3) { (it + '0').toChar() }
|
||||
}
|
||||
|
||||
test fun reduce() {
|
||||
expect(-4) { intArray(1, 2, 3) reduce { a, b -> a - b } }
|
||||
expect(-4.toLong()) { longArray(1, 2, 3) reduce { a, b -> a - b } }
|
||||
expect(-4.toFloat()) { floatArray(1.toFloat(), 2.toFloat(), 3.toFloat()) reduce { a, b -> a - b } }
|
||||
expect(-4.0) { doubleArray(1.0, 2.0, 3.0) reduce { a, b -> a - b } }
|
||||
expect('3') { charArray('1', '3', '2') reduce { a, b -> if(a > b) a else b } }
|
||||
expect(false) { booleanArray(true, true, false) reduce { a, b -> a && b } }
|
||||
expect(true) { booleanArray(true, true) reduce { a, b -> a && b } }
|
||||
expect(0.toByte()) { byteArray(3, 2, 1) reduce { a, b -> (a - b).toByte() } }
|
||||
expect(0.toShort()) { shortArray(3, 2, 1) reduce { a, b -> (a - b).toShort() } }
|
||||
|
||||
failsWith<UnsupportedOperationException> {
|
||||
intArray().reduce { a, b -> a + b}
|
||||
}
|
||||
}
|
||||
|
||||
test fun reduceRight() {
|
||||
expect(2) { intArray(1, 2, 3) reduceRight { a, b -> a - b } }
|
||||
expect(2.toLong()) { longArray(1, 2, 3) reduceRight { a, b -> a - b } }
|
||||
expect(2.toFloat()) { floatArray(1.toFloat(), 2.toFloat(), 3.toFloat()) reduceRight { a, b -> a - b } }
|
||||
expect(2.0) { doubleArray(1.0, 2.0, 3.0) reduceRight { a, b -> a - b } }
|
||||
expect('3') { charArray('1', '3', '2') reduceRight { a, b -> if(a > b) a else b } }
|
||||
expect(false) { booleanArray(true, true, false) reduceRight { a, b -> a && b } }
|
||||
expect(true) { booleanArray(true, true) reduceRight { a, b -> a && b } }
|
||||
expect(2.toByte()) { byteArray(1, 2, 3) reduceRight { a, b -> (a - b).toByte() } }
|
||||
expect(2.toShort()) { shortArray(1, 2, 3) reduceRight { a, b -> (a - b).toShort() } }
|
||||
|
||||
failsWith<UnsupportedOperationException> {
|
||||
intArray().reduceRight { a, b -> a + b}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,41 +3,18 @@ package test.arrays
|
||||
import kotlin.test.*
|
||||
import org.junit.Test as test
|
||||
|
||||
fun <T> checkContent(val iter : Iterator<T>, val length : Int, val value : (Int) -> T) {
|
||||
var idx = 0
|
||||
while (idx != length && iter.hasNext) {
|
||||
assertEquals(value(idx++), iter.next(), "Invalid element")
|
||||
}
|
||||
|
||||
assertEquals(length, idx, "Invalid length")
|
||||
assertFalse(iter.hasNext, "Invalid length (hasNext)")
|
||||
}
|
||||
|
||||
class ArraysTest {
|
||||
|
||||
test fun copyOf() {
|
||||
checkContent(booleanArray(true, false, true, false, true, false).copyOf().iterator(), 6) { it % 2 == 0 }
|
||||
checkContent(byteArray(0, 1, 2, 3, 4, 5).copyOf().iterator(), 6) { it.toByte() }
|
||||
checkContent(shortArray(0, 1, 2, 3, 4, 5).copyOf().iterator(), 6) { it.toShort() }
|
||||
checkContent(intArray(0, 1, 2, 3, 4, 5).copyOf().iterator(), 6) { it }
|
||||
checkContent(longArray(0, 1, 2, 3, 4, 5).copyOf().iterator(), 6) { it.toLong() }
|
||||
checkContent(floatArray(0.toFloat(), 1.toFloat(), 2.toFloat(), 3.toFloat()).copyOf().iterator(), 4) { it.toFloat() }
|
||||
checkContent(doubleArray(0.0, 1.0, 2.0, 3.0, 4.0, 5.0).copyOf().iterator(), 6) { it.toDouble() }
|
||||
checkContent(charArray('0', '1', '2', '3', '4', '5').copyOf().iterator(), 6) { (it + '0').toChar() }
|
||||
}
|
||||
|
||||
test fun copyOfRange() {
|
||||
checkContent(booleanArray(true, false, true, false, true, false).copyOfRange(0, 3).iterator(), 3) { it % 2 == 0 }
|
||||
checkContent(byteArray(0, 1, 2, 3, 4, 5).copyOfRange(0, 3).iterator(), 3) { it.toByte() }
|
||||
checkContent(shortArray(0, 1, 2, 3, 4, 5).copyOfRange(0, 3).iterator(), 3) { it.toShort() }
|
||||
checkContent(intArray(0, 1, 2, 3, 4, 5).copyOfRange(0, 3).iterator(), 3) { it }
|
||||
checkContent(longArray(0, 1, 2, 3, 4, 5).copyOfRange(0, 3).iterator(), 3) { it.toLong() }
|
||||
checkContent(floatArray(0.toFloat(), 1.toFloat(), 2.toFloat(), 3.toFloat()).copyOfRange(0, 3).iterator(), 3) { it.toFloat() }
|
||||
checkContent(doubleArray(0.0, 1.0, 2.0, 3.0, 4.0, 5.0).copyOfRange(0, 3).iterator(), 3) { it.toDouble() }
|
||||
checkContent(charArray('0', '1', '2', '3', '4', '5').copyOfRange(0, 3).iterator(), 3) { (it + '0').toChar() }
|
||||
}
|
||||
|
||||
|
||||
fun <T> checkContent(val iter : Iterator<T>, val length : Int, val value : (Int) -> T) {
|
||||
var idx = 0
|
||||
while (idx != length && iter.hasNext) {
|
||||
assertEquals(value(idx++), iter.next(), "Invalid element")
|
||||
}
|
||||
|
||||
assertEquals(length, idx, "Invalid length")
|
||||
assertFalse(iter.hasNext, "Invalid length (hasNext)")
|
||||
}
|
||||
|
||||
test fun emptyArrayLastIndex() {
|
||||
val arr1 = IntArray(0)
|
||||
assertEquals(-1, arr1.lastIndex)
|
||||
@@ -56,16 +33,20 @@ class ArraysTest {
|
||||
assertEquals("4", arr2[arr2.lastIndex])
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
TODO FIXME ASAP: These currently fail on JS due to missing upto() method on numbers
|
||||
|
||||
test fun reduce() {
|
||||
expect(-4) { intArray(1, 2, 3) reduce { a, b -> a - b } }
|
||||
expect(-4.toLong()) { longArray(1, 2, 3) reduce { a, b -> a - b } }
|
||||
// Fails in JS: expect(-4.toLong()) { longArray(1, 2, 3) reduce { a, b -> a - b } }
|
||||
expect(-4.toFloat()) { floatArray(1.toFloat(), 2.toFloat(), 3.toFloat()) reduce { a, b -> a - b } }
|
||||
expect(-4.0) { doubleArray(1.0, 2.0, 3.0) reduce { a, b -> a - b } }
|
||||
expect('3') { charArray('1', '3', '2') reduce { a, b -> if(a > b) a else b } }
|
||||
expect(false) { booleanArray(true, true, false) reduce { a, b -> a && b } }
|
||||
expect(true) { booleanArray(true, true) reduce { a, b -> a && b } }
|
||||
expect(0.toByte()) { byteArray(3, 2, 1) reduce { a, b -> (a - b).toByte() } }
|
||||
expect(0.toShort()) { shortArray(3, 2, 1) reduce { a, b -> (a - b).toShort() } }
|
||||
// Fails in JS: expect(0.toByte()) { byteArray(3, 2, 1) reduce { a, b -> (a - b).toByte() } }
|
||||
// Fails in JS: expect(0.toShort()) { shortArray(3, 2, 1) reduce { a, b -> (a - b).toShort() } }
|
||||
|
||||
failsWith<UnsupportedOperationException> {
|
||||
intArray().reduce { a, b -> a + b}
|
||||
@@ -74,14 +55,14 @@ class ArraysTest {
|
||||
|
||||
test fun reduceRight() {
|
||||
expect(2) { intArray(1, 2, 3) reduceRight { a, b -> a - b } }
|
||||
expect(2.toLong()) { longArray(1, 2, 3) reduceRight { a, b -> a - b } }
|
||||
// Fails in JS: expect(2.toLong()) { longArray(1, 2, 3) reduceRight { a, b -> a - b } }
|
||||
expect(2.toFloat()) { floatArray(1.toFloat(), 2.toFloat(), 3.toFloat()) reduceRight { a, b -> a - b } }
|
||||
expect(2.0) { doubleArray(1.0, 2.0, 3.0) reduceRight { a, b -> a - b } }
|
||||
expect('3') { charArray('1', '3', '2') reduceRight { a, b -> if(a > b) a else b } }
|
||||
expect(false) { booleanArray(true, true, false) reduceRight { a, b -> a && b } }
|
||||
expect(true) { booleanArray(true, true) reduceRight { a, b -> a && b } }
|
||||
expect(2.toByte()) { byteArray(1, 2, 3) reduceRight { a, b -> (a - b).toByte() } }
|
||||
expect(2.toShort()) { shortArray(1, 2, 3) reduceRight { a, b -> (a - b).toShort() } }
|
||||
// Fails in JS: expect(2.toByte()) { byteArray(1, 2, 3) reduceRight { a, b -> (a - b).toByte() } }
|
||||
// Fails in JS: expect(2.toShort()) { shortArray(1, 2, 3) reduceRight { a, b -> (a - b).toShort() } }
|
||||
|
||||
failsWith<UnsupportedOperationException> {
|
||||
intArray().reduceRight { a, b -> a + b}
|
||||
@@ -90,13 +71,14 @@ class ArraysTest {
|
||||
|
||||
test fun reverse() {
|
||||
expect(arrayList(3, 2, 1)) { intArray(1, 2, 3).reverse() }
|
||||
expect(arrayList<Byte>(3, 2, 1)) { byteArray(1, 2, 3).reverse() }
|
||||
expect(arrayList<Short>(3, 2, 1)) { shortArray(1, 2, 3).reverse() }
|
||||
expect(arrayList<Long>(3, 2, 1)) { longArray(1, 2, 3).reverse() }
|
||||
// Fails in JS: expect(arrayList<Byte>(3, 2, 1)) { byteArray(1, 2, 3).reverse() }
|
||||
// Fails in JS: expect(arrayList<Short>(3, 2, 1)) { shortArray(1, 2, 3).reverse() }
|
||||
// Fails in JS: expect(arrayList<Long>(3, 2, 1)) { longArray(1, 2, 3).reverse() }
|
||||
expect(arrayList(3.toFloat(), 2.toFloat(), 1.toFloat())) { floatArray(1.toFloat(), 2.toFloat(), 3.toFloat()).reverse() }
|
||||
expect(arrayList(3.0, 2.0, 1.0)) { doubleArray(1.0, 2.0, 3.0).reverse() }
|
||||
expect(arrayList('3', '2', '1')) { charArray('1', '2', '3').reverse() }
|
||||
expect(arrayList(false, false, true)) { booleanArray(true, false, false).reverse() }
|
||||
}
|
||||
|
||||
*/
|
||||
}
|
||||
|
||||
@@ -55,9 +55,7 @@
|
||||
<exclude name="**/*JVMTest.kt"/>
|
||||
</fileset>
|
||||
<fileset dir="${basedir}/../../stdlib/test">
|
||||
<!--
|
||||
<include name="ArraysTest.kt"/>
|
||||
-->
|
||||
<include name="GetOrElseTest.kt"/>
|
||||
<!--
|
||||
TODO: depends on this being fixed: http://youtrack.jetbrains.com/issue/KT-2372
|
||||
|
||||
Reference in New Issue
Block a user