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