| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342 |
- #include "isNumeric.h"
- #include "../../Source/NumberToString.h"
- /*
- *
- * !!! ATTENTION !!!
- *
- * libjson currently has three number parsing methods, they are being merged
- * behind the scenes, but all three interfaces must be consistent, so every set
- * of numbers need to be tested in all three spots
- *
- * JSONValidator/isValidNumber *this file*
- * NumberToString/isNumeric
- * NumberToString/_atof
- */
- testNumberToString__isNumeric::testNumberToString__isNumeric(const std::string & name) : BaseTest(name){
- /*
- #ifndef JSON_STRICT
- ScopeCoverageHeap(isNumeric, 34);
- #else
- ScopeCoverageHeap(isNumeric, 35);
- #endif
- */
- }
- testNumberToString__isNumeric::~testNumberToString__isNumeric(){
- //AssertScopeCoverageHeap(isNumeric);
- }
- /**
- * Tests regular positive numbers in various forms
- */
- void testNumberToString__isNumeric::testPositive(void){
- #if defined(JSON_SAFE) || defined(JSON_DEBUG)
- assertTrue(NumberToString::isNumeric(JSON_TEXT("123")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("12.3")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("0.123")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("0")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("0.")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("1.")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("1")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("0.0")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("1.0")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("1.01")));
- #endif
- }
- /**
- * Tests negative numbers with regular scientifc notation
- */
- void testNumberToString__isNumeric::testNegative(void){
- #if defined(JSON_SAFE) || defined(JSON_DEBUG)
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-123")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-12.3")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-0.123")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-0")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-0.")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-1")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-1.")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-0.0")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-1.0")));
- #endif
- }
- /**
- * Tests positive numbers with scientific notiation that has a sign in it
- */
- void testNumberToString__isNumeric::testPositive_ScientificNotation(void){
- #if defined(JSON_SAFE) || defined(JSON_DEBUG)
- assertTrue(NumberToString::isNumeric(JSON_TEXT("0e123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("0e12.3")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("1.e123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("1.e12.3")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("1.0e123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("1.0e12.3")));
-
- assertTrue(NumberToString::isNumeric(JSON_TEXT("0e2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("1e2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("0.e2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("1.e2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("0.0e2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("1.0e2")));
- #endif
- }
- /**
- * Tests negative numbers with regular scientifc notation
- */
- void testNumberToString__isNumeric::testNegative_ScientificNotation(void){
- #if defined(JSON_SAFE) || defined(JSON_DEBUG)
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-0e123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("-0e12.3")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-1.e123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("-1.e12.3")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-1.0e123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("-1.0e12.3")));
-
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-0e2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-1e2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-0.e2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-1.e2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-0.0e2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-1.0e2")));
- #endif
- }
- /**
- * Tests positive numbers with scientific notiation that has a sign in it
- */
- void testNumberToString__isNumeric::testPositive_SignedScientificNotation(void){
- #if defined(JSON_SAFE) || defined(JSON_DEBUG)
- assertTrue(NumberToString::isNumeric(JSON_TEXT("0e-123")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("0e+123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("0e-12.3"))); //period not supposed to be in there, exponent must be int
- assertFalse(NumberToString::isNumeric(JSON_TEXT("0e+12.3")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("1.e-123")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("1.e+123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("1.e-12.3")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("1.e+12.3")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("1.0e-123")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("1.0e+123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("1.0e-12.3")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("1.0e+12.3")));
-
- assertTrue(NumberToString::isNumeric(JSON_TEXT("0e2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("1e2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("0.e2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("1.e2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("0.0e2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("1.0e2")));
- #endif
- }
- /**
- * Tests negative numbers with scientific notiation that has a sign in it
- */
- void testNumberToString__isNumeric::testNegative_SignedScientificNotation(void){
- #if defined(JSON_SAFE) || defined(JSON_DEBUG)
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-0e-123")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-0e+123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("-0.e-12.3")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("-0.e+12.3")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-1.e-123")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-1.e+123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("-1.e-12.3")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("-1.e+12.3")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("-0.0e-12.3")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("-0.0e+12.3")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-1.0e-123")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-1.0e+123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("-1.0e-12.3")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("-1.0e+12.3")));
-
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-0e-2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-1e-2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-0.e-2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-1.e-2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-0.0e-2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-1.0e-2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-0e+2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-1e+2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-0.e+2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-1.e+2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-0.0e+2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-1.0e+2")));
- #endif
- }
- /**
- * Tests that in strict mode, libjson isn't relaxed about what is and isn't
- * a valid number. libjson by default accepts a few extra common notations.
- */
- void testNumberToString__isNumeric::testStrict(void){
- #if defined(JSON_SAFE) || defined(JSON_DEBUG)
- #ifdef JSON_STRICT
- assertFalse(NumberToString::isNumeric(JSON_TEXT("00")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("00.01")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT(".01")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("-.01")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+12.3")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+0.123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+0")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+0.")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+0e123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+0e-123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+0e+123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1.e123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1.e-123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1.e+123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1.0e123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1.0e-123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1.0e+123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1.e123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+0e12.3")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+0e-12.3")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+0e+12.3")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1.e12.3")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1.e-12.3")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1.e+12.3")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1.0e12.3")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1.0e-12.3")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1.0e+12.3")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1.e12.3")));
-
- assertFalse(NumberToString::isNumeric(JSON_TEXT("0x12FF")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("0128"))); //legal because in STRICT mode, this is not octal, leading zero is ignored
- assertFalse(NumberToString::isNumeric(JSON_TEXT("0123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("-0128")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("-0123")));
-
- assertFalse(NumberToString::isNumeric(JSON_TEXT("0xABCD")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("0124")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1.")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+0.0")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1.0")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+0e2")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1e2")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+0.e2")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1.e2")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+0.0e2")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1.0e2")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+0e-2")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1e-2")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+0.e-2")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1.e-2")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+0.0e-2")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1.0e-2")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+0e+2")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1e+2")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+0.e+2")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1.e+2")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+0.0e+2")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("+1.0e+2")));
-
- assertFalse(NumberToString::isNumeric(JSON_TEXT("1e-0123"))); //not valid because of negative and leading zero
- #endif
- #endif
- }
-
- /**
- * Tests that the extra common notations that libjson supports all
- * test out as valid
- */
- void testNumberToString__isNumeric::testNotStrict(void){
- #if defined(JSON_SAFE) || defined(JSON_DEBUG)
- #ifndef JSON_STRICT
- assertTrue(NumberToString::isNumeric(JSON_TEXT("00")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("00.01")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT(".01")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-.01")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+123")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+12.3")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+0.123")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+0")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+0.")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+0e123")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+0e-123")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+0e+123")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+1.e123")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+1.e-123")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+1.e+123")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+1.0e123")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+1.0e-123")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+1.0e+123")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+1.e123")));
-
- assertTrue(NumberToString::isNumeric(JSON_TEXT("0x12FF")));
- #ifdef JSON_OCTAL
- assertFalse(NumberToString::isNumeric(JSON_TEXT("0128"))); //because of the 8
- assertTrue(NumberToString::isNumeric(JSON_TEXT("0123")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("-0128")));
- assertTrue(NumberToString::_atof(JSON_TEXT("-0123")));
- #else
- assertTrue(NumberToString::isNumeric(JSON_TEXT("0128"))); //because the leading 0 is ignored
- assertTrue(NumberToString::isNumeric(JSON_TEXT("0123")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-0128"))); //because the leading 0 is ignored
- assertTrue(NumberToString::isNumeric(JSON_TEXT("-0123")));
- #endif
-
-
- assertTrue(NumberToString::isNumeric(JSON_TEXT("0xABCD")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("0124")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+0")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+1")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+0.")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+1.")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+0.0")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+1.0")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+0e2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+1e2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+0.e2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+1.e2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+0.0e2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+1.0e2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+0e-2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+1e-2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+0.e-2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+1.e-2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+0.0e-2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+1.0e-2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+0e+2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+1e+2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+0.e+2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+1.e+2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+0.0e+2")));
- assertTrue(NumberToString::isNumeric(JSON_TEXT("+1.0e+2")));
-
- assertTrue(NumberToString::isNumeric(JSON_TEXT("1e-0123")));
- #endif
- #endif
- }
- /**
- * This tests values that aren't numbers at all, to make sure they are
- * flagged as not valid
- */
- void testNumberToString__isNumeric::testNotNumbers(void){
- #if defined(JSON_SAFE) || defined(JSON_DEBUG)
- assertFalse(NumberToString::isNumeric(JSON_TEXT("")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("-.")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("-e12")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("0xABCDv")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("00124")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("09124")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("0no")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("no")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("n1234")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("12no")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("0en5")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("0e")));
- assertFalse(NumberToString::isNumeric(JSON_TEXT("0E")));
- #endif
- }
|