Skip to content

Commit

Permalink
Add consistency tests
Browse files Browse the repository at this point in the history
  • Loading branch information
eliaskosunen committed Jan 20, 2022
1 parent 4d55b41 commit 32be3f9
Show file tree
Hide file tree
Showing 3 changed files with 256 additions and 4 deletions.
117 changes: 114 additions & 3 deletions test/floating.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,10 @@ TEST_CASE("format string")
CHECK(f == doctest::Approx(10.0));
}

#if SCN_CLANG >= SCN_COMPILER(3, 8, 0)
SCN_CLANG_POP
#endif

TEST_CASE("non-contiguous")
{
auto src = get_deque("3.14");
Expand Down Expand Up @@ -277,6 +281,113 @@ TEST_CASE("parse_float")
CHECK(d == doctest::Approx(3.14));
}

#if SCN_CLANG >= SCN_COMPILER(3, 8, 0)
SCN_CLANG_POP
#endif
TEST_CASE("consistency")
{
SUBCASE("simple")
{
{
std::string source{"3.14 2.73"};
double d{};
auto ret = consistency_iostream(source, d);
CHECK(ret);
CHECK(d == doctest::Approx(3.14));
CHECK(source == " 2.73");
}
{
std::string source{"3.14 2.73"};
double d{};
auto ret = consistency_scanf(source, "%lg", d);
CHECK(ret);
CHECK(d == doctest::Approx(3.14));
CHECK(source == " 2.73");
}
{
double d{};
auto ret = scn::scan("3.14 2.73", "{}", d);
CHECK(ret);
CHECK(d == doctest::Approx(3.14));
CHECK(ret.range_as_string() == " 2.73");
}
}

SUBCASE("preceding whitespace")
{
{
std::string source{" \n3.14 2.73"};
double d{};
auto ret = consistency_iostream(source, d);
CHECK(ret);
CHECK(d == doctest::Approx(3.14));
CHECK(source == " 2.73");
}
{
std::string source{" \n3.14 2.73"};
double d{};
auto ret = consistency_scanf(source, "%lg", d);
CHECK(ret);
CHECK(d == doctest::Approx(3.14));
CHECK(source == " 2.73");
}
{
double d{};
auto ret = scn::scan(" \n3.14 2.73", "{}", d);
CHECK(ret);
CHECK(d == doctest::Approx(3.14));
CHECK(ret.range_as_string() == " 2.73");
}
}

SUBCASE("unexpected comma")
{
{
std::string source{"1,23 456"};
double d{};
auto ret = consistency_iostream(source, d);
CHECK(ret);
CHECK(d == doctest::Approx(1.0));
CHECK(source == ",23 456");
}
{
std::string source{"1,23 456"};
double d{};
auto ret = consistency_scanf(source, "%lg", d);
CHECK(ret);
CHECK(d == doctest::Approx(1.0));
CHECK(source == ",23 456");
}
{
double d{};
auto ret = scn::scan("1,23 456", "{}", d);
CHECK(ret);
CHECK(d == doctest::Approx(1.0));
CHECK(ret.range_as_string() == ",23 456");
}
}

SUBCASE("unexpected char")
{
{
std::string source{"1foo bar"};
double d{};
auto ret = consistency_iostream(source, d);
CHECK(ret);
CHECK(d == doctest::Approx(1.0));
CHECK(source == "foo bar");
}
{
std::string source{"1foo bar"};
double d{};
auto ret = consistency_scanf(source, "%lg", d);
CHECK(ret);
CHECK(d == doctest::Approx(1.0));
CHECK(source == "foo bar");
}
{
double d{};
auto ret = scn::scan("1foo bar", "{}", d);
CHECK(ret);
CHECK(d == doctest::Approx(1.0));
CHECK(ret.range_as_string() == "foo bar");
}
}
}
114 changes: 113 additions & 1 deletion test/integer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,8 @@ TEST_CASE("short ranges")
CHECK(ret.error().code() == scn::error::value_out_of_range);
}

