SemanticAdaptationGeneratorTest.xtend 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. /*
  2. * generated by Xtext 2.10.0
  3. */
  4. package be.uantwerpen.ansymo.semanticadaptation.tests
  5. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Adaptation
  6. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Assignment
  7. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.AtomicUnity
  8. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.BoolLiteral
  9. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.CompositeOutputFunction
  10. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.CustomControlRule
  11. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Declaration
  12. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.InnerFMU
  13. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.MultiplyUnity
  14. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Neg
  15. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Port
  16. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.SemanticAdaptation
  17. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.SingleVarDeclaration
  18. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Variable
  19. import com.google.inject.Inject
  20. import org.eclipse.xtext.testing.InjectWith
  21. import org.eclipse.xtext.testing.XtextRunner
  22. import org.eclipse.xtext.util.IAcceptor
  23. import org.eclipse.xtext.xbase.testing.CompilationTestHelper
  24. import org.eclipse.xtext.xbase.testing.CompilationTestHelper.Result
  25. import org.junit.Assert
  26. import org.junit.Test
  27. import org.junit.runner.RunWith
  28. import org.junit.Ignore
  29. @RunWith(XtextRunner)
  30. @InjectWith(SemanticAdaptationInjectorProvider)
  31. class SemanticAdaptationGeneratorTest extends AbstractSemanticAdaptationTest{
  32. @Inject extension CompilationTestHelper
  33. @Test def test_inferTypesAndUnits_sample1() { __generate('input/canonical_generation/sample1.sa', new IAcceptor<CompilationTestHelper.Result>(){
  34. override accept(Result t) {
  35. var Adaptation sa = t.resourceSet.resources.head.allContents.toIterable.filter(SemanticAdaptation).last.elements.filter(Adaptation).head
  36. Assert.assertTrue(sa.name == "outerFMU")
  37. Assert.assertTrue(sa.eAllContents.filter(Port).filter[p | p.name=="ext_input_port3"].head.unity instanceof MultiplyUnity)
  38. Assert.assertTrue(sa.eAllContents.filter(InnerFMU).filter[f | f.name=="innerFMU2"].head
  39. .eAllContents.filter(Port).filter[p | p.name=="innerFMU2__input_port1"].head.type == "Real")
  40. Assert.assertTrue(sa.eAllContents.filter(InnerFMU).filter[f | f.name=="innerFMU2"].head
  41. .eAllContents.filter(Port).filter[p | p.name=="innerFMU2__outout_port1"].head.type == "Real")
  42. Assert.assertTrue(sa.eAllContents.filter(InnerFMU).filter[f | f.name=="innerFMU2"].head
  43. .eAllContents.filter(Port).filter[p | p.name=="innerFMU2__outout_port1"].head.unity instanceof AtomicUnity)
  44. }
  45. }) }
  46. @Test def test_addInputPorts_sample1() { __generate('input/canonical_generation/sample1.sa', new IAcceptor<CompilationTestHelper.Result>(){
  47. override accept(Result t) {
  48. var Adaptation sa = t.resourceSet.resources.head.allContents.toIterable.filter(SemanticAdaptation).last.elements.filter(Adaptation).head
  49. Assert.assertTrue(sa.inports.filter[p | p.name=="innerFMU1__input_port2"].head.type == "Bool")
  50. Assert.assertTrue(sa.inports.filter[p | p.name=="innerFMU1__input_port1"].size == 0)
  51. //sa.inports.filter[p | p.name=="innerFMU2__input_port3"].head.targetdependency.owner.name == "innerFMU2"
  52. //sa.inports.filter[p | p.name=="innerFMU2__input_port3"].head.targetdependency.port.name == "input_port3"
  53. }
  54. }) }
  55. @Test def test_addParams_sample1() { __generate('input/canonical_generation/sample1.sa', new IAcceptor<CompilationTestHelper.Result>(){
  56. override accept(Result t) {
  57. var Adaptation sa = t.resourceSet.resources.head.allContents.toIterable.filter(SemanticAdaptation).last.elements.filter(Adaptation).head
  58. Assert.assertTrue(sa.params.head.declarations.filter[p | p.name=="INIT_EXT_INPUT_PORT3"].head.type == "Real")
  59. Assert.assertTrue(sa.params.head.declarations.filter[p | p.name=="INIT_INNERFMU1__INPUT_PORT2"].head.expr instanceof BoolLiteral)
  60. }
  61. }) }
  62. @Test def test_addInVars_sample1() { __generate('input/canonical_generation/sample1.sa', new IAcceptor<CompilationTestHelper.Result>(){
  63. override accept(Result t) {
  64. var Adaptation sa = t.resourceSet.resources.head.allContents.toIterable.filter(SemanticAdaptation).last.elements.filter(Adaptation).head
  65. Assert.assertTrue(sa.in.globalInVars.head.declarations.filter[p | p.name=="stored__innerFMU2__input_port2"].head.type == "Bool")
  66. Assert.assertTrue(sa.in.globalInVars.head.declarations.filter[p | p.name=="stored__innerFMU2__input_port3"].head.expr instanceof Variable)
  67. }
  68. }) }
  69. @Test def test_addOutVars_sample1() { __generate('input/canonical_generation/sample1.sa', new IAcceptor<CompilationTestHelper.Result>(){
  70. override accept(Result t) {
  71. var Adaptation sa = t.resourceSet.resources.head.allContents.toIterable.filter(SemanticAdaptation).last.elements.filter(Adaptation).head
  72. Assert.assertTrue(sa.out.globalOutVars.head.declarations.filter[p | p.name=="stored__innerFMU1__output_port2"].head.type == "Integer")
  73. }
  74. }) }
  75. @Test def test_addExternal2InputPortStoredAssignments_sample1() { __generate('input/canonical_generation/sample1.sa', new IAcceptor<CompilationTestHelper.Result>(){
  76. override accept(Result t) {
  77. var Adaptation sa = t.resourceSet.resources.head.allContents.toIterable.filter(SemanticAdaptation).last.elements.filter(Adaptation).head
  78. val fistAssignment = sa.in.rules.head.statetransitionfunction.statements.head as Assignment
  79. Assert.assertTrue((fistAssignment.lvalue as Variable).ref instanceof SingleVarDeclaration)
  80. Assert.assertTrue((fistAssignment.expr as Variable).ref instanceof Port)
  81. }
  82. }) }
  83. @Test def test_addInternal2OutputPortStoredAssignments_sample1() { __generate('input/canonical_generation/sample1.sa', new IAcceptor<CompilationTestHelper.Result>(){
  84. override accept(Result t) {
  85. var Adaptation sa = t.resourceSet.resources.head.allContents.toIterable.filter(SemanticAdaptation).last.elements.filter(Adaptation).head
  86. var firstAssignment = sa.out.rules.head.statetransitionfunction.statements.head as Assignment
  87. Assert.assertNotEquals((firstAssignment.expr as Variable).owner.name, "outerFMU_BASE")
  88. }
  89. }) }
  90. @Test def test_addInRules_External2Internal_Assignments_sample1() { __generate('input/canonical_generation/sample1.sa', new IAcceptor<CompilationTestHelper.Result>(){
  91. override accept(Result t) {
  92. var Adaptation sa = t.resourceSet.resources.head.allContents.toIterable.filter(SemanticAdaptation).last.elements.filter(Adaptation).head
  93. val outFunction = sa.in.rules.head.outputfunction as CompositeOutputFunction
  94. //val firstAssignment = outFunction.statements.head as Assignment
  95. val assignment = outFunction.statements.filter[s | s instanceof Assignment && (s as Assignment).lvalue.ref.name == "innerFMU2__input_port1"]
  96. Assert.assertEquals(1, assignment.size)
  97. //Assert.assertTrue(firstAssignment.lvalue.ref.name == "innerFMU2__input_port1")
  98. Assert.assertTrue(((assignment.head as Assignment).expr as Variable).ref.name == "stored__innerFMU2__input_port1")
  99. }
  100. }) }
  101. @Test def test_addOutRules_Internal2External_Assignments_sample1() { __generate('input/canonical_generation/sample1.sa', new IAcceptor<CompilationTestHelper.Result>(){
  102. override accept(Result t) {
  103. var Adaptation sa = t.resourceSet.resources.head.allContents.toIterable.filter(SemanticAdaptation).last.elements.filter(Adaptation).head
  104. val outFunction = sa.out.rules.head.outputfunction as CompositeOutputFunction
  105. val firstAssignment = outFunction.statements.head as Assignment
  106. Assert.assertTrue(firstAssignment.lvalue.ref.name == "ext_output_port2")
  107. Assert.assertTrue((firstAssignment.expr as Variable).ref.name == "stored__innerFMU1__output_port2")
  108. }
  109. }) }
  110. @Test def test_removeInBindings_sample1() { __generate('input/canonical_generation/sample1.sa', new IAcceptor<CompilationTestHelper.Result>(){
  111. override accept(Result t) {
  112. var Adaptation sa = t.resourceSet.resources.head.allContents.toIterable.filter(SemanticAdaptation).last.elements.filter(Adaptation).head
  113. Assert.assertTrue(sa.inports.forall[p | p.targetdependency === null])
  114. }
  115. }) }
  116. @Test def test_removeOutBindings_sample1() { __generate('input/canonical_generation/sample1.sa', new IAcceptor<CompilationTestHelper.Result>(){
  117. override accept(Result t) {
  118. var Adaptation sa = t.resourceSet.resources.head.allContents.toIterable.filter(SemanticAdaptation).last.elements.filter(Adaptation).head
  119. Assert.assertTrue(sa.outports.forall[p | p.sourcedependency === null])
  120. }
  121. }) }
  122. @Test def test_addOutParams_sample1() { __generate('input/canonical_generation/sample1.sa', new IAcceptor<CompilationTestHelper.Result>(){
  123. override accept(Result t) {
  124. var Adaptation sa = t.resourceSet.resources.head.allContents.toIterable.filter(SemanticAdaptation).last.elements.filter(Adaptation).head
  125. Assert.assertTrue(sa.params.head.declarations.filter[p | p.name == "INIT_INNERFMU2__OUTPUT_PORT2"].size == 1)
  126. }
  127. }) }
  128. @Test def test_createCoSimStepInstructions_sample2() { __generate('input/canonical_generation/sample2.sa', new IAcceptor<CompilationTestHelper.Result>(){
  129. override accept(Result t) {
  130. var Adaptation sa = t.resourceSet.resources.head.allContents.toIterable.filter(SemanticAdaptation).last.elements.filter(Adaptation).head()
  131. Assert.assertTrue((sa.control.rule as CustomControlRule).controlRulestatements.filter[s | s instanceof Declaration].size>4)
  132. }
  133. }) }
  134. @Test def test_createInternalBindingAssignments_sample2() { __generate('input/canonical_generation/sample2.sa', new IAcceptor<CompilationTestHelper.Result>(){
  135. override accept(Result t) {
  136. var Adaptation sa = t.resourceSet.resources.head.allContents.toIterable.filter(SemanticAdaptation).last.elements.filter(Adaptation).head()
  137. Assert.assertTrue((sa.control.rule as CustomControlRule).controlRulestatements.filter[s | s instanceof Assignment].size>4)
  138. }
  139. }) }
  140. @Test def test_ReplacePortRefs_sample1() { __generate('input/canonical_generation/sample1.sa', new IAcceptor<CompilationTestHelper.Result>(){
  141. override accept(Result t) {
  142. var Adaptation sa = t.resourceSet.resources.head.allContents.toIterable.filter(SemanticAdaptation).last.elements.filter(Adaptation).head
  143. Assert.assertTrue(noPortRefsLeft_LHS(sa))
  144. }
  145. }) }
  146. @Test def test_ReplacePortRefs_windowsa() { __generate('input/power_window_case_study/window_sa.BASE.sa', new IAcceptor<CompilationTestHelper.Result>(){
  147. override accept(Result t) {
  148. var Adaptation sa = t.resourceSet.resources.head.allContents.toIterable.filter(SemanticAdaptation).last.elements.filter(Adaptation).head
  149. Assert.assertTrue(noPortRefsLeft_LHS(sa))
  150. val tauAssignment = ((sa.out.rules.head.outputfunction as CompositeOutputFunction).statements.get(1) as Assignment)
  151. Assert.assertFalse(((tauAssignment.expr as Neg).right as Variable).ref instanceof Port)
  152. }
  153. }) }
  154. def noPortRefsLeft_LHS(Adaptation sa){
  155. return sa.in.rules.forall[dr |
  156. (dr.outputfunction as CompositeOutputFunction).statements.filter[s | s instanceof Assignment].forall[ s |
  157. (s as Assignment).expr.eAllContents.filter[v | v instanceof Variable].forall[ v |
  158. ! ((v as Variable).ref instanceof Port)
  159. ]
  160. ]
  161. ] &&
  162. (sa.control.rule as CustomControlRule).controlRulestatements.filter[s | s instanceof Assignment].forall[ s |
  163. (s as Assignment).expr.eAllContents.filter[v | v instanceof Variable].forall[ v |
  164. ! ((v as Variable).ref instanceof Port)
  165. ]
  166. ] &&
  167. sa.out.rules.forall[dr |
  168. (dr.outputfunction as CompositeOutputFunction).statements.filter[s | s instanceof Assignment].forall[ s |
  169. (s as Assignment).expr.eAllContents.filter[v | v instanceof Variable].forall[ v |
  170. ! ((v as Variable).ref instanceof Port)
  171. ]
  172. ]
  173. ]
  174. }
  175. @Test def test_ReplacePortRefs_sample2() { __generate('input/canonical_generation/sample2.sa', new IAcceptor<CompilationTestHelper.Result>(){
  176. override accept(Result t) {
  177. var Adaptation sa = t.resourceSet.resources.head.allContents.toIterable.filter(SemanticAdaptation).last.elements.filter(Adaptation).head
  178. noPortRefsLeft_LHS(sa)
  179. }
  180. }) }
  181. @Test def window_SA_parseNoExceptions() { __generate('input/power_window_case_study/window_sa.BASE.sa', new IAcceptor<CompilationTestHelper.Result>(){
  182. override accept(Result t) { }
  183. }) }
  184. @Test def window_SA_parseNoExceptions2() { __generate('input/power_window_case_study/window_sa_comp_units.sa', new IAcceptor<CompilationTestHelper.Result>(){
  185. override accept(Result t) { }
  186. }) }
  187. @Test def lazy_SA_parseNoExceptions() { __generate('input/power_window_case_study/lazy.sa', new IAcceptor<CompilationTestHelper.Result>(){
  188. override accept(Result t) { }
  189. }) }
  190. @Ignore
  191. @Test def rate_SA_parseNoExceptions() { __generate('input/power_window_case_study/rate.sa', new IAcceptor<CompilationTestHelper.Result>(){
  192. override accept(Result t) { }
  193. }) }
  194. @Ignore
  195. @Test def power_base_SA_parseNoExceptions() { __generate('input/power_window_case_study/power.BASE.sa', new IAcceptor<CompilationTestHelper.Result>(){
  196. override accept(Result t) { }
  197. }) }
  198. def void __generate(String filename, IAcceptor<CompilationTestHelper.Result> acceptor) {
  199. //readFile(filename).assertCompilesTo('oracles/power_window_case_study/lazy.BASE.sa')
  200. readFile(filename).compile(acceptor)
  201. }
  202. }