Skip to content

Commit

Permalink
added proper top-level failure handling in evaluate
Browse files Browse the repository at this point in the history
Signed-off-by: Konstantin Läufer <laufer@cs.luc.edu>
  • Loading branch information
klaeufer committed Nov 28, 2023
1 parent a01c0e1 commit a8494da
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 17 deletions.
18 changes: 11 additions & 7 deletions src/main/scala/behaviors.scala
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
package edu.luc.cs.laufer.cs371.expressions

import util.Try

import Expr.*

object behaviors:

def evaluate(e: Expr): Int = e match
private def evaluateR(e: Expr): Int = e match
case Constant(c) => c
case UMinus(r) => -evaluate(r)
case Plus(l, r) => evaluate(l) + evaluate(r)
case Minus(l, r) => evaluate(l) - evaluate(r)
case Times(l, r) => evaluate(l) * evaluate(r)
case Div(l, r) => evaluate(l) / evaluate(r)
case Mod(l, r) => evaluate(l) % evaluate(r)
case UMinus(r) => -evaluateR(r)
case Plus(l, r) => evaluateR(l) + evaluateR(r)
case Minus(l, r) => evaluateR(l) - evaluateR(r)
case Times(l, r) => evaluateR(l) * evaluateR(r)
case Div(l, r) => evaluateR(l) / evaluateR(r)
case Mod(l, r) => evaluateR(l) % evaluateR(r)

def evaluate(e: Expr): Try[Int] = Try(evaluateR(e))

def size(e: Expr): Int = e match
case Constant(c) => 1
Expand Down
24 changes: 14 additions & 10 deletions src/test/scala/Main.scala
Original file line number Diff line number Diff line change
@@ -1,27 +1,31 @@
package edu.luc.cs.laufer.cs371.expressions

import util.{ Success, Failure }
import org.scalatest.funsuite.AnyFunSuite

import behaviors.*
import TestFixtures.*

object Main:
def main(args: Array[String]): Unit =
println("p = " + complex1)
println("evaluate(p) = " + evaluate(complex1))
println("size(p) = " + size(complex1))
println("height(p) = " + height(complex1))
println("q = " + complex2)
println("evaluate(q) = " + evaluate(complex2))
println("size(q) = " + size(complex2))
println("height(q) = " + height(complex2))
process("p", complex1)
process("q", complex2)
process("f", bad)

def process(n: String, e: Expr): Unit =
println(s"$n = $e")
println(s"evaluate($n) = ${evaluate(e)}")
println(s"size($n) = ${size(e)}")
println(s"height($n) = ${height(e)}")

end Main

class Test extends AnyFunSuite:
test("evaluate(p)") { assert(evaluate(complex1) == -1) }
test("evaluate(p)") { assert(evaluate(complex1).get == -1) }
test("size(p)") { assert(size(complex1) == 9) }
test("height(p)") { assert(height(complex1) == 4) }
test("evaluate(q)") { assert(evaluate(complex2) == 0) }
test("evaluate(q)") { assert(evaluate(complex2).get == 0) }
test("size(q)") { assert(size(complex2) == 10) }
test("height(q)") { assert(height(complex2) == 5) }
test("evaluate(bad)") { assert(evaluate(bad).isFailure) }
end Test
2 changes: 2 additions & 0 deletions src/test/scala/TestFixtures.scala
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,6 @@ object TestFixtures:
Constant(5)
)

val bad = Div(Constant(3), Constant(0))

end TestFixtures

0 comments on commit a8494da

Please sign in to comment.