Skip to content

Instantly share code, notes, and snippets.

@seamusv
Created May 29, 2014 22:32
Show Gist options
  • Save seamusv/d3c72112698d2b28893e to your computer and use it in GitHub Desktop.
Save seamusv/d3c72112698d2b28893e to your computer and use it in GitHub Desktop.
package mixin
import collection._
object Stacking1 extends App {
case class Company(id: String, name: String, address: String, active: Boolean)
case class ReferenceData(companies: Map[String, Company])
trait Suite {
def beforeEach() {}
}
trait ReferenceDataBuilder {
var referenceData = ReferenceData(Map.empty)
def add(company: Company): Unit = {
referenceData = referenceData.copy(companies = referenceData.companies + (company.id -> company))
}
def modifyCompany(companyId: String, name: Option[String] = None, address: Option[String] = None, active: Option[Boolean] = None): Unit = {
val existingCompany = referenceData.companies(companyId)
val newCompany = existingCompany.copy(
name = name.getOrElse(existingCompany.name),
address = address.getOrElse(existingCompany.address),
active = active.getOrElse(existingCompany.active)
)
referenceData = referenceData.copy(companies = referenceData.companies + (companyId -> newCompany))
}
}
trait Company1 extends Suite with ReferenceDataBuilder {
override def beforeEach() {
super.beforeEach()
add(Company("1", "ABC Limited", "123 Main Street", active = true))
}
}
trait Company2 extends Suite with ReferenceDataBuilder {
override def beforeEach() {
super.beforeEach()
add(Company("2", "XYZ Inc.", "456 Broadway Avenue", active = true))
}
}
class MyTest1 extends ReferenceDataBuilder with Company1 {
beforeEach()
def run() {
println(referenceData)
}
}
val test1 = new MyTest1
test1.run() // ReferenceData(Map(1 -> Company(1,ABC Limited,123 Main Street,true)))
class MyTest2 extends ReferenceDataBuilder with Company1 with Company2 {
beforeEach()
def run() {
modifyCompany("1", active = Some(false))
println(referenceData)
}
}
val test2 = new MyTest2
test2.run() // ReferenceData(Map(1 -> Company(1,ABC Limited,123 Main Street,false), 2 -> Company(2,XYZ Inc.,456 Broadway Avenue,true)))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment