generating GenMaps for testing (#5115)

* building a GenMap generator

* move Party Order to accessible place; test whether Name Equal is still in use

* add Order instance for SortedLookupList

* switch to Map for genMap's Inj; more Order instances

* remove all Order from TypedValueGenerators

* Revert "add Order instance for SortedLookupList"

This reverts commit 03a59a8249.

* moving the Equal instance means scenario-interpreter no longer direct-deps scalaz

* add a test using TypedValueGenerators GenMap

* remove Party Order

* refmt bazel

* remove stray import

* followup dep change to moving the Equal[Name] instance

* add changelog

CHANGELOG_BEGIN
CHANGELOG_END

* Name equal instance appears to be no longer used, but keeping anyway
This commit is contained in:
Stephen Compall 2020-03-25 10:28:06 -04:00 committed by GitHub
parent 46be910ba1
commit 8d2c13cf43
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 57 additions and 30 deletions

View File

@ -107,6 +107,11 @@ sealed abstract class IdString {
val ContractIdString: ConcatenableStringModule[ContractIdString, HexString] val ContractIdString: ConcatenableStringModule[ContractIdString, HexString]
} }
object IdString {
import Ref.Name
implicit def `Name equal instance`: Equal[Name] = Name.equalInstance
}
private sealed abstract class StringModuleImpl extends StringModule[String] { private sealed abstract class StringModuleImpl extends StringModule[String] {
type T = String type T = String

View File

@ -3,6 +3,8 @@
package com.digitalasset.daml.lf.data package com.digitalasset.daml.lf.data
import scalaz.Order
import java.math.{BigDecimal, BigInteger} import java.math.{BigDecimal, BigInteger}
import scala.math.{BigDecimal => BigDec} import scala.math.{BigDecimal => BigDec}
@ -364,4 +366,7 @@ object NumericModule {
def toScaledString: String = Numeric toString self def toScaledString: String = Numeric toString self
} }
implicit def `Numeric Order`: Order[Numeric] =
Order.fromScalaOrdering[BigDecimal].contramap(identity)
} }

View File

@ -4,15 +4,12 @@
package com.digitalasset.daml.lf package com.digitalasset.daml.lf
package data package data
import scalaz.Equal
object Ref { object Ref {
val IdString: IdString = new IdStringImpl val IdString: IdString = new IdStringImpl
type Name = IdString.Name type Name = IdString.Name
val Name: IdString.Name.type = IdString.Name val Name: IdString.Name.type = IdString.Name
implicit def `Name equal instance`: Equal[Name] = Name.equalInstance
/* Encoding of byte array */ /* Encoding of byte array */
type HexString = IdString.HexString type HexString = IdString.HexString

View File

@ -20,7 +20,6 @@ da_scala_library(
"//daml-lf/data", "//daml-lf/data",
"//daml-lf/language", "//daml-lf/language",
"@maven//:org_scala_lang_modules_scala_parser_combinators_2_12", "@maven//:org_scala_lang_modules_scala_parser_combinators_2_12",
"@maven//:org_scalaz_scalaz_core_2_12",
], ],
) )
@ -36,6 +35,5 @@ da_scala_test(
":parser", ":parser",
"//daml-lf/data", "//daml-lf/data",
"//daml-lf/language", "//daml-lf/language",
"@maven//:org_scalaz_scalaz_core_2_12",
], ],
) )

View File

@ -24,7 +24,6 @@ da_scala_binary(
"//daml-lf/validation", "//daml-lf/validation",
"@maven//:com_google_protobuf_protobuf_java", "@maven//:com_google_protobuf_protobuf_java",
"@maven//:org_jline_jline", "@maven//:org_jline_jline",
"@maven//:org_scalaz_scalaz_core_2_12",
"@maven//:org_typelevel_paiges_core_2_12", "@maven//:org_typelevel_paiges_core_2_12",
], ],
) )

View File

@ -20,7 +20,6 @@ da_scala_library(
"//daml-lf/data", "//daml-lf/data",
"//daml-lf/interpreter", "//daml-lf/interpreter",
"//daml-lf/transaction", "//daml-lf/transaction",
"@maven//:org_scalaz_scalaz_core_2_12",
], ],
) )

View File

