|
Akka/Scala example source code file (IndexSpec.scala)
The IndexSpec.scala Akka example source code
/**
* Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.util
import org.scalatest.Matchers
import scala.concurrent.Future
import akka.testkit.AkkaSpec
import scala.concurrent.Await
import scala.util.Random
import akka.testkit.DefaultTimeout
class IndexSpec extends AkkaSpec with Matchers with DefaultTimeout {
implicit val ec = system.dispatcher
private def emptyIndex = new Index[String, Int](100, _ compareTo _)
private def indexWithValues = {
val index = emptyIndex
index.put("s1", 1)
index.put("s1", 2)
index.put("s1", 3)
index.put("s2", 1)
index.put("s2", 2)
index.put("s3", 2)
index
}
"An Index" must {
"take and return a value" in {
val index = emptyIndex
index.put("s1", 1)
index.valueIterator("s1").toSet should be(Set(1))
}
"take and return several values" in {
val index = emptyIndex
index.put("s1", 1) should be(true)
index.put("s1", 1) should be(false)
index.put("s1", 2)
index.put("s1", 3)
index.put("s2", 4)
index.valueIterator("s1").toSet should be(Set(1, 2, 3))
index.valueIterator("s2").toSet should be(Set(4))
}
"remove values" in {
val index = emptyIndex
index.put("s1", 1)
index.put("s1", 2)
index.put("s2", 1)
index.put("s2", 2)
//Remove value
index.remove("s1", 1) should be(true)
index.remove("s1", 1) should be(false)
index.valueIterator("s1").toSet should be(Set(2))
//Remove key
index.remove("s2") match {
case Some(iter) ⇒ iter.toSet should be(Set(1, 2))
case None ⇒ fail()
}
index.remove("s2") should be(None)
index.valueIterator("s2").toSet should be(Set())
}
"remove the specified value" in {
val index = emptyIndex
index.put("s1", 1)
index.put("s1", 2)
index.put("s1", 3)
index.put("s2", 1)
index.put("s2", 2)
index.put("s3", 2)
index.removeValue(1)
index.valueIterator("s1").toSet should be(Set(2, 3))
index.valueIterator("s2").toSet should be(Set(2))
index.valueIterator("s3").toSet should be(Set(2))
}
"apply a function for all key-value pairs and find every value" in {
val index = indexWithValues
var valueCount = 0
index.foreach((key, value) ⇒ {
valueCount = valueCount + 1
index.findValue(key)(_ == value) should be(Some(value))
})
valueCount should be(6)
}
"be cleared" in {
val index = indexWithValues
index.isEmpty should be(false)
index.clear()
index.isEmpty should be(true)
}
"be able to be accessed in parallel" in {
val index = new Index[Int, Int](100, _ compareTo _)
val nrOfTasks = 10000
val nrOfKeys = 10
val nrOfValues = 10
//Fill index
for (key ← 0 until nrOfKeys; value ← 0 until nrOfValues)
index.put(key, value)
//Tasks to be executed in parallel
def putTask() = Future {
index.put(Random.nextInt(nrOfKeys), Random.nextInt(nrOfValues))
}
def removeTask1() = Future {
index.remove(Random.nextInt(nrOfKeys / 2), Random.nextInt(nrOfValues))
}
def removeTask2() = Future {
index.remove(Random.nextInt(nrOfKeys / 2))
}
def readTask() = Future {
val key = Random.nextInt(nrOfKeys)
val values = index.valueIterator(key)
if (key >= nrOfKeys / 2) {
values.isEmpty should be(false)
}
}
def executeRandomTask() = Random.nextInt(4) match {
case 0 ⇒ putTask()
case 1 ⇒ removeTask1()
case 2 ⇒ removeTask2()
case 3 ⇒ readTask()
}
val tasks = List.fill(nrOfTasks)(executeRandomTask)
tasks.foreach(Await.result(_, timeout.duration))
}
}
}
Other Akka source code examplesHere is a short list of links related to this Akka IndexSpec.scala source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.