Home | History | Annotate | Download | only in unit
      1 #define _STLP_DO_IMPORT_CSTD_FUNCTIONS
      2 
      3 #include <limits>
      4 #include <cmath>
      5 //We also test math functions imported from stdlib.h or
      6 //defined in cstdlib
      7 #include <cstdlib>
      8 
      9 #include "math_aux.h"
     10 #include "cppunit/cppunit_proxy.h"
     11 
     12 //This test purpose is to check the right import of math.h C symbols
     13 //into the std namespace so we do not use the using namespace std
     14 //specification
     15 
     16 //
     17 // TestCase class
     18 //
     19 class CMathTest : public CPPUNIT_NS::TestCase
     20 {
     21   CPPUNIT_TEST_SUITE(CMathTest);
     22 #if defined (STLPORT) && !defined (_STLP_USE_NAMESPACES)
     23   CPPUNIT_IGNORE;
     24 #endif
     25   CPPUNIT_TEST(import_checks);
     26   CPPUNIT_TEST_SUITE_END();
     27 
     28   protected:
     29     void import_checks();
     30 };
     31 
     32 CPPUNIT_TEST_SUITE_REGISTRATION(CMathTest);
     33 
     34 //
     35 // tests implementation
     36 //
     37 void CMathTest::import_checks()
     38 {
     39 #if !defined (STLPORT) || defined (_STLP_USE_NAMESPACES)
     40   int int_val = -1;
     41   long long_val = -1l;
     42   float float_val = -1.0f;
     43   double double_val = -1.0;
     44 #  if !defined (_STLP_NO_LONG_DOUBLE)
     45   long double long_double_val = -1.0l;
     46 #  endif
     47 
     48   CPPUNIT_CHECK( are_equals(std::abs(int_val), -int_val) );
     49   CPPUNIT_CHECK( are_equals(std::abs(long_val), -long_val) );
     50   CPPUNIT_CHECK( are_equals(std::labs(long_val), -long_val) );
     51   CPPUNIT_CHECK( are_equals(std::abs(float_val), -float_val) );
     52   CPPUNIT_CHECK( are_equals(std::abs(double_val), -double_val) );
     53 #  if !defined (_STLP_NO_LONG_DOUBLE)
     54   CPPUNIT_CHECK( are_equals(std::abs(long_double_val), -long_double_val) );
     55 #  endif
     56 
     57   CPPUNIT_CHECK( are_equals(std::fabs(float_val), -float_val) );
     58   CPPUNIT_CHECK( are_equals(std::fabs(double_val), -double_val) );
     59 #  if !defined (_STLP_NO_LONG_DOUBLE)
     60   CPPUNIT_CHECK( are_equals(std::fabs(long_double_val), -long_double_val) );
     61 #  endif
     62 
     63   std::div_t div_res = std::div(3, 2);
     64   CPPUNIT_CHECK( div_res.quot == 1 );
     65   CPPUNIT_CHECK( div_res.rem == 1 );
     66   std::ldiv_t ldiv_res = std::ldiv(3l, 2l);
     67   CPPUNIT_CHECK( ldiv_res.quot == 1l );
     68   CPPUNIT_CHECK( ldiv_res.rem == 1l );
     69   ldiv_res = std::div(3l, 2l);
     70   CPPUNIT_CHECK( ldiv_res.quot == 1l );
     71   CPPUNIT_CHECK( ldiv_res.rem == 1l );
     72 
     73   std::srand(2);
     74   int rand_val = std::rand();
     75   CPPUNIT_CHECK( rand_val >= 0 && rand_val <= RAND_MAX );
     76 
     77   CPPUNIT_CHECK( are_equals(std::floor(1.5), 1.0) );
     78   CPPUNIT_CHECK( are_equals(std::ceil(1.5), 2.0) );
     79   CPPUNIT_CHECK( are_equals(std::fmod(1.5, 1.0), 0.5) );
     80   CPPUNIT_CHECK( are_equals(std::sqrt(4.0), 2.0) );
     81   CPPUNIT_CHECK( are_equals(std::pow(2.0, 2), 4.0) );
     82   /*
     83    * Uncomment the following to check that it generates an ambiguous call
     84    * as there is no Standard pow(int, int) function only pow(double, int),
     85    * pow(float, int) and some others...
     86    * If it do not generate a compile time error it should at least give
     87    * the good result.
     88    */
     89   //CPPUNIT_CHECK( are_equals(std::pow(10, -2), 0.01) );
     90   CPPUNIT_CHECK( are_equals(std::pow(10.0, -2), 0.01) );
     91   CPPUNIT_CHECK( are_equals(std::exp(0.0), 1.0) );
     92   CPPUNIT_CHECK( are_equals(std::log(std::exp(1.0)), 1.0) );
     93   CPPUNIT_CHECK( are_equals(std::log10(100.0), 2.0) );
     94 #  if !defined (STLPORT) || !defined (_STLP_USING_PLATFORM_SDK_COMPILER) || !defined (_WIN64)
     95   CPPUNIT_CHECK( are_equals(std::modf(100.5, &double_val), 0.5) );
     96   CPPUNIT_CHECK( are_equals(double_val, 100.0) );
     97 #  endif
     98   double_val = std::frexp(8.0, &int_val);
     99   CPPUNIT_CHECK( are_equals(double_val * std::pow(2.0, int_val), 8.0) );
    100   CPPUNIT_CHECK( are_equals(std::ldexp(1.0, 2), 4.0) );
    101   CPPUNIT_CHECK( are_equals(std::cos(std::acos(1.0)), 1.0) );
    102   CPPUNIT_CHECK( are_equals(std::sin(std::asin(1.0)), 1.0) );
    103   CPPUNIT_CHECK( are_equals(std::tan(std::atan(1.0)), 1.0) );
    104   CPPUNIT_CHECK( are_equals(std::tan(std::atan2(1.0, 1.0)), 1.0) );
    105   CPPUNIT_CHECK( are_equals(std::cosh(0.0), 1.0) );
    106   CPPUNIT_CHECK( are_equals(std::sinh(0.0), 0.0) );
    107 #  if !defined (STLPORT) || !defined (_STLP_USING_PLATFORM_SDK_COMPILER) || !defined (_M_AMD64)
    108   CPPUNIT_CHECK( are_equals(std::tanh(0.0), 0.0) );
    109 #  endif
    110 
    111   CPPUNIT_CHECK( are_equals(std::floor(1.5f), 1.0f) );
    112   CPPUNIT_CHECK( are_equals(std::ceil(1.5f), 2.0f) );
    113   CPPUNIT_CHECK( are_equals(std::fmod(1.5f, 1.0f), 0.5f) );
    114   CPPUNIT_CHECK( are_equals(std::sqrt(4.0f), 2.0f) );
    115   CPPUNIT_CHECK( are_equals(std::pow(2.0f, 2), 4.0f) );
    116   CPPUNIT_CHECK( are_equals(std::exp(0.0f), 1.0f) );
    117   CPPUNIT_CHECK( are_equals(std::log(std::exp(1.0f)), 1.0f) );
    118   CPPUNIT_CHECK( are_equals(std::log10(100.0f), 2.0f) );
    119 #  if !defined (STLPORT) || !defined (_STLP_USING_PLATFORM_SDK_COMPILER) || !defined (_WIN64)
    120   CPPUNIT_CHECK( are_equals(std::modf(100.5f, &float_val), 0.5f) );
    121   CPPUNIT_CHECK( are_equals(float_val, 100.0f) );
    122 #  endif
    123   float_val = std::frexp(8.0f, &int_val);
    124   CPPUNIT_CHECK( are_equals(float_val * std::pow(2.0f, int_val), 8.0f) );
    125   CPPUNIT_CHECK( are_equals(std::ldexp(1.0f, 2), 4.0f) );
    126   CPPUNIT_CHECK( are_equals(std::cos(std::acos(1.0f)), 1.0f) );
    127   CPPUNIT_CHECK( are_equals(std::sin(std::asin(1.0f)), 1.0f) );
    128   CPPUNIT_CHECK( are_equals(std::tan(std::atan(1.0f)), 1.0f) );
    129   CPPUNIT_CHECK( are_equals(std::tan(std::atan2(1.0f, 1.0f)), 1.0f) );
    130   CPPUNIT_CHECK( are_equals(std::cosh(0.0f), 1.0f) );
    131   CPPUNIT_CHECK( are_equals(std::sinh(0.0f), 0.0f) );
    132 #  if !defined (STLPORT) || !defined (_STLP_USING_PLATFORM_SDK_COMPILER) || !defined (_M_AMD64)
    133   CPPUNIT_CHECK( are_equals(std::tanh(0.0f), 0.0f) );
    134 #  endif
    135 
    136 #  if !defined (_STLP_NO_LONG_DOUBLE)
    137   CPPUNIT_CHECK( are_equals(std::floor(1.5l), 1.0l) );
    138   CPPUNIT_CHECK( are_equals(std::ceil(1.5l), 2.0l) );
    139   CPPUNIT_CHECK( are_equals(std::fmod(1.5l, 1.0l), 0.5l) );
    140   CPPUNIT_CHECK( are_equals(std::sqrt(4.0l), 2.0l) );
    141   CPPUNIT_CHECK( are_equals(std::pow(2.0l, 2), 4.0l) );
    142   CPPUNIT_CHECK( are_equals(std::exp(0.0l), 1.0l) );
    143   CPPUNIT_CHECK( are_equals(std::log(std::exp(1.0l)), 1.0l) );
    144   CPPUNIT_CHECK( are_equals(std::log10(100.0l), 2.0l) );
    145 #    if !defined (STLPORT) || !defined (_STLP_USING_PLATFORM_SDK_COMPILER) || !defined (_WIN64)
    146   CPPUNIT_CHECK( are_equals(std::modf(100.5l, &long_double_val), 0.5l) );
    147   CPPUNIT_CHECK( are_equals(long_double_val, 100.0l) );
    148 #    endif
    149   long_double_val = std::frexp(8.0l, &int_val);
    150   CPPUNIT_CHECK( are_equals(long_double_val * std::pow(2.0l, int_val), 8.0l) );
    151   CPPUNIT_CHECK( are_equals(std::ldexp(1.0l, 2), 4.0l) );
    152   CPPUNIT_CHECK( are_equals(std::cos(std::acos(1.0l)), 1.0l) );
    153   CPPUNIT_CHECK( are_equals(std::sin(std::asin(1.0l)), 1.0l) );
    154   CPPUNIT_CHECK( are_equals(std::tan(0.0l), 0.0l) );
    155   CPPUNIT_CHECK( are_equals(std::atan(0.0l), 0.0l) );
    156   CPPUNIT_CHECK( are_equals(std::atan2(0.0l, 1.0l), 0.0l) );
    157   CPPUNIT_CHECK( are_equals(std::cosh(0.0l), 1.0l) );
    158   CPPUNIT_CHECK( are_equals(std::sinh(0.0l), 0.0l) );
    159 #    if !defined (STLPORT) || !defined (_STLP_USING_PLATFORM_SDK_COMPILER) || !defined (_M_AMD64)
    160   CPPUNIT_CHECK( are_equals(std::tanh(0.0l), 0.0l) );
    161 #    endif
    162 #  endif
    163 
    164   CPPUNIT_CHECK( are_equals(std::sqrt(std::sqrt(std::sqrt(256.0))), 2.0) );
    165   CPPUNIT_CHECK( are_equals(std::sqrt(std::sqrt(std::sqrt(256.0f))), 2.0f) );
    166 #  if !defined (_STLP_NO_LONG_DOUBLE)
    167   CPPUNIT_CHECK( are_equals(std::sqrt(std::sqrt(std::sqrt(256.0l))), 2.0l) );
    168 #  endif
    169 #endif
    170 }
    171