Created
May 29, 2014 22:32
-
-
Save seamusv/d3c72112698d2b28893e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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