From c2768d47fbf3710b47fba7f3c4c9871194a38a4e Mon Sep 17 00:00:00 2001 From: Hugh Simpson Date: Sat, 21 Sep 2024 10:13:13 +0100 Subject: [PATCH] address comments (improve implementation, add more tests) --- .../org/scalamock/clazz/MockMaker.scala | 7 ++---- .../scala-3/org/scalamock/clazz/Utils.scala | 1 + .../AbstractOverrideMethodTest.scala | 23 ++++++++++++++++--- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/shared/src/main/scala-3/org/scalamock/clazz/MockMaker.scala b/shared/src/main/scala-3/org/scalamock/clazz/MockMaker.scala index a5be9181..c9ddc8d5 100644 --- a/shared/src/main/scala-3/org/scalamock/clazz/MockMaker.scala +++ b/shared/src/main/scala-3/org/scalamock/clazz/MockMaker.scala @@ -124,8 +124,7 @@ private[clazz] object MockMaker: privateWithin = Symbol.noSymbol ) - if (definition.symbol.flags.is(Flags.Artifact)) Nil - else List(mockFunctionSym, overrideSym) + List(mockFunctionSym, overrideSym) }, selfType = None ) @@ -144,9 +143,7 @@ private[clazz] object MockMaker: ClassDef( cls = classSymbol, parents = parents, - body = defaultMockName :: mockableDefinitions.flatMap { - case definition if definition.symbol.flags.is(Flags.Artifact) => Nil - case definition => + body = defaultMockName :: mockableDefinitions.flatMap { definition => val mockFunctionValDef: ValDef = val valSym = classSymbol.declaredField(definition.mockValName) val mockFunctionClassSymbol = valSym.typeRef.classSymbol.get diff --git a/shared/src/main/scala-3/org/scalamock/clazz/Utils.scala b/shared/src/main/scala-3/org/scalamock/clazz/Utils.scala index c274f08e..48e19810 100644 --- a/shared/src/main/scala-3/org/scalamock/clazz/Utils.scala +++ b/shared/src/main/scala-3/org/scalamock/clazz/Utils.scala @@ -178,6 +178,7 @@ private[clazz] class Utils(using val quotes: Quotes): !sym.flags.is(Flags.Private) && !sym.flags.is(Flags.Final) && !sym.flags.is(Flags.Mutable) && + !sym.flags.is(Flags.Artifact) && sym.privateWithin.isEmpty && !sym.name.contains("$default$") ) diff --git a/shared/src/test/scala/org/scalamock/test/scalatest/AbstractOverrideMethodTest.scala b/shared/src/test/scala/org/scalamock/test/scalatest/AbstractOverrideMethodTest.scala index 023c5b2d..d68d0246 100644 --- a/shared/src/test/scala/org/scalamock/test/scalatest/AbstractOverrideMethodTest.scala +++ b/shared/src/test/scala/org/scalamock/test/scalatest/AbstractOverrideMethodTest.scala @@ -26,13 +26,30 @@ import org.scalatest.matchers.should.Matchers class AbstractOverrideMethodTest extends AnyFlatSpec with Matchers with MockFactory { class A extends B with D - trait B extends C { def foo(): Int = 1 } - trait C { def foo(): Int } - trait D extends C { abstract override def foo(): Int = super.foo() * 2 } + trait B extends C { + def foo(): Int = 1 + def bar[T](seq: Seq[T]): Seq[String] = seq.map(_.toString) + override def baz(a: String, b: Int): Int = a.size + b + } + trait C { + def foo(): Int + def bar[T](seq: Seq[T]): Seq[String] + def baz(a: String, b: Int): Int = (a.size * 2) + b + } + trait D extends C { + abstract override def foo(): Int = super.foo() * 2 + abstract override def bar[T](seq: Seq[T]): Seq[String] = "first" +: super.bar(seq) :+ "last" + abstract override def baz(a: String, b: Int): Int = super.baz(a, b) + 1 + } "ScalaTest suite" should "permit mocking classes build with stackable trait pattern" in { val mockedClass = mock[A] (mockedClass.foo _).expects().returning(42) + (mockedClass.bar _).expects(*).returning(Seq("a", "b", "c")) + (mockedClass.baz _).expects("A", 1).returning(2) + (mockedClass.baz _).expects("B", 1).never() mockedClass.foo() shouldBe 42 + mockedClass.bar(Seq(1,2,3)) shouldBe Seq("a", "b", "c") + mockedClass.baz("A", 1) shouldBe 2 } }