Skip to content

Commit 4c7b080

Browse files
committed
Library: handle validation expression '-1000-0'. Ticket danmar#5847
1 parent 4d5b463 commit 4c7b080

File tree

2 files changed

+48
-4
lines changed

2 files changed

+48
-4
lines changed

lib/library.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,8 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
181181
else if (strcmp(argnode->Name(), "valid") == 0) {
182182
// Validate the validation expression
183183
const char *p = argnode->GetText();
184+
if (*p == '-')
185+
++p;
184186
if (!std::isdigit(*p))
185187
return Error(BAD_ATTRIBUTE_VALUE, argnode->GetText());
186188
for (; *p; p++) {
@@ -321,6 +323,10 @@ bool Library::isargvalid(const std::string &functionName, int argnr, const MathL
321323
TokenList tokenList(0);
322324
std::istringstream istr(ac->valid + ',');
323325
tokenList.createTokens(istr,"");
326+
if (Token::Match(tokenList.front(), "- %num% -")) {
327+
tokenList.front()->str("-" + tokenList.front()->strAt(1));
328+
tokenList.front()->deleteNext();
329+
}
324330
for (const Token *tok = tokenList.front(); tok; tok = tok->next()) {
325331
if (tok->isNumber() && argvalue == MathLib::toLongNumber(tok->str()))
326332
return true;

test/testlibrary.cpp

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class TestLibrary : public TestFixture {
3333
TEST_CASE(function);
3434
TEST_CASE(function_arg);
3535
TEST_CASE(function_arg_any);
36+
TEST_CASE(function_arg_valid);
3637
TEST_CASE(memory);
3738
TEST_CASE(memory2); // define extra "free" allocation functions
3839
TEST_CASE(resource);
@@ -76,8 +77,7 @@ class TestLibrary : public TestFixture {
7677
" <arg nr=\"2\"><not-null/></arg>\n"
7778
" <arg nr=\"3\"><formatstr/></arg>\n"
7879
" <arg nr=\"4\"><strz/></arg>\n"
79-
" <arg nr=\"5\"><valid>1-</valid></arg>\n"
80-
" <arg nr=\"6\"><not-bool/></arg>\n"
80+
" <arg nr=\"5\"><not-bool/></arg>\n"
8181
" </function>\n"
8282
"</def>";
8383
tinyxml2::XMLDocument doc;
@@ -89,8 +89,7 @@ class TestLibrary : public TestFixture {
8989
ASSERT_EQUALS(true, library.argumentChecks["foo"][2].notnull);
9090
ASSERT_EQUALS(true, library.argumentChecks["foo"][3].formatstr);
9191
ASSERT_EQUALS(true, library.argumentChecks["foo"][4].strz);
92-
ASSERT_EQUALS("1-", library.argumentChecks["foo"][5].valid);
93-
ASSERT_EQUALS(true, library.argumentChecks["foo"][6].notbool);
92+
ASSERT_EQUALS(true, library.argumentChecks["foo"][5].notbool);
9493
}
9594

9695
void function_arg_any() const {
@@ -108,6 +107,45 @@ class TestLibrary : public TestFixture {
108107
ASSERT_EQUALS(true, library.argumentChecks["foo"][-1].notuninit);
109108
}
110109

110+
void function_arg_valid() const {
111+
const char xmldata[] = "<?xml version=\"1.0\"?>\n"
112+
"<def>\n"
113+
" <function name=\"foo\">\n"
114+
" <arg nr=\"1\"><valid>1-</valid></arg>\n"
115+
" <arg nr=\"2\"><valid>-7-0</valid></arg>\n"
116+
" <arg nr=\"3\"><valid>1-5,8</valid></arg>\n"
117+
" </function>\n"
118+
"</def>";
119+
tinyxml2::XMLDocument doc;
120+
doc.Parse(xmldata, sizeof(xmldata));
121+
122+
Library library;
123+
library.load(doc);
124+
125+
// 1-
126+
ASSERT_EQUALS(false, library.isargvalid("foo", 1, -10));
127+
ASSERT_EQUALS(false, library.isargvalid("foo", 1, 0));
128+
ASSERT_EQUALS(true, library.isargvalid("foo", 1, 1));
129+
ASSERT_EQUALS(true, library.isargvalid("foo", 1, 10));
130+
131+
// -7-0
132+
ASSERT_EQUALS(false, library.isargvalid("foo", 2, -10));
133+
ASSERT_EQUALS(true, library.isargvalid("foo", 2, -7));
134+
ASSERT_EQUALS(true, library.isargvalid("foo", 2, -3));
135+
ASSERT_EQUALS(true, library.isargvalid("foo", 2, 0));
136+
ASSERT_EQUALS(false, library.isargvalid("foo", 2, 1));
137+
138+
// 1-5,8
139+
ASSERT_EQUALS(false, library.isargvalid("foo", 3, 0));
140+
ASSERT_EQUALS(true, library.isargvalid("foo", 3, 1));
141+
ASSERT_EQUALS(true, library.isargvalid("foo", 3, 3));
142+
ASSERT_EQUALS(true, library.isargvalid("foo", 3, 5));
143+
ASSERT_EQUALS(false, library.isargvalid("foo", 3, 6));
144+
ASSERT_EQUALS(false, library.isargvalid("foo", 3, 7));
145+
ASSERT_EQUALS(true, library.isargvalid("foo", 3, 8));
146+
ASSERT_EQUALS(false, library.isargvalid("foo", 3, 9));
147+
}
148+
111149
void memory() const {
112150
const char xmldata[] = "<?xml version=\"1.0\"?>\n"
113151
"<def>\n"

0 commit comments

Comments
 (0)