From 1e65b8ad5967d41dc56d7dce015f4bb6c1af26dd Mon Sep 17 00:00:00 2001 From: Hao Huang Date: Fri, 10 Feb 2017 16:17:01 -0800 Subject: Add the companion ordering object for Date --- src/main/scala/xyz/driver/core/date.scala | 10 +++++++ src/test/scala/xyz/driver/core/DateTest.scala | 41 +++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/test/scala/xyz/driver/core/DateTest.scala diff --git a/src/main/scala/xyz/driver/core/date.scala b/src/main/scala/xyz/driver/core/date.scala index bb88501..f0b9bf6 100644 --- a/src/main/scala/xyz/driver/core/date.scala +++ b/src/main/scala/xyz/driver/core/date.scala @@ -26,6 +26,16 @@ object date { } object Date { + implicit def dateOrdering: Ordering[Date] = Ordering.fromLessThan { (date1, date2) => + if (date1.year != date2.year) { + date1.year < date2.year + } else if (date1.month != date2.month) { + date1.month < date2.month + } else { + date1.day < date2.day + } + } + def fromString(dateString: String): Option[Date] = { util.Try(dateString.split("-").map(_.toInt)).toOption collect { case Array(year, month, day) if (1 to 12 contains month) && (1 to 31 contains day) => diff --git a/src/test/scala/xyz/driver/core/DateTest.scala b/src/test/scala/xyz/driver/core/DateTest.scala new file mode 100644 index 0000000..50f8521 --- /dev/null +++ b/src/test/scala/xyz/driver/core/DateTest.scala @@ -0,0 +1,41 @@ +package xyz.driver.core + +import org.scalacheck.{Arbitrary, Gen} +import org.scalatest.prop.Checkers +import org.scalatest.{FlatSpec, Matchers} +import xyz.driver.core.date.Date + +class DateTest extends FlatSpec with Matchers with Checkers { + val dateGenerator = for { + year <- Gen.choose(0, 3000) + month <- Gen.choose(0, 11) + day <- Gen.choose(1, 31) + } yield Date(year, date.tagMonth(month), day) + implicit val arbitraryDate = Arbitrary[Date](dateGenerator) + + it should "have ordering defined correctly" in { + Seq(Date.fromString("2013-05-10"), + Date.fromString("2020-02-15"), + Date.fromString("2017-03-05"), + Date.fromString("2013-05-12")).sorted should + contain theSameElementsInOrderAs Seq(Date.fromString("2013-05-10"), + Date.fromString("2013-05-12"), + Date.fromString("2017-03-05"), + Date.fromString("2020-02-15")) + + check { dates: List[Date] => + dates.sorted.sliding(2).filter(_.size == 2).forall { + case Seq(a, b) => + if (a.year == b.year) { + if (a.month == b.month) { + a.day < b.day + } else { + a.month < b.month + } + } else { + a.year < b.year + } + } + } + } +} -- cgit v1.2.3