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.left(2).map(i -> i + 2, s -> s + \" + 2\")", () -> Either.left(2).map(x -> x + 2, s -> s + " + 2"), Either.left(4)); i.expectReturn("Either.right(\"2\").map(i -> i + 2, s -> s + \" + 2\")", () -> Either.right("2").map(x -> x + 2, s -> s + " + 2"), Either.right("2 + 2")); i.expectCompile("Either enn = Either.left(2).map(hash, hash);", "cs2030s.fp.Transformer hash = o -> o.hashCode();\n" + "cs2030s.fp.Either enn = cs2030s.fp.Either.left(2).map(hash, hash);", true); i.expectCompile("Either enn = Either.right(2).map(hash, hash);", "cs2030s.fp.Transformer hash = o -> o.hashCode();\n" + "cs2030s.fp.Either enn = cs2030s.fp.Either.right(2).map(hash, hash);", true); String strOrHash = "cs2030s.fp.Transformer>" + "strOrHash = o -> (o.equals(8) ?\n" + "cs2030s.fp.Either.left(o.toString()) : \n" + "cs2030s.fp.Either.right(o.hashCode()));\n"; i.expectReturn("Either.left(2)" + ".flatMap(i -> Either.left(i + 2), s -> Either.right(s + \" + 2\"));", () -> Either.left(2) .flatMap(x -> Either.left(x + 2), s -> Either.right(s + " + 2")), Either.left(4)); i.expectReturn("Either.right(\"2\")" + ".flatMap(i -> Either.left(i + 2), s -> Either.right(s + \" + 2\"));", () -> Either.right("2") .flatMap(x -> Either.left(x + 2), s -> Either.right(s + " + 2")), Either.right("2 + 2")); i.expectCompile("Either enn = Either.left(2).flatMap(strOrHash, strOrHash);", strOrHash + "cs2030s.fp.Either enn = " + "cs2030s.fp.Either.left(2).flatMap(strOrHash, strOrHash);", true); i.expectCompile("Either enn = Either.left(8).flatMap(strOrHash, strOrHash);", strOrHash + "cs2030s.fp.Either enn = " + "cs2030s.fp.Either.left(8).flatMap(strOrHash, strOrHash);", true); i.expectCompile("Either enn = Either.right(2).flatMap(strOrHash, strOrHash);", strOrHash + "cs2030s.fp.Either enn = " + "cs2030s.fp.Either.right(2).flatMap(strOrHash, strOrHash);", true); i.expectCompile("Either enn = Either.right(8).flatMap(strOrHash, strOrHash);", strOrHash + "cs2030s.fp.Either enn = " + "cs2030s.fp.Either.right(8).flatMap(strOrHash, strOrHash);", true); i.expectReturn("Either., String>left(List.of(1,2,3))" + ".fold(l -> l.size(), s -> s.length())", () -> Either., String>left(List.of(1, 2, 3)) .fold(l -> l.size(), s -> s.length()), 3); i.expectReturn("Either., String>right(\"hello there\")" + ".fold(l -> l.size(), s -> s.length())", () -> Either., String>right("hello there") .fold(l -> l.size(), s -> s.length()), 11); i.expectCompile("Either., String>left(List.of(1,2,3))" + ".fold(hash, hash)", "cs2030s.fp.Transformer hash = o -> o.hashCode();\n" + "cs2030s.fp.Either., String>left(java.util.List.of(1,2,3))" + ".fold(hash, hash);", true); i.expectCompile("Either., String>right(\"hello there\")" + ".fold(hash, hash)", "cs2030s.fp.Transformer hash = o -> o.hashCode();\n" + "cs2030s.fp.Either., String>right(\"hello there\")" + ".fold(hash, hash);", true); i.expectReturn("Either.left(\"no change\")" + ".filterOrElse(x -> x == true, x -> \"\");", () -> Either.left("no change").filterOrElse(x -> x == true, x -> ""), Either.left("no change")); i.expectReturn("Either.right(true)" + ".filterOrElse(x -> x == true, x -> \"is false\");", () -> Either.right(true).filterOrElse(x -> x == true, x -> "is false"), Either.right(true)); i.expectReturn("Either.right(false)" + ".filterOrElse(x -> x == true, x -> \"is false\")", () -> Either.right(false).filterOrElse(x -> x == true, x -> "is false"), Either.left("is false")); String lambdas = "cs2030s.fp.Transformer toException = " + "o -> new IllegalStateException(o + \" is illegal\");" + "cs2030s.fp.BooleanCondition isPositive = n -> n.intValue() > 0;"; i.expectCompile("Either.left(new IllegalStateException())" + ".filterOrElse(isPositive, toException)", lambdas + "cs2030s.fp.Either.left(new IllegalStateException())" + ".filterOrElse(isPositive, toException);", true); i.expectCompile("Either.right(0)" + ".filterOrElse(isPositive, toException)", lambdas + "cs2030s.fp.Either.right(0)" + ".filterOrElse(isPositive, toException)", true); i.expectCompile("Either.right(8)" + ".filterOrElse(isPositive, toException);", lambdas + "cs2030s.fp.Either.right(8)" + ".filterOrElse(isPositive, toException)", true); } }