package fj.demo.optic;
import fj.Equal;
import fj.data.optic.Lens;
import org.junit.Test;
import static org.junit.Assert.assertTrue;
/**
* Created by MarkPerry on 23/06/2015.
*/
public class LensPerson {
static final class Person {
String name;
Address address;
Person(String name, Address address) {
this.name = name;
this.address = address;
}
}
static final class Address {
int number;
String street;
public Address(int number, String street) {
this.number = number;
this.street = street;
}
}
static Lens<Person, String> personNameLens = Lens.lens(p -> p.name, s -> p -> new Person(s, p.address));
static Lens<Person, Address> personAddressLens = Lens.lens(p -> p.address, a -> p -> new Person(p.name, a));
static Lens<Address, Integer> addressNumberLens = Lens.lens(a -> a.number, n -> a -> new Address(n, a.street));
static Lens<Address, String> addressStreetLens = Lens.lens(a -> a.street, s -> a -> new Address(a.number, s));
static Lens<Person, Integer> personNumberLens = personAddressLens.composeLens(addressNumberLens);
static Lens<Person, String> personStreetLens = personAddressLens.composeLens(addressStreetLens);
static Equal<Address> addressEqual = Equal.equal(a1 -> a2 -> a1.number == a2.number && a1.street.equals(a2.street));
static Equal<Person> personEqual = Equal.equal(p1 -> p2 -> p1.name.equals(p2.name) && addressEqual.eq(p1.address, p2.address));
static final String oldName = "Joe";
static final int oldNumber = 10;
static final String oldStreet = "Main St";
static final Address oldAddress = new Address(oldNumber, oldStreet);
static final Person oldPerson = new Person(oldName, oldAddress);
@Test
public final void get() {
assertTrue(personNameLens.get(oldPerson).equals(oldName));
assertTrue(personNumberLens.get(oldPerson) == oldNumber);
assertTrue(personStreetLens.get(oldPerson) == oldStreet);
}
@Test
public final void setName() {
String newName = "Bill";
Person p = personNameLens.set(newName).f(oldPerson);
assertTrue(p.name.equals(newName));
assertTrue(addressEqual.eq(p.address, oldPerson.address));
}
@Test
public final void setNumber() {
int newNumber = 20;
Person p = personNumberLens.set(newNumber).f(oldPerson);
assertTrue(p.name.equals(oldName));
assertTrue(p.address.number == newNumber);
assertTrue(p.address.street.equals(oldStreet));
}
@Test
public final void setStreet() {
String newStreet = "First St";
Person p = personStreetLens.set(newStreet).f(oldPerson);
assertTrue(p.name.equals(oldName));
assertTrue(p.address.number == oldPerson.address.number);
assertTrue(p.address.street.equals(newStreet));
}
}