Skip to content

Commit c8b2567

Browse files
committed
Initial commit
0 parents  commit c8b2567

14 files changed

+180
-0
lines changed

.gitignore

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Project exclude paths
2+
/project/target/
3+
/target/
4+
/target/scala-2.13/classes/
5+
/target/scala-2.13/test-classes/
6+
/.bsp
7+
/.idea
8+
# Project exclude paths
9+
/project/project/target/

build.sbt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
ThisBuild / scalaVersion := "2.13.10"
2+
ThisBuild / version := "0.1.0-SNAPSHOT"
3+
ThisBuild / organization := "com.example"
4+
ThisBuild / organizationName := "example"
5+
6+
lazy val root = (project in file("."))
7+
.settings(
8+
name := "scala-zio-test-aspects-property-based-testing-workshop",
9+
libraryDependencies ++= Seq(
10+
"dev.zio" %% "zio" % "2.0.2",
11+
"com.beachape" %% "enumeratum" % "1.7.0",
12+
"eu.timepit" %% "refined" % "0.10.1",
13+
"dev.zio" %% "zio-test-magnolia" % "2.0.2" % Test,
14+
"dev.zio" %% "zio-test" % "2.0.2" % Test
15+
),
16+
testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework")
17+
)

project/build.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
sbt.version = 1.7.2

src/main/scala/Main.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import zio._
2+
import zio.Console.printLine
3+
4+
object Main extends ZIOAppDefault {
5+
override def run: ZIO[Environment with ZIOAppArgs with Scope, Any, Any] =
6+
printLine("Welcome to your first ZIO app!")
7+
}

src/main/scala/app/Account.scala

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package app
2+
3+
import enumeratum.{Enum, EnumEntry}
4+
import eu.timepit.refined.types.string.NonEmptyString
5+
6+
import java.util.UUID
7+
case class Account(id: AccountId,
8+
status: AccountStatus,
9+
description: NonEmptyString)
10+
11+
case class AccountCreated(id: AccountId)

src/main/scala/app/AccountId.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package app
2+
3+
import java.util.UUID
4+
5+
case class AccountId(uuid: UUID)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package app
2+
3+
import zio.{Task, ZIO}
4+
5+
object AccountService {
6+
def createAccount(account: Account): Task[AccountCreated] = ZIO.succeed(AccountCreated(account.id))
7+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package app
2+
3+
import enumeratum._
4+
5+
sealed trait AccountStatus extends EnumEntry
6+
7+
object AccountStatus extends Enum[AccountStatus] {
8+
9+
case object AccountLocked extends AccountStatus
10+
11+
case object AccountUnlocked extends AccountStatus
12+
13+
override def values: IndexedSeq[AccountStatus] = findValues
14+
}

src/test/scala/app/RandomTest.scala

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package app
2+
3+
import core.MainSpec
4+
import generators.AccountGenerators.genAccount
5+
import zio.Scope
6+
import zio.test.Assertion.equalTo
7+
import zio.test._
8+
9+
object RandomTest extends MainSpec {
10+
11+
override def spec: Spec[TestEnvironment with Scope, Any] = suite("suite")(
12+
test("test1") {
13+
for {
14+
_ <- zio.Console.printLine("")
15+
} yield assertTrue(1 == 1)
16+
},
17+
test("test2") {
18+
for {
19+
_ <- zio.Console.printLine("")
20+
} yield assertTrue(2 == 1)
21+
},
22+
test("gen") {
23+
check(genAccount) { account =>
24+
assertZIO(AccountService.createAccount(account))(equalTo(AccountCreated(account.id)))
25+
}
26+
}
27+
)
28+
}

src/test/scala/app/RandomTest2.scala

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package app
2+
3+
import core.MainSpec
4+
import generators.AccountGenerators.genAccount
5+
import zio.Scope
6+
import zio.test.Assertion.equalTo
7+
import zio.test._
8+
9+
object RandomTest2 extends MainSpec {
10+
11+
override def spec: Spec[TestEnvironment with Scope, Any] = suite("suite")(
12+
test("test1") {
13+
for {
14+
_ <- zio.Console.printLine("")
15+
} yield assertTrue(1 == 1)
16+
},
17+
test("test2") {
18+
for {
19+
_ <- zio.Console.printLine("")
20+
} yield assertTrue(2 == 1)
21+
},
22+
test("gen") {
23+
check(genAccount) { account =>
24+
assertZIO(AccountService.createAccount(account))(equalTo(AccountCreated(account.id)))
25+
}
26+
}
27+
)
28+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package core
2+
3+
import zio.test.{TestAspect, TestAspectAtLeastR, TestEnvironment, TestFailure, TestRandom, TestSuccess}
4+
import zio.{Trace, ZIO}
5+
6+
7+
object CustomTestAspects {
8+
def printSeedIfFailure: TestAspectAtLeastR[TestEnvironment] =
9+
new TestAspect.PerTest.AtLeastR[TestEnvironment] {
10+
override def perTest[R >: Nothing <: TestEnvironment, E >: Nothing <: Any]
11+
(test: ZIO[R, TestFailure[E], TestSuccess])(implicit trace: Trace): ZIO[R, TestFailure[E], TestSuccess] = for {
12+
seed <- TestRandom.getSeed
13+
result <- test.tapError(_ => zio.Console.printLine(s"Test failed when using seed = $seed").orDie)
14+
} yield result
15+
}
16+
17+
def setSeedBeforeEach(seed: Long): TestAspect[Nothing, Any, Nothing, Any] =
18+
TestAspect.before(TestRandom.setSeed(seed))
19+
}

src/test/scala/core/MainSpec.scala

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package core
2+
3+
import zio.Chunk
4+
import zio.test.{TestAspectAtLeastR, TestEnvironment, ZIOSpecDefault}
5+
6+
abstract class MainSpec extends ZIOSpecDefault {
7+
override def aspects: Chunk[TestAspectAtLeastR[TestEnvironment]] = Chunk(
8+
CustomTestAspects.printSeedIfFailure,
9+
CustomTestAspects.setSeedBeforeEach(scala.util.Random.nextLong())
10+
)
11+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package generators
2+
3+
import app.Account
4+
import zio.test.Gen
5+
import zio.test.magnolia.DeriveGen
6+
import RefinedTypesGenerators._
7+
8+
object AccountGenerators {
9+
val genAccount: Gen[Any, Account] = DeriveGen[Account]
10+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package generators
2+
3+
import eu.timepit.refined.types.string.NonEmptyString
4+
import zio.test.Gen
5+
import zio.test.magnolia.DeriveGen
6+
7+
object RefinedTypesGenerators {
8+
9+
val genNonEmptyString: Gen[Any, NonEmptyString] = Gen.stringBounded(1, 10)(Gen.char)
10+
.map(NonEmptyString.unsafeFrom)
11+
implicit val deriveGenNonEmptyString = DeriveGen.instance(genNonEmptyString)
12+
13+
}

0 commit comments

Comments
 (0)