342 lines
16 KiB
C++
342 lines
16 KiB
C++
#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
|
|
}
|