summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2014-12-06 02:02:08 +0100
committerAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2014-12-06 02:02:08 +0100
commitb92ea632417f1736ae4c9429448cb88165b58570 (patch)
tree7d13a4edd7fe8c895946ce29e19be7e48d16d539 /test
parentc5daa927663cb0eafa56495bded0d80b21d94e4d (diff)
reimplemented number parsing (previous implementation was suboptimal, as it was not securely capable of detecting wheter a number is an integer or an double value
Diffstat (limited to 'test')
-rw-r--r--test/core/variant/ReaderTest.cpp134
1 files changed, 117 insertions, 17 deletions
diff --git a/test/core/variant/ReaderTest.cpp b/test/core/variant/ReaderTest.cpp
index c33f80d..3156042 100644
--- a/test/core/variant/ReaderTest.cpp
+++ b/test/core/variant/ReaderTest.cpp
@@ -24,10 +24,10 @@
namespace ousia {
namespace variant {
+Logger logger;
+
TEST(Reader, readString)
{
- TerminalLogger logger(std::cerr, true);
-
// Simple, double quoted string
{
BufferedCharReader reader("\"hello world\"");
@@ -63,8 +63,6 @@ TEST(Reader, readString)
TEST(Reader, parseUnescapedString)
{
- TerminalLogger logger(std::cerr, true);
-
// Simple case
{
BufferedCharReader reader("hello world;");
@@ -100,41 +98,143 @@ TEST(Reader, parseUnescapedString)
TEST(Reader, parseInteger)
{
- TerminalLogger logger(std::cerr, true);
+ // Valid integers
+ {
+ BufferedCharReader reader("0 ");
+ auto res = Reader::parseInteger(reader, logger, {});
+ ASSERT_TRUE(res.first);
+ ASSERT_EQ(0, res.second);
+ }
{
- BufferedCharReader reader("42");
- auto res = Reader::parseInteger(reader, logger);
+ BufferedCharReader reader("42 ");
+ auto res = Reader::parseInteger(reader, logger, {});
ASSERT_TRUE(res.first);
ASSERT_EQ(42, res.second);
}
{
BufferedCharReader reader("-42");
- auto res = Reader::parseInteger(reader, logger);
+ auto res = Reader::parseInteger(reader, logger, {});
ASSERT_TRUE(res.first);
ASSERT_EQ(-42, res.second);
}
{
- BufferedCharReader reader("0x42");
- auto res = Reader::parseInteger(reader, logger);
+ BufferedCharReader reader(" -0x4A2 ");
+ auto res = Reader::parseInteger(reader, logger, {});
ASSERT_TRUE(res.first);
- ASSERT_EQ(0x42, res.second);
+ ASSERT_EQ(-0x4A2, res.second);
}
-/* {
- BufferedCharReader reader("0Xaffe");
- auto res = Reader::parseInteger(reader, logger);
+ {
+ BufferedCharReader reader(" 0Xaffe");
+ auto res = Reader::parseInteger(reader, logger, {});
ASSERT_TRUE(res.first);
ASSERT_EQ(0xAFFE, res.second);
- }*/
+ }
+
+ {
+ BufferedCharReader reader("0x7FFFFFFFFFFFFFFF");
+ auto res = Reader::parseInteger(reader, logger, {});
+ ASSERT_TRUE(res.first);
+ ASSERT_EQ(0x7FFFFFFFFFFFFFFFL, res.second);
+ }
+
+ {
+ BufferedCharReader reader("-0x7FFFFFFFFFFFFFFF");
+ auto res = Reader::parseInteger(reader, logger, {});
+ ASSERT_TRUE(res.first);
+ ASSERT_EQ(-0x7FFFFFFFFFFFFFFFL, res.second);
+ }
+
+ // Invalid integers
+ {
+ BufferedCharReader reader("-");
+ auto res = Reader::parseInteger(reader, logger, {});
+ ASSERT_FALSE(res.first);
+ }
+
+ {
+ BufferedCharReader reader("0a");
+ auto res = Reader::parseInteger(reader, logger, {});
+ ASSERT_FALSE(res.first);
+ }
+
+ {
+ BufferedCharReader reader("-0xag");
+ auto res = Reader::parseInteger(reader, logger, {});
+ ASSERT_FALSE(res.first);
+ }
+
+ {
+ BufferedCharReader reader("0x8000000000000000");
+ auto res = Reader::parseInteger(reader, logger, {});
+ ASSERT_FALSE(res.first);
+ }
}
-TEST(Reader, parseGeneric)
+TEST(Reader, parseDouble)
{
- TerminalLogger logger(std::cerr, true);
+ // Valid doubles
+ {
+ BufferedCharReader reader("1.25");
+ auto res = Reader::parseDouble(reader, logger, {});
+ ASSERT_TRUE(res.first);
+ ASSERT_EQ(1.25, res.second);
+ }
+
+ {
+ BufferedCharReader reader(".25");
+ auto res = Reader::parseDouble(reader, logger, {});
+ ASSERT_TRUE(res.first);
+ ASSERT_EQ(.25, res.second);
+ }
+
+ {
+ BufferedCharReader reader(".25e1");
+ auto res = Reader::parseDouble(reader, logger, {});
+ ASSERT_TRUE(res.first);
+ ASSERT_EQ(2.5, res.second);
+ }
+
+ {
+ BufferedCharReader reader("-2.5e-1");
+ auto res = Reader::parseDouble(reader, logger, {});
+ ASSERT_TRUE(res.first);
+ ASSERT_EQ(-0.25, res.second);
+ }
+
+ {
+ BufferedCharReader reader("-50e-2");
+ auto res = Reader::parseDouble(reader, logger, {});
+ ASSERT_TRUE(res.first);
+ ASSERT_EQ(-0.5, res.second);
+ }
+
+ {
+ BufferedCharReader reader("-50.e-2");
+ auto res = Reader::parseDouble(reader, logger, {'.'});
+ ASSERT_TRUE(res.first);
+ ASSERT_EQ(-50, res.second);
+ }
+ // Invalid doubles
+ {
+ BufferedCharReader reader(".e1");
+ auto res = Reader::parseDouble(reader, logger, {});
+ ASSERT_FALSE(res.first);
+ }
+
+ {
+ BufferedCharReader reader("0e100000");
+ auto res = Reader::parseDouble(reader, logger, {});
+ ASSERT_FALSE(res.first);
+ }
+}
+
+TEST(Reader, parseGeneric)
+{
// Simple case, unescaped string
{
BufferedCharReader reader("hello world");