TEST_CASE("format string") {
TEST_CASE("format string")
{
int i{};
auto ret = scn::scan("1", "{:i}", i);
CHECK(ret);
Expand Down Expand Up @@ -649,3 +650,114 @@ TEST_CASE("trailing")
CHECK(ret.range().size() == 1);
CHECK(ret.range_as_string_view()[0] == ';');
}

TEST_CASE("consistency")
{
SUBCASE("simple")
{
{
std::string source{"123 456"};
int i{};
auto ret = consistency_iostream(source, i);
CHECK(ret);
CHECK(i == 123);
CHECK(source == " 456");
}
{
std::string source{"123 456"};
int i{};
auto ret = consistency_scanf(source, "%d", i);
CHECK(ret);
CHECK(i == 123);
CHECK(source == " 456");
}
{
int i{};
auto ret = scn::scan("123 456", "{}", i);
CHECK(ret);
CHECK(i == 123);
CHECK(ret.range_as_string() == " 456");
}
}

SUBCASE("preceding whitespace")
{
{
std::string source{" \n123 456"};
int i{};
auto ret = consistency_iostream(source, i);
CHECK(ret);
CHECK(i == 123);
CHECK(source == " 456");
}
{
std::string source{" \n123 456"};
int i{};
auto ret = consistency_scanf(source, "%d", i);
CHECK(ret);
CHECK(i == 123);
CHECK(source == " 456");
}
{
int i{};
auto ret = scn::scan(" \n123 456", "{}", i);
CHECK(ret);
CHECK(i == 123);
CHECK(ret.range_as_string() == " 456");
}
}

SUBCASE("unexpected float")
{
{
std::string source{"1.23 456"};
int i{};
auto ret = consistency_iostream(source, i);
CHECK(ret);
CHECK(i == 1);
CHECK(source == ".23 456");
}
{
std::string source{"1.23 456"};
int i{};
auto ret = consistency_scanf(source, "%d", i);
CHECK(ret);
CHECK(i == 1);
CHECK(source == ".23 456");
}
{
int i{};
auto ret = scn::scan("1.23 456", "{}", i);
CHECK(ret);
CHECK(i == 1);
CHECK(ret.range_as_string() == ".23 456");
}
}

SUBCASE("unexpected char")
{
{
std::string source{"1foo bar"};
int i{};
auto ret = consistency_iostream(source, i);
CHECK(ret);
CHECK(i == 1);
CHECK(source == "foo bar");
}
{
std::string source{"1foo bar"};
int i{};
auto ret = consistency_scanf(source, "%d", i);
CHECK(ret);
CHECK(i == 1);
CHECK(source == "foo bar");
}
{
int i{};
auto ret = scn::scan("1foo bar", "{}", i);
CHECK(ret);
CHECK(i == 1);
CHECK(ret.range_as_string() == "foo bar");
}
}
}
29 changes: 29 additions & 0 deletions test/test.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,35 @@ inline std::deque<char> get_empty_deque()
return {};
}

template <typename T>
bool consistency_iostream(std::string& source, T& val)
{
std::istringstream ss{source};
ss >> val;
bool res = !(ss.fail() || ss.bad());

source.clear();
auto in_avail = ss.rdbuf()->in_avail();
source.resize(static_cast<size_t>(in_avail));
ss.rdbuf()->sgetn(&source[0], in_avail);

return res;
}
template <typename T>
bool consistency_scanf(std::string& source, const std::string& fmt, T& val)
{
size_t nchar{0};
auto f = fmt + "%n";

SCN_GCC_PUSH
SCN_GCC_IGNORE("-Wformat-nonliteral")
int nargs = std::sscanf(source.c_str(), f.c_str(), &val, &nchar);
SCN_GCC_POP

source = source.substr(nchar);
return nargs == 1;
}

#define DOCTEST_VALUE_PARAMETERIZED_DATA(data, data_array) \
SCN_CLANG_PUSH SCN_CLANG_IGNORE("-Wexit-time-destructors") {} \
static std::vector<std::string> _doctest_subcases = [&(data_array)]() { \
Expand Down

0 comments on commit 32be3f9

Please sign in to comment.