/*
 * Copyright 2017 Volker Berlin (i-net software)
 *
 * Licensed 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 de.inetsoftware.jwebassembly.math;

import java.util.Arrays;
import java.util.Collection;

import org.junit.ClassRule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.webassembly.annotation.Export;

import de.inetsoftware.jwebassembly.ScriptEngine;
import de.inetsoftware.jwebassembly.WasmRule;

/**
 * @author Volker Berlin
 */
@RunWith(Parameterized.class)
public class MathOperations {
    
    @ClassRule
    public static WasmRule rule = new WasmRule( TestClass.class ); 

    private final ScriptEngine script;

    public MathOperations( ScriptEngine script) {
        this.script = script;
    }

    @Parameters(name="{0}")
    public static Collection<Object[]> data() {
        return ScriptEngine.testParams();
    }

    @Test
    public void intConst() {
        rule.test( script, "intConst" );
    }

    @Test
    public void floatConst() {
        rule.test( script, "floatConst" );
    }

    @Test
    public void doubleConst() {
        rule.test( script, "doubleConst" );
    }

    @Test
    public void addInt() {
        rule.test( script, "addInt", 1, 3 );
    }

    @Test
    public void addLong() {
        rule.test( script, "addLong" );
    }

    @Test
    public void addFloat() {
        rule.test( script, "addFloat", 1F, 3.5F );
    }

    @Test
    public void addDouble() {
        rule.test( script, "addDouble", 1.0, 3.5 );
    }

    static class TestClass {

        @Export
        static int intConst() {
            return 42;
        }

        @Export
        static float floatConst() {
            return 42.5F;
        }

        @Export
        static double doubleConst() {
            return 42.5;
        }

        @Export
        static int addInt( int a, int b ) {
            return a + b;
        }

        @Export
        static int addLong() {
            long a = 1L;
            long b = 3L;
            return (int)(a + b);
        }

        @Export
        static float addFloat( float a, float b ) {
            return a + b;
        }

        @Export
        static double addDouble( double a, double b ) {
            return a + b;
        }
    }
}

@@ -652,16 +652,44 @@
 .math;%0A%0A
+import java.util.ArrayList;%0A
 import j
@@ -1270,16 +1270,84 @@
  script;
+%0A    private final String method;%0A    private final Object%5B%5D params;
 %0A%0A    pu
@@ -1386,16 +1386,49 @@
 e script
+, String method, Object%5B%5D params 
 ) %7B%0A    
@@ -1449,24 +1449,84 @@
 t = script;%0A
+        this.method = method;%0A        this.params = params;%0A
     %7D%0A%0A    @
@@ -1545,16 +1545,20 @@
 ame=%22%7B0%7D
+-%7B1%7D
 %22)%0A    p
@@ -1608,22 +1608,89 @@
         
-return
+ArrayList%3CObject%5B%5D%3E list = new ArrayList%3C%3E();%0A        for( Object%5B%5D val :
  ScriptE
@@ -1711,74 +1711,96 @@
 ms()
-;
+ ) %7B
 %0A    
-%7D%0A%0A
     
-@Test%0A    public void intConst() %7B%0A        rule.test(
+    ScriptEngine script = (ScriptEngine)val%5B0%5D;%0A            addParam( list,
  scr
@@ -1826,70 +1826,31 @@
     
-%7D%0A%0A
     
-@Test%0A    public void floatConst() %7B%0A        rule.test(
+    addParam( list,
  scr
@@ -1878,71 +1878,84 @@
     
-%7D%0A%0A
     
-@Test%0A    public void doubleConst() %7B%0A        rule.test(
+    addParam( list, script, %22doubleConst%22 );%0A            addParam( list,
  scr
@@ -1960,36 +1960,37 @@
 cript, %22
-doubleConst%22
+addInt%22, 1, 3
  );%0A    
 %7D%0A%0A    @
@@ -1985,66 +1985,80 @@
     
-%7D%0A%0A
+ 
     
-@Test%0A    public void addInt() %7B%0A        rule.test(
+   addParam( list, script, %22addLong%22 );%0A            addParam( list,
  scr
@@ -2066,34 +2066,40 @@
 pt, %22add
-In
+Floa
 t%22, 1
+F
 , 3
+.5F
  );%0A    
 %7D%0A%0A    @
@@ -2094,67 +2094,31 @@
     
-%7D%0A%0A
     
-@Test%0A    public void addLong() %7B%0A        rule.test(
+    addParam( list,
  scr
@@ -2126,29 +2126,41 @@
 pt, %22add
-Long%22
+Double%22, 1.0, 3.5
  );%0A    
 %7D%0A%0A    @
@@ -2155,97 +2155,213 @@
     
+    
 %7D
-%0A
 %0A    
-@Test%0A    public void addFloat() %7B%0A        rule.test( script, %22addFloat%22, 1F, 3.5F
+    return list;%0A    %7D%0A%0A    private static void addParam( ArrayList%3CObject%5B%5D%3E list, ScriptEngine script, String method, Object ...params ) %7B%0A        list.add( new Object%5B%5D%7Bscript, method, params%7D
  );%0A
@@ -2393,25 +2393,20 @@
 ic void 
-addDouble
+test
 () %7B%0A   
@@ -2429,37 +2429,30 @@
 script, 
-%22addDouble%22, 1.0, 3.5
+method, params
  );%0A    

remove boiler plate code from test