// testing the impl from the scala library
//package test5
import scala.collection._
import scala.collection.immutable._
import scala.collection.generic._
import scala.collection.mutable.Builder
object Test {
def vector(label: String, n: Int): Vector[String] = {
val a = new VectorBuilder[String]
for (i <- 0 until n)
a += (label + i)
val res = a.result
assertVector(res, label, 0, n)
}
def vectorForward(label: String, n: Int): Vector[String] = {
var a: Vector[String] = Vector.empty
for (i <- 0 until n)
a = a :+ (label + i)
assertVector(a, label, 0, n)
}
def vectorBackward(label: String, n: Int): Vector[String] = {
var a: Vector[String] = Vector.empty
for (i <- 0 until n)
a = (label + (n-1-i)) +: a
assertVector(a, label, 0, n)
}
def assertVector[V](a: Vector[V], label: String, start: Int, end: Int) = {
assertVectorIndexed(a, label, start, end)
assertVectorIterated(a, label, start, end)
}
def assertVectorIndexed[V](a: Vector[V], label: String, start: Int, end: Int) = {
val res = a
assert(res.length == (end-start), res.length+"!="+(end-start)+" ("+res+")")
for (i <- start until end) {
assert(res(i) == (label + i), ""+res(i)+"!="+(label + i))
}
res
}
def assertVectorIterated[V](a: Vector[V], label: String, start: Int, end: Int) = {
val res = a
assert(res.length == (end-start), res.length+"!="+(end-start)+" ("+res+")")
var i = start
var it = res.iterator
while(it.hasNext) {
val x = it.next()
assert(x == (label + i), x.toString+"!="+(label + i))
i += 1
}
assert(i == end)
res
}
def test1() = {
println("===== test1 =====")
val N = 150000
val a = vector("a", N)
val b = vectorForward("b", N)
val c = vectorBackward("b", N)
()
// //println(a)
}
def test2() = {
println("===== test2 =====")
var a: Vector[String] = Vector.empty
val rand = new java.util.Random
val N = 150000
var min = N/2//rand.nextInt(N)
var max = min
val chunkLimit = 11
def nextChunkSize = 3 //rand.nextInt(chunkLimit)
def seqBack() = for (i <- 0 until Math.min(nextChunkSize, N-max)) { a = a :+ ("a"+max); max += 1 }
def seqFront() = for (i <- 0 until Math.min(nextChunkSize, min)) { min -= 1; a = ("a"+min) +: a }
try {
while (min > 0 || max < N) {
seqFront()
seqBack()
}
} catch {
case ex: Throwable =>
//println("----------------")
//a.debug
throw ex
}
assertVector(a, "a", 0, N)
}
def test3() = {
println("===== test3 =====")
val N = 150000
val a = vector("a", N)
val pos = scala.util.Random.shuffle(scala.collection.mutable.WrappedArray.make[Int](Array.tabulate[Int](N)(i => i)))
var b = a
{
var i = 0
while (i < N) {
b = b.updated(pos(i), "b"+(pos(i)))
i += 1
}
assertVector(b, "b", 0, N)
}
// //println(a)
}
def test4() = {
println("===== test4 =====")
val N = 150000
val a = vectorForward("a", N)
{
var i = 0
var it = a
while (i < N) {
assert(it.length == (N-i), it.length+" items at iteration "+i)
val x = it(0)
val y = it(N-i-1)
assert(x == "a"+i, x+"!=a"+i)
assert(y == "a"+(N-1), y+"!=a"+(N-1))
it = it.drop(1)
i += 1
}
assert(it.length == 0)
}
// //println(a)
}
def test5() = {
println("===== test5 =====")
val N = 150000
val a = vectorBackward("a", N)
{
var i = 0
var it = a
while (i < N) {
assert(it.length == (N-i), it.length+" items at iteration "+i)
val x = it(0)
val y = it(N-i-1)
// println("x " + x + "/" + i)
// println("y " + y)
assert(x == "a0", x+"!=a0")
assert(y == "a"+(N-i-1), y+"!=a"+(N-i-1))
it = it.dropRight(1)
i += 1
}
assert(it.length == 0)
}
}
def main(args: Array[String]) = {
test1()
test2()
test3()
test4()
test5()
println("done")
}
}