From 75bfd2e9437409df09df2e8164dcb84d98162ded Mon Sep 17 00:00:00 2001 From: Alexandru Nedelcu Date: Tue, 5 May 2026 11:48:14 +0300 Subject: [PATCH 1/4] Migrate from Scalatest to MUnit --- build.sbt | 13 +++++++++---- .../scala/monix/newtypes/BuildFailureSuite.scala | 4 ++-- .../monix/newtypes/NewsubtypeCovariantKSuite.scala | 4 ++-- .../scala/monix/newtypes/NewsubtypeKSuite.scala | 4 ++-- .../monix/newtypes/NewsubtypeValidatedSuite.scala | 14 +++++++------- .../monix/newtypes/NewsubtypeWrappedSuite.scala | 8 ++++---- .../monix/newtypes/NewtypeCovariantKSuite.scala | 4 ++-- .../test/scala/monix/newtypes/NewtypeKSuite.scala | 4 ++-- .../test/scala/monix/newtypes/NewtypeSuite.scala | 4 ++-- .../monix/newtypes/NewtypeValidatedSuite.scala | 14 +++++++------- .../scala/monix/newtypes/NewtypeWrappedSuite.scala | 8 ++++---- .../test/scala/monix/newtypes/TypeInfoSuite.scala | 4 ++-- .../integrations/NewsubtypeCirceCodecSuite.scala | 4 ++-- .../integrations/NewtypeCirceCodecSuite.scala | 4 ++-- .../integrations/NewtypeKCirceCodecSuite.scala | 4 ++-- .../integrations/NewsubtypeCirceCodecSuite.scala | 4 ++-- .../integrations/NewtypeCirceCodecSuite.scala | 4 ++-- .../integrations/NewtypeKCirceCodecSuite.scala | 4 ++-- 18 files changed, 57 insertions(+), 52 deletions(-) diff --git a/build.sbt b/build.sbt index 34aff01..f3fc82f 100644 --- a/build.sbt +++ b/build.sbt @@ -17,10 +17,15 @@ val Scala3 = "3.3.7" val CatsVersion = "2.13.0" val CirceVersionV0_14 = "0.14.15" val PureConfigV0_17 = "0.17.8" -val ScalaTestVersion = "3.2.20" +val MUnitVersion = "1.2.4" val Shapeless2xVersion = "2.3.12" val Shapeless3xVersion = "3.4.1" +def munitTestDependency = Def.setting { + ("org.scalameta" %%% "munit" % MUnitVersion % Test) + .exclude("org.scala-native", s"test-interface_native0.5_${scalaBinaryVersion.value}") +} + // --------------------------------------------------------------------------- // Commands @@ -265,8 +270,8 @@ lazy val core = crossProject(JSPlatform, JVMPlatform, NativePlatform) libraryDependencies ++= Seq( // https://typelevel.org/cats/ "org.typelevel" %%% "cats-core" % CatsVersion % Test, - // https://github.com/scalatest/scalatest - "org.scalatest" %%% "scalatest" % ScalaTestVersion % Test, + // https://scalameta.org/munit/ + munitTestDependency.value, ), // Version specific dependencies libraryDependencies ++= (CrossVersion.partialVersion(scalaVersion.value) match { @@ -291,7 +296,7 @@ lazy val coreNative = core.native def integrationSharedSettings(other: Setting[_]*) = other ++ Seq( libraryDependencies ++= Seq( - "org.scalatest" %%% "scalatest" % ScalaTestVersion % Test, + munitTestDependency.value, ), ) ++ Seq(Compile, Test).map { sc => (sc / unmanagedSourceDirectories) ++= { diff --git a/core/shared/src/test/scala/monix/newtypes/BuildFailureSuite.scala b/core/shared/src/test/scala/monix/newtypes/BuildFailureSuite.scala index adb2040..aa72886 100644 --- a/core/shared/src/test/scala/monix/newtypes/BuildFailureSuite.scala +++ b/core/shared/src/test/scala/monix/newtypes/BuildFailureSuite.scala @@ -17,9 +17,9 @@ package monix.newtypes -import org.scalatest.funsuite.AnyFunSuite +import munit.FunSuite -class BuildFailureSuite extends AnyFunSuite { +class BuildFailureSuite extends FunSuite { test("toReadableString") { val bf = BuildFailure[List[String]]("empty list") assert(bf.toReadableString == "Invalid List[String] — empty list") diff --git a/core/shared/src/test/scala/monix/newtypes/NewsubtypeCovariantKSuite.scala b/core/shared/src/test/scala/monix/newtypes/NewsubtypeCovariantKSuite.scala index e966dc8..f8ea858 100644 --- a/core/shared/src/test/scala/monix/newtypes/NewsubtypeCovariantKSuite.scala +++ b/core/shared/src/test/scala/monix/newtypes/NewsubtypeCovariantKSuite.scala @@ -19,10 +19,10 @@ package monix.newtypes import cats.implicits._ import cats.{Eq, Monad, Traverse} -import org.scalatest.funsuite.AnyFunSuite +import munit.FunSuite import monix.newtypes.TestUtils.illTyped -class NewsubtypeCovariantKSuite extends AnyFunSuite { +class NewsubtypeCovariantKSuite extends FunSuite { import NewsubtypeCovariantKSuite._ test("it compiles") { diff --git a/core/shared/src/test/scala/monix/newtypes/NewsubtypeKSuite.scala b/core/shared/src/test/scala/monix/newtypes/NewsubtypeKSuite.scala index 2a735b8..d41369d 100644 --- a/core/shared/src/test/scala/monix/newtypes/NewsubtypeKSuite.scala +++ b/core/shared/src/test/scala/monix/newtypes/NewsubtypeKSuite.scala @@ -19,10 +19,10 @@ package monix.newtypes import cats.implicits._ import cats.{Eq, Monad, Traverse} -import org.scalatest.funsuite.AnyFunSuite +import munit.FunSuite import monix.newtypes.TestUtils.illTyped -class NewsubtypeKSuite extends AnyFunSuite { +class NewsubtypeKSuite extends FunSuite { import NewsubtypeKSuite._ test("it compiles") { diff --git a/core/shared/src/test/scala/monix/newtypes/NewsubtypeValidatedSuite.scala b/core/shared/src/test/scala/monix/newtypes/NewsubtypeValidatedSuite.scala index ef83460..f738d30 100644 --- a/core/shared/src/test/scala/monix/newtypes/NewsubtypeValidatedSuite.scala +++ b/core/shared/src/test/scala/monix/newtypes/NewsubtypeValidatedSuite.scala @@ -17,23 +17,23 @@ package monix.newtypes -import org.scalatest.funsuite.AnyFunSuite +import munit.FunSuite import monix.newtypes.TestUtils.illTyped -class NewsubtypeValidatedSuite extends AnyFunSuite { +class NewsubtypeValidatedSuite extends FunSuite { import NewsubtypeValidatedSuite._ test("validation") { EmailAddress("noreply@alexn.org") match { case Right(ref @ EmailAddress(str)) => - assert(ref === EmailAddress.unsafe("noreply@alexn.org")) - assert(str === "noreply@alexn.org") + assertEquals(ref, EmailAddress.unsafe("noreply@alexn.org")) + assertEquals(str, "noreply@alexn.org") case other => fail(s"Unexpected match: $other") } EmailAddress("not a valid email") match { - case Left(BuildFailure(_, _)) => succeed + case Left(BuildFailure(_, _)) => () case other => fail(s"Unexpected value: $other") } } @@ -42,8 +42,8 @@ class NewsubtypeValidatedSuite extends AnyFunSuite { val ea1 = EmailAddress.unsafe("noreply@alexn.org") ea1 match { case ref @ EmailAddress(v) => - assert(ref === ea1) - assert(v === ea1) + assertEquals(ref, ea1) + assertEquals[Any, Any](v, ea1) } illTyped( diff --git a/core/shared/src/test/scala/monix/newtypes/NewsubtypeWrappedSuite.scala b/core/shared/src/test/scala/monix/newtypes/NewsubtypeWrappedSuite.scala index 904a439..629a2fe 100644 --- a/core/shared/src/test/scala/monix/newtypes/NewsubtypeWrappedSuite.scala +++ b/core/shared/src/test/scala/monix/newtypes/NewsubtypeWrappedSuite.scala @@ -18,10 +18,10 @@ package monix.newtypes import cats.Eq -import org.scalatest.funsuite.AnyFunSuite +import munit.FunSuite import monix.newtypes.TestUtils.illTyped -class NewsubtypeWrappedSuite extends AnyFunSuite { +class NewsubtypeWrappedSuite extends FunSuite { import NewsubtypeWrappedSuite._ test("it compiles") { @@ -49,8 +49,8 @@ class NewsubtypeWrappedSuite extends AnyFunSuite { val n = YourName("Alex") n match { case ref @ YourName(src) => - assert(ref === n) - assert(src === n.value) + assertEquals(ref, n) + assertEquals(src, n.value) } illTyped( diff --git a/core/shared/src/test/scala/monix/newtypes/NewtypeCovariantKSuite.scala b/core/shared/src/test/scala/monix/newtypes/NewtypeCovariantKSuite.scala index 286e7ad..6faebd2 100644 --- a/core/shared/src/test/scala/monix/newtypes/NewtypeCovariantKSuite.scala +++ b/core/shared/src/test/scala/monix/newtypes/NewtypeCovariantKSuite.scala @@ -19,10 +19,10 @@ package monix.newtypes import cats.implicits._ import cats.{Eq, Monad, Traverse} -import org.scalatest.funsuite.AnyFunSuite +import munit.FunSuite import monix.newtypes.TestUtils.illTyped -class NewtypeCovariantKSuite extends AnyFunSuite { +class NewtypeCovariantKSuite extends FunSuite { import NewtypeCovariantKSuite._ test("it compiles") { diff --git a/core/shared/src/test/scala/monix/newtypes/NewtypeKSuite.scala b/core/shared/src/test/scala/monix/newtypes/NewtypeKSuite.scala index 0d32ac3..42c8d02 100644 --- a/core/shared/src/test/scala/monix/newtypes/NewtypeKSuite.scala +++ b/core/shared/src/test/scala/monix/newtypes/NewtypeKSuite.scala @@ -19,10 +19,10 @@ package monix.newtypes import cats.implicits._ import cats.{Eq, Monad, Traverse} -import org.scalatest.funsuite.AnyFunSuite +import munit.FunSuite import monix.newtypes.TestUtils.illTyped -class NewtypeKSuite extends AnyFunSuite { +class NewtypeKSuite extends FunSuite { import NewtypeKSuite._ test("it compiles") { diff --git a/core/shared/src/test/scala/monix/newtypes/NewtypeSuite.scala b/core/shared/src/test/scala/monix/newtypes/NewtypeSuite.scala index acb0a6e..2dba211 100644 --- a/core/shared/src/test/scala/monix/newtypes/NewtypeSuite.scala +++ b/core/shared/src/test/scala/monix/newtypes/NewtypeSuite.scala @@ -18,10 +18,10 @@ package monix.newtypes import cats.Eq -import org.scalatest.funsuite.AnyFunSuite +import munit.FunSuite import monix.newtypes.TestUtils.illTyped -class NewtypeSuite extends AnyFunSuite { +class NewtypeSuite extends FunSuite { import NewtypeSuite._ test("it compiles") { diff --git a/core/shared/src/test/scala/monix/newtypes/NewtypeValidatedSuite.scala b/core/shared/src/test/scala/monix/newtypes/NewtypeValidatedSuite.scala index 8602202..0480956 100644 --- a/core/shared/src/test/scala/monix/newtypes/NewtypeValidatedSuite.scala +++ b/core/shared/src/test/scala/monix/newtypes/NewtypeValidatedSuite.scala @@ -17,22 +17,22 @@ package monix.newtypes -import org.scalatest.funsuite.AnyFunSuite +import munit.FunSuite import monix.newtypes.TestUtils.illTyped -class NewtypeValidatedSuite extends AnyFunSuite { +class NewtypeValidatedSuite extends FunSuite { import NewtypeValidatedSuite._ test("validation") { EmailAddress("noreply@alexn.org") match { case Right(ref @ EmailAddress(str)) => - assert(ref === EmailAddress.unsafe("noreply@alexn.org")) - assert(str === "noreply@alexn.org") + assertEquals(ref, EmailAddress.unsafe("noreply@alexn.org")) + assertEquals(str, "noreply@alexn.org") case other => fail(s"Unexpected match: $other") } EmailAddress("not a valid email") match { - case Left(BuildFailure(_, _)) => succeed + case Left(BuildFailure(_, _)) => () case other => fail(s"Unexpected value: $other") } } @@ -41,8 +41,8 @@ class NewtypeValidatedSuite extends AnyFunSuite { val ea1 = EmailAddress.unsafe("noreply@alexn.org") ea1 match { case ref @ EmailAddress(v) => - assert(ref === ea1) - assert(v === ea1) + assertEquals(ref, ea1) + assertEquals[Any, Any](v, ea1) } illTyped( diff --git a/core/shared/src/test/scala/monix/newtypes/NewtypeWrappedSuite.scala b/core/shared/src/test/scala/monix/newtypes/NewtypeWrappedSuite.scala index 398c09e..9f4620d 100644 --- a/core/shared/src/test/scala/monix/newtypes/NewtypeWrappedSuite.scala +++ b/core/shared/src/test/scala/monix/newtypes/NewtypeWrappedSuite.scala @@ -18,10 +18,10 @@ package monix.newtypes import cats.Eq -import org.scalatest.funsuite.AnyFunSuite +import munit.FunSuite import monix.newtypes.TestUtils.illTyped -class NewtypeWrappedSuite extends AnyFunSuite { +class NewtypeWrappedSuite extends FunSuite { import NewtypeWrappedSuite._ test("it compiles") { @@ -50,8 +50,8 @@ class NewtypeWrappedSuite extends AnyFunSuite { val n = MyName("Alex") n match { case ref @ MyName(src) => - assert(ref === n) - assert(src === n.value) + assertEquals(ref, n) + assertEquals(src, n.value) } illTyped( diff --git a/core/shared/src/test/scala/monix/newtypes/TypeInfoSuite.scala b/core/shared/src/test/scala/monix/newtypes/TypeInfoSuite.scala index 0c2a2dc..f97c835 100644 --- a/core/shared/src/test/scala/monix/newtypes/TypeInfoSuite.scala +++ b/core/shared/src/test/scala/monix/newtypes/TypeInfoSuite.scala @@ -17,9 +17,9 @@ package monix.newtypes -import org.scalatest.funsuite.AnyFunSuite +import munit.FunSuite -class TypeInfoSuite extends AnyFunSuite { +class TypeInfoSuite extends FunSuite { def x = 1 class Foo { def foo = x } diff --git a/integration-circe/all/shared/src/test/scala/monix/newtypes/integrations/NewsubtypeCirceCodecSuite.scala b/integration-circe/all/shared/src/test/scala/monix/newtypes/integrations/NewsubtypeCirceCodecSuite.scala index 225d7c2..a36f483 100644 --- a/integration-circe/all/shared/src/test/scala/monix/newtypes/integrations/NewsubtypeCirceCodecSuite.scala +++ b/integration-circe/all/shared/src/test/scala/monix/newtypes/integrations/NewsubtypeCirceCodecSuite.scala @@ -21,9 +21,9 @@ package integrations import io.circe.{ Encoder, Decoder } import io.circe.syntax._ import io.circe.parser -import org.scalatest.funsuite.AnyFunSuite +import munit.FunSuite -class NewsubtypeCirceCodecSuite extends AnyFunSuite { +class NewsubtypeCirceCodecSuite extends FunSuite { import NewsubtypeCirceCodecSuite._ test("NewsubtypeWrapped[String] with DerivedCirceEncoder") { diff --git a/integration-circe/all/shared/src/test/scala/monix/newtypes/integrations/NewtypeCirceCodecSuite.scala b/integration-circe/all/shared/src/test/scala/monix/newtypes/integrations/NewtypeCirceCodecSuite.scala index 37c9f7d..0464b7e 100644 --- a/integration-circe/all/shared/src/test/scala/monix/newtypes/integrations/NewtypeCirceCodecSuite.scala +++ b/integration-circe/all/shared/src/test/scala/monix/newtypes/integrations/NewtypeCirceCodecSuite.scala @@ -20,9 +20,9 @@ package integrations import io.circe.syntax._ import io.circe.parser -import org.scalatest.funsuite.AnyFunSuite +import munit.FunSuite -class NewtypeCirceCodecSuite extends AnyFunSuite { +class NewtypeCirceCodecSuite extends FunSuite { import NewtypeCirceCodecSuite._ test("NewtypeWrapped has JSON codec") { diff --git a/integration-circe/all/shared/src/test/scala/monix/newtypes/integrations/NewtypeKCirceCodecSuite.scala b/integration-circe/all/shared/src/test/scala/monix/newtypes/integrations/NewtypeKCirceCodecSuite.scala index 0f65655..1e20819 100644 --- a/integration-circe/all/shared/src/test/scala/monix/newtypes/integrations/NewtypeKCirceCodecSuite.scala +++ b/integration-circe/all/shared/src/test/scala/monix/newtypes/integrations/NewtypeKCirceCodecSuite.scala @@ -18,12 +18,12 @@ package monix.newtypes package integrations -import org.scalatest.funsuite.AnyFunSuite +import munit.FunSuite import io.circe.{ Encoder, Decoder } import io.circe.parser.parse import io.circe.syntax._ -class NewtypeKCirceEncoderSuite extends AnyFunSuite { +class NewtypeKCirceEncoderSuite extends FunSuite { import NewtypeKCirceCodecSuite._ test("NewtypeK with DerivedCirceEncoder") { diff --git a/integration-pureconfig/all/shared/src/test/scala/monix/newtypes/integrations/NewsubtypeCirceCodecSuite.scala b/integration-pureconfig/all/shared/src/test/scala/monix/newtypes/integrations/NewsubtypeCirceCodecSuite.scala index fd84f3b..2ce6cee 100644 --- a/integration-pureconfig/all/shared/src/test/scala/monix/newtypes/integrations/NewsubtypeCirceCodecSuite.scala +++ b/integration-pureconfig/all/shared/src/test/scala/monix/newtypes/integrations/NewsubtypeCirceCodecSuite.scala @@ -18,9 +18,9 @@ package monix.newtypes package integrations -import org.scalatest.funsuite.AnyFunSuite +import munit.FunSuite -class NewsubtypePureConfigCodecSuite extends AnyFunSuite { +class NewsubtypePureConfigCodecSuite extends FunSuite { import NewsubtypeCirceCodecSuite._ test("NewsubtypeWrapped has JSON codec") { diff --git a/integration-pureconfig/all/shared/src/test/scala/monix/newtypes/integrations/NewtypeCirceCodecSuite.scala b/integration-pureconfig/all/shared/src/test/scala/monix/newtypes/integrations/NewtypeCirceCodecSuite.scala index c32a870..cece950 100644 --- a/integration-pureconfig/all/shared/src/test/scala/monix/newtypes/integrations/NewtypeCirceCodecSuite.scala +++ b/integration-pureconfig/all/shared/src/test/scala/monix/newtypes/integrations/NewtypeCirceCodecSuite.scala @@ -18,9 +18,9 @@ package monix.newtypes package integrations -import org.scalatest.funsuite.AnyFunSuite +import munit.FunSuite -class NewtypePureConfigCodecSuite extends AnyFunSuite { +class NewtypePureConfigCodecSuite extends FunSuite { import NewtypeCirceCodecSuite._ test("NewtypeWrapped has JSON codec") { diff --git a/integration-pureconfig/all/shared/src/test/scala/monix/newtypes/integrations/NewtypeKCirceCodecSuite.scala b/integration-pureconfig/all/shared/src/test/scala/monix/newtypes/integrations/NewtypeKCirceCodecSuite.scala index 0e8b94c..7017b75 100644 --- a/integration-pureconfig/all/shared/src/test/scala/monix/newtypes/integrations/NewtypeKCirceCodecSuite.scala +++ b/integration-pureconfig/all/shared/src/test/scala/monix/newtypes/integrations/NewtypeKCirceCodecSuite.scala @@ -18,9 +18,9 @@ package monix.newtypes package integrations -import org.scalatest.funsuite.AnyFunSuite +import munit.FunSuite -class NewtypeKCirceEncoderSuite extends AnyFunSuite { +class NewtypeKCirceEncoderSuite extends FunSuite { import NewtypeKCirceCodecSuite._ test("NewtypeK with DerivedPureConfigConvert") { From ec03271b7699c2101c6c92d8ea2d00ba5d2dd096 Mon Sep 17 00:00:00 2001 From: Alexandru Nedelcu Date: Tue, 5 May 2026 12:17:12 +0300 Subject: [PATCH 2/4] Fix --- build.sbt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/build.sbt b/build.sbt index f3fc82f..40bf780 100644 --- a/build.sbt +++ b/build.sbt @@ -22,8 +22,8 @@ val Shapeless2xVersion = "2.3.12" val Shapeless3xVersion = "3.4.1" def munitTestDependency = Def.setting { - ("org.scalameta" %%% "munit" % MUnitVersion % Test) - .exclude("org.scala-native", s"test-interface_native0.5_${scalaBinaryVersion.value}") + "org.scalameta" %%% "munit" % MUnitVersion % Test + // .exclude("org.scala-native", s"test-interface_native0.5_${scalaBinaryVersion.value}") } // --------------------------------------------------------------------------- @@ -34,8 +34,8 @@ addCommandAlias("ci-test", ";clean;Test/compile;test;mimaReportBinaryIssues; addCommandAlias("ci-doc", s";project root ;++$Scala3! ;clean ;unidoc") addCommandAlias("ci", ";project root ;reload ;+ci-test ;ci-doc") addCommandAlias("ci-release", ";+publishSigned ;sonatypeBundleRelease") -addCommandAlias( - "ci-publish-local", +addCommandAlias( + "ci-publish-local", "+publishLocalSigned" ) @@ -75,6 +75,10 @@ lazy val sharedSettings = Seq( // https://www.scala-lang.org/blog/2021/02/16/preventing-version-conflicts-with-versionscheme.html versionScheme := Some("early-semver"), + libraryDependencySchemes ++= Seq( + "org.scala-native" % "test-interface_native0.5_3" % "early-semver" + ), + // Turning off fatal warnings for doc generation Compile / doc / tpolecatExcludeOptions ++= ScalacOptions.defaultConsoleExclude, From e6c44c0d09c9ea4a70b0da7d09e460a9c83aae44 Mon Sep 17 00:00:00 2001 From: Alexandru Nedelcu Date: Tue, 5 May 2026 12:19:23 +0300 Subject: [PATCH 3/4] Commit --- build.sbt | 1 - 1 file changed, 1 deletion(-) diff --git a/build.sbt b/build.sbt index 40bf780..14bdf01 100644 --- a/build.sbt +++ b/build.sbt @@ -23,7 +23,6 @@ val Shapeless3xVersion = "3.4.1" def munitTestDependency = Def.setting { "org.scalameta" %%% "munit" % MUnitVersion % Test - // .exclude("org.scala-native", s"test-interface_native0.5_${scalaBinaryVersion.value}") } // --------------------------------------------------------------------------- From 228ccb4ac95b00c315da1f9e693907338a87f75c Mon Sep 17 00:00:00 2001 From: Alexandru Nedelcu Date: Tue, 5 May 2026 12:23:58 +0300 Subject: [PATCH 4/4] Fix --- build.sbt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 14bdf01..71778d7 100644 --- a/build.sbt +++ b/build.sbt @@ -75,7 +75,9 @@ lazy val sharedSettings = Seq( versionScheme := Some("early-semver"), libraryDependencySchemes ++= Seq( - "org.scala-native" % "test-interface_native0.5_3" % "early-semver" + "org.scala-native" % "test-interface_native0.5_3" % "early-semver", + "org.scala-native" % "test-interface_native0.5_2.13" % "early-semver", + "org.scala-native" % "test-interface_native0.5_2.12" % "early-semver", ), // Turning off fatal warnings for doc generation