Skip to content

Commit

Permalink
address comments (improve implementation, add more tests)
Browse files Browse the repository at this point in the history
  • Loading branch information
hughsimpson committed Sep 21, 2024
1 parent f966130 commit c2768d4
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 8 deletions.
7 changes: 2 additions & 5 deletions shared/src/main/scala-3/org/scalamock/clazz/MockMaker.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
Expand All @@ -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
Expand Down
1 change: 1 addition & 0 deletions shared/src/main/scala-3/org/scalamock/clazz/Utils.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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$")
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}

0 comments on commit c2768d4

Please sign in to comment.