27 #pragma warning (push)
28 #pragma warning (disable: 4514 4996)
33 return (juce_wchar) towupper ((wint_t) character);
38 return (juce_wchar) towlower ((wint_t) character);
44 return iswupper ((wint_t) character) != 0;
46 return toLowerCase (character) != character;
53 return iswlower ((wint_t) character) != 0;
55 return toUpperCase (character) != character;
66 return character ==
' ' || (character <= 13 && character >= 9);
71 return iswspace ((wint_t) character) != 0;
76 return (character >=
'0' && character <=
'9');
81 return iswdigit ((wint_t) character) != 0;
86 return (character >=
'a' && character <=
'z')
87 || (character >=
'A' && character <=
'Z');
92 return iswalpha ((wint_t) character) != 0;
97 return (character >=
'a' && character <=
'z')
98 || (character >=
'A' && character <=
'Z')
99 || (character >=
'0' && character <=
'9');
104 return iswalnum ((wint_t) character) != 0;
109 return (character >=
' ' && character <=
'~');
114 return iswprint ((wint_t) character) != 0;
119 auto d = (
unsigned int) (digit -
'0');
121 if (d < (
unsigned int) 10)
124 d += (
unsigned int) (
'0' -
'a');
126 if (d < (
unsigned int) 6)
129 d += (
unsigned int) (
'a' -
'A');
131 if (d < (
unsigned int) 6)
137double CharacterFunctions::mulexp10 (
const double value,
int exponent)
noexcept
145 const bool negative = (exponent < 0);
148 exponent = -exponent;
150 double result = 1.0, power = 10.0;
152 for (
int bit = 1; exponent != 0; bit <<= 1)
154 if ((exponent & bit) != 0)
166 return negative ? (value / result) : (value * result);
171 if (c < 0x80 || c >= 0xa0)
172 return (juce_wchar) c;
174 static const uint16 lookup[] = { 0x20AC, 0x0007, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
175 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0007, 0x017D, 0x0007,
176 0x0007, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
177 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0007, 0x017E, 0x0178 };
179 return (juce_wchar) lookup[c - 0x80];
186#define STR(value) QUOTE(value)
187#define ASYM_STRING_DOUBLE_PAIR(str, value) std::pair<String, double> (STR(str), value)
188#define STRING_DOUBLE_PAIR(value) ASYM_STRING_DOUBLE_PAIR(value, value)
189#define STRING_DOUBLE_PAIR_COMBOS(value) \
190 STRING_DOUBLE_PAIR(value), \
191 STRING_DOUBLE_PAIR(-value), \
192 ASYM_STRING_DOUBLE_PAIR(+value, value), \
193 ASYM_STRING_DOUBLE_PAIR(000000 ## value, value), \
194 ASYM_STRING_DOUBLE_PAIR(+000 ## value, value), \
195 ASYM_STRING_DOUBLE_PAIR(-0 ## value, -value)
197class CharacterFunctionsTests :
public UnitTest
200 CharacterFunctionsTests() :
UnitTest (
"CharacterFunctions",
"Text") {}
202 void runTest()
override
204 beginTest (
"readDoubleValue");
206 static const std::pair<String, double> testValues[] =
209 STRING_DOUBLE_PAIR_COMBOS (0),
210 STRING_DOUBLE_PAIR_COMBOS (3),
211 STRING_DOUBLE_PAIR_COMBOS (4931),
212 STRING_DOUBLE_PAIR_COMBOS (5000),
213 STRING_DOUBLE_PAIR_COMBOS (9862097),
216 STRING_DOUBLE_PAIR_COMBOS (7.000),
217 STRING_DOUBLE_PAIR_COMBOS (0.2),
218 STRING_DOUBLE_PAIR_COMBOS (.298630),
219 STRING_DOUBLE_PAIR_COMBOS (1.118),
220 STRING_DOUBLE_PAIR_COMBOS (0.9000),
221 STRING_DOUBLE_PAIR_COMBOS (0.0000001),
222 STRING_DOUBLE_PAIR_COMBOS (500.0000001),
223 STRING_DOUBLE_PAIR_COMBOS (9862098.2398604),
226 STRING_DOUBLE_PAIR_COMBOS (0e0),
227 STRING_DOUBLE_PAIR_COMBOS (0.e0),
228 STRING_DOUBLE_PAIR_COMBOS (0.00000e0),
229 STRING_DOUBLE_PAIR_COMBOS (.0e7),
230 STRING_DOUBLE_PAIR_COMBOS (0e-5),
231 STRING_DOUBLE_PAIR_COMBOS (2E0),
232 STRING_DOUBLE_PAIR_COMBOS (4.E0),
233 STRING_DOUBLE_PAIR_COMBOS (1.2000000E0),
234 STRING_DOUBLE_PAIR_COMBOS (1.2000000E6),
235 STRING_DOUBLE_PAIR_COMBOS (.398e3),
236 STRING_DOUBLE_PAIR_COMBOS (10e10),
237 STRING_DOUBLE_PAIR_COMBOS (1.4962e+2),
238 STRING_DOUBLE_PAIR_COMBOS (3198693.0973e4),
239 STRING_DOUBLE_PAIR_COMBOS (10973097.2087E-4),
240 STRING_DOUBLE_PAIR_COMBOS (1.3986e00006),
241 STRING_DOUBLE_PAIR_COMBOS (2087.3087e+00006),
242 STRING_DOUBLE_PAIR_COMBOS (6.0872e-00006),
246 STRING_DOUBLE_PAIR_COMBOS (17654321098765432.9),
247 STRING_DOUBLE_PAIR_COMBOS (183456789012345678.9),
248 STRING_DOUBLE_PAIR_COMBOS (1934567890123456789.9),
249 STRING_DOUBLE_PAIR_COMBOS (20345678901234567891.9),
250 STRING_DOUBLE_PAIR_COMBOS (10000000000000000303786028427003666890752.000000),
251 STRING_DOUBLE_PAIR_COMBOS (10000000000000000303786028427003666890752e3),
252 STRING_DOUBLE_PAIR_COMBOS (10000000000000000303786028427003666890752e100),
253 STRING_DOUBLE_PAIR_COMBOS (10000000000000000303786028427003666890752.000000e-5),
254 STRING_DOUBLE_PAIR_COMBOS (10000000000000000303786028427003666890752.000000e-40),
256 STRING_DOUBLE_PAIR_COMBOS (1.23456789012345678901234567890),
257 STRING_DOUBLE_PAIR_COMBOS (1.23456789012345678901234567890e-111)
261 , STRING_DOUBLE_PAIR (DBL_MAX),
262 STRING_DOUBLE_PAIR (-DBL_MAX),
263 STRING_DOUBLE_PAIR (DBL_MIN)
267 for (
auto trial : testValues)
269 auto charPtr = trial.first.getCharPointer();
270 expectEquals (CharacterFunctions::readDoubleValue (charPtr), trial.second);
274 String nans[] = {
"NaN",
"-nan",
"+NAN",
"1.0E1024",
"-1.0E-999",
"1.23456789012345678901234567890e123456789"};
276 for (
auto nan : nans)
278 auto charPtr = nan.getCharPointer();
279 expect (std::isnan (CharacterFunctions::readDoubleValue (charPtr)));
284 String infs[] = {
"Inf",
"-inf",
"INF"};
286 for (
auto inf : infs)
288 auto charPtr = inf.getCharPointer();
289 expect (std::isinf (CharacterFunctions::readDoubleValue (charPtr)));
295static CharacterFunctionsTests characterFunctionsTests;
static juce_wchar toLowerCase(juce_wchar character) noexcept
Converts a character to lower-case.
static bool isDigit(char character) noexcept
Checks whether a character is a digit.
static bool isLowerCase(juce_wchar character) noexcept
Checks whether a unicode character is lower-case.
static bool isLetter(char character) noexcept
Checks whether a character is alphabetic.
static int getHexDigitValue(juce_wchar digit) noexcept
Returns 0 to 16 for '0' to 'F", or -1 for characters that aren't a legal hex digit.
static bool isWhitespace(char character) noexcept
Checks whether a character is whitespace.
static bool isLetterOrDigit(char character) noexcept
Checks whether a character is alphabetic or numeric.
static juce_wchar toUpperCase(juce_wchar character) noexcept
Converts a character to upper-case.
static bool isUpperCase(juce_wchar character) noexcept
Checks whether a unicode character is upper-case.
static bool isPrintable(char character) noexcept
Checks whether a character is a printable character, i.e.
static juce_wchar getUnicodeCharFromWindows1252Codepage(uint8 windows1252Char) noexcept
Converts a byte of Windows 1252 codepage to unicode.
This is a base class for classes that perform a unit test.