Skip to content

Commit ba27e71

Browse files
committed
Add Optic tests
Signed-off-by: Gábor Lipták <gliptak@gmail.com>
1 parent 3777c1f commit ba27e71

File tree

5 files changed

+247
-0
lines changed

5 files changed

+247
-0
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package fj.data.optic;
2+
3+
import fj.P;
4+
import fj.P2;
5+
import org.junit.Test;
6+
7+
import static org.hamcrest.core.Is.is;
8+
import static org.junit.Assert.assertThat;
9+
10+
public class IsoTest {
11+
@Test
12+
public void testIso() {
13+
final int oldNumber = 10;
14+
final String oldStreet = "Main St";
15+
final Address oldAddress = new Address(oldNumber, oldStreet);
16+
final Iso<Address, P2<Integer, String>> addressIso = Iso.iso(p -> P.p(p.number, p.street),
17+
p -> new Address(p._1(), p._2()));
18+
final Address a = addressIso.reverseGet(addressIso.get(oldAddress));
19+
assertThat(a.number, is(oldAddress.number));
20+
assertThat(a.street, is(oldAddress.street));
21+
}
22+
23+
static final class Person {
24+
String name;
25+
Address address;
26+
27+
Person(String name, Address address) {
28+
this.name = name;
29+
this.address = address;
30+
}
31+
}
32+
33+
static final class Address {
34+
int number;
35+
String street;
36+
37+
public Address(int number, String street) {
38+
this.number = number;
39+
this.street = street;
40+
}
41+
}
42+
43+
}
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package fj.data.optic;
2+
3+
import fj.F;
4+
import org.junit.Test;
5+
6+
import static org.hamcrest.core.Is.is;
7+
import static org.junit.Assert.assertThat;
8+
9+
public class LensTest {
10+
@Test
11+
public void testLensPersonGet() {
12+
final String oldName = "Joe";
13+
final int oldNumber = 10;
14+
final String oldStreet = "Main St";
15+
final Address oldAddress = new Address(oldNumber, oldStreet);
16+
final Person oldPerson = new Person(oldName, oldAddress);
17+
final Lens<Person, String> personNameLens = Lens.lens(p -> p.name, s -> p -> new Person(s, p.address));
18+
final Lens<Person, Address> personAddressLens = Lens.lens(p -> p.address, a -> p -> new Person(p.name, a));
19+
final Lens<Address, Integer> addressNumberLens = Lens.lens(a -> a.number, n -> a -> new Address(n, a.street));
20+
final Lens<Address, String> addressStreetLens = Lens.lens(a -> a.street, s -> a -> new Address(a.number, s));
21+
final Lens<Person, Integer> personNumberLens = personAddressLens.composeLens(addressNumberLens);
22+
final Lens<Person, String> personStreetLens = personAddressLens.composeLens(addressStreetLens);
23+
assertThat(personNameLens.get(oldPerson), is(oldName));
24+
assertThat(personNumberLens.get(oldPerson), is(oldNumber));
25+
assertThat(personStreetLens.get(oldPerson), is(oldStreet));
26+
}
27+
28+
@Test
29+
public void testLensPersonSetName() {
30+
final String oldName = "Joe";
31+
final int oldNumber = 10;
32+
final String oldStreet = "Main St";
33+
final Address oldAddress = new Address(oldNumber, oldStreet);
34+
final Person oldPerson = new Person(oldName, oldAddress);
35+
final Lens<Person, String> personNameLens = Lens.lens(p -> p.name, s -> p -> new Person(s, p.address));
36+
String newName = "Bill";
37+
Person p = personNameLens.set(newName).f(oldPerson);
38+
assertThat(p.name, is(newName));
39+
assertThat(p.address, is(oldPerson.address));
40+
}
41+
42+
@Test
43+
public void testLensPersonSetNumber() {
44+
final String oldName = "Joe";
45+
final int oldNumber = 10;
46+
final String oldStreet = "Main St";
47+
final Address oldAddress = new Address(oldNumber, oldStreet);
48+
final Person oldPerson = new Person(oldName, oldAddress);
49+
final Lens<Person, Address> personAddressLens = Lens.lens(p -> p.address, a -> p -> new Person(p.name, a));
50+
final Lens<Address, Integer> addressNumberLens = Lens.lens(a -> a.number, n -> a -> new Address(n, a.street));
51+
final Lens<Person, Integer> personNumberLens = personAddressLens.composeLens(addressNumberLens);
52+
int newNumber = 20;
53+
Person p = personNumberLens.set(newNumber).f(oldPerson);
54+
assertThat(p.name, is(oldName));
55+
assertThat(p.address.number, is(newNumber));
56+
assertThat(p.address.street, is(oldStreet));
57+
}
58+
59+
@Test
60+
public void testLensPersonSetStreet() {
61+
final String oldName = "Joe";
62+
final int oldNumber = 10;
63+
final String oldStreet = "Main St";
64+
final Address oldAddress = new Address(oldNumber, oldStreet);
65+
final Person oldPerson = new Person(oldName, oldAddress);
66+
final Lens<Person, Address> personAddressLens = Lens.lens(p -> p.address, a -> p -> new Person(p.name, a));
67+
final Lens<Address, Integer> addressNumberLens = Lens.lens(a -> a.number, n -> a -> new Address(n, a.street));
68+
final Lens<Address, String> addressStreetLens = Lens.lens(a -> a.street, s -> a -> new Address(a.number, s));
69+
final Lens<Person, String> personStreetLens = personAddressLens.composeLens(addressStreetLens);
70+
String newStreet = "First St";
71+
Person p = personStreetLens.set(newStreet).f(oldPerson);
72+
assertThat(p.name, is(oldName));
73+
assertThat(p.address.number, is(oldPerson.address.number));
74+
assertThat(p.address.street, is(newStreet));
75+
}
76+
77+
@Test
78+
public void testLensPersonSetter() {
79+
final String oldName = "Joe";
80+
final int oldNumber = 10;
81+
final String oldStreet = "Main St";
82+
final Address oldAddress = new Address(oldNumber, oldStreet);
83+
final Person oldPerson = new Person(oldName, oldAddress);
84+
final Lens<Person, String> personNameLens = Lens.lens(p -> p.name, s -> p -> new Person(s, p.address));
85+
String newName = "Bill";
86+
F<Person, Person> setter = personNameLens.asSetter().set(newName);
87+
Person p = setter.f(oldPerson);
88+
assertThat(p.name, is(newName));
89+
assertThat(p.address, is(oldPerson.address));
90+
}
91+
92+
@Test
93+
public void testLensPersonGetter() {
94+
final String oldName = "Joe";
95+
final int oldNumber = 10;
96+
final String oldStreet = "Main St";
97+
final Address oldAddress = new Address(oldNumber, oldStreet);
98+
final Person oldPerson = new Person(oldName, oldAddress);
99+
final Lens<Person, String> personNameLens = Lens.lens(p -> p.name, s -> p -> new Person(s, p.address));
100+
assertThat(personNameLens.asGetter().get(oldPerson), is(oldName));
101+
}
102+
103+
static final class Person {
104+
String name;
105+
Address address;
106+
107+
Person(String name, Address address) {
108+
this.name = name;
109+
this.address = address;
110+
}
111+
}
112+
113+
static final class Address {
114+
int number;
115+
String street;
116+
117+
public Address(int number, String street) {
118+
this.number = number;
119+
this.street = street;
120+
}
121+
}
122+
123+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package fj.data.optic;
2+
3+
import fj.data.Option;
4+
import org.junit.Test;
5+
6+
import static org.hamcrest.core.Is.is;
7+
import static org.junit.Assert.assertThat;
8+
9+
public class OptionalTest {
10+
@Test
11+
public void testOptionalSome() {
12+
Optional<String, Integer> o = Optional.optional(this::decode, i -> s -> s);
13+
assertThat(o.getOption("18"), is(Option.some(18)));
14+
}
15+
16+
@Test
17+
public void testOptionalNone() {
18+
Optional<String, Integer> o = Optional.optional(this::decode, i -> s -> s);
19+
assertThat(o.getOption("Z"), is(Option.none()));
20+
}
21+
22+
private Option<Integer> decode(String s) {
23+
try {
24+
return Option.some(Integer.decode(s));
25+
} catch (NumberFormatException nfe) {
26+
return Option.none();
27+
}
28+
}
29+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package fj.data.optic;
2+
3+
import fj.data.Option;
4+
import org.junit.Test;
5+
6+
import static org.hamcrest.core.Is.is;
7+
import static org.junit.Assert.assertThat;
8+
9+
public class PrismTest {
10+
@Test
11+
public void testPrismSome() {
12+
Prism<String, Integer> prism = Prism.prism(s -> decode(s), i -> i.toString());
13+
assertThat(prism.getOption("18"), is(Option.some(18)));
14+
}
15+
16+
@Test
17+
public void testPrismNone() {
18+
Prism<String, Integer> prism = Prism.prism(s -> decode(s), i -> i.toString());
19+
assertThat(prism.getOption("Z"), is(Option.none()));
20+
}
21+
22+
private Option<Integer> decode(String s) {
23+
try {
24+
return Option.some(Integer.decode(s));
25+
} catch (NumberFormatException nfe) {
26+
return Option.none();
27+
}
28+
}
29+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package fj.data.optic;
2+
3+
import fj.Monoid;
4+
import fj.data.Either;
5+
import org.junit.Test;
6+
7+
import static org.hamcrest.core.Is.is;
8+
import static org.junit.Assert.assertThat;
9+
10+
public class TraversalTest {
11+
@Test
12+
public void testTraversalLeft() {
13+
final Traversal<Either<Integer, Integer>, Integer> t = Traversal.codiagonal();
14+
assertThat(t.fold(Monoid.intMinMonoid).f(Either.left(3)), is(3));
15+
}
16+
17+
@Test
18+
public void testTraversalRight() {
19+
final Traversal<Either<Integer, Integer>, Integer> t = Traversal.codiagonal();
20+
assertThat(t.fold(Monoid.intMinMonoid).f(Either.right(2)), is(2));
21+
}
22+
23+
}

0 commit comments

Comments
 (0)