1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
object Test extends App {
import scala.collection.mutable.HashMap;
import scala.collection.mutable.AnyRefMap;
val keys = Array(
null, "perch", "herring", "salmon", "pike", "cod", ""
)
val rn = new scala.util.Random(42L)
var arm = AnyRefMap.empty[String, Int]
val hm = HashMap.empty[String, Int]
def checkConsistent = hm.forall{ case (k,v) => arm.get(k).exists(_ == v) }
assert {
(0 to 10000).forall{ i =>
val k = keys(rn.nextInt(keys.length))
if (rn.nextInt(100) < 2) arm = arm.clone()
if (rn.nextInt(100) < 5) arm.repack()
if (rn.nextBoolean) {
hm += ((k, i))
rn.nextInt(6) match {
case 0 => arm += ((k, i))
case 1 => arm += (k, i)
case 2 => arm(k) = i
case 3 => arm.put(k,i)
case 4 => arm ++= List((k,i))
case _ => if (!arm.contains(k)) arm.getOrElseUpdate(k,i)
else arm += (k,i)
}
}
else {
hm -= k
rn.nextInt(2) match {
case 0 => arm -= k
case _ => arm --= List(k)
}
}
checkConsistent
}
}
assert {
val mapped =
arm.map{ case (k,v) => (if (k==null) "" else k+k) -> v.toString }
mapped.getClass == arm.getClass
}
assert {
val arm2 = new AnyRefMap[java.lang.Integer,Unit](2000000)
for (i <- 0 until 1000000) arm2(java.lang.Integer.valueOf(i)) = ()
arm2.size == 1000000 &&
(0 to 1100000 by 100000).map(java.lang.Integer.valueOf).forall(i => (arm2 contains i) == i < 1000000)
}
arm = AnyRefMap("heron" -> 22, "dove" -> 5, "budgie" -> 0)
assert{
var s = ""
arm.foreachKey(s += _)
s.length == "herondovebudgie".length &&
s.contains("heron") &&
s.contains("dove") &&
s.contains("budgie")
}
assert{ var s = 0L; arm.foreachValue(s += _); s == 27L }
assert {
val m2 = arm.mapValuesNow(_+2)
arm.transformValues(_+2)
m2 == arm && !(m2 eq arm) && (for ((_,v) <- arm) yield v).sum == 33L
}
assert {
val arm2 = new AnyRefMap[String, String](x => if (x==null) "null" else x)
arm2 += ("cod" -> "fish", "Rarity" -> "unicorn")
val hm2 = (new HashMap[String,String]) ++= arm2
List(null, "cod", "sparrow", "Rarity").forall(i =>
arm2.get(i) == hm2.get(i) &&
arm2.getOrElse(i, "") == hm2.getOrElse(i, "") &&
arm2(i) == hm2.get(i).getOrElse(if (i==null) "null" else i.toString) &&
arm2.getOrNull(i) == hm2.get(i).orNull
)
}
}
|