Skip to content

Error when projecting a scalacheck Arbitrary Coproduct #187

Open
@juanjovazquez

Description

@juanjovazquez

A java.lang.ClassCastException is raised when projecting a sample Coproduct obtained through a scalacheck Arbitrary. Example:

import iota.{ Cop, TNil }
import iota.TList.::
import iota.scalacheck._
import org.scalacheck.{ Arbitrary, Gen }

object IotaScalacheck {

  object Monday
  object Tuesday
  object Wednesday
  object Thursday
  object Friday

  type Weekday = Cop[
    Monday.type ::
    Tuesday.type ::
    Wednesday.type ::
    Thursday.type ::
    Friday.type ::
    TNil
  ]

  implicit val arbMonday    = Arbitrary(Gen.const(Monday))
  implicit val arbTuesday   = Arbitrary(Gen.const(Tuesday))
  implicit val arbWednesday = Arbitrary(Gen.const(Wednesday))
  implicit val arbThursday  = Arbitrary(Gen.const(Thursday))
  implicit val arbFriday    = Arbitrary(Gen.const(Friday))

  def main(args: Array[String]): Unit = {
    val weekday: Weekday = implicitly[Arbitrary[Weekday]].arbitrary.sample.get

    val MondayInject    = Cop.Inject[Monday.type, Weekday]
    val TuesdayInject   = Cop.Inject[Tuesday.type, Weekday]
    val WednesdayInject = Cop.Inject[Wednesday.type, Weekday]
    val ThursdayInject  = Cop.Inject[Thursday.type, Weekday]
    val FridayInject    = Cop.Inject[Friday.type, Weekday]

    weekday match { // runtime error! java.lang.ClassCastException: org.scalacheck.ArbitraryLowPriority$$anon$1 cannot be cast to IotaScalacheck$Thursday$
      case MondayInject(day)    => println(day)
      case TuesdayInject(day)   => println(day)
      case WednesdayInject(day) => println(day)
      case ThursdayInject(day)  => println(day)
      case MondayInject(day)    => println(day)
      case FridayInject(day)    => println(day)
    }
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions