From fa1f988bcff3459415fbe3908f369fdb40a7c798 Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Mon, 14 Feb 2011 15:19:48 -0800 Subject: [PATCH] Fleshed out Rational even more. Added an ExampleSpec for running tests on package example. --- src/main/scala/example/Rational.scala | 16 +++++++++++++++- src/test/scala/ExampleSpec.scala | 13 +++++++++++++ src/test/scala/TemplateSpec.scala | 2 +- 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 src/test/scala/ExampleSpec.scala diff --git a/src/main/scala/example/Rational.scala b/src/main/scala/example/Rational.scala index a0e626c21..44434dd3b 100644 --- a/src/main/scala/example/Rational.scala +++ b/src/main/scala/example/Rational.scala @@ -29,14 +29,28 @@ class Rational(n: Int, d: Int) { // an implicit conversion. (See the example package object.) def +(that: Int): Rational = this + new Rational(that) - // toString overrides a method in AnyRef so "override" is required. + // toString, equals, and hashCode all override methods in AnyRef + // so "override" is required. override def toString = n + "/" + d + ( // The result of the if/else is a String: if (numerator == n) "" // the empty string if it is irreducible else " (" + numerator + "/" + denominator + ")" // the reduced form otherwise ) + + // To preserve symmetry we will be equal only to other Rationals. + override def equals(other: Any) = other match { + case x: Rational => this.numerator == x.numerator && this.denominator == x.denominator + case _ => false + } + // As with java, equals and hashCode should always be overridden together. + override def hashCode = numerator.## + denominator.## } // The Rational companion object. object Rational { + // A factory method on the companion object allows construction + // without explicit calls to new. Here, d is given a default argument + // of 1. This is an alternative mechanism to the auxiliary constructor. + // used in the class. + def apply(n: Int, d: Int = 1): Rational = new Rational(n, d) } \ No newline at end of file diff --git a/src/test/scala/ExampleSpec.scala b/src/test/scala/ExampleSpec.scala new file mode 100644 index 000000000..01ad8a1f1 --- /dev/null +++ b/src/test/scala/ExampleSpec.scala @@ -0,0 +1,13 @@ +package example + +import org.specs._ + +class ExampleSpec extends Specification { + "An example project" should { + "implement rational numbers" >> { + Rational(5) mustEqual Rational(5, 1) + Rational(1, 10) mustEqual Rational(2, 20) + (Rational(1, 3) + Rational(5, 15)) mustEqual Rational(4, 6) + } + } +} diff --git a/src/test/scala/TemplateSpec.scala b/src/test/scala/TemplateSpec.scala index a68dc1c44..7952ab21f 100644 --- a/src/test/scala/TemplateSpec.scala +++ b/src/test/scala/TemplateSpec.scala @@ -2,7 +2,7 @@ package template import org.specs._ -class SendSpec extends Specification { +class TemplateSpec extends Specification { "A template project" should { "not violate universal realities" >> { 1 mustEqual 1