summaryrefslogtreecommitdiff
path: root/rtemsqual/tests
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2020-05-13 07:17:09 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2020-05-28 10:38:23 +0200
commitd836ec5cd5e4606b0dac076e5492a60645bfce74 (patch)
tree294acfdba07bb450999dd9d0c86c21d9572d5e32 /rtemsqual/tests
parent68478a047cb4d3d27c95dec377518b7877321632 (diff)
specverify: New module
Diffstat (limited to '')
-rw-r--r--rtemsqual/tests/spec-verify/c1.yml12
-rw-r--r--rtemsqual/tests/spec-verify/c2.yml10
-rw-r--r--rtemsqual/tests/spec-verify/c3.yml13
-rw-r--r--rtemsqual/tests/spec-verify/c4.yml18
-rw-r--r--rtemsqual/tests/spec-verify/d.yml7
-rw-r--r--rtemsqual/tests/spec-verify/d2.yml7
-rw-r--r--rtemsqual/tests/spec-verify/d3.yml6
-rw-r--r--rtemsqual/tests/spec-verify/e.yml6
-rw-r--r--rtemsqual/tests/spec-verify/invalid.yml7
-rw-r--r--rtemsqual/tests/spec-verify/keys-at-least-one-0.yml6
-rw-r--r--rtemsqual/tests/spec-verify/keys-at-least-one-1.yml7
-rw-r--r--rtemsqual/tests/spec-verify/keys-at-least-one-2.yml8
-rw-r--r--rtemsqual/tests/spec-verify/keys-at-most-one-0.yml6
-rw-r--r--rtemsqual/tests/spec-verify/keys-at-most-one-1.yml7
-rw-r--r--rtemsqual/tests/spec-verify/keys-at-most-one-2.yml8
-rw-r--r--rtemsqual/tests/spec-verify/keys-exactly-one-0.yml6
-rw-r--r--rtemsqual/tests/spec-verify/keys-exactly-one-1.yml7
-rw-r--r--rtemsqual/tests/spec-verify/keys-exactly-one-2.yml8
-rw-r--r--rtemsqual/tests/spec-verify/notype.yml5
-rw-r--r--rtemsqual/tests/spec-verify/spec/copyright.yml21
-rw-r--r--rtemsqual/tests/spec-verify/spec/copyrights.yml16
-rw-r--r--rtemsqual/tests/spec-verify/spec/enabled-by-list.yml16
-rw-r--r--rtemsqual/tests/spec-verify/spec/enabled-by.yml49
-rw-r--r--rtemsqual/tests/spec-verify/spec/link.yml26
-rw-r--r--rtemsqual/tests/spec-verify/spec/links.yml17
-rw-r--r--rtemsqual/tests/spec-verify/spec/list-str.yml17
-rw-r--r--rtemsqual/tests/spec-verify/spec/optional-str.yml16
-rw-r--r--rtemsqual/tests/spec-verify/spec/root.yml39
-rw-r--r--rtemsqual/tests/spec-verify/spec/spdx-license-identifier.yml21
-rw-r--r--rtemsqual/tests/spec-verify/spec/spec-assert-float-list.yml16
-rw-r--r--rtemsqual/tests/spec-verify/spec/spec-assert-float.yml71
-rw-r--r--rtemsqual/tests/spec-verify/spec/spec-assert-int-list.yml16
-rw-r--r--rtemsqual/tests/spec-verify/spec/spec-assert-int.yml70
-rw-r--r--rtemsqual/tests/spec-verify/spec/spec-assert-str-list.yml16
-rw-r--r--rtemsqual/tests/spec-verify/spec/spec-assert-str.yml94
-rw-r--r--rtemsqual/tests/spec-verify/spec/spec-attribute-value.yml28
-rw-r--r--rtemsqual/tests/spec-verify/spec/spec-attributes.yml21
-rw-r--r--rtemsqual/tests/spec-verify/spec/spec-bool.yml34
-rw-r--r--rtemsqual/tests/spec-verify/spec/spec-dict.yml41
-rw-r--r--rtemsqual/tests/spec-verify/spec/spec-float.yml31
-rw-r--r--rtemsqual/tests/spec-verify/spec/spec-generic-attributes.yml30
-rw-r--r--rtemsqual/tests/spec-verify/spec/spec-info.yml46
-rw-r--r--rtemsqual/tests/spec-verify/spec/spec-int.yml31
-rw-r--r--rtemsqual/tests/spec-verify/spec/spec-list.yml28
-rw-r--r--rtemsqual/tests/spec-verify/spec/spec-member.yml22
-rw-r--r--rtemsqual/tests/spec-verify/spec/spec-refinement.yml33
-rw-r--r--rtemsqual/tests/spec-verify/spec/spec-required-attributes.yml30
-rw-r--r--rtemsqual/tests/spec-verify/spec/spec-str.yml30
-rw-r--r--rtemsqual/tests/spec-verify/spec/spec.yml74
-rw-r--r--rtemsqual/tests/spec-verify/spec2/any-dict.yml16
-rw-r--r--rtemsqual/tests/spec-verify/spec2/c.yml40
-rw-r--r--rtemsqual/tests/spec-verify/spec2/d-a.yml22
-rw-r--r--rtemsqual/tests/spec-verify/spec2/d.yml21
-rw-r--r--rtemsqual/tests/spec-verify/spec2/invalid.yml24
-rw-r--r--rtemsqual/tests/spec-verify/spec2/keys-at-least-one.yml22
-rw-r--r--rtemsqual/tests/spec-verify/spec2/keys-at-most-one.yml22
-rw-r--r--rtemsqual/tests/spec-verify/spec2/keys-exactly-one.yml22
-rw-r--r--rtemsqual/tests/spec-verify/spec2/must-be-true.yml13
-rw-r--r--rtemsqual/tests/spec-verify/spec2/other-int.yml12
-rw-r--r--rtemsqual/tests/spec-verify/spec2/some-bool.yml12
-rw-r--r--rtemsqual/tests/spec-verify/spec2/some-dict.yml17
-rw-r--r--rtemsqual/tests/spec-verify/spec2/some-float.yml14
-rw-r--r--rtemsqual/tests/spec-verify/spec2/some-int.yml42
-rw-r--r--rtemsqual/tests/spec-verify/spec2/some-list.yml13
-rw-r--r--rtemsqual/tests/spec-verify/spec2/some-str.yml17
-rw-r--r--rtemsqual/tests/spec-verify/spec2/sta.yml9
-rw-r--r--rtemsqual/tests/spec-verify/spec2/str-contains.yml20
-rw-r--r--rtemsqual/tests/spec-verify/spec2/x.yml14
-rw-r--r--rtemsqual/tests/test_specdoc.py185
-rw-r--r--rtemsqual/tests/test_specverify.py1808
70 files changed, 3519 insertions, 0 deletions
diff --git a/rtemsqual/tests/spec-verify/c1.yml b/rtemsqual/tests/spec-verify/c1.yml
new file mode 100644
index 00000000..ac9caf74
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/c1.yml
@@ -0,0 +1,12 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de
+dict:
+ a: null
+enabled-by: true
+links:
+- role: x
+ uid: c2
+list: []
+type: c
+uid: 1
diff --git a/rtemsqual/tests/spec-verify/c2.yml b/rtemsqual/tests/spec-verify/c2.yml
new file mode 100644
index 00000000..5ea57f13
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/c2.yml
@@ -0,0 +1,10 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de
+dict:
+ b: null
+enabled-by: true
+links: []
+list: []
+str-contains: uvw
+type: c
diff --git a/rtemsqual/tests/spec-verify/c3.yml b/rtemsqual/tests/spec-verify/c3.yml
new file mode 100644
index 00000000..9a427110
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/c3.yml
@@ -0,0 +1,13 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de
+dict: []
+enabled-by: true
+links: []
+list:
+ invalid: null
+must-be-true: false
+str: /c4
+str-contains: abc ghi
+type: c
+uid: nix
diff --git a/rtemsqual/tests/spec-verify/c4.yml b/rtemsqual/tests/spec-verify/c4.yml
new file mode 100644
index 00000000..e0195f37
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/c4.yml
@@ -0,0 +1,18 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+any-dict:
+ a: b
+bool: true
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de
+dict: null
+enabled-by: true
+float: 123.567
+int: 123
+links: []
+list: []
+must-be-true: true
+other-int: 0
+str: abc
+str-contains: abc uvw
+type: c
+uid: c3
diff --git a/rtemsqual/tests/spec-verify/d.yml b/rtemsqual/tests/spec-verify/d.yml
new file mode 100644
index 00000000..68f65b9c
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/d.yml
@@ -0,0 +1,7 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de
+d-type: blub
+enabled-by: true
+links: []
+type: d
diff --git a/rtemsqual/tests/spec-verify/d2.yml b/rtemsqual/tests/spec-verify/d2.yml
new file mode 100644
index 00000000..488487d1
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/d2.yml
@@ -0,0 +1,7 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de
+d-type: bla
+enabled-by: true
+links: []
+type: d
diff --git a/rtemsqual/tests/spec-verify/d3.yml b/rtemsqual/tests/spec-verify/d3.yml
new file mode 100644
index 00000000..06b30dad
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/d3.yml
@@ -0,0 +1,6 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de
+enabled-by: true
+links: []
+type: d
diff --git a/rtemsqual/tests/spec-verify/e.yml b/rtemsqual/tests/spec-verify/e.yml
new file mode 100644
index 00000000..b7527dee
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/e.yml
@@ -0,0 +1,6 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de
+enabled-by: true
+links: []
+type: e
diff --git a/rtemsqual/tests/spec-verify/invalid.yml b/rtemsqual/tests/spec-verify/invalid.yml
new file mode 100644
index 00000000..3c193f78
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/invalid.yml
@@ -0,0 +1,7 @@
+INVALID: []
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de
+enabled-by: true
+links: []
+type: spec-invalid
diff --git a/rtemsqual/tests/spec-verify/keys-at-least-one-0.yml b/rtemsqual/tests/spec-verify/keys-at-least-one-0.yml
new file mode 100644
index 00000000..8f9e4b5d
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/keys-at-least-one-0.yml
@@ -0,0 +1,6 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de
+enabled-by: true
+links: []
+type: keys-at-least-one
diff --git a/rtemsqual/tests/spec-verify/keys-at-least-one-1.yml b/rtemsqual/tests/spec-verify/keys-at-least-one-1.yml
new file mode 100644
index 00000000..31d17a4e
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/keys-at-least-one-1.yml
@@ -0,0 +1,7 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de
+enabled-by: true
+links: []
+key-a: null
+type: keys-at-least-one
diff --git a/rtemsqual/tests/spec-verify/keys-at-least-one-2.yml b/rtemsqual/tests/spec-verify/keys-at-least-one-2.yml
new file mode 100644
index 00000000..d0eb8a29
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/keys-at-least-one-2.yml
@@ -0,0 +1,8 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de
+enabled-by: true
+links: []
+key-a: null
+key-b: null
+type: keys-at-least-one
diff --git a/rtemsqual/tests/spec-verify/keys-at-most-one-0.yml b/rtemsqual/tests/spec-verify/keys-at-most-one-0.yml
new file mode 100644
index 00000000..2e3f0202
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/keys-at-most-one-0.yml
@@ -0,0 +1,6 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de
+enabled-by: true
+links: []
+type: keys-at-most-one
diff --git a/rtemsqual/tests/spec-verify/keys-at-most-one-1.yml b/rtemsqual/tests/spec-verify/keys-at-most-one-1.yml
new file mode 100644
index 00000000..e2003342
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/keys-at-most-one-1.yml
@@ -0,0 +1,7 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de
+enabled-by: true
+links: []
+key-a: null
+type: keys-at-most-one
diff --git a/rtemsqual/tests/spec-verify/keys-at-most-one-2.yml b/rtemsqual/tests/spec-verify/keys-at-most-one-2.yml
new file mode 100644
index 00000000..88ee2aaa
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/keys-at-most-one-2.yml
@@ -0,0 +1,8 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de
+enabled-by: true
+links: []
+key-a: null
+key-b: null
+type: keys-at-most-one
diff --git a/rtemsqual/tests/spec-verify/keys-exactly-one-0.yml b/rtemsqual/tests/spec-verify/keys-exactly-one-0.yml
new file mode 100644
index 00000000..1a052978
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/keys-exactly-one-0.yml
@@ -0,0 +1,6 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de
+enabled-by: true
+links: []
+type: keys-exactly-one
diff --git a/rtemsqual/tests/spec-verify/keys-exactly-one-1.yml b/rtemsqual/tests/spec-verify/keys-exactly-one-1.yml
new file mode 100644
index 00000000..2f233dd8
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/keys-exactly-one-1.yml
@@ -0,0 +1,7 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de
+enabled-by: true
+links: []
+key-a: null
+type: keys-exactly-one
diff --git a/rtemsqual/tests/spec-verify/keys-exactly-one-2.yml b/rtemsqual/tests/spec-verify/keys-exactly-one-2.yml
new file mode 100644
index 00000000..6226ec51
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/keys-exactly-one-2.yml
@@ -0,0 +1,8 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de
+enabled-by: true
+links: []
+key-a: null
+key-b: null
+type: keys-exactly-one
diff --git a/rtemsqual/tests/spec-verify/notype.yml b/rtemsqual/tests/spec-verify/notype.yml
new file mode 100644
index 00000000..8da253c5
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/notype.yml
@@ -0,0 +1,5 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de
+enabled-by: true
+links: []
diff --git a/rtemsqual/tests/spec-verify/spec/copyright.yml b/rtemsqual/tests/spec-verify/spec/copyright.yml
new file mode 100644
index 00000000..a8f46080
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/copyright.yml
@@ -0,0 +1,21 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: null
+spec-example: null
+spec-info:
+ str:
+ assert:
+ - re: ^\s*Copyright\s+\(C\)\s+[0-9]+,\s*[0-9]+\s+.+\s*$
+ - re: ^\s*Copyright\s+\(C\)\s+[0-9]+\s+.+\s*$
+ - re: ^\s*Copyright\s+\(C\)\s+.+\s*$
+ description: |
+ A value of this type shall be a copyright statement of a copyright holder
+ of the specification item.
+spec-name: Copyright
+spec-type: copyright
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/copyrights.yml b/rtemsqual/tests/spec-verify/spec/copyrights.yml
new file mode 100644
index 00000000..522e4f43
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/copyrights.yml
@@ -0,0 +1,16 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: null
+spec-example: null
+spec-info:
+ list:
+ description: null
+ spec-type: copyright
+spec-name: Copyrights Type
+spec-type: copyrights
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/enabled-by-list.yml b/rtemsqual/tests/spec-verify/spec/enabled-by-list.yml
new file mode 100644
index 00000000..f84fff28
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/enabled-by-list.yml
@@ -0,0 +1,16 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: null
+spec-example: null
+spec-info:
+ list:
+ description: null
+ spec-type: enabled-by
+spec-name: Enabled-By Expression List
+spec-type: enabled-by-list
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/enabled-by.yml b/rtemsqual/tests/spec-verify/spec/enabled-by.yml
new file mode 100644
index 00000000..fa7de056
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/enabled-by.yml
@@ -0,0 +1,49 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: |
+ A value of this type shall be an expression which defines under which
+ conditions the specification item or parts of it are enabled. The expression
+ is evaluated with the use of an *enabled set*. This is a set of strings
+ which indicate enabled features.
+spec-example: null
+spec-info:
+ bool:
+ description: |
+ This expression evaluates directly to the boolean value.
+ dict:
+ attributes:
+ and:
+ description: |
+ The *and* operator evaluates to the *logical and* of the evaluation
+ results of the expressions in the list.
+ spec-type: enabled-by-list
+ not:
+ description: |
+ The *not* operator evaluates to the *logical not* of the evaluation
+ results of the expression.
+ spec-type: enabled-by
+ or:
+ description: |
+ The *or* operator evaluates to the *logical or* of the evaluation
+ results of the expressions in the list.
+ spec-type: enabled-by-list
+ description: |
+ Each attribute defines an operator.
+ required-attributes: exactly-one
+ list:
+ description: |
+ This list of expressions evaluates to the *logical or* of the evaluation
+ results of the expressions in the list.
+ spec-type: enabled-by
+ str:
+ description: |
+ If the value is in the *enabled set*, this expression evaluates to true,
+ otherwise to false.
+spec-name: Enabled-By Expression
+spec-type: enabled-by
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/link.yml b/rtemsqual/tests/spec-verify/spec/link.yml
new file mode 100644
index 00000000..748ce840
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/link.yml
@@ -0,0 +1,26 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: null
+spec-example: null
+spec-info:
+ dict:
+ attributes:
+ role:
+ description: |
+ This mandatory attribute defines the role of the link.
+ spec-type: name
+ uid:
+ description: |
+ This mandatory attribute defines the link target item UID.
+ spec-type: uid
+ description: |
+ This attribute value shall a link to a specification item.
+ required-attributes: all
+spec-name: Link
+spec-type: link
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/links.yml b/rtemsqual/tests/spec-verify/spec/links.yml
new file mode 100644
index 00000000..77092dfa
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/links.yml
@@ -0,0 +1,17 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: |
+ This attribute value shall be a list of links to specification items.
+spec-example: null
+spec-info:
+ list:
+ description: null
+ spec-type: link
+spec-name: Item Links Type
+spec-type: links
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/list-str.yml b/rtemsqual/tests/spec-verify/spec/list-str.yml
new file mode 100644
index 00000000..4d1246fb
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/list-str.yml
@@ -0,0 +1,17 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: |
+ This attribute value shall a list of strings.
+spec-example: null
+spec-info:
+ list:
+ description: null
+ spec-type: str
+spec-name: String List Type
+spec-type: list-str
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/optional-str.yml b/rtemsqual/tests/spec-verify/spec/optional-str.yml
new file mode 100644
index 00000000..3f409247
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/optional-str.yml
@@ -0,0 +1,16 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: null
+spec-example: null
+spec-info:
+ none: null
+ str:
+ description: null
+spec-name: Optional String
+spec-type: optional-str
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/root.yml b/rtemsqual/tests/spec-verify/spec/root.yml
new file mode 100644
index 00000000..93fd3a9b
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/root.yml
@@ -0,0 +1,39 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links: []
+spec-description: null
+spec-example: null
+spec-info:
+ dict:
+ attributes:
+ SPDX-License-Identifier:
+ description: |
+ This mandatory attribute defines the license of this item.
+ spec-type: spdx-license-identifier
+ copyrights:
+ description: |
+ This mandatory attribute defines the copyright holders and copyright
+ information of this item.
+ spec-type: copyrights
+ enabled-by:
+ description: |
+ This mandatory attribute defines the conditions under which this item
+ is enabled.
+ spec-type: enabled-by
+ links:
+ description: |
+ This mandatory attribute defines the links of this items to other
+ items.
+ spec-type: links
+ type:
+ description: |
+ This mandatory attribute defines the type of this item.
+ spec-type: name
+ description: |
+ This is the root specification item type.
+ required-attributes: all
+spec-name: Root Item Type
+spec-type: root
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/spdx-license-identifier.yml b/rtemsqual/tests/spec-verify/spec/spdx-license-identifier.yml
new file mode 100644
index 00000000..375f3b21
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/spdx-license-identifier.yml
@@ -0,0 +1,21 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: |
+ This attribute value defines the license of this item expressed though an
+ SPDX License Identifier.
+spec-example: null
+spec-info:
+ str:
+ assert:
+ - eq: CC-BY-SA-4.0 OR BSD-2-Clause
+ - eq: BSD-2-Clause
+ - eq: CC-BY-SA-4.0
+ description: null
+spec-name: SPDX License Identifier
+spec-type: spdx-license-identifier
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/spec-assert-float-list.yml b/rtemsqual/tests/spec-verify/spec/spec-assert-float-list.yml
new file mode 100644
index 00000000..2ff8a414
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/spec-assert-float-list.yml
@@ -0,0 +1,16 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: null
+spec-example: null
+spec-info:
+ list:
+ description: null
+ spec-type: spec-assert-float
+spec-name: Floating-Point Assert Specification List
+spec-type: spec-assert-float-list
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/spec-assert-float.yml b/rtemsqual/tests/spec-verify/spec/spec-assert-float.yml
new file mode 100644
index 00000000..9ed1a3fd
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/spec-assert-float.yml
@@ -0,0 +1,71 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: |
+ A value of this type shall be an expression which asserts that the
+ floating-point value of the specified attribute satisfies the required
+ constraints.
+spec-example: null
+spec-info:
+ dict:
+ attributes:
+ and:
+ description: |
+ The *and* operator evaluates to the *logical and* of the evaluation
+ results of the expressions in the list.
+ spec-type: spec-assert-float-list
+ eq:
+ description: |
+ The *eq* operator evaluates to true, if the value to check is equal
+ to the value of this attribute, otherwise to false.
+ spec-type: float
+ ge:
+ description: |
+ The *ge* operator evaluates to true, if the value to check is greater
+ than or equal to the value of this attribute, otherwise to false.
+ spec-type: float
+ gt:
+ description: |
+ The *gt* operator evaluates to true, if the value to check is greater
+ than the value of this attribute, otherwise to false.
+ spec-type: float
+ le:
+ description: |
+ The *le* operator evaluates to true, if the value to check is less
+ than or equal to the value of this attribute, otherwise to false.
+ spec-type: float
+ lt:
+ description: |
+ The *lt* operator evaluates to true, if the value to check is less
+ than the value of this attribute, otherwise to false.
+ spec-type: float
+ ne:
+ description: |
+ The *ne* operator evaluates to true, if the value to check is not
+ equal to the value of this attribute, otherwise to false.
+ spec-type: float
+ not:
+ description: |
+ The *not* operator evaluates to the *logical not* of the evaluation
+ results of the expression.
+ spec-type: spec-assert-float
+ or:
+ description: |
+ The *or* operator evaluates to the *logical or* of the evaluation
+ results of the expressions in the list.
+ spec-type: spec-assert-float-list
+ description: |
+ Each attribute defines an operator.
+ required-attributes: exactly-one
+ list:
+ description: |
+ This list of expressions evaluates to the *logical or* of the evaluation
+ results of the expressions in the list.
+ spec-type: spec-assert-float
+spec-name: Floating-Point Assert Specification
+spec-type: spec-assert-float
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/spec-assert-int-list.yml b/rtemsqual/tests/spec-verify/spec/spec-assert-int-list.yml
new file mode 100644
index 00000000..27e689b3
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/spec-assert-int-list.yml
@@ -0,0 +1,16 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: null
+spec-example: null
+spec-info:
+ list:
+ description: null
+ spec-type: spec-assert-int
+spec-name: Integer Assert Specification List
+spec-type: spec-assert-int-list
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/spec-assert-int.yml b/rtemsqual/tests/spec-verify/spec/spec-assert-int.yml
new file mode 100644
index 00000000..983e1930
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/spec-assert-int.yml
@@ -0,0 +1,70 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: |
+ A value of this type shall be an expression which asserts that the integer
+ value of the specified attribute satisfies the required constraints.
+spec-example: null
+spec-info:
+ dict:
+ attributes:
+ and:
+ description: |
+ The *and* operator evaluates to the *logical and* of the evaluation
+ results of the expressions in the list.
+ spec-type: spec-assert-int-list
+ eq:
+ description: |
+ The *eq* operator evaluates to true, if the value to check is equal
+ to the value of this attribute, otherwise to false.
+ spec-type: int
+ ge:
+ description: |
+ The *ge* operator evaluates to true, if the value to check is greater
+ than or equal to the value of this attribute, otherwise to false.
+ spec-type: int
+ gt:
+ description: |
+ The *gt* operator evaluates to true, if the value to check is greater
+ than the value of this attribute, otherwise to false.
+ spec-type: int
+ le:
+ description: |
+ The *le* operator evaluates to true, if the value to check is less
+ than or equal to the value of this attribute, otherwise to false.
+ spec-type: int
+ lt:
+ description: |
+ The *lt* operator evaluates to true, if the value to check is less
+ than the value of this attribute, otherwise to false.
+ spec-type: int
+ ne:
+ description: |
+ The *ne* operator evaluates to true, if the value to check is not
+ equal to the value of this attribute, otherwise to false.
+ spec-type: int
+ not:
+ description: |
+ The *not* operator evaluates to the *logical not* of the evaluation
+ results of the expression.
+ spec-type: spec-assert-int
+ or:
+ description: |
+ The *or* operator evaluates to the *logical or* of the evaluation
+ results of the expressions in the list.
+ spec-type: spec-assert-int-list
+ description: |
+ Each attribute defines an operator.
+ required-attributes: exactly-one
+ list:
+ description: |
+ This list of expressions evaluates to the *logical or* of the evaluation
+ results of the expressions in the list.
+ spec-type: spec-assert-int
+spec-name: Integer Assert Specification
+spec-type: spec-assert-int
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/spec-assert-str-list.yml b/rtemsqual/tests/spec-verify/spec/spec-assert-str-list.yml
new file mode 100644
index 00000000..39a54916
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/spec-assert-str-list.yml
@@ -0,0 +1,16 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: null
+spec-example: null
+spec-info:
+ list:
+ description: null
+ spec-type: spec-assert-str
+spec-name: String Assert Specification List
+spec-type: spec-assert-str-list
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/spec-assert-str.yml b/rtemsqual/tests/spec-verify/spec/spec-assert-str.yml
new file mode 100644
index 00000000..eccbf710
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/spec-assert-str.yml
@@ -0,0 +1,94 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: |
+ A value of this type shall be an expression which asserts that the string of
+ the specified attribute satisfies the required constraints.
+spec-example: null
+spec-info:
+ dict:
+ attributes:
+ and:
+ description: |
+ The *and* operator evaluates to the *logical and* of the evaluation
+ results of the expressions in the list.
+ spec-type: spec-assert-str-list
+ contains:
+ description: |
+ The *contains* operator evaluates to true, if the string to check
+ converted to lower case with all white space characters converted to
+ a single space character contains a string of the list of strings of
+ this attribute, otherwise to false.
+ spec-type: list-str
+ eq:
+ description: |
+ The *eq* operator evaluates to true, if the string to check is equal
+ to the value of this attribute, otherwise to false.
+ spec-type: str
+ ge:
+ description: |
+ The *ge* operator evaluates to true, if the string to check is
+ greater than or equal to the value of this attribute, otherwise to
+ false.
+ spec-type: str
+ gt:
+ description: |
+ The *gt* operator evaluates to true, if the string to check is
+ greater than the value of this attribute, otherwise to false.
+ spec-type: str
+ in:
+ description: |
+ The *in* operator evaluates to true, if the string to check is
+ contained in the list of strings of this attribute, otherwise to
+ false.
+ spec-type: list-str
+ le:
+ description: |
+ The *le* operator evaluates to true, if the string to check is less
+ than or equal to the value of this attribute, otherwise to false.
+ spec-type: str
+ lt:
+ description: |
+ The *lt* operator evaluates to true, if the string to check is less
+ than the value of this attribute, otherwise to false.
+ spec-type: str
+ ne:
+ description: |
+ The *ne* operator evaluates to true, if the string to check is not
+ equal to the value of this attribute, otherwise to false.
+ spec-type: str
+ not:
+ description: |
+ The *not* operator evaluates to the *logical not* of the evaluation
+ results of the expression.
+ spec-type: spec-assert-str
+ or:
+ description: |
+ The *or* operator evaluates to the *logical or* of the evaluation
+ results of the expressions in the list.
+ spec-type: spec-assert-str-list
+ re:
+ description: |
+ The *re* operator evaluates to true, if the string to check matches
+ with the regular expression of this attribute, otherwise to false.
+ spec-type: str
+ uid:
+ description: |
+ The *uid* operator evaluates to true, if the string is a valid UID,
+ otherwise to false.
+ spec-type: none
+ description: |
+ Each attribute defines an operator.
+ required-attributes: exactly-one
+ list:
+ description: |
+ This list of expressions evaluates to the *logical or* of the evaluation
+ results of the expressions in the list.
+ spec-type: spec-assert-str
+spec-name: String Assert Specification
+spec-type: spec-assert-str
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/spec-attribute-value.yml b/rtemsqual/tests/spec-verify/spec/spec-attribute-value.yml
new file mode 100644
index 00000000..f824de54
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/spec-attribute-value.yml
@@ -0,0 +1,28 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: null
+spec-example: null
+spec-info:
+ dict:
+ attributes:
+ description:
+ description: |
+ This mandatory attribute shall be the description of the specified
+ attribute.
+ spec-type: optional-str
+ spec-type:
+ description: |
+ This mandatory attribute defines the specification type of the
+ specified attribute.
+ spec-type: name
+ description: |
+ This attribute set specifies an attribute value.
+ required-attributes: all
+spec-name: Attribute Value Specification
+spec-type: spec-attribute-value
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/spec-attributes.yml b/rtemsqual/tests/spec-verify/spec/spec-attributes.yml
new file mode 100644
index 00000000..c5299138
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/spec-attributes.yml
@@ -0,0 +1,21 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: null
+spec-example: null
+spec-info:
+ dict:
+ attributes: {}
+ description: null
+ generic-attributes:
+ description: |
+ The generic attributes specify an attribute set.
+ spec-type: spec-attribute-value
+ required-attributes: none
+spec-name: Attribute Specification
+spec-type: spec-attributes
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/spec-bool.yml b/rtemsqual/tests/spec-verify/spec/spec-bool.yml
new file mode 100644
index 00000000..12f932b6
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/spec-bool.yml
@@ -0,0 +1,34 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: null
+spec-example: null
+spec-info:
+ dict:
+ attributes:
+ assert:
+ description: |
+ This optional attribute defines the value constraint of the specified
+ boolean value. If the value of the assert attribute is true, then
+ the value of the specified boolean value shall be true. If the value
+ of the assert attribute is false, then the value of the specified
+ boolean value shall be false. In case the assert attribute is not
+ present, then the value of the specified boolean value may be true or
+ false.
+ spec-type: bool
+ description:
+ description: |
+ This mandatory attribute shall be the description of the specified
+ boolean value.
+ spec-type: optional-str
+ description: |
+ This attribute set specifies a boolean value.
+ required-attributes:
+ - description
+spec-name: Boolean Value Specification
+spec-type: spec-bool
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/spec-dict.yml b/rtemsqual/tests/spec-verify/spec/spec-dict.yml
new file mode 100644
index 00000000..411d0370
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/spec-dict.yml
@@ -0,0 +1,41 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: null
+spec-example: null
+spec-info:
+ dict:
+ attributes:
+ attributes:
+ description: |
+ This mandatory attribute defines the explicitly defined attributes of
+ the specified attribute set.
+ spec-type: spec-attributes
+ description:
+ description: |
+ This mandatory attribute shall be the description of the specified
+ attribute set.
+ spec-type: optional-str
+ generic-attributes:
+ description: |
+ This optional attribute defines the generic attributes of the
+ specified attribute set.
+ spec-type: spec-generic-attributes
+ required-attributes:
+ description: |
+ This mandatory attribute defines the required attributes of the
+ specified attribute set.
+ spec-type: spec-required-attributes
+ description: |
+ This set of attributes specifies a set of attributes.
+ required-attributes:
+ - attributes
+ - description
+ - required-attributes
+spec-name: Attribute Set Specification
+spec-type: spec-dict
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/spec-float.yml b/rtemsqual/tests/spec-verify/spec/spec-float.yml
new file mode 100644
index 00000000..1b0e4925
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/spec-float.yml
@@ -0,0 +1,31 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: null
+spec-example: null
+spec-info:
+ dict:
+ attributes:
+ assert:
+ description: |
+ This optional attribute defines the value constraints of the
+ specified floating-point value. In case the assert attribute is not
+ present, then the value of the specified floating-point value may be
+ every valid floating-point number.
+ spec-type: spec-assert-float
+ description:
+ description: |
+ This mandatory attribute shall be the description of the specified
+ floating-point value.
+ spec-type: optional-str
+ description: |
+ This attribute set specifies a floating-point value.
+ required-attributes:
+ - description
+spec-name: Floating-Point Value Specification
+spec-type: spec-float
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/spec-generic-attributes.yml b/rtemsqual/tests/spec-verify/spec/spec-generic-attributes.yml
new file mode 100644
index 00000000..71fb976d
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/spec-generic-attributes.yml
@@ -0,0 +1,30 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: null
+spec-example: null
+spec-info:
+ dict:
+ attributes:
+ description:
+ description: |
+ This mandatory attribute shall be the description of the generic
+ attributes.
+ spec-type: optional-str
+ spec-type:
+ description: |
+ This mandatory attribute defines the specification type of the
+ generic attribute values.
+ spec-type: name
+ description: |
+ This set of attributes specifies generic attributes. Generic attributes
+ are attributes which are not explicitly defined. They are restricted to
+ a uniform attribute value type.
+ required-attributes: all
+spec-name: Generic Attributes Specification
+spec-type: spec-generic-attributes
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/spec-info.yml b/rtemsqual/tests/spec-verify/spec/spec-info.yml
new file mode 100644
index 00000000..18ecf5c5
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/spec-info.yml
@@ -0,0 +1,46 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: null
+spec-example: null
+spec-info:
+ dict:
+ attributes:
+ bool:
+ description: |
+ This attribute specifies a boolean value.
+ spec-type: spec-bool
+ dict:
+ description: |
+ This attribute specifies a set of attributes.
+ spec-type: spec-dict
+ float:
+ description: |
+ This attribute specifies a floating-point value.
+ spec-type: spec-float
+ int:
+ description: |
+ This attribute specifies an integer value.
+ spec-type: spec-int
+ list:
+ description: |
+ This attribute specifies a list of attributes or values.
+ spec-type: spec-list
+ none:
+ description: |
+ This attribute indicates that no value is required.
+ spec-type: none
+ str:
+ description: |
+ This attribute specifies a string.
+ spec-type: spec-str
+ description: |
+ This attribute set specifies attribute values.
+ required-attributes: at-least-one
+spec-name: Specification Information
+spec-type: spec-info
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/spec-int.yml b/rtemsqual/tests/spec-verify/spec/spec-int.yml
new file mode 100644
index 00000000..2f7394b0
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/spec-int.yml
@@ -0,0 +1,31 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: null
+spec-example: null
+spec-info:
+ dict:
+ attributes:
+ assert:
+ description: |
+ This optional attribute defines the value constraints of the
+ specified integer value. In case the assert attribute is not
+ present, then the value of the specified integer value may be every
+ valid integer number.
+ spec-type: spec-assert-int
+ description:
+ description: |
+ This mandatory attribute shall be the description of the specified
+ integer value.
+ spec-type: optional-str
+ description: |
+ This attribute set specifies an integer value.
+ required-attributes:
+ - description
+spec-name: Integer Value Specification
+spec-type: spec-int
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/spec-list.yml b/rtemsqual/tests/spec-verify/spec/spec-list.yml
new file mode 100644
index 00000000..2c60db37
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/spec-list.yml
@@ -0,0 +1,28 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: null
+spec-example: null
+spec-info:
+ dict:
+ attributes:
+ description:
+ description: |
+ This mandatory attribute shall be the description of the specified
+ list.
+ spec-type: optional-str
+ spec-type:
+ description: |
+ This mandatory attribute defines the specification type of elements
+ of the specified list.
+ spec-type: name
+ description: |
+ This attribute set specifies a list of attributes or values.
+ required-attributes: all
+spec-name: List Specification
+spec-type: spec-list
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/spec-member.yml b/rtemsqual/tests/spec-verify/spec/spec-member.yml
new file mode 100644
index 00000000..60707f97
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/spec-member.yml
@@ -0,0 +1,22 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+- role: spec-refinement
+ spec-key: role
+ spec-value: spec-member
+ uid: link
+spec-description: null
+spec-example: null
+spec-info:
+ dict:
+ attributes: {}
+ description: |
+ This specification type defines the specification membership role of links.
+ required-attributes: none
+spec-name: Specification Member Link Role
+spec-type: spec-member
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/spec-refinement.yml b/rtemsqual/tests/spec-verify/spec/spec-refinement.yml
new file mode 100644
index 00000000..e95467ae
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/spec-refinement.yml
@@ -0,0 +1,33 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+- role: spec-refinement
+ spec-key: role
+ spec-value: spec-refinement
+ uid: link
+spec-description: null
+spec-example: null
+spec-info:
+ dict:
+ attributes:
+ spec-key:
+ description: |
+ This mandatory attribute defines the specification type refinement
+ attribute key of the specification refinement.
+ spec-type: name
+ spec-value:
+ description: |
+ This mandatory attribute defines the specification type refinement
+ attribute value of the specification refinement.
+ spec-type: name
+ description: |
+ This specification type defines the specification refinement role of
+ links.
+ required-attributes: all
+spec-name: Specification Refinement Link Role
+spec-type: spec-refinement
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/spec-required-attributes.yml b/rtemsqual/tests/spec-verify/spec/spec-required-attributes.yml
new file mode 100644
index 00000000..adf6f47b
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/spec-required-attributes.yml
@@ -0,0 +1,30 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: |
+ This attribute value defines which of the explicitly defined attributes are
+ required.
+spec-example: null
+spec-info:
+ list:
+ description: |
+ This list defines the required attributes through their keys.
+ spec-type: name
+ str:
+ assert:
+ in:
+ - all
+ - at-least-one
+ - at-most-one
+ - exactly-one
+ - none
+ description: |
+ This string defines the how many explicitly defined attributes are
+ required.
+spec-name: Required Attributes Specification
+spec-type: spec-required-attributes
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/spec-str.yml b/rtemsqual/tests/spec-verify/spec/spec-str.yml
new file mode 100644
index 00000000..1ccba6f4
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/spec-str.yml
@@ -0,0 +1,30 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+spec-description: null
+spec-example: null
+spec-info:
+ dict:
+ attributes:
+ assert:
+ description: |
+ This optional attribute defines the constraints of the specified
+ string. In case the assert attribute is not present, then the
+ specified string may be every valid string.
+ spec-type: spec-assert-str
+ description:
+ description: |
+ This mandatory attribute shall be the description of the specified
+ string attribute.
+ spec-type: optional-str
+ description: |
+ This attribute set specifies a string.
+ required-attributes:
+ - description
+spec-name: String Specification
+spec-type: spec-str
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec/spec.yml b/rtemsqual/tests/spec-verify/spec/spec.yml
new file mode 100644
index 00000000..7f33c78a
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec/spec.yml
@@ -0,0 +1,74 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: root
+- role: spec-refinement
+ spec-key: type
+ spec-value: spec
+ uid: root
+spec-description: null
+spec-example: |
+ SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+ copyrights:
+ - Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ enabled-by: true
+ links:
+ - role: spec-member
+ uid: root
+ - role: spec-refinement
+ spec-key: type
+ spec-value: example
+ uid: root
+ spec-description: null
+ spec-example: null
+ spec-info:
+ dict:
+ attributes:
+ an-example-attribute:
+ description: |
+ This mandatory attribute shall be an example.
+ spec-type: optional-str
+ example-number:
+ description: |
+ This mandatory attribute shall be the example number.
+ spec-type: int
+ description: |
+ This set of attributes gives an example.
+ required-attributes: all
+ spec-name: Example Item Type
+ spec-type: spec
+ type: spec
+spec-info:
+ dict:
+ attributes:
+ spec-description:
+ description: |
+ This mandatory attribute shall be the description of the
+ specification type.
+ spec-type: optional-str
+ spec-example:
+ description: |
+ This mandatory attribute shall an example of the specification type.
+ spec-type: optional-str
+ spec-info:
+ description: |
+ This mandatory attribute defines the specification type information.
+ spec-type: spec-info
+ spec-name:
+ description: |
+ This mandatory attribute shall be the human readable name of the
+ specification type.
+ spec-type: optional-str
+ spec-type:
+ description: |
+ This mandatory attribute defines the specification type name.
+ spec-type: name
+ description: |
+ This set of attributes specifies specification types.
+ required-attributes: all
+spec-name: Specification Item Type
+spec-type: spec
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec2/any-dict.yml b/rtemsqual/tests/spec-verify/spec2/any-dict.yml
new file mode 100644
index 00000000..5adf31c4
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec2/any-dict.yml
@@ -0,0 +1,16 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: /spec/root
+spec-example: null
+spec-info:
+ dict:
+ attributes: {}
+ generic-attributes:
+ spec-type: str
+ required-attributes: none
+spec-type: any-dict
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec2/c.yml b/rtemsqual/tests/spec-verify/spec2/c.yml
new file mode 100644
index 00000000..8c3fcb53
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec2/c.yml
@@ -0,0 +1,40 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: /spec/root
+- role: spec-refinement
+ spec-key: type
+ spec-value: c
+ uid: /spec/root
+spec-example: null
+spec-info:
+ dict:
+ attributes:
+ any-dict:
+ spec-type: any-dict
+ bool:
+ spec-type: some-bool
+ dict:
+ spec-type: some-dict
+ float:
+ spec-type: some-float
+ int:
+ spec-type: some-int
+ list:
+ spec-type: some-list
+ must-be-true:
+ spec-type: must-be-true
+ other-int:
+ spec-type: other-int
+ str:
+ spec-type: some-str
+ str-contains:
+ spec-type: str-contains
+ uid:
+ spec-type: uid
+ required-attributes: all
+spec-type: c
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec2/d-a.yml b/rtemsqual/tests/spec-verify/spec2/d-a.yml
new file mode 100644
index 00000000..861ead49
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec2/d-a.yml
@@ -0,0 +1,22 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: /spec/root
+- role: spec-refinement
+ spec-key: d-type
+ spec-value: blub
+ uid: d
+- role: other
+ uid: d
+spec-example: null
+spec-info:
+ dict:
+ attributes:
+ d-type:
+ spec-type: x
+ required-attributes: none
+spec-type: d-a
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec2/d.yml b/rtemsqual/tests/spec-verify/spec2/d.yml
new file mode 100644
index 00000000..5557dabe
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec2/d.yml
@@ -0,0 +1,21 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: /spec/root
+- role: spec-refinement
+ spec-key: type
+ spec-value: d
+ uid: /spec/root
+spec-example: null
+spec-info:
+ dict:
+ attributes:
+ d-type:
+ spec-type: name
+ required-attributes:
+ - d-type
+spec-type: d
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec2/invalid.yml b/rtemsqual/tests/spec-verify/spec2/invalid.yml
new file mode 100644
index 00000000..20194144
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec2/invalid.yml
@@ -0,0 +1,24 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: /spec/root
+- role: spec-refinement
+ spec-key: type
+ spec-value: spec-invalid
+ uid: /spec/root
+spec-example: null
+spec-info:
+ dict:
+ attributes:
+ INVALID:
+ spec-type: invalid
+ required-attributes: none
+ none: true
+ str:
+ foo: bar
+ unexpected: null
+spec-type: spec-invalid
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec2/keys-at-least-one.yml b/rtemsqual/tests/spec-verify/spec2/keys-at-least-one.yml
new file mode 100644
index 00000000..d1944f17
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec2/keys-at-least-one.yml
@@ -0,0 +1,22 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: /spec/root
+- role: spec-refinement
+ spec-key: type
+ spec-value: keys-at-least-one
+ uid: /spec/root
+spec-example: null
+spec-info:
+ dict:
+ attributes:
+ key-a:
+ spec-type: none
+ key-b:
+ spec-type: none
+ required-attributes: at-least-one
+spec-type: keys-at-least-one
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec2/keys-at-most-one.yml b/rtemsqual/tests/spec-verify/spec2/keys-at-most-one.yml
new file mode 100644
index 00000000..16581b1d
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec2/keys-at-most-one.yml
@@ -0,0 +1,22 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: /spec/root
+- role: spec-refinement
+ spec-key: type
+ spec-value: keys-at-most-one
+ uid: /spec/root
+spec-example: null
+spec-info:
+ dict:
+ attributes:
+ key-a:
+ spec-type: none
+ key-b:
+ spec-type: none
+ required-attributes: at-most-one
+spec-type: keys-at-most-one
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec2/keys-exactly-one.yml b/rtemsqual/tests/spec-verify/spec2/keys-exactly-one.yml
new file mode 100644
index 00000000..84c17457
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec2/keys-exactly-one.yml
@@ -0,0 +1,22 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: /spec/root
+- role: spec-refinement
+ spec-key: type
+ spec-value: keys-exactly-one
+ uid: /spec/root
+spec-example: null
+spec-info:
+ dict:
+ attributes:
+ key-a:
+ spec-type: none
+ key-b:
+ spec-type: none
+ required-attributes: exactly-one
+spec-type: keys-exactly-one
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec2/must-be-true.yml b/rtemsqual/tests/spec-verify/spec2/must-be-true.yml
new file mode 100644
index 00000000..eaf0ea14
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec2/must-be-true.yml
@@ -0,0 +1,13 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: /spec/root
+spec-example: null
+spec-info:
+ bool:
+ assert: true
+spec-type: must-be-true
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec2/other-int.yml b/rtemsqual/tests/spec-verify/spec2/other-int.yml
new file mode 100644
index 00000000..f0209c08
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec2/other-int.yml
@@ -0,0 +1,12 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: /spec/root
+spec-example: null
+spec-info:
+ int: {}
+spec-type: other-int
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec2/some-bool.yml b/rtemsqual/tests/spec-verify/spec2/some-bool.yml
new file mode 100644
index 00000000..3204d479
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec2/some-bool.yml
@@ -0,0 +1,12 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: /spec/root
+spec-example: null
+spec-info:
+ bool: {}
+spec-type: some-bool
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec2/some-dict.yml b/rtemsqual/tests/spec-verify/spec2/some-dict.yml
new file mode 100644
index 00000000..534b6538
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec2/some-dict.yml
@@ -0,0 +1,17 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: /spec/root
+spec-example: null
+spec-info:
+ dict:
+ attributes:
+ a:
+ spec-type: none
+ required-attributes: none
+ none: null
+spec-type: some-dict
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec2/some-float.yml b/rtemsqual/tests/spec-verify/spec2/some-float.yml
new file mode 100644
index 00000000..114f6feb
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec2/some-float.yml
@@ -0,0 +1,14 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: /spec/root
+spec-example: null
+spec-info:
+ float:
+ assert:
+ - le: 0.0
+spec-type: some-float
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec2/some-int.yml b/rtemsqual/tests/spec-verify/spec2/some-int.yml
new file mode 100644
index 00000000..8f59d8a1
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec2/some-int.yml
@@ -0,0 +1,42 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: /spec/root
+spec-example: null
+spec-info:
+ int:
+ assert:
+ - and:
+ - not:
+ eq: 8
+ - eq: 8
+ - and:
+ - eq: 8
+ - ne: 8
+ - and:
+ - ge: 8
+ - le: 8
+ - and:
+ - gt: 8
+ - lt: 8
+ - and:
+ - le: 8
+ - ge: 8
+ - and:
+ - lt: 8
+ - gt: 8
+ - and:
+ - or:
+ - eq: 8
+ - ne: 8
+ - eq: 1
+ - ne: 2
+ - le: 3
+ - lt: 4
+ - ge: 5
+ - gt: 6
+spec-type: some-int
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec2/some-list.yml b/rtemsqual/tests/spec-verify/spec2/some-list.yml
new file mode 100644
index 00000000..b3b45086
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec2/some-list.yml
@@ -0,0 +1,13 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: /spec/root
+spec-example: null
+spec-info:
+ list:
+ spec-type: none
+spec-type: some-list
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec2/some-str.yml b/rtemsqual/tests/spec-verify/spec2/some-str.yml
new file mode 100644
index 00000000..c75aaf10
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec2/some-str.yml
@@ -0,0 +1,17 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: /spec/root
+spec-example: null
+spec-info:
+ str:
+ assert:
+ - uid: null
+ - eq: abc
+ - ne: abc
+ - re: abc
+spec-type: some-str
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec2/sta.yml b/rtemsqual/tests/spec-verify/spec2/sta.yml
new file mode 100644
index 00000000..1c70a1ce
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec2/sta.yml
@@ -0,0 +1,9 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links: []
+spec-example: null
+spec-info: {}
+spec-type: a
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec2/str-contains.yml b/rtemsqual/tests/spec-verify/spec2/str-contains.yml
new file mode 100644
index 00000000..fbd7b856
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec2/str-contains.yml
@@ -0,0 +1,20 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: /spec/root
+spec-example: null
+spec-info:
+ str:
+ assert:
+ and:
+ - contains:
+ - abc
+ - def
+ - not:
+ contains:
+ - ghi
+spec-type: str-contains
+type: spec
diff --git a/rtemsqual/tests/spec-verify/spec2/x.yml b/rtemsqual/tests/spec-verify/spec2/x.yml
new file mode 100644
index 00000000..e96d281a
--- /dev/null
+++ b/rtemsqual/tests/spec-verify/spec2/x.yml
@@ -0,0 +1,14 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+ uid: /spec/root
+spec-example: null
+spec-info:
+ str:
+ assert:
+ eq: x
+spec-type: x
+type: spec
diff --git a/rtemsqual/tests/test_specdoc.py b/rtemsqual/tests/test_specdoc.py
new file mode 100644
index 00000000..8422d998
--- /dev/null
+++ b/rtemsqual/tests/test_specdoc.py
@@ -0,0 +1,185 @@
+# SPDX-License-Identifier: BSD-2-Clause
+""" Unit tests for the rtemsqual.specdoc module. """
+
+# Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+import os
+
+from rtemsqual.items import ItemCache
+from rtemsqual.specdoc import document
+from rtemsqual.tests.util import create_item_cache_config_and_copy_spec
+
+
+def test_document(tmpdir):
+ item_cache_config = create_item_cache_config_and_copy_spec(
+ tmpdir, "spec-doc")
+ item_cache = ItemCache(item_cache_config)
+ doc_target = os.path.join(tmpdir, "items.rst")
+ config = {
+ "root-type": "/root",
+ "doc-target": doc_target,
+ }
+ document(config, item_cache)
+ with open(doc_target, "r") as src:
+ content = """.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+
+.. _SectionSpecificationItems:
+
+Specification Items
+===================
+
+.. _SectionSpecificationItemTypes:
+
+Specification Item Types
+------------------------
+
+The specification item types have the following hierarchy:
+
+* :ref:`SpecTypeRoot`
+
+ * :ref:`SpecTypeA`
+
+ * :ref:`SpecTypeB`
+
+.. _SpecTypeRoot:
+
+Root
+^^^^
+
+A value of this type shall be of one of the following variants:
+
+* The value may be a boolean.
+
+* The value may be a set of attributes. All explicitly defined attributes shall
+ be specified. The following attributes are explicitly defined for this type:
+
+ type
+ The attribute value shall be a :ref:`SpecTypeName`.
+
+ In addition to the explicitly defined attributes above, generic attributes
+ may be defined. Each attribute key shall be a :ref:`SpecTypeName`. The
+ generic attribute value shall be a :ref:`SpecTypeRoot`.
+
+* The value may be a floating-point number.
+
+* The value may be an integer number.
+
+* The value may be a list. Each list element shall be a :ref:`SpecTypeRoot`.
+
+* There may by be no value (null).
+
+* The value may be a string.
+
+This type is refined by the following types:
+
+* :ref:`SpecTypeA`
+
+* :ref:`SpecTypeB`
+
+.. _SpecTypeA:
+
+A
+^
+
+This type refines the :ref:`SpecTypeRoot` though the ``type`` attribute if the
+value is ``a``.
+
+The following attributes are explicitly defined for this type:
+
+a
+ The attribute value shall be an :ref:`SpecTypeA`.
+
+.. _SpecTypeB:
+
+B
+^
+
+This type refines the following types:
+
+* :ref:`SpecTypeD` though the ``d1`` attribute if the value is ``b``
+
+* :ref:`SpecTypeRoot` though the ``type`` attribute if the value is ``b``
+Generic attributes may be defined. Each attribute key shall be a
+:ref:`SpecTypeName`. The value shall be a list. Each list element shall be a
+string.
+
+.. _SectionSpecificationAttributeSetsAndValueTypes:
+
+Specification Attribute Sets and Value Types
+--------------------------------------------
+
+.. _SpecTypeC:
+
+C
+^
+
+Only the ``c`` attribute is required. The following attributes are explicitly
+defined for this type:
+
+c
+ The attribute value shall be a floating-point number.
+
+.. _SpecTypeD:
+
+D
+^
+
+The following explicitly defined attributes are required:
+
+* ``d1``
+
+* ``d2``
+
+The following attributes are explicitly defined for this type:
+
+d1
+ The attribute value shall be a :ref:`SpecTypeName`.
+
+d2
+ The attribute shall have no value.
+
+This type is refined by the following types:
+
+* :ref:`SpecTypeB`
+
+.. _SpecTypeName:
+
+Name
+^^^^
+
+The value shall be a string. A string is a valid name if it matches with the
+``[a-z][a-z0-9-]*`` regular expression or is equal to
+``SPDX-License-Identifier``.
+
+.. _SpecTypeUID:
+
+UID
+^^^
+
+The value shall be a string. The string shall be a valid absolute or relative
+item UID.
+"""
+ assert content == src.read()
diff --git a/rtemsqual/tests/test_specverify.py b/rtemsqual/tests/test_specverify.py
new file mode 100644
index 00000000..c0cdb186
--- /dev/null
+++ b/rtemsqual/tests/test_specverify.py
@@ -0,0 +1,1808 @@
+# SPDX-License-Identifier: BSD-2-Clause
+""" Unit tests for the rtemsqual.specverify module. """
+
+# Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+import logging
+
+from rtemsqual.items import ItemCache
+from rtemsqual.specverify import verify
+from rtemsqual.tests.util import create_item_cache_config_and_copy_spec
+
+
+def test_no_root_type(caplog, tmpdir):
+ item_cache_config = create_item_cache_config_and_copy_spec(
+ tmpdir, "spec-verify")
+ item_cache = ItemCache(item_cache_config)
+ config = {}
+ caplog.set_level(logging.INFO)
+ verify(config, item_cache)
+ log = "\n".join(
+ [f"{rec.levelname} {rec.message}" for rec in caplog.records])
+ assert log == """ERROR configuration has no root type"""
+
+
+def test_no_root_item(caplog, tmpdir):
+ item_cache_config = create_item_cache_config_and_copy_spec(
+ tmpdir, "spec-verify")
+ item_cache = ItemCache(item_cache_config)
+ config = {"root-type": "/nix"}
+ caplog.set_level(logging.INFO)
+ verify(config, item_cache)
+ log = "\n".join(
+ [f"{rec.levelname} {rec.message}" for rec in caplog.records])
+ assert log == """ERROR root type item does not exist in item cache"""
+
+
+def test_verify(caplog, tmpdir):
+ item_cache_config = create_item_cache_config_and_copy_spec(
+ tmpdir, "spec-verify")
+ item_cache = ItemCache(item_cache_config)
+ config = {"root-type": "/spec/root"}
+ caplog.set_level(logging.INFO)
+ verify(config, item_cache)
+ log = "\n".join(
+ [f"{rec.levelname} {rec.message}" for rec in caplog.records])
+ assert log == """INFO type: any-dict
+INFO type: bool
+INFO type: c
+INFO type: copyright
+INFO type: copyrights
+INFO type: d
+INFO type: d-a
+INFO type: enabled-by
+INFO type: enabled-by-list
+INFO type: float
+INFO type: int
+INFO type: keys-at-least-one
+INFO type: keys-at-most-one
+INFO type: keys-exactly-one
+INFO type: link
+INFO type: links
+INFO type: list-str
+INFO type: must-be-true
+INFO type: name
+INFO type: none
+INFO type: optional-str
+INFO type: other-int
+INFO type: root
+INFO type: some-bool
+INFO type: some-dict
+INFO type: some-float
+INFO type: some-int
+INFO type: some-list
+INFO type: some-str
+INFO type: spdx-license-identifier
+INFO type: spec
+INFO type: spec-assert-float
+INFO type: spec-assert-float-list
+INFO type: spec-assert-int
+INFO type: spec-assert-int-list
+INFO type: spec-assert-str
+INFO type: spec-assert-str-list
+INFO type: spec-attribute-value
+INFO type: spec-attributes
+INFO type: spec-bool
+INFO type: spec-dict
+INFO type: spec-float
+INFO type: spec-generic-attributes
+INFO type: spec-info
+INFO type: spec-int
+INFO type: spec-invalid
+INFO type: spec-list
+INFO type: spec-member
+INFO type: spec-refinement
+INFO type: spec-required-attributes
+INFO type: spec-str
+INFO type: str
+INFO type: str-contains
+INFO type: uid
+INFO type: x
+INFO add subtype 'd' to 'root'
+INFO add subtype 'keys-at-most-one' to 'root'
+INFO add subtype 'c' to 'root'
+INFO add subtype 'keys-at-least-one' to 'root'
+INFO add subtype 'spec-invalid' to 'root'
+INFO add subtype 'keys-exactly-one' to 'root'
+INFO add subtype 'spec' to 'root'
+INFO add subtype 'd-a' to 'd'
+INFO add subtype 'spec-member' to 'link'
+INFO add subtype 'spec-refinement' to 'link'
+INFO start specification item verification
+INFO /c1: verify using type 'root'
+INFO /c1:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /c1:/copyrights: verify using type 'copyrights'
+INFO /c1:/copyrights[0]: verify using type 'copyright'
+INFO /c1:/enabled-by: verify using type 'enabled-by'
+INFO /c1:/links: verify using type 'links'
+INFO /c1:/links[0]: verify using type 'link'
+INFO /c1:/links[0]/role: verify using type 'name'
+INFO /c1:/links[0]/uid: verify using type 'uid'
+ERROR /c1:/links[0]: unknown subtype for key 'role' for type 'link': x
+INFO /c1:/type: verify using type 'name'
+INFO /c1: verify using type 'c'
+ERROR /c1: missing required keys for type 'c': ['any-dict', 'bool', 'float', 'int', 'must-be-true', 'other-int', 'str', 'str-contains']
+INFO /c1:/dict: verify using type 'some-dict'
+INFO /c1:/dict/a: verify using type 'none'
+INFO /c1:/list: verify using type 'some-list'
+INFO /c1:/uid: verify using type 'uid'
+ERROR /c1:/uid: expected type 'str', actual type 'int'
+INFO /c2: verify using type 'root'
+INFO /c2:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /c2:/copyrights: verify using type 'copyrights'
+INFO /c2:/copyrights[0]: verify using type 'copyright'
+INFO /c2:/enabled-by: verify using type 'enabled-by'
+INFO /c2:/links: verify using type 'links'
+INFO /c2:/type: verify using type 'name'
+INFO /c2: verify using type 'c'
+ERROR /c2: missing required keys for type 'c': ['any-dict', 'bool', 'float', 'int', 'must-be-true', 'other-int', 'str', 'uid']
+INFO /c2:/dict: verify using type 'some-dict'
+ERROR /c2:/dict: has unverfied keys for type 'some-dict' and its subtypes: ['b']
+INFO /c2:/list: verify using type 'some-list'
+INFO /c2:/str-contains: verify using type 'str-contains'
+ERROR /c2:/str-contains: invalid value: uvw
+INFO /c3: verify using type 'root'
+INFO /c3:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /c3:/copyrights: verify using type 'copyrights'
+INFO /c3:/copyrights[0]: verify using type 'copyright'
+INFO /c3:/enabled-by: verify using type 'enabled-by'
+INFO /c3:/links: verify using type 'links'
+INFO /c3:/type: verify using type 'name'
+INFO /c3: verify using type 'c'
+ERROR /c3: missing required keys for type 'c': ['any-dict', 'bool', 'float', 'int', 'other-int']
+INFO /c3:/dict: verify using type 'some-dict'
+ERROR /c3:/dict: expected value of types ['dict', 'none'] for type 'some-dict', actual type 'list'
+INFO /c3:/list: verify using type 'some-list'
+ERROR /c3:/list: expected value of types ['list'] for type 'some-list', actual type 'dict'
+INFO /c3:/must-be-true: verify using type 'must-be-true'
+ERROR /c3:/must-be-true: expected True, actual False
+INFO /c3:/str: verify using type 'some-str'
+INFO /c3:/str-contains: verify using type 'str-contains'
+ERROR /c3:/str-contains: invalid value: abc ghi
+INFO /c3:/uid: verify using type 'uid'
+ERROR /c3:/uid: cannot resolve UID: nix
+INFO /c4: verify using type 'root'
+INFO /c4:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /c4:/copyrights: verify using type 'copyrights'
+INFO /c4:/copyrights[0]: verify using type 'copyright'
+INFO /c4:/enabled-by: verify using type 'enabled-by'
+INFO /c4:/links: verify using type 'links'
+INFO /c4:/type: verify using type 'name'
+INFO /c4: verify using type 'c'
+INFO /c4:/any-dict: verify using type 'any-dict'
+INFO /c4:/any-dict/a: verify using type 'str'
+INFO /c4:/bool: verify using type 'some-bool'
+INFO /c4:/dict: verify using type 'some-dict'
+INFO /c4:/float: verify using type 'some-float'
+ERROR /c4:/float: invalid value: 123.567
+INFO /c4:/int: verify using type 'some-int'
+INFO /c4:/list: verify using type 'some-list'
+INFO /c4:/must-be-true: verify using type 'must-be-true'
+INFO /c4:/other-int: verify using type 'other-int'
+INFO /c4:/str: verify using type 'some-str'
+WARNING /c4:/str: cannot resolve UID: abc
+INFO /c4:/str-contains: verify using type 'str-contains'
+INFO /c4:/uid: verify using type 'uid'
+INFO /d: verify using type 'root'
+INFO /d:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /d:/copyrights: verify using type 'copyrights'
+INFO /d:/copyrights[0]: verify using type 'copyright'
+INFO /d:/enabled-by: verify using type 'enabled-by'
+INFO /d:/links: verify using type 'links'
+INFO /d:/type: verify using type 'name'
+INFO /d: verify using type 'd'
+INFO /d:/d-type: verify using type 'name'
+INFO /d: verify using type 'd-a'
+INFO /d:/d-type: verify using type 'x'
+ERROR /d:/d-type: invalid value: blub
+INFO /d2: verify using type 'root'
+INFO /d2:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /d2:/copyrights: verify using type 'copyrights'
+INFO /d2:/copyrights[0]: verify using type 'copyright'
+INFO /d2:/enabled-by: verify using type 'enabled-by'
+INFO /d2:/links: verify using type 'links'
+INFO /d2:/type: verify using type 'name'
+INFO /d2: verify using type 'd'
+INFO /d2:/d-type: verify using type 'name'
+ERROR /d2: unknown subtype for key 'd-type' for type 'd': bla
+INFO /d3: verify using type 'root'
+INFO /d3:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /d3:/copyrights: verify using type 'copyrights'
+INFO /d3:/copyrights[0]: verify using type 'copyright'
+INFO /d3:/enabled-by: verify using type 'enabled-by'
+INFO /d3:/links: verify using type 'links'
+INFO /d3:/type: verify using type 'name'
+INFO /d3: verify using type 'd'
+ERROR /d3: missing required keys for type 'd': ['d-type']
+ERROR /d3: subtype key 'd-type' not present for type 'd'
+INFO /e: verify using type 'root'
+INFO /e:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /e:/copyrights: verify using type 'copyrights'
+INFO /e:/copyrights[0]: verify using type 'copyright'
+INFO /e:/enabled-by: verify using type 'enabled-by'
+INFO /e:/links: verify using type 'links'
+INFO /e:/type: verify using type 'name'
+ERROR /e: unknown subtype for key 'type' for type 'root': e
+INFO /invalid: verify using type 'root'
+INFO /invalid:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /invalid:/copyrights: verify using type 'copyrights'
+INFO /invalid:/copyrights[0]: verify using type 'copyright'
+INFO /invalid:/enabled-by: verify using type 'enabled-by'
+INFO /invalid:/links: verify using type 'links'
+INFO /invalid:/type: verify using type 'name'
+INFO /invalid: verify using type 'spec-invalid'
+ERROR /invalid: unknown specification type: invalid
+INFO /keys-at-least-one-0: verify using type 'root'
+INFO /keys-at-least-one-0:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /keys-at-least-one-0:/copyrights: verify using type 'copyrights'
+INFO /keys-at-least-one-0:/copyrights[0]: verify using type 'copyright'
+INFO /keys-at-least-one-0:/enabled-by: verify using type 'enabled-by'
+INFO /keys-at-least-one-0:/links: verify using type 'links'
+INFO /keys-at-least-one-0:/type: verify using type 'name'
+INFO /keys-at-least-one-0: verify using type 'keys-at-least-one'
+ERROR /keys-at-least-one-0: not at least one key out of ['key-a', 'key-b'] is present for type 'keys-at-least-one'
+INFO /keys-at-least-one-1: verify using type 'root'
+INFO /keys-at-least-one-1:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /keys-at-least-one-1:/copyrights: verify using type 'copyrights'
+INFO /keys-at-least-one-1:/copyrights[0]: verify using type 'copyright'
+INFO /keys-at-least-one-1:/enabled-by: verify using type 'enabled-by'
+INFO /keys-at-least-one-1:/links: verify using type 'links'
+INFO /keys-at-least-one-1:/type: verify using type 'name'
+INFO /keys-at-least-one-1: verify using type 'keys-at-least-one'
+INFO /keys-at-least-one-1:/key-a: verify using type 'none'
+INFO /keys-at-least-one-2: verify using type 'root'
+INFO /keys-at-least-one-2:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /keys-at-least-one-2:/copyrights: verify using type 'copyrights'
+INFO /keys-at-least-one-2:/copyrights[0]: verify using type 'copyright'
+INFO /keys-at-least-one-2:/enabled-by: verify using type 'enabled-by'
+INFO /keys-at-least-one-2:/links: verify using type 'links'
+INFO /keys-at-least-one-2:/type: verify using type 'name'
+INFO /keys-at-least-one-2: verify using type 'keys-at-least-one'
+INFO /keys-at-least-one-2:/key-a: verify using type 'none'
+INFO /keys-at-least-one-2:/key-b: verify using type 'none'
+INFO /keys-at-most-one-0: verify using type 'root'
+INFO /keys-at-most-one-0:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /keys-at-most-one-0:/copyrights: verify using type 'copyrights'
+INFO /keys-at-most-one-0:/copyrights[0]: verify using type 'copyright'
+INFO /keys-at-most-one-0:/enabled-by: verify using type 'enabled-by'
+INFO /keys-at-most-one-0:/links: verify using type 'links'
+INFO /keys-at-most-one-0:/type: verify using type 'name'
+INFO /keys-at-most-one-0: verify using type 'keys-at-most-one'
+INFO /keys-at-most-one-1: verify using type 'root'
+INFO /keys-at-most-one-1:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /keys-at-most-one-1:/copyrights: verify using type 'copyrights'
+INFO /keys-at-most-one-1:/copyrights[0]: verify using type 'copyright'
+INFO /keys-at-most-one-1:/enabled-by: verify using type 'enabled-by'
+INFO /keys-at-most-one-1:/links: verify using type 'links'
+INFO /keys-at-most-one-1:/type: verify using type 'name'
+INFO /keys-at-most-one-1: verify using type 'keys-at-most-one'
+INFO /keys-at-most-one-1:/key-a: verify using type 'none'
+INFO /keys-at-most-one-2: verify using type 'root'
+INFO /keys-at-most-one-2:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /keys-at-most-one-2:/copyrights: verify using type 'copyrights'
+INFO /keys-at-most-one-2:/copyrights[0]: verify using type 'copyright'
+INFO /keys-at-most-one-2:/enabled-by: verify using type 'enabled-by'
+INFO /keys-at-most-one-2:/links: verify using type 'links'
+INFO /keys-at-most-one-2:/type: verify using type 'name'
+INFO /keys-at-most-one-2: verify using type 'keys-at-most-one'
+ERROR /keys-at-most-one-2: not at most one key out of ['key-a', 'key-b'] is present for type 'keys-at-most-one': ['key-a', 'key-b']
+INFO /keys-at-most-one-2:/key-a: verify using type 'none'
+INFO /keys-at-most-one-2:/key-b: verify using type 'none'
+INFO /keys-exactly-one-0: verify using type 'root'
+INFO /keys-exactly-one-0:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /keys-exactly-one-0:/copyrights: verify using type 'copyrights'
+INFO /keys-exactly-one-0:/copyrights[0]: verify using type 'copyright'
+INFO /keys-exactly-one-0:/enabled-by: verify using type 'enabled-by'
+INFO /keys-exactly-one-0:/links: verify using type 'links'
+INFO /keys-exactly-one-0:/type: verify using type 'name'
+INFO /keys-exactly-one-0: verify using type 'keys-exactly-one'
+ERROR /keys-exactly-one-0: not exactly one key out of ['key-a', 'key-b'] is present for type 'keys-exactly-one': []
+INFO /keys-exactly-one-1: verify using type 'root'
+INFO /keys-exactly-one-1:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /keys-exactly-one-1:/copyrights: verify using type 'copyrights'
+INFO /keys-exactly-one-1:/copyrights[0]: verify using type 'copyright'
+INFO /keys-exactly-one-1:/enabled-by: verify using type 'enabled-by'
+INFO /keys-exactly-one-1:/links: verify using type 'links'
+INFO /keys-exactly-one-1:/type: verify using type 'name'
+INFO /keys-exactly-one-1: verify using type 'keys-exactly-one'
+INFO /keys-exactly-one-1:/key-a: verify using type 'none'
+INFO /keys-exactly-one-2: verify using type 'root'
+INFO /keys-exactly-one-2:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /keys-exactly-one-2:/copyrights: verify using type 'copyrights'
+INFO /keys-exactly-one-2:/copyrights[0]: verify using type 'copyright'
+INFO /keys-exactly-one-2:/enabled-by: verify using type 'enabled-by'
+INFO /keys-exactly-one-2:/links: verify using type 'links'
+INFO /keys-exactly-one-2:/type: verify using type 'name'
+INFO /keys-exactly-one-2: verify using type 'keys-exactly-one'
+ERROR /keys-exactly-one-2: not exactly one key out of ['key-a', 'key-b'] is present for type 'keys-exactly-one': ['key-a', 'key-b']
+INFO /keys-exactly-one-2:/key-a: verify using type 'none'
+INFO /keys-exactly-one-2:/key-b: verify using type 'none'
+INFO /notype: verify using type 'root'
+ERROR /notype: missing required keys for type 'root': ['type']
+INFO /notype:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /notype:/copyrights: verify using type 'copyrights'
+INFO /notype:/copyrights[0]: verify using type 'copyright'
+INFO /notype:/enabled-by: verify using type 'enabled-by'
+INFO /notype:/links: verify using type 'links'
+ERROR /notype: subtype key 'type' not present for type 'root'
+INFO /spec/copyright: verify using type 'root'
+INFO /spec/copyright:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/copyright:/copyrights: verify using type 'copyrights'
+INFO /spec/copyright:/copyrights[0]: verify using type 'copyright'
+INFO /spec/copyright:/enabled-by: verify using type 'enabled-by'
+INFO /spec/copyright:/links: verify using type 'links'
+INFO /spec/copyright:/links[0]: verify using type 'link'
+INFO /spec/copyright:/links[0]/role: verify using type 'name'
+INFO /spec/copyright:/links[0]/uid: verify using type 'uid'
+INFO /spec/copyright:/links[0]: verify using type 'spec-member'
+INFO /spec/copyright:/type: verify using type 'name'
+INFO /spec/copyright: verify using type 'spec'
+INFO /spec/copyright:/spec-description: verify using type 'optional-str'
+INFO /spec/copyright:/spec-example: verify using type 'optional-str'
+INFO /spec/copyright:/spec-info: verify using type 'spec-info'
+INFO /spec/copyright:/spec-info/str: verify using type 'spec-str'
+INFO /spec/copyright:/spec-info/str/assert: verify using type 'spec-assert-str'
+INFO /spec/copyright:/spec-info/str/assert[0]: verify using type 'spec-assert-str'
+INFO /spec/copyright:/spec-info/str/assert[0]/re: verify using type 'str'
+INFO /spec/copyright:/spec-info/str/assert[1]: verify using type 'spec-assert-str'
+INFO /spec/copyright:/spec-info/str/assert[1]/re: verify using type 'str'
+INFO /spec/copyright:/spec-info/str/assert[2]: verify using type 'spec-assert-str'
+INFO /spec/copyright:/spec-info/str/assert[2]/re: verify using type 'str'
+INFO /spec/copyright:/spec-info/str/description: verify using type 'optional-str'
+INFO /spec/copyright:/spec-name: verify using type 'optional-str'
+INFO /spec/copyright:/spec-type: verify using type 'name'
+INFO /spec/copyrights: verify using type 'root'
+INFO /spec/copyrights:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/copyrights:/copyrights: verify using type 'copyrights'
+INFO /spec/copyrights:/copyrights[0]: verify using type 'copyright'
+INFO /spec/copyrights:/enabled-by: verify using type 'enabled-by'
+INFO /spec/copyrights:/links: verify using type 'links'
+INFO /spec/copyrights:/links[0]: verify using type 'link'
+INFO /spec/copyrights:/links[0]/role: verify using type 'name'
+INFO /spec/copyrights:/links[0]/uid: verify using type 'uid'
+INFO /spec/copyrights:/links[0]: verify using type 'spec-member'
+INFO /spec/copyrights:/type: verify using type 'name'
+INFO /spec/copyrights: verify using type 'spec'
+INFO /spec/copyrights:/spec-description: verify using type 'optional-str'
+INFO /spec/copyrights:/spec-example: verify using type 'optional-str'
+INFO /spec/copyrights:/spec-info: verify using type 'spec-info'
+INFO /spec/copyrights:/spec-info/list: verify using type 'spec-list'
+INFO /spec/copyrights:/spec-info/list/description: verify using type 'optional-str'
+INFO /spec/copyrights:/spec-info/list/spec-type: verify using type 'name'
+INFO /spec/copyrights:/spec-name: verify using type 'optional-str'
+INFO /spec/copyrights:/spec-type: verify using type 'name'
+INFO /spec/enabled-by: verify using type 'root'
+INFO /spec/enabled-by:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/enabled-by:/copyrights: verify using type 'copyrights'
+INFO /spec/enabled-by:/copyrights[0]: verify using type 'copyright'
+INFO /spec/enabled-by:/enabled-by: verify using type 'enabled-by'
+INFO /spec/enabled-by:/links: verify using type 'links'
+INFO /spec/enabled-by:/links[0]: verify using type 'link'
+INFO /spec/enabled-by:/links[0]/role: verify using type 'name'
+INFO /spec/enabled-by:/links[0]/uid: verify using type 'uid'
+INFO /spec/enabled-by:/links[0]: verify using type 'spec-member'
+INFO /spec/enabled-by:/type: verify using type 'name'
+INFO /spec/enabled-by: verify using type 'spec'
+INFO /spec/enabled-by:/spec-description: verify using type 'optional-str'
+INFO /spec/enabled-by:/spec-example: verify using type 'optional-str'
+INFO /spec/enabled-by:/spec-info: verify using type 'spec-info'
+INFO /spec/enabled-by:/spec-info/bool: verify using type 'spec-bool'
+INFO /spec/enabled-by:/spec-info/bool/description: verify using type 'optional-str'
+INFO /spec/enabled-by:/spec-info/dict: verify using type 'spec-dict'
+INFO /spec/enabled-by:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec/enabled-by:/spec-info/dict/attributes/and: verify using type 'spec-attribute-value'
+INFO /spec/enabled-by:/spec-info/dict/attributes/and/description: verify using type 'optional-str'
+INFO /spec/enabled-by:/spec-info/dict/attributes/and/spec-type: verify using type 'name'
+INFO /spec/enabled-by:/spec-info/dict/attributes/not: verify using type 'spec-attribute-value'
+INFO /spec/enabled-by:/spec-info/dict/attributes/not/description: verify using type 'optional-str'
+INFO /spec/enabled-by:/spec-info/dict/attributes/not/spec-type: verify using type 'name'
+INFO /spec/enabled-by:/spec-info/dict/attributes/or: verify using type 'spec-attribute-value'
+INFO /spec/enabled-by:/spec-info/dict/attributes/or/description: verify using type 'optional-str'
+INFO /spec/enabled-by:/spec-info/dict/attributes/or/spec-type: verify using type 'name'
+INFO /spec/enabled-by:/spec-info/dict/description: verify using type 'optional-str'
+INFO /spec/enabled-by:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec/enabled-by:/spec-info/list: verify using type 'spec-list'
+INFO /spec/enabled-by:/spec-info/list/description: verify using type 'optional-str'
+INFO /spec/enabled-by:/spec-info/list/spec-type: verify using type 'name'
+INFO /spec/enabled-by:/spec-info/str: verify using type 'spec-str'
+INFO /spec/enabled-by:/spec-info/str/description: verify using type 'optional-str'
+INFO /spec/enabled-by:/spec-name: verify using type 'optional-str'
+INFO /spec/enabled-by:/spec-type: verify using type 'name'
+INFO /spec/enabled-by-list: verify using type 'root'
+INFO /spec/enabled-by-list:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/enabled-by-list:/copyrights: verify using type 'copyrights'
+INFO /spec/enabled-by-list:/copyrights[0]: verify using type 'copyright'
+INFO /spec/enabled-by-list:/enabled-by: verify using type 'enabled-by'
+INFO /spec/enabled-by-list:/links: verify using type 'links'
+INFO /spec/enabled-by-list:/links[0]: verify using type 'link'
+INFO /spec/enabled-by-list:/links[0]/role: verify using type 'name'
+INFO /spec/enabled-by-list:/links[0]/uid: verify using type 'uid'
+INFO /spec/enabled-by-list:/links[0]: verify using type 'spec-member'
+INFO /spec/enabled-by-list:/type: verify using type 'name'
+INFO /spec/enabled-by-list: verify using type 'spec'
+INFO /spec/enabled-by-list:/spec-description: verify using type 'optional-str'
+INFO /spec/enabled-by-list:/spec-example: verify using type 'optional-str'
+INFO /spec/enabled-by-list:/spec-info: verify using type 'spec-info'
+INFO /spec/enabled-by-list:/spec-info/list: verify using type 'spec-list'
+INFO /spec/enabled-by-list:/spec-info/list/description: verify using type 'optional-str'
+INFO /spec/enabled-by-list:/spec-info/list/spec-type: verify using type 'name'
+INFO /spec/enabled-by-list:/spec-name: verify using type 'optional-str'
+INFO /spec/enabled-by-list:/spec-type: verify using type 'name'
+INFO /spec/link: verify using type 'root'
+INFO /spec/link:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/link:/copyrights: verify using type 'copyrights'
+INFO /spec/link:/copyrights[0]: verify using type 'copyright'
+INFO /spec/link:/enabled-by: verify using type 'enabled-by'
+INFO /spec/link:/links: verify using type 'links'
+INFO /spec/link:/links[0]: verify using type 'link'
+INFO /spec/link:/links[0]/role: verify using type 'name'
+INFO /spec/link:/links[0]/uid: verify using type 'uid'
+INFO /spec/link:/links[0]: verify using type 'spec-member'
+INFO /spec/link:/type: verify using type 'name'
+INFO /spec/link: verify using type 'spec'
+INFO /spec/link:/spec-description: verify using type 'optional-str'
+INFO /spec/link:/spec-example: verify using type 'optional-str'
+INFO /spec/link:/spec-info: verify using type 'spec-info'
+INFO /spec/link:/spec-info/dict: verify using type 'spec-dict'
+INFO /spec/link:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec/link:/spec-info/dict/attributes/role: verify using type 'spec-attribute-value'
+INFO /spec/link:/spec-info/dict/attributes/role/description: verify using type 'optional-str'
+INFO /spec/link:/spec-info/dict/attributes/role/spec-type: verify using type 'name'
+INFO /spec/link:/spec-info/dict/attributes/uid: verify using type 'spec-attribute-value'
+INFO /spec/link:/spec-info/dict/attributes/uid/description: verify using type 'optional-str'
+INFO /spec/link:/spec-info/dict/attributes/uid/spec-type: verify using type 'name'
+INFO /spec/link:/spec-info/dict/description: verify using type 'optional-str'
+INFO /spec/link:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec/link:/spec-name: verify using type 'optional-str'
+INFO /spec/link:/spec-type: verify using type 'name'
+INFO /spec/links: verify using type 'root'
+INFO /spec/links:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/links:/copyrights: verify using type 'copyrights'
+INFO /spec/links:/copyrights[0]: verify using type 'copyright'
+INFO /spec/links:/enabled-by: verify using type 'enabled-by'
+INFO /spec/links:/links: verify using type 'links'
+INFO /spec/links:/links[0]: verify using type 'link'
+INFO /spec/links:/links[0]/role: verify using type 'name'
+INFO /spec/links:/links[0]/uid: verify using type 'uid'
+INFO /spec/links:/links[0]: verify using type 'spec-member'
+INFO /spec/links:/type: verify using type 'name'
+INFO /spec/links: verify using type 'spec'
+INFO /spec/links:/spec-description: verify using type 'optional-str'
+INFO /spec/links:/spec-example: verify using type 'optional-str'
+INFO /spec/links:/spec-info: verify using type 'spec-info'
+INFO /spec/links:/spec-info/list: verify using type 'spec-list'
+INFO /spec/links:/spec-info/list/description: verify using type 'optional-str'
+INFO /spec/links:/spec-info/list/spec-type: verify using type 'name'
+INFO /spec/links:/spec-name: verify using type 'optional-str'
+INFO /spec/links:/spec-type: verify using type 'name'
+INFO /spec/list-str: verify using type 'root'
+INFO /spec/list-str:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/list-str:/copyrights: verify using type 'copyrights'
+INFO /spec/list-str:/copyrights[0]: verify using type 'copyright'
+INFO /spec/list-str:/enabled-by: verify using type 'enabled-by'
+INFO /spec/list-str:/links: verify using type 'links'
+INFO /spec/list-str:/links[0]: verify using type 'link'
+INFO /spec/list-str:/links[0]/role: verify using type 'name'
+INFO /spec/list-str:/links[0]/uid: verify using type 'uid'
+INFO /spec/list-str:/links[0]: verify using type 'spec-member'
+INFO /spec/list-str:/type: verify using type 'name'
+INFO /spec/list-str: verify using type 'spec'
+INFO /spec/list-str:/spec-description: verify using type 'optional-str'
+INFO /spec/list-str:/spec-example: verify using type 'optional-str'
+INFO /spec/list-str:/spec-info: verify using type 'spec-info'
+INFO /spec/list-str:/spec-info/list: verify using type 'spec-list'
+INFO /spec/list-str:/spec-info/list/description: verify using type 'optional-str'
+INFO /spec/list-str:/spec-info/list/spec-type: verify using type 'name'
+INFO /spec/list-str:/spec-name: verify using type 'optional-str'
+INFO /spec/list-str:/spec-type: verify using type 'name'
+INFO /spec/optional-str: verify using type 'root'
+INFO /spec/optional-str:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/optional-str:/copyrights: verify using type 'copyrights'
+INFO /spec/optional-str:/copyrights[0]: verify using type 'copyright'
+INFO /spec/optional-str:/enabled-by: verify using type 'enabled-by'
+INFO /spec/optional-str:/links: verify using type 'links'
+INFO /spec/optional-str:/links[0]: verify using type 'link'
+INFO /spec/optional-str:/links[0]/role: verify using type 'name'
+INFO /spec/optional-str:/links[0]/uid: verify using type 'uid'
+INFO /spec/optional-str:/links[0]: verify using type 'spec-member'
+INFO /spec/optional-str:/type: verify using type 'name'
+INFO /spec/optional-str: verify using type 'spec'
+INFO /spec/optional-str:/spec-description: verify using type 'optional-str'
+INFO /spec/optional-str:/spec-example: verify using type 'optional-str'
+INFO /spec/optional-str:/spec-info: verify using type 'spec-info'
+INFO /spec/optional-str:/spec-info/none: verify using type 'none'
+INFO /spec/optional-str:/spec-info/str: verify using type 'spec-str'
+INFO /spec/optional-str:/spec-info/str/description: verify using type 'optional-str'
+INFO /spec/optional-str:/spec-name: verify using type 'optional-str'
+INFO /spec/optional-str:/spec-type: verify using type 'name'
+INFO /spec/root: verify using type 'root'
+INFO /spec/root:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/root:/copyrights: verify using type 'copyrights'
+INFO /spec/root:/copyrights[0]: verify using type 'copyright'
+INFO /spec/root:/enabled-by: verify using type 'enabled-by'
+INFO /spec/root:/links: verify using type 'links'
+INFO /spec/root:/type: verify using type 'name'
+INFO /spec/root: verify using type 'spec'
+INFO /spec/root:/spec-description: verify using type 'optional-str'
+INFO /spec/root:/spec-example: verify using type 'optional-str'
+INFO /spec/root:/spec-info: verify using type 'spec-info'
+INFO /spec/root:/spec-info/dict: verify using type 'spec-dict'
+INFO /spec/root:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec/root:/spec-info/dict/attributes/SPDX-License-Identifier: verify using type 'spec-attribute-value'
+INFO /spec/root:/spec-info/dict/attributes/SPDX-License-Identifier/description: verify using type 'optional-str'
+INFO /spec/root:/spec-info/dict/attributes/SPDX-License-Identifier/spec-type: verify using type 'name'
+INFO /spec/root:/spec-info/dict/attributes/copyrights: verify using type 'spec-attribute-value'
+INFO /spec/root:/spec-info/dict/attributes/copyrights/description: verify using type 'optional-str'
+INFO /spec/root:/spec-info/dict/attributes/copyrights/spec-type: verify using type 'name'
+INFO /spec/root:/spec-info/dict/attributes/enabled-by: verify using type 'spec-attribute-value'
+INFO /spec/root:/spec-info/dict/attributes/enabled-by/description: verify using type 'optional-str'
+INFO /spec/root:/spec-info/dict/attributes/enabled-by/spec-type: verify using type 'name'
+INFO /spec/root:/spec-info/dict/attributes/links: verify using type 'spec-attribute-value'
+INFO /spec/root:/spec-info/dict/attributes/links/description: verify using type 'optional-str'
+INFO /spec/root:/spec-info/dict/attributes/links/spec-type: verify using type 'name'
+INFO /spec/root:/spec-info/dict/attributes/type: verify using type 'spec-attribute-value'
+INFO /spec/root:/spec-info/dict/attributes/type/description: verify using type 'optional-str'
+INFO /spec/root:/spec-info/dict/attributes/type/spec-type: verify using type 'name'
+INFO /spec/root:/spec-info/dict/description: verify using type 'optional-str'
+INFO /spec/root:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec/root:/spec-name: verify using type 'optional-str'
+INFO /spec/root:/spec-type: verify using type 'name'
+INFO /spec/spdx-license-identifier: verify using type 'root'
+INFO /spec/spdx-license-identifier:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/spdx-license-identifier:/copyrights: verify using type 'copyrights'
+INFO /spec/spdx-license-identifier:/copyrights[0]: verify using type 'copyright'
+INFO /spec/spdx-license-identifier:/enabled-by: verify using type 'enabled-by'
+INFO /spec/spdx-license-identifier:/links: verify using type 'links'
+INFO /spec/spdx-license-identifier:/links[0]: verify using type 'link'
+INFO /spec/spdx-license-identifier:/links[0]/role: verify using type 'name'
+INFO /spec/spdx-license-identifier:/links[0]/uid: verify using type 'uid'
+INFO /spec/spdx-license-identifier:/links[0]: verify using type 'spec-member'
+INFO /spec/spdx-license-identifier:/type: verify using type 'name'
+INFO /spec/spdx-license-identifier: verify using type 'spec'
+INFO /spec/spdx-license-identifier:/spec-description: verify using type 'optional-str'
+INFO /spec/spdx-license-identifier:/spec-example: verify using type 'optional-str'
+INFO /spec/spdx-license-identifier:/spec-info: verify using type 'spec-info'
+INFO /spec/spdx-license-identifier:/spec-info/str: verify using type 'spec-str'
+INFO /spec/spdx-license-identifier:/spec-info/str/assert: verify using type 'spec-assert-str'
+INFO /spec/spdx-license-identifier:/spec-info/str/assert[0]: verify using type 'spec-assert-str'
+INFO /spec/spdx-license-identifier:/spec-info/str/assert[0]/eq: verify using type 'str'
+INFO /spec/spdx-license-identifier:/spec-info/str/assert[1]: verify using type 'spec-assert-str'
+INFO /spec/spdx-license-identifier:/spec-info/str/assert[1]/eq: verify using type 'str'
+INFO /spec/spdx-license-identifier:/spec-info/str/assert[2]: verify using type 'spec-assert-str'
+INFO /spec/spdx-license-identifier:/spec-info/str/assert[2]/eq: verify using type 'str'
+INFO /spec/spdx-license-identifier:/spec-info/str/description: verify using type 'optional-str'
+INFO /spec/spdx-license-identifier:/spec-name: verify using type 'optional-str'
+INFO /spec/spdx-license-identifier:/spec-type: verify using type 'name'
+INFO /spec/spec: verify using type 'root'
+INFO /spec/spec:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/spec:/copyrights: verify using type 'copyrights'
+INFO /spec/spec:/copyrights[0]: verify using type 'copyright'
+INFO /spec/spec:/enabled-by: verify using type 'enabled-by'
+INFO /spec/spec:/links: verify using type 'links'
+INFO /spec/spec:/links[0]: verify using type 'link'
+INFO /spec/spec:/links[0]/role: verify using type 'name'
+INFO /spec/spec:/links[0]/uid: verify using type 'uid'
+INFO /spec/spec:/links[0]: verify using type 'spec-member'
+INFO /spec/spec:/links[1]: verify using type 'link'
+INFO /spec/spec:/links[1]/role: verify using type 'name'
+INFO /spec/spec:/links[1]/uid: verify using type 'uid'
+INFO /spec/spec:/links[1]: verify using type 'spec-refinement'
+INFO /spec/spec:/links[1]/spec-key: verify using type 'name'
+INFO /spec/spec:/links[1]/spec-value: verify using type 'name'
+INFO /spec/spec:/type: verify using type 'name'
+INFO /spec/spec: verify using type 'spec'
+INFO /spec/spec:/spec-description: verify using type 'optional-str'
+INFO /spec/spec:/spec-example: verify using type 'optional-str'
+INFO /spec/spec:/spec-info: verify using type 'spec-info'
+INFO /spec/spec:/spec-info/dict: verify using type 'spec-dict'
+INFO /spec/spec:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec/spec:/spec-info/dict/attributes/spec-description: verify using type 'spec-attribute-value'
+INFO /spec/spec:/spec-info/dict/attributes/spec-description/description: verify using type 'optional-str'
+INFO /spec/spec:/spec-info/dict/attributes/spec-description/spec-type: verify using type 'name'
+INFO /spec/spec:/spec-info/dict/attributes/spec-example: verify using type 'spec-attribute-value'
+INFO /spec/spec:/spec-info/dict/attributes/spec-example/description: verify using type 'optional-str'
+INFO /spec/spec:/spec-info/dict/attributes/spec-example/spec-type: verify using type 'name'
+INFO /spec/spec:/spec-info/dict/attributes/spec-info: verify using type 'spec-attribute-value'
+INFO /spec/spec:/spec-info/dict/attributes/spec-info/description: verify using type 'optional-str'
+INFO /spec/spec:/spec-info/dict/attributes/spec-info/spec-type: verify using type 'name'
+INFO /spec/spec:/spec-info/dict/attributes/spec-name: verify using type 'spec-attribute-value'
+INFO /spec/spec:/spec-info/dict/attributes/spec-name/description: verify using type 'optional-str'
+INFO /spec/spec:/spec-info/dict/attributes/spec-name/spec-type: verify using type 'name'
+INFO /spec/spec:/spec-info/dict/attributes/spec-type: verify using type 'spec-attribute-value'
+INFO /spec/spec:/spec-info/dict/attributes/spec-type/description: verify using type 'optional-str'
+INFO /spec/spec:/spec-info/dict/attributes/spec-type/spec-type: verify using type 'name'
+INFO /spec/spec:/spec-info/dict/description: verify using type 'optional-str'
+INFO /spec/spec:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec/spec:/spec-name: verify using type 'optional-str'
+INFO /spec/spec:/spec-type: verify using type 'name'
+INFO /spec/spec-assert-float: verify using type 'root'
+INFO /spec/spec-assert-float:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/spec-assert-float:/copyrights: verify using type 'copyrights'
+INFO /spec/spec-assert-float:/copyrights[0]: verify using type 'copyright'
+INFO /spec/spec-assert-float:/enabled-by: verify using type 'enabled-by'
+INFO /spec/spec-assert-float:/links: verify using type 'links'
+INFO /spec/spec-assert-float:/links[0]: verify using type 'link'
+INFO /spec/spec-assert-float:/links[0]/role: verify using type 'name'
+INFO /spec/spec-assert-float:/links[0]/uid: verify using type 'uid'
+INFO /spec/spec-assert-float:/links[0]: verify using type 'spec-member'
+INFO /spec/spec-assert-float:/type: verify using type 'name'
+INFO /spec/spec-assert-float: verify using type 'spec'
+INFO /spec/spec-assert-float:/spec-description: verify using type 'optional-str'
+INFO /spec/spec-assert-float:/spec-example: verify using type 'optional-str'
+INFO /spec/spec-assert-float:/spec-info: verify using type 'spec-info'
+INFO /spec/spec-assert-float:/spec-info/dict: verify using type 'spec-dict'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/and: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/and/description: verify using type 'optional-str'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/and/spec-type: verify using type 'name'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/eq: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/eq/description: verify using type 'optional-str'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/eq/spec-type: verify using type 'name'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/ge: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/ge/description: verify using type 'optional-str'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/ge/spec-type: verify using type 'name'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/gt: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/gt/description: verify using type 'optional-str'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/gt/spec-type: verify using type 'name'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/le: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/le/description: verify using type 'optional-str'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/le/spec-type: verify using type 'name'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/lt: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/lt/description: verify using type 'optional-str'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/lt/spec-type: verify using type 'name'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/ne: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/ne/description: verify using type 'optional-str'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/ne/spec-type: verify using type 'name'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/not: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/not/description: verify using type 'optional-str'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/not/spec-type: verify using type 'name'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/or: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/or/description: verify using type 'optional-str'
+INFO /spec/spec-assert-float:/spec-info/dict/attributes/or/spec-type: verify using type 'name'
+INFO /spec/spec-assert-float:/spec-info/dict/description: verify using type 'optional-str'
+INFO /spec/spec-assert-float:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec/spec-assert-float:/spec-info/list: verify using type 'spec-list'
+INFO /spec/spec-assert-float:/spec-info/list/description: verify using type 'optional-str'
+INFO /spec/spec-assert-float:/spec-info/list/spec-type: verify using type 'name'
+INFO /spec/spec-assert-float:/spec-name: verify using type 'optional-str'
+INFO /spec/spec-assert-float:/spec-type: verify using type 'name'
+INFO /spec/spec-assert-float-list: verify using type 'root'
+INFO /spec/spec-assert-float-list:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/spec-assert-float-list:/copyrights: verify using type 'copyrights'
+INFO /spec/spec-assert-float-list:/copyrights[0]: verify using type 'copyright'
+INFO /spec/spec-assert-float-list:/enabled-by: verify using type 'enabled-by'
+INFO /spec/spec-assert-float-list:/links: verify using type 'links'
+INFO /spec/spec-assert-float-list:/links[0]: verify using type 'link'
+INFO /spec/spec-assert-float-list:/links[0]/role: verify using type 'name'
+INFO /spec/spec-assert-float-list:/links[0]/uid: verify using type 'uid'
+INFO /spec/spec-assert-float-list:/links[0]: verify using type 'spec-member'
+INFO /spec/spec-assert-float-list:/type: verify using type 'name'
+INFO /spec/spec-assert-float-list: verify using type 'spec'
+INFO /spec/spec-assert-float-list:/spec-description: verify using type 'optional-str'
+INFO /spec/spec-assert-float-list:/spec-example: verify using type 'optional-str'
+INFO /spec/spec-assert-float-list:/spec-info: verify using type 'spec-info'
+INFO /spec/spec-assert-float-list:/spec-info/list: verify using type 'spec-list'
+INFO /spec/spec-assert-float-list:/spec-info/list/description: verify using type 'optional-str'
+INFO /spec/spec-assert-float-list:/spec-info/list/spec-type: verify using type 'name'
+INFO /spec/spec-assert-float-list:/spec-name: verify using type 'optional-str'
+INFO /spec/spec-assert-float-list:/spec-type: verify using type 'name'
+INFO /spec/spec-assert-int: verify using type 'root'
+INFO /spec/spec-assert-int:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/spec-assert-int:/copyrights: verify using type 'copyrights'
+INFO /spec/spec-assert-int:/copyrights[0]: verify using type 'copyright'
+INFO /spec/spec-assert-int:/enabled-by: verify using type 'enabled-by'
+INFO /spec/spec-assert-int:/links: verify using type 'links'
+INFO /spec/spec-assert-int:/links[0]: verify using type 'link'
+INFO /spec/spec-assert-int:/links[0]/role: verify using type 'name'
+INFO /spec/spec-assert-int:/links[0]/uid: verify using type 'uid'
+INFO /spec/spec-assert-int:/links[0]: verify using type 'spec-member'
+INFO /spec/spec-assert-int:/type: verify using type 'name'
+INFO /spec/spec-assert-int: verify using type 'spec'
+INFO /spec/spec-assert-int:/spec-description: verify using type 'optional-str'
+INFO /spec/spec-assert-int:/spec-example: verify using type 'optional-str'
+INFO /spec/spec-assert-int:/spec-info: verify using type 'spec-info'
+INFO /spec/spec-assert-int:/spec-info/dict: verify using type 'spec-dict'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/and: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/and/description: verify using type 'optional-str'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/and/spec-type: verify using type 'name'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/eq: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/eq/description: verify using type 'optional-str'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/eq/spec-type: verify using type 'name'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/ge: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/ge/description: verify using type 'optional-str'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/ge/spec-type: verify using type 'name'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/gt: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/gt/description: verify using type 'optional-str'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/gt/spec-type: verify using type 'name'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/le: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/le/description: verify using type 'optional-str'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/le/spec-type: verify using type 'name'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/lt: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/lt/description: verify using type 'optional-str'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/lt/spec-type: verify using type 'name'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/ne: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/ne/description: verify using type 'optional-str'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/ne/spec-type: verify using type 'name'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/not: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/not/description: verify using type 'optional-str'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/not/spec-type: verify using type 'name'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/or: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/or/description: verify using type 'optional-str'
+INFO /spec/spec-assert-int:/spec-info/dict/attributes/or/spec-type: verify using type 'name'
+INFO /spec/spec-assert-int:/spec-info/dict/description: verify using type 'optional-str'
+INFO /spec/spec-assert-int:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec/spec-assert-int:/spec-info/list: verify using type 'spec-list'
+INFO /spec/spec-assert-int:/spec-info/list/description: verify using type 'optional-str'
+INFO /spec/spec-assert-int:/spec-info/list/spec-type: verify using type 'name'
+INFO /spec/spec-assert-int:/spec-name: verify using type 'optional-str'
+INFO /spec/spec-assert-int:/spec-type: verify using type 'name'
+INFO /spec/spec-assert-int-list: verify using type 'root'
+INFO /spec/spec-assert-int-list:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/spec-assert-int-list:/copyrights: verify using type 'copyrights'
+INFO /spec/spec-assert-int-list:/copyrights[0]: verify using type 'copyright'
+INFO /spec/spec-assert-int-list:/enabled-by: verify using type 'enabled-by'
+INFO /spec/spec-assert-int-list:/links: verify using type 'links'
+INFO /spec/spec-assert-int-list:/links[0]: verify using type 'link'
+INFO /spec/spec-assert-int-list:/links[0]/role: verify using type 'name'
+INFO /spec/spec-assert-int-list:/links[0]/uid: verify using type 'uid'
+INFO /spec/spec-assert-int-list:/links[0]: verify using type 'spec-member'
+INFO /spec/spec-assert-int-list:/type: verify using type 'name'
+INFO /spec/spec-assert-int-list: verify using type 'spec'
+INFO /spec/spec-assert-int-list:/spec-description: verify using type 'optional-str'
+INFO /spec/spec-assert-int-list:/spec-example: verify using type 'optional-str'
+INFO /spec/spec-assert-int-list:/spec-info: verify using type 'spec-info'
+INFO /spec/spec-assert-int-list:/spec-info/list: verify using type 'spec-list'
+INFO /spec/spec-assert-int-list:/spec-info/list/description: verify using type 'optional-str'
+INFO /spec/spec-assert-int-list:/spec-info/list/spec-type: verify using type 'name'
+INFO /spec/spec-assert-int-list:/spec-name: verify using type 'optional-str'
+INFO /spec/spec-assert-int-list:/spec-type: verify using type 'name'
+INFO /spec/spec-assert-str: verify using type 'root'
+INFO /spec/spec-assert-str:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/spec-assert-str:/copyrights: verify using type 'copyrights'
+INFO /spec/spec-assert-str:/copyrights[0]: verify using type 'copyright'
+INFO /spec/spec-assert-str:/enabled-by: verify using type 'enabled-by'
+INFO /spec/spec-assert-str:/links: verify using type 'links'
+INFO /spec/spec-assert-str:/links[0]: verify using type 'link'
+INFO /spec/spec-assert-str:/links[0]/role: verify using type 'name'
+INFO /spec/spec-assert-str:/links[0]/uid: verify using type 'uid'
+INFO /spec/spec-assert-str:/links[0]: verify using type 'spec-member'
+INFO /spec/spec-assert-str:/type: verify using type 'name'
+INFO /spec/spec-assert-str: verify using type 'spec'
+INFO /spec/spec-assert-str:/spec-description: verify using type 'optional-str'
+INFO /spec/spec-assert-str:/spec-example: verify using type 'optional-str'
+INFO /spec/spec-assert-str:/spec-info: verify using type 'spec-info'
+INFO /spec/spec-assert-str:/spec-info/dict: verify using type 'spec-dict'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/and: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/and/description: verify using type 'optional-str'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/and/spec-type: verify using type 'name'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/contains: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/contains/description: verify using type 'optional-str'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/contains/spec-type: verify using type 'name'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/eq: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/eq/description: verify using type 'optional-str'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/eq/spec-type: verify using type 'name'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/ge: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/ge/description: verify using type 'optional-str'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/ge/spec-type: verify using type 'name'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/gt: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/gt/description: verify using type 'optional-str'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/gt/spec-type: verify using type 'name'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/in: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/in/description: verify using type 'optional-str'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/in/spec-type: verify using type 'name'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/le: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/le/description: verify using type 'optional-str'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/le/spec-type: verify using type 'name'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/lt: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/lt/description: verify using type 'optional-str'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/lt/spec-type: verify using type 'name'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/ne: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/ne/description: verify using type 'optional-str'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/ne/spec-type: verify using type 'name'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/not: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/not/description: verify using type 'optional-str'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/not/spec-type: verify using type 'name'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/or: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/or/description: verify using type 'optional-str'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/or/spec-type: verify using type 'name'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/re: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/re/description: verify using type 'optional-str'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/re/spec-type: verify using type 'name'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/uid: verify using type 'spec-attribute-value'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/uid/description: verify using type 'optional-str'
+INFO /spec/spec-assert-str:/spec-info/dict/attributes/uid/spec-type: verify using type 'name'
+INFO /spec/spec-assert-str:/spec-info/dict/description: verify using type 'optional-str'
+INFO /spec/spec-assert-str:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec/spec-assert-str:/spec-info/list: verify using type 'spec-list'
+INFO /spec/spec-assert-str:/spec-info/list/description: verify using type 'optional-str'
+INFO /spec/spec-assert-str:/spec-info/list/spec-type: verify using type 'name'
+INFO /spec/spec-assert-str:/spec-name: verify using type 'optional-str'
+INFO /spec/spec-assert-str:/spec-type: verify using type 'name'
+INFO /spec/spec-assert-str-list: verify using type 'root'
+INFO /spec/spec-assert-str-list:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/spec-assert-str-list:/copyrights: verify using type 'copyrights'
+INFO /spec/spec-assert-str-list:/copyrights[0]: verify using type 'copyright'
+INFO /spec/spec-assert-str-list:/enabled-by: verify using type 'enabled-by'
+INFO /spec/spec-assert-str-list:/links: verify using type 'links'
+INFO /spec/spec-assert-str-list:/links[0]: verify using type 'link'
+INFO /spec/spec-assert-str-list:/links[0]/role: verify using type 'name'
+INFO /spec/spec-assert-str-list:/links[0]/uid: verify using type 'uid'
+INFO /spec/spec-assert-str-list:/links[0]: verify using type 'spec-member'
+INFO /spec/spec-assert-str-list:/type: verify using type 'name'
+INFO /spec/spec-assert-str-list: verify using type 'spec'
+INFO /spec/spec-assert-str-list:/spec-description: verify using type 'optional-str'
+INFO /spec/spec-assert-str-list:/spec-example: verify using type 'optional-str'
+INFO /spec/spec-assert-str-list:/spec-info: verify using type 'spec-info'
+INFO /spec/spec-assert-str-list:/spec-info/list: verify using type 'spec-list'
+INFO /spec/spec-assert-str-list:/spec-info/list/description: verify using type 'optional-str'
+INFO /spec/spec-assert-str-list:/spec-info/list/spec-type: verify using type 'name'
+INFO /spec/spec-assert-str-list:/spec-name: verify using type 'optional-str'
+INFO /spec/spec-assert-str-list:/spec-type: verify using type 'name'
+INFO /spec/spec-attribute-value: verify using type 'root'
+INFO /spec/spec-attribute-value:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/spec-attribute-value:/copyrights: verify using type 'copyrights'
+INFO /spec/spec-attribute-value:/copyrights[0]: verify using type 'copyright'
+INFO /spec/spec-attribute-value:/enabled-by: verify using type 'enabled-by'
+INFO /spec/spec-attribute-value:/links: verify using type 'links'
+INFO /spec/spec-attribute-value:/links[0]: verify using type 'link'
+INFO /spec/spec-attribute-value:/links[0]/role: verify using type 'name'
+INFO /spec/spec-attribute-value:/links[0]/uid: verify using type 'uid'
+INFO /spec/spec-attribute-value:/links[0]: verify using type 'spec-member'
+INFO /spec/spec-attribute-value:/type: verify using type 'name'
+INFO /spec/spec-attribute-value: verify using type 'spec'
+INFO /spec/spec-attribute-value:/spec-description: verify using type 'optional-str'
+INFO /spec/spec-attribute-value:/spec-example: verify using type 'optional-str'
+INFO /spec/spec-attribute-value:/spec-info: verify using type 'spec-info'
+INFO /spec/spec-attribute-value:/spec-info/dict: verify using type 'spec-dict'
+INFO /spec/spec-attribute-value:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec/spec-attribute-value:/spec-info/dict/attributes/description: verify using type 'spec-attribute-value'
+INFO /spec/spec-attribute-value:/spec-info/dict/attributes/description/description: verify using type 'optional-str'
+INFO /spec/spec-attribute-value:/spec-info/dict/attributes/description/spec-type: verify using type 'name'
+INFO /spec/spec-attribute-value:/spec-info/dict/attributes/spec-type: verify using type 'spec-attribute-value'
+INFO /spec/spec-attribute-value:/spec-info/dict/attributes/spec-type/description: verify using type 'optional-str'
+INFO /spec/spec-attribute-value:/spec-info/dict/attributes/spec-type/spec-type: verify using type 'name'
+INFO /spec/spec-attribute-value:/spec-info/dict/description: verify using type 'optional-str'
+INFO /spec/spec-attribute-value:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec/spec-attribute-value:/spec-name: verify using type 'optional-str'
+INFO /spec/spec-attribute-value:/spec-type: verify using type 'name'
+INFO /spec/spec-attributes: verify using type 'root'
+INFO /spec/spec-attributes:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/spec-attributes:/copyrights: verify using type 'copyrights'
+INFO /spec/spec-attributes:/copyrights[0]: verify using type 'copyright'
+INFO /spec/spec-attributes:/enabled-by: verify using type 'enabled-by'
+INFO /spec/spec-attributes:/links: verify using type 'links'
+INFO /spec/spec-attributes:/links[0]: verify using type 'link'
+INFO /spec/spec-attributes:/links[0]/role: verify using type 'name'
+INFO /spec/spec-attributes:/links[0]/uid: verify using type 'uid'
+INFO /spec/spec-attributes:/links[0]: verify using type 'spec-member'
+INFO /spec/spec-attributes:/type: verify using type 'name'
+INFO /spec/spec-attributes: verify using type 'spec'
+INFO /spec/spec-attributes:/spec-description: verify using type 'optional-str'
+INFO /spec/spec-attributes:/spec-example: verify using type 'optional-str'
+INFO /spec/spec-attributes:/spec-info: verify using type 'spec-info'
+INFO /spec/spec-attributes:/spec-info/dict: verify using type 'spec-dict'
+INFO /spec/spec-attributes:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec/spec-attributes:/spec-info/dict/description: verify using type 'optional-str'
+INFO /spec/spec-attributes:/spec-info/dict/generic-attributes: verify using type 'spec-generic-attributes'
+INFO /spec/spec-attributes:/spec-info/dict/generic-attributes/description: verify using type 'optional-str'
+INFO /spec/spec-attributes:/spec-info/dict/generic-attributes/spec-type: verify using type 'name'
+INFO /spec/spec-attributes:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec/spec-attributes:/spec-name: verify using type 'optional-str'
+INFO /spec/spec-attributes:/spec-type: verify using type 'name'
+INFO /spec/spec-bool: verify using type 'root'
+INFO /spec/spec-bool:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/spec-bool:/copyrights: verify using type 'copyrights'
+INFO /spec/spec-bool:/copyrights[0]: verify using type 'copyright'
+INFO /spec/spec-bool:/enabled-by: verify using type 'enabled-by'
+INFO /spec/spec-bool:/links: verify using type 'links'
+INFO /spec/spec-bool:/links[0]: verify using type 'link'
+INFO /spec/spec-bool:/links[0]/role: verify using type 'name'
+INFO /spec/spec-bool:/links[0]/uid: verify using type 'uid'
+INFO /spec/spec-bool:/links[0]: verify using type 'spec-member'
+INFO /spec/spec-bool:/type: verify using type 'name'
+INFO /spec/spec-bool: verify using type 'spec'
+INFO /spec/spec-bool:/spec-description: verify using type 'optional-str'
+INFO /spec/spec-bool:/spec-example: verify using type 'optional-str'
+INFO /spec/spec-bool:/spec-info: verify using type 'spec-info'
+INFO /spec/spec-bool:/spec-info/dict: verify using type 'spec-dict'
+INFO /spec/spec-bool:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec/spec-bool:/spec-info/dict/attributes/assert: verify using type 'spec-attribute-value'
+INFO /spec/spec-bool:/spec-info/dict/attributes/assert/description: verify using type 'optional-str'
+INFO /spec/spec-bool:/spec-info/dict/attributes/assert/spec-type: verify using type 'name'
+INFO /spec/spec-bool:/spec-info/dict/attributes/description: verify using type 'spec-attribute-value'
+INFO /spec/spec-bool:/spec-info/dict/attributes/description/description: verify using type 'optional-str'
+INFO /spec/spec-bool:/spec-info/dict/attributes/description/spec-type: verify using type 'name'
+INFO /spec/spec-bool:/spec-info/dict/description: verify using type 'optional-str'
+INFO /spec/spec-bool:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec/spec-bool:/spec-info/dict/required-attributes[0]: verify using type 'name'
+INFO /spec/spec-bool:/spec-name: verify using type 'optional-str'
+INFO /spec/spec-bool:/spec-type: verify using type 'name'
+INFO /spec/spec-dict: verify using type 'root'
+INFO /spec/spec-dict:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/spec-dict:/copyrights: verify using type 'copyrights'
+INFO /spec/spec-dict:/copyrights[0]: verify using type 'copyright'
+INFO /spec/spec-dict:/enabled-by: verify using type 'enabled-by'
+INFO /spec/spec-dict:/links: verify using type 'links'
+INFO /spec/spec-dict:/links[0]: verify using type 'link'
+INFO /spec/spec-dict:/links[0]/role: verify using type 'name'
+INFO /spec/spec-dict:/links[0]/uid: verify using type 'uid'
+INFO /spec/spec-dict:/links[0]: verify using type 'spec-member'
+INFO /spec/spec-dict:/type: verify using type 'name'
+INFO /spec/spec-dict: verify using type 'spec'
+INFO /spec/spec-dict:/spec-description: verify using type 'optional-str'
+INFO /spec/spec-dict:/spec-example: verify using type 'optional-str'
+INFO /spec/spec-dict:/spec-info: verify using type 'spec-info'
+INFO /spec/spec-dict:/spec-info/dict: verify using type 'spec-dict'
+INFO /spec/spec-dict:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec/spec-dict:/spec-info/dict/attributes/attributes: verify using type 'spec-attribute-value'
+INFO /spec/spec-dict:/spec-info/dict/attributes/attributes/description: verify using type 'optional-str'
+INFO /spec/spec-dict:/spec-info/dict/attributes/attributes/spec-type: verify using type 'name'
+INFO /spec/spec-dict:/spec-info/dict/attributes/description: verify using type 'spec-attribute-value'
+INFO /spec/spec-dict:/spec-info/dict/attributes/description/description: verify using type 'optional-str'
+INFO /spec/spec-dict:/spec-info/dict/attributes/description/spec-type: verify using type 'name'
+INFO /spec/spec-dict:/spec-info/dict/attributes/generic-attributes: verify using type 'spec-attribute-value'
+INFO /spec/spec-dict:/spec-info/dict/attributes/generic-attributes/description: verify using type 'optional-str'
+INFO /spec/spec-dict:/spec-info/dict/attributes/generic-attributes/spec-type: verify using type 'name'
+INFO /spec/spec-dict:/spec-info/dict/attributes/required-attributes: verify using type 'spec-attribute-value'
+INFO /spec/spec-dict:/spec-info/dict/attributes/required-attributes/description: verify using type 'optional-str'
+INFO /spec/spec-dict:/spec-info/dict/attributes/required-attributes/spec-type: verify using type 'name'
+INFO /spec/spec-dict:/spec-info/dict/description: verify using type 'optional-str'
+INFO /spec/spec-dict:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec/spec-dict:/spec-info/dict/required-attributes[0]: verify using type 'name'
+INFO /spec/spec-dict:/spec-info/dict/required-attributes[1]: verify using type 'name'
+INFO /spec/spec-dict:/spec-info/dict/required-attributes[2]: verify using type 'name'
+INFO /spec/spec-dict:/spec-name: verify using type 'optional-str'
+INFO /spec/spec-dict:/spec-type: verify using type 'name'
+INFO /spec/spec-float: verify using type 'root'
+INFO /spec/spec-float:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/spec-float:/copyrights: verify using type 'copyrights'
+INFO /spec/spec-float:/copyrights[0]: verify using type 'copyright'
+INFO /spec/spec-float:/enabled-by: verify using type 'enabled-by'
+INFO /spec/spec-float:/links: verify using type 'links'
+INFO /spec/spec-float:/links[0]: verify using type 'link'
+INFO /spec/spec-float:/links[0]/role: verify using type 'name'
+INFO /spec/spec-float:/links[0]/uid: verify using type 'uid'
+INFO /spec/spec-float:/links[0]: verify using type 'spec-member'
+INFO /spec/spec-float:/type: verify using type 'name'
+INFO /spec/spec-float: verify using type 'spec'
+INFO /spec/spec-float:/spec-description: verify using type 'optional-str'
+INFO /spec/spec-float:/spec-example: verify using type 'optional-str'
+INFO /spec/spec-float:/spec-info: verify using type 'spec-info'
+INFO /spec/spec-float:/spec-info/dict: verify using type 'spec-dict'
+INFO /spec/spec-float:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec/spec-float:/spec-info/dict/attributes/assert: verify using type 'spec-attribute-value'
+INFO /spec/spec-float:/spec-info/dict/attributes/assert/description: verify using type 'optional-str'
+INFO /spec/spec-float:/spec-info/dict/attributes/assert/spec-type: verify using type 'name'
+INFO /spec/spec-float:/spec-info/dict/attributes/description: verify using type 'spec-attribute-value'
+INFO /spec/spec-float:/spec-info/dict/attributes/description/description: verify using type 'optional-str'
+INFO /spec/spec-float:/spec-info/dict/attributes/description/spec-type: verify using type 'name'
+INFO /spec/spec-float:/spec-info/dict/description: verify using type 'optional-str'
+INFO /spec/spec-float:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec/spec-float:/spec-info/dict/required-attributes[0]: verify using type 'name'
+INFO /spec/spec-float:/spec-name: verify using type 'optional-str'
+INFO /spec/spec-float:/spec-type: verify using type 'name'
+INFO /spec/spec-generic-attributes: verify using type 'root'
+INFO /spec/spec-generic-attributes:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/spec-generic-attributes:/copyrights: verify using type 'copyrights'
+INFO /spec/spec-generic-attributes:/copyrights[0]: verify using type 'copyright'
+INFO /spec/spec-generic-attributes:/enabled-by: verify using type 'enabled-by'
+INFO /spec/spec-generic-attributes:/links: verify using type 'links'
+INFO /spec/spec-generic-attributes:/links[0]: verify using type 'link'
+INFO /spec/spec-generic-attributes:/links[0]/role: verify using type 'name'
+INFO /spec/spec-generic-attributes:/links[0]/uid: verify using type 'uid'
+INFO /spec/spec-generic-attributes:/links[0]: verify using type 'spec-member'
+INFO /spec/spec-generic-attributes:/type: verify using type 'name'
+INFO /spec/spec-generic-attributes: verify using type 'spec'
+INFO /spec/spec-generic-attributes:/spec-description: verify using type 'optional-str'
+INFO /spec/spec-generic-attributes:/spec-example: verify using type 'optional-str'
+INFO /spec/spec-generic-attributes:/spec-info: verify using type 'spec-info'
+INFO /spec/spec-generic-attributes:/spec-info/dict: verify using type 'spec-dict'
+INFO /spec/spec-generic-attributes:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec/spec-generic-attributes:/spec-info/dict/attributes/description: verify using type 'spec-attribute-value'
+INFO /spec/spec-generic-attributes:/spec-info/dict/attributes/description/description: verify using type 'optional-str'
+INFO /spec/spec-generic-attributes:/spec-info/dict/attributes/description/spec-type: verify using type 'name'
+INFO /spec/spec-generic-attributes:/spec-info/dict/attributes/spec-type: verify using type 'spec-attribute-value'
+INFO /spec/spec-generic-attributes:/spec-info/dict/attributes/spec-type/description: verify using type 'optional-str'
+INFO /spec/spec-generic-attributes:/spec-info/dict/attributes/spec-type/spec-type: verify using type 'name'
+INFO /spec/spec-generic-attributes:/spec-info/dict/description: verify using type 'optional-str'
+INFO /spec/spec-generic-attributes:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec/spec-generic-attributes:/spec-name: verify using type 'optional-str'
+INFO /spec/spec-generic-attributes:/spec-type: verify using type 'name'
+INFO /spec/spec-info: verify using type 'root'
+INFO /spec/spec-info:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/spec-info:/copyrights: verify using type 'copyrights'
+INFO /spec/spec-info:/copyrights[0]: verify using type 'copyright'
+INFO /spec/spec-info:/enabled-by: verify using type 'enabled-by'
+INFO /spec/spec-info:/links: verify using type 'links'
+INFO /spec/spec-info:/links[0]: verify using type 'link'
+INFO /spec/spec-info:/links[0]/role: verify using type 'name'
+INFO /spec/spec-info:/links[0]/uid: verify using type 'uid'
+INFO /spec/spec-info:/links[0]: verify using type 'spec-member'
+INFO /spec/spec-info:/type: verify using type 'name'
+INFO /spec/spec-info: verify using type 'spec'
+INFO /spec/spec-info:/spec-description: verify using type 'optional-str'
+INFO /spec/spec-info:/spec-example: verify using type 'optional-str'
+INFO /spec/spec-info:/spec-info: verify using type 'spec-info'
+INFO /spec/spec-info:/spec-info/dict: verify using type 'spec-dict'
+INFO /spec/spec-info:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec/spec-info:/spec-info/dict/attributes/bool: verify using type 'spec-attribute-value'
+INFO /spec/spec-info:/spec-info/dict/attributes/bool/description: verify using type 'optional-str'
+INFO /spec/spec-info:/spec-info/dict/attributes/bool/spec-type: verify using type 'name'
+INFO /spec/spec-info:/spec-info/dict/attributes/dict: verify using type 'spec-attribute-value'
+INFO /spec/spec-info:/spec-info/dict/attributes/dict/description: verify using type 'optional-str'
+INFO /spec/spec-info:/spec-info/dict/attributes/dict/spec-type: verify using type 'name'
+INFO /spec/spec-info:/spec-info/dict/attributes/float: verify using type 'spec-attribute-value'
+INFO /spec/spec-info:/spec-info/dict/attributes/float/description: verify using type 'optional-str'
+INFO /spec/spec-info:/spec-info/dict/attributes/float/spec-type: verify using type 'name'
+INFO /spec/spec-info:/spec-info/dict/attributes/int: verify using type 'spec-attribute-value'
+INFO /spec/spec-info:/spec-info/dict/attributes/int/description: verify using type 'optional-str'
+INFO /spec/spec-info:/spec-info/dict/attributes/int/spec-type: verify using type 'name'
+INFO /spec/spec-info:/spec-info/dict/attributes/list: verify using type 'spec-attribute-value'
+INFO /spec/spec-info:/spec-info/dict/attributes/list/description: verify using type 'optional-str'
+INFO /spec/spec-info:/spec-info/dict/attributes/list/spec-type: verify using type 'name'
+INFO /spec/spec-info:/spec-info/dict/attributes/none: verify using type 'spec-attribute-value'
+INFO /spec/spec-info:/spec-info/dict/attributes/none/description: verify using type 'optional-str'
+INFO /spec/spec-info:/spec-info/dict/attributes/none/spec-type: verify using type 'name'
+INFO /spec/spec-info:/spec-info/dict/attributes/str: verify using type 'spec-attribute-value'
+INFO /spec/spec-info:/spec-info/dict/attributes/str/description: verify using type 'optional-str'
+INFO /spec/spec-info:/spec-info/dict/attributes/str/spec-type: verify using type 'name'
+INFO /spec/spec-info:/spec-info/dict/description: verify using type 'optional-str'
+INFO /spec/spec-info:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec/spec-info:/spec-name: verify using type 'optional-str'
+INFO /spec/spec-info:/spec-type: verify using type 'name'
+INFO /spec/spec-int: verify using type 'root'
+INFO /spec/spec-int:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/spec-int:/copyrights: verify using type 'copyrights'
+INFO /spec/spec-int:/copyrights[0]: verify using type 'copyright'
+INFO /spec/spec-int:/enabled-by: verify using type 'enabled-by'
+INFO /spec/spec-int:/links: verify using type 'links'
+INFO /spec/spec-int:/links[0]: verify using type 'link'
+INFO /spec/spec-int:/links[0]/role: verify using type 'name'
+INFO /spec/spec-int:/links[0]/uid: verify using type 'uid'
+INFO /spec/spec-int:/links[0]: verify using type 'spec-member'
+INFO /spec/spec-int:/type: verify using type 'name'
+INFO /spec/spec-int: verify using type 'spec'
+INFO /spec/spec-int:/spec-description: verify using type 'optional-str'
+INFO /spec/spec-int:/spec-example: verify using type 'optional-str'
+INFO /spec/spec-int:/spec-info: verify using type 'spec-info'
+INFO /spec/spec-int:/spec-info/dict: verify using type 'spec-dict'
+INFO /spec/spec-int:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec/spec-int:/spec-info/dict/attributes/assert: verify using type 'spec-attribute-value'
+INFO /spec/spec-int:/spec-info/dict/attributes/assert/description: verify using type 'optional-str'
+INFO /spec/spec-int:/spec-info/dict/attributes/assert/spec-type: verify using type 'name'
+INFO /spec/spec-int:/spec-info/dict/attributes/description: verify using type 'spec-attribute-value'
+INFO /spec/spec-int:/spec-info/dict/attributes/description/description: verify using type 'optional-str'
+INFO /spec/spec-int:/spec-info/dict/attributes/description/spec-type: verify using type 'name'
+INFO /spec/spec-int:/spec-info/dict/description: verify using type 'optional-str'
+INFO /spec/spec-int:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec/spec-int:/spec-info/dict/required-attributes[0]: verify using type 'name'
+INFO /spec/spec-int:/spec-name: verify using type 'optional-str'
+INFO /spec/spec-int:/spec-type: verify using type 'name'
+INFO /spec/spec-list: verify using type 'root'
+INFO /spec/spec-list:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/spec-list:/copyrights: verify using type 'copyrights'
+INFO /spec/spec-list:/copyrights[0]: verify using type 'copyright'
+INFO /spec/spec-list:/enabled-by: verify using type 'enabled-by'
+INFO /spec/spec-list:/links: verify using type 'links'
+INFO /spec/spec-list:/links[0]: verify using type 'link'
+INFO /spec/spec-list:/links[0]/role: verify using type 'name'
+INFO /spec/spec-list:/links[0]/uid: verify using type 'uid'
+INFO /spec/spec-list:/links[0]: verify using type 'spec-member'
+INFO /spec/spec-list:/type: verify using type 'name'
+INFO /spec/spec-list: verify using type 'spec'
+INFO /spec/spec-list:/spec-description: verify using type 'optional-str'
+INFO /spec/spec-list:/spec-example: verify using type 'optional-str'
+INFO /spec/spec-list:/spec-info: verify using type 'spec-info'
+INFO /spec/spec-list:/spec-info/dict: verify using type 'spec-dict'
+INFO /spec/spec-list:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec/spec-list:/spec-info/dict/attributes/description: verify using type 'spec-attribute-value'
+INFO /spec/spec-list:/spec-info/dict/attributes/description/description: verify using type 'optional-str'
+INFO /spec/spec-list:/spec-info/dict/attributes/description/spec-type: verify using type 'name'
+INFO /spec/spec-list:/spec-info/dict/attributes/spec-type: verify using type 'spec-attribute-value'
+INFO /spec/spec-list:/spec-info/dict/attributes/spec-type/description: verify using type 'optional-str'
+INFO /spec/spec-list:/spec-info/dict/attributes/spec-type/spec-type: verify using type 'name'
+INFO /spec/spec-list:/spec-info/dict/description: verify using type 'optional-str'
+INFO /spec/spec-list:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec/spec-list:/spec-name: verify using type 'optional-str'
+INFO /spec/spec-list:/spec-type: verify using type 'name'
+INFO /spec/spec-member: verify using type 'root'
+INFO /spec/spec-member:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/spec-member:/copyrights: verify using type 'copyrights'
+INFO /spec/spec-member:/copyrights[0]: verify using type 'copyright'
+INFO /spec/spec-member:/enabled-by: verify using type 'enabled-by'
+INFO /spec/spec-member:/links: verify using type 'links'
+INFO /spec/spec-member:/links[0]: verify using type 'link'
+INFO /spec/spec-member:/links[0]/role: verify using type 'name'
+INFO /spec/spec-member:/links[0]/uid: verify using type 'uid'
+INFO /spec/spec-member:/links[0]: verify using type 'spec-member'
+INFO /spec/spec-member:/links[1]: verify using type 'link'
+INFO /spec/spec-member:/links[1]/role: verify using type 'name'
+INFO /spec/spec-member:/links[1]/uid: verify using type 'uid'
+INFO /spec/spec-member:/links[1]: verify using type 'spec-refinement'
+INFO /spec/spec-member:/links[1]/spec-key: verify using type 'name'
+INFO /spec/spec-member:/links[1]/spec-value: verify using type 'name'
+INFO /spec/spec-member:/type: verify using type 'name'
+INFO /spec/spec-member: verify using type 'spec'
+INFO /spec/spec-member:/spec-description: verify using type 'optional-str'
+INFO /spec/spec-member:/spec-example: verify using type 'optional-str'
+INFO /spec/spec-member:/spec-info: verify using type 'spec-info'
+INFO /spec/spec-member:/spec-info/dict: verify using type 'spec-dict'
+INFO /spec/spec-member:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec/spec-member:/spec-info/dict/description: verify using type 'optional-str'
+INFO /spec/spec-member:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec/spec-member:/spec-name: verify using type 'optional-str'
+INFO /spec/spec-member:/spec-type: verify using type 'name'
+INFO /spec/spec-refinement: verify using type 'root'
+INFO /spec/spec-refinement:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/spec-refinement:/copyrights: verify using type 'copyrights'
+INFO /spec/spec-refinement:/copyrights[0]: verify using type 'copyright'
+INFO /spec/spec-refinement:/enabled-by: verify using type 'enabled-by'
+INFO /spec/spec-refinement:/links: verify using type 'links'
+INFO /spec/spec-refinement:/links[0]: verify using type 'link'
+INFO /spec/spec-refinement:/links[0]/role: verify using type 'name'
+INFO /spec/spec-refinement:/links[0]/uid: verify using type 'uid'
+INFO /spec/spec-refinement:/links[0]: verify using type 'spec-member'
+INFO /spec/spec-refinement:/links[1]: verify using type 'link'
+INFO /spec/spec-refinement:/links[1]/role: verify using type 'name'
+INFO /spec/spec-refinement:/links[1]/uid: verify using type 'uid'
+INFO /spec/spec-refinement:/links[1]: verify using type 'spec-refinement'
+INFO /spec/spec-refinement:/links[1]/spec-key: verify using type 'name'
+INFO /spec/spec-refinement:/links[1]/spec-value: verify using type 'name'
+INFO /spec/spec-refinement:/type: verify using type 'name'
+INFO /spec/spec-refinement: verify using type 'spec'
+INFO /spec/spec-refinement:/spec-description: verify using type 'optional-str'
+INFO /spec/spec-refinement:/spec-example: verify using type 'optional-str'
+INFO /spec/spec-refinement:/spec-info: verify using type 'spec-info'
+INFO /spec/spec-refinement:/spec-info/dict: verify using type 'spec-dict'
+INFO /spec/spec-refinement:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec/spec-refinement:/spec-info/dict/attributes/spec-key: verify using type 'spec-attribute-value'
+INFO /spec/spec-refinement:/spec-info/dict/attributes/spec-key/description: verify using type 'optional-str'
+INFO /spec/spec-refinement:/spec-info/dict/attributes/spec-key/spec-type: verify using type 'name'
+INFO /spec/spec-refinement:/spec-info/dict/attributes/spec-value: verify using type 'spec-attribute-value'
+INFO /spec/spec-refinement:/spec-info/dict/attributes/spec-value/description: verify using type 'optional-str'
+INFO /spec/spec-refinement:/spec-info/dict/attributes/spec-value/spec-type: verify using type 'name'
+INFO /spec/spec-refinement:/spec-info/dict/description: verify using type 'optional-str'
+INFO /spec/spec-refinement:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec/spec-refinement:/spec-name: verify using type 'optional-str'
+INFO /spec/spec-refinement:/spec-type: verify using type 'name'
+INFO /spec/spec-required-attributes: verify using type 'root'
+INFO /spec/spec-required-attributes:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/spec-required-attributes:/copyrights: verify using type 'copyrights'
+INFO /spec/spec-required-attributes:/copyrights[0]: verify using type 'copyright'
+INFO /spec/spec-required-attributes:/enabled-by: verify using type 'enabled-by'
+INFO /spec/spec-required-attributes:/links: verify using type 'links'
+INFO /spec/spec-required-attributes:/links[0]: verify using type 'link'
+INFO /spec/spec-required-attributes:/links[0]/role: verify using type 'name'
+INFO /spec/spec-required-attributes:/links[0]/uid: verify using type 'uid'
+INFO /spec/spec-required-attributes:/links[0]: verify using type 'spec-member'
+INFO /spec/spec-required-attributes:/type: verify using type 'name'
+INFO /spec/spec-required-attributes: verify using type 'spec'
+INFO /spec/spec-required-attributes:/spec-description: verify using type 'optional-str'
+INFO /spec/spec-required-attributes:/spec-example: verify using type 'optional-str'
+INFO /spec/spec-required-attributes:/spec-info: verify using type 'spec-info'
+INFO /spec/spec-required-attributes:/spec-info/list: verify using type 'spec-list'
+INFO /spec/spec-required-attributes:/spec-info/list/description: verify using type 'optional-str'
+INFO /spec/spec-required-attributes:/spec-info/list/spec-type: verify using type 'name'
+INFO /spec/spec-required-attributes:/spec-info/str: verify using type 'spec-str'
+INFO /spec/spec-required-attributes:/spec-info/str/assert: verify using type 'spec-assert-str'
+INFO /spec/spec-required-attributes:/spec-info/str/assert/in: verify using type 'list-str'
+INFO /spec/spec-required-attributes:/spec-info/str/assert/in[0]: verify using type 'str'
+INFO /spec/spec-required-attributes:/spec-info/str/assert/in[1]: verify using type 'str'
+INFO /spec/spec-required-attributes:/spec-info/str/assert/in[2]: verify using type 'str'
+INFO /spec/spec-required-attributes:/spec-info/str/assert/in[3]: verify using type 'str'
+INFO /spec/spec-required-attributes:/spec-info/str/assert/in[4]: verify using type 'str'
+INFO /spec/spec-required-attributes:/spec-info/str/description: verify using type 'optional-str'
+INFO /spec/spec-required-attributes:/spec-name: verify using type 'optional-str'
+INFO /spec/spec-required-attributes:/spec-type: verify using type 'name'
+INFO /spec/spec-str: verify using type 'root'
+INFO /spec/spec-str:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec/spec-str:/copyrights: verify using type 'copyrights'
+INFO /spec/spec-str:/copyrights[0]: verify using type 'copyright'
+INFO /spec/spec-str:/enabled-by: verify using type 'enabled-by'
+INFO /spec/spec-str:/links: verify using type 'links'
+INFO /spec/spec-str:/links[0]: verify using type 'link'
+INFO /spec/spec-str:/links[0]/role: verify using type 'name'
+INFO /spec/spec-str:/links[0]/uid: verify using type 'uid'
+INFO /spec/spec-str:/links[0]: verify using type 'spec-member'
+INFO /spec/spec-str:/type: verify using type 'name'
+INFO /spec/spec-str: verify using type 'spec'
+INFO /spec/spec-str:/spec-description: verify using type 'optional-str'
+INFO /spec/spec-str:/spec-example: verify using type 'optional-str'
+INFO /spec/spec-str:/spec-info: verify using type 'spec-info'
+INFO /spec/spec-str:/spec-info/dict: verify using type 'spec-dict'
+INFO /spec/spec-str:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec/spec-str:/spec-info/dict/attributes/assert: verify using type 'spec-attribute-value'
+INFO /spec/spec-str:/spec-info/dict/attributes/assert/description: verify using type 'optional-str'
+INFO /spec/spec-str:/spec-info/dict/attributes/assert/spec-type: verify using type 'name'
+INFO /spec/spec-str:/spec-info/dict/attributes/description: verify using type 'spec-attribute-value'
+INFO /spec/spec-str:/spec-info/dict/attributes/description/description: verify using type 'optional-str'
+INFO /spec/spec-str:/spec-info/dict/attributes/description/spec-type: verify using type 'name'
+INFO /spec/spec-str:/spec-info/dict/description: verify using type 'optional-str'
+INFO /spec/spec-str:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec/spec-str:/spec-info/dict/required-attributes[0]: verify using type 'name'
+INFO /spec/spec-str:/spec-name: verify using type 'optional-str'
+INFO /spec/spec-str:/spec-type: verify using type 'name'
+INFO /spec2/any-dict: verify using type 'root'
+INFO /spec2/any-dict:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec2/any-dict:/copyrights: verify using type 'copyrights'
+INFO /spec2/any-dict:/copyrights[0]: verify using type 'copyright'
+INFO /spec2/any-dict:/enabled-by: verify using type 'enabled-by'
+INFO /spec2/any-dict:/links: verify using type 'links'
+INFO /spec2/any-dict:/links[0]: verify using type 'link'
+INFO /spec2/any-dict:/links[0]/role: verify using type 'name'
+INFO /spec2/any-dict:/links[0]/uid: verify using type 'uid'
+INFO /spec2/any-dict:/links[0]: verify using type 'spec-member'
+INFO /spec2/any-dict:/type: verify using type 'name'
+INFO /spec2/any-dict: verify using type 'spec'
+ERROR /spec2/any-dict: missing required keys for type 'spec': ['spec-description', 'spec-name']
+INFO /spec2/any-dict:/spec-example: verify using type 'optional-str'
+INFO /spec2/any-dict:/spec-info: verify using type 'spec-info'
+INFO /spec2/any-dict:/spec-info/dict: verify using type 'spec-dict'
+ERROR /spec2/any-dict:/spec-info/dict: missing required keys for type 'spec-dict': ['description']
+INFO /spec2/any-dict:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec2/any-dict:/spec-info/dict/generic-attributes: verify using type 'spec-generic-attributes'
+ERROR /spec2/any-dict:/spec-info/dict/generic-attributes: missing required keys for type 'spec-generic-attributes': ['description']
+INFO /spec2/any-dict:/spec-info/dict/generic-attributes/spec-type: verify using type 'name'
+INFO /spec2/any-dict:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec2/any-dict:/spec-type: verify using type 'name'
+INFO /spec2/c: verify using type 'root'
+INFO /spec2/c:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec2/c:/copyrights: verify using type 'copyrights'
+INFO /spec2/c:/copyrights[0]: verify using type 'copyright'
+INFO /spec2/c:/enabled-by: verify using type 'enabled-by'
+INFO /spec2/c:/links: verify using type 'links'
+INFO /spec2/c:/links[0]: verify using type 'link'
+INFO /spec2/c:/links[0]/role: verify using type 'name'
+INFO /spec2/c:/links[0]/uid: verify using type 'uid'
+INFO /spec2/c:/links[0]: verify using type 'spec-member'
+INFO /spec2/c:/links[1]: verify using type 'link'
+INFO /spec2/c:/links[1]/role: verify using type 'name'
+INFO /spec2/c:/links[1]/uid: verify using type 'uid'
+INFO /spec2/c:/links[1]: verify using type 'spec-refinement'
+INFO /spec2/c:/links[1]/spec-key: verify using type 'name'
+INFO /spec2/c:/links[1]/spec-value: verify using type 'name'
+INFO /spec2/c:/type: verify using type 'name'
+INFO /spec2/c: verify using type 'spec'
+ERROR /spec2/c: missing required keys for type 'spec': ['spec-description', 'spec-name']
+INFO /spec2/c:/spec-example: verify using type 'optional-str'
+INFO /spec2/c:/spec-info: verify using type 'spec-info'
+INFO /spec2/c:/spec-info/dict: verify using type 'spec-dict'
+ERROR /spec2/c:/spec-info/dict: missing required keys for type 'spec-dict': ['description']
+INFO /spec2/c:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec2/c:/spec-info/dict/attributes/any-dict: verify using type 'spec-attribute-value'
+ERROR /spec2/c:/spec-info/dict/attributes/any-dict: missing required keys for type 'spec-attribute-value': ['description']
+INFO /spec2/c:/spec-info/dict/attributes/any-dict/spec-type: verify using type 'name'
+INFO /spec2/c:/spec-info/dict/attributes/bool: verify using type 'spec-attribute-value'
+ERROR /spec2/c:/spec-info/dict/attributes/bool: missing required keys for type 'spec-attribute-value': ['description']
+INFO /spec2/c:/spec-info/dict/attributes/bool/spec-type: verify using type 'name'
+INFO /spec2/c:/spec-info/dict/attributes/dict: verify using type 'spec-attribute-value'
+ERROR /spec2/c:/spec-info/dict/attributes/dict: missing required keys for type 'spec-attribute-value': ['description']
+INFO /spec2/c:/spec-info/dict/attributes/dict/spec-type: verify using type 'name'
+INFO /spec2/c:/spec-info/dict/attributes/float: verify using type 'spec-attribute-value'
+ERROR /spec2/c:/spec-info/dict/attributes/float: missing required keys for type 'spec-attribute-value': ['description']
+INFO /spec2/c:/spec-info/dict/attributes/float/spec-type: verify using type 'name'
+INFO /spec2/c:/spec-info/dict/attributes/int: verify using type 'spec-attribute-value'
+ERROR /spec2/c:/spec-info/dict/attributes/int: missing required keys for type 'spec-attribute-value': ['description']
+INFO /spec2/c:/spec-info/dict/attributes/int/spec-type: verify using type 'name'
+INFO /spec2/c:/spec-info/dict/attributes/list: verify using type 'spec-attribute-value'
+ERROR /spec2/c:/spec-info/dict/attributes/list: missing required keys for type 'spec-attribute-value': ['description']
+INFO /spec2/c:/spec-info/dict/attributes/list/spec-type: verify using type 'name'
+INFO /spec2/c:/spec-info/dict/attributes/must-be-true: verify using type 'spec-attribute-value'
+ERROR /spec2/c:/spec-info/dict/attributes/must-be-true: missing required keys for type 'spec-attribute-value': ['description']
+INFO /spec2/c:/spec-info/dict/attributes/must-be-true/spec-type: verify using type 'name'
+INFO /spec2/c:/spec-info/dict/attributes/other-int: verify using type 'spec-attribute-value'
+ERROR /spec2/c:/spec-info/dict/attributes/other-int: missing required keys for type 'spec-attribute-value': ['description']
+INFO /spec2/c:/spec-info/dict/attributes/other-int/spec-type: verify using type 'name'
+INFO /spec2/c:/spec-info/dict/attributes/str: verify using type 'spec-attribute-value'
+ERROR /spec2/c:/spec-info/dict/attributes/str: missing required keys for type 'spec-attribute-value': ['description']
+INFO /spec2/c:/spec-info/dict/attributes/str/spec-type: verify using type 'name'
+INFO /spec2/c:/spec-info/dict/attributes/str-contains: verify using type 'spec-attribute-value'
+ERROR /spec2/c:/spec-info/dict/attributes/str-contains: missing required keys for type 'spec-attribute-value': ['description']
+INFO /spec2/c:/spec-info/dict/attributes/str-contains/spec-type: verify using type 'name'
+INFO /spec2/c:/spec-info/dict/attributes/uid: verify using type 'spec-attribute-value'
+ERROR /spec2/c:/spec-info/dict/attributes/uid: missing required keys for type 'spec-attribute-value': ['description']
+INFO /spec2/c:/spec-info/dict/attributes/uid/spec-type: verify using type 'name'
+INFO /spec2/c:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec2/c:/spec-type: verify using type 'name'
+INFO /spec2/d: verify using type 'root'
+INFO /spec2/d:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec2/d:/copyrights: verify using type 'copyrights'
+INFO /spec2/d:/copyrights[0]: verify using type 'copyright'
+INFO /spec2/d:/enabled-by: verify using type 'enabled-by'
+INFO /spec2/d:/links: verify using type 'links'
+INFO /spec2/d:/links[0]: verify using type 'link'
+INFO /spec2/d:/links[0]/role: verify using type 'name'
+INFO /spec2/d:/links[0]/uid: verify using type 'uid'
+INFO /spec2/d:/links[0]: verify using type 'spec-member'
+INFO /spec2/d:/links[1]: verify using type 'link'
+INFO /spec2/d:/links[1]/role: verify using type 'name'
+INFO /spec2/d:/links[1]/uid: verify using type 'uid'
+INFO /spec2/d:/links[1]: verify using type 'spec-refinement'
+INFO /spec2/d:/links[1]/spec-key: verify using type 'name'
+INFO /spec2/d:/links[1]/spec-value: verify using type 'name'
+INFO /spec2/d:/type: verify using type 'name'
+INFO /spec2/d: verify using type 'spec'
+ERROR /spec2/d: missing required keys for type 'spec': ['spec-description', 'spec-name']
+INFO /spec2/d:/spec-example: verify using type 'optional-str'
+INFO /spec2/d:/spec-info: verify using type 'spec-info'
+INFO /spec2/d:/spec-info/dict: verify using type 'spec-dict'
+ERROR /spec2/d:/spec-info/dict: missing required keys for type 'spec-dict': ['description']
+INFO /spec2/d:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec2/d:/spec-info/dict/attributes/d-type: verify using type 'spec-attribute-value'
+ERROR /spec2/d:/spec-info/dict/attributes/d-type: missing required keys for type 'spec-attribute-value': ['description']
+INFO /spec2/d:/spec-info/dict/attributes/d-type/spec-type: verify using type 'name'
+INFO /spec2/d:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec2/d:/spec-info/dict/required-attributes[0]: verify using type 'name'
+INFO /spec2/d:/spec-type: verify using type 'name'
+INFO /spec2/d-a: verify using type 'root'
+INFO /spec2/d-a:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec2/d-a:/copyrights: verify using type 'copyrights'
+INFO /spec2/d-a:/copyrights[0]: verify using type 'copyright'
+INFO /spec2/d-a:/enabled-by: verify using type 'enabled-by'
+INFO /spec2/d-a:/links: verify using type 'links'
+INFO /spec2/d-a:/links[0]: verify using type 'link'
+INFO /spec2/d-a:/links[0]/role: verify using type 'name'
+INFO /spec2/d-a:/links[0]/uid: verify using type 'uid'
+INFO /spec2/d-a:/links[0]: verify using type 'spec-member'
+INFO /spec2/d-a:/links[1]: verify using type 'link'
+INFO /spec2/d-a:/links[1]/role: verify using type 'name'
+INFO /spec2/d-a:/links[1]/uid: verify using type 'uid'
+INFO /spec2/d-a:/links[1]: verify using type 'spec-refinement'
+INFO /spec2/d-a:/links[1]/spec-key: verify using type 'name'
+INFO /spec2/d-a:/links[1]/spec-value: verify using type 'name'
+INFO /spec2/d-a:/links[2]: verify using type 'link'
+INFO /spec2/d-a:/links[2]/role: verify using type 'name'
+INFO /spec2/d-a:/links[2]/uid: verify using type 'uid'
+ERROR /spec2/d-a:/links[2]: unknown subtype for key 'role' for type 'link': other
+INFO /spec2/d-a:/type: verify using type 'name'
+INFO /spec2/d-a: verify using type 'spec'
+ERROR /spec2/d-a: missing required keys for type 'spec': ['spec-description', 'spec-name']
+INFO /spec2/d-a:/spec-example: verify using type 'optional-str'
+INFO /spec2/d-a:/spec-info: verify using type 'spec-info'
+INFO /spec2/d-a:/spec-info/dict: verify using type 'spec-dict'
+ERROR /spec2/d-a:/spec-info/dict: missing required keys for type 'spec-dict': ['description']
+INFO /spec2/d-a:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec2/d-a:/spec-info/dict/attributes/d-type: verify using type 'spec-attribute-value'
+ERROR /spec2/d-a:/spec-info/dict/attributes/d-type: missing required keys for type 'spec-attribute-value': ['description']
+INFO /spec2/d-a:/spec-info/dict/attributes/d-type/spec-type: verify using type 'name'
+INFO /spec2/d-a:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec2/d-a:/spec-type: verify using type 'name'
+INFO /spec2/invalid: verify using type 'root'
+INFO /spec2/invalid:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec2/invalid:/copyrights: verify using type 'copyrights'
+INFO /spec2/invalid:/copyrights[0]: verify using type 'copyright'
+INFO /spec2/invalid:/enabled-by: verify using type 'enabled-by'
+INFO /spec2/invalid:/links: verify using type 'links'
+INFO /spec2/invalid:/links[0]: verify using type 'link'
+INFO /spec2/invalid:/links[0]/role: verify using type 'name'
+INFO /spec2/invalid:/links[0]/uid: verify using type 'uid'
+INFO /spec2/invalid:/links[0]: verify using type 'spec-member'
+INFO /spec2/invalid:/links[1]: verify using type 'link'
+INFO /spec2/invalid:/links[1]/role: verify using type 'name'
+INFO /spec2/invalid:/links[1]/uid: verify using type 'uid'
+INFO /spec2/invalid:/links[1]: verify using type 'spec-refinement'
+INFO /spec2/invalid:/links[1]/spec-key: verify using type 'name'
+INFO /spec2/invalid:/links[1]/spec-value: verify using type 'name'
+INFO /spec2/invalid:/type: verify using type 'name'
+INFO /spec2/invalid: verify using type 'spec'
+ERROR /spec2/invalid: missing required keys for type 'spec': ['spec-description', 'spec-name']
+INFO /spec2/invalid:/spec-example: verify using type 'optional-str'
+INFO /spec2/invalid:/spec-info: verify using type 'spec-info'
+INFO /spec2/invalid:/spec-info/dict: verify using type 'spec-dict'
+ERROR /spec2/invalid:/spec-info/dict: missing required keys for type 'spec-dict': ['description']
+INFO /spec2/invalid:/spec-info/dict/attributes: verify using type 'spec-attributes'
+ERROR /spec2/invalid:/spec-info/dict/attributes: invalid name: INVALID
+INFO /spec2/invalid:/spec-info/dict/attributes/INVALID: verify using type 'spec-attribute-value'
+ERROR /spec2/invalid:/spec-info/dict/attributes/INVALID: missing required keys for type 'spec-attribute-value': ['description']
+INFO /spec2/invalid:/spec-info/dict/attributes/INVALID/spec-type: verify using type 'name'
+INFO /spec2/invalid:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec2/invalid:/spec-info/none: verify using type 'none'
+ERROR /spec2/invalid:/spec-info/none: expected type 'none', actual type 'bool'
+INFO /spec2/invalid:/spec-info/str: verify using type 'spec-str'
+ERROR /spec2/invalid:/spec-info/str: missing required keys for type 'spec-str': ['description']
+ERROR /spec2/invalid:/spec-info/str: has unverfied keys for type 'spec-str' and its subtypes: ['foo']
+ERROR /spec2/invalid:/spec-info: has unverfied keys for type 'spec-info' and its subtypes: ['unexpected']
+INFO /spec2/invalid:/spec-type: verify using type 'name'
+INFO /spec2/keys-at-least-one: verify using type 'root'
+INFO /spec2/keys-at-least-one:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec2/keys-at-least-one:/copyrights: verify using type 'copyrights'
+INFO /spec2/keys-at-least-one:/copyrights[0]: verify using type 'copyright'
+INFO /spec2/keys-at-least-one:/enabled-by: verify using type 'enabled-by'
+INFO /spec2/keys-at-least-one:/links: verify using type 'links'
+INFO /spec2/keys-at-least-one:/links[0]: verify using type 'link'
+INFO /spec2/keys-at-least-one:/links[0]/role: verify using type 'name'
+INFO /spec2/keys-at-least-one:/links[0]/uid: verify using type 'uid'
+INFO /spec2/keys-at-least-one:/links[0]: verify using type 'spec-member'
+INFO /spec2/keys-at-least-one:/links[1]: verify using type 'link'
+INFO /spec2/keys-at-least-one:/links[1]/role: verify using type 'name'
+INFO /spec2/keys-at-least-one:/links[1]/uid: verify using type 'uid'
+INFO /spec2/keys-at-least-one:/links[1]: verify using type 'spec-refinement'
+INFO /spec2/keys-at-least-one:/links[1]/spec-key: verify using type 'name'
+INFO /spec2/keys-at-least-one:/links[1]/spec-value: verify using type 'name'
+INFO /spec2/keys-at-least-one:/type: verify using type 'name'
+INFO /spec2/keys-at-least-one: verify using type 'spec'
+ERROR /spec2/keys-at-least-one: missing required keys for type 'spec': ['spec-description', 'spec-name']
+INFO /spec2/keys-at-least-one:/spec-example: verify using type 'optional-str'
+INFO /spec2/keys-at-least-one:/spec-info: verify using type 'spec-info'
+INFO /spec2/keys-at-least-one:/spec-info/dict: verify using type 'spec-dict'
+ERROR /spec2/keys-at-least-one:/spec-info/dict: missing required keys for type 'spec-dict': ['description']
+INFO /spec2/keys-at-least-one:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec2/keys-at-least-one:/spec-info/dict/attributes/key-a: verify using type 'spec-attribute-value'
+ERROR /spec2/keys-at-least-one:/spec-info/dict/attributes/key-a: missing required keys for type 'spec-attribute-value': ['description']
+INFO /spec2/keys-at-least-one:/spec-info/dict/attributes/key-a/spec-type: verify using type 'name'
+INFO /spec2/keys-at-least-one:/spec-info/dict/attributes/key-b: verify using type 'spec-attribute-value'
+ERROR /spec2/keys-at-least-one:/spec-info/dict/attributes/key-b: missing required keys for type 'spec-attribute-value': ['description']
+INFO /spec2/keys-at-least-one:/spec-info/dict/attributes/key-b/spec-type: verify using type 'name'
+INFO /spec2/keys-at-least-one:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec2/keys-at-least-one:/spec-type: verify using type 'name'
+INFO /spec2/keys-at-most-one: verify using type 'root'
+INFO /spec2/keys-at-most-one:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec2/keys-at-most-one:/copyrights: verify using type 'copyrights'
+INFO /spec2/keys-at-most-one:/copyrights[0]: verify using type 'copyright'
+INFO /spec2/keys-at-most-one:/enabled-by: verify using type 'enabled-by'
+INFO /spec2/keys-at-most-one:/links: verify using type 'links'
+INFO /spec2/keys-at-most-one:/links[0]: verify using type 'link'
+INFO /spec2/keys-at-most-one:/links[0]/role: verify using type 'name'
+INFO /spec2/keys-at-most-one:/links[0]/uid: verify using type 'uid'
+INFO /spec2/keys-at-most-one:/links[0]: verify using type 'spec-member'
+INFO /spec2/keys-at-most-one:/links[1]: verify using type 'link'
+INFO /spec2/keys-at-most-one:/links[1]/role: verify using type 'name'
+INFO /spec2/keys-at-most-one:/links[1]/uid: verify using type 'uid'
+INFO /spec2/keys-at-most-one:/links[1]: verify using type 'spec-refinement'
+INFO /spec2/keys-at-most-one:/links[1]/spec-key: verify using type 'name'
+INFO /spec2/keys-at-most-one:/links[1]/spec-value: verify using type 'name'
+INFO /spec2/keys-at-most-one:/type: verify using type 'name'
+INFO /spec2/keys-at-most-one: verify using type 'spec'
+ERROR /spec2/keys-at-most-one: missing required keys for type 'spec': ['spec-description', 'spec-name']
+INFO /spec2/keys-at-most-one:/spec-example: verify using type 'optional-str'
+INFO /spec2/keys-at-most-one:/spec-info: verify using type 'spec-info'
+INFO /spec2/keys-at-most-one:/spec-info/dict: verify using type 'spec-dict'
+ERROR /spec2/keys-at-most-one:/spec-info/dict: missing required keys for type 'spec-dict': ['description']
+INFO /spec2/keys-at-most-one:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec2/keys-at-most-one:/spec-info/dict/attributes/key-a: verify using type 'spec-attribute-value'
+ERROR /spec2/keys-at-most-one:/spec-info/dict/attributes/key-a: missing required keys for type 'spec-attribute-value': ['description']
+INFO /spec2/keys-at-most-one:/spec-info/dict/attributes/key-a/spec-type: verify using type 'name'
+INFO /spec2/keys-at-most-one:/spec-info/dict/attributes/key-b: verify using type 'spec-attribute-value'
+ERROR /spec2/keys-at-most-one:/spec-info/dict/attributes/key-b: missing required keys for type 'spec-attribute-value': ['description']
+INFO /spec2/keys-at-most-one:/spec-info/dict/attributes/key-b/spec-type: verify using type 'name'
+INFO /spec2/keys-at-most-one:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec2/keys-at-most-one:/spec-type: verify using type 'name'
+INFO /spec2/keys-exactly-one: verify using type 'root'
+INFO /spec2/keys-exactly-one:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec2/keys-exactly-one:/copyrights: verify using type 'copyrights'
+INFO /spec2/keys-exactly-one:/copyrights[0]: verify using type 'copyright'
+INFO /spec2/keys-exactly-one:/enabled-by: verify using type 'enabled-by'
+INFO /spec2/keys-exactly-one:/links: verify using type 'links'
+INFO /spec2/keys-exactly-one:/links[0]: verify using type 'link'
+INFO /spec2/keys-exactly-one:/links[0]/role: verify using type 'name'
+INFO /spec2/keys-exactly-one:/links[0]/uid: verify using type 'uid'
+INFO /spec2/keys-exactly-one:/links[0]: verify using type 'spec-member'
+INFO /spec2/keys-exactly-one:/links[1]: verify using type 'link'
+INFO /spec2/keys-exactly-one:/links[1]/role: verify using type 'name'
+INFO /spec2/keys-exactly-one:/links[1]/uid: verify using type 'uid'
+INFO /spec2/keys-exactly-one:/links[1]: verify using type 'spec-refinement'
+INFO /spec2/keys-exactly-one:/links[1]/spec-key: verify using type 'name'
+INFO /spec2/keys-exactly-one:/links[1]/spec-value: verify using type 'name'
+INFO /spec2/keys-exactly-one:/type: verify using type 'name'
+INFO /spec2/keys-exactly-one: verify using type 'spec'
+ERROR /spec2/keys-exactly-one: missing required keys for type 'spec': ['spec-description', 'spec-name']
+INFO /spec2/keys-exactly-one:/spec-example: verify using type 'optional-str'
+INFO /spec2/keys-exactly-one:/spec-info: verify using type 'spec-info'
+INFO /spec2/keys-exactly-one:/spec-info/dict: verify using type 'spec-dict'
+ERROR /spec2/keys-exactly-one:/spec-info/dict: missing required keys for type 'spec-dict': ['description']
+INFO /spec2/keys-exactly-one:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec2/keys-exactly-one:/spec-info/dict/attributes/key-a: verify using type 'spec-attribute-value'
+ERROR /spec2/keys-exactly-one:/spec-info/dict/attributes/key-a: missing required keys for type 'spec-attribute-value': ['description']
+INFO /spec2/keys-exactly-one:/spec-info/dict/attributes/key-a/spec-type: verify using type 'name'
+INFO /spec2/keys-exactly-one:/spec-info/dict/attributes/key-b: verify using type 'spec-attribute-value'
+ERROR /spec2/keys-exactly-one:/spec-info/dict/attributes/key-b: missing required keys for type 'spec-attribute-value': ['description']
+INFO /spec2/keys-exactly-one:/spec-info/dict/attributes/key-b/spec-type: verify using type 'name'
+INFO /spec2/keys-exactly-one:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec2/keys-exactly-one:/spec-type: verify using type 'name'
+INFO /spec2/must-be-true: verify using type 'root'
+INFO /spec2/must-be-true:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec2/must-be-true:/copyrights: verify using type 'copyrights'
+INFO /spec2/must-be-true:/copyrights[0]: verify using type 'copyright'
+INFO /spec2/must-be-true:/enabled-by: verify using type 'enabled-by'
+INFO /spec2/must-be-true:/links: verify using type 'links'
+INFO /spec2/must-be-true:/links[0]: verify using type 'link'
+INFO /spec2/must-be-true:/links[0]/role: verify using type 'name'
+INFO /spec2/must-be-true:/links[0]/uid: verify using type 'uid'
+INFO /spec2/must-be-true:/links[0]: verify using type 'spec-member'
+INFO /spec2/must-be-true:/type: verify using type 'name'
+INFO /spec2/must-be-true: verify using type 'spec'
+ERROR /spec2/must-be-true: missing required keys for type 'spec': ['spec-description', 'spec-name']
+INFO /spec2/must-be-true:/spec-example: verify using type 'optional-str'
+INFO /spec2/must-be-true:/spec-info: verify using type 'spec-info'
+INFO /spec2/must-be-true:/spec-info/bool: verify using type 'spec-bool'
+ERROR /spec2/must-be-true:/spec-info/bool: missing required keys for type 'spec-bool': ['description']
+INFO /spec2/must-be-true:/spec-info/bool/assert: verify using type 'bool'
+INFO /spec2/must-be-true:/spec-type: verify using type 'name'
+INFO /spec2/other-int: verify using type 'root'
+INFO /spec2/other-int:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec2/other-int:/copyrights: verify using type 'copyrights'
+INFO /spec2/other-int:/copyrights[0]: verify using type 'copyright'
+INFO /spec2/other-int:/enabled-by: verify using type 'enabled-by'
+INFO /spec2/other-int:/links: verify using type 'links'
+INFO /spec2/other-int:/links[0]: verify using type 'link'
+INFO /spec2/other-int:/links[0]/role: verify using type 'name'
+INFO /spec2/other-int:/links[0]/uid: verify using type 'uid'
+INFO /spec2/other-int:/links[0]: verify using type 'spec-member'
+INFO /spec2/other-int:/type: verify using type 'name'
+INFO /spec2/other-int: verify using type 'spec'
+ERROR /spec2/other-int: missing required keys for type 'spec': ['spec-description', 'spec-name']
+INFO /spec2/other-int:/spec-example: verify using type 'optional-str'
+INFO /spec2/other-int:/spec-info: verify using type 'spec-info'
+INFO /spec2/other-int:/spec-info/int: verify using type 'spec-int'
+ERROR /spec2/other-int:/spec-info/int: missing required keys for type 'spec-int': ['description']
+INFO /spec2/other-int:/spec-type: verify using type 'name'
+INFO /spec2/some-bool: verify using type 'root'
+INFO /spec2/some-bool:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec2/some-bool:/copyrights: verify using type 'copyrights'
+INFO /spec2/some-bool:/copyrights[0]: verify using type 'copyright'
+INFO /spec2/some-bool:/enabled-by: verify using type 'enabled-by'
+INFO /spec2/some-bool:/links: verify using type 'links'
+INFO /spec2/some-bool:/links[0]: verify using type 'link'
+INFO /spec2/some-bool:/links[0]/role: verify using type 'name'
+INFO /spec2/some-bool:/links[0]/uid: verify using type 'uid'
+INFO /spec2/some-bool:/links[0]: verify using type 'spec-member'
+INFO /spec2/some-bool:/type: verify using type 'name'
+INFO /spec2/some-bool: verify using type 'spec'
+ERROR /spec2/some-bool: missing required keys for type 'spec': ['spec-description', 'spec-name']
+INFO /spec2/some-bool:/spec-example: verify using type 'optional-str'
+INFO /spec2/some-bool:/spec-info: verify using type 'spec-info'
+INFO /spec2/some-bool:/spec-info/bool: verify using type 'spec-bool'
+ERROR /spec2/some-bool:/spec-info/bool: missing required keys for type 'spec-bool': ['description']
+INFO /spec2/some-bool:/spec-type: verify using type 'name'
+INFO /spec2/some-dict: verify using type 'root'
+INFO /spec2/some-dict:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec2/some-dict:/copyrights: verify using type 'copyrights'
+INFO /spec2/some-dict:/copyrights[0]: verify using type 'copyright'
+INFO /spec2/some-dict:/enabled-by: verify using type 'enabled-by'
+INFO /spec2/some-dict:/links: verify using type 'links'
+INFO /spec2/some-dict:/links[0]: verify using type 'link'
+INFO /spec2/some-dict:/links[0]/role: verify using type 'name'
+INFO /spec2/some-dict:/links[0]/uid: verify using type 'uid'
+INFO /spec2/some-dict:/links[0]: verify using type 'spec-member'
+INFO /spec2/some-dict:/type: verify using type 'name'
+INFO /spec2/some-dict: verify using type 'spec'
+ERROR /spec2/some-dict: missing required keys for type 'spec': ['spec-description', 'spec-name']
+INFO /spec2/some-dict:/spec-example: verify using type 'optional-str'
+INFO /spec2/some-dict:/spec-info: verify using type 'spec-info'
+INFO /spec2/some-dict:/spec-info/dict: verify using type 'spec-dict'
+ERROR /spec2/some-dict:/spec-info/dict: missing required keys for type 'spec-dict': ['description']
+INFO /spec2/some-dict:/spec-info/dict/attributes: verify using type 'spec-attributes'
+INFO /spec2/some-dict:/spec-info/dict/attributes/a: verify using type 'spec-attribute-value'
+ERROR /spec2/some-dict:/spec-info/dict/attributes/a: missing required keys for type 'spec-attribute-value': ['description']
+INFO /spec2/some-dict:/spec-info/dict/attributes/a/spec-type: verify using type 'name'
+INFO /spec2/some-dict:/spec-info/dict/required-attributes: verify using type 'spec-required-attributes'
+INFO /spec2/some-dict:/spec-info/none: verify using type 'none'
+INFO /spec2/some-dict:/spec-type: verify using type 'name'
+INFO /spec2/some-float: verify using type 'root'
+INFO /spec2/some-float:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec2/some-float:/copyrights: verify using type 'copyrights'
+INFO /spec2/some-float:/copyrights[0]: verify using type 'copyright'
+INFO /spec2/some-float:/enabled-by: verify using type 'enabled-by'
+INFO /spec2/some-float:/links: verify using type 'links'
+INFO /spec2/some-float:/links[0]: verify using type 'link'
+INFO /spec2/some-float:/links[0]/role: verify using type 'name'
+INFO /spec2/some-float:/links[0]/uid: verify using type 'uid'
+INFO /spec2/some-float:/links[0]: verify using type 'spec-member'
+INFO /spec2/some-float:/type: verify using type 'name'
+INFO /spec2/some-float: verify using type 'spec'
+ERROR /spec2/some-float: missing required keys for type 'spec': ['spec-description', 'spec-name']
+INFO /spec2/some-float:/spec-example: verify using type 'optional-str'
+INFO /spec2/some-float:/spec-info: verify using type 'spec-info'
+INFO /spec2/some-float:/spec-info/float: verify using type 'spec-float'
+ERROR /spec2/some-float:/spec-info/float: missing required keys for type 'spec-float': ['description']
+INFO /spec2/some-float:/spec-info/float/assert: verify using type 'spec-assert-float'
+INFO /spec2/some-float:/spec-info/float/assert[0]: verify using type 'spec-assert-float'
+INFO /spec2/some-float:/spec-info/float/assert[0]/le: verify using type 'float'
+INFO /spec2/some-float:/spec-type: verify using type 'name'
+INFO /spec2/some-int: verify using type 'root'
+INFO /spec2/some-int:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec2/some-int:/copyrights: verify using type 'copyrights'
+INFO /spec2/some-int:/copyrights[0]: verify using type 'copyright'
+INFO /spec2/some-int:/enabled-by: verify using type 'enabled-by'
+INFO /spec2/some-int:/links: verify using type 'links'
+INFO /spec2/some-int:/links[0]: verify using type 'link'
+INFO /spec2/some-int:/links[0]/role: verify using type 'name'
+INFO /spec2/some-int:/links[0]/uid: verify using type 'uid'
+INFO /spec2/some-int:/links[0]: verify using type 'spec-member'
+INFO /spec2/some-int:/type: verify using type 'name'
+INFO /spec2/some-int: verify using type 'spec'
+ERROR /spec2/some-int: missing required keys for type 'spec': ['spec-description', 'spec-name']
+INFO /spec2/some-int:/spec-example: verify using type 'optional-str'
+INFO /spec2/some-int:/spec-info: verify using type 'spec-info'
+INFO /spec2/some-int:/spec-info/int: verify using type 'spec-int'
+ERROR /spec2/some-int:/spec-info/int: missing required keys for type 'spec-int': ['description']
+INFO /spec2/some-int:/spec-info/int/assert: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[0]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[0]/and: verify using type 'spec-assert-int-list'
+INFO /spec2/some-int:/spec-info/int/assert[0]/and[0]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[0]/and[0]/not: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[0]/and[0]/not/eq: verify using type 'int'
+INFO /spec2/some-int:/spec-info/int/assert[0]/and[1]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[0]/and[1]/eq: verify using type 'int'
+INFO /spec2/some-int:/spec-info/int/assert[1]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[1]/and: verify using type 'spec-assert-int-list'
+INFO /spec2/some-int:/spec-info/int/assert[1]/and[0]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[1]/and[0]/eq: verify using type 'int'
+INFO /spec2/some-int:/spec-info/int/assert[1]/and[1]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[1]/and[1]/ne: verify using type 'int'
+INFO /spec2/some-int:/spec-info/int/assert[2]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[2]/and: verify using type 'spec-assert-int-list'
+INFO /spec2/some-int:/spec-info/int/assert[2]/and[0]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[2]/and[0]/ge: verify using type 'int'
+INFO /spec2/some-int:/spec-info/int/assert[2]/and[1]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[2]/and[1]/le: verify using type 'int'
+INFO /spec2/some-int:/spec-info/int/assert[3]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[3]/and: verify using type 'spec-assert-int-list'
+INFO /spec2/some-int:/spec-info/int/assert[3]/and[0]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[3]/and[0]/gt: verify using type 'int'
+INFO /spec2/some-int:/spec-info/int/assert[3]/and[1]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[3]/and[1]/lt: verify using type 'int'
+INFO /spec2/some-int:/spec-info/int/assert[4]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[4]/and: verify using type 'spec-assert-int-list'
+INFO /spec2/some-int:/spec-info/int/assert[4]/and[0]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[4]/and[0]/le: verify using type 'int'
+INFO /spec2/some-int:/spec-info/int/assert[4]/and[1]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[4]/and[1]/ge: verify using type 'int'
+INFO /spec2/some-int:/spec-info/int/assert[5]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[5]/and: verify using type 'spec-assert-int-list'
+INFO /spec2/some-int:/spec-info/int/assert[5]/and[0]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[5]/and[0]/lt: verify using type 'int'
+INFO /spec2/some-int:/spec-info/int/assert[5]/and[1]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[5]/and[1]/gt: verify using type 'int'
+INFO /spec2/some-int:/spec-info/int/assert[6]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[6]/and: verify using type 'spec-assert-int-list'
+INFO /spec2/some-int:/spec-info/int/assert[6]/and[0]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[6]/and[0]/or: verify using type 'spec-assert-int-list'
+INFO /spec2/some-int:/spec-info/int/assert[6]/and[0]/or[0]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[6]/and[0]/or[0]/eq: verify using type 'int'
+INFO /spec2/some-int:/spec-info/int/assert[6]/and[0]/or[1]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[6]/and[0]/or[1]/ne: verify using type 'int'
+INFO /spec2/some-int:/spec-info/int/assert[7]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[7]/eq: verify using type 'int'
+INFO /spec2/some-int:/spec-info/int/assert[8]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[8]/ne: verify using type 'int'
+INFO /spec2/some-int:/spec-info/int/assert[9]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[9]/le: verify using type 'int'
+INFO /spec2/some-int:/spec-info/int/assert[10]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[10]/lt: verify using type 'int'
+INFO /spec2/some-int:/spec-info/int/assert[11]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[11]/ge: verify using type 'int'
+INFO /spec2/some-int:/spec-info/int/assert[12]: verify using type 'spec-assert-int'
+INFO /spec2/some-int:/spec-info/int/assert[12]/gt: verify using type 'int'
+INFO /spec2/some-int:/spec-type: verify using type 'name'
+INFO /spec2/some-list: verify using type 'root'
+INFO /spec2/some-list:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec2/some-list:/copyrights: verify using type 'copyrights'
+INFO /spec2/some-list:/copyrights[0]: verify using type 'copyright'
+INFO /spec2/some-list:/enabled-by: verify using type 'enabled-by'
+INFO /spec2/some-list:/links: verify using type 'links'
+INFO /spec2/some-list:/links[0]: verify using type 'link'
+INFO /spec2/some-list:/links[0]/role: verify using type 'name'
+INFO /spec2/some-list:/links[0]/uid: verify using type 'uid'
+INFO /spec2/some-list:/links[0]: verify using type 'spec-member'
+INFO /spec2/some-list:/type: verify using type 'name'
+INFO /spec2/some-list: verify using type 'spec'
+ERROR /spec2/some-list: missing required keys for type 'spec': ['spec-description', 'spec-name']
+INFO /spec2/some-list:/spec-example: verify using type 'optional-str'
+INFO /spec2/some-list:/spec-info: verify using type 'spec-info'
+INFO /spec2/some-list:/spec-info/list: verify using type 'spec-list'
+ERROR /spec2/some-list:/spec-info/list: missing required keys for type 'spec-list': ['description']
+INFO /spec2/some-list:/spec-info/list/spec-type: verify using type 'name'
+INFO /spec2/some-list:/spec-type: verify using type 'name'
+INFO /spec2/some-str: verify using type 'root'
+INFO /spec2/some-str:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec2/some-str:/copyrights: verify using type 'copyrights'
+INFO /spec2/some-str:/copyrights[0]: verify using type 'copyright'
+INFO /spec2/some-str:/enabled-by: verify using type 'enabled-by'
+INFO /spec2/some-str:/links: verify using type 'links'
+INFO /spec2/some-str:/links[0]: verify using type 'link'
+INFO /spec2/some-str:/links[0]/role: verify using type 'name'
+INFO /spec2/some-str:/links[0]/uid: verify using type 'uid'
+INFO /spec2/some-str:/links[0]: verify using type 'spec-member'
+INFO /spec2/some-str:/type: verify using type 'name'
+INFO /spec2/some-str: verify using type 'spec'
+ERROR /spec2/some-str: missing required keys for type 'spec': ['spec-description', 'spec-name']
+INFO /spec2/some-str:/spec-example: verify using type 'optional-str'
+INFO /spec2/some-str:/spec-info: verify using type 'spec-info'
+INFO /spec2/some-str:/spec-info/str: verify using type 'spec-str'
+ERROR /spec2/some-str:/spec-info/str: missing required keys for type 'spec-str': ['description']
+INFO /spec2/some-str:/spec-info/str/assert: verify using type 'spec-assert-str'
+INFO /spec2/some-str:/spec-info/str/assert[0]: verify using type 'spec-assert-str'
+INFO /spec2/some-str:/spec-info/str/assert[0]/uid: verify using type 'none'
+INFO /spec2/some-str:/spec-info/str/assert[1]: verify using type 'spec-assert-str'
+INFO /spec2/some-str:/spec-info/str/assert[1]/eq: verify using type 'str'
+INFO /spec2/some-str:/spec-info/str/assert[2]: verify using type 'spec-assert-str'
+INFO /spec2/some-str:/spec-info/str/assert[2]/ne: verify using type 'str'
+INFO /spec2/some-str:/spec-info/str/assert[3]: verify using type 'spec-assert-str'
+INFO /spec2/some-str:/spec-info/str/assert[3]/re: verify using type 'str'
+INFO /spec2/some-str:/spec-type: verify using type 'name'
+INFO /spec2/sta: verify using type 'root'
+INFO /spec2/sta:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec2/sta:/copyrights: verify using type 'copyrights'
+INFO /spec2/sta:/copyrights[0]: verify using type 'copyright'
+INFO /spec2/sta:/enabled-by: verify using type 'enabled-by'
+INFO /spec2/sta:/links: verify using type 'links'
+INFO /spec2/sta:/type: verify using type 'name'
+INFO /spec2/sta: verify using type 'spec'
+ERROR /spec2/sta: missing required keys for type 'spec': ['spec-description', 'spec-name']
+INFO /spec2/sta:/spec-example: verify using type 'optional-str'
+INFO /spec2/sta:/spec-info: verify using type 'spec-info'
+ERROR /spec2/sta:/spec-info: not at least one key out of ['bool', 'dict', 'float', 'int', 'list', 'none', 'str'] is present for type 'spec-info'
+INFO /spec2/sta:/spec-type: verify using type 'name'
+INFO /spec2/str-contains: verify using type 'root'
+INFO /spec2/str-contains:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec2/str-contains:/copyrights: verify using type 'copyrights'
+INFO /spec2/str-contains:/copyrights[0]: verify using type 'copyright'
+INFO /spec2/str-contains:/enabled-by: verify using type 'enabled-by'
+INFO /spec2/str-contains:/links: verify using type 'links'
+INFO /spec2/str-contains:/links[0]: verify using type 'link'
+INFO /spec2/str-contains:/links[0]/role: verify using type 'name'
+INFO /spec2/str-contains:/links[0]/uid: verify using type 'uid'
+INFO /spec2/str-contains:/links[0]: verify using type 'spec-member'
+INFO /spec2/str-contains:/type: verify using type 'name'
+INFO /spec2/str-contains: verify using type 'spec'
+ERROR /spec2/str-contains: missing required keys for type 'spec': ['spec-description', 'spec-name']
+INFO /spec2/str-contains:/spec-example: verify using type 'optional-str'
+INFO /spec2/str-contains:/spec-info: verify using type 'spec-info'
+INFO /spec2/str-contains:/spec-info/str: verify using type 'spec-str'
+ERROR /spec2/str-contains:/spec-info/str: missing required keys for type 'spec-str': ['description']
+INFO /spec2/str-contains:/spec-info/str/assert: verify using type 'spec-assert-str'
+INFO /spec2/str-contains:/spec-info/str/assert/and: verify using type 'spec-assert-str-list'
+INFO /spec2/str-contains:/spec-info/str/assert/and[0]: verify using type 'spec-assert-str'
+INFO /spec2/str-contains:/spec-info/str/assert/and[0]/contains: verify using type 'list-str'
+INFO /spec2/str-contains:/spec-info/str/assert/and[0]/contains[0]: verify using type 'str'
+INFO /spec2/str-contains:/spec-info/str/assert/and[0]/contains[1]: verify using type 'str'
+INFO /spec2/str-contains:/spec-info/str/assert/and[1]: verify using type 'spec-assert-str'
+INFO /spec2/str-contains:/spec-info/str/assert/and[1]/not: verify using type 'spec-assert-str'
+INFO /spec2/str-contains:/spec-info/str/assert/and[1]/not/contains: verify using type 'list-str'
+INFO /spec2/str-contains:/spec-info/str/assert/and[1]/not/contains[0]: verify using type 'str'
+INFO /spec2/str-contains:/spec-type: verify using type 'name'
+INFO /spec2/x: verify using type 'root'
+INFO /spec2/x:/SPDX-License-Identifier: verify using type 'spdx-license-identifier'
+INFO /spec2/x:/copyrights: verify using type 'copyrights'
+INFO /spec2/x:/copyrights[0]: verify using type 'copyright'
+INFO /spec2/x:/enabled-by: verify using type 'enabled-by'
+INFO /spec2/x:/links: verify using type 'links'
+INFO /spec2/x:/links[0]: verify using type 'link'
+INFO /spec2/x:/links[0]/role: verify using type 'name'
+INFO /spec2/x:/links[0]/uid: verify using type 'uid'
+INFO /spec2/x:/links[0]: verify using type 'spec-member'
+INFO /spec2/x:/type: verify using type 'name'
+INFO /spec2/x: verify using type 'spec'
+ERROR /spec2/x: missing required keys for type 'spec': ['spec-description', 'spec-name']
+INFO /spec2/x:/spec-example: verify using type 'optional-str'
+INFO /spec2/x:/spec-info: verify using type 'spec-info'
+INFO /spec2/x:/spec-info/str: verify using type 'spec-str'
+ERROR /spec2/x:/spec-info/str: missing required keys for type 'spec-str': ['description']
+INFO /spec2/x:/spec-info/str/assert: verify using type 'spec-assert-str'
+INFO /spec2/x:/spec-info/str/assert/eq: verify using type 'str'
+INFO /spec2/x:/spec-type: verify using type 'name'
+INFO finished specification item verification"""