nus/cs2030s/labs/PE2 2021-2022/Test2.java

121 lines
5.8 KiB
Java

import cs2030s.fp.Either;
import java.util.List;
class Test2 {
public static void main(String[] args) throws Throwable {
CS2030STest i = new CS2030STest();
i.expectReturn("Either.<Integer, String>left(2).map(i -> i + 2, s -> s + \" + 2\")",
() -> Either.<Integer, String>left(2).map(x -> x + 2, s -> s + " + 2"),
Either.left(4));
i.expectReturn("Either.<Integer, String>right(\"2\").map(i -> i + 2, s -> s + \" + 2\")",
() -> Either.<Integer, String>right("2").map(x -> x + 2, s -> s + " + 2"),
Either.right("2 + 2"));
i.expectCompile("Either<Number, Number> enn = Either.left(2).map(hash, hash);",
"cs2030s.fp.Transformer<Object, Integer> hash = o -> o.hashCode();\n" +
"cs2030s.fp.Either<Number, Number> enn = cs2030s.fp.Either.left(2).map(hash, hash);",
true);
i.expectCompile("Either<Number, Number> enn = Either.right(2).map(hash, hash);",
"cs2030s.fp.Transformer<Object, Integer> hash = o -> o.hashCode();\n" +
"cs2030s.fp.Either<Number, Number> enn = cs2030s.fp.Either.right(2).map(hash, hash);",
true);
String strOrHash = "cs2030s.fp.Transformer<Object,cs2030s.fp.Either<String,Integer>>" +
"strOrHash = o -> (o.equals(8) ?\n" +
"cs2030s.fp.Either.<String, Integer>left(o.toString()) : \n" +
"cs2030s.fp.Either.<String, Integer>right(o.hashCode()));\n";
i.expectReturn("Either.<Integer, String>left(2)" +
".flatMap(i -> Either.left(i + 2), s -> Either.right(s + \" + 2\"));",
() -> Either.<Integer, String>left(2)
.flatMap(x -> Either.left(x + 2), s -> Either.right(s + " + 2")),
Either.left(4));
i.expectReturn("Either.<Integer, String>right(\"2\")" +
".flatMap(i -> Either.left(i + 2), s -> Either.right(s + \" + 2\"));",
() -> Either.<Integer, String>right("2")
.flatMap(x -> Either.left(x + 2), s -> Either.right(s + " + 2")),
Either.right("2 + 2"));
i.expectCompile("Either<Object, Number> enn = Either.left(2).flatMap(strOrHash, strOrHash);",
strOrHash + "cs2030s.fp.Either<Object, Number> enn = " +
"cs2030s.fp.Either.left(2).flatMap(strOrHash, strOrHash);",
true);
i.expectCompile("Either<Object, Number> enn = Either.left(8).flatMap(strOrHash, strOrHash);",
strOrHash + "cs2030s.fp.Either<Object, Number> enn = " +
"cs2030s.fp.Either.left(8).flatMap(strOrHash, strOrHash);",
true);
i.expectCompile("Either<Object, Number> enn = Either.right(2).flatMap(strOrHash, strOrHash);",
strOrHash + "cs2030s.fp.Either<Object, Number> enn = " +
"cs2030s.fp.Either.right(2).flatMap(strOrHash, strOrHash);",
true);
i.expectCompile("Either<Object, Number> enn = Either.right(8).flatMap(strOrHash, strOrHash);",
strOrHash + "cs2030s.fp.Either<Object, Number> enn = " +
"cs2030s.fp.Either.right(8).flatMap(strOrHash, strOrHash);",
true);
i.expectReturn("Either.<List<Integer>, String>left(List.of(1,2,3))" +
".fold(l -> l.size(), s -> s.length())",
() -> Either.<List<Integer>, String>left(List.of(1, 2, 3))
.fold(l -> l.size(), s -> s.length()),
3);
i.expectReturn("Either.<List<Integer>, String>right(\"hello there\")" +
".fold(l -> l.size(), s -> s.length())",
() -> Either.<List<Integer>, String>right("hello there")
.fold(l -> l.size(), s -> s.length()),
11);
i.expectCompile("Either.<List<Integer>, String>left(List.of(1,2,3))" +
".<Number>fold(hash, hash)",
"cs2030s.fp.Transformer<Object, Integer> hash = o -> o.hashCode();\n" +
"cs2030s.fp.Either.<java.util.List<Integer>, String>left(java.util.List.of(1,2,3))" +
".<Number>fold(hash, hash);",
true);
i.expectCompile("Either.<List<Integer>, String>right(\"hello there\")" +
".<Number>fold(hash, hash)",
"cs2030s.fp.Transformer<Object, Integer> hash = o -> o.hashCode();\n" +
"cs2030s.fp.Either.<java.util.List<Integer>, String>right(\"hello there\")" +
".<Number>fold(hash, hash);",
true);
i.expectReturn("Either.<String, Boolean>left(\"no change\")" +
".filterOrElse(x -> x == true, x -> \"\");",
() -> Either.<String, Boolean>left("no change").filterOrElse(x -> x == true, x -> ""),
Either.left("no change"));
i.expectReturn("Either.<String, Boolean>right(true)" +
".filterOrElse(x -> x == true, x -> \"is false\");",
() -> Either.<String, Boolean>right(true).filterOrElse(x -> x == true, x -> "is false"),
Either.right(true));
i.expectReturn("Either.<String, Boolean>right(false)" +
".filterOrElse(x -> x == true, x -> \"is false\")",
() -> Either.<String, Boolean>right(false).filterOrElse(x -> x == true, x -> "is false"),
Either.left("is false"));
String lambdas = "cs2030s.fp.Transformer<Object, Exception> toException = "
+ "o -> new IllegalStateException(o + \" is illegal\");"
+ "cs2030s.fp.BooleanCondition<Number> isPositive = n -> n.intValue() > 0;";
i.expectCompile("Either.<Throwable, Integer>left(new IllegalStateException())" +
".filterOrElse(isPositive, toException)",
lambdas + "cs2030s.fp.Either.<Throwable, Integer>left(new IllegalStateException())" +
".filterOrElse(isPositive, toException);",
true);
i.expectCompile("Either.<Throwable, Integer>right(0)" +
".filterOrElse(isPositive, toException)",
lambdas + "cs2030s.fp.Either.<Throwable, Integer>right(0)" +
".filterOrElse(isPositive, toException)",
true);
i.expectCompile("Either.<Throwable, Integer>right(8)" +
".filterOrElse(isPositive, toException);",
lambdas + "cs2030s.fp.Either.<Throwable, Integer>right(8)" +
".filterOrElse(isPositive, toException)",
true);
}
}