Skip to content

Commit

Permalink
Close #328 - Remove unused libraries for testing code using cats-effect3
Browse files Browse the repository at this point in the history
  • Loading branch information
kevin-lee committed Dec 12, 2021
1 parent 86f1c30 commit 4c55e2d
Show file tree
Hide file tree
Showing 20 changed files with 108 additions and 42 deletions.
11 changes: 7 additions & 4 deletions .scalafmt.conf
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
version = 3.0.6
version = 3.2.1
runner.dialect = scala3

align.preset=most
align.preset=more
align.arrowEnumeratorGenerator=true

maxColumn=120
assumeStandardLibraryStripMargin=true
align.stripMargin=true
assumeStandardLibraryStripMargin=false

continuationIndent.callSite=2
continuationIndent.defnSite=2

align.stripMargin=true
align.multiline=true
align.openParenCallSite=false
align.openParenDefnSite=false

Expand Down
26 changes: 13 additions & 13 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -53,20 +53,20 @@ lazy val core = projectCommonSettings("core", ProjectName("core"), file("core"))

lazy val testing4Cats = projectCommonSettings("test4cats", ProjectName("test4cats"), file("test4cats"))
.settings(
description := "Effect's test utils for Cats",
libraryDependencies :=
description := "Effect's test utils for Cats",
libraryDependencies :=
libraryDependencies.value ++ List(
libs.libCatsCore(props.catsLatestVersion),
) ++ libs.hedgehogLibs,
libraryDependencies := libraryDependenciesPostProcess(isScala3(scalaVersion.value), libraryDependencies.value),
libraryDependencies := libraryDependenciesPostProcess(isScala3(scalaVersion.value), libraryDependencies.value),
console / initialCommands :=
"""import effectie.testing.cats._""",
)

