Skip to content

Instantly share code, notes, and snippets.

@yasuabe
Created December 15, 2017 15:12
Show Gist options
  • Save yasuabe/091caadd648ceddf744dc8181895b734 to your computer and use it in GitHub Desktop.
Save yasuabe/091caadd648ceddf744dc8181895b734 to your computer and use it in GitHub Desktop.
ch03 equality for all
package fp_tdd
import org.scalacheck.Prop.forAll
import org.scalacheck.{Gen, Properties}
object Chapter03 extends Properties("Ch03") {
// ======== TODO ========
// $5 + 10 CHF = $10 if rate is 2:1
// Make "amount" private
// Money rounding?
// hashCode
// Equal null
// Equal object
// ======== DONE ========
// 1. $5 * 2 = $10
// 2. Dollar side effect
// 2. times -> `*`
// 3. Equality
// product code -------------------------------------------------------------------
class Dollar(val amount: Int) {
override def equals(a: Any): Boolean =
a.asInstanceOf[Dollar].amount == this.amount
def *(multiplier: Int): Dollar = Dollar(amount * multiplier)
}
object Dollar { def apply(amount: Int) = new Dollar(amount) }
// test code --------------------------------------------------------------------
val intGen: Gen[Int] = Gen.chooseNum(-1000000, 1000000)
implicit val dollars: Gen[Dollar] = intGen.map(Dollar.apply)
private def dollar2 = for {
a <- dollars
b <- dollars
} yield (a, b)
private def dollar3 = for {
a <- dollars
b <- dollars
c <- dollars
} yield (a, b, c)
implicit val unique3: Gen[(Dollar, Dollar, Dollar)] =
dollar3.suchThat { case (a, b, c) => a != b && b != c && c != a }
// properties -------------------------------------------------------------------
property("$0 * x = $0") = forAll { (x: Int) =>
Dollar(0) * x == Dollar(0)
}
property("$1 * x = $x") = forAll { (x: Int) =>
Dollar(1) * x == Dollar(x)
}
property("$a * b = $b * a") = forAll { (a: Int, b: Int) =>
Dollar(a) * b == Dollar(b) * a
}
property("($a * b) * c = $a * (b * c)") = forAll { (a: Int, b: Int, c: Int) =>
(Dollar(a) * b) * c == Dollar(a) * (b * c)
}
property("$a == $b <=> a == b") = forAll { (a: Int, b: Int) =>
(Dollar(a) == Dollar(b)) == (a == b)
}
property("$a == $b <=> $a.equals($b)") = forAll(dollar2) { case (a, b) =>
(a equals b) == (a == b)
}
property("reflexive law") = forAll(dollars) { (a) =>
a equals a
}
property("symmetric law") = forAll(dollar2) { case (a, b) =>
(a equals b) == (b equals a)
}
property("transitive law") = forAll( for {
oneOf3 <- unique3.map { case (a, b, c)=> Gen.oneOf(a, b, c) }
x <- oneOf3
y <- oneOf3.suchThat(_ equals x)
z <- oneOf3.retryUntil(_ equals y)
} yield (x, z)) { case ((x, z)) => x equals z }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment