wordreference/libjson/_internal/TestSuite2/NumberToString/isNumeric.cpp

343 lines
16 KiB
C++
Raw Normal View History

#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
}