SemanticAdaptationGeneratorTest.xtend 14 KB

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