diff --git a/.scalafmt.conf b/.scalafmt.conf index 31720367..65fcfbd1 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,7 +1,7 @@ style = defaultWithAlign docstrings = JavaDoc -maxColumn = 140 +maxColumn = 180 rewrite.rules = [RedundantBraces, RedundantParens, SortImports] spaces.inImportCurlyBraces = true indentOperator = spray diff --git a/build.sbt b/build.sbt index 30f47986..fc58666b 100644 --- a/build.sbt +++ b/build.sbt @@ -21,7 +21,7 @@ lazy val commonSettings = source.close version.get }, - crossScalaVersions := Seq("2.11.12", "2.12.8", currentScalaVersion), + crossScalaVersions := Seq("2.11.12", "2.12.9", currentScalaVersion), scalafmtOnCompile := true, scalacOptions ++= Seq( "-unchecked", diff --git a/cats/src/main/scala/org/mockito/cats/CatsStubbing.scala b/cats/src/main/scala/org/mockito/cats/CatsStubbing.scala index 2f995e38..196cb252 100644 --- a/cats/src/main/scala/org/mockito/cats/CatsStubbing.scala +++ b/cats/src/main/scala/org/mockito/cats/CatsStubbing.scala @@ -33,14 +33,11 @@ case class CatsStubbing[F[_], T](delegate: OngoingStubbing[F[T]]) { delegate thenAnswer functionToAnswer(f).andThen(F.pure) def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7](f: (P0, P1, P2, P3, P4, P5, P6, P7) => T)(implicit F: Applicative[F]): CatsStubbing[F, T] = delegate thenAnswer functionToAnswer(f).andThen(F.pure) - def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => T)( - implicit F: Applicative[F]): CatsStubbing[F, T] = + def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => T)(implicit F: Applicative[F]): CatsStubbing[F, T] = delegate thenAnswer functionToAnswer(f).andThen(F.pure) - def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => T)( - implicit F: Applicative[F]): CatsStubbing[F, T] = + def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => T)(implicit F: Applicative[F]): CatsStubbing[F, T] = delegate thenAnswer functionToAnswer(f).andThen(F.pure) - def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T)( - implicit F: Applicative[F]): CatsStubbing[F, T] = + def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T)(implicit F: Applicative[F]): CatsStubbing[F, T] = delegate thenAnswer functionToAnswer(f).andThen(F.pure) def thenFailWith[E](error: E)(implicit F: ApplicativeError[F, _ >: E]): CatsStubbing[F, T] = @@ -65,8 +62,7 @@ case class CatsStubbing2[F[_], G[_], T](delegate: OngoingStubbing[F[G[T]]]) { def thenAnswer(f: => T)(implicit F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = delegate thenAnswer invocationToAnswer(_ => f).andThen(F.compose[G].pure) - def thenAnswer[P0]( - f: P0 => T)(implicit classTag: ClassTag[P0] = defaultClassTag[P0], F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = + def thenAnswer[P0](f: P0 => T)(implicit classTag: ClassTag[P0] = defaultClassTag[P0], F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = clazz[P0] match { case c if c == classOf[InvocationOnMock] => delegate thenAnswer invocationToAnswer(i => f(i.asInstanceOf[P0])).andThen(F.compose[G].pure) @@ -80,23 +76,18 @@ case class CatsStubbing2[F[_], G[_], T](delegate: OngoingStubbing[F[G[T]]]) { delegate thenAnswer functionToAnswer(f).andThen(F.compose[G].pure) def thenAnswer[P0, P1, P2, P3, P4](f: (P0, P1, P2, P3, P4) => T)(implicit F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = delegate thenAnswer functionToAnswer(f).andThen(F.compose[G].pure) - def thenAnswer[P0, P1, P2, P3, P4, P5](f: (P0, P1, P2, P3, P4, P5) => T)(implicit F: Applicative[F], - G: Applicative[G]): CatsStubbing2[F, G, T] = + def thenAnswer[P0, P1, P2, P3, P4, P5](f: (P0, P1, P2, P3, P4, P5) => T)(implicit F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = delegate thenAnswer functionToAnswer(f).andThen(F.compose[G].pure) - def thenAnswer[P0, P1, P2, P3, P4, P5, P6](f: (P0, P1, P2, P3, P4, P5, P6) => T)(implicit F: Applicative[F], - G: Applicative[G]): CatsStubbing2[F, G, T] = + def thenAnswer[P0, P1, P2, P3, P4, P5, P6](f: (P0, P1, P2, P3, P4, P5, P6) => T)(implicit F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = delegate thenAnswer functionToAnswer(f).andThen(F.compose[G].pure) - def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7](f: (P0, P1, P2, P3, P4, P5, P6, P7) => T)(implicit F: Applicative[F], - G: Applicative[G]): CatsStubbing2[F, G, T] = + def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7](f: (P0, P1, P2, P3, P4, P5, P6, P7) => T)(implicit F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = delegate thenAnswer functionToAnswer(f).andThen(F.compose[G].pure) - def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => T)(implicit F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = + def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => T)(implicit F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = delegate thenAnswer functionToAnswer(f).andThen(F.compose[G].pure) - def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => T)(implicit F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = + def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => T)(implicit F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = delegate thenAnswer functionToAnswer(f).andThen(F.compose[G].pure) - def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T)(implicit F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = + def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T)(implicit F: Applicative[F], + G: Applicative[G]): CatsStubbing2[F, G, T] = delegate thenAnswer functionToAnswer(f).andThen(F.compose[G].pure) def thenFailWith[E](error: E)(implicit ae: Applicative[F], ag: ApplicativeError[G, _ >: E]): CatsStubbing2[F, G, T] = diff --git a/cats/src/main/scala/org/mockito/cats/IdiomaticMockitoCats.scala b/cats/src/main/scala/org/mockito/cats/IdiomaticMockitoCats.scala index 96a7aa33..085ed16d 100644 --- a/cats/src/main/scala/org/mockito/cats/IdiomaticMockitoCats.scala +++ b/cats/src/main/scala/org/mockito/cats/IdiomaticMockitoCats.scala @@ -178,23 +178,19 @@ object IdiomaticMockitoCats extends IdiomaticMockitoCats { def apply[P0, P1, P2, P3, P4, P5, P6, P7](f: (P0, P1, P2, P3, P4, P5, P6, P7) => T)(implicit F: Applicative[F]): CatsStubbing[F, T] = os thenAnswer f - def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => T)( - implicit F: Applicative[F]): CatsStubbing[F, T] = os thenAnswer f + def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => T)(implicit F: Applicative[F]): CatsStubbing[F, T] = os thenAnswer f - def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => T)( - implicit F: Applicative[F]): CatsStubbing[F, T] = + def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => T)(implicit F: Applicative[F]): CatsStubbing[F, T] = os thenAnswer f - def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T)( - implicit F: Applicative[F]): CatsStubbing[F, T] = + def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T)(implicit F: Applicative[F]): CatsStubbing[F, T] = os thenAnswer f } class AnswerActions2[F[_], G[_], T](os: CatsStubbing2[F, G, T]) { def apply(f: => T)(implicit F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = os thenAnswer f - def apply[P0]( - f: P0 => T)(implicit classTag: ClassTag[P0] = defaultClassTag[P0], F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = + def apply[P0](f: P0 => T)(implicit classTag: ClassTag[P0] = defaultClassTag[P0], F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = os thenAnswer f def apply[P0, P1](f: (P0, P1) => T)(implicit F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = os thenAnswer f @@ -207,27 +203,22 @@ object IdiomaticMockitoCats extends IdiomaticMockitoCats { def apply[P0, P1, P2, P3, P4](f: (P0, P1, P2, P3, P4) => T)(implicit F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = os thenAnswer f - def apply[P0, P1, P2, P3, P4, P5](f: (P0, P1, P2, P3, P4, P5) => T)(implicit F: Applicative[F], - G: Applicative[G]): CatsStubbing2[F, G, T] = os thenAnswer f + def apply[P0, P1, P2, P3, P4, P5](f: (P0, P1, P2, P3, P4, P5) => T)(implicit F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = os thenAnswer f - def apply[P0, P1, P2, P3, P4, P5, P6](f: (P0, P1, P2, P3, P4, P5, P6) => T)(implicit F: Applicative[F], - G: Applicative[G]): CatsStubbing2[F, G, T] = + def apply[P0, P1, P2, P3, P4, P5, P6](f: (P0, P1, P2, P3, P4, P5, P6) => T)(implicit F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = os thenAnswer f - def apply[P0, P1, P2, P3, P4, P5, P6, P7](f: (P0, P1, P2, P3, P4, P5, P6, P7) => T)(implicit F: Applicative[F], - G: Applicative[G]): CatsStubbing2[F, G, T] = + def apply[P0, P1, P2, P3, P4, P5, P6, P7](f: (P0, P1, P2, P3, P4, P5, P6, P7) => T)(implicit F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = os thenAnswer f - def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => T)(implicit F: Applicative[F], - G: Applicative[G]): CatsStubbing2[F, G, T] = + def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => T)(implicit F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = os thenAnswer f - def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => T)(implicit F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = + def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => T)(implicit F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = os thenAnswer f - def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T)(implicit F: Applicative[F], G: Applicative[G]): CatsStubbing2[F, G, T] = + def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T)(implicit F: Applicative[F], + G: Applicative[G]): CatsStubbing2[F, G, T] = os thenAnswer f } } diff --git a/cats/src/main/scala/org/mockito/cats/MockitoCats.scala b/cats/src/main/scala/org/mockito/cats/MockitoCats.scala index 7d1facf9..e26549d1 100644 --- a/cats/src/main/scala/org/mockito/cats/MockitoCats.scala +++ b/cats/src/main/scala/org/mockito/cats/MockitoCats.scala @@ -71,8 +71,7 @@ trait MockitoCats extends ScalacticSerialisableHack { Mockito.doAnswer(functionToAnswer(f).andThen(Applicative[F].pure)) def doAnswerF[F[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, R](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => R): Stubber = Mockito.doAnswer(functionToAnswer(f).andThen(Applicative[F].pure)) - def doAnswerF[F[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, R]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => R): Stubber = + def doAnswerF[F[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, R](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => R): Stubber = Mockito.doAnswer(functionToAnswer(f).andThen(Applicative[F].pure)) def doAnswerFG[F[_]: Applicative, G[_]: Applicative, R](l: => R): Stubber = @@ -103,17 +102,13 @@ trait MockitoCats extends ScalacticSerialisableHack { Mockito.doAnswer(functionToAnswer(f).andThen(Applicative[F].compose[G].pure)) def doAnswerFG[F[_]: Applicative, G[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, R](f: (P0, P1, P2, P3, P4, P5, P6) => R): Stubber = Mockito.doAnswer(functionToAnswer(f).andThen(Applicative[F].compose[G].pure)) - def doAnswerFG[F[_]: Applicative, G[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, P7, R]( - f: (P0, P1, P2, P3, P4, P5, P6, P7) => R): Stubber = + def doAnswerFG[F[_]: Applicative, G[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, P7, R](f: (P0, P1, P2, P3, P4, P5, P6, P7) => R): Stubber = Mockito.doAnswer(functionToAnswer(f).andThen(Applicative[F].compose[G].pure)) - def doAnswerFG[F[_]: Applicative, G[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, P7, P8, R]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => R): Stubber = + def doAnswerFG[F[_]: Applicative, G[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, P7, P8, R](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => R): Stubber = Mockito.doAnswer(functionToAnswer(f).andThen(Applicative[F].compose[G].pure)) - def doAnswerFG[F[_]: Applicative, G[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, R]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => R): Stubber = + def doAnswerFG[F[_]: Applicative, G[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, R](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => R): Stubber = Mockito.doAnswer(functionToAnswer(f).andThen(Applicative[F].compose[G].pure)) - def doAnswerFG[F[_]: Applicative, G[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, R]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => R): Stubber = + def doAnswerFG[F[_]: Applicative, G[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, R](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => R): Stubber = Mockito.doAnswer(functionToAnswer(f).andThen(Applicative[F].compose[G].pure)) implicit def catsEquality[T: Eq]: Equality[T] = new EqToEquality[T] diff --git a/cats/src/test/scala/org/mockito/cats/DoSomethingCatsTest.scala b/cats/src/test/scala/org/mockito/cats/DoSomethingCatsTest.scala index a7d4b9ff..bbd669b6 100644 --- a/cats/src/test/scala/org/mockito/cats/DoSomethingCatsTest.scala +++ b/cats/src/test/scala/org/mockito/cats/DoSomethingCatsTest.scala @@ -106,7 +106,7 @@ class DoSomethingCatsTest "mocked!" willBe answeredF by aMock.returnsOptionString("hello") ((s: String) => s + " mocked!") willBe answeredF by aMock.returnsOptionString("hi") - ((i: InvocationOnMock) => i.getArgument[String](0) + " invocation mocked!") willBe answeredF by aMock.returnsOptionString("hola") + ((i: InvocationOnMock) => i.arg[String](0) + " invocation mocked!") willBe answeredF by aMock.returnsOptionString("hola") ((i: Int, b: Boolean) => s"$i, $b") willBe answeredF by aMock.returnsOptionFrom(42, true) aMock.returnsOptionString("hello").value shouldBe "mocked!" @@ -120,7 +120,7 @@ class DoSomethingCatsTest ValueClass("mocked!") willBe answeredFG by aMock.returnsFutureEither("hello") ((s: String) => ValueClass(s + " mocked!")) willBe answeredFG by aMock.returnsFutureEither("hi") - ((i: InvocationOnMock) => ValueClass(i.getArgument[String](0) + " invocation mocked!")) willBe answeredFG by aMock + ((i: InvocationOnMock) => ValueClass(i.arg[String](0) + " invocation mocked!")) willBe answeredFG by aMock .returnsFutureEither("hola") ((i: Int, b: Boolean) => s"$i, $b") willBe answeredFG by aMock.returnsFutureOptionFrom(42, true) diff --git a/cats/src/test/scala/org/mockito/cats/IdiomaticMockitoCatsTest.scala b/cats/src/test/scala/org/mockito/cats/IdiomaticMockitoCatsTest.scala index 6797663f..26aa8bc6 100644 --- a/cats/src/test/scala/org/mockito/cats/IdiomaticMockitoCatsTest.scala +++ b/cats/src/test/scala/org/mockito/cats/IdiomaticMockitoCatsTest.scala @@ -142,7 +142,7 @@ class IdiomaticMockitoCatsTest aMock.returnsOptionString("hello") answersF "mocked!" aMock.returnsOptionString("hi") answersF ((s: String) => s + " mocked!") - aMock.returnsOptionString("hola") answersF ((i: InvocationOnMock) => i.getArgument[String](0) + " invocation mocked!") + aMock.returnsOptionString("hola") answersF ((i: InvocationOnMock) => i.arg[String](0) + " invocation mocked!") aMock.returnsOptionFrom(42, true) answersF ((i: Int, b: Boolean) => s"$i, $b") aMock.returnsOptionString("hello").value shouldBe "mocked!" @@ -156,7 +156,7 @@ class IdiomaticMockitoCatsTest aMock.returnsFutureEither("hello") answersFG ValueClass("mocked!") aMock.returnsFutureEither("hi") answersFG ((s: String) => ValueClass(s + " mocked!")) - aMock.returnsFutureEither("hola") answersFG ((i: InvocationOnMock) => ValueClass(i.getArgument[String](0) + " invocation mocked!")) + aMock.returnsFutureEither("hola") answersFG ((i: InvocationOnMock) => ValueClass(i.arg[String](0) + " invocation mocked!")) aMock.returnsFutureOptionFrom(42, true) answersFG ((i: Int, b: Boolean) => s"$i, $b") whenReady(aMock.returnsFutureEither("hello"))(_.right.value shouldBe ValueClass("mocked!")) diff --git a/cats/src/test/scala/org/mockito/cats/MockitoCatsTest.scala b/cats/src/test/scala/org/mockito/cats/MockitoCatsTest.scala index ecac4a7c..39d2519a 100644 --- a/cats/src/test/scala/org/mockito/cats/MockitoCatsTest.scala +++ b/cats/src/test/scala/org/mockito/cats/MockitoCatsTest.scala @@ -11,15 +11,7 @@ import org.scalatest.{ EitherValues, Matchers, OptionValues, WordSpec } import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future -class MockitoCatsTest - extends WordSpec - with Matchers - with MockitoSugar - with ArgumentMatchersSugar - with MockitoCats - with EitherValues - with OptionValues - with ScalaFutures { +class MockitoCatsTest extends WordSpec with Matchers with MockitoSugar with ArgumentMatchersSugar with MockitoCats with EitherValues with OptionValues with ScalaFutures { "when - return" should { "stub full applicative" in { @@ -128,7 +120,7 @@ class MockitoCatsTest whenF(aMock.returnsOptionString("hello")) thenAnswer "mocked!" whenF(aMock.returnsOptionString("hi")) thenAnswer ((s: String) => s + " mocked!") - whenF(aMock.returnsOptionString("hola")) thenAnswer ((i: InvocationOnMock) => i.getArgument[String](0) + " invocation mocked!") + whenF(aMock.returnsOptionString("hola")) thenAnswer ((i: InvocationOnMock) => i.arg[String](0) + " invocation mocked!") whenF(aMock.returnsOptionFrom(42, true)) thenAnswer ((i: Int, b: Boolean) => s"$i, $b") aMock.returnsOptionString("hello").value shouldBe "mocked!" @@ -142,8 +134,7 @@ class MockitoCatsTest whenFG(aMock.returnsFutureEither("hello")) thenAnswer ValueClass("mocked!") whenFG(aMock.returnsFutureEither("hi")) thenAnswer ((s: String) => ValueClass(s + " mocked!")) - whenFG(aMock.returnsFutureEither("hola")) thenAnswer ((i: InvocationOnMock) => - ValueClass(i.getArgument[String](0) + " invocation mocked!")) + whenFG(aMock.returnsFutureEither("hola")) thenAnswer ((i: InvocationOnMock) => ValueClass(i.arg[String](0) + " invocation mocked!")) whenFG(aMock.returnsFutureOptionFrom(42, true)) thenAnswer ((i: Int, b: Boolean) => s"$i, $b") whenReady(aMock.returnsFutureEither("hello"))(_.right.value shouldBe ValueClass("mocked!")) @@ -243,7 +234,7 @@ class MockitoCatsTest doAnswerF[Option, String]("mocked!").when(aMock).returnsOptionString("hello") doAnswerF[Option, String, String]((s: String) => s + " mocked!").when(aMock).returnsOptionString("hi") - doAnswerF[Option, InvocationOnMock, String]((i: InvocationOnMock) => i.getArgument[String](0) + " invocation mocked!") + doAnswerF[Option, InvocationOnMock, String]((i: InvocationOnMock) => i.arg[String](0) + " invocation mocked!") .when(aMock) .returnsOptionString("hola") doAnswerF[Option, Int, Boolean, String]((i: Int, b: Boolean) => s"$i, $b").when(aMock).returnsOptionFrom(42, true) @@ -260,7 +251,7 @@ class MockitoCatsTest doAnswerFG[Future, ErrorOr, ValueClass](ValueClass("mocked!")).when(aMock).returnsFutureEither("hello") doAnswerFG[Future, ErrorOr, String, ValueClass]((s: String) => ValueClass(s + " mocked!")).when(aMock).returnsFutureEither("hi") doAnswerFG[Future, ErrorOr, InvocationOnMock, ValueClass] { i: InvocationOnMock => - ValueClass(i.getArgument[String](0) + " invocation mocked!") + ValueClass(i.arg[String](0) + " invocation mocked!") }.when(aMock) .returnsFutureEither("hola") doAnswerFG[Future, Option, Int, Boolean, String]((i: Int, b: Boolean) => s"$i, $b").when(aMock).returnsFutureOptionFrom(42, true) diff --git a/common/src/main/scala-2.11/org/mockito/stubbing/ReturnsEmptyValues.scala b/common/src/main/scala-2.11/org/mockito/stubbing/ReturnsEmptyValues.scala new file mode 100644 index 00000000..59b0f4b1 --- /dev/null +++ b/common/src/main/scala-2.11/org/mockito/stubbing/ReturnsEmptyValues.scala @@ -0,0 +1,41 @@ +package org.mockito +package stubbing + +import org.mockito.exceptions.base.MockitoException +import org.mockito.internal.stubbing.defaultanswers.ReturnsMoreEmptyValues +import org.mockito.invocation.InvocationOnMock + +import scala.collection.mutable +import scala.collection.mutable.ListBuffer +import scala.concurrent.Future +import scala.util.{ Failure, Try } + +object ReturnsEmptyValues extends DefaultAnswer { + private val javaEmptyValuesAndPrimitives = new ReturnsMoreEmptyValues + + private[mockito] lazy val emptyValues: Map[Class[_], AnyRef] = Map( + classOf[Option[_]] -> Option.empty, + classOf[List[_]] -> List.empty, + classOf[Set[_]] -> Set.empty, + classOf[Seq[_]] -> Seq.empty, + classOf[Iterable[_]] -> Iterable.empty, + classOf[Traversable[_]] -> Traversable.empty, + classOf[IndexedSeq[_]] -> IndexedSeq.empty, + classOf[Iterator[_]] -> Iterator.empty, + classOf[Stream[_]] -> Stream.empty, + classOf[Vector[_]] -> Vector.empty, + classOf[Try[_]] -> Failure(new MockitoException("Auto stub provided by mockito-scala")), + classOf[Future[_]] -> Future.failed(new MockitoException("Auto stub provided by mockito-scala")), + classOf[BigDecimal] -> BigDecimal(0), + classOf[BigInt] -> BigInt(0), + classOf[StringBuilder] -> StringBuilder.newBuilder, + classOf[Map[_, _]] -> Map.empty, + classOf[ListBuffer[_]] -> ListBuffer.empty, + classOf[mutable.Seq[_]] -> ListBuffer.empty, + classOf[mutable.Set[_]] -> mutable.HashSet.empty, + classOf[Either[_, _]] -> Left("Auto stub provided by mockito-scala") + ) + + override def apply(invocation: InvocationOnMock): Option[Any] = + Option(javaEmptyValuesAndPrimitives.answer(invocation)).orElse(emptyValues.get(invocation.returnType)) +} diff --git a/common/src/main/scala-2.12/org/mockito/stubbing/ReturnsEmptyValues.scala b/common/src/main/scala-2.12/org/mockito/stubbing/ReturnsEmptyValues.scala new file mode 100644 index 00000000..59b0f4b1 --- /dev/null +++ b/common/src/main/scala-2.12/org/mockito/stubbing/ReturnsEmptyValues.scala @@ -0,0 +1,41 @@ +package org.mockito +package stubbing + +import org.mockito.exceptions.base.MockitoException +import org.mockito.internal.stubbing.defaultanswers.ReturnsMoreEmptyValues +import org.mockito.invocation.InvocationOnMock + +import scala.collection.mutable +import scala.collection.mutable.ListBuffer +import scala.concurrent.Future +import scala.util.{ Failure, Try } + +object ReturnsEmptyValues extends DefaultAnswer { + private val javaEmptyValuesAndPrimitives = new ReturnsMoreEmptyValues + + private[mockito] lazy val emptyValues: Map[Class[_], AnyRef] = Map( + classOf[Option[_]] -> Option.empty, + classOf[List[_]] -> List.empty, + classOf[Set[_]] -> Set.empty, + classOf[Seq[_]] -> Seq.empty, + classOf[Iterable[_]] -> Iterable.empty, + classOf[Traversable[_]] -> Traversable.empty, + classOf[IndexedSeq[_]] -> IndexedSeq.empty, + classOf[Iterator[_]] -> Iterator.empty, + classOf[Stream[_]] -> Stream.empty, + classOf[Vector[_]] -> Vector.empty, + classOf[Try[_]] -> Failure(new MockitoException("Auto stub provided by mockito-scala")), + classOf[Future[_]] -> Future.failed(new MockitoException("Auto stub provided by mockito-scala")), + classOf[BigDecimal] -> BigDecimal(0), + classOf[BigInt] -> BigInt(0), + classOf[StringBuilder] -> StringBuilder.newBuilder, + classOf[Map[_, _]] -> Map.empty, + classOf[ListBuffer[_]] -> ListBuffer.empty, + classOf[mutable.Seq[_]] -> ListBuffer.empty, + classOf[mutable.Set[_]] -> mutable.HashSet.empty, + classOf[Either[_, _]] -> Left("Auto stub provided by mockito-scala") + ) + + override def apply(invocation: InvocationOnMock): Option[Any] = + Option(javaEmptyValuesAndPrimitives.answer(invocation)).orElse(emptyValues.get(invocation.returnType)) +} diff --git a/common/src/main/scala-2.13/org/mockito/stubbing/ReturnsEmptyValues.scala b/common/src/main/scala-2.13/org/mockito/stubbing/ReturnsEmptyValues.scala new file mode 100644 index 00000000..92e56805 --- /dev/null +++ b/common/src/main/scala-2.13/org/mockito/stubbing/ReturnsEmptyValues.scala @@ -0,0 +1,40 @@ +package org.mockito +package stubbing + +import org.mockito.exceptions.base.MockitoException +import org.mockito.internal.stubbing.defaultanswers.ReturnsMoreEmptyValues +import org.mockito.invocation.InvocationOnMock + +import scala.collection.mutable +import scala.collection.mutable.ListBuffer +import scala.concurrent.Future +import scala.util.{ Failure, Try } + +object ReturnsEmptyValues extends DefaultAnswer { + private val javaEmptyValuesAndPrimitives = new ReturnsMoreEmptyValues + + private[mockito] lazy val emptyValues: Map[Class[_], AnyRef] = Map( + classOf[Option[_]] -> Option.empty, + classOf[List[_]] -> List.empty, + classOf[Set[_]] -> Set.empty, + classOf[Seq[_]] -> Seq.empty, + classOf[Iterable[_]] -> Iterable.empty, + classOf[IndexedSeq[_]] -> IndexedSeq.empty, + classOf[Iterator[_]] -> Iterator.empty, + classOf[LazyList[_]] -> LazyList.empty, + classOf[Vector[_]] -> Vector.empty, + classOf[Try[_]] -> Failure(new MockitoException("Auto stub provided by mockito-scala")), + classOf[Future[_]] -> Future.failed(new MockitoException("Auto stub provided by mockito-scala")), + classOf[BigDecimal] -> BigDecimal(0), + classOf[BigInt] -> BigInt(0), + classOf[StringBuilder] -> new StringBuilder, + classOf[Map[_, _]] -> Map.empty, + classOf[ListBuffer[_]] -> ListBuffer.empty, + classOf[mutable.Seq[_]] -> ListBuffer.empty, + classOf[mutable.Set[_]] -> mutable.HashSet.empty, + classOf[Either[_, _]] -> Left("Auto stub provided by mockito-scala") + ) + + override def apply(invocation: InvocationOnMock): Option[Any] = + Option(javaEmptyValuesAndPrimitives.answer(invocation)).orElse(emptyValues.get(invocation.returnType)) +} diff --git a/common/src/main/scala/org/mockito/MockitoAPI.scala b/common/src/main/scala/org/mockito/MockitoAPI.scala index 8b771a07..4114636d 100644 --- a/common/src/main/scala/org/mockito/MockitoAPI.scala +++ b/common/src/main/scala/org/mockito/MockitoAPI.scala @@ -12,6 +12,7 @@ package org.mockito import org.mockito.Answers.CALLS_REAL_METHODS +import org.mockito.ReflectionUtils.InvocationOnMockOps import org.mockito.internal.ValueClassExtractor import org.mockito.internal.configuration.plugins.Plugins.getMockMaker import org.mockito.internal.creation.MockSettingsImpl @@ -23,7 +24,7 @@ import org.mockito.internal.util.reflection.LenientCopyTool import org.mockito.invocation.InvocationOnMock import org.mockito.mock.MockCreationSettings import org.mockito.stubbing.{ Answer, DefaultAnswer, ScalaFirstStubbing, Stubber } -import org.mockito.verification.{ VerificationMode, VerificationWithTimeout } +import org.mockito.verification.{ VerificationAfterDelay, VerificationMode, VerificationWithTimeout } import org.scalactic.{ Equality, Prettifier } import scala.collection.JavaConverters._ @@ -129,13 +130,14 @@ private[mockito] trait DoSomething { Mockito.doAnswer(functionToAnswer(f)) def doAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, R: ValueClassExtractor](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => R): Stubber = Mockito.doAnswer(functionToAnswer(f)) - def doAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, R: ValueClassExtractor]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => R): Stubber = + def doAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, R: ValueClassExtractor](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => R): Stubber = Mockito.doAnswer(functionToAnswer(f)) } private[mockito] trait MockitoEnhancer extends MockCreator { + implicit val invocationOps: InvocationOnMock => InvocationOnMockOps = InvocationOps + /** * Delegates to Mockito.mock(type: Class[T]) * It provides a nicer API as you can, for instance, do mock[MyClass] @@ -317,6 +319,11 @@ private[mockito] trait Verifications { */ def timeout(millis: Int): VerificationWithTimeout = Mockito.timeout(millis) + /** + * Delegates to Mockito.after(), it's only here to expose the full Mockito API + */ + def after(millis: Int): VerificationAfterDelay = Mockito.after(millis) + /** * Delegates to Mockito.times(), it's only here to expose the full Mockito API */ diff --git a/common/src/main/scala/org/mockito/ReflectionUtils.scala b/common/src/main/scala/org/mockito/ReflectionUtils.scala index bc4ede2e..5425fd46 100644 --- a/common/src/main/scala/org/mockito/ReflectionUtils.scala +++ b/common/src/main/scala/org/mockito/ReflectionUtils.scala @@ -10,7 +10,7 @@ import scala.reflect.ClassTag import scala.reflect.internal.Symbols import scala.util.control.NonFatal -private[mockito] object ReflectionUtils { +object ReflectionUtils { import scala.reflect.runtime.{ universe => ru } import ru._ @@ -22,9 +22,14 @@ private[mockito] object ReflectionUtils { def methodToJava(sym: Symbols#MethodSymbol): Method }] - implicit class InvocationOnMockOps(invocation: InvocationOnMock) { + implicit class InvocationOnMockOps(val invocation: InvocationOnMock) extends AnyVal { + def mock[M]: M = invocation.getMock.asInstanceOf[M] + def method: Method = invocation.getMethod + def arg[A](index: Int): A = invocation.getArgument(index) + def args: List[Any] = invocation.getArguments.toList + def callRealMethod[A](): A = invocation.callRealMethod.asInstanceOf[A] + def returnType: Class[_] = { - val method = invocation.getMethod val javaReturnType = method.getReturnType if (javaReturnType == classOf[Object]) diff --git a/common/src/main/scala/org/mockito/internal/handler/ScalaMockHandler.scala b/common/src/main/scala/org/mockito/internal/handler/ScalaMockHandler.scala index 57bcf6ec..14d1f604 100644 --- a/common/src/main/scala/org/mockito/internal/handler/ScalaMockHandler.scala +++ b/common/src/main/scala/org/mockito/internal/handler/ScalaMockHandler.scala @@ -16,8 +16,7 @@ import org.scalactic.TripleEquals._ import scala.collection.JavaConverters._ -class ScalaMockHandler[T](mockSettings: MockCreationSettings[T], methodsToProcess: Seq[(Method, Set[Int])])(implicit $pt: Prettifier) - extends MockHandlerImpl[T](mockSettings) { +class ScalaMockHandler[T](mockSettings: MockCreationSettings[T], methodsToProcess: Seq[(Method, Set[Int])])(implicit $pt: Prettifier) extends MockHandlerImpl[T](mockSettings) { override def handle(invocation: Invocation): AnyRef = invocation match { diff --git a/common/src/main/scala/org/mockito/internal/handler/ScalaNullResultGuardian.scala b/common/src/main/scala/org/mockito/internal/handler/ScalaNullResultGuardian.scala index adaa1496..9a68ae13 100644 --- a/common/src/main/scala/org/mockito/internal/handler/ScalaNullResultGuardian.scala +++ b/common/src/main/scala/org/mockito/internal/handler/ScalaNullResultGuardian.scala @@ -1,8 +1,9 @@ -package org.mockito.internal.handler +package org.mockito +package internal.handler + import org.mockito.internal.util.Primitives.defaultValue import org.mockito.invocation.{ Invocation, InvocationContainer, MockHandler } import org.mockito.mock.MockCreationSettings -import org.mockito.ReflectionUtils._ class ScalaNullResultGuardian[T](delegate: MockHandler[T]) extends MockHandler[T] { diff --git a/common/src/main/scala/org/mockito/mockito.scala b/common/src/main/scala/org/mockito/mockito.scala index abd37a80..3dc16d12 100644 --- a/common/src/main/scala/org/mockito/mockito.scala +++ b/common/src/main/scala/org/mockito/mockito.scala @@ -2,6 +2,7 @@ package org import java.lang.reflect.Method +import org.mockito.ReflectionUtils.InvocationOnMockOps import org.mockito.internal.ValueClassExtractor import org.mockito.invocation.InvocationOnMock import org.mockito.stubbing.ScalaAnswer @@ -19,104 +20,45 @@ package object mockito { def clazz[T](implicit classTag: ClassTag[T]): Class[T] = classTag.runtimeClass.asInstanceOf[Class[T]] + implicit val InvocationOps: InvocationOnMock => InvocationOnMockOps = new InvocationOnMockOps(_) + //noinspection ConvertExpressionToSAM def invocationToAnswer[T: ValueClassExtractor](f: InvocationOnMock => T): ScalaAnswer[T] = ScalaAnswer.lift(f.andThen(ValueClassExtractor[T].extractAs[T])) def functionToAnswer[T: ValueClassExtractor, P0](f: P0 => T): ScalaAnswer[T] = - invocationToAnswer(i => f(i.getArgument[P0](0))) + invocationToAnswer(i => f(i.arg[P0](0))) def functionToAnswer[T: ValueClassExtractor, P1, P0](f: (P0, P1) => T): ScalaAnswer[T] = - invocationToAnswer(i => f(i.getArgument[P0](0), i.getArgument[P1](1))) + invocationToAnswer(i => f(i.arg[P0](0), i.arg[P1](1))) def functionToAnswer[T: ValueClassExtractor, P2, P1, P0](f: (P0, P1, P2) => T): ScalaAnswer[T] = - invocationToAnswer(i => f(i.getArgument[P0](0), i.getArgument[P1](1), i.getArgument[P2](2))) + invocationToAnswer(i => f(i.arg[P0](0), i.arg[P1](1), i.arg[P2](2))) def functionToAnswer[T: ValueClassExtractor, P3, P2, P1, P0](f: (P0, P1, P2, P3) => T): ScalaAnswer[T] = - invocationToAnswer(i => f(i.getArgument[P0](0), i.getArgument[P1](1), i.getArgument[P2](2), i.getArgument[P3](3))) + invocationToAnswer(i => f(i.arg[P0](0), i.arg[P1](1), i.arg[P2](2), i.arg[P3](3))) def functionToAnswer[T: ValueClassExtractor, P4, P3, P2, P1, P0](f: (P0, P1, P2, P3, P4) => T): ScalaAnswer[T] = - invocationToAnswer(i => f(i.getArgument[P0](0), i.getArgument[P1](1), i.getArgument[P2](2), i.getArgument[P3](3), i.getArgument[P4](4))) + invocationToAnswer(i => f(i.arg[P0](0), i.arg[P1](1), i.arg[P2](2), i.arg[P3](3), i.arg[P4](4))) def functionToAnswer[T: ValueClassExtractor, P5, P4, P3, P2, P1, P0](f: (P0, P1, P2, P3, P4, P5) => T): ScalaAnswer[T] = - invocationToAnswer(i => - f(i.getArgument[P0](0), i.getArgument[P1](1), i.getArgument[P2](2), i.getArgument[P3](3), i.getArgument[P4](4), i.getArgument[P5](5))) + invocationToAnswer(i => f(i.arg[P0](0), i.arg[P1](1), i.arg[P2](2), i.arg[P3](3), i.arg[P4](4), i.arg[P5](5))) def functionToAnswer[T: ValueClassExtractor, P6, P5, P4, P3, P2, P1, P0](f: (P0, P1, P2, P3, P4, P5, P6) => T): ScalaAnswer[T] = - invocationToAnswer( - i => - f(i.getArgument[P0](0), - i.getArgument[P1](1), - i.getArgument[P2](2), - i.getArgument[P3](3), - i.getArgument[P4](4), - i.getArgument[P5](5), - i.getArgument[P6](6))) + invocationToAnswer(i => f(i.arg[P0](0), i.arg[P1](1), i.arg[P2](2), i.arg[P3](3), i.arg[P4](4), i.arg[P5](5), i.arg[P6](6))) def functionToAnswer[T: ValueClassExtractor, P7, P6, P5, P4, P3, P2, P1, P0](f: (P0, P1, P2, P3, P4, P5, P6, P7) => T): ScalaAnswer[T] = + invocationToAnswer(i => f(i.arg[P0](0), i.arg[P1](1), i.arg[P2](2), i.arg[P3](3), i.arg[P4](4), i.arg[P5](5), i.arg[P6](6), i.arg[P7](7))) + + def functionToAnswer[T: ValueClassExtractor, P8, P7, P6, P5, P4, P3, P2, P1, P0](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => T): ScalaAnswer[T] = + invocationToAnswer(i => f(i.arg[P0](0), i.arg[P1](1), i.arg[P2](2), i.arg[P3](3), i.arg[P4](4), i.arg[P5](5), i.arg[P6](6), i.arg[P7](7), i.arg[P8](8))) + + def functionToAnswer[T: ValueClassExtractor, P9, P8, P7, P6, P5, P4, P3, P2, P1, P0](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => T): ScalaAnswer[T] = + invocationToAnswer(i => f(i.arg[P0](0), i.arg[P1](1), i.arg[P2](2), i.arg[P3](3), i.arg[P4](4), i.arg[P5](5), i.arg[P6](6), i.arg[P7](7), i.arg[P8](8), i.arg[P9](9))) + + def functionToAnswer[T: ValueClassExtractor, P10, P9, P8, P7, P6, P5, P4, P3, P2, P1, P0](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T): ScalaAnswer[T] = invocationToAnswer( - i => - f( - i.getArgument[P0](0), - i.getArgument[P1](1), - i.getArgument[P2](2), - i.getArgument[P3](3), - i.getArgument[P4](4), - i.getArgument[P5](5), - i.getArgument[P6](6), - i.getArgument[P7](7) - )) - - def functionToAnswer[T: ValueClassExtractor, P8, P7, P6, P5, P4, P3, P2, P1, P0]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => T): ScalaAnswer[T] = - invocationToAnswer( - i => - f( - i.getArgument[P0](0), - i.getArgument[P1](1), - i.getArgument[P2](2), - i.getArgument[P3](3), - i.getArgument[P4](4), - i.getArgument[P5](5), - i.getArgument[P6](6), - i.getArgument[P7](7), - i.getArgument[P8](8) - )) - - def functionToAnswer[T: ValueClassExtractor, P9, P8, P7, P6, P5, P4, P3, P2, P1, P0]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => T): ScalaAnswer[T] = - invocationToAnswer( - i => - f( - i.getArgument[P0](0), - i.getArgument[P1](1), - i.getArgument[P2](2), - i.getArgument[P3](3), - i.getArgument[P4](4), - i.getArgument[P5](5), - i.getArgument[P6](6), - i.getArgument[P7](7), - i.getArgument[P8](8), - i.getArgument[P9](9) - )) - - def functionToAnswer[T: ValueClassExtractor, P10, P9, P8, P7, P6, P5, P4, P3, P2, P1, P0]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T): ScalaAnswer[T] = - invocationToAnswer( - i => - f( - i.getArgument[P0](0), - i.getArgument[P1](1), - i.getArgument[P2](2), - i.getArgument[P3](3), - i.getArgument[P4](4), - i.getArgument[P5](5), - i.getArgument[P6](6), - i.getArgument[P7](7), - i.getArgument[P8](8), - i.getArgument[P9](9), - i.getArgument[P10](10) - )) + i => f(i.arg[P0](0), i.arg[P1](1), i.arg[P2](2), i.arg[P3](3), i.arg[P4](4), i.arg[P5](5), i.arg[P6](6), i.arg[P7](7), i.arg[P8](8), i.arg[P9](9), i.arg[P10](10))) //Look at org.mockito.internal.invocation.InvocationMatcher#hasSameMethod implicit val JavaMethodEquality: Equality[Method] = new Equality[Method] { diff --git a/common/src/main/scala/org/mockito/stubbing/DefaultAnswer.scala b/common/src/main/scala/org/mockito/stubbing/DefaultAnswer.scala index 48634127..7616b795 100644 --- a/common/src/main/scala/org/mockito/stubbing/DefaultAnswer.scala +++ b/common/src/main/scala/org/mockito/stubbing/DefaultAnswer.scala @@ -38,27 +38,3 @@ class DecoratedAnswer(from: Answer[_]) extends DefaultAnswer { object ReturnsDefaults extends DecoratedAnswer(RETURNS_DEFAULTS) object ReturnsDeepStubs extends DecoratedAnswer(RETURNS_DEEP_STUBS) object CallsRealMethods extends DecoratedAnswer(CALLS_REAL_METHODS) -object ReturnsEmptyValues extends DefaultAnswer { - private val javaEmptyValuesAndPrimitives = new ReturnsMoreEmptyValues - - private[mockito] lazy val emptyValues: Map[Class[_], AnyRef] = Map( - classOf[Option[_]] -> Option.empty, - classOf[List[_]] -> List.empty, - classOf[Set[_]] -> Set.empty, - classOf[Seq[_]] -> Seq.empty, - classOf[Iterable[_]] -> Iterable.empty, - classOf[Traversable[_]] -> Traversable.empty, - classOf[IndexedSeq[_]] -> IndexedSeq.empty, - classOf[Iterator[_]] -> Iterator.empty, - classOf[Stream[_]] -> Stream.empty, - classOf[Vector[_]] -> Vector.empty, - classOf[Try[_]] -> Failure(new MockitoException("Auto stub provided by mockito-scala")), - classOf[Future[_]] -> Future.failed(new MockitoException("Auto stub provided by mockito-scala")), - classOf[BigDecimal] -> BigDecimal(0), - classOf[BigInt] -> BigInt(0), - classOf[StringBuilder] -> StringBuilder.newBuilder - ) - - override def apply(invocation: InvocationOnMock): Option[Any] = - Option(javaEmptyValuesAndPrimitives.answer(invocation)).orElse(emptyValues.get(invocation.getMethod.getReturnType)) -} diff --git a/common/src/main/scala/org/mockito/stubbing/ReturnsSmartNulls.scala b/common/src/main/scala/org/mockito/stubbing/ReturnsSmartNulls.scala index 6bcc769d..b4376d62 100644 --- a/common/src/main/scala/org/mockito/stubbing/ReturnsSmartNulls.scala +++ b/common/src/main/scala/org/mockito/stubbing/ReturnsSmartNulls.scala @@ -1,8 +1,8 @@ -package org.mockito.stubbing +package org.mockito +package stubbing import java.lang.reflect.Modifier.isFinal import org.mockito.Mockito.{ mock, withSettings } -import org.mockito.ReflectionUtils._ import org.mockito.internal.debugging.LocationImpl import org.mockito.internal.exceptions.Reporter.smartNullPointerException import org.mockito.internal.stubbing.defaultanswers.ReturnsMoreEmptyValues diff --git a/common/src/main/scala/org/mockito/stubbing/ScalaBaseStubbing.scala b/common/src/main/scala/org/mockito/stubbing/ScalaBaseStubbing.scala index a48683cc..c0fa63a1 100644 --- a/common/src/main/scala/org/mockito/stubbing/ScalaBaseStubbing.scala +++ b/common/src/main/scala/org/mockito/stubbing/ScalaBaseStubbing.scala @@ -49,11 +49,9 @@ abstract class ScalaBaseStubbing[T: ValueClassExtractor] { delegate thenAnswer functionToAnswer(f) protected def _thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => T): ScalaOngoingStubbing[T] = delegate thenAnswer functionToAnswer(f) - protected def _thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => T): ScalaOngoingStubbing[T] = + protected def _thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => T): ScalaOngoingStubbing[T] = delegate thenAnswer functionToAnswer(f) - protected def _thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T): ScalaOngoingStubbing[T] = + protected def _thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T): ScalaOngoingStubbing[T] = delegate thenAnswer functionToAnswer(f) /** diff --git a/common/src/main/scala/org/mockito/stubbing/ScalaFirstStubbing.scala b/common/src/main/scala/org/mockito/stubbing/ScalaFirstStubbing.scala index b2bcbfc6..e929ecc1 100644 --- a/common/src/main/scala/org/mockito/stubbing/ScalaFirstStubbing.scala +++ b/common/src/main/scala/org/mockito/stubbing/ScalaFirstStubbing.scala @@ -132,6 +132,5 @@ case class ScalaFirstStubbing[T: ValueClassExtractor](delegate: OngoingStubbing[ def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => T): ScalaOngoingStubbing[T] = _thenAnswer(f) def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => T): ScalaOngoingStubbing[T] = _thenAnswer(f) - def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T): ScalaOngoingStubbing[T] = _thenAnswer(f) + def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T): ScalaOngoingStubbing[T] = _thenAnswer(f) } diff --git a/common/src/main/scala/org/mockito/stubbing/ScalaOngoingStubbing.scala b/common/src/main/scala/org/mockito/stubbing/ScalaOngoingStubbing.scala index 2eb8caa4..5cbdf7b9 100644 --- a/common/src/main/scala/org/mockito/stubbing/ScalaOngoingStubbing.scala +++ b/common/src/main/scala/org/mockito/stubbing/ScalaOngoingStubbing.scala @@ -117,6 +117,5 @@ case class ScalaOngoingStubbing[T: ValueClassExtractor](delegate: OngoingStubbin _thenAnswer(f) def andThenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => T): ScalaOngoingStubbing[T] = _thenAnswer(f) - def andThenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T): ScalaOngoingStubbing[T] = _thenAnswer(f) + def andThenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T): ScalaOngoingStubbing[T] = _thenAnswer(f) } diff --git a/core/src/main/scala/org/mockito/IdiomaticMockitoBase.scala b/core/src/main/scala/org/mockito/IdiomaticMockitoBase.scala index fab2106b..e2895d8d 100644 --- a/core/src/main/scala/org/mockito/IdiomaticMockitoBase.scala +++ b/core/src/main/scala/org/mockito/IdiomaticMockitoBase.scala @@ -36,6 +36,9 @@ object IdiomaticMockitoBase { def within(d: Duration): ScalaVerificationMode = new ScalaVerificationMode { override def verificationMode: VerificationMode = Mockito.timeout(d.toMillis).times(times) } + def after(d: Duration): ScalaVerificationMode = new ScalaVerificationMode { + override def verificationMode: VerificationMode = Mockito.after(d.toMillis).times(times) + } } //Helper methods for the specs2 macro @@ -52,10 +55,16 @@ object IdiomaticMockitoBase { def within(d: Duration): ScalaVerificationMode = new ScalaVerificationMode { override def verificationMode: VerificationMode = Mockito.timeout(d.toMillis).atLeast(times) } + def after(d: Duration): ScalaVerificationMode = new ScalaVerificationMode { + override def verificationMode: VerificationMode = Mockito.after(d.toMillis).atLeast(times) + } } case class AtMost(times: Int) extends ScalaVerificationMode { override def verificationMode: VerificationMode = Mockito.atMost(times) + def after(d: Duration): ScalaVerificationMode = new ScalaVerificationMode { + override def verificationMode: VerificationMode = Mockito.after(d.toMillis).atMost(times) + } } object OnlyOn extends ScalaVerificationMode { @@ -63,6 +72,9 @@ object IdiomaticMockitoBase { def within(d: Duration): ScalaVerificationMode = new ScalaVerificationMode { override def verificationMode: VerificationMode = Mockito.timeout(d.toMillis).only } + def after(d: Duration): ScalaVerificationMode = new ScalaVerificationMode { + override def verificationMode: VerificationMode = Mockito.after(d.toMillis).only + } } class ReturnActions[T](os: ScalaFirstStubbing[T]) { diff --git a/core/src/main/scala/org/mockito/MockitoScalaSession.scala b/core/src/main/scala/org/mockito/MockitoScalaSession.scala index d58f41db..21988fa3 100644 --- a/core/src/main/scala/org/mockito/MockitoScalaSession.scala +++ b/core/src/main/scala/org/mockito/MockitoScalaSession.scala @@ -54,9 +54,7 @@ class MockitoScalaSession(name: String, strictness: Strictness, logger: MockitoS } object MockitoScalaSession { - def apply(name: String = "", - strictness: Strictness = Strictness.StrictStubs, - logger: MockitoSessionLogger = MockitoScalaLogger): MockitoScalaSession = + def apply(name: String = "", strictness: Strictness = Strictness.StrictStubs, logger: MockitoSessionLogger = MockitoScalaLogger): MockitoScalaSession = new MockitoScalaSession(name, strictness, logger) trait Reporter { diff --git a/core/src/main/scala/org/mockito/integrations/scalatest/IdiomaticMockitoFixture.scala b/core/src/main/scala/org/mockito/integrations/scalatest/IdiomaticMockitoFixture.scala index 407c9e75..486f840a 100644 --- a/core/src/main/scala/org/mockito/integrations/scalatest/IdiomaticMockitoFixture.scala +++ b/core/src/main/scala/org/mockito/integrations/scalatest/IdiomaticMockitoFixture.scala @@ -8,7 +8,5 @@ import org.mockito._ * Just mix-in after your favourite suite, i.e. {{{class MyTest extends WordSpec with IdiomaticMockitoFixture}}} * */ -@deprecated( - "Please use org.mockito.scalatest.IdiomaticMockito or org.mockito.scalatest.AsyncIdiomaticMockito from the mockito-scala-scalatest module", - "1.3.0") +@deprecated("Please use org.mockito.scalatest.IdiomaticMockito or org.mockito.scalatest.AsyncIdiomaticMockito from the mockito-scala-scalatest module", "1.3.0") trait IdiomaticMockitoFixture extends MockitoSessionFixture with IdiomaticMockito with ArgumentMatchersSugar diff --git a/core/src/main/scala/org/mockito/integrations/scalatest/MockitoFixture.scala b/core/src/main/scala/org/mockito/integrations/scalatest/MockitoFixture.scala index 68161e16..f53f91c6 100644 --- a/core/src/main/scala/org/mockito/integrations/scalatest/MockitoFixture.scala +++ b/core/src/main/scala/org/mockito/integrations/scalatest/MockitoFixture.scala @@ -8,7 +8,5 @@ import org.mockito._ * Just mix-in after your favourite suite, i.e. {{{class MyTest extends WordSpec with MockitoFixture}}} * */ -@deprecated( - "Please use org.mockito.scalatest.MockitoSugar or org.mockito.scalatest.AsyncMockitoSugar from the mockito-scala-scalatest module", - "1.3.0") +@deprecated("Please use org.mockito.scalatest.MockitoSugar or org.mockito.scalatest.AsyncMockitoSugar from the mockito-scala-scalatest module", "1.3.0") trait MockitoFixture extends MockitoSessionFixture with MockitoSugar with ArgumentMatchersSugar diff --git a/macro/src/main/scala/org/mockito/DoSomethingMacro.scala b/macro/src/main/scala/org/mockito/DoSomethingMacro.scala index 08e22e0e..ad3e95de 100644 --- a/macro/src/main/scala/org/mockito/DoSomethingMacro.scala +++ b/macro/src/main/scala/org/mockito/DoSomethingMacro.scala @@ -30,13 +30,11 @@ object DoSomethingMacro { val r = c.Expr[S] { c.macroApplication match { - case q"$_.$cls[$_]($v).willBe($_.returnedF).by[$f, $s]($obj.$method[..$targs](...$args))(..$_)" - if cls.toString.startsWith("DoSomethingOps") => + case q"$_.$cls[$_]($v).willBe($_.returnedF).by[$f, $s]($obj.$method[..$targs](...$args))(..$_)" if cls.toString.startsWith("DoSomethingOps") => val newArgs = args.map(a => transformArgs(c)(a)) q"_root_.org.mockito.${packageName(c)(cls)}.${className(c)(cls, "Mockito")}.doReturnF[$f, $s]($v)($F).when($obj).$method[..$targs](...$newArgs)" - case q"$_.$cls[$_]($v).willBe($_.returnedF).by[$f, $s]($obj.$method[..$targs])(..$_)" - if cls.toString.startsWith("DoSomethingOps") => + case q"$_.$cls[$_]($v).willBe($_.returnedF).by[$f, $s]($obj.$method[..$targs])(..$_)" if cls.toString.startsWith("DoSomethingOps") => q"_root_.org.mockito.${packageName(c)(cls)}.${className(c)(cls, "Mockito")}.doReturnF[$f, $s]($v)($F).when($obj).$method[..$targs]" case o => throw new Exception(s"Couldn't recognize ${show(o)}") @@ -51,13 +49,11 @@ object DoSomethingMacro { val r = c.Expr[S] { c.macroApplication match { - case q"$_.$cls[$_]($v).willBe($_.returnedFG).by[$f, $g, $s]($obj.$method[..$targs](...$args))(..$_)" - if cls.toString.startsWith("DoSomethingOps") => + case q"$_.$cls[$_]($v).willBe($_.returnedFG).by[$f, $g, $s]($obj.$method[..$targs](...$args))(..$_)" if cls.toString.startsWith("DoSomethingOps") => val newArgs = args.map(a => transformArgs(c)(a)) q"_root_.org.mockito.${packageName(c)(cls)}.${className(c)(cls, "Mockito")}.doReturnFG[$f, $g, $s]($v)($F, $G).when($obj).$method[..$targs](...$newArgs)" - case q"$_.$cls[$_]($v).willBe($_.returnedFG).by[$f, $g, $s]($obj.$method[..$targs])(..$_)" - if cls.toString.startsWith("DoSomethingOps") => + case q"$_.$cls[$_]($v).willBe($_.returnedFG).by[$f, $g, $s]($obj.$method[..$targs])(..$_)" if cls.toString.startsWith("DoSomethingOps") => q"_root_.org.mockito.${packageName(c)(cls)}.${className(c)(cls, "Mockito")}.doReturnFG[$f, $g, $s]($v)($F, $G).when($obj).$method[..$targs]" case o => throw new Exception(s"Couldn't recognize ${show(o)}") @@ -72,8 +68,7 @@ object DoSomethingMacro { val r = c.Expr[S] { c.macroApplication match { - case q"$_.$cls[..$_]($v).willBe($_.answered).by[$_]($obj.$method[..$targs](...$args))($_)" - if cls.toString.startsWith("DoSomethingOps") => + case q"$_.$cls[..$_]($v).willBe($_.answered).by[$_]($obj.$method[..$targs](...$args))($_)" if cls.toString.startsWith("DoSomethingOps") => val newArgs = args.map(a => transformArgs(c)(a)) q"_root_.org.mockito.MockitoSugar.doAnswer($v).when($obj).$method[..$targs](...$newArgs)" @@ -92,13 +87,11 @@ object DoSomethingMacro { val r = c.Expr[S] { c.macroApplication match { - case q"$_.$cls[..$ftargs]($v).willBe($_.answeredF).by[$f, $_]($obj.$method[..$targs](...$args))(..$_)" - if cls.toString.startsWith("DoSomethingOps") => + case q"$_.$cls[..$ftargs]($v).willBe($_.answeredF).by[$f, $_]($obj.$method[..$targs](...$args))(..$_)" if cls.toString.startsWith("DoSomethingOps") => val newArgs = args.map(a => transformArgs(c)(a)) q"_root_.org.mockito.${packageName(c)(cls)}.${className(c)(cls, "Mockito")}.doAnswerF[$f, ..$ftargs]($v).when($obj).$method[..$targs](...$newArgs)" - case q"$_.$cls[..$ftargs]($v).willBe($_.answeredF).by[$f, $_]($obj.$method[..$targs])(..$_)" - if cls.toString.startsWith("DoSomethingOps") => + case q"$_.$cls[..$ftargs]($v).willBe($_.answeredF).by[$f, $_]($obj.$method[..$targs])(..$_)" if cls.toString.startsWith("DoSomethingOps") => q"_root_.org.mockito.${packageName(c)(cls)}.${className(c)(cls, "Mockito")}.doAnswerF[$f, ..$ftargs]($v).when($obj).$method[..$targs]" case o => throw new Exception(s"Couldn't recognize ${show(o)}") @@ -113,13 +106,11 @@ object DoSomethingMacro { val r = c.Expr[S] { c.macroApplication match { - case q"$_.$cls[..$ftargs]($v).willBe($_.answeredFG).by[$f, $g, $_]($obj.$method[..$targs](...$args))(..$_)" - if cls.toString.startsWith("DoSomethingOps") => + case q"$_.$cls[..$ftargs]($v).willBe($_.answeredFG).by[$f, $g, $_]($obj.$method[..$targs](...$args))(..$_)" if cls.toString.startsWith("DoSomethingOps") => val newArgs = args.map(a => transformArgs(c)(a)) q"_root_.org.mockito.${packageName(c)(cls)}.${className(c)(cls, "Mockito")}.doAnswerFG[$f, $g, ..$ftargs]($v).when($obj).$method[..$targs](...$newArgs)" - case q"$_.$cls[..$ftargs]($v).willBe($_.answeredFG).by[$f, $g, $_]($obj.$method[..$targs])(..$_)" - if cls.toString.startsWith("DoSomethingOps") => + case q"$_.$cls[..$ftargs]($v).willBe($_.answeredFG).by[$f, $g, $_]($obj.$method[..$targs])(..$_)" if cls.toString.startsWith("DoSomethingOps") => q"_root_.org.mockito.${packageName(c)(cls)}.${className(c)(cls, "Mockito")}.doAnswerFG[$f, $g, ..$ftargs]($v).when($obj).$method[..$targs]" case o => throw new Exception(s"Couldn't recognize answeredFG ${show(o)}") @@ -153,8 +144,7 @@ object DoSomethingMacro { val r = c.Expr[T] { c.macroApplication match { - case q"$_.$cls[$e]($v).willBe($_.raised).by[$f, $t]($obj.$method[..$targs](...$args))(..$_)" - if cls.toString.startsWith("DoSomethingOps") => + case q"$_.$cls[$e]($v).willBe($_.raised).by[$f, $t]($obj.$method[..$targs](...$args))(..$_)" if cls.toString.startsWith("DoSomethingOps") => val newArgs = args.map(a => transformArgs(c)(a)) q"_root_.org.mockito.${packageName(c)(cls)}.${className(c)(cls, "Mockito")}.doFailWith[$f, $e, $t]($v)($F).when($obj).$method[..$targs](...$newArgs)" @@ -173,13 +163,11 @@ object DoSomethingMacro { val r = c.Expr[T] { c.macroApplication match { - case q"$_.$cls[$e]($v).willBe($_.raisedG).by[$f, $g, $t]($obj.$method[..$targs](...$args))(..$_)" - if cls.toString.startsWith("DoSomethingOps") => + case q"$_.$cls[$e]($v).willBe($_.raisedG).by[$f, $g, $t]($obj.$method[..$targs](...$args))(..$_)" if cls.toString.startsWith("DoSomethingOps") => val newArgs = args.map(a => transformArgs(c)(a)) q"_root_.org.mockito.${packageName(c)(cls)}.${className(c)(cls, "Mockito")}.doFailWithG[$f, $g, $e, $t]($v)($F, $G).when($obj).$method[..$targs](...$newArgs)" - case q"$_.$cls[$e]($v).willBe($_.raisedG).by[$f, $g, $t]($obj.$method[..$targs])(..$_)" - if cls.toString.startsWith("DoSomethingOps") => + case q"$_.$cls[$e]($v).willBe($_.raisedG).by[$f, $g, $t]($obj.$method[..$targs])(..$_)" if cls.toString.startsWith("DoSomethingOps") => q"_root_.org.mockito.${packageName(c)(cls)}.${className(c)(cls, "Mockito")}.doFailWithG[$f, $g, $e, $t]($v)($F, $G).when($obj).$method[..$targs]" case o => throw new Exception(s"Couldn't recognize ${show(o)}") diff --git a/macro/src/main/scala/org/mockito/WhenMacro.scala b/macro/src/main/scala/org/mockito/WhenMacro.scala index 4965c607..8e5c28ff 100644 --- a/macro/src/main/scala/org/mockito/WhenMacro.scala +++ b/macro/src/main/scala/org/mockito/WhenMacro.scala @@ -22,22 +22,18 @@ object WhenMacro { case q"$_.StubbingOps[$t]($obj.$method[..$targs]).$m" if ShouldReturnOptions.contains(m.toString) => q"new _root_.org.mockito.IdiomaticMockitoBase.ReturnActions(_root_.org.mockito.Mockito.when[$t]($obj.$method[..$targs]))" - case q"$_.$cls[..$_]($obj.$method[..$targs](...$args)).$m" - if cls.toString.startsWith("StubbingOps") && FunctionalShouldReturnOptions.contains(m.toString) => + case q"$_.$cls[..$_]($obj.$method[..$targs](...$args)).$m" if cls.toString.startsWith("StubbingOps") && FunctionalShouldReturnOptions.contains(m.toString) => val newArgs = args.map(a => transformArgs(c)(a)) q"new _root_.org.mockito.${packageName(c)(cls)}.${className(c)(cls, "IdiomaticMockito")}.ReturnActions(_root_.org.mockito.Mockito.when($obj.$method[..$targs](...$newArgs)))" - case q"$_.$cls[..$_]($obj.$method[..$targs]).$m" - if cls.toString.startsWith("StubbingOps") && FunctionalShouldReturnOptions.contains(m.toString) => + case q"$_.$cls[..$_]($obj.$method[..$targs]).$m" if cls.toString.startsWith("StubbingOps") && FunctionalShouldReturnOptions.contains(m.toString) => q"new _root_.org.mockito.${packageName(c)(cls)}.${className(c)(cls, "IdiomaticMockito")}.ReturnActions(_root_.org.mockito.Mockito.when($obj.$method[..$targs]))" - case q"$_.$cls[..$_]($obj.$method[..$targs](...$args)).$m" - if cls.toString.startsWith("StubbingOps2") && FunctionalShouldReturnOptions2.contains(m.toString) => + case q"$_.$cls[..$_]($obj.$method[..$targs](...$args)).$m" if cls.toString.startsWith("StubbingOps2") && FunctionalShouldReturnOptions2.contains(m.toString) => val newArgs = args.map(a => transformArgs(c)(a)) q"new _root_.org.mockito.${packageName(c)(cls)}.${className(c)(cls, "IdiomaticMockito")}.ReturnActions2(_root_.org.mockito.Mockito.when($obj.$method[..$targs](...$newArgs)))" - case q"$_.$cls[..$_]($obj.$method[..$targs]).$m" - if cls.toString.startsWith("StubbingOps2") && FunctionalShouldReturnOptions2.contains(m.toString) => + case q"$_.$cls[..$_]($obj.$method[..$targs]).$m" if cls.toString.startsWith("StubbingOps2") && FunctionalShouldReturnOptions2.contains(m.toString) => q"new _root_.org.mockito.${packageName(c)(cls)}.${className(c)(cls, "IdiomaticMockito")}.ReturnActions2(_root_.org.mockito.Mockito.when($obj.$method[..$targs]))" case o => throw new Exception(s"Couldn't recognize ${show(o)}") @@ -103,22 +99,18 @@ object WhenMacro { case q"$_.StubbingOps[$t]($obj.$method[..$targs]).$m" if ShouldThrowOptions.contains(m.toString) => q"new _root_.org.mockito.IdiomaticMockitoBase.ThrowActions(_root_.org.mockito.Mockito.when[$t]($obj.$method[..$targs]))" - case q"$_.$cls[..$_]($obj.$method[..$targs](...$args)).$m" - if cls.toString.startsWith("StubbingOps") && FunctionalShouldFailOptions.contains(m.toString) => + case q"$_.$cls[..$_]($obj.$method[..$targs](...$args)).$m" if cls.toString.startsWith("StubbingOps") && FunctionalShouldFailOptions.contains(m.toString) => val newArgs = args.map(a => transformArgs(c)(a)) q"new _root_.org.mockito.${packageName(c)(cls)}.${className(c)(cls, "IdiomaticMockito")}.ThrowActions(_root_.org.mockito.Mockito.when($obj.$method[..$targs](...$newArgs)))" - case q"$_.$cls[..$_]($obj.$method[..$targs]).$m" - if cls.toString.startsWith("StubbingOps") && FunctionalShouldFailOptions.contains(m.toString) => + case q"$_.$cls[..$_]($obj.$method[..$targs]).$m" if cls.toString.startsWith("StubbingOps") && FunctionalShouldFailOptions.contains(m.toString) => q"new _root_.org.mockito.${packageName(c)(cls)}.${className(c)(cls, "IdiomaticMockito")}.ThrowActions(_root_.org.mockito.Mockito.when($obj.$method[..$targs]))" - case q"$_.$cls[..$_]($obj.$method[..$targs](...$args)).$m" - if cls.toString.startsWith("StubbingOps2") && FunctionalShouldFailOptions2.contains(m.toString) => + case q"$_.$cls[..$_]($obj.$method[..$targs](...$args)).$m" if cls.toString.startsWith("StubbingOps2") && FunctionalShouldFailOptions2.contains(m.toString) => val newArgs = args.map(a => transformArgs(c)(a)) q"new _root_.org.mockito.${packageName(c)(cls)}.${className(c)(cls, "IdiomaticMockito")}.ThrowActions2(_root_.org.mockito.Mockito.when($obj.$method[..$targs](...$newArgs)))" - case q"$_.$cls[..$_]($obj.$method[..$targs]).$m" - if cls.toString.startsWith("StubbingOps2") && FunctionalShouldFailOptions2.contains(m.toString) => + case q"$_.$cls[..$_]($obj.$method[..$targs]).$m" if cls.toString.startsWith("StubbingOps2") && FunctionalShouldFailOptions2.contains(m.toString) => q"new _root_.org.mockito.${packageName(c)(cls)}.${className(c)(cls, "IdiomaticMockito")}.ThrowActions2(_root_.org.mockito.Mockito.when($obj.$method[..$targs]))" case o => throw new Exception(s"Couldn't recognize ${show(o)}") @@ -170,22 +162,18 @@ object WhenMacro { case q"$_.StubbingOps[$t]($obj.$method[..$targs]).$m" if ShouldAnswerOptions.contains(m.toString) => q"new _root_.org.mockito.WhenMacro.AnswerActions(_root_.org.mockito.Mockito.when[$t]($obj.$method[..$targs]))" - case q"$_.$cls[..$_]($obj.$method[..$targs](...$args)).$m" - if cls.toString.startsWith("StubbingOps") && FunctionalShouldAnswerOptions.contains(m.toString) => + case q"$_.$cls[..$_]($obj.$method[..$targs](...$args)).$m" if cls.toString.startsWith("StubbingOps") && FunctionalShouldAnswerOptions.contains(m.toString) => val newArgs = args.map(a => transformArgs(c)(a)) q"new _root_.org.mockito.${packageName(c)(cls)}.${className(c)(cls, "IdiomaticMockito")}.AnswerActions(_root_.org.mockito.Mockito.when($obj.$method[..$targs](...$newArgs)))" - case q"$_.$cls[..$_]($obj.$method[..$targs]).$m" - if cls.toString.startsWith("StubbingOps") && FunctionalShouldAnswerOptions.contains(m.toString) => + case q"$_.$cls[..$_]($obj.$method[..$targs]).$m" if cls.toString.startsWith("StubbingOps") && FunctionalShouldAnswerOptions.contains(m.toString) => q"new _root_.org.mockito.${packageName(c)(cls)}.${className(c)(cls, "IdiomaticMockito")}.AnswerActions(_root_.org.mockito.Mockito.when($obj.$method[..$targs]))" - case q"$_.$cls[..$_]($obj.$method[..$targs](...$args)).$m" - if cls.toString.startsWith("StubbingOps2") && FunctionalShouldAnswerOptions2.contains(m.toString) => + case q"$_.$cls[..$_]($obj.$method[..$targs](...$args)).$m" if cls.toString.startsWith("StubbingOps2") && FunctionalShouldAnswerOptions2.contains(m.toString) => val newArgs = args.map(a => transformArgs(c)(a)) q"new _root_.org.mockito.${packageName(c)(cls)}.${className(c)(cls, "IdiomaticMockito")}.AnswerActions2(_root_.org.mockito.Mockito.when($obj.$method[..$targs](...$newArgs)))" - case q"$_.$cls[..$_]($obj.$method[..$targs]).$m" - if cls.toString.startsWith("StubbingOps2") && FunctionalShouldAnswerOptions2.contains(m.toString) => + case q"$_.$cls[..$_]($obj.$method[..$targs]).$m" if cls.toString.startsWith("StubbingOps2") && FunctionalShouldAnswerOptions2.contains(m.toString) => q"new _root_.org.mockito.${packageName(c)(cls)}.${className(c)(cls, "IdiomaticMockito")}.AnswerActions2(_root_.org.mockito.Mockito.when($obj.$method[..$targs]))" case o => throw new Exception(s"Couldn't recognize ${show(o)}") diff --git a/scalatest/src/test/scala-2.11/user/org/mockito/stubbing/ReturnsEmptyValuesTest.scala b/scalatest/src/test/scala-2.11/user/org/mockito/stubbing/ReturnsEmptyValuesTest.scala new file mode 100644 index 00000000..c8b41f03 --- /dev/null +++ b/scalatest/src/test/scala-2.11/user/org/mockito/stubbing/ReturnsEmptyValuesTest.scala @@ -0,0 +1,80 @@ +package user.org.mockito.stubbing + +import org.mockito.exceptions.base.MockitoException +import org.mockito.{ DefaultAnswers, IdiomaticMockito } +import org.scalatest.concurrent.ScalaFutures +import org.scalatest.{ Matchers, OptionValues, TryValues, WordSpec } +import user.org.mockito.stubbing.DefaultAnswerTest._ + +import scala.collection.mutable +import scala.collection.mutable.ListBuffer +import scala.concurrent.Future +import scala.util.{ Success, Try } + +class ReturnsEmptyValuesTest extends WordSpec with Matchers with IdiomaticMockito with TryValues with OptionValues with ScalaFutures { + + class KnownTypes { + def returnsOption: Option[String] = Some("not mocked!") + def returnsList: List[String] = List("not mocked!") + def returnsSet: Set[String] = Set("not mocked!") + def returnsSeq: Seq[String] = Seq("not mocked!") + def returnsIterable: Iterable[String] = Iterable("not mocked!") + def returnsTraversable: Traversable[String] = Traversable("not mocked!") + def returnsIndexedSeq: IndexedSeq[String] = IndexedSeq("not mocked!") + def returnsIterator: Iterator[String] = Iterator("not mocked!") + def returnsStream: Stream[String] = Stream("not mocked!") + def returnsVector: Vector[String] = Vector("not mocked!") + def returnsEither: Either[Boolean, String] = Right("not mocked!") + def returnsTry: Try[String] = Success("not mocked!") + def returnsFuture: Future[String] = Future.successful("not mocked!") + def returnsBigDecimal: BigDecimal = BigDecimal(42) + def returnsBigInt: BigInt = BigInt(42) + def returnsStringBuilder: StringBuilder = StringBuilder.newBuilder.append("not mocked!") + def returnsMap: Map[String, Int] = Map("not mocked!" -> 42) + def returnsMutableSeq: mutable.Seq[String] = ListBuffer("not mocked!") + def returnsListBuffer: ListBuffer[String] = ListBuffer("not mocked!") + def returnsMutableSet: mutable.Set[String] = mutable.HashSet("not mocked!") + } + + "ReturnsEmptyValues" should { + "return a default value for primitives" in { + val primitives = mock[Primitives](DefaultAnswers.ReturnsEmptyValues) + + primitives.barByte shouldBe 0.toByte + primitives.barBoolean shouldBe false + primitives.barChar shouldBe 0 + primitives.barDouble shouldBe 0 + primitives.barInt shouldBe 0 + primitives.barFloat shouldBe 0 + primitives.barShort shouldBe 0 + primitives.barLong shouldBe 0 + } + + "return the empty values for known classes" in { + val aMock = mock[KnownTypes](DefaultAnswers.ReturnsEmptyValues) + + aMock.returnsOption shouldBe None + aMock.returnsList shouldBe List.empty + aMock.returnsSet shouldBe Set.empty + aMock.returnsSeq shouldBe Seq.empty + aMock.returnsIterable shouldBe Iterable.empty + aMock.returnsTraversable shouldBe Traversable.empty + aMock.returnsIndexedSeq shouldBe IndexedSeq.empty + aMock.returnsIterator shouldBe Iterator.empty + aMock.returnsStream shouldBe Stream.empty + aMock.returnsVector shouldBe Vector.empty + aMock.returnsTry.failure.exception shouldBe a[MockitoException] + aMock.returnsTry.failure.exception.getMessage shouldBe "Auto stub provided by mockito-scala" + aMock.returnsFuture.failed.value.value.success.value shouldBe a[MockitoException] + aMock.returnsFuture.failed.value.value.success.value.getMessage shouldBe "Auto stub provided by mockito-scala" + aMock.returnsBigDecimal shouldBe BigDecimal(0) + aMock.returnsBigInt shouldBe BigInt(0) + aMock.returnsStringBuilder shouldBe new StringBuilder + aMock.returnsEither shouldBe Left("Auto stub provided by mockito-scala") + aMock.returnsMap shouldBe Map.empty + aMock.returnsMutableSeq shouldBe ListBuffer.empty + aMock.returnsListBuffer shouldBe ListBuffer.empty + aMock.returnsMutableSet shouldBe mutable.HashSet.empty + } + } +} diff --git a/scalatest/src/test/scala-2.12/user/org/mockito/MockitoSugarTest_212.scala b/scalatest/src/test/scala-2.12/user/org/mockito/MockitoSugarTest_212.scala index 56d7ccfc..9b731c8d 100644 --- a/scalatest/src/test/scala-2.12/user/org/mockito/MockitoSugarTest_212.scala +++ b/scalatest/src/test/scala-2.12/user/org/mockito/MockitoSugarTest_212.scala @@ -9,13 +9,7 @@ import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future //noinspection RedundantDefaultArgument -class MockitoSugarTest_212 - extends WordSpec - with MockitoSugar - with Matchers - with ArgumentMatchersSugar - with TableDrivenPropertyChecks - with ScalaFutures { +class MockitoSugarTest_212 extends WordSpec with MockitoSugar with Matchers with ArgumentMatchersSugar with TableDrivenPropertyChecks with ScalaFutures { val scenarios = Table( ("testDouble", "foo", "baz"), diff --git a/scalatest/src/test/scala-2.12/user/org/mockito/stubbing/ReturnsEmptyValuesTest.scala b/scalatest/src/test/scala-2.12/user/org/mockito/stubbing/ReturnsEmptyValuesTest.scala new file mode 100644 index 00000000..c8b41f03 --- /dev/null +++ b/scalatest/src/test/scala-2.12/user/org/mockito/stubbing/ReturnsEmptyValuesTest.scala @@ -0,0 +1,80 @@ +package user.org.mockito.stubbing + +import org.mockito.exceptions.base.MockitoException +import org.mockito.{ DefaultAnswers, IdiomaticMockito } +import org.scalatest.concurrent.ScalaFutures +import org.scalatest.{ Matchers, OptionValues, TryValues, WordSpec } +import user.org.mockito.stubbing.DefaultAnswerTest._ + +import scala.collection.mutable +import scala.collection.mutable.ListBuffer +import scala.concurrent.Future +import scala.util.{ Success, Try } + +class ReturnsEmptyValuesTest extends WordSpec with Matchers with IdiomaticMockito with TryValues with OptionValues with ScalaFutures { + + class KnownTypes { + def returnsOption: Option[String] = Some("not mocked!") + def returnsList: List[String] = List("not mocked!") + def returnsSet: Set[String] = Set("not mocked!") + def returnsSeq: Seq[String] = Seq("not mocked!") + def returnsIterable: Iterable[String] = Iterable("not mocked!") + def returnsTraversable: Traversable[String] = Traversable("not mocked!") + def returnsIndexedSeq: IndexedSeq[String] = IndexedSeq("not mocked!") + def returnsIterator: Iterator[String] = Iterator("not mocked!") + def returnsStream: Stream[String] = Stream("not mocked!") + def returnsVector: Vector[String] = Vector("not mocked!") + def returnsEither: Either[Boolean, String] = Right("not mocked!") + def returnsTry: Try[String] = Success("not mocked!") + def returnsFuture: Future[String] = Future.successful("not mocked!") + def returnsBigDecimal: BigDecimal = BigDecimal(42) + def returnsBigInt: BigInt = BigInt(42) + def returnsStringBuilder: StringBuilder = StringBuilder.newBuilder.append("not mocked!") + def returnsMap: Map[String, Int] = Map("not mocked!" -> 42) + def returnsMutableSeq: mutable.Seq[String] = ListBuffer("not mocked!") + def returnsListBuffer: ListBuffer[String] = ListBuffer("not mocked!") + def returnsMutableSet: mutable.Set[String] = mutable.HashSet("not mocked!") + } + + "ReturnsEmptyValues" should { + "return a default value for primitives" in { + val primitives = mock[Primitives](DefaultAnswers.ReturnsEmptyValues) + + primitives.barByte shouldBe 0.toByte + primitives.barBoolean shouldBe false + primitives.barChar shouldBe 0 + primitives.barDouble shouldBe 0 + primitives.barInt shouldBe 0 + primitives.barFloat shouldBe 0 + primitives.barShort shouldBe 0 + primitives.barLong shouldBe 0 + } + + "return the empty values for known classes" in { + val aMock = mock[KnownTypes](DefaultAnswers.ReturnsEmptyValues) + + aMock.returnsOption shouldBe None + aMock.returnsList shouldBe List.empty + aMock.returnsSet shouldBe Set.empty + aMock.returnsSeq shouldBe Seq.empty + aMock.returnsIterable shouldBe Iterable.empty + aMock.returnsTraversable shouldBe Traversable.empty + aMock.returnsIndexedSeq shouldBe IndexedSeq.empty + aMock.returnsIterator shouldBe Iterator.empty + aMock.returnsStream shouldBe Stream.empty + aMock.returnsVector shouldBe Vector.empty + aMock.returnsTry.failure.exception shouldBe a[MockitoException] + aMock.returnsTry.failure.exception.getMessage shouldBe "Auto stub provided by mockito-scala" + aMock.returnsFuture.failed.value.value.success.value shouldBe a[MockitoException] + aMock.returnsFuture.failed.value.value.success.value.getMessage shouldBe "Auto stub provided by mockito-scala" + aMock.returnsBigDecimal shouldBe BigDecimal(0) + aMock.returnsBigInt shouldBe BigInt(0) + aMock.returnsStringBuilder shouldBe new StringBuilder + aMock.returnsEither shouldBe Left("Auto stub provided by mockito-scala") + aMock.returnsMap shouldBe Map.empty + aMock.returnsMutableSeq shouldBe ListBuffer.empty + aMock.returnsListBuffer shouldBe ListBuffer.empty + aMock.returnsMutableSet shouldBe mutable.HashSet.empty + } + } +} diff --git a/scalatest/src/test/scala-2.13/user/org/mockito/MockitoSugarTest_213.scala b/scalatest/src/test/scala-2.13/user/org/mockito/MockitoSugarTest_213.scala index 5eb74c1f..97fac0bf 100644 --- a/scalatest/src/test/scala-2.13/user/org/mockito/MockitoSugarTest_213.scala +++ b/scalatest/src/test/scala-2.13/user/org/mockito/MockitoSugarTest_213.scala @@ -9,13 +9,7 @@ import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future //noinspection RedundantDefaultArgument -class MockitoSugarTest_213 - extends WordSpec - with MockitoSugar - with Matchers - with ArgumentMatchersSugar - with TableDrivenPropertyChecks - with ScalaFutures { +class MockitoSugarTest_213 extends WordSpec with MockitoSugar with Matchers with ArgumentMatchersSugar with TableDrivenPropertyChecks with ScalaFutures { val scenarios = Table( ("testDouble", "foo", "baz"), diff --git a/scalatest/src/test/scala-2.13/user/org/mockito/stubbing/ReturnsEmptyValuesTest.scala b/scalatest/src/test/scala-2.13/user/org/mockito/stubbing/ReturnsEmptyValuesTest.scala new file mode 100644 index 00000000..127cd601 --- /dev/null +++ b/scalatest/src/test/scala-2.13/user/org/mockito/stubbing/ReturnsEmptyValuesTest.scala @@ -0,0 +1,77 @@ +package user.org.mockito.stubbing + +import org.mockito.exceptions.base.MockitoException +import org.mockito.{ DefaultAnswers, IdiomaticMockito } +import org.scalatest.concurrent.ScalaFutures +import org.scalatest.{ Matchers, OptionValues, TryValues, WordSpec } +import user.org.mockito.stubbing.DefaultAnswerTest._ + +import scala.collection.mutable +import scala.collection.mutable.ListBuffer +import scala.concurrent.Future +import scala.util.{ Success, Try } + +class ReturnsEmptyValuesTest extends WordSpec with Matchers with IdiomaticMockito with TryValues with OptionValues with ScalaFutures { + + class KnownTypes { + def returnsOption: Option[String] = Some("not mocked!") + def returnsList: List[String] = List("not mocked!") + def returnsSet: Set[String] = Set("not mocked!") + def returnsSeq: Seq[String] = Seq("not mocked!") + def returnsIterable: Iterable[String] = Iterable("not mocked!") + def returnsIndexedSeq: IndexedSeq[String] = IndexedSeq("not mocked!") + def returnsIterator: Iterator[String] = Iterator("not mocked!") + def returnsLazyList: LazyList[String] = LazyList("not mocked!") + def returnsVector: Vector[String] = Vector("not mocked!") + def returnsEither: Either[Boolean, String] = Right("not mocked!") + def returnsTry: Try[String] = Success("not mocked!") + def returnsFuture: Future[String] = Future.successful("not mocked!") + def returnsBigDecimal: BigDecimal = BigDecimal(42) + def returnsBigInt: BigInt = BigInt(42) + def returnsStringBuilder: StringBuilder = new StringBuilder().append("not mocked!") + def returnsMap: Map[String, Int] = Map("not mocked!" -> 42) + def returnsMutableSeq: mutable.Seq[String] = ListBuffer("not mocked!") + def returnsListBuffer: ListBuffer[String] = ListBuffer("not mocked!") + def returnsMutableSet: mutable.Set[String] = mutable.HashSet("not mocked!") + } + + "ReturnsEmptyValues" should { + "return a default value for primitives" in { + val primitives = mock[Primitives](DefaultAnswers.ReturnsEmptyValues) + + primitives.barByte shouldBe 0.toByte + primitives.barBoolean shouldBe false + primitives.barChar shouldBe 0 + primitives.barDouble shouldBe 0 + primitives.barInt shouldBe 0 + primitives.barFloat shouldBe 0 + primitives.barShort shouldBe 0 + primitives.barLong shouldBe 0 + } + + "return the empty values for known classes" in { + val aMock = mock[KnownTypes](DefaultAnswers.ReturnsEmptyValues) + + aMock.returnsOption shouldBe None + aMock.returnsList shouldBe List.empty + aMock.returnsSet shouldBe Set.empty + aMock.returnsSeq shouldBe Seq.empty + aMock.returnsIterable shouldBe Iterable.empty + aMock.returnsIndexedSeq shouldBe IndexedSeq.empty + aMock.returnsIterator shouldBe Iterator.empty + aMock.returnsVector shouldBe Vector.empty + aMock.returnsTry.failure.exception shouldBe a[MockitoException] + aMock.returnsTry.failure.exception.getMessage shouldBe "Auto stub provided by mockito-scala" + aMock.returnsFuture.failed.value.value.success.value shouldBe a[MockitoException] + aMock.returnsFuture.failed.value.value.success.value.getMessage shouldBe "Auto stub provided by mockito-scala" + aMock.returnsBigDecimal shouldBe BigDecimal(0) + aMock.returnsBigInt shouldBe BigInt(0) + aMock.returnsStringBuilder shouldBe new StringBuilder + aMock.returnsEither shouldBe Left("Auto stub provided by mockito-scala") + aMock.returnsMap shouldBe Map.empty + aMock.returnsMutableSeq shouldBe ListBuffer.empty + aMock.returnsListBuffer shouldBe ListBuffer.empty + aMock.returnsMutableSet shouldBe mutable.HashSet.empty + } + } +} diff --git a/scalatest/src/test/scala/user/org/mockito/DoSomethingTest.scala b/scalatest/src/test/scala/user/org/mockito/DoSomethingTest.scala index f0d6973b..1792800e 100644 --- a/scalatest/src/test/scala/user/org/mockito/DoSomethingTest.scala +++ b/scalatest/src/test/scala/user/org/mockito/DoSomethingTest.scala @@ -81,7 +81,7 @@ class DoSomethingTest extends WordSpec with MockitoSugar with ScalaTestMatchers "simplify answer API (invocation usage)" in { val aMock = mock[Foo] - doAnswer((i: InvocationOnMock) => ValueCaseClass(i.getArgument[Int](0) * 10 + i.getArgument[String](1).toInt)) + doAnswer((i: InvocationOnMock) => ValueCaseClass(i.arg[Int](0) * 10 + i.arg[String](1).toInt)) .when(aMock) .doSomethingWithThisIntAndString(*, *) diff --git a/scalatest/src/test/scala/user/org/mockito/IdiomaticMockitoTest.scala b/scalatest/src/test/scala/user/org/mockito/IdiomaticMockitoTest.scala index d487db37..9de5dd21 100644 --- a/scalatest/src/test/scala/user/org/mockito/IdiomaticMockitoTest.scala +++ b/scalatest/src/test/scala/user/org/mockito/IdiomaticMockitoTest.scala @@ -104,9 +104,7 @@ class IdiomaticMockitoTest extends WordSpec with Matchers with IdiomaticMockito org.doSomethingWithThisInt(*) answers ((i: Int) => i * 10 + 2) org.doSomethingWithThisIntAndString(*, *) answers ((i: Int, s: String) => (i * 10 + s.toInt).toString) - org.doSomethingWithThisIntAndStringAndBoolean(*, *, *) answers ((i: Int, - s: String, - boolean: Boolean) => (i * 10 + s.toInt).toString + boolean) + org.doSomethingWithThisIntAndStringAndBoolean(*, *, *) answers ((i: Int, s: String, boolean: Boolean) => (i * 10 + s.toInt).toString + boolean) org.doSomethingWithThisInt(4) shouldBe 42 org.doSomethingWithThisIntAndString(4, "2") shouldBe "42" @@ -126,7 +124,7 @@ class IdiomaticMockitoTest extends WordSpec with Matchers with IdiomaticMockito "simplify answer API (invocation usage)" in { val org = orgDouble() - org.doSomethingWithThisInt(*) answers ((i: InvocationOnMock) => i.getArgument[Int](0) * 10 + 2) + org.doSomethingWithThisInt(*) answers ((i: InvocationOnMock) => i.arg[Int](0) * 10 + 2) org.doSomethingWithThisInt(4) shouldBe 42 } @@ -143,8 +141,7 @@ class IdiomaticMockitoTest extends WordSpec with Matchers with IdiomaticMockito "chain answers (invocation usage)" in { val org = orgDouble() - org.doSomethingWithThisInt(*) answers ((i: InvocationOnMock) => i.getArgument[Int](0) * 10 + 2) andThenAnswer ( - (i: InvocationOnMock) => i.getArgument[Int](0) * 15 + 9) + org.doSomethingWithThisInt(*) answers ((i: InvocationOnMock) => i.arg[Int](0) * 10 + 2) andThenAnswer ((i: InvocationOnMock) => i.arg[Int](0) * 15 + 9) org.doSomethingWithThisInt(4) shouldBe 42 org.doSomethingWithThisInt(4) shouldBe 69 @@ -322,10 +319,10 @@ class IdiomaticMockitoTest extends WordSpec with Matchers with IdiomaticMockito org.doSomethingWithThisIntAndString(1, "test") - a[TooLittleActualInvocations] should be thrownBy { + a[TooFewActualInvocations] should be thrownBy { org.doSomethingWithThisIntAndString(*, "test") wasCalled twice } - a[TooLittleActualInvocations] should be thrownBy { + a[TooFewActualInvocations] should be thrownBy { org.doSomethingWithThisIntAndString(*, "test") wasCalled 2.times } @@ -349,13 +346,13 @@ class IdiomaticMockitoTest extends WordSpec with Matchers with IdiomaticMockito org.doSomethingWithThisIntAndString(1, "test") - a[TooLittleActualInvocations] should be thrownBy { + a[TooFewActualInvocations] should be thrownBy { org.doSomethingWithThisIntAndString(*, "test") wasCalled atLeastTwice } - a[TooLittleActualInvocations] should be thrownBy { + a[TooFewActualInvocations] should be thrownBy { org.doSomethingWithThisIntAndString(*, "test") wasCalled atLeast(twice) } - a[TooLittleActualInvocations] should be thrownBy { + a[TooFewActualInvocations] should be thrownBy { org.doSomethingWithThisIntAndString(*, "test") wasCalled atLeast(2.times) } diff --git a/scalatest/src/test/scala/user/org/mockito/MockitoScalaSessionTest.scala b/scalatest/src/test/scala/user/org/mockito/MockitoScalaSessionTest.scala index d3978955..fcbb64bd 100644 --- a/scalatest/src/test/scala/user/org/mockito/MockitoScalaSessionTest.scala +++ b/scalatest/src/test/scala/user/org/mockito/MockitoScalaSessionTest.scala @@ -9,21 +9,12 @@ import org.scalatest.prop.TableDrivenPropertyChecks import org.scalatest.{ Matchers, OptionValues, WordSpec } //noinspection RedundantDefaultArgument -class MockitoScalaSessionTest - extends WordSpec - with IdiomaticMockito - with Matchers - with ArgumentMatchersSugar - with OptionValues - with TableDrivenPropertyChecks { +class MockitoScalaSessionTest extends WordSpec with IdiomaticMockito with Matchers with ArgumentMatchersSugar with OptionValues with TableDrivenPropertyChecks { val scenarios = Table( ("testDouble", "foo", "parametrisedFoo", "fooBar"), ("mock", () => mock[Foo], (mockSettings: MockSettings) => mock[Foo](mockSettings), ""), - ("spy", - () => spy(new Foo), - (mockSettings: MockSettings) => spy(new Foo, mockSettings.asInstanceOf[CreationSettings[_]].isLenient), - "bar") + ("spy", () => spy(new Foo), (mockSettings: MockSettings) => spy(new Foo, mockSettings.asInstanceOf[CreationSettings[_]].isLenient), "bar") ) class FinalEqualsAndHashcode { diff --git a/scalatest/src/test/scala/user/org/mockito/MockitoSugarTest.scala b/scalatest/src/test/scala/user/org/mockito/MockitoSugarTest.scala index 6d6c933b..b70fad50 100644 --- a/scalatest/src/test/scala/user/org/mockito/MockitoSugarTest.scala +++ b/scalatest/src/test/scala/user/org/mockito/MockitoSugarTest.scala @@ -18,14 +18,7 @@ import user.org.mockito.model.JavaFoo import scala.reflect.io.AbstractFile //noinspection RedundantDefaultArgument -class MockitoSugarTest - extends WordSpec - with MockitoSugar - with Matchers - with ArgumentMatchersSugar - with EitherValues - with OptionValues - with TableDrivenPropertyChecks { +class MockitoSugarTest extends WordSpec with MockitoSugar with Matchers with ArgumentMatchersSugar with EitherValues with OptionValues with TableDrivenPropertyChecks { implicit val prettifier: Prettifier = new Prettifier { override def apply(o: Any): String = o match { @@ -36,13 +29,7 @@ class MockitoSugarTest val scenarios = Table( ("testDouble", "foo", "higherKinded", "concreteHigherKinded", "fooWithBaz", "baz", "parametrisedTraitInt"), - ("mock", - () => mock[Foo], - () => mock[HigherKinded[Option]], - () => mock[ConcreteHigherKinded], - () => mock[FooWithBaz], - () => mock[Baz], - () => mock[ParametrisedTraitInt]), + ("mock", () => mock[Foo], () => mock[HigherKinded[Option]], () => mock[ConcreteHigherKinded], () => mock[FooWithBaz], () => mock[Baz], () => mock[ParametrisedTraitInt]), ("spy", () => spy(new Foo), () => spy(new HigherKinded[Option]), @@ -91,9 +78,8 @@ class MockitoSugarTest "create a mock with nice answer API (multiple params)" in { val aMock = foo() - when(aMock.doSomethingWithThisIntAndString(*, *)) thenAnswer ((i: Int, s: String) => ValueCaseClass(i * 10 + s.toInt)) andThenAnswer ( - (i: Int, - _: String) => ValueCaseClass(i)) + when(aMock.doSomethingWithThisIntAndString(*, *)) thenAnswer ((i: Int, s: String) => ValueCaseClass(i * 10 + s.toInt)) andThenAnswer ((i: Int, + _: String) => ValueCaseClass(i)) aMock.doSomethingWithThisIntAndString(4, "2") shouldBe ValueCaseClass(42) aMock.doSomethingWithThisIntAndString(4, "2") shouldBe ValueCaseClass(4) @@ -282,8 +268,7 @@ class MockitoSugarTest "create a mock with nice answer API (single param)" in { val aMock = baz() - when(aMock.traitMethod(*)) thenAnswer ((i: Int) => ValueCaseClass(i * 10 + 2)) andThenAnswer ((i: Int) => - ValueCaseClass(i * 10 + 3)) + when(aMock.traitMethod(*)) thenAnswer ((i: Int) => ValueCaseClass(i * 10 + 2)) andThenAnswer ((i: Int) => ValueCaseClass(i * 10 + 3)) aMock.traitMethod(4) shouldBe ValueCaseClass(42) aMock.traitMethod(4) shouldBe ValueCaseClass(43) @@ -292,8 +277,8 @@ class MockitoSugarTest "create a mock with nice answer API (invocation usage)" in { val aMock = baz() - when(aMock.traitMethod(*)) thenAnswer ((i: InvocationOnMock) => ValueCaseClass(i.getArgument[Int](0) * 10 + 2)) andThenAnswer ( - (i: InvocationOnMock) => ValueCaseClass(i.getArgument[Int](0) * 10 + 3)) + when(aMock.traitMethod(*)) thenAnswer ((i: InvocationOnMock) => ValueCaseClass(i.arg[Int](0) * 10 + 2)) andThenAnswer ((i: InvocationOnMock) => + ValueCaseClass(i.arg[Int](0) * 10 + 3)) aMock.traitMethod(4) shouldBe ValueCaseClass(42) aMock.traitMethod(4) shouldBe ValueCaseClass(43) diff --git a/scalatest/src/test/scala/user/org/mockito/TestModel.scala b/scalatest/src/test/scala/user/org/mockito/TestModel.scala index d76c5ff9..597078d3 100644 --- a/scalatest/src/test/scala/user/org/mockito/TestModel.scala +++ b/scalatest/src/test/scala/user/org/mockito/TestModel.scala @@ -14,10 +14,9 @@ trait FooTrait { def iHavePrimitiveByNameArgs(byName: => Int, normal: String): String = "not mocked" - def iHaveByNameAndVarArgs(byName: => String, normal: String, byName2: => String, normal2: String, vararg: String*)( - byName3: => String, - normal3: String, - vararg3: String*): String = "not mocked" + def iHaveByNameAndVarArgs(byName: => String, normal: String, byName2: => String, normal2: String, vararg: String*)(byName3: => String, + normal3: String, + vararg3: String*): String = "not mocked" def iHaveFunction0Args(normal: String, f0: () => String): String = "not mocked" diff --git a/scalatest/src/test/scala/user/org/mockito/stubbing/DefaultAnswerTest.scala b/scalatest/src/test/scala/user/org/mockito/stubbing/DefaultAnswerTest.scala index 2285b9a9..d43de7c0 100644 --- a/scalatest/src/test/scala/user/org/mockito/stubbing/DefaultAnswerTest.scala +++ b/scalatest/src/test/scala/user/org/mockito/stubbing/DefaultAnswerTest.scala @@ -1,17 +1,13 @@ package user.org.mockito.stubbing -import org.mockito.exceptions.base.MockitoException +import org.mockito.IdiomaticMockito import org.mockito.exceptions.verification.SmartNullPointerException import org.mockito.stubbing.DefaultAnswer -import org.mockito.{ DefaultAnswers, IdiomaticMockito } import org.scalatest import org.scalatest.concurrent.ScalaFutures import org.scalatest.{ OptionValues, TryValues, WordSpec } import user.org.mockito.stubbing.DefaultAnswerTest._ -import scala.concurrent.Future -import scala.util.{ Success, Try } - object DefaultAnswerTest { class Foo { def bar(a: String) = "bar" @@ -31,25 +27,6 @@ object DefaultAnswerTest { def callMeMaybe(): Unit = () } - class KnownTypes { - def returnsOption: Option[String] = Some("not mocked!") - def returnsList: List[String] = List("not mocked!") - def returnsSet: Set[String] = Set("not mocked!") - def returnsSeq: Seq[String] = Seq("not mocked!") - def returnsIterable: Iterable[String] = Iterable("not mocked!") - def returnsTraversable: Traversable[String] = Traversable("not mocked!") - def returnsIndexedSeq: IndexedSeq[String] = IndexedSeq("not mocked!") - def returnsIterator: Iterator[String] = Iterator("not mocked!") - def returnsStream: Stream[String] = Stream("not mocked!") - def returnsVector: Vector[String] = Vector("not mocked!") - def returnsEither: Either[Boolean, String] = Right("not mocked!") - def returnsTry: Try[String] = Success("not mocked!") - def returnsFuture: Future[String] = Future.successful("not mocked!") - def returnsBigDecimal: BigDecimal = BigDecimal(42) - def returnsBigInt: BigInt = BigInt(42) - def returnsStringBuilder: StringBuilder = StringBuilder.newBuilder.append("not mocked!") - } - class Primitives { def barByte: Byte = 1.toByte def barBoolean: Boolean = true @@ -108,41 +85,4 @@ class DefaultAnswerTest extends WordSpec with scalatest.Matchers with IdiomaticM aMock.valueClass.v shouldBe 0 } } - - "ReturnsEmptyValues" should { - "return a default value for primitives" in { - val primitives = mock[Primitives](DefaultAnswers.ReturnsEmptyValues) - - primitives.barByte shouldBe 0.toByte - primitives.barBoolean shouldBe false - primitives.barChar shouldBe 0 - primitives.barDouble shouldBe 0 - primitives.barInt shouldBe 0 - primitives.barFloat shouldBe 0 - primitives.barShort shouldBe 0 - primitives.barLong shouldBe 0 - } - - "return the empty values for known classes" in { - val aMock = mock[KnownTypes](DefaultAnswers.ReturnsEmptyValues) - - aMock.returnsOption shouldBe None - aMock.returnsList shouldBe List.empty - aMock.returnsSet shouldBe Set.empty - aMock.returnsSeq shouldBe Seq.empty - aMock.returnsIterable shouldBe Iterable.empty - aMock.returnsTraversable shouldBe Traversable.empty - aMock.returnsIndexedSeq shouldBe IndexedSeq.empty - aMock.returnsIterator shouldBe Iterator.empty - aMock.returnsStream shouldBe Stream.empty - aMock.returnsVector shouldBe Vector.empty - aMock.returnsTry.failure.exception shouldBe a[MockitoException] - aMock.returnsTry.failure.exception.getMessage shouldBe "Auto stub provided by mockito-scala" - aMock.returnsFuture.failed.value.value.success.value shouldBe a[MockitoException] - aMock.returnsFuture.failed.value.value.success.value.getMessage shouldBe "Auto stub provided by mockito-scala" - aMock.returnsBigDecimal shouldBe BigDecimal(0) - aMock.returnsBigInt shouldBe BigInt(0) - aMock.returnsStringBuilder shouldBe StringBuilder.newBuilder - } - } } diff --git a/scalaz/src/main/scala/org/mockito/scalaz/IdiomaticMockitoScalaz.scala b/scalaz/src/main/scala/org/mockito/scalaz/IdiomaticMockitoScalaz.scala index b0a22ad6..7a1d9e01 100644 --- a/scalaz/src/main/scala/org/mockito/scalaz/IdiomaticMockitoScalaz.scala +++ b/scalaz/src/main/scala/org/mockito/scalaz/IdiomaticMockitoScalaz.scala @@ -178,23 +178,19 @@ object IdiomaticMockitoScalaz extends IdiomaticMockitoScalaz { def apply[P0, P1, P2, P3, P4, P5, P6, P7](f: (P0, P1, P2, P3, P4, P5, P6, P7) => T)(implicit F: Applicative[F]): ScalazStubbing[F, T] = os thenAnswer f - def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => T)( - implicit F: Applicative[F]): ScalazStubbing[F, T] = os thenAnswer f + def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => T)(implicit F: Applicative[F]): ScalazStubbing[F, T] = os thenAnswer f - def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => T)( - implicit F: Applicative[F]): ScalazStubbing[F, T] = + def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => T)(implicit F: Applicative[F]): ScalazStubbing[F, T] = os thenAnswer f - def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T)( - implicit F: Applicative[F]): ScalazStubbing[F, T] = + def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T)(implicit F: Applicative[F]): ScalazStubbing[F, T] = os thenAnswer f } class AnswerActions2[F[_], G[_], T](os: ScalazStubbing2[F, G, T]) { def apply(f: => T)(implicit F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = os thenAnswer f - def apply[P0]( - f: P0 => T)(implicit classTag: ClassTag[P0] = defaultClassTag[P0], F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = + def apply[P0](f: P0 => T)(implicit classTag: ClassTag[P0] = defaultClassTag[P0], F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = os thenAnswer f def apply[P0, P1](f: (P0, P1) => T)(implicit F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = os thenAnswer f @@ -207,27 +203,22 @@ object IdiomaticMockitoScalaz extends IdiomaticMockitoScalaz { def apply[P0, P1, P2, P3, P4](f: (P0, P1, P2, P3, P4) => T)(implicit F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = os thenAnswer f - def apply[P0, P1, P2, P3, P4, P5](f: (P0, P1, P2, P3, P4, P5) => T)(implicit F: Applicative[F], - G: Applicative[G]): ScalazStubbing2[F, G, T] = os thenAnswer f + def apply[P0, P1, P2, P3, P4, P5](f: (P0, P1, P2, P3, P4, P5) => T)(implicit F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = os thenAnswer f - def apply[P0, P1, P2, P3, P4, P5, P6](f: (P0, P1, P2, P3, P4, P5, P6) => T)(implicit F: Applicative[F], - G: Applicative[G]): ScalazStubbing2[F, G, T] = + def apply[P0, P1, P2, P3, P4, P5, P6](f: (P0, P1, P2, P3, P4, P5, P6) => T)(implicit F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = os thenAnswer f - def apply[P0, P1, P2, P3, P4, P5, P6, P7](f: (P0, P1, P2, P3, P4, P5, P6, P7) => T)(implicit F: Applicative[F], - G: Applicative[G]): ScalazStubbing2[F, G, T] = + def apply[P0, P1, P2, P3, P4, P5, P6, P7](f: (P0, P1, P2, P3, P4, P5, P6, P7) => T)(implicit F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = os thenAnswer f - def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => T)(implicit F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = + def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => T)(implicit F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = os thenAnswer f - def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => T)(implicit F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = + def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => T)(implicit F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = os thenAnswer f - def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T)(implicit F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = + def apply[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T)(implicit F: Applicative[F], + G: Applicative[G]): ScalazStubbing2[F, G, T] = os thenAnswer f } } diff --git a/scalaz/src/main/scala/org/mockito/scalaz/MockitoScalaz.scala b/scalaz/src/main/scala/org/mockito/scalaz/MockitoScalaz.scala index b558a92a..f7e47a34 100644 --- a/scalaz/src/main/scala/org/mockito/scalaz/MockitoScalaz.scala +++ b/scalaz/src/main/scala/org/mockito/scalaz/MockitoScalaz.scala @@ -71,8 +71,7 @@ trait MockitoScalaz extends ScalacticSerialisableHack { Mockito.doAnswer(functionToAnswer(f).andThen(Applicative[F].pure(_))) def doAnswerF[F[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, R](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => R): Stubber = Mockito.doAnswer(functionToAnswer(f).andThen(Applicative[F].pure(_))) - def doAnswerF[F[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, R]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => R): Stubber = + def doAnswerF[F[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, R](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => R): Stubber = Mockito.doAnswer(functionToAnswer(f).andThen(Applicative[F].pure(_))) def doAnswerFG[F[_]: Applicative, G[_]: Applicative, R](l: => R): Stubber = @@ -103,17 +102,13 @@ trait MockitoScalaz extends ScalacticSerialisableHack { Mockito.doAnswer(functionToAnswer(f).andThen(Applicative[F].compose[G].pure(_))) def doAnswerFG[F[_]: Applicative, G[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, R](f: (P0, P1, P2, P3, P4, P5, P6) => R): Stubber = Mockito.doAnswer(functionToAnswer(f).andThen(Applicative[F].compose[G].pure(_))) - def doAnswerFG[F[_]: Applicative, G[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, P7, R]( - f: (P0, P1, P2, P3, P4, P5, P6, P7) => R): Stubber = + def doAnswerFG[F[_]: Applicative, G[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, P7, R](f: (P0, P1, P2, P3, P4, P5, P6, P7) => R): Stubber = Mockito.doAnswer(functionToAnswer(f).andThen(Applicative[F].compose[G].pure(_))) - def doAnswerFG[F[_]: Applicative, G[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, P7, P8, R]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => R): Stubber = + def doAnswerFG[F[_]: Applicative, G[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, P7, P8, R](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => R): Stubber = Mockito.doAnswer(functionToAnswer(f).andThen(Applicative[F].compose[G].pure(_))) - def doAnswerFG[F[_]: Applicative, G[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, R]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => R): Stubber = + def doAnswerFG[F[_]: Applicative, G[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, R](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => R): Stubber = Mockito.doAnswer(functionToAnswer(f).andThen(Applicative[F].compose[G].pure(_))) - def doAnswerFG[F[_]: Applicative, G[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, R]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => R): Stubber = + def doAnswerFG[F[_]: Applicative, G[_]: Applicative, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, R](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => R): Stubber = Mockito.doAnswer(functionToAnswer(f).andThen(Applicative[F].compose[G].pure(_))) implicit def scalazEquality[T: Equal]: Equality[T] = new EqToEquality[T] diff --git a/scalaz/src/main/scala/org/mockito/scalaz/ScalazStubbing.scala b/scalaz/src/main/scala/org/mockito/scalaz/ScalazStubbing.scala index 98880cf5..1de925d2 100644 --- a/scalaz/src/main/scala/org/mockito/scalaz/ScalazStubbing.scala +++ b/scalaz/src/main/scala/org/mockito/scalaz/ScalazStubbing.scala @@ -32,17 +32,13 @@ case class ScalazStubbing[F[_], T](delegate: OngoingStubbing[F[T]]) { delegate thenAnswer functionToAnswer(f).andThen(F.pure(_)) def thenAnswer[P0, P1, P2, P3, P4, P5, P6](f: (P0, P1, P2, P3, P4, P5, P6) => T)(implicit F: Applicative[F]): ScalazStubbing[F, T] = delegate thenAnswer functionToAnswer(f).andThen(F.pure(_)) - def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7](f: (P0, P1, P2, P3, P4, P5, P6, P7) => T)( - implicit F: Applicative[F]): ScalazStubbing[F, T] = + def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7](f: (P0, P1, P2, P3, P4, P5, P6, P7) => T)(implicit F: Applicative[F]): ScalazStubbing[F, T] = delegate thenAnswer functionToAnswer(f).andThen(F.pure(_)) - def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => T)( - implicit F: Applicative[F]): ScalazStubbing[F, T] = + def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => T)(implicit F: Applicative[F]): ScalazStubbing[F, T] = delegate thenAnswer functionToAnswer(f).andThen(F.pure(_)) - def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => T)( - implicit F: Applicative[F]): ScalazStubbing[F, T] = + def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => T)(implicit F: Applicative[F]): ScalazStubbing[F, T] = delegate thenAnswer functionToAnswer(f).andThen(F.pure(_)) - def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T)( - implicit F: Applicative[F]): ScalazStubbing[F, T] = + def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T)(implicit F: Applicative[F]): ScalazStubbing[F, T] = delegate thenAnswer functionToAnswer(f).andThen(F.pure(_)) def thenFailWith[E](error: E)(implicit ae: MonadError[F, _ >: E]): ScalazStubbing[F, T] = @@ -67,8 +63,7 @@ case class ScalazStubbing2[F[_], G[_], T](delegate: OngoingStubbing[F[G[T]]]) { def thenAnswer(f: => T)(implicit F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = delegate thenAnswer invocationToAnswer(_ => f).andThen(F.compose[G].pure(_)) - def thenAnswer[P0]( - f: P0 => T)(implicit classTag: ClassTag[P0] = defaultClassTag[P0], F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = + def thenAnswer[P0](f: P0 => T)(implicit classTag: ClassTag[P0] = defaultClassTag[P0], F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = clazz[P0] match { case c if c == classOf[InvocationOnMock] => delegate thenAnswer invocationToAnswer(i => f(i.asInstanceOf[P0])).andThen(F.compose[G].pure(_)) @@ -81,26 +76,21 @@ case class ScalazStubbing2[F[_], G[_], T](delegate: OngoingStubbing[F[G[T]]]) { delegate thenAnswer functionToAnswer(f).andThen(F.compose[G].pure(_)) def thenAnswer[P0, P1, P2, P3](f: (P0, P1, P2, P3) => T)(implicit F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = delegate thenAnswer functionToAnswer(f).andThen(F.compose[G].pure(_)) - def thenAnswer[P0, P1, P2, P3, P4](f: (P0, P1, P2, P3, P4) => T)(implicit F: Applicative[F], - G: Applicative[G]): ScalazStubbing2[F, G, T] = + def thenAnswer[P0, P1, P2, P3, P4](f: (P0, P1, P2, P3, P4) => T)(implicit F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = delegate thenAnswer functionToAnswer(f).andThen(F.compose[G].pure(_)) - def thenAnswer[P0, P1, P2, P3, P4, P5](f: (P0, P1, P2, P3, P4, P5) => T)(implicit F: Applicative[F], - G: Applicative[G]): ScalazStubbing2[F, G, T] = + def thenAnswer[P0, P1, P2, P3, P4, P5](f: (P0, P1, P2, P3, P4, P5) => T)(implicit F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = delegate thenAnswer functionToAnswer(f).andThen(F.compose[G].pure(_)) - def thenAnswer[P0, P1, P2, P3, P4, P5, P6](f: (P0, P1, P2, P3, P4, P5, P6) => T)(implicit F: Applicative[F], - G: Applicative[G]): ScalazStubbing2[F, G, T] = + def thenAnswer[P0, P1, P2, P3, P4, P5, P6](f: (P0, P1, P2, P3, P4, P5, P6) => T)(implicit F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = delegate thenAnswer functionToAnswer(f).andThen(F.compose[G].pure(_)) - def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7](f: (P0, P1, P2, P3, P4, P5, P6, P7) => T)(implicit F: Applicative[F], - G: Applicative[G]): ScalazStubbing2[F, G, T] = + def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7](f: (P0, P1, P2, P3, P4, P5, P6, P7) => T)(implicit F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = delegate thenAnswer functionToAnswer(f).andThen(F.compose[G].pure(_)) - def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => T)(implicit F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = + def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8) => T)(implicit F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = delegate thenAnswer functionToAnswer(f).andThen(F.compose[G].pure(_)) - def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => T)(implicit F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = + def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) => T)(implicit F: Applicative[F], + G: Applicative[G]): ScalazStubbing2[F, G, T] = delegate thenAnswer functionToAnswer(f).andThen(F.compose[G].pure(_)) - def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10]( - f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T)(implicit F: Applicative[F], G: Applicative[G]): ScalazStubbing2[F, G, T] = + def thenAnswer[P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10](f: (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) => T)(implicit F: Applicative[F], + G: Applicative[G]): ScalazStubbing2[F, G, T] = delegate thenAnswer functionToAnswer(f).andThen(F.compose[G].pure(_)) def thenFailWith[E](error: E)(implicit ae: Applicative[F], ag: MonadError[G, _ >: E]): ScalazStubbing2[F, G, T] = diff --git a/scalaz/src/test/scala/org/mockito/scalaz/DoSomethingScalazTest.scala b/scalaz/src/test/scala/org/mockito/scalaz/DoSomethingScalazTest.scala index 572908ff..d34c0efb 100644 --- a/scalaz/src/test/scala/org/mockito/scalaz/DoSomethingScalazTest.scala +++ b/scalaz/src/test/scala/org/mockito/scalaz/DoSomethingScalazTest.scala @@ -107,7 +107,7 @@ class DoSomethingScalazTest "mocked!" willBe answeredF by aMock.returnsOptionString("hello") ((s: String) => s + " mocked!") willBe answeredF by aMock.returnsOptionString("hi") - ((i: InvocationOnMock) => i.getArgument[String](0) + " invocation mocked!") willBe answeredF by aMock.returnsOptionString("hola") + ((i: InvocationOnMock) => i.arg[String](0) + " invocation mocked!") willBe answeredF by aMock.returnsOptionString("hola") ((i: Int, b: Boolean) => s"$i, $b") willBe answeredF by aMock.returnsOptionFrom(42, true) aMock.returnsOptionString("hello").value shouldBe "mocked!" @@ -121,7 +121,7 @@ class DoSomethingScalazTest ValueClass("mocked!") willBe answeredFG by aMock.returnsFutureEither("hello") ((s: String) => ValueClass(s + " mocked!")) willBe answeredFG by aMock.returnsFutureEither("hi") - ((i: InvocationOnMock) => ValueClass(i.getArgument[String](0) + " invocation mocked!")) willBe answeredFG by aMock + ((i: InvocationOnMock) => ValueClass(i.arg[String](0) + " invocation mocked!")) willBe answeredFG by aMock .returnsFutureEither("hola") ((i: Int, b: Boolean) => s"$i, $b") willBe answeredFG by aMock.returnsFutureOptionFrom(42, true) diff --git a/scalaz/src/test/scala/org/mockito/scalaz/IdiomaticMockitoScalazTest.scala b/scalaz/src/test/scala/org/mockito/scalaz/IdiomaticMockitoScalazTest.scala index 8c98cc19..19bcadbe 100644 --- a/scalaz/src/test/scala/org/mockito/scalaz/IdiomaticMockitoScalazTest.scala +++ b/scalaz/src/test/scala/org/mockito/scalaz/IdiomaticMockitoScalazTest.scala @@ -144,7 +144,7 @@ class IdiomaticMockitoScalazTest aMock.returnsOptionString("hello") answersF "mocked!" aMock.returnsOptionString("hi") answersF ((s: String) => s + " mocked!") - aMock.returnsOptionString("hola") answersF ((i: InvocationOnMock) => i.getArgument[String](0) + " invocation mocked!") + aMock.returnsOptionString("hola") answersF ((i: InvocationOnMock) => i.arg[String](0) + " invocation mocked!") aMock.returnsOptionFrom(42, true) answersF ((i: Int, b: Boolean) => s"$i, $b") aMock.returnsOptionString("hello").value shouldBe "mocked!" @@ -158,7 +158,7 @@ class IdiomaticMockitoScalazTest aMock.returnsFutureEither("hello") answersFG ValueClass("mocked!") aMock.returnsFutureEither("hi") answersFG ((s: String) => ValueClass(s + " mocked!")) - aMock.returnsFutureEither("hola") answersFG ((i: InvocationOnMock) => ValueClass(i.getArgument[String](0) + " invocation mocked!")) + aMock.returnsFutureEither("hola") answersFG ((i: InvocationOnMock) => ValueClass(i.arg[String](0) + " invocation mocked!")) aMock.returnsFutureOptionFrom(42, true) answersFG ((i: Int, b: Boolean) => s"$i, $b") whenReady(aMock.returnsFutureEither("hello"))(_.right.value shouldBe ValueClass("mocked!")) diff --git a/scalaz/src/test/scala/org/mockito/scalaz/MockitoScalazTest.scala b/scalaz/src/test/scala/org/mockito/scalaz/MockitoScalazTest.scala index 45ca1701..1dad6be6 100644 --- a/scalaz/src/test/scala/org/mockito/scalaz/MockitoScalazTest.scala +++ b/scalaz/src/test/scala/org/mockito/scalaz/MockitoScalazTest.scala @@ -10,15 +10,7 @@ import org.scalatest.{ EitherValues, Matchers, OptionValues, WordSpec } import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future -class MockitoScalazTest - extends WordSpec - with Matchers - with MockitoSugar - with ArgumentMatchersSugar - with MockitoScalaz - with EitherValues - with OptionValues - with ScalaFutures { +class MockitoScalazTest extends WordSpec with Matchers with MockitoSugar with ArgumentMatchersSugar with MockitoScalaz with EitherValues with OptionValues with ScalaFutures { "when - return" should { "stub full applicative" in { @@ -129,7 +121,7 @@ class MockitoScalazTest whenF(aMock.returnsOptionString("hello")) thenAnswer "mocked!" whenF(aMock.returnsOptionString("hi")) thenAnswer ((s: String) => s + " mocked!") - whenF(aMock.returnsOptionString("hola")) thenAnswer ((i: InvocationOnMock) => i.getArgument[String](0) + " invocation mocked!") + whenF(aMock.returnsOptionString("hola")) thenAnswer ((i: InvocationOnMock) => i.arg[String](0) + " invocation mocked!") whenF(aMock.returnsOptionFrom(42, true)) thenAnswer ((i: Int, b: Boolean) => s"$i, $b") aMock.returnsOptionString("hello").value shouldBe "mocked!" @@ -143,8 +135,7 @@ class MockitoScalazTest whenFG(aMock.returnsFutureEither("hello")) thenAnswer ValueClass("mocked!") whenFG(aMock.returnsFutureEither("hi")) thenAnswer ((s: String) => ValueClass(s + " mocked!")) - whenFG(aMock.returnsFutureEither("hola")) thenAnswer ((i: InvocationOnMock) => - ValueClass(i.getArgument[String](0) + " invocation mocked!")) + whenFG(aMock.returnsFutureEither("hola")) thenAnswer ((i: InvocationOnMock) => ValueClass(i.arg[String](0) + " invocation mocked!")) whenFG(aMock.returnsFutureOptionFrom(42, true)) thenAnswer ((i: Int, b: Boolean) => s"$i, $b") whenReady(aMock.returnsFutureEither("hello"))(_.right.value shouldBe ValueClass("mocked!")) @@ -244,7 +235,7 @@ class MockitoScalazTest doAnswerF[Option, String]("mocked!").when(aMock).returnsOptionString("hello") doAnswerF[Option, String, String]((s: String) => s + " mocked!").when(aMock).returnsOptionString("hi") - doAnswerF[Option, InvocationOnMock, String]((i: InvocationOnMock) => i.getArgument[String](0) + " invocation mocked!") + doAnswerF[Option, InvocationOnMock, String]((i: InvocationOnMock) => i.arg[String](0) + " invocation mocked!") .when(aMock) .returnsOptionString("hola") doAnswerF[Option, Int, Boolean, String]((i: Int, b: Boolean) => s"$i, $b").when(aMock).returnsOptionFrom(42, true) @@ -261,7 +252,7 @@ class MockitoScalazTest doAnswerFG[Future, ErrorOr, ValueClass](ValueClass("mocked!")).when(aMock).returnsFutureEither("hello") doAnswerFG[Future, ErrorOr, String, ValueClass]((s: String) => ValueClass(s + " mocked!")).when(aMock).returnsFutureEither("hi") doAnswerFG[Future, ErrorOr, InvocationOnMock, ValueClass] { i: InvocationOnMock => - ValueClass(i.getArgument[String](0) + " invocation mocked!") + ValueClass(i.arg[String](0) + " invocation mocked!") }.when(aMock) .returnsFutureEither("hola") doAnswerFG[Future, Option, Int, Boolean, String]((i: Int, b: Boolean) => s"$i, $b").when(aMock).returnsFutureOptionFrom(42, true) diff --git a/specs2/src/main/scala/org/mockito/specs2/MockitoSpecs2Support.scala b/specs2/src/main/scala/org/mockito/specs2/MockitoSpecs2Support.scala index ce7935b4..8e3abaea 100644 --- a/specs2/src/main/scala/org/mockito/specs2/MockitoSpecs2Support.scala +++ b/specs2/src/main/scala/org/mockito/specs2/MockitoSpecs2Support.scala @@ -78,13 +78,7 @@ trait FunctionArguments extends FunctionArgumentsLowImplicits { implicit def matcherToFunctionCall5[T1, T2, T3, T4, T5, R](values: ((T1, T2, T3, T4, T5), Matcher[R])): Function5[T1, T2, T3, T4, T5, R] = callMatching5(values._1._1, values._1._2, values._1._3, values._1._4, values._1._5, values._2) - def callMatching6[T1, T2, T3, T4, T5, T6, R](t1: T1, - t2: T2, - t3: T3, - t4: T4, - t5: T5, - t6: T6, - m: Matcher[R]): Function6[T1, T2, T3, T4, T5, T6, R] = + def callMatching6[T1, T2, T3, T4, T5, T6, R](t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, m: Matcher[R]): Function6[T1, T2, T3, T4, T5, T6, R] = argThat(m ^^ { (f: Function6[T1, T2, T3, T4, T5, T6, R]) => f(t1, t2, t3, t4, t5, t6) }) @@ -92,35 +86,18 @@ trait FunctionArguments extends FunctionArgumentsLowImplicits { callMatching6(t1, t2, t3, t4, t5, t6, new BeEqualTo(r)) implicit def toFunctionCall6[T1, T2, T3, T4, T5, T6, R](values: ((T1, T2, T3, T4, T5, T6), R)): Function6[T1, T2, T3, T4, T5, T6, R] = functionCall6(values._1._1, values._1._2, values._1._3, values._1._4, values._1._5, values._1._6, values._2) - implicit def matcherToFunctionCall6[T1, T2, T3, T4, T5, T6, R]( - values: ((T1, T2, T3, T4, T5, T6), Matcher[R])): Function6[T1, T2, T3, T4, T5, T6, R] = + implicit def matcherToFunctionCall6[T1, T2, T3, T4, T5, T6, R](values: ((T1, T2, T3, T4, T5, T6), Matcher[R])): Function6[T1, T2, T3, T4, T5, T6, R] = callMatching6(values._1._1, values._1._2, values._1._3, values._1._4, values._1._5, values._1._6, values._2) - def callMatching7[T1, T2, T3, T4, T5, T6, T7, R](t1: T1, - t2: T2, - t3: T3, - t4: T4, - t5: T5, - t6: T6, - t7: T7, - m: Matcher[R]): Function7[T1, T2, T3, T4, T5, T6, T7, R] = + def callMatching7[T1, T2, T3, T4, T5, T6, T7, R](t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, m: Matcher[R]): Function7[T1, T2, T3, T4, T5, T6, T7, R] = argThat(m ^^ { (f: Function7[T1, T2, T3, T4, T5, T6, T7, R]) => f(t1, t2, t3, t4, t5, t6, t7) }) - def functionCall7[T1, T2, T3, T4, T5, T6, T7, R](t1: T1, - t2: T2, - t3: T3, - t4: T4, - t5: T5, - t6: T6, - t7: T7, - r: R): Function7[T1, T2, T3, T4, T5, T6, T7, R] = + def functionCall7[T1, T2, T3, T4, T5, T6, T7, R](t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, r: R): Function7[T1, T2, T3, T4, T5, T6, T7, R] = callMatching7(t1, t2, t3, t4, t5, t6, t7, new BeEqualTo(r)) - implicit def toFunctionCall7[T1, T2, T3, T4, T5, T6, T7, R]( - values: ((T1, T2, T3, T4, T5, T6, T7), R)): Function7[T1, T2, T3, T4, T5, T6, T7, R] = + implicit def toFunctionCall7[T1, T2, T3, T4, T5, T6, T7, R](values: ((T1, T2, T3, T4, T5, T6, T7), R)): Function7[T1, T2, T3, T4, T5, T6, T7, R] = functionCall7(values._1._1, values._1._2, values._1._3, values._1._4, values._1._5, values._1._6, values._1._7, values._2) - implicit def matcherToFunctionCall7[T1, T2, T3, T4, T5, T6, T7, R]( - values: ((T1, T2, T3, T4, T5, T6, T7), Matcher[R])): Function7[T1, T2, T3, T4, T5, T6, T7, R] = + implicit def matcherToFunctionCall7[T1, T2, T3, T4, T5, T6, T7, R](values: ((T1, T2, T3, T4, T5, T6, T7), Matcher[R])): Function7[T1, T2, T3, T4, T5, T6, T7, R] = callMatching7(values._1._1, values._1._2, values._1._3, values._1._4, values._1._5, values._1._6, values._1._7, values._2) def callMatching8[T1, T2, T3, T4, T5, T6, T7, T8, R](t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8, m: Matcher[R]) @@ -128,136 +105,48 @@ trait FunctionArguments extends FunctionArgumentsLowImplicits { argThat(m ^^ { (f: Function8[T1, T2, T3, T4, T5, T6, T7, T8, R]) => f(t1, t2, t3, t4, t5, t6, t7, t8) }) - def functionCall8[T1, T2, T3, T4, T5, T6, T7, T8, R](t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8, r: R) - : Function8[T1, T2, T3, T4, T5, T6, T7, T8, R] = callMatching8(t1, t2, t3, t4, t5, t6, t7, t8, new BeEqualTo(r)) - implicit def toFunctionCall8[T1, T2, T3, T4, T5, T6, T7, T8, R]( - values: ((T1, T2, T3, T4, T5, T6, T7, T8), R)): Function8[T1, T2, T3, T4, T5, T6, T7, T8, R] = + def functionCall8[T1, T2, T3, T4, T5, T6, T7, T8, R](t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8, r: R): Function8[T1, T2, T3, T4, T5, T6, T7, T8, R] = + callMatching8(t1, t2, t3, t4, t5, t6, t7, t8, new BeEqualTo(r)) + implicit def toFunctionCall8[T1, T2, T3, T4, T5, T6, T7, T8, R](values: ((T1, T2, T3, T4, T5, T6, T7, T8), R)): Function8[T1, T2, T3, T4, T5, T6, T7, T8, R] = functionCall8(values._1._1, values._1._2, values._1._3, values._1._4, values._1._5, values._1._6, values._1._7, values._1._8, values._2) - implicit def matcherToFunctionCall8[T1, T2, T3, T4, T5, T6, T7, T8, R]( - values: ((T1, T2, T3, T4, T5, T6, T7, T8), Matcher[R])): Function8[T1, T2, T3, T4, T5, T6, T7, T8, R] = + implicit def matcherToFunctionCall8[T1, T2, T3, T4, T5, T6, T7, T8, R](values: ((T1, T2, T3, T4, T5, T6, T7, T8), Matcher[R])): Function8[T1, T2, T3, T4, T5, T6, T7, T8, R] = callMatching8(values._1._1, values._1._2, values._1._3, values._1._4, values._1._5, values._1._6, values._1._7, values._1._8, values._2) - def callMatching9[T1, T2, T3, T4, T5, T6, T7, T8, T9, R](t1: T1, - t2: T2, - t3: T3, - t4: T4, - t5: T5, - t6: T6, - t7: T7, - t8: T8, - t9: T9, - m: Matcher[R]): Function9[T1, T2, T3, T4, T5, T6, T7, T8, T9, R] = + def callMatching9[T1, T2, T3, T4, T5, T6, T7, T8, T9, R](t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8, t9: T9, m: Matcher[R]) + : Function9[T1, T2, T3, T4, T5, T6, T7, T8, T9, R] = argThat(m ^^ { (f: Function9[T1, T2, T3, T4, T5, T6, T7, T8, T9, R]) => f(t1, t2, t3, t4, t5, t6, t7, t8, t9) }) def functionCall9[T1, T2, T3, T4, T5, T6, T7, T8, T9, R](t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8, t9: T9, r: R) : Function9[T1, T2, T3, T4, T5, T6, T7, T8, T9, R] = callMatching9(t1, t2, t3, t4, t5, t6, t7, t8, t9, new BeEqualTo(r)) - implicit def toFunctionCall9[T1, T2, T3, T4, T5, T6, T7, T8, T9, R]( - values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9), R)): Function9[T1, T2, T3, T4, T5, T6, T7, T8, T9, R] = - functionCall9(values._1._1, - values._1._2, - values._1._3, - values._1._4, - values._1._5, - values._1._6, - values._1._7, - values._1._8, - values._1._9, - values._2) + implicit def toFunctionCall9[T1, T2, T3, T4, T5, T6, T7, T8, T9, R](values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9), R)): Function9[T1, T2, T3, T4, T5, T6, T7, T8, T9, R] = + functionCall9(values._1._1, values._1._2, values._1._3, values._1._4, values._1._5, values._1._6, values._1._7, values._1._8, values._1._9, values._2) implicit def matcherToFunctionCall9[T1, T2, T3, T4, T5, T6, T7, T8, T9, R]( values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9), Matcher[R])): Function9[T1, T2, T3, T4, T5, T6, T7, T8, T9, R] = - callMatching9(values._1._1, - values._1._2, - values._1._3, - values._1._4, - values._1._5, - values._1._6, - values._1._7, - values._1._8, - values._1._9, - values._2) + callMatching9(values._1._1, values._1._2, values._1._3, values._1._4, values._1._5, values._1._6, values._1._7, values._1._8, values._1._9, values._2) - def callMatching10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R](t1: T1, - t2: T2, - t3: T3, - t4: T4, - t5: T5, - t6: T6, - t7: T7, - t8: T8, - t9: T9, - t10: T10, - m: Matcher[R]): Function10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R] = + def callMatching10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R](t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8, t9: T9, t10: T10, m: Matcher[R]) + : Function10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R] = argThat(m ^^ { (f: Function10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R]) => f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10) }) - def functionCall10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R](t1: T1, - t2: T2, - t3: T3, - t4: T4, - t5: T5, - t6: T6, - t7: T7, - t8: T8, - t9: T9, - t10: T10, - r: R): Function10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R] = + def functionCall10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R](t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8, t9: T9, t10: T10, r: R) + : Function10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R] = callMatching10(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, new BeEqualTo(r)) implicit def toFunctionCall10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R]( values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10), R)): Function10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R] = - functionCall10(values._1._1, - values._1._2, - values._1._3, - values._1._4, - values._1._5, - values._1._6, - values._1._7, - values._1._8, - values._1._9, - values._1._10, - values._2) + functionCall10(values._1._1, values._1._2, values._1._3, values._1._4, values._1._5, values._1._6, values._1._7, values._1._8, values._1._9, values._1._10, values._2) implicit def matcherToFunctionCall10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R]( values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10), Matcher[R])): Function10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R] = - callMatching10(values._1._1, - values._1._2, - values._1._3, - values._1._4, - values._1._5, - values._1._6, - values._1._7, - values._1._8, - values._1._9, - values._1._10, - values._2) + callMatching10(values._1._1, values._1._2, values._1._3, values._1._4, values._1._5, values._1._6, values._1._7, values._1._8, values._1._9, values._1._10, values._2) - def callMatching11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R]( - t1: T1, - t2: T2, - t3: T3, - t4: T4, - t5: T5, - t6: T6, - t7: T7, - t8: T8, - t9: T9, - t10: T10, - t11: T11, - m: Matcher[R]): Function11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R] = + def callMatching11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R](t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8, t9: T9, t10: T10, t11: T11, m: Matcher[R]) + : Function11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R] = argThat(m ^^ { (f: Function11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R]) => f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11) }) - def functionCall11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R](t1: T1, - t2: T2, - t3: T3, - t4: T4, - t5: T5, - t6: T6, - t7: T7, - t8: T8, - t9: T9, - t10: T10, - t11: T11, - r: R): Function11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R] = + def functionCall11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R](t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8, t9: T9, t10: T10, t11: T11, r: R) + : Function11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R] = callMatching11(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, new BeEqualTo(r)) implicit def toFunctionCall11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R]( values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11), R)): Function11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R] = @@ -292,37 +181,35 @@ trait FunctionArguments extends FunctionArgumentsLowImplicits { values._2 ) - def callMatching12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R]( - t1: T1, - t2: T2, - t3: T3, - t4: T4, - t5: T5, - t6: T6, - t7: T7, - t8: T8, - t9: T9, - t10: T10, - t11: T11, - t12: T12, - m: Matcher[R]): Function12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R] = + def callMatching12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R](t1: T1, + t2: T2, + t3: T3, + t4: T4, + t5: T5, + t6: T6, + t7: T7, + t8: T8, + t9: T9, + t10: T10, + t11: T11, + t12: T12, + m: Matcher[R]): Function12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R] = argThat(m ^^ { (f: Function12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R]) => f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12) }) - def functionCall12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R]( - t1: T1, - t2: T2, - t3: T3, - t4: T4, - t5: T5, - t6: T6, - t7: T7, - t8: T8, - t9: T9, - t10: T10, - t11: T11, - t12: T12, - r: R): Function12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R] = + def functionCall12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R](t1: T1, + t2: T2, + t3: T3, + t4: T4, + t5: T5, + t6: T6, + t7: T7, + t8: T8, + t9: T9, + t10: T10, + t11: T11, + t12: T12, + r: R): Function12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R] = callMatching12(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, new BeEqualTo(r)) implicit def toFunctionCall12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R]( values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12), R)): Function12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R] = @@ -342,8 +229,7 @@ trait FunctionArguments extends FunctionArgumentsLowImplicits { values._2 ) implicit def matcherToFunctionCall12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R]( - values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12), Matcher[R])) - : Function12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R] = + values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12), Matcher[R])): Function12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R] = callMatching12( values._1._1, values._1._2, @@ -360,43 +246,40 @@ trait FunctionArguments extends FunctionArgumentsLowImplicits { values._2 ) - def callMatching13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R]( - t1: T1, - t2: T2, - t3: T3, - t4: T4, - t5: T5, - t6: T6, - t7: T7, - t8: T8, - t9: T9, - t10: T10, - t11: T11, - t12: T12, - t13: T13, - m: Matcher[R]): Function13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R] = + def callMatching13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R](t1: T1, + t2: T2, + t3: T3, + t4: T4, + t5: T5, + t6: T6, + t7: T7, + t8: T8, + t9: T9, + t10: T10, + t11: T11, + t12: T12, + t13: T13, + m: Matcher[R]): Function13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R] = argThat(m ^^ { (f: Function13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R]) => f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13) }) - def functionCall13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R]( - t1: T1, - t2: T2, - t3: T3, - t4: T4, - t5: T5, - t6: T6, - t7: T7, - t8: T8, - t9: T9, - t10: T10, - t11: T11, - t12: T12, - t13: T13, - r: R): Function13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R] = + def functionCall13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R](t1: T1, + t2: T2, + t3: T3, + t4: T4, + t5: T5, + t6: T6, + t7: T7, + t8: T8, + t9: T9, + t10: T10, + t11: T11, + t12: T12, + t13: T13, + r: R): Function13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R] = callMatching13(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, new BeEqualTo(r)) implicit def toFunctionCall13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R]( - values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13), R)) - : Function13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R] = + values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13), R)): Function13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R] = functionCall13( values._1._1, values._1._2, @@ -414,8 +297,7 @@ trait FunctionArguments extends FunctionArgumentsLowImplicits { values._2 ) implicit def matcherToFunctionCall13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R]( - values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13), Matcher[R])) - : Function13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R] = + values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13), Matcher[R])): Function13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R] = callMatching13( values._1._1, values._1._2, @@ -433,45 +315,42 @@ trait FunctionArguments extends FunctionArgumentsLowImplicits { values._2 ) - def callMatching14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R]( - t1: T1, - t2: T2, - t3: T3, - t4: T4, - t5: T5, - t6: T6, - t7: T7, - t8: T8, - t9: T9, - t10: T10, - t11: T11, - t12: T12, - t13: T13, - t14: T14, - m: Matcher[R]): Function14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R] = + def callMatching14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R](t1: T1, + t2: T2, + t3: T3, + t4: T4, + t5: T5, + t6: T6, + t7: T7, + t8: T8, + t9: T9, + t10: T10, + t11: T11, + t12: T12, + t13: T13, + t14: T14, + m: Matcher[R]): Function14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R] = argThat(m ^^ { (f: Function14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R]) => f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14) }) - def functionCall14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R]( - t1: T1, - t2: T2, - t3: T3, - t4: T4, - t5: T5, - t6: T6, - t7: T7, - t8: T8, - t9: T9, - t10: T10, - t11: T11, - t12: T12, - t13: T13, - t14: T14, - r: R): Function14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R] = + def functionCall14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R](t1: T1, + t2: T2, + t3: T3, + t4: T4, + t5: T5, + t6: T6, + t7: T7, + t8: T8, + t9: T9, + t10: T10, + t11: T11, + t12: T12, + t13: T13, + t14: T14, + r: R): Function14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R] = callMatching14(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, new BeEqualTo(r)) implicit def toFunctionCall14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R]( - values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14), R)) - : Function14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R] = + values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14), R)): Function14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R] = functionCall14( values._1._1, values._1._2, @@ -490,8 +369,7 @@ trait FunctionArguments extends FunctionArgumentsLowImplicits { values._2 ) implicit def matcherToFunctionCall14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R]( - values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14), Matcher[R])) - : Function14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R] = + values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14), Matcher[R])): Function14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R] = callMatching14( values._1._1, values._1._2, @@ -530,27 +408,25 @@ trait FunctionArguments extends FunctionArgumentsLowImplicits { argThat(m ^^ { (f: Function15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R]) => f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15) }) - def functionCall15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R]( - t1: T1, - t2: T2, - t3: T3, - t4: T4, - t5: T5, - t6: T6, - t7: T7, - t8: T8, - t9: T9, - t10: T10, - t11: T11, - t12: T12, - t13: T13, - t14: T14, - t15: T15, - r: R): Function15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R] = + def functionCall15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R](t1: T1, + t2: T2, + t3: T3, + t4: T4, + t5: T5, + t6: T6, + t7: T7, + t8: T8, + t9: T9, + t10: T10, + t11: T11, + t12: T12, + t13: T13, + t14: T14, + t15: T15, + r: R): Function15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R] = callMatching15(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, new BeEqualTo(r)) implicit def toFunctionCall15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R]( - values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15), R)) - : Function15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R] = + values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15), R)): Function15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R] = functionCall15( values._1._1, values._1._2, @@ -570,8 +446,7 @@ trait FunctionArguments extends FunctionArgumentsLowImplicits { values._2 ) implicit def matcherToFunctionCall15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R]( - values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15), Matcher[R])) - : Function15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R] = + values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15), Matcher[R])): Function15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R] = callMatching15( values._1._1, values._1._2, @@ -632,8 +507,7 @@ trait FunctionArguments extends FunctionArgumentsLowImplicits { r: R): Function16[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R] = callMatching16(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, new BeEqualTo(r)) implicit def toFunctionCall16[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R]( - values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16), R)) - : Function16[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R] = + values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16), R)): Function16[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R] = functionCall16( values._1._1, values._1._2, @@ -1185,9 +1059,8 @@ trait FunctionArguments extends FunctionArgumentsLowImplicits { t21: T21, t22: T22, m: Matcher[R]): Function22[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, R] = - argThat(m ^^ { - (f: Function22[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, R]) => - f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19, t20, t21, t22) + argThat(m ^^ { (f: Function22[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, R]) => + f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19, t20, t21, t22) }) def functionCall22[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, R]( t1: T1, @@ -1242,29 +1115,7 @@ trait FunctionArguments extends FunctionArgumentsLowImplicits { values._1._22, values._2 ) - implicit def matcherToFunctionCall22[T1, - T2, - T3, - T4, - T5, - T6, - T7, - T8, - T9, - T10, - T11, - T12, - T13, - T14, - T15, - T16, - T17, - T18, - T19, - T20, - T21, - T22, - R]( + implicit def matcherToFunctionCall22[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, R]( values: ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22), Matcher[R])) : Function22[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, R] = callMatching22(