19d344289a41d19afec915a11b8c44dd2e7638a24Michael Chenpackage libcore.java.math;
29d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen
39d344289a41d19afec915a11b8c44dd2e7638a24Michael Chenimport java.lang.reflect.Method;
49d344289a41d19afec915a11b8c44dd2e7638a24Michael Chenimport java.util.Collections;
59d344289a41d19afec915a11b8c44dd2e7638a24Michael Chenimport java.util.HashMap;
69d344289a41d19afec915a11b8c44dd2e7638a24Michael Chenimport java.util.Map;
79d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen
89d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen/**
99d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen * Tests functions in java.lang.Math
109d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen * Looks for the filenames in csvFileNames in tests/resources
119d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen * Tests functions and numbers found in those files.
129d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen * Run: vogar --classpath out/target/common/obj/JAVA_LIBRARIES/core-tests-support_intermediates/javalib.jar
139d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen * libcore/luni/src/test/java/libcore/java/math/RunCSVTests.java
149d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen */
159d344289a41d19afec915a11b8c44dd2e7638a24Michael Chenpublic class RunCSVTests extends CSVTest {
169d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen    /** Stores ulps of error allowed for each function, if not 1 ulp.*/
179d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen    private static final Map<String, Double> UlpMap;
189d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen    static {
199d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        final HashMap<String, Double> funcUlps = new HashMap<String, Double>();
209d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        funcUlps.put("sinh", 2.5);
219d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        funcUlps.put("cosh", 2.5);
229d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        funcUlps.put("tanh", 2.5);
239d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        funcUlps.put("abs", 0.0);
249d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        funcUlps.put("signum", 0.0);
259d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        funcUlps.put("getExponent", 0.0);
269d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        funcUlps.put("toRadians", 0.0);
279d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        funcUlps.put("toDegrees", 0.0);
289d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        funcUlps.put("sqrt", 0.0);
299d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        funcUlps.put("ceil", 0.0);
309d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        funcUlps.put("floor", 0.0);
319d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        funcUlps.put("rint", 0.0);
329d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        funcUlps.put("atan2", 2.0);
339d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        funcUlps.put("round", 0.0);
349d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        funcUlps.put("max", 0.0);
359d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        funcUlps.put("min", 0.0);
369d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        funcUlps.put("copySign", 0.0);
379d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        funcUlps.put("nextAfter", 0.0);
389d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        funcUlps.put("scalb", 0.0);
399d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        UlpMap = Collections.unmodifiableMap(funcUlps);
409d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen    }
419d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen
429d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen    public static final String[] csvFileNames = { "/math_tests.csv",
439d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen            "/math_important_numbers.csv", "/math_java_only.csv" };
449d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen
459d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen    public void test_csv() throws Exception {
469d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        this.TestCSVInputs(csvFileNames);
479d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen    }
489d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen
499d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen    /**
509d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen     * Runs a standard single-input test using assertEquals.
519d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen     * Allows error based on UlpMap, but defaults to 1 ulp.
529d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen     */
539d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen    @Override
549d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen    void runTest(String func, double expectedOutput, double input, String extra)
559d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen            throws Exception {
569d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        Class<Math> mathClass = Math.class;
579d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        Method m = mathClass.getMethod(func, new Class[] { Double.TYPE });
589d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        Object returnValue = m.invoke(null, input);
599d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen
609d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        double allowedError;
619d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        if (UlpMap.containsKey(func)) {
629d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen            allowedError = UlpMap.get(func)*Math.ulp(expectedOutput);
639d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        } else {
649d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen            allowedError = Math.ulp(expectedOutput);
659d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        }
669d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen
679d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        try {
689d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen            assertEquals(extra + ": " + m + ": " + input + ": ", expectedOutput,
699d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen                         (double) returnValue, allowedError);
709d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        } catch (ClassCastException e) {
719d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen            assertEquals(extra + ": " + m + ": " + input + ": ", (int) expectedOutput,
729d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen                         (int) returnValue, allowedError);
739d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        }
749d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen    }
759d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen
769d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen    /**
779d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen     * Runs a 2-input test using assertEquals.
789d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen     * Allows error based on UlpMap, but defaults to 1 ulp.
799d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen     */
809d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen    @Override
819d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen    void run2InputTest(String func, double expectedOutput, double input1,
829d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen            double input2, String extra) throws Exception {
839d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        Class<Math> mathClass = Math.class;
849d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        Method m;
859d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        Object returnValue;
869d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        if (func.equals("scalb")) {
879d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen            m = mathClass.getMethod(func, new Class[] { Double.TYPE, Integer.TYPE });
889d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen            returnValue = m.invoke(null, input1, (int) input2);
899d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        } else {
909d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen            m = mathClass.getMethod(func, new Class[] { Double.TYPE, Double.TYPE });
919d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen            returnValue = m.invoke(null, input1, input2);
929d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        }
939d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen
949d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        double allowedError;
959d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        if (UlpMap.containsKey(func)) {
969d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen            allowedError = UlpMap.get(func)*Math.ulp(expectedOutput);
979d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        } else {
989d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen            allowedError = Math.ulp(expectedOutput);
999d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        }
1009d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen
1019d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        try {
1029d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen            assertEquals(extra + ": " + m + ": ", expectedOutput, (double) returnValue,
1039d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen                         allowedError);
1049d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        } catch (ClassCastException e) {
1059d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen            assertEquals(extra + ": " + m + ": ", (int) expectedOutput, (int) returnValue,
1069d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen                         allowedError);
1079d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen        }
1089d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen    }
1099d344289a41d19afec915a11b8c44dd2e7638a24Michael Chen}
110