Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions core/src/test/java/fj/data/optic/IsoTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package fj.data.optic;

import fj.P;
import fj.P2;
import org.junit.Test;

import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;

public class IsoTest {
@Test
public void testIso() {
final int oldNumber = 10;
final String oldStreet = "Main St";
final Address oldAddress = new Address(oldNumber, oldStreet);
final Iso<Address, P2<Integer, String>> addressIso = Iso.iso(p -> P.p(p.number, p.street),
p -> new Address(p._1(), p._2()));
final Address a = addressIso.reverseGet(addressIso.get(oldAddress));
assertThat(a.number, is(oldAddress.number));
assertThat(a.street, is(oldAddress.street));
}

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;
}
}

}
123 changes: 123 additions & 0 deletions core/src/test/java/fj/data/optic/LensTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
package fj.data.optic;

import fj.F;
import org.junit.Test;

import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;

public class LensTest {
@Test
public void testLensPersonGet() {
final String oldName = "Joe";
final int oldNumber = 10;
final String oldStreet = "Main St";
final Address oldAddress = new Address(oldNumber, oldStreet);
final Person oldPerson = new Person(oldName, oldAddress);
final Lens<Person, String> personNameLens = Lens.lens(p -> p.name, s -> p -> new Person(s, p.address));
final Lens<Person, Address> personAddressLens = Lens.lens(p -> p.address, a -> p -> new Person(p.name, a));
final Lens<Address, Integer> addressNumberLens = Lens.lens(a -> a.number, n -> a -> new Address(n, a.street));
final Lens<Address, String> addressStreetLens = Lens.lens(a -> a.street, s -> a -> new Address(a.number, s));
final Lens<Person, Integer> personNumberLens = personAddressLens.composeLens(addressNumberLens);
final Lens<Person, String> personStreetLens = personAddressLens.composeLens(addressStreetLens);
assertThat(personNameLens.get(oldPerson), is(oldName));
assertThat(personNumberLens.get(oldPerson), is(oldNumber));
assertThat(personStreetLens.get(oldPerson), is(oldStreet));
}

@Test
public void testLensPersonSetName() {
final String oldName = "Joe";
final int oldNumber = 10;
final String oldStreet = "Main St";
final Address oldAddress = new Address(oldNumber, oldStreet);
final Person oldPerson = new Person(oldName, oldAddress);
final Lens<Person, String> personNameLens = Lens.lens(p -> p.name, s -> p -> new Person(s, p.address));
String newName = "Bill";
Person p = personNameLens.set(newName).f(oldPerson);
assertThat(p.name, is(newName));
assertThat(p.address, is(oldPerson.address));
}

@Test
public void testLensPersonSetNumber() {
final String oldName = "Joe";
final int oldNumber = 10;
final String oldStreet = "Main St";
final Address oldAddress = new Address(oldNumber, oldStreet);
final Person oldPerson = new Person(oldName, oldAddress);
final Lens<Person, Address> personAddressLens = Lens.lens(p -> p.address, a -> p -> new Person(p.name, a));
final Lens<Address, Integer> addressNumberLens = Lens.lens(a -> a.number, n -> a -> new Address(n, a.street));
final Lens<Person, Integer> personNumberLens = personAddressLens.composeLens(addressNumberLens);
int newNumber = 20;
Person p = personNumberLens.set(newNumber).f(oldPerson);
assertThat(p.name, is(oldName));
assertThat(p.address.number, is(newNumber));
assertThat(p.address.street, is(oldStreet));
}

@Test
public void testLensPersonSetStreet() {
final String oldName = "Joe";
final int oldNumber = 10;
final String oldStreet = "Main St";
final Address oldAddress = new Address(oldNumber, oldStreet);
final Person oldPerson = new Person(oldName, oldAddress);
final Lens<Person, Address> personAddressLens = Lens.lens(p -> p.address, a -> p -> new Person(p.name, a));
final Lens<Address, Integer> addressNumberLens = Lens.lens(a -> a.number, n -> a -> new Address(n, a.street));
final Lens<Address, String> addressStreetLens = Lens.lens(a -> a.street, s -> a -> new Address(a.number, s));
final Lens<Person, String> personStreetLens = personAddressLens.composeLens(addressStreetLens);
String newStreet = "First St";
Person p = personStreetLens.set(newStreet).f(oldPerson);
assertThat(p.name, is(oldName));
assertThat(p.address.number, is(oldPerson.address.number));
assertThat(p.address.street, is(newStreet));
}

@Test
public void testLensPersonSetter() {
final String oldName = "Joe";
final int oldNumber = 10;
final String oldStreet = "Main St";
final Address oldAddress = new Address(oldNumber, oldStreet);
final Person oldPerson = new Person(oldName, oldAddress);
final Lens<Person, String> personNameLens = Lens.lens(p -> p.name, s -> p -> new Person(s, p.address));
String newName = "Bill";
F<Person, Person> setter = personNameLens.asSetter().set(newName);
Person p = setter.f(oldPerson);
assertThat(p.name, is(newName));
assertThat(p.address, is(oldPerson.address));
}

@Test
public void testLensPersonGetter() {
final String oldName = "Joe";
final int oldNumber = 10;
final String oldStreet = "Main St";
final Address oldAddress = new Address(oldNumber, oldStreet);
final Person oldPerson = new Person(oldName, oldAddress);
final Lens<Person, String> personNameLens = Lens.lens(p -> p.name, s -> p -> new Person(s, p.address));
assertThat(personNameLens.asGetter().get(oldPerson), is(oldName));
}

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;
}
}

}
29 changes: 29 additions & 0 deletions core/src/test/java/fj/data/optic/OptionalTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package fj.data.optic;