lazy val catsEffect = projectCommonSettings("catsEffect", ProjectName("cats-effect"), file("cats-effect"))
.settings(
description := "Effect Utils - Cats Effect",
libraryDependencies :=
description := "Effect Utils - Cats Effect",
libraryDependencies :=
(SemVer.parseUnsafe(scalaVersion.value) match {
case SemVer(Major(2), Minor(11), _, _, _) =>
libraryDependencies.value ++ Seq(libs.libCatsCore_2_0_0, libs.libCatsEffect_2_0_0)
Expand All @@ -87,7 +87,7 @@ lazy val catsEffect = projectCommonSettings("catsEffect", ProjectName("cats-effe
libs.libCatsEffect(props.catsEffect2LatestVersion)
)
}),
libraryDependencies := libraryDependenciesPostProcess(isScala3(scalaVersion.value), libraryDependencies.value),
libraryDependencies := libraryDependenciesPostProcess(isScala3(scalaVersion.value), libraryDependencies.value),
console / initialCommands :=
"""import effectie.cats._""",
)
Expand All @@ -98,13 +98,13 @@ lazy val catsEffect = projectCommonSettings("catsEffect", ProjectName("cats-effe

lazy val catsEffect3 = projectCommonSettings("catsEffect3", ProjectName("cats-effect3"), file("cats-effect3"))
.settings(
description := "Effect Utils - Cats Effect 3",
description := "Effect Utils - Cats Effect 3",
libraryDependencies ++= List(
libs.libCatsCore(props.catsLatestVersion),
libs.libCatsEffect(props.catsEffect3Version),
libs.libCatsEffectTestKit % Test
libs.libCatsEffectTestKit % Test excludeAll ("org.scalacheck")
),
libraryDependencies := libraryDependenciesPostProcess(isScala3(scalaVersion.value), libraryDependencies.value),
libraryDependencies := libraryDependenciesPostProcess(isScala3(scalaVersion.value), libraryDependencies.value),
console / initialCommands :=
"""import effectie.cats._""",
)
Expand All @@ -115,8 +115,8 @@ lazy val catsEffect3 = projectCommonSettings("catsEffect3", ProjectName("cats-ef

lazy val monix = projectCommonSettings("monix", ProjectName("monix"), file(s"${props.RepoName}-monix"))
.settings(
description := "Effect Utils - Monix",
libraryDependencies :=
description := "Effect Utils - Monix",
libraryDependencies :=
crossVersionProps(
List.empty,
SemVer.parseUnsafe(scalaVersion.value),
Expand All @@ -126,7 +126,7 @@ lazy val monix = projectCommonSettings("monix", ProjectName("monix"), file(s"${p
case x =>
libraryDependencies.value ++ List(libs.libMonix)
},
libraryDependencies := libraryDependenciesPostProcess(isScala3(scalaVersion.value), libraryDependencies.value),
libraryDependencies := libraryDependenciesPostProcess(isScala3(scalaVersion.value), libraryDependencies.value),
console / initialCommands :=
"""import effectie.monix._""",
)
Expand Down Expand Up @@ -240,7 +240,7 @@ lazy val libs =

def libCatsEffect(catsEffectVersion: String): ModuleID = "org.typelevel" %% "cats-effect" % catsEffectVersion

lazy val libCatsEffectTestKit = "org.typelevel" %% "cats-effect-testkit" % props.catsEffect3Version
lazy val libCatsEffectTestKit = "org.typelevel" %% "cats-effect-kernel-testkit" % props.catsEffect3Version

lazy val libCatsCore_2_0_0: ModuleID = "org.typelevel" %% "cats-core" % props.cats2_0_0Version
lazy val libCatsEffect_2_0_0: ModuleID = "org.typelevel" %% "cats-effect" % props.catsEffect2_0_0Version
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package effectie.cats
import cats._
import cats.data.EitherT
import cats.effect._
import cats.effect.testkit.TestContext
import cats.effect.unsafe.IORuntime
import cats.instances.all._
import cats.syntax.all._
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package effectie.cats
import cats._
import cats.data.EitherT
import cats.effect.IO
import cats.effect.testkit.TestContext
import cats.effect.unsafe.IORuntime
import cats.instances.all._
import cats.syntax.all._
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package effectie.cats
import cats._
import cats.data.EitherT
import cats.effect.IO
import cats.effect.testkit.TestContext
import cats.effect.unsafe.IORuntime
import cats.instances.all._
import cats.syntax.all._
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import Catching._
import cats._
import cats.data.EitherT
import cats.effect._
import cats.effect.testkit.TestContext
import cats.effect.unsafe.IORuntime
import cats.instances.all._
import cats.syntax.all._
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package effectie.cats

import cats.Id
import cats.effect.IO
import cats.effect.testkit.TestContext
import cats.effect.unsafe.IORuntime
import effectie.ConcurrentSupport
import effectie.cats.compat.CatsEffectIoCompatForFuture
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package effectie.cats

import cats.Id
import cats.effect._
import cats.effect.testkit.TestContext
import effectie.ConcurrentSupport
import effectie.testing.tools
import effectie.testing.types.SomeThrowableError
Expand Down
1 change: 0 additions & 1 deletion cats-effect3/src/test/scala-2/effectie/cats/FxSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package effectie.cats

import cats.data.EitherT
import cats.effect._
import cats.effect.testkit.TestContext
import cats.effect.unsafe.IORuntime
import cats.syntax.either.catsSyntaxEitherId
import cats.{Eq, Functor, Id, Monad}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package effectie.cats

import cats._
import cats.effect._
import cats.effect.testkit.TestContext
import effectie.ConcurrentSupport
import hedgehog._
import hedgehog.runner._
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package effectie.cats
import cats.*
import cats.data.EitherT
import cats.effect.*
import cats.effect.testkit.TestContext
import effectie.cats.CatsEffectRunner.TestContext
import cats.effect.unsafe.IORuntime
import cats.instances.all.*
import cats.syntax.all.*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package effectie.cats
import cats.*
import cats.data.EitherT
import cats.effect.IO
import cats.effect.testkit.TestContext
import effectie.cats.CatsEffectRunner.TestContext
import cats.effect.unsafe.IORuntime
import cats.instances.all.*
import cats.syntax.all.*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package effectie.cats
import cats.*
import cats.data.EitherT
import cats.effect.IO
import cats.effect.testkit.TestContext
import effectie.cats.CatsEffectRunner.TestContext
import cats.effect.unsafe.IORuntime
import cats.instances.all.*
import cats.syntax.all.*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import Catching.*
import cats.*
import cats.data.EitherT
import cats.effect.*
import cats.effect.testkit.TestContext
import effectie.cats.CatsEffectRunner.TestContext
import cats.effect.unsafe.IORuntime
import cats.instances.all.*
import cats.syntax.all.*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package effectie.cats

import cats.Id
import cats.effect.IO
import cats.effect.testkit.TestContext
import effectie.cats.CatsEffectRunner.TestContext
import cats.effect.unsafe.IORuntime
import effectie.cats.compat.CatsEffectIoCompatForFuture
import effectie.testing.tools.*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package effectie.cats

import cats.Id
import cats.effect.*
import cats.effect.testkit.TestContext
import effectie.cats.CatsEffectRunner.TestContext
import cats.effect.unsafe.IORuntime
import effectie.{ConcurrentSupport, FxCtor}
import effectie.cats.compat.CatsEffectIoCompatForFuture
Expand Down
2 changes: 1 addition & 1 deletion cats-effect3/src/test/scala-3/effectie/cats/FxSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package effectie.cats

import cats.data.EitherT
import cats.effect.*
import cats.effect.testkit.TestContext
import effectie.cats.CatsEffectRunner.TestContext
import cats.effect.unsafe.IORuntime
import cats.instances.either.*
import cats.syntax.all.*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package effectie.cats

import cats.*
import cats.effect.*
import cats.effect.testkit.TestContext
import effectie.cats.CatsEffectRunner.TestContext
import cats.effect.unsafe.IORuntime
import effectie.ConcurrentSupport
import effectie.cats.compat.CatsEffectIoCompatForFuture
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import cats.{Functor, Id}
import cats.data.EitherT
import cats.syntax.all.*
import cats.effect.IO
import cats.effect.testkit.TestContext
import effectie.cats.CatsEffectRunner.TestContext
import cats.effect.unsafe.IORuntime
import effectie.{ConcurrentSupport, Fx, SomeControlThrowable}
import effectie.cats.{CanCatch, FxCtor, testing}
Expand Down
87 changes: 79 additions & 8 deletions cats-effect3/src/test/scala/effectie/cats/CatsEffectRunner.scala
Original file line number Diff line number Diff line change
@@ -1,16 +1,87 @@
package effectie.cats

import cats.effect.testkit.TestInstances
import cats.effect.{IO, Outcome, SyncIO, unsafe}
import cats.syntax.all._
import cats.{Eq, Show}
import cats.effect.{IO, Outcome, SyncIO}
import hedgehog._
import cats.{Eq, Id, Order, Show, ~>}
import effectie.testing.tools._
import hedgehog._

import scala.concurrent.ExecutionContext
import scala.concurrent.duration._

/** @author Kevin Lee
/** The code inside CatsEffectRunner was not entirely but mostly copied from
* https://git.io/JDcCP and was modified for Hedgehog
*
* @author Kevin Lee
* @since 2021-08-05
*/
object CatsEffectRunner extends TestInstances {
object CatsEffectRunner {

type TestContext = cats.effect.kernel.testkit.TestContext
val TestContext = cats.effect.kernel.testkit.TestContext

final case class Ticker(ctx: TestContext = TestContext())

implicit lazy val eqThrowable: Eq[Throwable] =
Eq.fromUniversalEquals[Throwable]

implicit lazy val showThrowable: Show[Throwable] =
Show.fromToString[Throwable]

implicit lazy val eqExecutionContext: Eq[ExecutionContext] =
Eq.fromUniversalEquals[ExecutionContext]

implicit def orderIoFiniteDuration(implicit ticker: Ticker): Order[IO[FiniteDuration]] =
Order by { ioa => unsafeRun(ioa).fold(None, _ => None, fa => fa) }

implicit def eqIOA[A: Eq](implicit ticker: Ticker): Eq[IO[A]] =
Eq.by(unsafeRun(_))

private val someK: Id ~> Option =
new ~>[Id, Option] { def apply[A](a: A) = a.some }

def unsafeRun[A](ioa: IO[A])(implicit ticker: Ticker): Outcome[Option, Throwable, A] =
try {
var results: Outcome[Option, Throwable, A] = Outcome.Succeeded(None)

ioa
.flatMap(IO.pure(_))
.handleErrorWith(IO.raiseError(_))
.unsafeRunAsyncOutcome { oc => results = oc.mapK(someK) }(
unsafe
.IORuntime(ticker.ctx, ticker.ctx, scheduler, () => (), unsafe.IORuntimeConfig())
)

ticker.ctx.tickAll(1.second)

results
} catch {
case t: Throwable =>
t.printStackTrace()
throw t
}

def unsafeRunSync[A](ioa: SyncIO[A]): Outcome[Id, Throwable, A] =
try Outcome.succeeded[Id, Throwable, A](ioa.unsafeRunSync())
catch {
case t: Throwable => Outcome.errored(t)
}

implicit def materializeRuntime(implicit ticker: Ticker): unsafe.IORuntime =
unsafe.IORuntime(ticker.ctx, ticker.ctx, scheduler, () => (), unsafe.IORuntimeConfig())

def scheduler(implicit ticker: Ticker): unsafe.Scheduler =
new unsafe.Scheduler {
import ticker.ctx

def sleep(delay: FiniteDuration, action: Runnable): Runnable = {
val cancel = ctx.schedule(delay, action)
() => cancel()
}

def nowMillis(): Long = ctx.now().toMillis
def monotonicNanos(): Long = ctx.now().toNanos
}

implicit final class IoOps[A](private val ioa: IO[A]) extends AnyVal {

Expand All @@ -33,7 +104,7 @@ object CatsEffectRunner extends TestInstances {
}

def completeAs(expected: A)(implicit ticker: Ticker, eq: Eq[A], sh: Show[A]): Result =
tickToResult(Outcome.Succeeded(Some(expected)))
tickToResult(Outcome.Succeeded(expected.some))

def completeAndEqualTo(expected: A)(implicit ticker: Ticker, eq: Eq[A], sh: Show[A]): Boolean =
tickTo(Outcome.Succeeded(Some(expected)))
Expand Down Expand Up @@ -61,7 +132,7 @@ object CatsEffectRunner extends TestInstances {
val a = ioa.unsafeRunSync()
Result.assert(a eqv expected).log(s"${a.show} !== ${expected.show}")
}
def completeAsEqualToSync(expected: A)(implicit eq: Eq[A]): Boolean = {
def completeAsEqualToSync(expected: A)(implicit eq: Eq[A]): Boolean = {
val a = ioa.unsafeRunSync()
a eqv expected
}
Expand Down

0 comments on commit 4c55e2d

Please sign in to comment.