You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

382 lines
25 KiB

  1. #include <map>
  2. #include "gtest/gtest.h"
  3. #include "src/storage/expressions/Expression.h"
  4. #include "src/storage/expressions/SimpleValuation.h"
  5. #include "src/exceptions/InvalidTypeException.h"
  6. TEST(Expression, FactoryMethodTest) {
  7. EXPECT_NO_THROW(storm::expressions::Expression::createBooleanLiteral(true));
  8. EXPECT_NO_THROW(storm::expressions::Expression::createTrue());
  9. EXPECT_NO_THROW(storm::expressions::Expression::createFalse());
  10. EXPECT_NO_THROW(storm::expressions::Expression::createIntegerLiteral(3));
  11. EXPECT_NO_THROW(storm::expressions::Expression::createDoubleLiteral(3.14));
  12. EXPECT_NO_THROW(storm::expressions::Expression::createBooleanVariable("x"));
  13. EXPECT_NO_THROW(storm::expressions::Expression::createIntegerVariable("y"));
  14. EXPECT_NO_THROW(storm::expressions::Expression::createDoubleVariable("z"));
  15. EXPECT_NO_THROW(storm::expressions::Expression::createBooleanConstant("a"));
  16. EXPECT_NO_THROW(storm::expressions::Expression::createIntegerConstant("b"));
  17. EXPECT_NO_THROW(storm::expressions::Expression::createDoubleConstant("c"));
  18. }
  19. TEST(Expression, AccessorTest) {
  20. storm::expressions::Expression trueExpression;
  21. storm::expressions::Expression falseExpression;
  22. storm::expressions::Expression threeExpression;
  23. storm::expressions::Expression piExpression;
  24. storm::expressions::Expression boolVarExpression;
  25. storm::expressions::Expression intVarExpression;
  26. storm::expressions::Expression doubleVarExpression;
  27. storm::expressions::Expression boolConstExpression;
  28. storm::expressions::Expression intConstExpression;
  29. storm::expressions::Expression doubleConstExpression;
  30. ASSERT_NO_THROW(trueExpression = storm::expressions::Expression::createTrue());
  31. ASSERT_NO_THROW(falseExpression = storm::expressions::Expression::createFalse());
  32. ASSERT_NO_THROW(threeExpression = storm::expressions::Expression::createIntegerLiteral(3));
  33. ASSERT_NO_THROW(piExpression = storm::expressions::Expression::createDoubleLiteral(3.14));
  34. ASSERT_NO_THROW(boolVarExpression = storm::expressions::Expression::createBooleanVariable("x"));
  35. ASSERT_NO_THROW(intVarExpression = storm::expressions::Expression::createIntegerVariable("y"));
  36. ASSERT_NO_THROW(doubleVarExpression = storm::expressions::Expression::createDoubleVariable("z"));
  37. ASSERT_NO_THROW(boolConstExpression = storm::expressions::Expression::createBooleanConstant("a"));
  38. ASSERT_NO_THROW(intConstExpression = storm::expressions::Expression::createIntegerConstant("b"));
  39. ASSERT_NO_THROW(doubleConstExpression = storm::expressions::Expression::createDoubleConstant("c"));
  40. EXPECT_TRUE(trueExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  41. EXPECT_TRUE(trueExpression.isConstant());
  42. EXPECT_TRUE(trueExpression.isTrue());
  43. EXPECT_FALSE(trueExpression.isFalse());
  44. EXPECT_TRUE(trueExpression.getVariables() == std::set<std::string>());
  45. EXPECT_TRUE(trueExpression.getConstants() == std::set<std::string>());
  46. EXPECT_TRUE(falseExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  47. EXPECT_TRUE(falseExpression.isConstant());
  48. EXPECT_FALSE(falseExpression.isTrue());
  49. EXPECT_TRUE(falseExpression.isFalse());
  50. EXPECT_TRUE(falseExpression.getVariables() == std::set<std::string>());
  51. EXPECT_TRUE(falseExpression.getConstants() == std::set<std::string>());
  52. EXPECT_TRUE(threeExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int);
  53. EXPECT_TRUE(threeExpression.isConstant());
  54. EXPECT_FALSE(threeExpression.isTrue());
  55. EXPECT_FALSE(threeExpression.isFalse());
  56. EXPECT_TRUE(threeExpression.getVariables() == std::set<std::string>());
  57. EXPECT_TRUE(threeExpression.getConstants() == std::set<std::string>());
  58. EXPECT_TRUE(piExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double);
  59. EXPECT_TRUE(piExpression.isConstant());
  60. EXPECT_FALSE(piExpression.isTrue());
  61. EXPECT_FALSE(piExpression.isFalse());
  62. EXPECT_TRUE(piExpression.getVariables() == std::set<std::string>());
  63. EXPECT_TRUE(piExpression.getConstants() == std::set<std::string>());
  64. EXPECT_TRUE(boolVarExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  65. EXPECT_FALSE(boolVarExpression.isConstant());
  66. EXPECT_FALSE(boolVarExpression.isTrue());
  67. EXPECT_FALSE(boolVarExpression.isFalse());
  68. EXPECT_TRUE(boolVarExpression.getVariables() == std::set<std::string>({"x"}));
  69. EXPECT_TRUE(boolVarExpression.getConstants() == std::set<std::string>());
  70. EXPECT_TRUE(intVarExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int);
  71. EXPECT_FALSE(intVarExpression.isConstant());
  72. EXPECT_FALSE(intVarExpression.isTrue());
  73. EXPECT_FALSE(intVarExpression.isFalse());
  74. EXPECT_TRUE(intVarExpression.getVariables() == std::set<std::string>({"y"}));
  75. EXPECT_TRUE(intVarExpression.getConstants() == std::set<std::string>());
  76. EXPECT_TRUE(doubleVarExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double);
  77. EXPECT_FALSE(doubleVarExpression.isConstant());
  78. EXPECT_FALSE(doubleVarExpression.isTrue());
  79. EXPECT_FALSE(doubleVarExpression.isFalse());
  80. EXPECT_TRUE(doubleVarExpression.getVariables() == std::set<std::string>({"z"}));
  81. EXPECT_TRUE(doubleVarExpression.getConstants() == std::set<std::string>());
  82. EXPECT_TRUE(boolConstExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  83. EXPECT_FALSE(boolConstExpression.isConstant());
  84. EXPECT_FALSE(boolConstExpression.isTrue());
  85. EXPECT_FALSE(boolConstExpression.isFalse());
  86. EXPECT_TRUE(boolConstExpression.getVariables() == std::set<std::string>());
  87. EXPECT_TRUE(boolConstExpression.getConstants() == std::set<std::string>({"a"}));
  88. EXPECT_TRUE(intConstExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int);
  89. EXPECT_FALSE(intConstExpression.isConstant());
  90. EXPECT_FALSE(intConstExpression.isTrue());
  91. EXPECT_FALSE(intConstExpression.isFalse());
  92. EXPECT_TRUE(intConstExpression.getVariables() == std::set<std::string>());
  93. EXPECT_TRUE(intConstExpression.getConstants() == std::set<std::string>({"b"}));
  94. EXPECT_TRUE(doubleConstExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double);
  95. EXPECT_FALSE(doubleConstExpression.isConstant());
  96. EXPECT_FALSE(doubleConstExpression.isTrue());
  97. EXPECT_FALSE(doubleConstExpression.isFalse());
  98. EXPECT_TRUE(doubleConstExpression.getVariables() == std::set<std::string>());
  99. EXPECT_TRUE(doubleConstExpression.getConstants() == std::set<std::string>({"c"}));
  100. }
  101. TEST(Expression, OperatorTest) {
  102. storm::expressions::Expression trueExpression;
  103. storm::expressions::Expression falseExpression;
  104. storm::expressions::Expression threeExpression;
  105. storm::expressions::Expression piExpression;
  106. storm::expressions::Expression boolVarExpression;
  107. storm::expressions::Expression intVarExpression;
  108. storm::expressions::Expression doubleVarExpression;
  109. storm::expressions::Expression boolConstExpression;
  110. storm::expressions::Expression intConstExpression;
  111. storm::expressions::Expression doubleConstExpression;
  112. ASSERT_NO_THROW(trueExpression = storm::expressions::Expression::createTrue());
  113. ASSERT_NO_THROW(falseExpression = storm::expressions::Expression::createFalse());
  114. ASSERT_NO_THROW(threeExpression = storm::expressions::Expression::createIntegerLiteral(3));
  115. ASSERT_NO_THROW(piExpression = storm::expressions::Expression::createDoubleLiteral(3.14));
  116. ASSERT_NO_THROW(boolVarExpression = storm::expressions::Expression::createBooleanVariable("x"));
  117. ASSERT_NO_THROW(intVarExpression = storm::expressions::Expression::createIntegerVariable("y"));
  118. ASSERT_NO_THROW(doubleVarExpression = storm::expressions::Expression::createDoubleVariable("z"));
  119. ASSERT_NO_THROW(boolConstExpression = storm::expressions::Expression::createBooleanConstant("a"));
  120. ASSERT_NO_THROW(intConstExpression = storm::expressions::Expression::createIntegerConstant("b"));
  121. ASSERT_NO_THROW(doubleConstExpression = storm::expressions::Expression::createDoubleConstant("c"));
  122. storm::expressions::Expression tempExpression;
  123. ASSERT_THROW(tempExpression = trueExpression.ite(falseExpression, piExpression), storm::exceptions::InvalidTypeException);
  124. ASSERT_NO_THROW(tempExpression = boolConstExpression.ite(threeExpression, doubleVarExpression));
  125. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double);
  126. ASSERT_NO_THROW(tempExpression = boolConstExpression.ite(threeExpression, intVarExpression));
  127. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int);
  128. ASSERT_NO_THROW(tempExpression = boolConstExpression.ite(trueExpression, falseExpression));
  129. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  130. ASSERT_THROW(tempExpression = trueExpression + piExpression, storm::exceptions::InvalidTypeException);
  131. ASSERT_NO_THROW(tempExpression = threeExpression + threeExpression);
  132. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int);
  133. ASSERT_NO_THROW(tempExpression = threeExpression + piExpression);
  134. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double);
  135. ASSERT_NO_THROW(tempExpression = doubleVarExpression + doubleConstExpression);
  136. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double);
  137. ASSERT_THROW(tempExpression = trueExpression - piExpression, storm::exceptions::InvalidTypeException);
  138. ASSERT_NO_THROW(tempExpression = threeExpression - threeExpression);
  139. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int);
  140. ASSERT_NO_THROW(tempExpression = threeExpression - piExpression);
  141. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double);
  142. ASSERT_NO_THROW(tempExpression = doubleVarExpression - doubleConstExpression);
  143. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double);
  144. ASSERT_THROW(tempExpression = -trueExpression, storm::exceptions::InvalidTypeException);
  145. ASSERT_NO_THROW(tempExpression = -threeExpression);
  146. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int);
  147. ASSERT_NO_THROW(tempExpression = -piExpression);
  148. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double);
  149. ASSERT_NO_THROW(tempExpression = -doubleVarExpression);
  150. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double);
  151. ASSERT_THROW(tempExpression = trueExpression * piExpression, storm::exceptions::InvalidTypeException);
  152. ASSERT_NO_THROW(tempExpression = threeExpression * threeExpression);
  153. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int);
  154. ASSERT_NO_THROW(tempExpression = threeExpression * piExpression);
  155. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double);
  156. ASSERT_NO_THROW(tempExpression = intVarExpression * intConstExpression);
  157. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int);
  158. ASSERT_THROW(tempExpression = trueExpression / piExpression, storm::exceptions::InvalidTypeException);
  159. ASSERT_NO_THROW(tempExpression = threeExpression / threeExpression);
  160. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int);
  161. ASSERT_NO_THROW(tempExpression = threeExpression / piExpression);
  162. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double);
  163. ASSERT_NO_THROW(tempExpression = doubleVarExpression / intConstExpression);
  164. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double);
  165. ASSERT_THROW(tempExpression = trueExpression && piExpression, storm::exceptions::InvalidTypeException);
  166. ASSERT_NO_THROW(tempExpression = trueExpression && falseExpression);
  167. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  168. ASSERT_NO_THROW(tempExpression = boolVarExpression && boolConstExpression);
  169. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  170. ASSERT_THROW(tempExpression = trueExpression || piExpression, storm::exceptions::InvalidTypeException);
  171. ASSERT_NO_THROW(tempExpression = trueExpression || falseExpression);
  172. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  173. ASSERT_NO_THROW(tempExpression = boolVarExpression || boolConstExpression);
  174. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  175. ASSERT_THROW(tempExpression = !threeExpression, storm::exceptions::InvalidTypeException);
  176. ASSERT_NO_THROW(tempExpression = !trueExpression);
  177. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  178. ASSERT_NO_THROW(tempExpression = !boolVarExpression);
  179. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  180. ASSERT_THROW(tempExpression = trueExpression == piExpression, storm::exceptions::InvalidTypeException);
  181. ASSERT_NO_THROW(tempExpression = threeExpression == threeExpression);
  182. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  183. ASSERT_NO_THROW(tempExpression = intVarExpression == doubleConstExpression);
  184. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  185. ASSERT_THROW(tempExpression = trueExpression != piExpression, storm::exceptions::InvalidTypeException);
  186. ASSERT_NO_THROW(tempExpression = threeExpression != threeExpression);
  187. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  188. ASSERT_NO_THROW(tempExpression = intVarExpression != doubleConstExpression);
  189. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  190. ASSERT_THROW(tempExpression = trueExpression > piExpression, storm::exceptions::InvalidTypeException);
  191. ASSERT_NO_THROW(tempExpression = threeExpression > threeExpression);
  192. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  193. ASSERT_NO_THROW(tempExpression = intVarExpression > doubleConstExpression);
  194. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  195. ASSERT_THROW(tempExpression = trueExpression >= piExpression, storm::exceptions::InvalidTypeException);
  196. ASSERT_NO_THROW(tempExpression = threeExpression >= threeExpression);
  197. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  198. ASSERT_NO_THROW(tempExpression = intVarExpression >= doubleConstExpression);
  199. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  200. ASSERT_THROW(tempExpression = trueExpression < piExpression, storm::exceptions::InvalidTypeException);
  201. ASSERT_NO_THROW(tempExpression = threeExpression < threeExpression);
  202. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  203. ASSERT_NO_THROW(tempExpression = intVarExpression < doubleConstExpression);
  204. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  205. ASSERT_THROW(tempExpression = trueExpression <= piExpression, storm::exceptions::InvalidTypeException);
  206. ASSERT_NO_THROW(tempExpression = threeExpression <= threeExpression);
  207. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  208. ASSERT_NO_THROW(tempExpression = intVarExpression <= doubleConstExpression);
  209. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  210. ASSERT_THROW(tempExpression = storm::expressions::Expression::minimum(trueExpression, piExpression), storm::exceptions::InvalidTypeException);
  211. ASSERT_NO_THROW(tempExpression = storm::expressions::Expression::minimum(threeExpression, threeExpression));
  212. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int);
  213. ASSERT_NO_THROW(tempExpression = storm::expressions::Expression::minimum(intVarExpression, doubleConstExpression));
  214. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double);
  215. ASSERT_THROW(tempExpression = storm::expressions::Expression::maximum(trueExpression, piExpression), storm::exceptions::InvalidTypeException);
  216. ASSERT_NO_THROW(tempExpression = storm::expressions::Expression::maximum(threeExpression, threeExpression));
  217. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int);
  218. ASSERT_NO_THROW(tempExpression = storm::expressions::Expression::maximum(intVarExpression, doubleConstExpression));
  219. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double);
  220. ASSERT_THROW(tempExpression = trueExpression.implies(piExpression), storm::exceptions::InvalidTypeException);
  221. ASSERT_NO_THROW(tempExpression = trueExpression.implies(falseExpression));
  222. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  223. ASSERT_NO_THROW(tempExpression = boolVarExpression.implies(boolConstExpression));
  224. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  225. ASSERT_THROW(tempExpression = trueExpression.iff(piExpression), storm::exceptions::InvalidTypeException);
  226. ASSERT_NO_THROW(tempExpression = trueExpression.iff(falseExpression));
  227. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  228. ASSERT_NO_THROW(tempExpression = boolVarExpression.iff(boolConstExpression));
  229. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool);
  230. ASSERT_THROW(tempExpression = trueExpression.floor(), storm::exceptions::InvalidTypeException);
  231. ASSERT_NO_THROW(tempExpression = threeExpression.floor());
  232. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int);
  233. ASSERT_NO_THROW(tempExpression = doubleConstExpression.floor());
  234. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int);
  235. ASSERT_THROW(tempExpression = trueExpression.ceil(), storm::exceptions::InvalidTypeException);
  236. ASSERT_NO_THROW(tempExpression = threeExpression.ceil());
  237. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int);
  238. ASSERT_NO_THROW(tempExpression = doubleConstExpression.ceil());
  239. EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int);
  240. }
  241. TEST(Expression, SubstitutionTest) {
  242. storm::expressions::Expression trueExpression;
  243. storm::expressions::Expression falseExpression;
  244. storm::expressions::Expression threeExpression;
  245. storm::expressions::Expression piExpression;
  246. storm::expressions::Expression boolVarExpression;
  247. storm::expressions::Expression intVarExpression;
  248. storm::expressions::Expression doubleVarExpression;
  249. storm::expressions::Expression boolConstExpression;
  250. storm::expressions::Expression intConstExpression;
  251. storm::expressions::Expression doubleConstExpression;
  252. ASSERT_NO_THROW(trueExpression = storm::expressions::Expression::createTrue());
  253. ASSERT_NO_THROW(falseExpression = storm::expressions::Expression::createFalse());
  254. ASSERT_NO_THROW(threeExpression = storm::expressions::Expression::createIntegerLiteral(3));
  255. ASSERT_NO_THROW(piExpression = storm::expressions::Expression::createDoubleLiteral(3.14));
  256. ASSERT_NO_THROW(boolVarExpression = storm::expressions::Expression::createBooleanVariable("x"));
  257. ASSERT_NO_THROW(intVarExpression = storm::expressions::Expression::createIntegerVariable("y"));
  258. ASSERT_NO_THROW(doubleVarExpression = storm::expressions::Expression::createDoubleVariable("z"));
  259. ASSERT_NO_THROW(boolConstExpression = storm::expressions::Expression::createBooleanConstant("a"));
  260. ASSERT_NO_THROW(intConstExpression = storm::expressions::Expression::createIntegerConstant("b"));
  261. ASSERT_NO_THROW(doubleConstExpression = storm::expressions::Expression::createDoubleConstant("c"));
  262. storm::expressions::Expression tempExpression;
  263. ASSERT_NO_THROW(tempExpression = (intVarExpression < threeExpression || boolVarExpression) && boolConstExpression);
  264. std::map<std::string, storm::expressions::Expression> substution = { std::make_pair("y", doubleConstExpression), std::make_pair("x", storm::expressions::Expression::createTrue()), std::make_pair("a", storm::expressions::Expression::createTrue()) };
  265. storm::expressions::Expression substitutedExpression;
  266. ASSERT_NO_THROW(substitutedExpression = tempExpression.substitute<std::map>(substution));
  267. EXPECT_TRUE(substitutedExpression.simplify().isTrue());
  268. }
  269. TEST(Expression, SimplificationTest) {
  270. storm::expressions::Expression trueExpression;
  271. storm::expressions::Expression falseExpression;
  272. storm::expressions::Expression threeExpression;
  273. storm::expressions::Expression intVarExpression;
  274. ASSERT_NO_THROW(trueExpression = storm::expressions::Expression::createTrue());
  275. ASSERT_NO_THROW(falseExpression = storm::expressions::Expression::createFalse());
  276. ASSERT_NO_THROW(threeExpression = storm::expressions::Expression::createIntegerLiteral(3));
  277. ASSERT_NO_THROW(intVarExpression = storm::expressions::Expression::createIntegerVariable("y"));
  278. storm::expressions::Expression tempExpression;
  279. storm::expressions::Expression simplifiedExpression;
  280. ASSERT_NO_THROW(tempExpression = trueExpression || intVarExpression > threeExpression);
  281. ASSERT_NO_THROW(simplifiedExpression = tempExpression.simplify());
  282. EXPECT_TRUE(simplifiedExpression.isTrue());
  283. ASSERT_NO_THROW(tempExpression = falseExpression && intVarExpression > threeExpression);
  284. ASSERT_NO_THROW(simplifiedExpression = tempExpression.simplify());
  285. EXPECT_TRUE(simplifiedExpression.isFalse());
  286. }
  287. TEST(Expression, SimpleEvaluationTest) {
  288. storm::expressions::Expression trueExpression;
  289. storm::expressions::Expression falseExpression;
  290. storm::expressions::Expression threeExpression;
  291. storm::expressions::Expression piExpression;
  292. storm::expressions::Expression boolVarExpression;
  293. storm::expressions::Expression intVarExpression;
  294. storm::expressions::Expression doubleVarExpression;
  295. storm::expressions::Expression boolConstExpression;
  296. storm::expressions::Expression intConstExpression;
  297. storm::expressions::Expression doubleConstExpression;
  298. ASSERT_NO_THROW(trueExpression = storm::expressions::Expression::createTrue());
  299. ASSERT_NO_THROW(falseExpression = storm::expressions::Expression::createFalse());
  300. ASSERT_NO_THROW(threeExpression = storm::expressions::Expression::createIntegerLiteral(3));
  301. ASSERT_NO_THROW(piExpression = storm::expressions::Expression::createDoubleLiteral(3.14));
  302. ASSERT_NO_THROW(boolVarExpression = storm::expressions::Expression::createBooleanVariable("x"));
  303. ASSERT_NO_THROW(intVarExpression = storm::expressions::Expression::createIntegerVariable("y"));
  304. ASSERT_NO_THROW(doubleVarExpression = storm::expressions::Expression::createDoubleVariable("z"));
  305. ASSERT_NO_THROW(boolConstExpression = storm::expressions::Expression::createBooleanConstant("a"));
  306. ASSERT_NO_THROW(intConstExpression = storm::expressions::Expression::createIntegerConstant("b"));
  307. ASSERT_NO_THROW(doubleConstExpression = storm::expressions::Expression::createDoubleConstant("c"));
  308. storm::expressions::Expression tempExpression;
  309. ASSERT_NO_THROW(tempExpression = (intVarExpression < threeExpression || boolVarExpression) && boolConstExpression);
  310. ASSERT_NO_THROW(storm::expressions::SimpleValuation valuation);
  311. storm::expressions::SimpleValuation valuation;
  312. ASSERT_NO_THROW(valuation.addBooleanIdentifier("x"));
  313. ASSERT_NO_THROW(valuation.addBooleanIdentifier("a"));
  314. ASSERT_NO_THROW(valuation.addIntegerIdentifier("y"));
  315. ASSERT_NO_THROW(valuation.addIntegerIdentifier("b"));
  316. ASSERT_NO_THROW(valuation.addDoubleIdentifier("z"));
  317. ASSERT_NO_THROW(valuation.addDoubleIdentifier("c"));
  318. ASSERT_THROW(tempExpression.evaluateAsDouble(&valuation), storm::exceptions::InvalidTypeException);
  319. ASSERT_THROW(tempExpression.evaluateAsInt(&valuation), storm::exceptions::InvalidTypeException);
  320. EXPECT_FALSE(tempExpression.evaluateAsBool(&valuation));
  321. ASSERT_NO_THROW(valuation.setBooleanValue("a", true));
  322. EXPECT_TRUE(tempExpression.evaluateAsBool(&valuation));
  323. ASSERT_NO_THROW(valuation.setIntegerValue("y", 3));
  324. EXPECT_FALSE(tempExpression.evaluateAsBool(&valuation));
  325. ASSERT_NO_THROW(tempExpression = ((intVarExpression < threeExpression).ite(trueExpression, falseExpression)));
  326. ASSERT_THROW(tempExpression.evaluateAsDouble(&valuation), storm::exceptions::InvalidTypeException);
  327. ASSERT_THROW(tempExpression.evaluateAsInt(&valuation), storm::exceptions::InvalidTypeException);
  328. EXPECT_FALSE(tempExpression.evaluateAsBool(&valuation));
  329. }