Skip to content

Instantly share code, notes, and snippets.

@dgouyette
Last active August 29, 2015 14:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dgouyette/659bcc308439acbb246b to your computer and use it in GitHub Desktop.
Save dgouyette/659bcc308439acbb246b to your computer and use it in GitHub Desktop.
import monocle.macros.Lenser
import org.specs2.matcher.ShouldMatchers
import org.specs2.mutable._
case class Company(name: String)
case class Individual(name: String)
case class User(firstName: String, individual: Option[Individual], company: Option[Company])
class LensTest extends Specification {
val userLenser = Lenser[User]
val companyLenser = Lenser[Company]
val individualLenser = Lenser[Individual]
val individualOpt = Some(Individual("my name"))
val userCreated = User("initial first name", None, None)
"[Monocle] - individual name should be set to 'my name'" in {
val _individual = userLenser(_.individual)
val _firstName = userLenser(_.firstName)
val userFirstNameUpdated = _firstName.set("Damien")(userCreated)
val userIndividualUpdated = _individual.set(individualOpt)(userFirstNameUpdated)
userIndividualUpdated.firstName mustEqual "Damien"
userIndividualUpdated.individual should beSome
userIndividualUpdated.individual.get.name mustEqual "my name"
}
import com.softwaremill.quicklens._
"[quicklens] - individual name should be set to 'my name'" in {
val modifyFirstName = modify(_: User)(_.firstName)
val modifyIndividual = modify(_: User)(_.individual)
val userFirstNameUpdated = modifyFirstName(userCreated).using(_ => "Damien")
val userIndividualUpdated = modifyIndividual(userFirstNameUpdated).using(_ => individualOpt)
//val userUpdatedWithCompose = (modifyIndividual andThenModify modifyFirstName)(userCreated)... // doesn't compile
userIndividualUpdated.firstName mustEqual "Damien"
userIndividualUpdated.individual must beSome
userIndividualUpdated.individual mustEqual individualOpt
userIndividualUpdated.individual.get.name mustEqual "my name"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment