Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ScalaCheck

 ScalaCheck

Presented at Scaladores, August/2013

Pedro Matiello

August 28, 2013
Tweet

More Decks by Pedro Matiello

Other Decks in Programming

Transcript

  1. SCALACHECK

    View Slide

  2. SCALACHECK
    Pedro Matiello
    [email protected]
    @pmatiello

    View Slide

  3. SCALACHECK
    • Property-based testing
    • Scala

    View Slide

  4. PROPERTIES

    View Slide

  5. PROPERTIES
    def sum(x:Int, y:Int) = x + y

    View Slide

  6. PROPERTIES
    def sum(x:Int, y:Int) = x + y
    # Property: ∀x,y : sum(x,y) = sum(y,x)

    View Slide

  7. PROPERTIES
    def sum(x:Int, y:Int) = x + y
    # Property: ∀x,y : sum(x,y) = sum(y,x)
    val commutativity = forAll {
    (x:Int, y:Int) => sum(x,y) == sum(y,x)
    }

    View Slide

  8. PROPERTIES
    def sum(x:Int, y:Int) = x + y
    # Property: ∀x,y : sum(x,y) = sum(y,x)
    val commutativity = forAll {
    (x:Int, y:Int) => sum(x,y) == sum(y,x)
    }

    View Slide

  9. PROPERTIES
    def sum(x:Int, y:Int) = x + y
    # Property: ∀x,y : sum(x,y) = sum(y,x)
    val commutativity = forAll {
    (x:Int, y:Int) => sum(x,y) == sum(y,x)
    }
    org.scalacheck.Prop.forAll

    View Slide

  10. PROPERTIES
    def sum(x:Int, y:Int) = x + y
    # Property: ∀x,y : sum(x,y) = sum(y,x)
    val commutativity = forAll {
    (x:Int, y:Int) => sum(x,y) == sum(y,x)
    }
    commutativity.check

    View Slide

  11. PROPERTIES
    def sum(x:Int, y:Int) = x + y
    # Property: ∀x,y : sum(x,y) = sum(y,x)
    val commutativity = forAll {
    (x:Int, y:Int) => sum(x,y) == sum(y,x)
    }
    commutativity.check
    + OK, passed 100 tests

    View Slide

  12. CONDITIONAL PROPERTIES

    View Slide

  13. CONDITIONAL PROPERTIES
    def sum(x:Int, y:Int) = x + y
    # Property: ∀x,y>0 : sum(x,y) > x

    View Slide

  14. CONDITIONAL PROPERTIES
    def sum(x:Int, y:Int) = x + y
    # Property: ∀x,y>0 : sum(x,y) > x
    val greater = forAll {
    (x:Int, y:Int) => y > 0 ==> sum(x,y) > x
    }

    View Slide

  15. CONDITIONAL PROPERTIES
    def sum(x:Int, y:Int) = x + y
    # Property: ∀x,y>0 : sum(x,y) > x
    val greater = forAll {
    (x:Int, y:Int) => y > 0 ==> sum(x,y) > x
    }

    View Slide

  16. CONDITIONAL PROPERTIES
    def sum(x:Int, y:Int) = x + y
    # Property: ∀x,y>0 : sum(x,y) > x
    val greater = forAll {
    (x:Int, y:Int) => y > 0 ==> sum(x,y) > x
    }
    greater.check

    View Slide

  17. CONDITIONAL PROPERTIES
    def sum(x:Int, y:Int) = x + y
    # Property: ∀x,y>0 : sum(x,y) > x
    val greater = forAll {
    (x:Int, y:Int) => y > 0 ==> sum(x,y) > x
    }
    greater.check
    ! Falsified after 2 passed tests.
    > ARG_0: 51047075
    > ARG_1: 2096436573

    View Slide

  18. CONDITIONAL PROPERTIES
    scala> 51047075 + 2096436573
    res0: Int = -2147483648

    View Slide

  19. CONDITIONAL PROPERTIES
    scala> 51047075 + 2096436573
    res0: Int = -2147483648
    scala> 51047075l + 2096436573l
    res1: Long = 2147483648

    View Slide

  20. GENERATORS

    View Slide

  21. GENERATORS
    def sum(x:Int, y:Int) = x + y
    # ∀x,y, x%2=0,y%2=0 : sum(x,y)%2 = 0

    View Slide

  22. GENERATORS
    def sum(x:Int, y:Int) = x + y
    # ∀x,y, x%2=0,y%2=0 : sum(x,y)%2 = 0
    val evenInt = arbitrary[Int]
    suchThat (_ % 2 == 0)

    View Slide

  23. GENERATORS
    def sum(x:Int, y:Int) = x + y
    # ∀x,y, x%2=0,y%2=0 : sum(x,y)%2 = 0
    val evenInt = arbitrary[Int]
    suchThat (_ % 2 == 0)
    org.scalacheck.Arbitrary.arbitrary

    View Slide

  24. GENERATORS
    def sum(x:Int, y:Int) = x + y
    # ∀x,y, x%2=0,y%2=0 : sum(x,y)%2 = 0
    val evenInt = arbitrary[Int]
    suchThat (_ % 2 == 0)
    forAll(evenInt, evenInt) {
    (x:Int, y:Int) => sum(x,y) % 2 == 0
    }.check

    View Slide

  25. GENERATORS
    def sum(x:Int, y:Int) = x + y
    # ∀x,y, x%2=0,y%2=0 : sum(x,y)%2 = 0
    val evenInt = arbitrary[Int]
    suchThat (_ % 2 == 0)
    forAll(evenInt, evenInt) {
    (x:Int, y:Int) => sum(x,y) % 2 == 0
    }.check

    View Slide

  26. GENERATORS
    def sum(x:Int, y:Int) = x + y
    # ∀x,y, x%2=0,y%2=0 : sum(x,y)%2 = 0
    val evenInt = arbitrary[Int]
    suchThat (_ % 2 == 0)
    forAll(evenInt, evenInt) {
    (x:Int, y:Int) => sum(x,y) % 2 == 0
    }.check
    + OK, passed 100 tests

    View Slide

  27. SCALACHECK
    Pedro Matiello
    [email protected]
    @pmatiello

    View Slide