Library: handle validation expression '-1000-0'. Ticket #5847

This commit is contained in:
Daniel Marjamäki 2014-06-07 16:28:29 +02:00
parent 4d5b463613
commit 4c7b0806aa
2 changed files with 48 additions and 4 deletions

View File

@ -181,6 +181,8 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
else if (strcmp(argnode->Name(), "valid") == 0) { else if (strcmp(argnode->Name(), "valid") == 0) {
// Validate the validation expression // Validate the validation expression
const char *p = argnode->GetText(); const char *p = argnode->GetText();
if (*p == '-')
++p;
if (!std::isdigit(*p)) if (!std::isdigit(*p))
return Error(BAD_ATTRIBUTE_VALUE, argnode->GetText()); return Error(BAD_ATTRIBUTE_VALUE, argnode->GetText());
for (; *p; p++) { for (; *p; p++) {
@ -321,6 +323,10 @@ bool Library::isargvalid(const std::string &functionName, int argnr, const MathL
TokenList tokenList(0); TokenList tokenList(0);
std::istringstream istr(ac->valid + ','); std::istringstream istr(ac->valid + ',');
tokenList.createTokens(istr,""); tokenList.createTokens(istr,"");
if (Token::Match(tokenList.front(), "- %num% -")) {
tokenList.front()->str("-" + tokenList.front()->strAt(1));
tokenList.front()->deleteNext();
}
for (const Token *tok = tokenList.front(); tok; tok = tok->next()) { for (const Token *tok = tokenList.front(); tok; tok = tok->next()) {
if (tok->isNumber() && argvalue == MathLib::toLongNumber(tok->str())) if (tok->isNumber() && argvalue == MathLib::toLongNumber(tok->str()))
return true; return true;

View File

@ -33,6 +33,7 @@ private:
TEST_CASE(function); TEST_CASE(function);
TEST_CASE(function_arg); TEST_CASE(function_arg);
TEST_CASE(function_arg_any); TEST_CASE(function_arg_any);
TEST_CASE(function_arg_valid);
TEST_CASE(memory); TEST_CASE(memory);
TEST_CASE(memory2); // define extra "free" allocation functions TEST_CASE(memory2); // define extra "free" allocation functions
TEST_CASE(resource); TEST_CASE(resource);
@ -76,8 +77,7 @@ private:
" <arg nr=\"2\"><not-null/></arg>\n" " <arg nr=\"2\"><not-null/></arg>\n"
" <arg nr=\"3\"><formatstr/></arg>\n" " <arg nr=\"3\"><formatstr/></arg>\n"
" <arg nr=\"4\"><strz/></arg>\n" " <arg nr=\"4\"><strz/></arg>\n"
" <arg nr=\"5\"><valid>1-</valid></arg>\n" " <arg nr=\"5\"><not-bool/></arg>\n"
" <arg nr=\"6\"><not-bool/></arg>\n"
" </function>\n" " </function>\n"
"</def>"; "</def>";
tinyxml2::XMLDocument doc; tinyxml2::XMLDocument doc;
@ -89,8 +89,7 @@ private:
ASSERT_EQUALS(true, library.argumentChecks["foo"][2].notnull); ASSERT_EQUALS(true, library.argumentChecks["foo"][2].notnull);
ASSERT_EQUALS(true, library.argumentChecks["foo"][3].formatstr); ASSERT_EQUALS(true, library.argumentChecks["foo"][3].formatstr);
ASSERT_EQUALS(true, library.argumentChecks["foo"][4].strz); ASSERT_EQUALS(true, library.argumentChecks["foo"][4].strz);
ASSERT_EQUALS("1-", library.argumentChecks["foo"][5].valid); ASSERT_EQUALS(true, library.argumentChecks["foo"][5].notbool);
ASSERT_EQUALS(true, library.argumentChecks["foo"][6].notbool);
} }
void function_arg_any() const { void function_arg_any() const {
@ -108,6 +107,45 @@ private:
ASSERT_EQUALS(true, library.argumentChecks["foo"][-1].notuninit); ASSERT_EQUALS(true, library.argumentChecks["foo"][-1].notuninit);
} }
void function_arg_valid() const {
const char xmldata[] = "<?xml version=\"1.0\"?>\n"
"<def>\n"
" <function name=\"foo\">\n"
" <arg nr=\"1\"><valid>1-</valid></arg>\n"
" <arg nr=\"2\"><valid>-7-0</valid></arg>\n"
" <arg nr=\"3\"><valid>1-5,8</valid></arg>\n"
" </function>\n"
"</def>";
tinyxml2::XMLDocument doc;
doc.Parse(xmldata, sizeof(xmldata));
Library library;
library.load(doc);
// 1-
ASSERT_EQUALS(false, library.isargvalid("foo", 1, -10));
ASSERT_EQUALS(false, library.isargvalid("foo", 1, 0));
ASSERT_EQUALS(true, library.isargvalid("foo", 1, 1));
ASSERT_EQUALS(true, library.isargvalid("foo", 1, 10));
// -7-0
ASSERT_EQUALS(false, library.isargvalid("foo", 2, -10));
ASSERT_EQUALS(true, library.isargvalid("foo", 2, -7));
ASSERT_EQUALS(true, library.isargvalid("foo", 2, -3));
ASSERT_EQUALS(true, library.isargvalid("foo", 2, 0));
ASSERT_EQUALS(false, library.isargvalid("foo", 2, 1));
// 1-5,8
ASSERT_EQUALS(false, library.isargvalid("foo", 3, 0));
ASSERT_EQUALS(true, library.isargvalid("foo", 3, 1));
ASSERT_EQUALS(true, library.isargvalid("foo", 3, 3));
ASSERT_EQUALS(true, library.isargvalid("foo", 3, 5));
ASSERT_EQUALS(false, library.isargvalid("foo", 3, 6));
ASSERT_EQUALS(false, library.isargvalid("foo", 3, 7));
ASSERT_EQUALS(true, library.isargvalid("foo", 3, 8));
ASSERT_EQUALS(false, library.isargvalid("foo", 3, 9));
}
void memory() const { void memory() const {
const char xmldata[] = "<?xml version=\"1.0\"?>\n" const char xmldata[] = "<?xml version=\"1.0\"?>\n"
"<def>\n" "<def>\n"