1425bb815Sopenharmony_ci/* Copyright JS Foundation and other contributors, http://js.foundation 2425bb815Sopenharmony_ci * 3425bb815Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4425bb815Sopenharmony_ci * you may not use this file except in compliance with the License. 5425bb815Sopenharmony_ci * You may obtain a copy of the License at 6425bb815Sopenharmony_ci * 7425bb815Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8425bb815Sopenharmony_ci * 9425bb815Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10425bb815Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS 11425bb815Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12425bb815Sopenharmony_ci * See the License for the specific language governing permissions and 13425bb815Sopenharmony_ci * limitations under the License. 14425bb815Sopenharmony_ci */ 15425bb815Sopenharmony_ci 16425bb815Sopenharmony_ci/** 17425bb815Sopenharmony_ci * Unit test for jerry-libm 18425bb815Sopenharmony_ci */ 19425bb815Sopenharmony_ci 20425bb815Sopenharmony_ci#include <math.h> 21425bb815Sopenharmony_ci#include <stdbool.h> 22425bb815Sopenharmony_ci#include <stdint.h> 23425bb815Sopenharmony_ci#include <stdio.h> 24425bb815Sopenharmony_ci 25425bb815Sopenharmony_cistatic bool passed = true; 26425bb815Sopenharmony_ci 27425bb815Sopenharmony_cistatic void 28425bb815Sopenharmony_cicheck_int (const char *expr, int computed, int expected) 29425bb815Sopenharmony_ci{ 30425bb815Sopenharmony_ci printf ("%s = %d [expected=%d] ", expr, computed, expected); 31425bb815Sopenharmony_ci 32425bb815Sopenharmony_ci bool result = computed == expected; 33425bb815Sopenharmony_ci printf ("%s\n", result ? "PASS" : "FAIL"); 34425bb815Sopenharmony_ci 35425bb815Sopenharmony_ci passed &= result; 36425bb815Sopenharmony_ci} /* check_int */ 37425bb815Sopenharmony_ci 38425bb815Sopenharmony_citypedef union 39425bb815Sopenharmony_ci{ 40425bb815Sopenharmony_ci double value; 41425bb815Sopenharmony_ci uint64_t bits64; 42425bb815Sopenharmony_ci uint32_t bits32[2]; 43425bb815Sopenharmony_ci} double_bits_t; 44425bb815Sopenharmony_ci 45425bb815Sopenharmony_cistatic void 46425bb815Sopenharmony_cicheck_double (const char *expr, double computed, double expected) 47425bb815Sopenharmony_ci{ 48425bb815Sopenharmony_ci double_bits_t computed_bits; 49425bb815Sopenharmony_ci double_bits_t expected_bits; 50425bb815Sopenharmony_ci 51425bb815Sopenharmony_ci computed_bits.value = computed; 52425bb815Sopenharmony_ci expected_bits.value = expected; 53425bb815Sopenharmony_ci 54425bb815Sopenharmony_ci printf ("%s = 0x%08x%08x [expected=0x%08x%08x] ", expr, 55425bb815Sopenharmony_ci (unsigned int) computed_bits.bits32[1], (unsigned int) computed_bits.bits32[0], 56425bb815Sopenharmony_ci (unsigned int) expected_bits.bits32[1], (unsigned int) expected_bits.bits32[0]); 57425bb815Sopenharmony_ci 58425bb815Sopenharmony_ci bool result; 59425bb815Sopenharmony_ci if (isnan (computed) && isnan (expected)) 60425bb815Sopenharmony_ci { 61425bb815Sopenharmony_ci result = true; 62425bb815Sopenharmony_ci } 63425bb815Sopenharmony_ci else 64425bb815Sopenharmony_ci { 65425bb815Sopenharmony_ci int64_t diff = (int64_t) (computed_bits.bits64 - expected_bits.bits64); 66425bb815Sopenharmony_ci if (diff < 0) 67425bb815Sopenharmony_ci { 68425bb815Sopenharmony_ci diff = -diff; 69425bb815Sopenharmony_ci } 70425bb815Sopenharmony_ci 71425bb815Sopenharmony_ci if (diff <= 1) /* tolerate 1 bit of differene in the last place */ 72425bb815Sopenharmony_ci { 73425bb815Sopenharmony_ci result = true; 74425bb815Sopenharmony_ci if (diff != 0) 75425bb815Sopenharmony_ci { 76425bb815Sopenharmony_ci printf ("APPROX "); 77425bb815Sopenharmony_ci } 78425bb815Sopenharmony_ci } 79425bb815Sopenharmony_ci else 80425bb815Sopenharmony_ci { 81425bb815Sopenharmony_ci result = false; 82425bb815Sopenharmony_ci } 83425bb815Sopenharmony_ci } 84425bb815Sopenharmony_ci printf ("%s\n", result ? "PASS" : "FAIL"); 85425bb815Sopenharmony_ci 86425bb815Sopenharmony_ci passed &= result; 87425bb815Sopenharmony_ci} /* check_double */ 88425bb815Sopenharmony_ci 89425bb815Sopenharmony_ciint 90425bb815Sopenharmony_cimain (void) 91425bb815Sopenharmony_ci{ 92425bb815Sopenharmony_ci#define INF INFINITY 93425bb815Sopenharmony_ci#include "test-libm.inc.h" 94425bb815Sopenharmony_ci 95425bb815Sopenharmony_ci return passed ? 0 : 1; 96425bb815Sopenharmony_ci} /* main */ 97