Skip to content

Commit

Permalink
Merge 0791992 into 3bc4b33
Browse files Browse the repository at this point in the history
  • Loading branch information
scala-steward committed Dec 14, 2019
2 parents 3bc4b33 + 0791992 commit 0892a6b
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 47 deletions.
2 changes: 1 addition & 1 deletion modules/squants/build.sbt
Expand Up @@ -3,7 +3,7 @@ name := "pureconfig-squants"
crossScalaVersions ~= { _.filterNot(_.startsWith("2.13")) }

libraryDependencies ++= Seq(
"org.typelevel" %% "squants" % "1.3.0") // blocked by https://github.com/typelevel/squants/issues/321
"org.typelevel" %% "squants" % "1.6.0") // blocked by https://github.com/typelevel/squants/issues/321

developers := List(
Developer("melrief", "Mario Pastorelli", "pastorelli.mario@gmail.com", url("https://github.com/melrief")),
Expand Down
Expand Up @@ -71,8 +71,9 @@ package object squants {
viaNonEmptyStringTry[DataRate](DataRate.apply, _.toString)

// market
implicit val moneyDensityConfigConvert =
viaNonEmptyStringTry[Money](Money.apply, _.toString)
// Using own string representation due to https://github.com/typelevel/squants/issues/321
implicit def moneyDensityConfigConvert(implicit mc: MoneyContext) =
viaNonEmptyStringTry[Money](Money.apply, { m => m.amount.underlying.toPlainString + " " + m.currency.code })

// mass
implicit val areaDensityConfigConvert =
Expand Down
@@ -1,16 +1,14 @@
package pureconfig.module.squants

import scala.reflect.ClassTag
import scala.reflect.runtime.universe._

import com.typesafe.config.ConfigFactory
import org.scalacheck.{ Arbitrary, Gen }
import pureconfig.{ BaseSuite, ConfigConvert }
import pureconfig.generic.auto._
import pureconfig.syntax._
import _root_.squants._
import _root_.squants.market._
import pureconfig.module.squants.arbitrary._
import pureconfig.{ BaseSuite, ConfigConvert, Derivation }

class SquantsConvertTest extends BaseSuite {
implicit val mc: MoneyContext = defaultMoneyContext

checkDimension(electro.Capacitance)
checkDimension(electro.Conductivity)
Expand Down Expand Up @@ -78,45 +76,10 @@ class SquantsConvertTest extends BaseSuite {
checkDimension(time.Frequency)
checkDimension(time.Time)

it should "parse Money" in forAll { (m: Money) =>
checkConfig(SquantConfig(m))
}

case class SquantConfig[T](value: T)
checkArbitrary[market.Money]

def checkDimension[T <: Quantity[T]](dim: Dimension[T])(implicit tag: ClassTag[T], cc: ConfigConvert[T]): Unit = {
def checkDimension[T <: Quantity[T]](dim: Dimension[T])(implicit tag: TypeTag[T], cc: Derivation[ConfigConvert[T]]): Unit = {
implicit val arbitrary = quantityAbitrary(dim)

it should s"""parse ${tag.runtimeClass.getSimpleName}""" in forAll { (t: T) =>
checkConfig(SquantConfig(t))
}
}

def checkConfig[T](config: SquantConfig[T])(implicit cc: ConfigConvert[T]) = {
val configString = s"""{value:"${config.value.toString}"}"""
ConfigFactory.parseString(configString).to[SquantConfig[T]] shouldEqual Right(config)
}

def quantityAbitrary[T <: Quantity[T]](dim: Dimension[T]): Arbitrary[T] = {
Arbitrary(
for {
n <- Arbitrary.arbitrary[Double]
u <- Gen.oneOf(dim.units.toList)
} yield u(n))
}

// Money.units is not implemented so we need an explicit Arbitrary
implicit val moneyArbitrary: Arbitrary[Money] = {

// BTC is not included: fails on input: 0E-15
val currencies =
List(USD, ARS, AUD, BRL, CAD, CHF, CLP, CNY, CZK, DKK, EUR, GBP,
HKD, INR, JPY, KRW, MXN, MYR, NOK, NZD, RUB, SEK, XAG, XAU)

Arbitrary(
for {
n <- Arbitrary.arbitrary[Double]
c <- Gen.oneOf(currencies)
} yield Money(BigDecimal(n).setScale(c.formatDecimals, BigDecimal.RoundingMode.HALF_EVEN), c))
checkArbitrary[T]
}
}
@@ -0,0 +1,31 @@
package pureconfig.module.squants

import org.scalacheck.{ Arbitrary, Gen }
import squants.market._
import squants.{ Dimension, Quantity }

package object arbitrary {

def quantityAbitrary[T <: Quantity[T]](dim: Dimension[T]): Arbitrary[T] = {
Arbitrary(
for {
n <- Arbitrary.arbitrary[Double]
u <- Gen.oneOf(dim.units.toList)
} yield u(n))
}

// Money.units is not implemented so we need an explicit Arbitrary
implicit val moneyArbitrary: Arbitrary[Money] = {

// BTC is not included: fails on input: 0E-15
val currencies =
List(USD, ARS, AUD, BRL, CAD, CHF, CLP, CNY, CZK, DKK, EUR, GBP,
HKD, INR, JPY, KRW, MXN, MYR, NOK, NZD, RUB, SEK, XAG, XAU)

Arbitrary(
for {
n <- Arbitrary.arbitrary[Double]
c <- Gen.oneOf(currencies)
} yield Money(BigDecimal(n).setScale(c.formatDecimals, BigDecimal.RoundingMode.HALF_EVEN), c))
}
}

0 comments on commit 0892a6b

Please sign in to comment.