com-lihaoyi / utest

A simple testing framework for Scala
MIT License
487 stars 80 forks source link

Tests macro generates invalid code with Scala 3 and Scala.js #251

Open japgolly opened 3 years ago

japgolly commented 3 years ago

Add as utest/test/src/test/utest/MacroTest.scala:

package test.utest

import utest._

object MacroTest extends TestSuite {

  sealed trait Blah
  object Blah {
    case object X extends Blah
    case class Y(s: String) extends Blah
  }

  override def tests = Tests {
    "1" - {
      var b: Blah = Blah.X
      val x1 = b match {case Blah.Y(_) => true; case _ => false}
      println("Result: " + x1)
    }
  }
}

Then run ./mill all __.test:

X test.utest.MacroTest.1 0ms 
  org.scalajs.linker.runtime.UndefinedBehaviorError: java.lang.ClassCastException: X is not an instance of test.utest.MacroTest$Blah$Y
    java.lang.StackTrace$.captureState(StackTrace.scala:69)
    org.scalajs.linker.runtime.UndefinedBehaviorError.fillInStackTrace(Throwables.scala:48)
    java.lang.Throwable.<init>(Throwables.scala:36)
    java.lang.Error.<init>(Throwables.scala:259)
    java.lang.Error.<init>(Throwables.scala:260)
    java.lang.VirtualMachineError.<init>(Throwables.scala:331)
    org.scalajs.linker.runtime.UndefinedBehaviorError.<init>(UndefinedBehaviorError.scala:25)
    org.scalajs.linker.runtime.UndefinedBehaviorError.<init>(UndefinedBehaviorError.scala:30)
    <jscode>.$throwClassCastException(out.js:95)
    <jscode>.$as_Ltest_utest_MacroTest$Blah$Y(MacroTest.scala:9)
  java.lang.ClassCastException: X is not an instance of test.utest.MacroTest$Blah$Y
    java.lang.StackTrace$.captureState(StackTrace.scala:69)
    java.lang.ClassCastException.fillInStackTrace(Throwables.scala:48)
    java.lang.Throwable.<init>(Throwables.scala:36)
    java.lang.Exception.<init>(Throwables.scala:380)
    java.lang.RuntimeException.<init>(Throwables.scala:457)
    java.lang.RuntimeException.<init>(Throwables.scala:458)
    java.lang.RuntimeException.<init>(Throwables.scala:460)
    java.lang.ClassCastException.<init>(Throwables.scala:357)
    <jscode>.$throwClassCastException(out.js:95)
    <jscode>.$as_Ltest_utest_MacroTest$Blah$Y(MacroTest.scala:9)
...
1 targets failed
all 1 targets failed
utest.js[3.0.0,1.5.1].test.test 1 tests failed: 
  test.utest.MacroTest test.utest.MacroTest.1
bwbecker commented 3 years ago

I've noted the same issue but hadn't yet reduced it down to this succinct an example.