stdlib: Throw NoSuchElementException from array iterators

This commit is contained in:
Ilya Matveev
2017-04-20 10:30:38 +07:00
committed by ilmat192
parent 5eabda0ba4
commit 95034225a8
4 changed files with 259 additions and 0 deletions
@@ -0,0 +1,54 @@
import kotlin.test.*
public fun <T> compare(expected: T, actual: T, block:CompareContext<T>.() -> Unit) {
CompareContext(expected, actual).block()
}
public class CompareContext<out T>(public val expected: T, public val actual: T) {
public fun equals(message: String = "") {
assertEquals(expected, actual, message)
}
public fun <P> propertyEquals(message: String = "", getter: T.() -> P) {
assertEquals(expected.getter(), actual.getter(), message)
}
public fun propertyFails(getter: T.() -> Unit) { assertFailEquals({expected.getter()}, {actual.getter()}) }
public fun <P> compareProperty(getter: T.() -> P, block: CompareContext<P>.() -> Unit) {
compare(expected.getter(), actual.getter(), block)
}
private fun assertFailEquals(expected: () -> Unit, actual: () -> Unit) {
val expectedFail = assertFails(expected)
val actualFail = assertFails(actual)
//assertEquals(expectedFail != null, actualFail != null)
assertTypeEquals(expectedFail, actualFail)
}
}
public fun <T> CompareContext<Iterator<T>>.iteratorBehavior() {
propertyEquals { hasNext() }
while (expected.hasNext()) {
propertyEquals { next() }
propertyEquals { hasNext() }
}
propertyFails { next() }
}
fun box() {
fun <T, E> checkContract(array: T, toList: T.() -> List<E>, iterator: T.() -> Iterator<E>) =
compare(array.toList().iterator(), array.iterator()) {
iteratorBehavior()
}
checkContract(arrayOf("a", "b", "c"), { toList() }, { iterator() })
checkContract(intArrayOf(), { toList() }, { iterator() })
checkContract(intArrayOf(1, 2, 3), { toList() }, { iterator() })
checkContract(shortArrayOf(1, 2, 3), { toList() }, { iterator() })
checkContract(byteArrayOf(1, 2, 3), { toList() }, { iterator() })
checkContract(longArrayOf(1L, 2L, 3L), { toList() }, { iterator() })
checkContract(doubleArrayOf(2.0, 3.0, 9.0), { toList() }, { iterator() })
checkContract(floatArrayOf(2f, 3f, 9f), { toList() }, { iterator() })
checkContract(charArrayOf('a', 'b', 'c'), { toList() }, { iterator() })
checkContract(booleanArrayOf(true, false), { toList() }, { iterator() })
}