Skip to content

Commit

Permalink
Add ScalaCheck property tests for java.time
Browse files Browse the repository at this point in the history
  • Loading branch information
satabin committed Jul 18, 2024
1 parent d9c6092 commit 75fa0ec
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -392,7 +392,7 @@ object FromJSON extends FromJSONInstances {
time.LocalDate.parse(_, time.format.DateTimeFormatter.ISO_LOCAL_DATE))

implicit val javaYearMonthReader: FromJSON[time.YearMonth] =
jsonStringReader("Failed to parse year/month: %s")(time.YearMonth.parse(_))
jsonStringReader("Failed to parse year/month: %s")(time.YearMonth.parse(_, JavaYearMonthFormatter))

implicit val uuidReader: FromJSON[UUID] = jsonStringReader("Invalid UUID: '%s'")(UUID.fromString)

Expand Down
2 changes: 1 addition & 1 deletion json/json-core/src/main/scala/io/sphere/json/ToJSON.scala
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ object ToJSON extends ToJSONInstances {
}

implicit val javaYearMonth: ToJSON[time.YearMonth] = new ToJSON[time.YearMonth] {
def write(value: time.YearMonth): JValue = JString(value.toString())
def write(value: time.YearMonth): JValue = JString(JavaYearMonthFormatter.format(value))
}

implicit val uuidWriter: ToJSON[UUID] = new ToJSON[UUID] {
Expand Down
6 changes: 5 additions & 1 deletion json/json-core/src/main/scala/io/sphere/json/package.scala
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,15 @@ import org.json4s.{DefaultFormats, JsonInput, StringInput}
import org.json4s.JsonAST._
import org.json4s.ParserUtil.ParseException
import org.json4s.jackson.compactJson
import java.time.format.DateTimeFormatter

/** Provides functions for reading & writing JSON, via type classes JSON/JSONR/JSONW. */
package object json extends Logging {

implicit val liftJsonFormats = DefaultFormats
private[json] val JavaYearMonthFormatter =
DateTimeFormatter.ofPattern("uuuu-MM")

implicit val liftJsonFormats: DefaultFormats = DefaultFormats

type JValidation[A] = ValidatedNel[JSONError, A]

Expand Down
23 changes: 16 additions & 7 deletions json/json-core/src/test/scala/io/sphere/json/JSONProperties.scala
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import cats.data.NonEmptyList
import cats.syntax.eq._
import org.joda.time._
import org.scalacheck._
import java.time

import scala.math.BigDecimal.RoundingMode

Expand Down Expand Up @@ -74,27 +75,31 @@ object JSONProperties extends Properties("JSON") {
least <- Arbitrary.arbitrary[Long]
} yield new UUID(most, least))

implicit val currencyEqual = new Eq[Currency] {
implicit val currencyEqual: Eq[Currency] = new Eq[Currency] {
def eqv(c1: Currency, c2: Currency) = c1.getCurrencyCode == c2.getCurrencyCode
}
implicit val localeEqual = new Eq[Locale] {
implicit val localeEqual: Eq[Locale] = new Eq[Locale] {
def eqv(l1: Locale, l2: Locale) = l1.toLanguageTag == l2.toLanguageTag
}
implicit val moneyEqual = new Eq[Money] {
implicit val moneyEqual: Eq[Money] = new Eq[Money] {
override def eqv(x: Money, y: Money): Boolean = x == y
}
implicit val dateTimeEqual = new Eq[DateTime] {
implicit val dateTimeEqual: Eq[DateTime] = new Eq[DateTime] {
def eqv(dt1: DateTime, dt2: DateTime) = dt1 == dt2
}
implicit val localTimeEqual = new Eq[LocalTime] {
implicit val localTimeEqual: Eq[LocalTime] = new Eq[LocalTime] {
def eqv(dt1: LocalTime, dt2: LocalTime) = dt1 == dt2
}
implicit val localDateEqual = new Eq[LocalDate] {
implicit val localDateEqual: Eq[LocalDate] = new Eq[LocalDate] {
def eqv(dt1: LocalDate, dt2: LocalDate) = dt1 == dt2
}
implicit val yearMonthEqual = new Eq[YearMonth] {
implicit val yearMonthEqual: Eq[YearMonth] = new Eq[YearMonth] {
def eqv(dt1: YearMonth, dt2: YearMonth) = dt1 == dt2
}
implicit val javaInstantEqual: Eq[time.Instant] = Eq.fromUniversalEquals
implicit val javaLocalDateEqual: Eq[time.LocalDate] = Eq.fromUniversalEquals
implicit val javaLocalTimeEqual: Eq[time.LocalTime] = Eq.fromUniversalEquals
implicit val javaYearMonthEqual: Eq[time.YearMonth] = Eq.fromUniversalEquals

private def checkC[C[_]](name: String)(implicit
jri: FromJSON[C[Int]],
Expand Down Expand Up @@ -151,4 +156,8 @@ object JSONProperties extends Properties("JSON") {
property("read/write LocalDate") = Prop.forAll((u: LocalDate) => check(u))
property("read/write LocalTime") = Prop.forAll((u: LocalTime) => check(u))
property("read/write YearMonth") = Prop.forAll((u: YearMonth) => check(u))
property("read/write java.time.Instant") = Prop.forAll((i: time.Instant) => check(i))
property("read/write java.time.LocalDate") = Prop.forAll((d: time.LocalDate) => check(d))
property("read/write java.time.LocalTime") = Prop.forAll((t: time.LocalTime) => check(t))
property("read/write java.time.YearMonth") = Prop.forAll((ym: time.YearMonth) => check(ym))
}

0 comments on commit 75fa0ec

Please sign in to comment.