Implemented ArrayParser and unit tests to verify its working.

This commit is contained in:
eelke 2017-12-16 10:31:51 +01:00
parent b5d800c87e
commit ec930218cd
4 changed files with 254 additions and 3 deletions

View file

@ -0,0 +1,92 @@
#include <gtest/gtest.h>
#include <gmock/gmock-matchers.h>
#include "ArrayParser.h"
#include "PrintTo_Qt.h"
using namespace testing;
using namespace Pgsql;
TEST(ArrayParser, emptyInput)
{
const char * input = "";
ArrayParser parser(input);
auto res = parser.GetNextElem();
ASSERT_FALSE(res.ok);
}
TEST(ArrayParser, emptyArray)
{
const char * input = "{}";
ArrayParser parser(input);
auto res = parser.GetNextElem();
ASSERT_FALSE(res.ok);
}
TEST(ArrayParser, oneInt)
{
const char * input = "{1}";
ArrayParser parser(input);
auto res = parser.GetNextElem();
ASSERT_TRUE(res.ok);
ASSERT_EQ(res.value, "1");
res = parser.GetNextElem();
ASSERT_FALSE(res.ok);
}
TEST(ArrayParser, twoElems)
{
const char * input = "{1,2.3}";
ArrayParser parser(input);
auto res = parser.GetNextElem();
ASSERT_TRUE(res.ok);
ASSERT_EQ(res.value, "1");
res = parser.GetNextElem();
ASSERT_TRUE(res.ok);
ASSERT_EQ(res.value, "2.3");
res = parser.GetNextElem();
ASSERT_FALSE(res.ok);
}
TEST(ArrayParser, nullElem)
{
const char * input = "{NULL}";
ArrayParser parser(input);
auto res = parser.GetNextElem();
ASSERT_TRUE(res.ok);
ASSERT_EQ(res.value, std::nullopt);
res = parser.GetNextElem();
ASSERT_FALSE(res.ok);
}
// ARRAY['ab c', NULL, 'def', 'd"e', 'g''h ', 'g,j']
// {"ab c",NULL,def,"d\"e","g'h ","g,j"}
TEST(ArrayParser, quotedValues)
{
const char * input = R"_({"ab c","de\"f"})_";
ArrayParser parser(input);
auto res = parser.GetNextElem();
ASSERT_TRUE(res.ok);
ASSERT_EQ(res.value, "ab c");
res = parser.GetNextElem();
ASSERT_TRUE(res.ok);
ASSERT_EQ(res.value, "de\"f");
res = parser.GetNextElem();
ASSERT_FALSE(res.ok);
}
// ARRAY['2017-12-11'::date, NULL]
// {2017-12-11,NULL}
// NULL::int2
// null