Browse Source

HOA Formula Parser Tests

tempestpy_adaptions
hannah 3 years ago
committed by Stefan Pranger
parent
commit
97c3bdd5a7
  1. 61
      src/test/storm/parser/FormulaParserTest.cpp

61
src/test/storm/parser/FormulaParserTest.cpp

@ -2,7 +2,9 @@
#include "storm-config.h" #include "storm-config.h"
#include "storm-parsers/parser/FormulaParser.h" #include "storm-parsers/parser/FormulaParser.h"
#include "storm/logic/FragmentSpecification.h" #include "storm/logic/FragmentSpecification.h"
#include "storm/automata/DeterministicAutomaton.h"
#include "storm/exceptions/WrongFormatException.h" #include "storm/exceptions/WrongFormatException.h"
#include "storm/exceptions/ExpressionEvaluationException.h"
#include "storm/storage/expressions/ExpressionManager.h" #include "storm/storage/expressions/ExpressionManager.h"
TEST(FormulaParserTest, LabelTest) { TEST(FormulaParserTest, LabelTest) {
@ -337,7 +339,6 @@ TEST(FormulaParserTest, TemporalNegationTest) {
TEST(FormulaParserTest, ComplexPathFormulaTest) { TEST(FormulaParserTest, ComplexPathFormulaTest) {
storm::parser::FormulaParser formulaParser; storm::parser::FormulaParser formulaParser;
std::shared_ptr<storm::logic::Formula const> formula(nullptr); std::shared_ptr<storm::logic::Formula const> formula(nullptr);
formula = formulaParser.parseSingleFormulaFromString( "P=? [(X \"a\") U ( \"b\"& \"c\")]");
std::string input = "P<0.9 [(X !\"a\") & (F ( X \"b\" U G \"c\" & \"d\"))]"; // ((X ! a) & (F ( (X b) U (G (c & d))))) std::string input = "P<0.9 [(X !\"a\") & (F ( X \"b\" U G \"c\" & \"d\"))]"; // ((X ! a) & (F ( (X b) U (G (c & d)))))
ASSERT_NO_THROW(formula = formulaParser.parseSingleFormulaFromString(input)); ASSERT_NO_THROW(formula = formulaParser.parseSingleFormulaFromString(input));
@ -352,4 +353,62 @@ TEST(FormulaParserTest, ComplexPathFormulaTest) {
auto const &nested2 = formula->asProbabilityOperatorFormula().getSubformula(); auto const &nested2 = formula->asProbabilityOperatorFormula().getSubformula();
ASSERT_TRUE(nested2.asBinaryPathFormula().getLeftSubformula().isBinaryPathFormula()); ASSERT_TRUE(nested2.asBinaryPathFormula().getLeftSubformula().isBinaryPathFormula());
ASSERT_TRUE(nested2.asBinaryPathFormula().getRightSubformula().isUntilFormula()); ASSERT_TRUE(nested2.asBinaryPathFormula().getRightSubformula().isUntilFormula());
input = "P=? [(X \"a\") U ( \"b\"& \"c\")]";
formula = formulaParser.parseSingleFormulaFromString(input);
ASSERT_NO_THROW(formula = formulaParser.parseSingleFormulaFromString(input));
auto const &nested3 = formula->asProbabilityOperatorFormula().getSubformula();
EXPECT_TRUE(nested3.asBinaryPathFormula().isUntilFormula());
EXPECT_TRUE(nested3.asBinaryPathFormula().getLeftSubformula().isNextFormula());
}
TEST(FormulaParserTest, HOAPathFormulaTest) {
std::shared_ptr<storm::expressions::ExpressionManager> manager(new storm::expressions::ExpressionManager());
manager->declareIntegerVariable("x");
manager->declareIntegerVariable("y");
storm::parser::FormulaParser formulaParser(manager);
std::shared_ptr<storm::logic::Formula const> formula(nullptr);
std::string input = "P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR "/hoa/automaton_Fandp0Xp1.hoa\", \"p0\" -> !\"a\", \"p1\" -> \"b\" | \"c\" }]";
ASSERT_NO_THROW(formula = formulaParser.parseSingleFormulaFromString(input));
auto const &nested1 = formula->asProbabilityOperatorFormula().getSubformula();
EXPECT_TRUE(nested1.isHOAPathFormula());
EXPECT_TRUE(nested1.isPathFormula());
ASSERT_NO_THROW(std::string af = nested1.asHOAPathFormula().getAutomatonFile());
storm::automata::DeterministicAutomaton::ptr da1;
ASSERT_NO_THROW(da1 = nested1.asHOAPathFormula().readAutomaton());
EXPECT_EQ(3, da1->getNumberOfStates());
EXPECT_EQ(4, da1->getNumberOfEdgesPerState());
std::map<std::string, std::shared_ptr<storm::logic::Formula const>> apFormulaMap1 = nested1.asHOAPathFormula().getAPMapping();
EXPECT_TRUE(apFormulaMap1["p0"]->isUnaryBooleanStateFormula());
EXPECT_TRUE(apFormulaMap1["p1"]->isBinaryBooleanStateFormula());
input = "P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR "/hoa/automaton_UXp0p1.hoa\", \"p0\" -> (x < 7) & !(y = 2), \"p1\" -> (x > 0) }]";
ASSERT_NO_THROW(formula = formulaParser.parseSingleFormulaFromString(input));
auto const &nested2 = formula->asProbabilityOperatorFormula().getSubformula();
EXPECT_TRUE(nested2.isHOAPathFormula());
EXPECT_TRUE(nested2.isPathFormula());
ASSERT_NO_THROW(std::string af = nested2.asHOAPathFormula().getAutomatonFile());
storm::automata::DeterministicAutomaton::ptr da2;
ASSERT_NO_THROW(da2 = nested2.asHOAPathFormula().readAutomaton());
EXPECT_EQ(4, da2->getNumberOfStates());
EXPECT_EQ(4, da2->getNumberOfEdgesPerState());
std::map<std::string, std::shared_ptr<storm::logic::Formula const>> apFormulaMap2 = nested2.asHOAPathFormula().getAPMapping();
EXPECT_TRUE(apFormulaMap2["p0"]->isBinaryBooleanStateFormula());
EXPECT_TRUE(apFormulaMap2["p1"]->isAtomicExpressionFormula());
// Wrong format: p1 -> path formula
input = "P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR "/hoa/automaton_UXp0p1.hoa\", \"p0\" -> (x > 0), \"p1\" -> (x < 7) & (X y = 2) }]";
STORM_SILENT_EXPECT_THROW(formula = formulaParser.parseSingleFormulaFromString(input), storm::exceptions::WrongFormatException);
// Exception: p1 not assigned
input = "P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR "/hoa/automaton_UXp0p1.hoa\", \"p0\" -> (x > 0)}]";
ASSERT_NO_THROW(formula = formulaParser.parseSingleFormulaFromString(input));
auto const &nested3 = formula->asProbabilityOperatorFormula().getSubformula();
storm::automata::DeterministicAutomaton::ptr da3;
STORM_SILENT_EXPECT_THROW(da3 = nested3.asHOAPathFormula().readAutomaton(), storm::exceptions::ExpressionEvaluationException);
} }
Loading…
Cancel
Save