package hu.advancedweb.scott; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.*; import java.util.function.Function; import org.junit.Test; import hu.advancedweb.scott.helper.TestHelper; public class LambdaRecordingTest { @Test public void test_with_lambda() throws Exception { Function<String, String> lambda = input -> { assertThat(TestHelper.getLastRecordedStateForVariable("input"), equalTo(input)); String inner = "inner"; assertThat(TestHelper.getLastRecordedStateForVariable("inner"), equalTo(inner)); return inner; }; assertThat(TestHelper.getLastRecordedStateForVariable("lambda"), equalTo(lambda.toString())); String outer = "outer"; assertThat(TestHelper.getLastRecordedStateForVariable("outer"), equalTo(outer)); String result = lambda.apply(outer); assertThat(TestHelper.getLastRecordedStateForVariable("result"), equalTo(result)); } @Test public void lambda_with_multiple_parameters() throws Exception { Function2<String, String, String> lambda = (a, b) -> { assertThat(TestHelper.getLastRecordedStateForVariable("a"), equalTo(a)); assertThat(TestHelper.getLastRecordedStateForVariable("b"), equalTo(b)); return a + b; }; String result = lambda.apply("1", "2"); assertThat(TestHelper.getLastRecordedStateForVariable("result"), equalTo(result)); } @FunctionalInterface interface Function2 <A, B, R> { public R apply (A a, B b); } @Test public void lambda_with_single_expression() throws Exception { System.out.println("hello"); Function<String, String> lambda = a -> a + a; String result = lambda.apply("1"); assertThat(TestHelper.getLastRecordedStateForVariable("result"), equalTo(result)); } @Test public void lambda_in_lambda() throws Exception { Function<String, String> lambda = input -> { assertThat(TestHelper.getLastRecordedStateForVariable("input"), equalTo(input)); String inner = "inner" + input; assertThat(TestHelper.getLastRecordedStateForVariable("inner"), equalTo(inner)); Function<String, String> lambdaInner = inputInner -> { assertThat(TestHelper.getLastRecordedStateForVariable("inputInner"), equalTo(inputInner)); String innerInner = "inner" + inputInner + input; assertThat(TestHelper.getLastRecordedStateForVariable("innerInner"), equalTo(innerInner)); return innerInner; }; return lambdaInner.apply(inner); }; assertThat(TestHelper.getLastRecordedStateForVariable("lambda"), equalTo(lambda.toString())); String outer = "outer"; assertThat(TestHelper.getLastRecordedStateForVariable("outer"), equalTo(outer)); String result = lambda.apply(outer); assertThat(TestHelper.getLastRecordedStateForVariable("result"), equalTo(result)); } @Test public void static_method_reference() throws Exception { Function<String, String> fun = LambdaRecordingTest::myStaticMethod; String result = fun.apply("1"); assertThat(TestHelper.getLastRecordedStateForVariable("result"), equalTo(result)); } static String myStaticMethod(String s) { return s + s; } @Test public void method_reference() throws Exception { Function<String, String> fun = this::myMethod; String result = fun.apply("1"); assertThat(TestHelper.getLastRecordedStateForVariable("result"), equalTo(result)); } String myMethod(String s) { return s + s; } @Test public void constructor_reference() throws Exception { Function<String, String> constructor = String::new; String newString = constructor.apply("1"); assertThat(TestHelper.getLastRecordedStateForVariable("newString"), equalTo(newString)); } }