aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavel Belikov <pavel.fuchs.belikov@gmail.com>2019-06-25 21:43:00 +0300
committerPavel Belikov <pavel.fuchs.belikov@gmail.com>2019-06-25 21:43:00 +0300
commit77961bf9a4886bddc3ab567aeb1093943ff816ca (patch)
tree544ed67d72e5849a65848bf20e3771c4cd0ae27d
parentMerge pull request #73 from zhihaoy/cmake-targets (diff)
downloadargs.hxx-77961bf9a4886bddc3ab567aeb1093943ff816ca.tar.xz
Fixes #75 : Check istringstream state in ValueParser
-rw-r--r--args.hxx9
-rw-r--r--test.cxx7
2 files changed, 14 insertions, 2 deletions
diff --git a/args.hxx b/args.hxx
index 09c1919..563169c 100644
--- a/args.hxx
+++ b/args.hxx
@@ -3256,9 +3256,14 @@ namespace args
operator ()(const std::string &name, const std::string &value, T &destination)
{
std::istringstream ss(value);
- ss >> destination >> std::ws;
+ bool failed = !(ss >> destination);
- if (ss.rdbuf()->in_avail() > 0)
+ if (!failed)
+ {
+ ss >> std::ws;
+ }
+
+ if (ss.rdbuf()->in_avail() > 0 || failed)
{
#ifdef ARGS_NOEXCEPT
(void)name;
diff --git a/test.cxx b/test.cxx
index b46007d..363ca59 100644
--- a/test.cxx
+++ b/test.cxx
@@ -1173,6 +1173,8 @@ TEST_CASE("ValueParser works as expected", "[args]")
args::ValueFlag<std::string> f(p, "name", "description", {'f'});
args::ValueFlag<StringAssignable> b(p, "name", "description", {'b'});
args::ValueFlag<int> i(p, "name", "description", {'i'});
+ args::ValueFlag<int> d(p, "name", "description", {'d'});
+ args::PositionalList<double> ds(p, "name", "description");
REQUIRE_NOTHROW(p.ParseArgs(std::vector<std::string>{"-f", "a b"}));
REQUIRE(args::get(f) == "a b");
@@ -1185,6 +1187,11 @@ TEST_CASE("ValueParser works as expected", "[args]")
REQUIRE_NOTHROW(p.ParseArgs(std::vector<std::string>{"-i", " 12"}));
REQUIRE(args::get(i) == 12);
+
+ REQUIRE_THROWS_AS(p.ParseArgs(std::vector<std::string>{"-i", "a"}), args::ParseError);
+ REQUIRE_THROWS_AS(p.ParseArgs(std::vector<std::string>{"-d", "b"}), args::ParseError);
+ REQUIRE_THROWS_AS(p.ParseArgs(std::vector<std::string>{"c"}), args::ParseError);
+ REQUIRE_THROWS_AS(p.ParseArgs(std::vector<std::string>{"s"}), args::ParseError);
}
TEST_CASE("ActionFlag works as expected", "[args]")