Parsing <none of those> values in SAS files.
This commit is contained in:
parent
401c4069bd
commit
d118788142
@ -34,6 +34,7 @@ struct Value
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const Value Any;
|
static const Value Any;
|
||||||
|
static const Value None;
|
||||||
|
|
||||||
static Value fromSAS(std::istream &istream);
|
static Value fromSAS(std::istream &istream);
|
||||||
static const Value &referenceFromSAS(std::istream &istream, const Variable &variable);
|
static const Value &referenceFromSAS(std::istream &istream, const Variable &variable);
|
||||||
@ -49,7 +50,7 @@ struct Value
|
|||||||
const std::string &name() const;
|
const std::string &name() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static const Value any();
|
static const Value reserved(const std::string &name);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Value();
|
Value();
|
||||||
@ -61,6 +62,10 @@ struct Value
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
bool operator ==(const Value &value1, const Value &value2);
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,18 +16,19 @@ namespace sas
|
|||||||
//
|
//
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
const Value Value::any()
|
const Value Value::reserved(const std::string &name)
|
||||||
{
|
{
|
||||||
Value any;
|
Value any;
|
||||||
|
|
||||||
any.m_name = "(any)";
|
any.m_name = name;
|
||||||
|
|
||||||
return any;
|
return any;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
const Value Value::Any = Value::any();
|
const Value Value::Any = Value::reserved("(any)");
|
||||||
|
const Value Value::None = Value::reserved("(none)");
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@ -54,10 +55,19 @@ Value Value::negated() const
|
|||||||
|
|
||||||
Value Value::fromSAS(std::istream &istream)
|
Value Value::fromSAS(std::istream &istream)
|
||||||
{
|
{
|
||||||
Value value;
|
|
||||||
|
|
||||||
const auto sasSign = utils::parse<std::string>(istream);
|
const auto sasSign = utils::parse<std::string>(istream);
|
||||||
|
|
||||||
|
if (sasSign == "<none")
|
||||||
|
{
|
||||||
|
utils::parseExpected<std::string>(istream, "of");
|
||||||
|
utils::parseExpected<std::string>(istream, "those>");
|
||||||
|
|
||||||
|
// TODO: do not return a copy of Value::None
|
||||||
|
return Value::None;
|
||||||
|
}
|
||||||
|
|
||||||
|
Value value;
|
||||||
|
|
||||||
if (sasSign == "Atom")
|
if (sasSign == "Atom")
|
||||||
value.m_sign = Value::Sign::Positive;
|
value.m_sign = Value::Sign::Positive;
|
||||||
else if (sasSign == "NegatedAtom")
|
else if (sasSign == "NegatedAtom")
|
||||||
@ -148,5 +158,18 @@ void Value::printAsSAS(std::ostream &ostream) const
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
bool operator ==(const Value &value1, const Value &value2)
|
||||||
|
{
|
||||||
|
if (value1.sign() != value2.sign())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (value1.name() != value2.name())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@ class SASParserTests : public ::testing::Test
|
|||||||
protected:
|
protected:
|
||||||
SASParserTests()
|
SASParserTests()
|
||||||
: m_blocksworldTestFile(readFile("data/blocksworld.sas")),
|
: m_blocksworldTestFile(readFile("data/blocksworld.sas")),
|
||||||
|
m_freecellTestFile(readFile("data/freecell.sas")),
|
||||||
m_philosophersTestFile(readFile("data/philosophers.sas"))
|
m_philosophersTestFile(readFile("data/philosophers.sas"))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -33,6 +34,7 @@ class SASParserTests : public ::testing::Test
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::stringstream m_blocksworldTestFile;
|
std::stringstream m_blocksworldTestFile;
|
||||||
|
std::stringstream m_freecellTestFile;
|
||||||
std::stringstream m_philosophersTestFile;
|
std::stringstream m_philosophersTestFile;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -128,6 +130,24 @@ TEST_F(SASParserTests, RemoveTrailingParentheses)
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
TEST_F(SASParserTests, ParseNoneValue)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const auto description = plasp::sas::Description::fromStream(m_freecellTestFile);
|
||||||
|
|
||||||
|
// TODO: compare by identity, not value
|
||||||
|
ASSERT_EQ(description.variables()[0].values()[3], plasp::sas::Value::None);
|
||||||
|
ASSERT_EQ(description.variables()[5].values()[6], plasp::sas::Value::None);
|
||||||
|
}
|
||||||
|
catch (const std::exception &e)
|
||||||
|
{
|
||||||
|
FAIL () << e.what();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
::testing::InitGoogleTest(&argc, argv);
|
::testing::InitGoogleTest(&argc, argv);
|
||||||
|
34277
tests/data/freecell.sas
Normal file
34277
tests/data/freecell.sas
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user