Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEd Willink2017-02-11 09:42:13 +0000
committerEd Willink2017-02-11 17:05:41 +0000
commit207462552d1e9a905097fc475dc742139fa96a7a (patch)
treebe9450f4d261e0469656e9ab7d0ff96a07e6820e
parentf079ab89bcb687d25b76a20d2c62f61fc587c248 (diff)
downloadorg.eclipse.qvtd-207462552d1e9a905097fc475dc742139fa96a7a.tar.gz
org.eclipse.qvtd-207462552d1e9a905097fc475dc742139fa96a7a.tar.xz
org.eclipse.qvtd-207462552d1e9a905097fc475dc742139fa96a7a.zip
Simple PL2SC init ok
-rw-r--r--tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/QVTrCompilerTests.java33
-rw-r--r--tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/PetriNet2StateChart.qvtr245
-rw-r--r--tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/samples/testcase0-in.petrinet9
-rw-r--r--tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/samples/testcase0-out.statechart13
-rw-r--r--tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/samples/testcase01.pngbin21284 -> 0 bytes
5 files changed, 89 insertions, 211 deletions
diff --git a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/QVTrCompilerTests.java b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/QVTrCompilerTests.java
index ab98f743f..3e3c4d0cd 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/QVTrCompilerTests.java
+++ b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/QVTrCompilerTests.java
@@ -310,7 +310,7 @@ public class QVTrCompilerTests extends LoadTestCase
// AbstractTransformer.INVOCATIONS.setState(true);
// QVTm2QVTp.PARTITIONING.setState(true);
// QVTr2QVTc.VARIABLES.setState(true);
-// QVTp2QVTs.REGION_ORDER.setState(true);
+ // QVTp2QVTs.REGION_ORDER.setState(true);
MyQVT myQVT = new MyQVT("forward2reverse");
try {
Class<? extends Transformer> txClass = myQVT.buildTransformation("forward2reverse",
@@ -468,7 +468,7 @@ public class QVTrCompilerTests extends LoadTestCase
// AbstractTransformer.EXCEPTIONS.setState(true);
// AbstractTransformer.INVOCATIONS.setState(true);
// QVTm2QVTp.PARTITIONING.setState(true);
-// QVTp2QVTs.REGION_ORDER.setState(true);
+ // QVTp2QVTs.REGION_ORDER.setState(true);
MyQVT myQVT = new MyQVT("iterated2iterated");
myQVT.addUsedGenPackage("org.eclipse.emf.ecore/model/Ecore.genmodel", "//ecore");
try {
@@ -491,6 +491,35 @@ public class QVTrCompilerTests extends LoadTestCase
}
@Test
+ public void testQVTrCompiler_PN2SC_CG() throws Exception {
+ // Splitter.GROUPS.setState(true);
+ // Splitter.RESULT.setState(true);
+ // Splitter.STAGES.setState(true);
+ // AbstractTransformer.EXCEPTIONS.setState(true);
+ // AbstractTransformer.INVOCATIONS.setState(true);
+ // QVTm2QVTp.PARTITIONING.setState(true);
+ MyQVT myQVT = new MyQVT("pn2sc");
+ try {
+ Class<? extends Transformer> txClass = myQVT.buildTransformation("pn2sc", "PetriNet2StateChart.qvtr", "sc",
+ "http://www.eclipse.org/qvtd/xtext/qvtrelation/tests/pn2sc/PNtoSC", false);//,
+ // "SeqMM.SeqMMPackage", "PSeqToStm.PSeqToStmPackage");
+ //
+ myQVT.createGeneratedExecutor(txClass);
+ myQVT.loadInput("pn", "testcase0-in.petrinet");
+ myQVT.executeTransformation();
+ myQVT.saveOutput("sc", "testcase0-out_CG.statechart", "testcase0-out.statechart", null);
+ //
+ // myQVT.createGeneratedExecutor(txClass);
+ // myQVT.loadInput("seqDgm", "SeqUM.xmi");
+ // myQVT.executeTransformation();
+ // myQVT.saveOutput("stm", "StmcUM_CG.xmi", "StmcUM_expected.xmi", null);
+ }
+ finally {
+ myQVT.dispose();
+ }
+ }
+
+ @Test
public void testQVTrCompiler_SeqToStm() throws Exception {
// AbstractTransformer.EXCEPTIONS.setState(true);
// AbstractTransformer.INVOCATIONS.setState(true);
diff --git a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/PetriNet2StateChart.qvtr b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/PetriNet2StateChart.qvtr
index 98361d91c..7ab7824ba 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/PetriNet2StateChart.qvtr
+++ b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/PetriNet2StateChart.qvtr
@@ -16,34 +16,35 @@ package org::eclipse::qvtd::xtext::qvtrelation::tests::pn2sc {
* Transform a PetriNet into a StateChart.
* See: https://github.com/louismrose/ttc_pn2sc/ and https://arxiv.org/pdf/1312.0342.pdf
*/
- transformation PetriNet2StateChart(pn:pnMM, pn1:pnMM, sc1:scMM, pn2:pnMM, sc2:scMM, sc:scMM)
+ transformation PetriNet2StateChart(pn:pnMM, sc:scMM)
{
- key scMM::AND{contains};
- key scMM::OR{contains};
-
- top relation Net2StateChart {
+ top relation Init_Net2StateChart {
domain pn net : Net {};
enforce domain sc statechart : Statechart {
- topState = ts : AND {}
+ topState = ts : AND {
+ name = 'top'
+ }
};
}
- top relation Place2Basic {
+ top relation Init_Place2Basic {
sc : scMM::Statechart;
topState : scMM::AND;
+ placeName : String;
domain pn p : Place {
cnet = net : Net{} ,
- name = placeName : String{}
+ name = placeName
};
enforce domain sc b : Basic {
name = placeName,
rcontains = o : OR {
+ name = placeName.replaceFirst('E','O'),
rcontains = topState
}
{ topState = sc.topState }
};
when {
- Net2StateChart(net, sc);
+ Init_Net2StateChart(net, sc);
}
}
@@ -71,223 +72,49 @@ package org::eclipse::qvtd::xtext::qvtrelation::tests::pn2sc {
}
} */
- top relation Transition2HyperEdge {
+ top relation Init_Transition2HyperEdge {
+ sc : scMM::Statechart;
+ topState : scMM::AND;
+ transitionName : String;
domain pn t : Transition {
- name = transitionName : String{}
+ cnet = net : Net{} ,
+ name = transitionName
};
enforce domain sc e : HyperEdge {
- name = transitionName
- };
+ name = transitionName,
+ rcontains = topState
+ }{ topState = sc.topState };
+ when {
+ Init_Net2StateChart(net, sc);
+ }
}
- top relation Transition2HyperEdge_Content { -- no need to do both bidirectionals
- domain pn postp:Place {
- pret = t:Transition{}
+ top relation Init_Transition2HyperEdge_Post {
+ domain pn prep:Place {
+ postt = t:Transition{}
};
enforce domain sc rnext:State {
- rnext = e:HyperEdge{}
+ next = e:HyperEdge{}
};
when {
- Place2Basic(postp, rnext);
- Transition2HyperEdge(t, e);
+ Init_Place2Basic(prep, rnext);
+ Init_Transition2HyperEdge(t, e);
}
}
-
- top relation Roots2Roots {
- domain pn1 fromNet : Net{};
- domain sc1 fromTopState : AND{Statechart = fromStatechart : Statechart{}};
- enforce domain pn2 toNet : Net{};
- enforce domain sc2 toTopState : AND{Statechart = toStatechart : Statechart{}};
- }
-
- /**
- * Return the maximal Set of Places that can be ANDed with a given Place.
- * An AND of shared post-Transitions is preferred to an AND of shared pre-Transitions.
- * Returns an empty Set if no AND is possible.
- */
- query getAndSet(place : pnMM::Place) : OrderedSet(pnMM::Place) {
- let preTransitions = place.pret->asOrderedSet() in
- let postTransitions = place.postt->asOrderedSet() in
- let prePostPlaces = preTransitions.postp->asOrderedSet() in
- let postPrePlaces = postTransitions.prep->asOrderedSet() in
- if postPrePlaces->forAll(p | p.postt = postTransitions) and prePostPlaces->forAll(p | p.pret->includesAll(preTransitions)) then postPrePlaces
- elseif prePostPlaces->forAll(p | p.pret = preTransitions) and postPrePlaces->forAll(p | p.postt->includesAll(postTransitions)) then prePostPlaces
- else OrderedSet{}
- endif
- }
-
- /**
- * Return the first pair of Places that can be ORed with a given Place.
- * Within a region of eligible OR candidates, only the first candidate is
- * considered. This avoids complexity with overlapping concurrent ORs at the expense of
- * only resolving one OR per candidate region per pass. Returns an empty Set if this
- * place is not part of the firsr candidate.
- */
- query getOrPair(place : pnMM::Place) : OrderedSet(pnMM::Place) {
- let preTransitions = place.pret->asOrderedSet() in
- let postTransitions = place.postt->asOrderedSet() in
- let prePostPlaces = preTransitions.postp->asOrderedSet() in
- let postPrePlaces = postTransitions.prep->asOrderedSet() in
- if postPrePlaces->forAll(p | p.postt = postTransitions) and prePostPlaces->forAll(p | p.pret->includesAll(preTransitions)) then postPrePlaces
- elseif prePostPlaces->forAll(p | p.pret = preTransitions) and postPrePlaces->forAll(p | p.postt->includesAll(postTransitions)) then prePostPlaces
- else OrderedSet{}
- endif
- }
- top relation PlaceState2PlaceState {
- fromNet : pnMM::Net[1];
- fromTopState : scMM::AND[1];
- toNet : pnMM::Net[1];
- toTopState : scMM::AND[1];
- domain pn1 fromPlace:Place{
- cnet = fromNet
- };
- domain sc1 fromState:State{
- rcontains = fromTopState
+ top relation Init_Transition2HyperEdge_Pre {
+ domain pn postp:Place {
+ pret = t:Transition{}
+ };
+ enforce domain sc next:State {
+ rnext = e:HyperEdge{}
};
- enforce domain pn2
- toPlace:Place{
- cnet = toNet
- };
- enforce domain sc2
- toState:State{
- rcontains = toTopState
- };
when {
- Roots2Roots(fromNet, fromTopState, toNet, toTopState);
+ Init_Place2Basic(postp, next);
+ Init_Transition2HyperEdge(t, e);
}
}
- top relation PlaceState2AndPlaceState overrides PlaceState2PlaceState{
- fromNet : pnMM::Net[1];
- fromTopState : scMM::AND[1];
--- fromParentState : scMM::State[1];
- toNet : pnMM::Net[1];
- toTopState : scMM::AND[1];
--- toParentState : scMM::State[1];
- fromPlaces : OrderedSet(pnMM::Place)[1] = getAndSet(fromPlace);
- toAndState : scMM::AND[1];
- domain pn1
- fromPlace:Place{
- cnet = fromNet
- };
- domain sc1
- fromState:State{
- rcontains = fromTopState
- };
- enforce domain pn2
- toPlace:Place{
- cnet = toNet
- };
- enforce domain sc2
- toOrState:OR{
- rcontains = toTopState,
- contains = toAndState
- };
- when {
- fromPlaces->notEmpty();
- Roots2Roots(fromNet, fromTopState, toNet, toTopState);
--- AndPlaces2AndPlaceStates(fromPlaces, toPlace, toStates);
- AndPlaces2AndState(fromPlaces, toAndState);
- }
- }
-
- relation AndPlaces2AndState {
- domain pn1
- fromPlaces : OrderedSet(Place){fromPlace:Place{} ++ _};
--- domain pn2
--- toPlace:Place{};
- enforce domain sc2
- toState:AND{
- contains = toStates : OrderedSet(State){aState:State{} ++ _}
- };
- when {
- fromPlaces->indexOf(fromPlace) = toStates->indexOf(toState);
- Places2States(fromPlaces, toStates);
- Place2State(fromPlace, aState);
- }
- }
-
- relation Places2States {
- domain pn1
- places : OrderedSet(Place){place:Place{} ++ _};
- domain sc1
- states : OrderedSet(State){state:State{} ++ _};
- when {
- Place2State(place, state);
- }
- }
-
- relation Place2State {
- domain pn1 place:Place{};
- enforce domain sc2 state:State{};
- }
-
-
- top relation PlaceState2OrPlaceState overrides PlaceState2PlaceState{
- fromNet : pnMM::Net[1];
- fromTopState : scMM::AND[1];
--- fromParentState : scMM::State[1];
- toNet : pnMM::Net[1];
- toTopState : scMM::AND[1];
--- toParentState : scMM::State[1];
- orPlaces : OrderedSet(pnMM::Place)[1] = getOrPair(fromPlace);
- orStates : OrderedSet(scMM::State)[1];
- domain pn1
- fromPlace:Place{
- cnet = fromNet
- };
- domain sc1
- fromState:State{
- rcontains = fromTopState
- };
- enforce domain pn2
- toPlace:Place{
- cnet = toNet
- };
- enforce domain sc2
- toState:OR{
--- rcontains = toParentState,
- rcontains = toTopState,
- contains = orStates
- };
- when {
- orPlaces->notEmpty();
- Roots2Roots(fromNet, fromTopState, toNet, toTopState);
- Places2States(orPlaces, orStates);
- }
- }
-
-
-/* top relation CreateAND {
- otherTtoPs:OrderedSet(pnMM::Place);
- domain pnsc1
- pTot:PlaceToTransition{
- place = q:Place{},
- transition = t:Transition{
- TransitionToPlace = :OrderedSet(TransitionToPlace){r:Place{} ++ otherTtoPs}
- }
- }
- {
- pn_qs->forAll(pret = pn_q1.pret) and
- pn_qs->forAll(postt = pn_q1.postt)
- };
- enforce domain pnsc2
- pn_t_out:Transition{
- prep = pn_qs:Set(Place){pn_q1:Place{} ++ pn_qs}
- }
- {
- pn_qs->forAll(pret = pn_q1.pret) and
- pn_qs->forAll(postt = pn_q1.postt)
- };
- pn_p:Place{},
- sc_p:OR{
- contains = sc_a:AND{
--- contains = sc_a_qs:Sequence(State){sc_q1,sc_q2 ++ _}
- }
- };
- } */
-
/*retype Place to Basic
migrate Place {
var container = new SC!OR;
diff --git a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/samples/testcase0-in.petrinet b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/samples/testcase0-in.petrinet
new file mode 100644
index 000000000..efde3009a
--- /dev/null
+++ b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/samples/testcase0-in.petrinet
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pnet:Net xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"
+ xmlns:pnet="http://uam.es/PetriNets"
+ xsi:schemaLocation="http://uam.es/PetriNets ../PetriNets.ecore"
+ xmi:id="$29">
+ <places xmi:id="$27" name="E10" pret="$6"/>
+ <places xmi:id="$0" name="E9" postt="$6"/>
+ <transitions xmi:id="$6" name="E17" prep="$0" postp="$27"/>
+</pnet:Net>
diff --git a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/samples/testcase0-out.statechart b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/samples/testcase0-out.statechart
new file mode 100644
index 000000000..eb4b2d1cb
--- /dev/null
+++ b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/samples/testcase0-out.statechart
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schart:Statechart xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:schart="http://uam.es/StateCharts"
+ xsi:schemaLocation="http://uam.es/StateCharts java://org.eclipse.qvtd.xtext.qvtrelation.tests.pn2sc.statecharts.statechartsPackage">
+ <topState name="top">
+ <contains xsi:type="schart:OR" name="O10">
+ <contains xsi:type="schart:Basic" name="E10" rnext="#//@topState/@contains.2"/>
+ </contains>
+ <contains xsi:type="schart:OR" name="O9">
+ <contains xsi:type="schart:Basic" name="E9" next="#//@topState/@contains.2"/>
+ </contains>
+ <contains xsi:type="schart:HyperEdge" name="E17" next="#//@topState/@contains.0/@contains.0" rnext="#//@topState/@contains.1/@contains.0"/>
+ </topState>
+</schart:Statechart>
diff --git a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/samples/testcase01.png b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/samples/testcase01.png
deleted file mode 100644
index 42284e975..000000000
--- a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/samples/testcase01.png
+++ /dev/null
Binary files differ

Back to the top