Skip to content

Commit fe9103d

Browse files
committed
add more enum exhaustivity tests
1 parent 473e7fc commit fe9103d

File tree

3 files changed

+77
-0
lines changed

3 files changed

+77
-0
lines changed

tests/patmat/enum-HList.scala

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
enum HLst {
2+
case HCons[+Hd, +Tl <: HLst](hd: Hd, tl: Tl)
3+
case HNil
4+
}
5+
6+
object Test {
7+
import HLst._
8+
def length(hl: HLst): Int = hl match {
9+
case HCons(_, tl) => 1 + length(tl)
10+
case HNil => 0
11+
}
12+
def sumInts(hl: HLst): Int = hl match {
13+
case HCons(x: Int, tl) => x + sumInts(tl)
14+
case HCons(_, tl) => sumInts(tl)
15+
case HNil => 0
16+
}
17+
def main(args: Array[String]) = {
18+
val hl = HCons(1, HCons("A", HNil))
19+
assert(length(hl) == 2, length(hl))
20+
assert(sumInts(hl) == 1)
21+
}
22+
}

tests/patmat/enum-Tree.scala

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
enum Tree[T] {
2+
case True extends Tree[Boolean]
3+
case False extends Tree[Boolean]
4+
case Zero extends Tree[Int]
5+
case Succ(n: Tree[Int]) extends Tree[Int]
6+
case Pred(n: Tree[Int]) extends Tree[Int]
7+
case IsZero(n: Tree[Int]) extends Tree[Boolean]
8+
case If(cond: Tree[Boolean], thenp: Tree[T], elsep: Tree[T])
9+
}
10+
11+
object Test {
12+
import Tree._
13+
14+
def eval[T](e: Tree[T]): T = e match {
15+
case True => true
16+
case False => false
17+
case Zero => 0
18+
case Succ(f) => eval(f) + 1
19+
case Pred(f) => eval(f) - 1
20+
case IsZero(f) => eval(f) == 0
21+
case If(cond, thenp, elsep) => if (eval(cond)) eval(thenp) else eval(elsep)
22+
}
23+
24+
val data = If(IsZero(Pred(Succ(Zero))), Succ(Succ(Zero)), Pred(Pred(Zero)))
25+
26+
def main(args: Array[String]) = {
27+
println(s"$data --> ${eval(data)}")
28+
}
29+
}

tests/patmat/planets.scala

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
enum class Planet(mass: Double, radius: Double) {
2+
private final val G = 6.67300E-11
3+
def surfaceGravity = G * mass / (radius * radius)
4+
def surfaceWeight(otherMass: Double) = otherMass * surfaceGravity
5+
}
6+
object Planet {
7+
case MERCURY extends Planet(3.303e+23, 2.4397e6)
8+
case VENUS extends Planet(4.869e+24, 6.0518e6)
9+
case EARTH extends Planet(5.976e+24, 6.37814e6)
10+
case MARS extends Planet(6.421e+23, 3.3972e6)
11+
case JUPITER extends Planet(1.9e+27, 7.1492e7)
12+
case SATURN extends Planet(5.688e+26, 6.0268e7)
13+
case URANUS extends Planet(8.686e+25, 2.5559e7)
14+
case NEPTUNE extends Planet(1.024e+26, 2.4746e7)
15+
}
16+
object Test {
17+
def main(args: Array[String]) = {
18+
import Planet._
19+
assert(enumValueNamed("SATURN") == SATURN)
20+
assert(enumValue(2) == EARTH)
21+
val earthWeight = 100
22+
val mass = earthWeight/EARTH.surfaceGravity
23+
for (p <- enumValues)
24+
println(s"Your weight on $p is ${p.surfaceWeight(mass)}")
25+
}
26+
}

0 commit comments

Comments
 (0)