diff --git a/examples/conformance/abstract_assoc.py b/examples/conformance/abstract_assoc.py new file mode 100644 index 0000000..902e70f --- /dev/null +++ b/examples/conformance/abstract_assoc.py @@ -0,0 +1,77 @@ +from state.devstate import DevState +from bootstrap.scd import bootstrap_scd +from framework.conformance import Conformance, render_conformance_check_result +from concrete_syntax.textual_od import parser, renderer +from concrete_syntax.common import indent +from concrete_syntax.plantuml import renderer as plantuml +from util.prompt import yes_no, pause + +state = DevState() +scd_mmm = bootstrap_scd(state) + + +# Change this: +mm_cs = """ + BaseA:Class { + abstract = True; + } + BaseB:Class { + abstract = True; + } + baseAssoc:Association (BaseA -> BaseB) { + abstract = True; + target_lower_cardinality = 1; + target_upper_cardinality = 2; # A has 1..2 B + } + A:Class + B:Class + assoc:Association (A -> B) { + # we can further restrict cardinality from baseAssoc: + target_upper_cardinality = 1; + + # relaxing cardinalities or constraints can be done (meaning: it will still be a valid meta-model), but will have no effect: for any instance of a type, the constraints defined on the type and its supertypes will be checked. + } + :Inheritance (A -> BaseA) + :Inheritance (B -> BaseB) + :Inheritance (assoc -> baseAssoc) +""" + +print() +print("Parsing meta-model...") +mm = parser.parse_od( + state, + m_text=mm_cs, # the string of text to parse + mm=scd_mmm, # the meta-model of class diagrams (= our meta-meta-model) +) +print("OK") + +print("Is our meta-model a valid class diagram?") +conf = Conformance(state, mm, scd_mmm) +print(render_conformance_check_result(conf.check_nominal())) + +# Change this: +m_cs = """ + a0:A + b0:B + b1:B + + # error: assoc (A -> B) must have tgt card 0..1 (and we have 2 instead) + :assoc (a0 -> b0) + :assoc (a0 -> b1) + + # error: baseAssoc (A -> B) must have tgt card 1..2 (and we have 0 instead) + a1:A +""" + +print() +print("Parsing model...") +m = parser.parse_od( + state, + m_text=m_cs, + mm=mm, # this time, the meta-model is the previous model we parsed +) +print("OK") + +print("Is our model a valid woods-diagram?") +conf = Conformance(state, m, mm) +print(render_conformance_check_result(conf.check_nominal()))