Skip to content
This repository has been archived by the owner on Jan 13, 2025. It is now read-only.

Commit

Permalink
PoC: mocks without new objects and methods
Browse files Browse the repository at this point in the history
  • Loading branch information
senia-psm committed Mar 17, 2022
1 parent 9a02f85 commit 58be95a
Show file tree
Hide file tree
Showing 15 changed files with 226 additions and 150 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package zio.mock

import zio.ZIO
import zio.mock.Capability.Signature
import zio.mock.internal.{InvalidCall, MockException}
import zio.mock.module.{PureModule, PureModuleMock}
import zio.test.{Assertion, Spec, TestFailure, TestSuccess}
Expand Down Expand Up @@ -41,13 +42,13 @@ object AdvancedEffectMockSpec extends ZIOBaseSpec with MockSpecUtils[PureModule]
}

def hasUnexpectedCall[I, E, A](capability: Capability[PureModule, I, E, A], args: I): Assertion[Throwable] =
isSubtype[UnexpectedCallException[PureModule, I, E, A]](
hasField[UnexpectedCallException[PureModule, I, E, A], Capability[PureModule, I, E, A]](
isSubtype[UnexpectedCallException](
hasField[UnexpectedCallException, Signature](
"capability",
_.capability,
equalTo(capability)
equalTo(capability.signature)
) &&
hasField[UnexpectedCallException[PureModule, I, E, A], Any]("args", _.args, equalTo(args))
hasField[UnexpectedCallException, Any]("args", _.args, equalTo(args))
)

def hasUnsatisfiedExpectations: Assertion[Throwable] =
Expand All @@ -58,9 +59,21 @@ object AdvancedEffectMockSpec extends ZIOBaseSpec with MockSpecUtils[PureModule]
suite("A and B")(
testValue("A->B passes")(A && B, a *> b, equalTo("B")),
testValue("B->A passes")(A && B, b *> a, equalTo("A")),
testDied("A->A->B fails")(A && B, a *> a *> b, hasFailedMatches(InvalidCapability(cmdA, cmdB, equalTo(2)))),
testDied("B->B->A fails")(A && B, b *> b *> a, hasFailedMatches(InvalidCapability(cmdB, cmdA, equalTo(1)))),
testDied("A->C->B fails")(A && B, b *> c *> b, hasFailedMatches(InvalidCapability(cmdC, cmdA, equalTo(1))))
testDied("A->A->B fails")(
A && B,
a *> a *> b,
hasFailedMatches(InvalidCapability(cmdA.signature, cmdB, equalTo(2)))
),
testDied("B->B->A fails")(
A && B,
b *> b *> a,
hasFailedMatches(InvalidCapability(cmdB.signature, cmdA, equalTo(1)))
),
testDied("A->C->B fails")(
A && B,
b *> c *> b,
hasFailedMatches(InvalidCapability(cmdC.signature, cmdA, equalTo(1)))
)
),
suite("A and B and C")(
testValue("A->B->C passes")(A && B && C, a *> b *> c, equalTo("C")),
Expand All @@ -72,39 +85,46 @@ object AdvancedEffectMockSpec extends ZIOBaseSpec with MockSpecUtils[PureModule]
),
suite("A andThen B")(
testValue("A->B passes")(A ++ B, a *> b, equalTo("B")),
testDied("B->A fails")(A ++ B, b *> a, hasFailedMatches(InvalidCapability(cmdB, cmdA, equalTo(1))))
testDied("B->A fails")(A ++ B, b *> a, hasFailedMatches(InvalidCapability(cmdB.signature, cmdA, equalTo(1))))
),
suite("A andThen B andThen C")(
testValue("A->B->C passes")(A ++ B ++ C, a *> b *> c, equalTo("C")),
testDied("A->C->B fails")(
A ++ B ++ C,
a *> c *> b,
hasFailedMatches(InvalidCapability(cmdC, cmdB, equalTo(2)))
hasFailedMatches(InvalidCapability(cmdC.signature, cmdB, equalTo(2)))
),
testDied("B->A->C fails")(
A ++ B ++ C,
b *> a *> c,
hasFailedMatches(InvalidCapability(cmdB, cmdA, equalTo(1)))
hasFailedMatches(InvalidCapability(cmdB.signature, cmdA, equalTo(1)))
),
testDied("B->C->A fails")(
A ++ B ++ C,
b *> c *> a,
hasFailedMatches(InvalidCapability(cmdB, cmdA, equalTo(1)))
hasFailedMatches(InvalidCapability(cmdB.signature, cmdA, equalTo(1)))
),
testDied("C->A->B fails")(
A ++ B ++ C,
c *> a *> b,
hasFailedMatches(InvalidCapability(cmdC, cmdA, equalTo(1)))
hasFailedMatches(InvalidCapability(cmdC.signature, cmdA, equalTo(1)))
),
testDied("C->B->A fails")(A ++ B ++ C, c *> b *> a, hasFailedMatches(InvalidCapability(cmdC, cmdA, equalTo(1))))
testDied("C->B->A fails")(
A ++ B ++ C,
c *> b *> a,
hasFailedMatches(InvalidCapability(cmdC.signature, cmdA, equalTo(1)))
)
),
suite("A or B")(
testValue("A passes")(A || B, a, equalTo("A")),
testValue("B passes")(A || B, b, equalTo("B")),
testDied("C fails")(
A || B,
c,
hasFailedMatches(InvalidCapability(cmdC, cmdB, equalTo(2)), InvalidCapability(cmdC, cmdA, equalTo(1)))
hasFailedMatches(
InvalidCapability(cmdC.signature, cmdB, equalTo(2)),
InvalidCapability(cmdC.signature, cmdA, equalTo(1))
)
)
),
suite("A or B or C")(
Expand Down Expand Up @@ -197,7 +217,11 @@ object AdvancedEffectMockSpec extends ZIOBaseSpec with MockSpecUtils[PureModule]
suite("(B atLeast 1) andThen (A atLeast 1)")(
testDied("0xB/0xA fails")(expectation, ZIO.unit, hasUnsatisfiedExpectations),
testDied("1xB fails")(expectation, b, hasUnsatisfiedExpectations),
testDied("1xA fails")(expectation, a, hasFailedMatches(InvalidCapability(cmdA, cmdB, equalTo(2)))),
testDied("1xA fails")(
expectation,
a,
hasFailedMatches(InvalidCapability(cmdA.signature, cmdB, equalTo(2)))
),
testValue("B->A passes")(expectation, b *> a, equalTo("A")),
testValue("B->B->A passes")(expectation, b *> b *> a, equalTo("A")),
testValue("B->A->A passes")(expectation, b *> a *> a, equalTo("A"))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package zio.mock

import zio.mock.Capability.Signature
import zio.mock.internal.{InvalidCall, MockException}
import zio.mock.module.{ImpureModule, ImpureModuleMock}
import zio.test.{Assertion, Spec, TestFailure, TestSuccess}
Expand Down Expand Up @@ -41,13 +42,13 @@ object AdvancedMethodMockSpec extends ZIOBaseSpec with MockSpecUtils[ImpureModul
}

def hasUnexpectedCall[I, E, A](capability: Capability[ImpureModule, I, E, A], args: I): Assertion[Throwable] =
isSubtype[UnexpectedCallException[ImpureModule, I, E, A]](
hasField[UnexpectedCallException[ImpureModule, I, E, A], Capability[ImpureModule, I, E, A]](
isSubtype[UnexpectedCallException](
hasField[UnexpectedCallException, Signature](
"capability",
_.capability,
equalTo(capability)
equalTo(capability.signature)
) &&
hasField[UnexpectedCallException[ImpureModule, I, E, A], Any]("args", _.args, equalTo(args))
hasField[UnexpectedCallException, Any]("args", _.args, equalTo(args))
)

def hasUnsatisfiedExpectations: Assertion[Throwable] =
Expand All @@ -59,9 +60,21 @@ object AdvancedMethodMockSpec extends ZIOBaseSpec with MockSpecUtils[ImpureModul
suite("A and B")(
testValue("A->B passes")(A && B, a *> b, equalTo("B")),
testValue("B->A passes")(A && B, b *> a, equalTo("A")),
testDied("A->A->B fails")(A && B, a *> a *> b, hasFailedMatches(InvalidCapability(cmdA, cmdB, equalTo(2)))),
testDied("B->B->A fails")(A && B, b *> b *> a, hasFailedMatches(InvalidCapability(cmdB, cmdA, equalTo(1)))),
testDied("A->C->B fails")(A && B, b *> c *> b, hasFailedMatches(InvalidCapability(cmdC, cmdA, equalTo(1))))
testDied("A->A->B fails")(
A && B,
a *> a *> b,
hasFailedMatches(InvalidCapability(cmdA.signature, cmdB, equalTo(2)))
),
testDied("B->B->A fails")(
A && B,
b *> b *> a,
hasFailedMatches(InvalidCapability(cmdB.signature, cmdA, equalTo(1)))
),
testDied("A->C->B fails")(
A && B,
b *> c *> b,
hasFailedMatches(InvalidCapability(cmdC.signature, cmdA, equalTo(1)))
)
),
suite("A and B and C")(
testValue("A->B->C passes")(A && B && C, a *> b *> c, equalTo("C")),
Expand All @@ -73,34 +86,34 @@ object AdvancedMethodMockSpec extends ZIOBaseSpec with MockSpecUtils[ImpureModul
),
suite("A andThen B")(
testValue("A->B passes")(A ++ B, a *> b, equalTo("B")),
testDied("B->A fails")(A ++ B, b *> a, hasFailedMatches(InvalidCapability(cmdB, cmdA, equalTo(1))))
testDied("B->A fails")(A ++ B, b *> a, hasFailedMatches(InvalidCapability(cmdB.signature, cmdA, equalTo(1))))
),
suite("A andThen B andThen C")(
testValue("A->B->C passes")(A ++ B ++ C, a *> b *> c, equalTo("C")),
testDied("A->C->B fails")(
A ++ B ++ C,
a *> c *> b,
hasFailedMatches(InvalidCapability(cmdC, cmdB, equalTo(2)))
hasFailedMatches(InvalidCapability(cmdC.signature, cmdB, equalTo(2)))
),
testDied("B->A->C fails")(
A ++ B ++ C,
b *> a *> c,
hasFailedMatches(InvalidCapability(cmdB, cmdA, equalTo(1)))
hasFailedMatches(InvalidCapability(cmdB.signature, cmdA, equalTo(1)))
),
testDied("B->C->A fails")(
A ++ B ++ C,
b *> c *> a,
hasFailedMatches(InvalidCapability(cmdB, cmdA, equalTo(1)))
hasFailedMatches(InvalidCapability(cmdB.signature, cmdA, equalTo(1)))
),
testDied("C->A->B fails")(
A ++ B ++ C,
c *> a *> b,
hasFailedMatches(InvalidCapability(cmdC, cmdA, equalTo(1)))
hasFailedMatches(InvalidCapability(cmdC.signature, cmdA, equalTo(1)))
),
testDied("C->B->A fails")(
A ++ B ++ C,
c *> b *> a,
hasFailedMatches(InvalidCapability(cmdC, cmdA, equalTo(1)))
hasFailedMatches(InvalidCapability(cmdC.signature, cmdA, equalTo(1)))
)
),
suite("A or B")(
Expand All @@ -109,7 +122,10 @@ object AdvancedMethodMockSpec extends ZIOBaseSpec with MockSpecUtils[ImpureModul
testDied("C fails")(
A || B,
c,
hasFailedMatches(InvalidCapability(cmdC, cmdB, equalTo(2)), InvalidCapability(cmdC, cmdA, equalTo(1)))
hasFailedMatches(
InvalidCapability(cmdC.signature, cmdB, equalTo(2)),
InvalidCapability(cmdC.signature, cmdA, equalTo(1))
)
)
),
suite("A or B or C")(
Expand Down Expand Up @@ -190,7 +206,11 @@ object AdvancedMethodMockSpec extends ZIOBaseSpec with MockSpecUtils[ImpureModul
suite("(B atLeast 1) andThen (A atLeast 1)")(
testDied("0xB/0xA fails")(expectation, ZIO.unit, hasUnsatisfiedExpectations),
testDied("1xB fails")(expectation, b, hasUnsatisfiedExpectations),
testDied("1xA fails")(expectation, a, hasFailedMatches(InvalidCapability(cmdA, cmdB, equalTo(2)))),
testDied("1xA fails")(
expectation,
a,
hasFailedMatches(InvalidCapability(cmdA.signature, cmdB, equalTo(2)))
),
testValue("B->A passes")(expectation, b *> a, equalTo("A")),
testValue("B->B->A passes")(expectation, b *> b *> a, equalTo("A")),
testValue("B->A->A passes")(expectation, b *> a *> a, equalTo("A"))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package zio.mock

import zio._
import zio.mock.Capability.Signature
import zio.mock.internal.{ExpectationState, InvalidCall, MockException}
import zio.mock.module.{PureModule, PureModuleMock}
import zio.test.{Assertion, Live, Spec, TestFailure, TestSuccess}
Expand Down Expand Up @@ -415,14 +416,18 @@ object BasicEffectMockSpec extends ZIOBaseSpec with MockSpecUtils[PureModule] {
testDied("invalid arguments")(
PureModuleMock.ParameterizedCommand(equalTo(1)),
PureModule.parameterizedCommand(2),
equalTo(InvalidCallException(List(InvalidArguments(PureModuleMock.ParameterizedCommand, 2, equalTo(1)))))
equalTo(
InvalidCallException(List(InvalidArguments(PureModuleMock.ParameterizedCommand.signature, 2, equalTo(1))))
)
),
testDied("invalid method")(
PureModuleMock.ParameterizedCommand(equalTo(1)),
PureModule.singleParam(1),
equalTo(
InvalidCallException(
List(InvalidCapability(PureModuleMock.SingleParam, PureModuleMock.ParameterizedCommand, equalTo(1)))
List(
InvalidCapability(PureModuleMock.SingleParam.signature, PureModuleMock.ParameterizedCommand, equalTo(1))
)
)
)
), {
Expand Down Expand Up @@ -465,14 +470,14 @@ object BasicEffectMockSpec extends ZIOBaseSpec with MockSpecUtils[PureModule] {
)
)
}, {
type M = Capability[PureModule, (Int, String, Long), String, String]
type X = UnexpectedCallException[PureModule, (Int, String, Long), String, String]
type M = Signature
type X = UnexpectedCallException

testDied("unexpected call")(
PureModuleMock.SingleParam(equalTo(1), value("foo")),
PureModule.singleParam(1) *> PureModule.manyParams(2, "3", 4L),
isSubtype[X](
hasField[X, M]("capability", _.capability, equalTo(PureModuleMock.ManyParams)) &&
hasField[X, M]("capability", _.capability, equalTo(PureModuleMock.ManyParams.signature)) &&
hasField[X, Any]("args", _.args, equalTo((2, "3", 4L)))
)
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package zio.mock

import zio.mock.Capability.Signature
import zio.mock.internal.{ExpectationState, InvalidCall, MockException}
import zio.mock.module.{ImpureModule, ImpureModuleMock}
import zio.test.{Assertion, Spec, TestFailure, TestSuccess}
Expand Down Expand Up @@ -416,14 +417,22 @@ object BasicMethodMockSpec extends ZIOBaseSpec with MockSpecUtils[ImpureModule]
testDied("invalid arguments")(
ImpureModuleMock.ParameterizedCommand(equalTo(1)),
ImpureModule.parameterizedCommand(2),
equalTo(InvalidCallException(List(InvalidArguments(ImpureModuleMock.ParameterizedCommand, 2, equalTo(1)))))
equalTo(
InvalidCallException(List(InvalidArguments(ImpureModuleMock.ParameterizedCommand.signature, 2, equalTo(1))))
)
),
testDied("invalid method")(
ImpureModuleMock.ParameterizedCommand(equalTo(1)),
ImpureModule.singleParam(1),
equalTo(
InvalidCallException(
List(InvalidCapability(ImpureModuleMock.SingleParam, ImpureModuleMock.ParameterizedCommand, equalTo(1)))
List(
InvalidCapability(
ImpureModuleMock.SingleParam.signature,
ImpureModuleMock.ParameterizedCommand,
equalTo(1)
)
)
)
)
), {
Expand Down Expand Up @@ -466,14 +475,14 @@ object BasicMethodMockSpec extends ZIOBaseSpec with MockSpecUtils[ImpureModule]
)
)
}, {
type M = Capability[ImpureModule, (Int, String, Long), Throwable, String]
type X = UnexpectedCallException[ImpureModule, (Int, String, Long), Throwable, String]
type M = Signature
type X = UnexpectedCallException

testDied("unexpected call")(
ImpureModuleMock.SingleParam(equalTo(1), value("foo")),
ImpureModule.singleParam(1) *> ImpureModule.manyParams(2, "3", 4L),
isSubtype[X](
hasField[X, M]("capability", _.capability, equalTo(ImpureModuleMock.ManyParams)) &&
hasField[X, M]("capability", _.capability, equalTo(ImpureModuleMock.ManyParams.signature)) &&
hasField[X, Any]("args", _.args, equalTo((2, "3", 4L)))
)
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package zio.mock

import zio.mock.Capability.Signature
import zio.mock.internal.MockException
import zio.test.Assertion
import zio.{Clock, Console, ZIO}
Expand Down Expand Up @@ -29,14 +30,14 @@ object ComposedEmptyMockSpec extends ZIOBaseSpec with MockSpecUtils[ComposedEmpt
branchingProgram(false),
isUnit
), {
type M = Capability[Console, Unit, IOException, String]
type X = UnexpectedCallException[Console, Unit, IOException, String]
type M = Signature
type X = UnexpectedCallException

testDied("should fail when call on Console happened")(
MockConsole.empty ++ MockClock.NanoTime(value(42L)),
branchingProgram(true),
isSubtype[X](
hasField[X, M]("capability", _.capability, equalTo(MockConsole.ReadLine)) &&
hasField[X, M]("capability", _.capability, equalTo(MockConsole.ReadLine.signature)) &&
hasField[X, Any]("args", _.args, equalTo(()))
)
)
Expand All @@ -47,14 +48,14 @@ object ComposedEmptyMockSpec extends ZIOBaseSpec with MockSpecUtils[ComposedEmpt
isUnit
), {

type M = Capability[Clock, Unit, Nothing, Long]
type X = UnexpectedCallException[Clock, Unit, Nothing, Long]
type M = Signature
type X = UnexpectedCallException

testDied("should fail when call on Clock happened")(
MockClock.empty ++ MockConsole.ReadLine(value("foo")),
branchingProgram(false),
isSubtype[X](
hasField[X, M]("capability", _.capability, equalTo(MockClock.NanoTime)) &&
hasField[X, M]("capability", _.capability, equalTo(MockClock.NanoTime.signature)) &&
hasField[X, Any]("args", _.args, equalTo(()))
)
)
Expand Down
Loading

0 comments on commit 58be95a

Please sign in to comment.