Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // 1. let's compare assert, assume, require, ensuring
- object Main extends App {
- private val days = List("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")
- def printAllDays() {
- assert(days.length == 7) // usual assert (what we expect 100%), can be skipped in PROD
- days foreach println // for a static analysing tool, assert is a predicate to be proven
- }
- def factorial(n: Long): Long = {
- assume(n >= 0) // the same as assert, can be skipped in PROD
- n match { // for a static analysing tool, assume is an axiom
- case 0 => 1
- case _ => n * factorial(n - 1)
- }
- }
- def getAverageAge(ages: Int*): Int = {
- require(ages forall {_ >= 0}) // require from a caller that all ages must be non-negative! Checked in PROD!
- ages match {
- case Nil => 0
- case _ => ages.sum / ages.length
- }
- } ensuring (result => result >= 0) // ensure that everything is OK. Checked in PROD
- printAllDays()
- println(factorial(5))
- println(getAverageAge(1, 2, 3, 4, 5))
- }
- // Output:
- // Sunday
- // Monday
- // Tuesday
- // Wednesday
- // Thursday
- // Friday
- // Saturday
- // 120
- // 3
- // 2. Now let's violate days:
- private val days = List("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "XYZ")
- // Output:
- // Exception in thread "main" java.lang.AssertionError: assertion failed
- // at scala.Predef$.assert(Predef.scala:204)
- // at ru.mitrakov.self.sandbox.Main$.printAllDays(Main.scala:8)
- // 3. Now let's violate factorial:
- assume(n >= 10)
- // Output:
- // Sunday
- // Monday
- // Tuesday
- // Wednesday
- // Thursday
- // Friday
- // Saturday
- // Exception in thread "main" java.lang.AssertionError: assumption failed
- // at scala.Predef$.assume(Predef.scala:235)
- // at ru.mitrakov.self.sandbox.Main$.factorial(Main.scala:13)
- // 4. Now let's pass incorrect parameters:
- println(getAverageAge(1, 2, 3, 4, 5, -1))
- // Output:
- // Sunday
- // Monday
- // Tuesday
- // Wednesday
- // Thursday
- // Friday
- // Saturday
- // 120
- // Exception in thread "main" java.lang.IllegalArgumentException: requirement failed
- // at scala.Predef$.require(Predef.scala:264)
- // at ru.mitrakov.self.sandbox.Main$.getAverageAge(Main.scala:21)
- // 5. Now let's change ensuring condition:
- } ensuring (result => result >= 10)
- // Output:
- // Sunday
- // Monday
- // Tuesday
- // Wednesday
- // Thursday
- // Friday
- // Saturday
- // 120
- // Exception in thread "main" java.lang.AssertionError: assertion failed
- // at scala.Predef$.assert(Predef.scala:204)
- // at scala.Predef$Ensuring$.ensuring$extension2(Predef.scala:316)
- // at ru.mitrakov.self.sandbox.Main$.getAverageAge(Main.scala:26)
- // 6. Now let's violate both assert and assume:
- private val days = List("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "XYZ")
- ...
- assume(n >= 10)
- // Re-compile project with a compiler flag: -Xdisable-assertions
- // E.g. in IntelliJ IDEA:
- // Settings -> Build, Execution, Deployment -> Compiler -> Scala Compiler -> Additional compiler options
- // Output:
- // Sunday
- // Monday
- // Tuesday
- // Wednesday
- // Thursday
- // Friday
- // Saturday
- // XYZ
- // 120
- // 3
- // 7. But requirement will still be checked!
- println(getAverageAge(1, 2, 3, 4, 5, -1))
- // Output:
- // Sunday
- // Monday
- // Tuesday
- // Wednesday
- // Thursday
- // Friday
- // Saturday
- // XYZ
- // 120
- // Exception in thread "main" java.lang.IllegalArgumentException: requirement failed
- // at scala.Predef$.require(Predef.scala:264)
- // at ru.mitrakov.self.sandbox.Main$.getAverageAge(Main.scala:21)
- // 8. And 'ensuring' too! It may be confusing, because 'ensuring' is implemented
- // via 'assert', but it has NO '@elidable' annotation, so it will throw an exception!
- } ensuring (result => result >= 10)
- // Output:
- // Sunday
- // Monday
- // Tuesday
- // Wednesday
- // Thursday
- // Friday
- // Saturday
- // XYZ
- // 120
- // Exception in thread "main" java.lang.AssertionError: assertion failed
- // at scala.Predef$.assert(Predef.scala:204)
- // at scala.Predef$Ensuring$.ensuring$extension2(Predef.scala:316)
- // at ru.mitrakov.self.sandbox.Main$.getAverageAge(Main.scala:26)
- // P.S. think of assert as InternalServerError (500), while of require - as BadRequest(400)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement