summaryrefslogtreecommitdiff
path: root/test/files/run/mutable-longmap.scala
blob: 07fd80f6f050740fe97fc8ffd695bd1ef16ff603 (plain) (blame)
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
object Test extends App {

  import scala.collection.mutable.HashMap;
  import scala.collection.mutable.LongMap;

  val keys = Array(
    Long.MinValue, Int.MinValue - 1L, Int.MinValue, -9127, -1,
    0, 1, 9127, Int.MaxValue, Long.MaxValue
  )

  val rn = new scala.util.Random(42L)
  var lm = LongMap.empty[Long]
  val hm = HashMap.empty[Long,Long]
  
  def checkConsistent = hm.forall{ case (k,v) => lm.get(k).exists(_ == v) }

  assert {
    (0 to 10000).forall{ i =>
      val k = keys(rn.nextInt(keys.length))
      if (rn.nextInt(100) < 2) lm = lm.clone()
      if (rn.nextInt(100) < 5) lm.repack()
      if (rn.nextBoolean) {
        hm += ((k, i))
        rn.nextInt(6) match {
          case 0 => lm += ((k, i))
          case 1 => lm += (k, i)
          case 2 => lm(k) = i
          case 3 => lm.put(k,i)
          case 4 => lm ++= List((k,i))
          case _ => if (!lm.contains(k)) lm.getOrElseUpdate(k,i) 
                    else lm += (k,i)
        }
      }
      else {
        hm -= k
        rn.nextInt(2) match {
          case 0 => lm -= k
          case _ => lm --= List(k)
        }
      }
      checkConsistent
    }
  }
    
  assert {
    lm.map{ case (k,v) => -k*k -> v.toString }.getClass == lm.getClass
  }
  
  assert {
    val lm2 = new LongMap[Unit](2000000)
    for (i <- 0 until 1000000) lm2(i) = ()
    
    lm2.size == 1000000 && 
      (0 to 1100000 by 100000).forall(i => (lm2 contains i) == i < 1000000)
  }
  
  lm = LongMap(8L -> 22L, -5L -> 5L, Long.MinValue -> 0L)
  
  assert{ var s = 0L; lm.foreachKey(s += _); s == Long.MinValue + 3 }
  assert{ var s = 0L; lm.foreachValue(s += _); s == 27L }
  assert { 
    val m2 = lm.mapValuesNow(_+2)
    lm.transformValues(_+2)
    m2 == lm && !(m2 eq lm) && (for ((_,v) <- lm) yield v).sum == 33L
  }

  assert {
    val lm2 = new LongMap[String](_.toString)
    lm2 += (5L -> "fish", 0L -> "unicorn")
    val hm2 = (new HashMap[Long,String]) ++= lm2
    
    List(Long.MinValue, 0L, 1L, 5L).forall(i =>
      lm2.get(i) == hm2.get(i) &&
      lm2.getOrElse(i, "") == hm2.getOrElse(i, "") &&
      lm2(i) == hm2.get(i).getOrElse(i.toString) &&
      lm2.getOrNull(i) == hm2.get(i).orNull
    )
  }
}