import fj.data.Option;
import org.junit.Test;

import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;

public class OptionalTest {
@Test
public void testOptionalSome() {
Optional<String, Integer> o = Optional.optional(this::decode, i -> s -> s);
assertThat(o.getOption("18"), is(Option.some(18)));
}

@Test
public void testOptionalNone() {
Optional<String, Integer> o = Optional.optional(this::decode, i -> s -> s);
assertThat(o.getOption("Z"), is(Option.none()));
}

private Option<Integer> decode(String s) {
try {
return Option.some(Integer.decode(s));
} catch (NumberFormatException nfe) {
return Option.none();
}
}
}
29 changes: 29 additions & 0 deletions core/src/test/java/fj/data/optic/PrismTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package fj.data.optic;

import fj.data.Option;
import org.junit.Test;

import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;

public class PrismTest {
@Test
public void testPrismSome() {
Prism<String, Integer> prism = Prism.prism(s -> decode(s), i -> i.toString());
assertThat(prism.getOption("18"), is(Option.some(18)));
}

@Test
public void testPrismNone() {
Prism<String, Integer> prism = Prism.prism(s -> decode(s), i -> i.toString());
assertThat(prism.getOption("Z"), is(Option.none()));
}

private Option<Integer> decode(String s) {
try {
return Option.some(Integer.decode(s));
} catch (NumberFormatException nfe) {
return Option.none();
}
}
}
23 changes: 23 additions & 0 deletions core/src/test/java/fj/data/optic/TraversalTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package fj.data.optic;

import fj.Monoid;
import fj.data.Either;
import org.junit.Test;

import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;

public class TraversalTest {
@Test
public void testTraversalLeft() {
final Traversal<Either<Integer, Integer>, Integer> t = Traversal.codiagonal();
assertThat(t.fold(Monoid.intMinMonoid).f(Either.left(3)), is(3));
}

@Test
public void testTraversalRight() {
final Traversal<Either<Integer, Integer>, Integer> t = Traversal.codiagonal();
assertThat(t.fold(Monoid.intMinMonoid).f(Either.right(2)), is(2));
}

}