aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHao Huang <hhuang@driver.xyz>2017-02-10 16:17:01 -0800
committerHao Huang <hhuang@driver.xyz>2017-02-10 16:17:01 -0800
commit1e65b8ad5967d41dc56d7dce015f4bb6c1af26dd (patch)
tree84221982bcbca6dd461364c865f1cb1273fd62c1
parent4adc14f77762f48436f3c56f9328a6e4bedfe824 (diff)
downloaddriver-core-1e65b8ad5967d41dc56d7dce015f4bb6c1af26dd.tar.gz
driver-core-1e65b8ad5967d41dc56d7dce015f4bb6c1af26dd.tar.bz2
driver-core-1e65b8ad5967d41dc56d7dce015f4bb6c1af26dd.zip
Add the companion ordering object for Date
-rw-r--r--src/main/scala/xyz/driver/core/date.scala10
-rw-r--r--src/test/scala/xyz/driver/core/DateTest.scala41
2 files changed, 51 insertions, 0 deletions
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
+ }
+ }
+ }
+ }
+}