/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an
 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations
 *  under the License.
 */

package groovy.transform.stc

import groovy.test.GroovyTestCase

class LambdaTest extends GroovyTestCase {
    void testFunction() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p();
            }
        
            public static void p() {
                assert [2, 3, 4] == [1, 2, 3].stream().map(e -> e.plus 1).collect(Collectors.toList());
            }
        }
        '''
    }

    void testFunction2() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        public class Test1 {
            public static void main(String[] args) {
                p();
            }
        
            @CompileStatic
            public static void p() {
                assert [2, 3, 4] == [1, 2, 3].stream().map(e -> e.plus 1).collect(Collectors.toList());
            }
        }
        '''
    }


    void testFunctionScript() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        void p() {
            assert [2, 3, 4] == [1, 2, 3].stream().map(e -> e + 1).collect(Collectors.toList());
        }
        
        p()
        '''
    }

    void testFunctionScript2() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        void p() {
            assert [2, 3, 4] == [1, 2, 3].stream().map(e -> e.plus 1).collect(Collectors.toList());
        }
        
        p()
        '''
    }

    void testBinaryOperator() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p();
            }
            
            public static void p() {
                assert 13 == [1, 2, 3].stream().reduce(7, (Integer r, Integer e) -> r + e);
            }
        }
        '''
    }

    // GROOVY-8917: Failed to infer parameter type of some SAM, e.g. BinaryOperator
    void testBinaryOperatorWithoutExplicitTypeDef() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p();
            }
            
            public static void p() {
                assert 13 == [1, 2, 3].stream().reduce(7, (r, e) -> r + e);
            }
        }
        '''
    }

    void testBinaryOperatorWithoutExplicitTypeDef2() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        import java.util.function.BinaryOperator
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p();
            }
            
            public static void p() {
                BinaryOperator<Integer> accumulator = (r, e) -> r + e
                assert 13 == [1, 2, 3].stream().reduce(7, accumulator);
            }
        }
        '''
    }

    void testConsumer() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p();
            }
            
            public static void p() {
                [1, 2, 3].stream().forEach(e -> { System.out.println(e + 1); });
            }
            
        }
        '''
    }

    void testPredicate() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p();
            }
            
            public static void p() {
                def list = ['ab', 'bc', 'de']
                list.removeIf(e -> e.startsWith("a"))
                assert ['bc', 'de'] == list
            }
        }
        '''
    }

    void testPredicateWithoutExplicitTypeDef() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        import java.util.function.Function
        import java.util.function.Predicate
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p()
            }
        
            public static void p() {
                List<String> myList = Arrays.asList("a1", "a2", "b2", "b1", "c2", "c1")
                Predicate<String> predicate = s -> s.startsWith("b")
                Function<String, String> mapper = s -> s.toUpperCase()
                
                List<String> result =
                        myList
                            .stream()
                            .filter(predicate)
                            .map(mapper)
                            .sorted()
                            .collect(Collectors.toList())
                
                assert ['B1', 'B2'] == result
            }
        }
        '''
    }

    void testUnaryOperator() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p();
            }
            
            public static void p() {
                def list = [1, 2, 3]
                list.replaceAll(e -> e + 10)
                assert [11, 12, 13] == list
            }
        }
        '''
    }

    void testBiConsumer() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p();
            }
            
            public static void p() {
                def map = [a: 1, b: 2, c: 3]
                map.forEach((k, v) -> System.out.println(k + ":" + v));
            }
        }
        '''
    }

    void testFunctionWithLocalVariables() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p();
            }
        
            public static void p() {
                String x = "#"
                assert ['#1', '#2', '#3'] == [1, 2, 3].stream().map(e -> x + e).collect(Collectors.toList());
            }
        }
        '''
    }


    void testFunctionWithLocalVariables2() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                new Test1().p();
            }
        
            public void p() {
                String x = "#"
                Integer y = 23
                assert ['23#1', '23#2', '23#3'] == [1, 2, 3].stream().map(e -> '' + y + x + e).collect(Collectors.toList())
            }
        }
        '''
    }

    void testFunctionWithLocalVariables4() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        public class Test4 {
            public static void main(String[] args) {
                new Test4().p();
            }
        
            public void p() {
                String x = "x";
                StringBuilder y = new StringBuilder("y");
                assert ['yx1', 'yx2', 'yx3'] == [1, 2, 3].stream().map(e -> y + x + e).collect(Collectors.toList());
            }
        }
        '''
    }

    void testFunctionWithLocalVariables5() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        import java.util.function.Function
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                Function<Integer, String> f = p();
                assert '#1' == f(1)
            }
        
            static Function<Integer, String> p() {
                String x = "#"
                Function<Integer, String> f = (Integer e) -> x + e
                return f
            }
        }
        '''
    }

    void testFunctionWithLocalVariables6() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        import java.util.function.Function
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                Function<Integer, String> f = new Test1().p();
                assert '#1' == f(1)
            }
        
            Function<Integer, String> p() {
                String x = "#"
                Function<Integer, String> f = (Integer e) -> x + e
                return f
            }
        }
        '''
    }

    void testFunctionWithStaticMethodCall() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        public class Test4 {
            public static void main(String[] args) {
                p();
            }
        
            public static void p() {
                String x = "x";
                StringBuilder y = new StringBuilder("y");
                assert ['Hello yx1', 'Hello yx2', 'Hello yx3'] == [1, 2, 3].stream().map(e -> hello() + y + x + e).collect(Collectors.toList());
            }
        
            public static String hello() {
                return "Hello ";
            }
        }
        '''
    }

    void testFunctionWithStaticMethodCall2() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        public class Test4 {
            public static void main(String[] args) {
                p();
            }
        
            public static void p() {
                String x = "x";
                StringBuilder y = new StringBuilder("y");
                assert ['Hello yx1', 'Hello yx2', 'Hello yx3'] == [1, 2, 3].stream().map(e -> Test4.hello() + y + x + e).collect(Collectors.toList());
            }
        
            public static String hello() {
                return "Hello ";
            }
        }
        '''
    }

    void testFunctionWithInstanceMethodCall() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        public class Test4 {
            public static void main(String[] args) {
                new Test4().p();
            }
        
            public void p() {
                assert ['Hello Jochen', 'Hello Daniel'] == ["Jochen", "Daniel"].stream().map(e -> hello() + e).collect(Collectors.toList());
            }
        
            public String hello() {
                return "Hello ";
            }
        }
        '''
    }

    void testFunctionInConstructor() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        public class Test4 {
            public static void main(String[] args) {
                new Test4();
            }
            
            public Test4() {
                assert ['Hello Jochen', 'Hello Daniel'] == ["Jochen", "Daniel"].stream().map(e -> hello() + e).collect(Collectors.toList());
            }
        
            public String hello() {
                return "Hello ";
            }
        }
        '''
    }

    void testFunctionWithInstanceMethodCall2() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        public class Test4 {
            public static void main(String[] args) {
                new Test4().p();
            }
        
            public void p() {
                assert ['Hello Jochen', 'Hello Daniel'] == ["Jochen", "Daniel"].stream().map(e -> this.hello() + e).collect(Collectors.toList());
            }
        
            public String hello() {
                return "Hello ";
            }
        }
        '''
    }

    void testFunctionWithInstanceMethodCall3() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        public class Test4 {
            public static void main(String[] args) {
                new Test4().p();
            }
        
            public void p() {
                assert ['Hello Jochen', 'Hello Daniel'] == ["Jochen", "Daniel"].stream().map(e -> hello(e)).collect(Collectors.toList());
            }
        
            public String hello(String name) {
                return "Hello $name";
            }
        }
        '''
    }

    void testFunctionCall() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        import java.util.function.Function
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p();
            }
        
            public static void p() {
                Function<Integer, Integer> f = (Integer e) -> (Integer) (e + 1)
                assert 2 == f(1)
            }
        }
        '''
    }

    void testFunctionCallWithoutExplicitTypeDef() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        import java.util.function.Function
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p();
            }
        
            public static void p() {
                Function<Integer, Integer> f = e -> e + 1
                assert 2 == f(1)
            }
        }
        '''
    }

    void testFunctionCall2() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        import java.util.function.Function
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                new Test1().p();
            }
        
            public void p() {
                Function<Integer, Integer> f = (Integer e) -> (Integer) (e + 1)
                assert 2 == f(1)
            }
        }
        '''
    }

    void testFunctionCall3() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        import java.util.function.Function
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p();
            }
        
            public static void p() {
                Function<Integer, Integer> f = (Integer e) -> (Integer) (e + 1)
                assert 2 == f.apply(1)
            }
        }
        '''
    }

    void testConsumerCall() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        import java.util.function.Consumer
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p();
            }
        
            public static void p() {
                int r = 1
                Consumer<Integer> c = (Integer e) -> { r += e }
                c(2)
                assert 3 == r
            }
        }
        '''
    }

    void testConsumerCallWithoutExplicitTypeDef() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        import java.util.function.Consumer
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p();
            }
        
            public static void p() {
                int r = 1
                Consumer<Integer> c = e -> { r += e }
                c(2)
                assert 3 == r
            }
        }
        '''
    }

    void testConsumerCall2() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        import java.util.function.Consumer
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                new Test1().p();
            }
        
            public void p() {
                int r = 1
                Consumer<Integer> c = (Integer e) -> { r += e }
                c(2)
                assert 3 == r
            }
        }
        '''
    }

    void testConsumerCall3() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        import java.util.function.Consumer
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p();
            }
        
            public static void p() {
                int r = 1
                Consumer<Integer> c = (Integer e) -> { r += e }
                c.accept(2)
                assert 3 == r
            }
        }
        '''
    }

    void testSamCall() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p();
            }
            
            public static void p() {
                SamCallable c = (int e) -> e
                assert 1 == c(1)
            }
        }
        
        @CompileStatic
        interface SamCallable {
            int call(int p);
        }
        '''
    }


    void testSamCallWithoutExplicitTypeDef() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p();
            }
            
            public static void p() {
                SamCallable c = e -> e
                assert 1 == c(1)
            }
        }
        
        @CompileStatic
        interface SamCallable {
            int call(int p);
        }
        '''
    }

    void testSamCall2() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p();
            }
            
            public static void p() {
                SamCallable c = (int e) -> e // This is actually a closure(not a native lambda), because "Functional interface SamCallable is not an interface"
                assert 1 == c(1)
            }
        }
        
        @CompileStatic
        abstract class SamCallable {
            abstract int call(int p);
        }
        '''
    }

    void testFunctionWithUpdatingLocalVariable() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p();
            }
        
            public static void p() {
                int i = 1
                assert [2, 4, 7] == [1, 2, 3].stream().map(e -> i += e).collect(Collectors.toList())
                assert 7 == i
            }
        }
        '''
    }

    void testFunctionWithUpdatingLocalVariable2() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                new Test1().p();
            }
        
            public void p() {
                int i = 1
                assert [2, 4, 7] == [1, 2, 3].stream().map(e -> i += e).collect(Collectors.toList())
                assert 7 == i
            }
        }
        '''
    }

    void testFunctionWithVariableDeclaration() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        import java.util.function.Function
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p()
            }
        
            public static void p() {
                Function<Integer, String> f = (Integer e) -> 'a' + e
                assert ['a1', 'a2', 'a3'] == [1, 2, 3].stream().map(f).collect(Collectors.toList())
            }
        }
        
        '''
    }

    void testFunctionWithMixingVariableDeclarationAndMethodInvocation() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        import java.util.function.Function
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p()
            }
        
            public static void p() {
                String x = "#"
                Integer y = 23
                assert ['23#1', '23#2', '23#3'] == [1, 2, 3].stream().map(e -> '' + y + x + e).collect(Collectors.toList())
            
                Function<Integer, String> f = (Integer e) -> 'a' + e
                assert ['a1', 'a2', 'a3'] == [1, 2, 3].stream().map(f).collect(Collectors.toList())
                
                assert [2, 3, 4] == [1, 2, 3].stream().map(e -> e.plus 1).collect(Collectors.toList());
            }
        }
        
        '''
    }

    void testFunctionWithNestedLambda() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p()
            }
        
            public static void p() {
                [1, 2].stream().forEach(e -> {
                    def list = ['a', 'b'].stream().map(f -> f + e).toList()
                    if (1 == e) {
                        assert ['a1', 'b1'] == list
                    } else if (2 == e) {
                        assert ['a2', 'b2'] == list
                    }
                })
                
            }
        }
        '''
    }

    void testFunctionWithNestedLambda2() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p()
            }
        
            public static void p() {
                def list = ['a', 'b'].stream()
                .map(e -> {
                    [1, 2].stream().map(f -> e + f).toList()
                }).toList()
                
                assert ['a1', 'a2'] == list[0]
                assert ['b1', 'b2'] == list[1]
            }
        }
        '''
    }

    void testFunctionWithNestedLambda3() {
        assertScript '''
        import groovy.transform.CompileStatic
        import java.util.stream.Collectors
        import java.util.stream.Stream
        import java.util.function.Function
        
        @CompileStatic
        public class Test1 {
            public static void main(String[] args) {
                p()
            }
        
            public static void p() {
                def list = ['a', 'b'].stream()
                .map(e -> {
                    Function<Integer, String> x = (Integer f) -> e + f
                    [1, 2].stream().map(x).toList()
                }).toList()
                
                assert ['a1', 'a2'] == list[0]
                assert ['b1', 'b2'] == list[1]
            }
        }
        '''
    }

    void testMixingLambdaAndMethodReference() {
        assertScript '''
            import java.util.stream.Collectors
            
            @groovy.transform.CompileStatic
            void p() {
                assert ['1', '2', '3'] == [1, 2, 3].stream().map(Object::toString).collect(Collectors.toList())
                assert [2, 3, 4] == [1, 2, 3].stream().map(e -> e.plus 1).collect(Collectors.toList())
                assert ['1', '2', '3'] == [1, 2, 3].stream().map(Object::toString).collect(Collectors.toList())
            }
            
            p()
        '''
    }

    void testInitializeBlocks() {
        assertScript '''
            import java.util.stream.Collectors
            
            @groovy.transform.CompileStatic
            class Test1 {
                static sl
                def il
                static { sl = [1, 2, 3].stream().map(e -> e + 1).toList() }
                 
                {
                    il = [1, 2, 3].stream().map(e -> e + 2).toList()
                }
            }
            
            assert [2, 3, 4] == Test1.sl
            assert [3, 4, 5] == new Test1().il
        '''
    }

    void testSerialize() {
        assertScript '''
        import java.util.function.Function
        
        interface SerializableFunction<T, R> extends Function<T, R>, Serializable {}
        
        @groovy.transform.CompileStatic
        class Test1 {
            def p() {
                    def out = new ByteArrayOutputStream()
                    out.withObjectOutputStream {
                        SerializableFunction<Integer, String> f = ((Integer e) -> 'a' + e)
                        it.writeObject(f)
                    }
                    
                    return out.toByteArray()
            }
        }

        assert new Test1().p().length > 0
        '''
    }

    void testSerializeFailed() {
        def errMsg = shouldFail(NotSerializableException, '''
        import java.util.function.Function
        
        @groovy.transform.CompileStatic
        class Test1 {
            def p() {
                    def out = new ByteArrayOutputStream()
                    out.withObjectOutputStream {
                        Function<Integer, String> f = ((Integer e) -> 'a' + e)
                        it.writeObject(f)
                    }
                    
                    return out.toByteArray()
            }
        }

        new Test1().p()
        ''')

        assert errMsg.contains('$Lambda$')
    }

    void testDeserialize() {
        assertScript '''
        package tests.lambda
        import java.util.function.Function
        
        @groovy.transform.CompileStatic
        class Test1 {
            byte[] p() {
                    def out = new ByteArrayOutputStream()
                    out.withObjectOutputStream {
                        SerializableFunction<Integer, String> f = ((Integer e) -> 'a' + e)
                        it.writeObject(f)
                    }
                    
                    return out.toByteArray()
            }
            
            static void main(String[] args) {
                new ByteArrayInputStream(new Test1().p()).withObjectInputStream(Test1.class.classLoader) {
                    SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
                    assert 'a1' == f.apply(1)
                }
            }
            
            interface SerializableFunction<T, R> extends Function<T, R>, Serializable {}
        }
        '''
    }

    void testDeserializeLambdaInInitializeBlock() {
        assertScript '''
            package tests.lambda
            import java.util.function.Function
            
            @groovy.transform.CompileStatic
            class Test1 implements Serializable {
                private static final long serialVersionUID = -1L;
                String a = 'a'
                SerializableFunction<Integer, String> f
                 
                {
                    f = ((Integer e) -> a + e)
                }
                
                byte[] p() {
                    def out = new ByteArrayOutputStream()
                    out.withObjectOutputStream {
                        it.writeObject(f)
                    }
                    
                    return out.toByteArray()
                }
                
                static void main(String[] args) {
                    new ByteArrayInputStream(new Test1().p()).withObjectInputStream(Test1.class.classLoader) {
                        SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
                        assert 'a1' == f.apply(1)
                    }
                }
                
                interface SerializableFunction<T, R> extends Function<T, R>, Serializable {}
            }
        '''
    }

    void testDeserializeLambdaInInitializeBlockShouldFail() {
        def errMsg = shouldFail(NotSerializableException, '''
            package tests.lambda
            import java.util.function.Function
            
            @groovy.transform.CompileStatic
            class Test1 {
                String a = 'a'
                SerializableFunction<Integer, String> f
                 
                {
                    f = ((Integer e) -> a + e)
                }
                
                byte[] p() {
                    def out = new ByteArrayOutputStream()
                    out.withObjectOutputStream {
                        it.writeObject(f)
                    }
                    
                    return out.toByteArray()
                }
                
                static void main(String[] args) {
                    new Test1().p()
                }
                
                interface SerializableFunction<T, R> extends Function<T, R>, Serializable {}
            }
        ''')

        assert errMsg.contains('tests.lambda.Test1')
    }


    void testDeserialize2() {
        assertScript '''
        import java.util.function.Function
        
        @groovy.transform.CompileStatic
        class Test1 {
            static byte[] p() {
                    def out = new ByteArrayOutputStream()
                    out.withObjectOutputStream {
                        SerializableFunction<Integer, String> f = ((Integer e) -> 'a' + e)
                        it.writeObject(f)
                    }
                    
                    return out.toByteArray()
            }
            
            static void main(String[] args) {
                new ByteArrayInputStream(Test1.p()).withObjectInputStream(Test1.class.classLoader) {
                    SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
                    assert 'a1' == f.apply(1)
                }
            }
            
            interface SerializableFunction<T, R> extends Function<T, R>, Serializable {}
        }
        '''
    }

    void testDeserialize3() {
        assertScript '''
        package tests.lambda
        import java.util.function.Function
        
        @groovy.transform.CompileStatic
        class Test1 {
            byte[] p() {
                    def out = new ByteArrayOutputStream()
                    out.withObjectOutputStream {
                        String c = 'a'
                        SerializableFunction<Integer, String> f = (Integer e) -> c + e
                        it.writeObject(f)
                    }
                    
                    return out.toByteArray()
            }
            
            static void main(String[] args) {
                new ByteArrayInputStream(new Test1().p()).withObjectInputStream(Test1.class.classLoader) {
                    SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
                    assert 'a1' == f.apply(1)
                }
            }
            
            interface SerializableFunction<T, R> extends Function<T, R>, Serializable {}
        }
        '''
    }

    void testDeserialize4() {
        assertScript '''
        package tests.lambda
        import java.util.function.Function
        
        @groovy.transform.CompileStatic
        class Test1 {
            byte[] p() {
                    def out = new ByteArrayOutputStream()
                    String c = 'a'
                    SerializableFunction<Integer, String> f = (Integer e) -> c + e
                    out.withObjectOutputStream {
                        it.writeObject(f)
                    }
                    
                    return out.toByteArray()
            }
            
            static void main(String[] args) {
                new ByteArrayInputStream(new Test1().p()).withObjectInputStream(Test1.class.classLoader) {
                    SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
                    assert 'a1' == f.apply(1)
                }
            }
            
            interface SerializableFunction<T, R> extends Function<T, R>, Serializable {}
        }
        '''
    }

    void testDeserialize5() {
        assertScript '''
        package tests.lambda
        import java.util.function.Function
        
        @groovy.transform.CompileStatic
        class Test1 {
            static byte[] p() {
                    def out = new ByteArrayOutputStream()
                    String c = 'a'
                    SerializableFunction<Integer, String> f = (Integer e) -> c + e
                    out.withObjectOutputStream {
                        it.writeObject(f)
                    }
                    
                    return out.toByteArray()
            }
            
            static void main(String[] args) {
                new ByteArrayInputStream(Test1.p()).withObjectInputStream(Test1.class.classLoader) {
                    SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
                    assert 'a1' == f.apply(1)
                }
            }
            
            interface SerializableFunction<T, R> extends Function<T, R>, Serializable {}
        }
        '''
    }

    void testDeserialize6InstanceFields() {
        assertScript '''
        package tests.lambda
        import java.util.function.Function
        
        @groovy.transform.CompileStatic
        class Test1 implements Serializable {
            private static final long serialVersionUID = -1L;
            private String c = 'a'
            
            byte[] p() {
                    def out = new ByteArrayOutputStream()
                    SerializableFunction<Integer, String> f = (Integer e) -> c + e
                    out.withObjectOutputStream {
                        it.writeObject(f)
                    }
                    
                    return out.toByteArray()
            }
            
            static void main(String[] args) {
                new ByteArrayInputStream(new Test1().p()).withObjectInputStream(Test1.class.classLoader) {
                    SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
                    assert 'a1' == f.apply(1)
                }
            }
            
            interface SerializableFunction<T, R> extends Function<T, R>, Serializable {}
        }
        '''
    }

    void testDeserialize6InstanceFieldsShouldFail() {
        def errMsg = shouldFail(NotSerializableException, '''
        package tests.lambda
        import java.util.function.Function
        
        @groovy.transform.CompileStatic
        class Test1 {
            private String c = 'a'
            
            byte[] p() {
                    def out = new ByteArrayOutputStream()
                    SerializableFunction<Integer, String> f = (Integer e) -> c + e
                    out.withObjectOutputStream {
                        it.writeObject(f)
                    }
                    
                    return out.toByteArray()
            }
            
            static void main(String[] args) {
                new ByteArrayInputStream(new Test1().p()).withObjectInputStream(Test1.class.classLoader) {
                    SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
                    assert 'a1' == f.apply(1)
                }
            }
            
            interface SerializableFunction<T, R> extends Function<T, R>, Serializable {}
        }
        ''')

        assert errMsg.contains('tests.lambda.Test1')
    }

    void testDeserialize6InstanceMethods() {
        assertScript '''
        package tests.lambda
        import java.util.function.Function
        
        @groovy.transform.CompileStatic
        class Test1 implements Serializable {
            private static final long serialVersionUID = -1L;
            private String c() { 'a' }
            
            byte[] p() {
                    def out = new ByteArrayOutputStream()
                    SerializableFunction<Integer, String> f = (Integer e) -> c() + e
                    out.withObjectOutputStream {
                        it.writeObject(f)
                    }
                    
                    return out.toByteArray()
            }
            
            static void main(String[] args) {
                new ByteArrayInputStream(new Test1().p()).withObjectInputStream(Test1.class.classLoader) {
                    SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
                    assert 'a1' == f.apply(1)
                }
            }
            
            interface SerializableFunction<T, R> extends Function<T, R>, Serializable {}
        }
        '''
    }

    void testDeserialize6InstanceMethodsShouldFail() {
        def errMsg = shouldFail(NotSerializableException, '''
        package tests.lambda
        import java.util.function.Function
        
        @groovy.transform.CompileStatic
        class Test1 {
            private String c() { 'a' }
            
            byte[] p() {
                    def out = new ByteArrayOutputStream()
                    SerializableFunction<Integer, String> f = (Integer e) -> c() + e
                    out.withObjectOutputStream {
                        it.writeObject(f)
                    }
                    
                    return out.toByteArray()
            }
            
            static void main(String[] args) {
                new ByteArrayInputStream(new Test1().p()).withObjectInputStream(Test1.class.classLoader) {
                    SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
                    assert 'a1' == f.apply(1)
                }
            }
            
            interface SerializableFunction<T, R> extends Function<T, R>, Serializable {}
        }
        ''')

        assert errMsg.contains('tests.lambda.Test1')
    }

    void testDeserialize7StaticFields() {
        assertScript '''
        package tests.lambda
        import java.util.function.Function
        
        @groovy.transform.CompileStatic
        class Test1 {
            private static final String c = 'a'
            static byte[] p() {
                    def out = new ByteArrayOutputStream()
                    SerializableFunction<Integer, String> f = (Integer e) -> c + e
                    out.withObjectOutputStream {
                        it.writeObject(f)
                    }
                    
                    return out.toByteArray()
            }
            
            static void main(String[] args) {
                new ByteArrayInputStream(Test1.p()).withObjectInputStream(Test1.class.classLoader) {
                    SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
                    assert 'a1' == f.apply(1)
                }
            }
            
            interface SerializableFunction<T, R> extends Function<T, R>, Serializable {}
        }
        '''
    }


    void testDeserialize7StaticMethods() {
        assertScript '''
        package tests.lambda
        import java.util.function.Function
        
        @groovy.transform.CompileStatic
        class Test1 {
            private static String c() { 'a' }
            static byte[] p() {
                    def out = new ByteArrayOutputStream()
                    SerializableFunction<Integer, String> f = (Integer e) -> c() + e
                    out.withObjectOutputStream {
                        it.writeObject(f)
                    }
                    
                    return out.toByteArray()
            }
            
            static void main(String[] args) {
                new ByteArrayInputStream(Test1.p()).withObjectInputStream(Test1.class.classLoader) {
                    SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
                    assert 'a1' == f.apply(1)
                }
            }
            
            interface SerializableFunction<T, R> extends Function<T, R>, Serializable {}
        }
        '''
    }

    void testDeserializeNestedLambda() {
        assertScript '''
        import java.util.function.Function
        
        interface SerializableFunction<T, R> extends Function<T, R>, Serializable {}
        
        @groovy.transform.CompileStatic
        class Test1 {
            def p() {
                    def out1 = new ByteArrayOutputStream()
                    SerializableFunction<Integer, String> f1 = (Integer e) -> 'a' + e
                    out1.withObjectOutputStream {
                        it.writeObject(f1)
                    }
                    def result1 = out1.toByteArray()
                    
                    def out2 = new ByteArrayOutputStream()
                    SerializableFunction<Integer, String> f2 = (Integer e) -> 'b' + e
                    out2.withObjectOutputStream {
                        it.writeObject(f2)
                    }
                    def result2 = out2.toByteArray()
                    
                    // nested lambda expression
                    def out3 = new ByteArrayOutputStream()
                    SerializableFunction<Integer, String> f3 = (Integer e) -> {
                        SerializableFunction<Integer, String> nf = ((Integer ne) -> 'n' + ne)
                        'c' + nf(e)
                    }
                    out3.withObjectOutputStream {
                        it.writeObject(f3)
                    }
                    def result3 = out3.toByteArray()
                    
                    return [result1, result2, result3]
            }
        }
        
        def (byte[] serializedLambdaBytes1, byte[] serializedLambdaBytes2, byte[] serializedLambdaBytes3) = new Test1().p()
        new ByteArrayInputStream(serializedLambdaBytes1).withObjectInputStream(Test1.class.classLoader) {
            SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
            assert 'a1' == f.apply(1)
        }
        
        new ByteArrayInputStream(serializedLambdaBytes2).withObjectInputStream(Test1.class.classLoader) {
            SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
            assert 'b1' == f.apply(1)
        }
        
        new ByteArrayInputStream(serializedLambdaBytes3).withObjectInputStream(Test1.class.classLoader) {
            SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
            assert 'cn1' == f.apply(1)
        }
        '''
    }

    void testDeserializeNestedLambda2() {
        assertScript '''
        import java.util.function.Function
        
        interface SerializableFunction<T, R> extends Function<T, R>, Serializable {}
        
        @groovy.transform.CompileStatic
        class Test1 {
            def p() {
                    def out1 = new ByteArrayOutputStream()
                    out1.withObjectOutputStream {
                        SerializableFunction<Integer, String> f = ((Integer e) -> 'a' + e)
                        it.writeObject(f)
                    }
                    def result1 = out1.toByteArray()
                    
                    def out2 = new ByteArrayOutputStream()
                    out2.withObjectOutputStream {
                        SerializableFunction<Integer, String> f = ((Integer e) -> 'b' + e)
                        it.writeObject(f)
                    }
                    def result2 = out2.toByteArray()
                    
                    // nested lambda expression
                    def out3 = new ByteArrayOutputStream()
                    out3.withObjectOutputStream {
                        SerializableFunction<Integer, String> f = ((Integer e) -> {
                            SerializableFunction<Integer, String> nf = ((Integer ne) -> 'n' + ne)
                            'c' + nf(e)
                        })
                        it.writeObject(f)
                    }
                    def result3 = out3.toByteArray()
                    
                    return [result1, result2, result3]
            }
        }
        
        def (byte[] serializedLambdaBytes1, byte[] serializedLambdaBytes2, byte[] serializedLambdaBytes3) = new Test1().p()
        new ByteArrayInputStream(serializedLambdaBytes1).withObjectInputStream(Test1.class.classLoader) {
            SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
            assert 'a1' == f.apply(1)
        }
        
        new ByteArrayInputStream(serializedLambdaBytes2).withObjectInputStream(Test1.class.classLoader) {
            SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
            assert 'b1' == f.apply(1)
        }
        
        new ByteArrayInputStream(serializedLambdaBytes3).withObjectInputStream(Test1.class.classLoader) {
            SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
            assert 'cn1' == f.apply(1)
        }
        '''
    }

    void testDeserializeNestedLambda3() {
        assertScript '''
        import java.util.function.Function
        
        interface SerializableFunction<T, R> extends Function<T, R>, Serializable {}
        
        @groovy.transform.CompileStatic
        class Test1 {
            static p() {
                    def out1 = new ByteArrayOutputStream()
                    out1.withObjectOutputStream {
                        SerializableFunction<Integer, String> f = ((Integer e) -> 'a' + e)
                        it.writeObject(f)
                    }
                    def result1 = out1.toByteArray()
                    
                    def out2 = new ByteArrayOutputStream()
                    out2.withObjectOutputStream {
                        SerializableFunction<Integer, String> f = ((Integer e) -> 'b' + e)
                        it.writeObject(f)
                    }
                    def result2 = out2.toByteArray()
                    
                    // nested lambda expression
                    def out3 = new ByteArrayOutputStream()
                    out3.withObjectOutputStream {
                        SerializableFunction<Integer, String> f = ((Integer e) -> {
                            SerializableFunction<Integer, String> nf = ((Integer ne) -> 'n' + ne)
                            'c' + nf(e)
                        })
                        it.writeObject(f)
                    }
                    def result3 = out3.toByteArray()
                    
                    return [result1, result2, result3]
            }
        }
        
        def (byte[] serializedLambdaBytes1, byte[] serializedLambdaBytes2, byte[] serializedLambdaBytes3) = Test1.p()
        new ByteArrayInputStream(serializedLambdaBytes1).withObjectInputStream(Test1.class.classLoader) {
            SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
            assert 'a1' == f.apply(1)
        }
        
        new ByteArrayInputStream(serializedLambdaBytes2).withObjectInputStream(Test1.class.classLoader) {
            SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
            assert 'b1' == f.apply(1)
        }
        
        new ByteArrayInputStream(serializedLambdaBytes3).withObjectInputStream(Test1.class.classLoader) {
            SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
            assert 'cn1' == f.apply(1)
        }
        '''
    }

    void testDeserializeNestedLambda4() {
        assertScript '''
        import java.util.function.Function
        
        interface SerializableFunction<T, R> extends Function<T, R>, Serializable {}
        
        @groovy.transform.CompileStatic
        class Test1 {
            static p() {
                    def out1 = new ByteArrayOutputStream()
                    SerializableFunction<Integer, String> f1 = (Integer e) -> 'a' + e
                    out1.withObjectOutputStream {
                        it.writeObject(f1)
                    }
                    def result1 = out1.toByteArray()
                    
                    def out2 = new ByteArrayOutputStream()
                    SerializableFunction<Integer, String> f2 = (Integer e) -> 'b' + e
                    out2.withObjectOutputStream {
                        it.writeObject(f2)
                    }
                    def result2 = out2.toByteArray()
                    
                    // nested lambda expression
                    def out3 = new ByteArrayOutputStream()
                    SerializableFunction<Integer, String> f3 = (Integer e) -> {
                        SerializableFunction<Integer, String> nf = ((Integer ne) -> 'n' + ne)
                        'c' + nf(e)
                    }
                    out3.withObjectOutputStream {
                        it.writeObject(f3)
                    }
                    def result3 = out3.toByteArray()
                    
                    return [result1, result2, result3]
            }
        }
        
        def (byte[] serializedLambdaBytes1, byte[] serializedLambdaBytes2, byte[] serializedLambdaBytes3) = Test1.p()
        new ByteArrayInputStream(serializedLambdaBytes1).withObjectInputStream(Test1.class.classLoader) {
            SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
            assert 'a1' == f.apply(1)
        }
        
        new ByteArrayInputStream(serializedLambdaBytes2).withObjectInputStream(Test1.class.classLoader) {
            SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
            assert 'b1' == f.apply(1)
        }
        
        new ByteArrayInputStream(serializedLambdaBytes3).withObjectInputStream(Test1.class.classLoader) {
            SerializableFunction<Integer, String> f = (SerializableFunction<Integer, String>) it.readObject()
            assert 'cn1' == f.apply(1)
        }
        '''
    }

}
