Browse Source

Add example demonstrating abstract association and inheritance between associations

Joeri Exelmans 11 months ago
parent
commit
dd7a0536c9
1 changed files with 77 additions and 0 deletions
  1. 77 0
      examples/conformance/abstract_assoc.py

+ 77 - 0
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()))