Monday, September 26, 2016

Assertion : assert() & ensuring() method...

Assertion can be enabled / disabled using JVM's -ea and -da flags #295
scala> class Subject(val name: String, val mark: Int)
defined class Subject

scala>

scala> /////////////////////////////////////////////////////

scala> //  Example 1 : Assertion using 'assert()' method #295

scala> /////////////////////////////////////////////////////

scala> def subtract(sub: Subject, mark: Int): Subject = {
     |   val res = if (mark > 0) {
     |     val newMark = sub.mark - mark
     |     println("newMark -> " + newMark)
     |     new Subject(sub.name, newMark)
     |   }else {
     |     sub
     |   }
     |   assert(res.mark >= 0)
     |   res
     | }
subtract: (sub: Subject, mark: Int)Subject

scala> val sub = new Subject("english", 50)
sub: Subject = $iwC$$iwC$Subject@6752d7fc

scala> subtract(sub, 60)
newMark -> -10
java.lang.AssertionError: assertion failed
 at scala.Predef$.assert(Predef.scala:165)


scala> /////////////////////////////////////////////////////

scala> //  Example 2 : Assertion using 'ensuring()' method

scala> /////////////////////////////////////////////////////

scala> def subtract(sub: Subject, mark: Int): Subject = {
     |   if (mark <= 0) {
     |     sub
     |   }else {
     |     val newMark = sub.mark - mark
     |     println("newMark. -> " + newMark)
     |     new Subject(sub.name, newMark)
     |   }ensuring { x =>
     |     println("x -> " + x.mark)
     |     x.mark >= 0
     |   }
     | }
subtract: (sub: Subject, mark: Int)Subject

scala> val sub = new Subject("english", 50)
sub: Subject = $iwC$$iwC$Subject@503a3c11

scala> subtract(sub, 60)
newMark. -> -10
x -> -10
java.lang.AssertionError: assertion failed
 at scala.Predef$.assert(Predef.scala:165)

scala> /////////////////////////////////////////////////////

scala> //  Example 3 : Example 2 Simplified

scala> /////////////////////////////////////////////////////

scala> def subtract(sub: Subject, mark: Int): Subject = {
     |   if (mark <= 0) {
     |     sub
     |   }else {
     |     val newMark = sub.mark - mark
     |     println("newMark.. -> " + newMark)
     |     new Subject(sub.name, newMark)
     |   }ensuring ( _.mark >= 0)
     | }
subtract: (sub: Subject, mark: Int)Subject

scala>

scala> val sub = new Subject("english", 50)
sub: Subject = $iwC$$iwC$Subject@455e8356

scala> subtract(sub, 60)
newMark.. -> -10
java.lang.AssertionError: assertion failed
 at scala.Predef$.assert(Predef.scala:165)
 at scala.Predef$Ensuring$.ensuring$extension2(Predef.scala:244)