source: mauRepo/ISO19136-AnxE/test-015.xq @ 8191

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/mauRepo/ISO19136-AnxE/test-015.xq@8406
Revision 8191, 4.1 KB checked in by mnagni, 8 years ago (diff)

#{ROOT_URL}ISO19136-AnxE parametrized the import URLs

Line 
1xquery version "1.0";
2(:~~~~~~~~~~~~~~~~~~~~~~~~~~ Conformance Test  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3Test Number:    015
4Description:    Asserts that <<DataType>>, <<CodeList>> or <<Enumeration>>
5                                classes are used incorrectly in the model.
6                               
7                                Classes of these stereotypes should only be used in the
8                                following contexts:
9                                        1. attribute types;
10                                        2. DataType class may be the source of any association;
11                                        2. target of a composition association, navigable towards
12                                           the <<DataType>>, <<Enumeration>> or <<CodeList>>.
13                                Use in any other association is an error.
14
15Reference:             
16~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~:)
17
18import module namespace mod-fr = "urn:local-module:ISO19136-V3.2-AnxE_XMI-V1.1:framework"
19at "#{ROOT_URL}ISO19136-AnxE/modules/module-framework-functions.xq";
20
21import module namespace mod-xp = "urn:local-module:ISO19136-V3.2-AnxE_XMI-V1.1:xmi-proc"
22at "#{ROOT_URL}ISO19136-AnxE/modules/module-xproc-functions.xq";
23
24declare namespace UML   = "omg.org/UML1.3";
25declare namespace cr    = "http://ndg.service.newmoon.conftest-result/1.0";
26
27(: Declare local variables, particular to this test :)
28declare variable $test-num as xs:integer := 15;
29declare variable $pass-msg as xs:string := "All &lt;&lt;DataType&gt;&gt;, &lt;&lt;CodeList&gt;&gt; or &lt;&lt;Enumeration&gt;&gt; classes are used correctly in the model.";
30declare variable $fail-msg as xs:string := "Illegal use of &lt;&lt;DataType&gt;&gt;, &lt;&lt;CodeList&gt;&gt; or &lt;&lt;Enumeration&gt;&gt; classes has been encountered:";
31
32(:
33        #Date:          2008-12-04
34        #Author:        Pavel Golodoniuc
35
36        Declare the local assert function which defines a postive condition for pass.
37
38        #Update:        2009-01-09
39        #Author:        Pavel Golodoniuc
40        #Note:          Updated assertion rule in order to allow the use of DataType class
41                                as a source of outbound associations.
42:)
43declare function local:assert($doc-root as node()?) as node()?
44{
45        let
46                $fail := (
47                        for $class in $doc-root//UML:Class[UML:ModelElement.stereotype/UML:Stereotype[@name = ("DataType", "CodeList", "Enumeration", "dataType", "codeList", "enumeration")]]
48                        let $stereotype := $class/UML:ModelElement.stereotype/UML:Stereotype/@name
49                                for $end in $doc-root//UML:AssociationEnd[@type eq $class/@xmi.id]
50                                let $opposite-end := $end/preceding-sibling::UML:AssociationEnd | $end/following-sibling::UML:AssociationEnd
51                                return (
52                                        if ($stereotype = ("DataType", "dataType") and
53                                                not(
54                                                        (: The class is used as a target navigable end of an composition association :)
55                                                        $end/@isNavigable eq "true" and
56                                                        $end/UML:ModelElement.taggedValue/UML:TaggedValue[@tag eq "ea_end"]/@value eq "target" and
57                                                        $opposite-end/@aggregation eq "composite"
58                                                        or
59                                                        (: The class is used as a source of outbound association :)
60                                                        $end/@isNavigable eq "false" and
61                                                        $opposite-end/@isNavigable eq "true"
62                                                )
63                                                ) then
64                                        (
65                                                (: Exception is made for DataType classes, which may have outbound associations :)
66                                                <cr:message>{ concat("In an association a ", $stereotype, " class &quot;", $class/@name, "&quot; should be used as a target of composition ", mod-xp:verbose-association($end/../..), " or as a source of an outbound association.") }</cr:message>
67                                        )
68                                        else if (
69                                                $stereotype ne "DataType" and
70                                                $stereotype ne "dataType" and
71                                                (
72                                                        (: The class is used as a target navigable end of an composition association :)
73                                                        $end/@isNavigable ne "true" or
74                                                        $end/UML:ModelElement.taggedValue/UML:TaggedValue[@tag eq "ea_end"]/@value ne "target" or
75                                                        $opposite-end/@aggregation ne "composite"
76                                                )
77                                                ) then
78                                        (
79                                                <cr:message>{ concat("In an association a ", $stereotype, " class &quot;", $class/@name, "&quot; should be used as a target of composition ", mod-xp:verbose-association($end/../..), ".") }</cr:message>
80                                        )
81                                        else ()
82                                )
83                )
84        return
85                if (empty($fail)) then ()
86                else
87                        <cr:fail>
88                                <cr:messages>{ $fail }</cr:messages>
89                        </cr:fail>
90};
91
92(: Create a new result element :)
93mod-fr:new-result($test-num, $pass-msg, $fail-msg, local:assert(/))
Note: See TracBrowser for help on using the repository browser.