mirror of
https://github.com/digital-asset/daml.git
synced 2024-09-20 01:07:18 +03:00
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:
parent
46be910ba1
commit
8d2c13cf43
@ -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
|
||||||
|
@ -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)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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",
|
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -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",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -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",
|
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -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 = [
|
||||||
|
@ -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 {
|
||||||
|
@ -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",
|
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -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"),
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user