@ -13,7 +13,7 @@ da_scala_library(
plugins = [ plugins = [
"@maven//:org_spire_math_kind_projector_2_12", "@maven//:org_spire_math_kind_projector_2_12",
], ],
scalacopts = lf_scalacopts, scalacopts = lf_scalacopts + ["-Xsource:2.13"],
tags = ["maven_coordinates=com.digitalasset:daml-lf-transaction-scalacheck:__VERSION__"], tags = ["maven_coordinates=com.digitalasset:daml-lf-transaction-scalacheck:__VERSION__"],
visibility = ["//visibility:public"], visibility = ["//visibility:public"],
deps = [ deps = [

View File

@ -23,8 +23,10 @@ import iface.{
import scalaz.~> import scalaz.~>
import scalaz.Id.Id import scalaz.Id.Id
import scalaz.syntax.bitraverse._
import scalaz.syntax.traverse._ import scalaz.syntax.traverse._
import scalaz.std.option._ import scalaz.std.option._
import scalaz.std.tuple._
import org.scalacheck.{Arbitrary, Gen, Shrink} import org.scalacheck.{Arbitrary, Gen, Shrink}
import Arbitrary.arbitrary import Arbitrary.arbitrary
@ -59,15 +61,18 @@ object TypedValueGenerators {
type Inj[_] = Inj0 type Inj[_] = Inj0
} }
def noCid[Inj0](pt: PT, inj0: Inj0 => Value[Nothing])(prj0: Value[Any] PartialFunction Inj0)( private sealed abstract class NoCid0[Inj0](implicit arb: Arbitrary[Inj0], shr: Shrink[Inj0])
implicit arb: Arbitrary[Inj0], extends ValueAddend {
shr: Shrink[Inj0]): NoCid[Inj0] = new ValueAddend {
type Inj[Cid] = Inj0 type Inj[Cid] = Inj0
override final def injarb[Cid: Arbitrary] = arb
override final def injshrink[Cid: Shrink] = shr
}
def noCid[Inj0: Arbitrary: Shrink](pt: PT, inj0: Inj0 => Value[Nothing])(
prj0: Value[Any] PartialFunction Inj0): NoCid[Inj0] = new NoCid0[Inj0] {
override val t = TypePrim(pt, ImmArraySeq.empty) override val t = TypePrim(pt, ImmArraySeq.empty)
override def inj[Cid] = inj0 override def inj[Cid] = inj0
override def prj[Cid] = prj0.lift override def prj[Cid] = prj0.lift
override def injarb[Cid: Arbitrary] = arb
override def injshrink[Cid: Shrink] = shr
} }
import Value._, ValueGenerators.Implicits._ import Value._, ValueGenerators.Implicits._
@ -79,25 +84,19 @@ object TypedValueGenerators {
val bool = noCid(PT.Bool, ValueBool(_)) { case ValueBool(b) => b } val bool = noCid(PT.Bool, ValueBool(_)) { case ValueBool(b) => b }
val party = noCid(PT.Party, ValueParty) { case ValueParty(p) => p } val party = noCid(PT.Party, ValueParty) { case ValueParty(p) => p }
def numeric(scale: Numeric.Scale): NoCid[Numeric] = new ValueAddend { def numeric(scale: Numeric.Scale): NoCid[Numeric] = {
type Inj[Cid] = Numeric implicit val arb: Arbitrary[Numeric] = Arbitrary(ValueGenerators.numGen(scale))
new NoCid0[Numeric] {
override def t: Type = TypeNumeric(scale)
override def t: Type = TypeNumeric(scale) override def inj[Cid]: Numeric => Value[Cid] =
x => ValueNumeric(Numeric.assertFromBigDecimal(scale, x))
override def inj[Cid]: Numeric => Value[Cid] = override def prj[Cid]: Value[Cid] => Option[Numeric] = {
x => ValueNumeric(Numeric.assertFromBigDecimal(scale, x)) case ValueNumeric(x) => Numeric.fromBigDecimal(scale, x).toOption
case _ => None
override def prj[Cid]: Value[Cid] => Option[Numeric] = { }
case ValueNumeric(x) => Numeric.fromBigDecimal(scale, x).toOption
case _ => None
} }
override def injarb[Cid: Arbitrary]: Arbitrary[Numeric] =
Arbitrary(ValueGenerators.numGen(scale))
override def injshrink[Cid: Shrink]: Shrink[Numeric] =
implicitly
} }
val contractId: Aux[Id] = new ValueAddend { val contractId: Aux[Id] = new ValueAddend {
@ -168,6 +167,30 @@ object TypedValueGenerators {
override def injshrink[Cid: Shrink] = Shrink.shrinkAny // XXX descend override def injshrink[Cid: Shrink] = Shrink.shrinkAny // XXX descend
} }
def genMap(key: ValueAddend, elt: ValueAddend): ValueAddend {
type Inj[Cid] = key.Inj[Cid] Map elt.Inj[Cid]
} = new ValueAddend {
type Inj[Cid] = key.Inj[Cid] Map elt.Inj[Cid]
override val t = TypePrim(PT.GenMap, ImmArraySeq(key.t, elt.t))
override def inj[Cid] =
(m: key.Inj[Cid] Map elt.Inj[Cid]) =>
ValueGenMap(
m.iterator
.map { case (k, v) => (key.inj(k), elt.inj(v)) }
.to[ImmArray])
override def prj[Cid] = {
case ValueGenMap(kvs) =>
kvs traverse (_ bitraverse (key.prj[Cid], elt.prj[Cid])) map (_.toSeq.toMap)
case _ => None
}
override def injarb[Cid: Arbitrary] = {
implicit val k: Arbitrary[key.Inj[Cid]] = key.injarb
implicit val e: Arbitrary[elt.Inj[Cid]] = elt.injarb
implicitly[Arbitrary[key.Inj[Cid] Map elt.Inj[Cid]]]
}
override def injshrink[Cid: Shrink] = Shrink.shrinkAny // XXX descend
}
/** See [[RecVarSpec]] companion for usage examples. */ /** See [[RecVarSpec]] companion for usage examples. */
def record(name: Ref.Identifier, spec: RecVarSpec): (DefDataType.FWT, Aux[spec.HRec]) = def record(name: Ref.Identifier, spec: RecVarSpec): (DefDataType.FWT, Aux[spec.HRec]) =
(DefDataType(ImmArraySeq.empty, Record(spec.t.to[ImmArraySeq])), new ValueAddend { (DefDataType(ImmArraySeq.empty, Record(spec.t.to[ImmArraySeq])), new ValueAddend {
@ -257,6 +280,7 @@ object TypedValueGenerators {
} yield field[K](pvh) :: pvt } yield field[K](pvh) :: pvt
case _ => None case _ => None
} }
override def recarb[Cid: Arbitrary] = { override def recarb[Cid: Arbitrary] = {
import self.{recarb => tailarb}, h.{injarb => headarb} import self.{recarb => tailarb}, h.{injarb => headarb}
Arbitrary(arbitrary[(h.Inj[Cid], self.HRec[Cid])] map { Arbitrary(arbitrary[(h.Inj[Cid], self.HRec[Cid])] map {

View File

@ -34,6 +34,5 @@ da_scala_test(
"//daml-lf/data", "//daml-lf/data",
"//daml-lf/language", "//daml-lf/language",
"//daml-lf/parser", "//daml-lf/parser",
"@maven//:org_scalaz_scalaz_core_2_12",
], ],
) )

View File

@ -134,6 +134,7 @@ class ValuePredicateTest
c("""{}""", VA.map(VA.int64))( c("""{}""", VA.map(VA.int64))(
SortedLookupList(Map("a" -> 1, "b" -> 2)), SortedLookupList(Map("a" -> 1, "b" -> 2)),
"PrimTypeTextMap not supported"), "PrimTypeTextMap not supported"),
c("""{}""", VA.genMap(VA.int64, VA.int64))(Map(), "PrimTypeGenMap not supported"),
c("[1, 2, 3]", VA.list(VA.int64))(Vector(1, 2, 3), "PrimTypeList not supported"), c("[1, 2, 3]", VA.list(VA.int64))(Vector(1, 2, 3), "PrimTypeList not supported"),
c("[1, 2, 3]", VA.list(VA.int64))(Vector(3, 2, 1), "PrimTypeList not supported"), c("[1, 2, 3]", VA.list(VA.int64))(Vector(3, 2, 1), "PrimTypeList not supported"),
) )