加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用shapeless-scalacheck派生任意函数实例

发布时间:2020-12-16 18:09:01 所属栏目:安全 来源:网络整理
导读:在升级到 scalacheck 1.13.3之后,我遇到了一个奇怪的问题,即导出A =的实例. B或C,其中Or本质上是一个光,或者几乎总是失败. 这是我可以编写的最简单的代码来重现该问题: import org.scalatest.FunSuiteimport org.scalatest.prop.GeneratorDrivenPropertyChe
在升级到 scalacheck 1.13.3之后,我遇到了一个奇怪的问题,即导出A =>的实例. B或C,其中Or本质上是一个光,或者几乎总是失败.

这是我可以编写的最简单的代码来重现该问题:

import org.scalatest.FunSuite
import org.scalatest.prop.GeneratorDrivenPropertyChecks
import org.scalacheck.Shapeless._

class Testor extends FunSuite with GeneratorDrivenPropertyChecks {
  sealed trait Or[+A,+B] extends Product with Serializable
  case class Left[A](a: A) extends Or[A,Nothing]
  case class Right[B](b: B) extends Or[Nothing,B]

  test("reproduce") {
    forAll { (i: Int,f: Int ? Float Or Boolean) ?
      f(i)
    }
  }
}

这失败了:

RetrievalError was thrown during property evaluation.
  Message: couldn't generate value
  Occurred when passed generated values (
    arg0 = 0,// 30 shrinks
    arg1 = <function1>
    )

请注意,提供明确的Arbitrary [Float或Boolean]可以解决问题,因此很明显问题出现在泛型推导中.

我不相信问题在于无形scalacheck – 我尝试编写自己的泛型推导来看看它是否有帮助,并且它以完全相同的方式失败了.

奇怪的东西,但可能是由于任意函数的工作方式,是函数实际生成,但在评估时失败.

非常感谢任何帮助/建议,因为我有点卡住了.

解决方法

这个问题似乎是双面的:

> scalacheck(org.scalacheck.Test.Parameters.default)和scalatest中的默认测试参数的minSize为0.Prop.check尝试在启动时生成具有此大小的值.
> scalacheck-shapeless中的MkCoproductArbitrary.ccons在生成任意副产品时将大小零解释为终止条件,因此失败.

作为临时解决方法,在Travis的回复示例中,可以通过以下方式检查属性:

prop.check(Test.Parameters.default.withMinSize(1))

使用scalatest(在问题中使用),min size参数也可以改变,可能通过放置类似的东西

implicit val config = PropertyCheckConfiguration(minSize = PosZInt(1))

在测试用例之前(警告:我没有尝试/检查最新的解决方案,不像之前的纯scalacheck).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读