summaryrefslogtreecommitdiffstats
path: root/tests/qapi-schema
diff options
context:
space:
mode:
Diffstat (limited to 'tests/qapi-schema')
-rw-r--r--tests/qapi-schema/args-union.err2
-rw-r--r--tests/qapi-schema/args-union.json8
-rw-r--r--tests/qapi-schema/bad-base.err2
-rw-r--r--tests/qapi-schema/bad-base.json8
-rw-r--r--tests/qapi-schema/doc-good.json13
-rw-r--r--tests/qapi-schema/doc-good.out22
-rw-r--r--tests/qapi-schema/doc-good.txt20
-rw-r--r--tests/qapi-schema/enum-if-invalid.json4
-rw-r--r--tests/qapi-schema/flat-union-array-branch.err2
-rw-r--r--tests/qapi-schema/flat-union-bad-base.err2
-rw-r--r--tests/qapi-schema/flat-union-bad-discriminator.err2
-rw-r--r--tests/qapi-schema/flat-union-base-any.err2
-rw-r--r--tests/qapi-schema/flat-union-base-union.err2
-rw-r--r--tests/qapi-schema/flat-union-clash-member.err2
-rw-r--r--tests/qapi-schema/flat-union-discriminator-bad-name.err2
-rw-r--r--tests/qapi-schema/flat-union-empty.err2
-rw-r--r--tests/qapi-schema/flat-union-empty.json4
-rw-r--r--tests/qapi-schema/flat-union-inline-invalid-dict.err2
-rw-r--r--tests/qapi-schema/flat-union-int-branch.err2
-rw-r--r--tests/qapi-schema/flat-union-invalid-branch-key.err2
-rw-r--r--tests/qapi-schema/flat-union-invalid-discriminator.err2
-rw-r--r--tests/qapi-schema/flat-union-invalid-if-discriminator.err2
-rw-r--r--tests/qapi-schema/flat-union-no-base.err2
-rw-r--r--tests/qapi-schema/flat-union-optional-discriminator.err2
-rw-r--r--tests/qapi-schema/flat-union-string-discriminator.err2
-rw-r--r--tests/qapi-schema/flat-union-string-discriminator.out0
-rw-r--r--tests/qapi-schema/meson.build35
-rw-r--r--tests/qapi-schema/qapi-schema-test.json51
-rw-r--r--tests/qapi-schema/qapi-schema-test.out116
-rw-r--r--tests/qapi-schema/reserved-member-u.json2
-rw-r--r--tests/qapi-schema/reserved-type-kind.err2
-rw-r--r--tests/qapi-schema/reserved-type-kind.json2
-rw-r--r--tests/qapi-schema/reserved-type-kind.out0
-rwxr-xr-xtests/qapi-schema/test-qapi.py20
-rw-r--r--tests/qapi-schema/union-array-branch.err2
-rw-r--r--tests/qapi-schema/union-array-branch.json (renamed from tests/qapi-schema/flat-union-array-branch.json)2
-rw-r--r--tests/qapi-schema/union-array-branch.out (renamed from tests/qapi-schema/flat-union-array-branch.out)0
-rw-r--r--tests/qapi-schema/union-bad-base.err2
-rw-r--r--tests/qapi-schema/union-bad-base.json (renamed from tests/qapi-schema/flat-union-bad-base.json)0
-rw-r--r--tests/qapi-schema/union-bad-base.out (renamed from tests/qapi-schema/flat-union-bad-base.out)0
-rw-r--r--tests/qapi-schema/union-bad-discriminator.err2
-rw-r--r--tests/qapi-schema/union-bad-discriminator.json (renamed from tests/qapi-schema/flat-union-bad-discriminator.json)0
-rw-r--r--tests/qapi-schema/union-bad-discriminator.out (renamed from tests/qapi-schema/flat-union-bad-discriminator.out)0
-rw-r--r--tests/qapi-schema/union-base-any.err2
-rw-r--r--tests/qapi-schema/union-base-any.json (renamed from tests/qapi-schema/flat-union-base-any.json)0
-rw-r--r--tests/qapi-schema/union-base-any.out (renamed from tests/qapi-schema/flat-union-base-any.out)0
-rw-r--r--tests/qapi-schema/union-base-empty.json2
-rw-r--r--tests/qapi-schema/union-base-no-discriminator.err2
-rw-r--r--tests/qapi-schema/union-base-no-discriminator.json2
-rw-r--r--tests/qapi-schema/union-base-union.err2
-rw-r--r--tests/qapi-schema/union-base-union.json (renamed from tests/qapi-schema/flat-union-base-union.json)3
-rw-r--r--tests/qapi-schema/union-base-union.out (renamed from tests/qapi-schema/flat-union-base-union.out)0
-rw-r--r--tests/qapi-schema/union-branch-case.err2
-rw-r--r--tests/qapi-schema/union-branch-case.json2
-rw-r--r--tests/qapi-schema/union-branch-case.out0
-rw-r--r--tests/qapi-schema/union-branch-invalid-dict.err2
-rw-r--r--tests/qapi-schema/union-branch-invalid-dict.json4
-rw-r--r--tests/qapi-schema/union-clash-branches.err2
-rw-r--r--tests/qapi-schema/union-clash-branches.json7
-rw-r--r--tests/qapi-schema/union-clash-branches.out0
-rw-r--r--tests/qapi-schema/union-clash-member.err2
-rw-r--r--tests/qapi-schema/union-clash-member.json (renamed from tests/qapi-schema/flat-union-clash-member.json)0
-rw-r--r--tests/qapi-schema/union-clash-member.out (renamed from tests/qapi-schema/flat-union-clash-member.out)0
-rw-r--r--tests/qapi-schema/union-discriminator-bad-name.err2
-rw-r--r--tests/qapi-schema/union-discriminator-bad-name.json (renamed from tests/qapi-schema/flat-union-discriminator-bad-name.json)0
-rw-r--r--tests/qapi-schema/union-discriminator-bad-name.out (renamed from tests/qapi-schema/flat-union-discriminator-bad-name.out)0
-rw-r--r--tests/qapi-schema/union-empty.err2
-rw-r--r--tests/qapi-schema/union-empty.json6
-rw-r--r--tests/qapi-schema/union-inline-invalid-dict.err2
-rw-r--r--tests/qapi-schema/union-inline-invalid-dict.json (renamed from tests/qapi-schema/flat-union-inline-invalid-dict.json)0
-rw-r--r--tests/qapi-schema/union-inline-invalid-dict.out (renamed from tests/qapi-schema/flat-union-empty.out)0
-rw-r--r--tests/qapi-schema/union-int-branch.err2
-rw-r--r--tests/qapi-schema/union-int-branch.json (renamed from tests/qapi-schema/flat-union-int-branch.json)2
-rw-r--r--tests/qapi-schema/union-int-branch.out (renamed from tests/qapi-schema/flat-union-inline-invalid-dict.out)0
-rw-r--r--tests/qapi-schema/union-invalid-branch-key.err2
-rw-r--r--tests/qapi-schema/union-invalid-branch-key.json (renamed from tests/qapi-schema/flat-union-invalid-branch-key.json)0
-rw-r--r--tests/qapi-schema/union-invalid-branch-key.out (renamed from tests/qapi-schema/flat-union-int-branch.out)0
-rw-r--r--tests/qapi-schema/union-invalid-discriminator.err2
-rw-r--r--tests/qapi-schema/union-invalid-discriminator.json (renamed from tests/qapi-schema/flat-union-invalid-discriminator.json)0
-rw-r--r--tests/qapi-schema/union-invalid-discriminator.out (renamed from tests/qapi-schema/flat-union-invalid-branch-key.out)0
-rw-r--r--tests/qapi-schema/union-invalid-if-discriminator.err2
-rw-r--r--tests/qapi-schema/union-invalid-if-discriminator.json (renamed from tests/qapi-schema/flat-union-invalid-if-discriminator.json)0
-rw-r--r--tests/qapi-schema/union-invalid-if-discriminator.out (renamed from tests/qapi-schema/flat-union-invalid-discriminator.out)0
-rw-r--r--tests/qapi-schema/union-no-base.err2
-rw-r--r--tests/qapi-schema/union-no-base.json (renamed from tests/qapi-schema/flat-union-no-base.json)2
-rw-r--r--tests/qapi-schema/union-no-base.out (renamed from tests/qapi-schema/flat-union-invalid-if-discriminator.out)0
-rw-r--r--tests/qapi-schema/union-optional-branch.err2
-rw-r--r--tests/qapi-schema/union-optional-branch.json2
-rw-r--r--tests/qapi-schema/union-optional-branch.out0
-rw-r--r--tests/qapi-schema/union-optional-discriminator.err2
-rw-r--r--tests/qapi-schema/union-optional-discriminator.json (renamed from tests/qapi-schema/flat-union-optional-discriminator.json)0
-rw-r--r--tests/qapi-schema/union-optional-discriminator.out (renamed from tests/qapi-schema/flat-union-no-base.out)0
-rw-r--r--tests/qapi-schema/union-string-discriminator.err2
-rw-r--r--tests/qapi-schema/union-string-discriminator.json (renamed from tests/qapi-schema/flat-union-string-discriminator.json)0
-rw-r--r--tests/qapi-schema/union-string-discriminator.out (renamed from tests/qapi-schema/flat-union-optional-discriminator.out)0
-rw-r--r--tests/qapi-schema/union-unknown.err2
-rw-r--r--tests/qapi-schema/union-unknown.json5
97 files changed, 158 insertions, 268 deletions
diff --git a/tests/qapi-schema/args-union.err b/tests/qapi-schema/args-union.err
index 4bf4955027..4b80a99f74 100644
--- a/tests/qapi-schema/args-union.err
+++ b/tests/qapi-schema/args-union.err
@@ -1,2 +1,2 @@
args-union.json: In command 'oops':
-args-union.json:3: command's 'data' can take union type 'Uni' only with 'boxed': true
+args-union.json:9: command's 'data' can take union type 'Uni' only with 'boxed': true
diff --git a/tests/qapi-schema/args-union.json b/tests/qapi-schema/args-union.json
index 2fcaeaae16..aabb159063 100644
--- a/tests/qapi-schema/args-union.json
+++ b/tests/qapi-schema/args-union.json
@@ -1,3 +1,9 @@
# use of union arguments requires 'boxed':true
-{ 'union': 'Uni', 'data': { 'case1': 'int', 'case2': 'str' } }
+{ 'enum': 'Enum', 'data': [ 'case1', 'case2' ] }
+{ 'struct': 'Case1', 'data': { 'data': 'int' } }
+{ 'struct': 'Case2', 'data': { 'data': 'str' } }
+{ 'union': 'Uni',
+ 'base': { 'type': 'Enum' },
+ 'discriminator': 'type',
+ 'data': { 'case1': 'Case1', 'case2': 'Case2' } }
{ 'command': 'oops', 'data': 'Uni' }
diff --git a/tests/qapi-schema/bad-base.err b/tests/qapi-schema/bad-base.err
index 61a1efc2c0..1fad63e392 100644
--- a/tests/qapi-schema/bad-base.err
+++ b/tests/qapi-schema/bad-base.err
@@ -1,2 +1,2 @@
bad-base.json: In struct 'MyType':
-bad-base.json:3: 'base' requires a struct type, union type 'Union' isn't
+bad-base.json:9: 'base' requires a struct type, union type 'Union' isn't
diff --git a/tests/qapi-schema/bad-base.json b/tests/qapi-schema/bad-base.json
index a634331cdd..8c773ff544 100644
--- a/tests/qapi-schema/bad-base.json
+++ b/tests/qapi-schema/bad-base.json
@@ -1,3 +1,9 @@
# we reject a base that is not a struct
-{ 'union': 'Union', 'data': { 'a': 'int', 'b': 'str' } }
+{ 'enum': 'Enum', 'data': [ 'a', 'b' ] }
+{ 'struct': 'Int', 'data': { 'data': 'int' } }
+{ 'struct': 'Str', 'data': { 'data': 'str' } }
+{ 'union': 'Union',
+ 'base': { 'type': 'Enum' },
+ 'discriminator': 'type',
+ 'data': { 'a': 'Int', 'b': 'Str' } }
{ 'struct': 'MyType', 'base': 'Union', 'data': { 'c': 'int' } }
diff --git a/tests/qapi-schema/doc-good.json b/tests/qapi-schema/doc-good.json
index e0027e4cf6..a20acffd8b 100644
--- a/tests/qapi-schema/doc-good.json
+++ b/tests/qapi-schema/doc-good.json
@@ -60,8 +60,8 @@
#
# @two is undocumented
##
-{ 'enum': 'Enum', 'data':
- [ { 'name': 'one', 'if': 'IFONE' }, 'two' ],
+{ 'enum': 'Enum',
+ 'data': [ { 'name': 'one', 'if': 'IFONE' }, 'two' ],
'features': [ 'enum-feat' ],
'if': 'IFCOND' }
@@ -108,15 +108,6 @@
'if': { 'any': ['IFONE', 'IFTWO'] } } } }
##
-# @SugaredUnion:
-# Features:
-# @union-feat2: a feature
-##
-{ 'union': 'SugaredUnion',
- 'features': [ 'union-feat2' ],
- 'data': { 'one': 'Variant1', 'two': { 'type': 'Variant2', 'if': 'IFTWO' } } }
-
-##
# @Alternate:
# @i: an integer
# @b is undocumented
diff --git a/tests/qapi-schema/doc-good.out b/tests/qapi-schema/doc-good.out
index 478fe6f82e..5a324e2627 100644
--- a/tests/qapi-schema/doc-good.out
+++ b/tests/qapi-schema/doc-good.out
@@ -32,21 +32,6 @@ object Object
case two: Variant2
if {'any': ['IFONE', 'IFTWO']}
feature union-feat1
-object q_obj_Variant1-wrapper
- member data: Variant1 optional=False
-object q_obj_Variant2-wrapper
- member data: Variant2 optional=False
-enum SugaredUnionKind
- member one
- member two
- if IFTWO
-object SugaredUnion
- member type: SugaredUnionKind optional=False
- tag type
- case one: q_obj_Variant1-wrapper
- case two: q_obj_Variant2-wrapper
- if IFTWO
- feature union-feat2
alternate Alternate
tag type
case i: int
@@ -149,13 +134,6 @@ doc symbol=Object
feature=union-feat1
a feature
-doc symbol=SugaredUnion
- body=
-
- arg=type
-
- feature=union-feat2
-a feature
doc symbol=Alternate
body=
diff --git a/tests/qapi-schema/doc-good.txt b/tests/qapi-schema/doc-good.txt
index 0c59d75964..701402ee5e 100644
--- a/tests/qapi-schema/doc-good.txt
+++ b/tests/qapi-schema/doc-good.txt
@@ -130,26 +130,6 @@ Features
a feature
-"SugaredUnion" (Object)
------------------------
-
-
-Members
-~~~~~~~
-
-"type"
- One of "one", "two"
-
-"data": "Variant1" when "type" is ""one""
-"data": "Variant2" when "type" is ""two"" (**If: **"IFTWO")
-
-Features
-~~~~~~~~
-
-"union-feat2"
- a feature
-
-
"Alternate" (Alternate)
-----------------------
diff --git a/tests/qapi-schema/enum-if-invalid.json b/tests/qapi-schema/enum-if-invalid.json
index 60bd0ef1d7..6bd20041f3 100644
--- a/tests/qapi-schema/enum-if-invalid.json
+++ b/tests/qapi-schema/enum-if-invalid.json
@@ -1,3 +1,3 @@
# check invalid 'if' type
-{ 'enum': 'TestIfEnum', 'data':
- [ 'foo', { 'name' : 'bar', 'if': { 'val': 'foo' } } ] }
+{ 'enum': 'TestIfEnum',
+ 'data': [ 'foo', { 'name' : 'bar', 'if': { 'val': 'foo' } } ] }
diff --git a/tests/qapi-schema/flat-union-array-branch.err b/tests/qapi-schema/flat-union-array-branch.err
deleted file mode 100644
index 20a8ef1406..0000000000
--- a/tests/qapi-schema/flat-union-array-branch.err
+++ /dev/null
@@ -1,2 +0,0 @@
-flat-union-array-branch.json: In union 'TestUnion':
-flat-union-array-branch.json:8: 'data' member 'value1' cannot be an array
diff --git a/tests/qapi-schema/flat-union-bad-base.err b/tests/qapi-schema/flat-union-bad-base.err
deleted file mode 100644
index e0a205a58c..0000000000
--- a/tests/qapi-schema/flat-union-bad-base.err
+++ /dev/null
@@ -1,2 +0,0 @@
-flat-union-bad-base.json: In union 'TestUnion':
-flat-union-bad-base.json:8: member 'string' of type 'TestTypeA' collides with base member 'string'
diff --git a/tests/qapi-schema/flat-union-bad-discriminator.err b/tests/qapi-schema/flat-union-bad-discriminator.err
deleted file mode 100644
index b705439bd9..0000000000
--- a/tests/qapi-schema/flat-union-bad-discriminator.err
+++ /dev/null
@@ -1,2 +0,0 @@
-flat-union-bad-discriminator.json: In union 'TestUnion':
-flat-union-bad-discriminator.json:11: 'discriminator' requires a string name
diff --git a/tests/qapi-schema/flat-union-base-any.err b/tests/qapi-schema/flat-union-base-any.err
deleted file mode 100644
index c2d4de6a5d..0000000000
--- a/tests/qapi-schema/flat-union-base-any.err
+++ /dev/null
@@ -1,2 +0,0 @@
-flat-union-base-any.json: In union 'TestUnion':
-flat-union-base-any.json:8: 'base' requires a struct type, built-in type 'any' isn't
diff --git a/tests/qapi-schema/flat-union-base-union.err b/tests/qapi-schema/flat-union-base-union.err
deleted file mode 100644
index 3b0087220e..0000000000
--- a/tests/qapi-schema/flat-union-base-union.err
+++ /dev/null
@@ -1,2 +0,0 @@
-flat-union-base-union.json: In union 'TestUnion':
-flat-union-base-union.json:14: 'base' requires a struct type, union type 'UnionBase' isn't
diff --git a/tests/qapi-schema/flat-union-clash-member.err b/tests/qapi-schema/flat-union-clash-member.err
deleted file mode 100644
index 07551e6ef5..0000000000
--- a/tests/qapi-schema/flat-union-clash-member.err
+++ /dev/null
@@ -1,2 +0,0 @@
-flat-union-clash-member.json: In union 'TestUnion':
-flat-union-clash-member.json:11: member 'name' of type 'Branch1' collides with member 'name' of type 'Base'
diff --git a/tests/qapi-schema/flat-union-discriminator-bad-name.err b/tests/qapi-schema/flat-union-discriminator-bad-name.err
deleted file mode 100644
index 28be49c31a..0000000000
--- a/tests/qapi-schema/flat-union-discriminator-bad-name.err
+++ /dev/null
@@ -1,2 +0,0 @@
-flat-union-discriminator-bad-name.json: In union 'MyUnion':
-flat-union-discriminator-bad-name.json:6: discriminator '*switch' is not a member of 'base'
diff --git a/tests/qapi-schema/flat-union-empty.err b/tests/qapi-schema/flat-union-empty.err
deleted file mode 100644
index 89b0f25cb0..0000000000
--- a/tests/qapi-schema/flat-union-empty.err
+++ /dev/null
@@ -1,2 +0,0 @@
-flat-union-empty.json: In union 'Union':
-flat-union-empty.json:4: union has no branches
diff --git a/tests/qapi-schema/flat-union-empty.json b/tests/qapi-schema/flat-union-empty.json
deleted file mode 100644
index 83e1cc7b96..0000000000
--- a/tests/qapi-schema/flat-union-empty.json
+++ /dev/null
@@ -1,4 +0,0 @@
-# flat union discriminator cannot be empty
-{ 'enum': 'Empty', 'data': [ ] }
-{ 'struct': 'Base', 'data': { 'type': 'Empty' } }
-{ 'union': 'Union', 'base': 'Base', 'discriminator': 'type', 'data': { } }
diff --git a/tests/qapi-schema/flat-union-inline-invalid-dict.err b/tests/qapi-schema/flat-union-inline-invalid-dict.err
deleted file mode 100644
index 53e5416707..0000000000
--- a/tests/qapi-schema/flat-union-inline-invalid-dict.err
+++ /dev/null
@@ -1,2 +0,0 @@
-flat-union-inline-invalid-dict.json: In union 'TestUnion':
-flat-union-inline-invalid-dict.json:7: 'data' member 'value1' misses key 'type'
diff --git a/tests/qapi-schema/flat-union-int-branch.err b/tests/qapi-schema/flat-union-int-branch.err
deleted file mode 100644
index ae7f800603..0000000000
--- a/tests/qapi-schema/flat-union-int-branch.err
+++ /dev/null
@@ -1,2 +0,0 @@
-flat-union-int-branch.json: In union 'TestUnion':
-flat-union-int-branch.json:8: branch 'value1' cannot use built-in type 'int'
diff --git a/tests/qapi-schema/flat-union-invalid-branch-key.err b/tests/qapi-schema/flat-union-invalid-branch-key.err
deleted file mode 100644
index 5576a25f9b..0000000000
--- a/tests/qapi-schema/flat-union-invalid-branch-key.err
+++ /dev/null
@@ -1,2 +0,0 @@
-flat-union-invalid-branch-key.json: In union 'TestUnion':
-flat-union-invalid-branch-key.json:13: branch 'value_wrong' is not a value of enum type 'TestEnum'
diff --git a/tests/qapi-schema/flat-union-invalid-discriminator.err b/tests/qapi-schema/flat-union-invalid-discriminator.err
deleted file mode 100644
index 99bca2ddab..0000000000
--- a/tests/qapi-schema/flat-union-invalid-discriminator.err
+++ /dev/null
@@ -1,2 +0,0 @@
-flat-union-invalid-discriminator.json: In union 'TestUnion':
-flat-union-invalid-discriminator.json:10: discriminator 'enum_wrong' is not a member of 'base'
diff --git a/tests/qapi-schema/flat-union-invalid-if-discriminator.err b/tests/qapi-schema/flat-union-invalid-if-discriminator.err
deleted file mode 100644
index 350f28da9d..0000000000
--- a/tests/qapi-schema/flat-union-invalid-if-discriminator.err
+++ /dev/null
@@ -1,2 +0,0 @@
-flat-union-invalid-if-discriminator.json: In union 'TestUnion':
-flat-union-invalid-if-discriminator.json:10: discriminator member 'enum1' of 'base' must not be conditional
diff --git a/tests/qapi-schema/flat-union-no-base.err b/tests/qapi-schema/flat-union-no-base.err
deleted file mode 100644
index 5167565b00..0000000000
--- a/tests/qapi-schema/flat-union-no-base.err
+++ /dev/null
@@ -1,2 +0,0 @@
-flat-union-no-base.json: In union 'TestUnion':
-flat-union-no-base.json:8: 'discriminator' requires 'base'
diff --git a/tests/qapi-schema/flat-union-optional-discriminator.err b/tests/qapi-schema/flat-union-optional-discriminator.err
deleted file mode 100644
index 3d60a1b496..0000000000
--- a/tests/qapi-schema/flat-union-optional-discriminator.err
+++ /dev/null
@@ -1,2 +0,0 @@
-flat-union-optional-discriminator.json: In union 'MyUnion':
-flat-union-optional-discriminator.json:6: discriminator member 'switch' of base type 'Base' must not be optional
diff --git a/tests/qapi-schema/flat-union-string-discriminator.err b/tests/qapi-schema/flat-union-string-discriminator.err
deleted file mode 100644
index ff42c9728b..0000000000
--- a/tests/qapi-schema/flat-union-string-discriminator.err
+++ /dev/null
@@ -1,2 +0,0 @@
-flat-union-string-discriminator.json: In union 'TestUnion':
-flat-union-string-discriminator.json:13: discriminator member 'kind' of base type 'TestBase' must be of enum type
diff --git a/tests/qapi-schema/flat-union-string-discriminator.out b/tests/qapi-schema/flat-union-string-discriminator.out
deleted file mode 100644
index e69de29bb2..0000000000
--- a/tests/qapi-schema/flat-union-string-discriminator.out
+++ /dev/null
diff --git a/tests/qapi-schema/meson.build b/tests/qapi-schema/meson.build
index 6b2a4ce41a..6187efbd58 100644
--- a/tests/qapi-schema/meson.build
+++ b/tests/qapi-schema/meson.build
@@ -107,22 +107,6 @@ schemas = [
'features-name-bad-type.json',
'features-no-list.json',
'features-unknown-key.json',
- 'flat-union-array-branch.json',
- 'flat-union-bad-base.json',
- 'flat-union-bad-discriminator.json',
- 'flat-union-base-any.json',
- 'flat-union-base-union.json',
- 'flat-union-clash-member.json',
- 'flat-union-discriminator-bad-name.json',
- 'flat-union-empty.json',
- 'flat-union-inline-invalid-dict.json',
- 'flat-union-int-branch.json',
- 'flat-union-invalid-branch-key.json',
- 'flat-union-invalid-discriminator.json',
- 'flat-union-invalid-if-discriminator.json',
- 'flat-union-no-base.json',
- 'flat-union-optional-discriminator.json',
- 'flat-union-string-discriminator.json',
'funny-char.json',
'funny-word.json',
'ident-with-escape.json',
@@ -168,7 +152,6 @@ schemas = [
'reserved-member-q.json',
'reserved-member-u.json',
'reserved-member-underscore.json',
- 'reserved-type-kind.json',
'reserved-type-list.json',
'returns-alternate.json',
'returns-array-bad.json',
@@ -191,16 +174,28 @@ schemas = [
'unclosed-list.json',
'unclosed-object.json',
'unclosed-string.json',
+ 'union-array-branch.json',
+ 'union-bad-base.json',
+ 'union-bad-discriminator.json',
+ 'union-base-any.json',
'union-base-empty.json',
'union-base-no-discriminator.json',
- 'union-branch-case.json',
+ 'union-base-union.json',
'union-branch-if-invalid.json',
'union-branch-invalid-dict.json',
- 'union-clash-branches.json',
+ 'union-clash-member.json',
+ 'union-discriminator-bad-name.json',
'union-empty.json',
+ 'union-inline-invalid-dict.json',
+ 'union-int-branch.json',
'union-invalid-base.json',
+ 'union-invalid-branch-key.json',
'union-invalid-data.json',
- 'union-optional-branch.json',
+ 'union-invalid-discriminator.json',
+ 'union-invalid-if-discriminator.json',
+ 'union-no-base.json',
+ 'union-optional-discriminator.json',
+ 'union-string-discriminator.json',
'union-unknown.json',
'unknown-escape.json',
'unknown-expr-key.json',
diff --git a/tests/qapi-schema/qapi-schema-test.json b/tests/qapi-schema/qapi-schema-test.json
index b6c36a9eee..2ec50109cb 100644
--- a/tests/qapi-schema/qapi-schema-test.json
+++ b/tests/qapi-schema/qapi-schema-test.json
@@ -30,7 +30,7 @@
{ 'struct': 'Empty1', 'data': { } }
{ 'struct': 'Empty2', 'base': 'Empty1', 'data': { } }
-# Likewise for an empty flat union
+# Likewise for an empty union
{ 'union': 'Union',
'base': { 'type': 'EnumOne' }, 'discriminator': 'type',
'data': { } }
@@ -123,8 +123,7 @@
# for testing use of 'str' within alternates
{ 'alternate': 'AltStrObj', 'data': { 's': 'str', 'o': 'TestStruct' } }
-# for testing lists
-{ 'union': 'UserDefListUnion',
+{ 'struct': 'ArrayStruct',
'data': { 'integer': ['int'],
's8': ['int8'],
's16': ['int16'],
@@ -137,9 +136,9 @@
'number': ['number'],
'boolean': ['bool'],
'string': ['str'],
- 'sizes': ['size'],
- 'any': ['any'],
- 'user': ['Status'] } } # intentional forward ref. to sub-module
+ '*sz': ['size'],
+ '*any': ['any'],
+ '*user': ['Status'] } } # intentional forward ref. to sub-module
# for testing sub-modules
{ 'include': 'include/sub-module.json' }
@@ -159,7 +158,7 @@
'returns': 'int' }
{ 'command': 'guest-sync', 'data': { 'arg': 'any' }, 'returns': 'any' }
{ 'command': 'boxed-struct', 'boxed': true, 'data': 'UserDefZero' }
-{ 'command': 'boxed-union', 'data': 'UserDefListUnion', 'boxed': true }
+{ 'command': 'boxed-union', 'data': 'UserDefFlatUnion', 'boxed': true }
{ 'command': 'boxed-empty', 'boxed': true, 'data': 'Empty1' }
# Smoke test on out-of-band and allow-preconfig-test
@@ -203,11 +202,10 @@
'data': { '__org.qemu_x-member1': '__org.qemu_x-Enum' } }
{ 'struct': '__org.qemu_x-Struct', 'base': '__org.qemu_x-Base',
'data': { '__org.qemu_x-member2': 'str', '*wchar-t': 'int' } }
-{ 'union': '__org.qemu_x-Union1', 'data': { '__org.qemu_x-branch': 'str' } }
{ 'alternate': '__org.qemu_x-Alt1', 'data': { '__org.qemu_x-branch': 'str' } }
{ 'struct': '__org.qemu_x-Struct2',
- 'data': { 'array': ['__org.qemu_x-Union1'] } }
-{ 'union': '__org.qemu_x-Union2', 'base': '__org.qemu_x-Base',
+ 'data': { 'array': ['__org.qemu_x-Union'] } }
+{ 'union': '__org.qemu_x-Union', 'base': '__org.qemu_x-Base',
'discriminator': '__org.qemu_x-member1',
'data': { '__org.qemu_x-value': '__org.qemu_x-Struct2' } }
{ 'alternate': '__org.qemu_x-Alt',
@@ -215,32 +213,33 @@
{ 'event': '__ORG.QEMU_X-EVENT', 'data': '__org.qemu_x-Struct' }
{ 'command': '__org.qemu_x-command',
'data': { 'a': ['__org.qemu_x-Enum'], 'b': ['__org.qemu_x-Struct'],
- 'c': '__org.qemu_x-Union2', 'd': '__org.qemu_x-Alt' },
- 'returns': '__org.qemu_x-Union1' }
+ 'c': '__org.qemu_x-Union', 'd': '__org.qemu_x-Alt' } }
# test 'if' condition handling
-{ 'struct': 'TestIfStruct', 'data':
- { 'foo': 'int',
- 'bar': { 'type': 'int', 'if': 'TEST_IF_STRUCT_BAR'} },
+{ 'struct': 'TestIfStruct',
+ 'data': { 'foo': 'int',
+ 'bar': { 'type': 'int', 'if': 'TEST_IF_STRUCT_BAR'} },
'if': 'TEST_IF_STRUCT' }
-{ 'enum': 'TestIfEnum', 'data':
- [ 'foo', { 'name' : 'bar', 'if': 'TEST_IF_ENUM_BAR' } ],
+{ 'enum': 'TestIfEnum',
+ 'data': [ 'foo', { 'name' : 'bar', 'if': 'TEST_IF_ENUM_BAR' } ],
'if': 'TEST_IF_ENUM' }
-{ 'union': 'TestIfUnion', 'data':
- { 'foo': 'TestStruct',
- 'bar': { 'type': 'str', 'if': 'TEST_IF_UNION_BAR'} },
+{ 'union': 'TestIfUnion',
+ 'base': { 'type': 'TestIfEnum' },
+ 'discriminator': 'type',
+ 'data': { 'foo': 'TestStruct',
+ 'bar': { 'type': 'UserDefZero', 'if': 'TEST_IF_ENUM_BAR'} },
'if': { 'all': ['TEST_IF_UNION', 'TEST_IF_STRUCT'] } }
{ 'command': 'test-if-union-cmd',
'data': { 'union-cmd-arg': 'TestIfUnion' },
'if': { 'all': ['TEST_IF_UNION', 'TEST_IF_STRUCT'] } }
-{ 'alternate': 'TestIfAlternate', 'data':
- { 'foo': 'int',
- 'bar': { 'type': 'TestStruct', 'if': 'TEST_IF_ALT_BAR'} },
+{ 'alternate': 'TestIfAlternate',
+ 'data': { 'foo': 'int',
+ 'bar': { 'type': 'TestStruct', 'if': 'TEST_IF_ALT_BAR'} },
'if': { 'all': ['TEST_IF_ALT', 'TEST_IF_STRUCT'] } }
{ 'command': 'test-if-alternate-cmd',
@@ -256,9 +255,9 @@
{ 'command': 'test-cmd-return-def-three', 'returns': 'UserDefThree' }
-{ 'event': 'TEST_IF_EVENT', 'data':
- { 'foo': 'TestIfStruct',
- 'bar': { 'type': ['TestIfEnum'], 'if': 'TEST_IF_EVT_BAR' } },
+{ 'event': 'TEST_IF_EVENT',
+ 'data': { 'foo': 'TestIfStruct',
+ 'bar': { 'type': ['TestIfEnum'], 'if': 'TEST_IF_EVT_BAR' } },
'if': { 'all': ['TEST_IF_EVT', 'TEST_IF_STRUCT'] } }
{ 'event': 'TEST_IF_EVENT2', 'data': {},
diff --git a/tests/qapi-schema/qapi-schema-test.out b/tests/qapi-schema/qapi-schema-test.out
index d557fe2d89..9337adc9ea 100644
--- a/tests/qapi-schema/qapi-schema-test.out
+++ b/tests/qapi-schema/qapi-schema-test.out
@@ -125,70 +125,22 @@ alternate AltStrObj
tag type
case s: str
case o: TestStruct
-object q_obj_intList-wrapper
- member data: intList optional=False
-object q_obj_int8List-wrapper
- member data: int8List optional=False
-object q_obj_int16List-wrapper
- member data: int16List optional=False
-object q_obj_int32List-wrapper
- member data: int32List optional=False
-object q_obj_int64List-wrapper
- member data: int64List optional=False
-object q_obj_uint8List-wrapper
- member data: uint8List optional=False
-object q_obj_uint16List-wrapper
- member data: uint16List optional=False
-object q_obj_uint32List-wrapper
- member data: uint32List optional=False
-object q_obj_uint64List-wrapper
- member data: uint64List optional=False
-object q_obj_numberList-wrapper
- member data: numberList optional=False
-object q_obj_boolList-wrapper
- member data: boolList optional=False
-object q_obj_strList-wrapper
- member data: strList optional=False
-object q_obj_sizeList-wrapper
- member data: sizeList optional=False
-object q_obj_anyList-wrapper
- member data: anyList optional=False
-object q_obj_StatusList-wrapper
- member data: StatusList optional=False
-enum UserDefListUnionKind
- member integer
- member s8
- member s16
- member s32
- member s64
- member u8
- member u16
- member u32
- member u64
- member number
- member boolean
- member string
- member sizes
- member any
- member user
-object UserDefListUnion
- member type: UserDefListUnionKind optional=False
- tag type
- case integer: q_obj_intList-wrapper
- case s8: q_obj_int8List-wrapper
- case s16: q_obj_int16List-wrapper
- case s32: q_obj_int32List-wrapper
- case s64: q_obj_int64List-wrapper
- case u8: q_obj_uint8List-wrapper
- case u16: q_obj_uint16List-wrapper
- case u32: q_obj_uint32List-wrapper
- case u64: q_obj_uint64List-wrapper
- case number: q_obj_numberList-wrapper
- case boolean: q_obj_boolList-wrapper
- case string: q_obj_strList-wrapper
- case sizes: q_obj_sizeList-wrapper
- case any: q_obj_anyList-wrapper
- case user: q_obj_StatusList-wrapper
+object ArrayStruct
+ member integer: intList optional=False
+ member s8: int8List optional=False
+ member s16: int16List optional=False
+ member s32: int32List optional=False
+ member s64: int64List optional=False
+ member u8: uint8List optional=False
+ member u16: uint16List optional=False
+ member u32: uint32List optional=False
+ member u64: uint64List optional=False
+ member number: numberList optional=False
+ member boolean: boolList optional=False
+ member string: strList optional=False
+ member sz: sizeList optional=True
+ member any: anyList optional=True
+ member user: StatusList optional=True
include include/sub-module.json
command user-def-cmd None -> None
gen=True success_response=True boxed=False oob=False preconfig=False
@@ -216,7 +168,7 @@ command guest-sync q_obj_guest-sync-arg -> any
gen=True success_response=True boxed=False oob=False preconfig=False
command boxed-struct UserDefZero -> None
gen=True success_response=True boxed=True oob=False preconfig=False
-command boxed-union UserDefListUnion -> None
+command boxed-union UserDefFlatUnion -> None
gen=True success_response=True boxed=True oob=False preconfig=False
command boxed-empty Empty1 -> None
gen=True success_response=True boxed=True oob=False preconfig=False
@@ -263,21 +215,13 @@ object __org.qemu_x-Struct
base __org.qemu_x-Base
member __org.qemu_x-member2: str optional=False
member wchar-t: int optional=True
-object q_obj_str-wrapper
- member data: str optional=False
-enum __org.qemu_x-Union1Kind
- member __org.qemu_x-branch
-object __org.qemu_x-Union1
- member type: __org.qemu_x-Union1Kind optional=False
- tag type
- case __org.qemu_x-branch: q_obj_str-wrapper
alternate __org.qemu_x-Alt1
tag type
case __org.qemu_x-branch: str
-array __org.qemu_x-Union1List __org.qemu_x-Union1
+array __org.qemu_x-UnionList __org.qemu_x-Union
object __org.qemu_x-Struct2
- member array: __org.qemu_x-Union1List optional=False
-object __org.qemu_x-Union2
+ member array: __org.qemu_x-UnionList optional=False
+object __org.qemu_x-Union
base __org.qemu_x-Base
tag __org.qemu_x-member1
case __org.qemu_x-value: __org.qemu_x-Struct2
@@ -291,9 +235,9 @@ array __org.qemu_x-StructList __org.qemu_x-Struct
object q_obj___org.qemu_x-command-arg
member a: __org.qemu_x-EnumList optional=False
member b: __org.qemu_x-StructList optional=False
- member c: __org.qemu_x-Union2 optional=False
+ member c: __org.qemu_x-Union optional=False
member d: __org.qemu_x-Alt optional=False
-command __org.qemu_x-command q_obj___org.qemu_x-command-arg -> __org.qemu_x-Union1
+command __org.qemu_x-command q_obj___org.qemu_x-command-arg -> None
gen=True success_response=True boxed=False oob=False preconfig=False
object TestIfStruct
member foo: int optional=False
@@ -305,19 +249,15 @@ enum TestIfEnum
member bar
if TEST_IF_ENUM_BAR
if TEST_IF_ENUM
-object q_obj_TestStruct-wrapper
- member data: TestStruct optional=False
-enum TestIfUnionKind
- member foo
- member bar
- if TEST_IF_UNION_BAR
+object q_obj_TestIfUnion-base
+ member type: TestIfEnum optional=False
if {'all': ['TEST_IF_UNION', 'TEST_IF_STRUCT']}
object TestIfUnion
- member type: TestIfUnionKind optional=False
+ base q_obj_TestIfUnion-base
tag type
- case foo: q_obj_TestStruct-wrapper
- case bar: q_obj_str-wrapper
- if TEST_IF_UNION_BAR
+ case foo: TestStruct
+ case bar: UserDefZero
+ if TEST_IF_ENUM_BAR
if {'all': ['TEST_IF_UNION', 'TEST_IF_STRUCT']}
object q_obj_test-if-union-cmd-arg
member union-cmd-arg: TestIfUnion optional=False
diff --git a/tests/qapi-schema/reserved-member-u.json b/tests/qapi-schema/reserved-member-u.json
index 2bfb8f59b6..d982ab5e0c 100644
--- a/tests/qapi-schema/reserved-member-u.json
+++ b/tests/qapi-schema/reserved-member-u.json
@@ -2,6 +2,6 @@
# We reject use of 'u' as a member name, to allow it for internal use in
# putting union branch members in a separate namespace from QMP members.
# This is true even for non-unions, because it is possible to convert a
-# struct to flat union while remaining backwards compatible in QMP.
+# struct to union while remaining backwards compatible in QMP.
# TODO - we could munge the member name to 'q_u' to avoid the collision
{ 'struct': 'Oops', 'data': { '*u': 'str' } }
diff --git a/tests/qapi-schema/reserved-type-kind.err b/tests/qapi-schema/reserved-type-kind.err
deleted file mode 100644
index d8fb769f9d..0000000000
--- a/tests/qapi-schema/reserved-type-kind.err
+++ /dev/null
@@ -1,2 +0,0 @@
-reserved-type-kind.json: In enum 'UnionKind':
-reserved-type-kind.json:2: enum name should not end in 'Kind'
diff --git a/tests/qapi-schema/reserved-type-kind.json b/tests/qapi-schema/reserved-type-kind.json
deleted file mode 100644
index 9ecaba12bc..0000000000
--- a/tests/qapi-schema/reserved-type-kind.json
+++ /dev/null
@@ -1,2 +0,0 @@
-# we reject types that would conflict with implicit union enum
-{ 'enum': 'UnionKind', 'data': [ 'oops' ] }
diff --git a/tests/qapi-schema/reserved-type-kind.out b/tests/qapi-schema/reserved-type-kind.out
deleted file mode 100644
index e69de29bb2..0000000000
--- a/tests/qapi-schema/reserved-type-kind.out
+++ /dev/null
diff --git a/tests/qapi-schema/test-qapi.py b/tests/qapi-schema/test-qapi.py
index 73cffae2b6..c717a7a90b 100755
--- a/tests/qapi-schema/test-qapi.py
+++ b/tests/qapi-schema/test-qapi.py
@@ -132,6 +132,17 @@ def test_frontend(fname):
print(' section=%s\n%s' % (section.name, section.text))
+def open_test_result(dir_name, file_name, update):
+ mode = 'r+' if update else 'r'
+ try:
+ fp = open(os.path.join(dir_name, file_name), mode)
+ except FileNotFoundError:
+ if not update:
+ raise
+ fp = open(os.path.join(dir_name, file_name), 'w+')
+ return fp
+
+
def test_and_diff(test_name, dir_name, update):
sys.stdout = StringIO()
try:
@@ -148,13 +159,12 @@ def test_and_diff(test_name, dir_name, update):
sys.stdout.close()
sys.stdout = sys.__stdout__
- mode = 'r+' if update else 'r'
try:
- outfp = open(os.path.join(dir_name, test_name + '.out'), mode)
- errfp = open(os.path.join(dir_name, test_name + '.err'), mode)
+ outfp = open_test_result(dir_name, test_name + '.out', update)
+ errfp = open_test_result(dir_name, test_name + '.err', update)
expected_out = outfp.readlines()
expected_err = errfp.readlines()
- except IOError as err:
+ except OSError as err:
print("%s: can't open '%s': %s"
% (sys.argv[0], err.filename, err.strerror),
file=sys.stderr)
@@ -180,7 +190,7 @@ def test_and_diff(test_name, dir_name, update):
errfp.truncate(0)
errfp.seek(0)
errfp.writelines(actual_err)
- except IOError as err:
+ except OSError as err:
print("%s: can't write '%s': %s"
% (sys.argv[0], err.filename, err.strerror),
file=sys.stderr)
diff --git a/tests/qapi-schema/union-array-branch.err b/tests/qapi-schema/union-array-branch.err
new file mode 100644
index 0000000000..5db9c17481
--- /dev/null
+++ b/tests/qapi-schema/union-array-branch.err
@@ -0,0 +1,2 @@
+union-array-branch.json: In union 'TestUnion':
+union-array-branch.json:8: 'data' member 'value1' cannot be an array
diff --git a/tests/qapi-schema/flat-union-array-branch.json b/tests/qapi-schema/union-array-branch.json
index 0b98820a8f..6dda7ec379 100644
--- a/tests/qapi-schema/flat-union-array-branch.json
+++ b/tests/qapi-schema/union-array-branch.json
@@ -1,4 +1,4 @@
-# we require flat union branches to be a struct
+# we require union branches to be a struct
{ 'enum': 'TestEnum',
'data': [ 'value1', 'value2' ] }
{ 'struct': 'Base',
diff --git a/tests/qapi-schema/flat-union-array-branch.out b/tests/qapi-schema/union-array-branch.out
index e69de29bb2..e69de29bb2 100644
--- a/tests/qapi-schema/flat-union-array-branch.out
+++ b/tests/qapi-schema/union-array-branch.out
diff --git a/tests/qapi-schema/union-bad-base.err b/tests/qapi-schema/union-bad-base.err
new file mode 100644
index 0000000000..42b2ed1dda
--- /dev/null
+++ b/tests/qapi-schema/union-bad-base.err
@@ -0,0 +1,2 @@
+union-bad-base.json: In union 'TestUnion':
+union-bad-base.json:8: member 'string' of type 'TestTypeA' collides with base member 'string'
diff --git a/tests/qapi-schema/flat-union-bad-base.json b/tests/qapi-schema/union-bad-base.json
index 74dd421708..74dd421708 100644
--- a/tests/qapi-schema/flat-union-bad-base.json
+++ b/tests/qapi-schema/union-bad-base.json
diff --git a/tests/qapi-schema/flat-union-bad-base.out b/tests/qapi-schema/union-bad-base.out
index e69de29bb2..e69de29bb2 100644
--- a/tests/qapi-schema/flat-union-bad-base.out
+++ b/tests/qapi-schema/union-bad-base.out
diff --git a/tests/qapi-schema/union-bad-discriminator.err b/tests/qapi-schema/union-bad-discriminator.err
new file mode 100644
index 0000000000..7cfd470f58
--- /dev/null
+++ b/tests/qapi-schema/union-bad-discriminator.err
@@ -0,0 +1,2 @@
+union-bad-discriminator.json: In union 'TestUnion':
+union-bad-discriminator.json:11: 'discriminator' requires a string name
diff --git a/tests/qapi-schema/flat-union-bad-discriminator.json b/tests/qapi-schema/union-bad-discriminator.json
index cd10b9d901..cd10b9d901 100644
--- a/tests/qapi-schema/flat-union-bad-discriminator.json
+++ b/tests/qapi-schema/union-bad-discriminator.json
diff --git a/tests/qapi-schema/flat-union-bad-discriminator.out b/tests/qapi-schema/union-bad-discriminator.out
index e69de29bb2..e69de29bb2 100644
--- a/tests/qapi-schema/flat-union-bad-discriminator.out
+++ b/tests/qapi-schema/union-bad-discriminator.out
diff --git a/tests/qapi-schema/union-base-any.err b/tests/qapi-schema/union-base-any.err
new file mode 100644
index 0000000000..82b48bc1c8
--- /dev/null
+++ b/tests/qapi-schema/union-base-any.err
@@ -0,0 +1,2 @@
+union-base-any.json: In union 'TestUnion':
+union-base-any.json:8: 'base' requires a struct type, built-in type 'any' isn't
diff --git a/tests/qapi-schema/flat-union-base-any.json b/tests/qapi-schema/union-base-any.json
index fe66b713ef..fe66b713ef 100644
--- a/tests/qapi-schema/flat-union-base-any.json
+++ b/tests/qapi-schema/union-base-any.json
diff --git a/tests/qapi-schema/flat-union-base-any.out b/tests/qapi-schema/union-base-any.out
index e69de29bb2..e69de29bb2 100644
--- a/tests/qapi-schema/flat-union-base-any.out
+++ b/tests/qapi-schema/union-base-any.out
diff --git a/tests/qapi-schema/union-base-empty.json b/tests/qapi-schema/union-base-empty.json
index d1843d33b4..6f8ef000db 100644
--- a/tests/qapi-schema/union-base-empty.json
+++ b/tests/qapi-schema/union-base-empty.json
@@ -1,4 +1,4 @@
-# Flat union with empty base and therefore without discriminator
+# Union with empty base and therefore without discriminator
{ 'struct': 'Empty', 'data': { } }
diff --git a/tests/qapi-schema/union-base-no-discriminator.err b/tests/qapi-schema/union-base-no-discriminator.err
index 9cd5d11b0b..a730b7fd3c 100644
--- a/tests/qapi-schema/union-base-no-discriminator.err
+++ b/tests/qapi-schema/union-base-no-discriminator.err
@@ -1,2 +1,2 @@
union-base-no-discriminator.json: In union 'TestUnion':
-union-base-no-discriminator.json:11: 'base' requires 'discriminator'
+union-base-no-discriminator.json:11: union misses key 'discriminator'
diff --git a/tests/qapi-schema/union-base-no-discriminator.json b/tests/qapi-schema/union-base-no-discriminator.json
index 1409cf5c9e..2e7cae9b22 100644
--- a/tests/qapi-schema/union-base-no-discriminator.json
+++ b/tests/qapi-schema/union-base-no-discriminator.json
@@ -1,4 +1,4 @@
-# we reject simple unions with a base (or flat unions without discriminator)
+# we reject unions without discriminator
{ 'struct': 'TestTypeA',
'data': { 'string': 'str' } }
diff --git a/tests/qapi-schema/union-base-union.err b/tests/qapi-schema/union-base-union.err
new file mode 100644
index 0000000000..2bddaf6a84
--- /dev/null
+++ b/tests/qapi-schema/union-base-union.err
@@ -0,0 +1,2 @@
+union-base-union.json: In union 'TestUnion':
+union-base-union.json:17: 'base' requires a struct type, union type 'UnionBase' isn't
diff --git a/tests/qapi-schema/flat-union-base-union.json b/tests/qapi-schema/union-base-union.json
index 98b4eba181..82d4c96e57 100644
--- a/tests/qapi-schema/flat-union-base-union.json
+++ b/tests/qapi-schema/union-base-union.json
@@ -8,7 +8,10 @@
'data': { 'string': 'str' } }
{ 'struct': 'TestTypeB',
'data': { 'integer': 'int' } }
+{ 'enum': 'Enum', 'data': [ 'kind1', 'kind2' ] }
{ 'union': 'UnionBase',
+ 'base': { 'type': 'Enum' },
+ 'discriminator': 'type',
'data': { 'kind1': 'TestTypeA',
'kind2': 'TestTypeB' } }
{ 'union': 'TestUnion',
diff --git a/tests/qapi-schema/flat-union-base-union.out b/tests/qapi-schema/union-base-union.out
index e69de29bb2..e69de29bb2 100644
--- a/tests/qapi-schema/flat-union-base-union.out
+++ b/tests/qapi-schema/union-base-union.out
diff --git a/tests/qapi-schema/union-branch-case.err b/tests/qapi-schema/union-branch-case.err
deleted file mode 100644
index d2d5cb8993..0000000000
--- a/tests/qapi-schema/union-branch-case.err
+++ /dev/null
@@ -1,2 +0,0 @@
-union-branch-case.json: In union 'Uni':
-union-branch-case.json:2: name of 'data' member 'Branch' must not use uppercase or '_'
diff --git a/tests/qapi-schema/union-branch-case.json b/tests/qapi-schema/union-branch-case.json
deleted file mode 100644
index b7894b75d6..0000000000
--- a/tests/qapi-schema/union-branch-case.json
+++ /dev/null
@@ -1,2 +0,0 @@
-# Branch names should be 'lower-case'
-{ 'union': 'Uni', 'data': { 'Branch': 'int' } }
diff --git a/tests/qapi-schema/union-branch-case.out b/tests/qapi-schema/union-branch-case.out
deleted file mode 100644
index e69de29bb2..0000000000
--- a/tests/qapi-schema/union-branch-case.out
+++ /dev/null
diff --git a/tests/qapi-schema/union-branch-invalid-dict.err b/tests/qapi-schema/union-branch-invalid-dict.err
index 8137c5a767..001cdec069 100644
--- a/tests/qapi-schema/union-branch-invalid-dict.err
+++ b/tests/qapi-schema/union-branch-invalid-dict.err
@@ -1,2 +1,2 @@
union-branch-invalid-dict.json: In union 'UnionInvalidBranch':
-union-branch-invalid-dict.json:2: 'data' member 'integer' misses key 'type'
+union-branch-invalid-dict.json:4: 'data' member 'integer' misses key 'type'
diff --git a/tests/qapi-schema/union-branch-invalid-dict.json b/tests/qapi-schema/union-branch-invalid-dict.json
index 9778598dbd..c7c81c0e00 100644
--- a/tests/qapi-schema/union-branch-invalid-dict.json
+++ b/tests/qapi-schema/union-branch-invalid-dict.json
@@ -1,4 +1,8 @@
# Long form of member must have a value member 'type'
+{ 'enum': 'TestEnum',
+ 'data': [ 'integer', 's8' ] }
{ 'union': 'UnionInvalidBranch',
+ 'base': { 'type': 'TestEnum' },
+ 'discriminator': 'type',
'data': { 'integer': { 'if': 'foo'},
's8': 'int8' } }
diff --git a/tests/qapi-schema/union-clash-branches.err b/tests/qapi-schema/union-clash-branches.err
deleted file mode 100644
index ef53645728..0000000000
--- a/tests/qapi-schema/union-clash-branches.err
+++ /dev/null
@@ -1,2 +0,0 @@
-union-clash-branches.json: In union 'TestUnion':
-union-clash-branches.json:6: name of 'data' member 'a_b' must not use uppercase or '_'
diff --git a/tests/qapi-schema/union-clash-branches.json b/tests/qapi-schema/union-clash-branches.json
deleted file mode 100644
index 7bdda0b0da..0000000000
--- a/tests/qapi-schema/union-clash-branches.json
+++ /dev/null
@@ -1,7 +0,0 @@
-# Union branch name collision
-# Naming rules make collision impossible (even with the pragma). If
-# that wasn't the case, then we'd get collisions in generated C: two
-# union members a_b, and two enum members TEST_UNION_A_B.
-{ 'pragma': { 'member-name-exceptions': [ 'TestUnion' ] } }
-{ 'union': 'TestUnion',
- 'data': { 'a-b': 'int', 'a_b': 'str' } }
diff --git a/tests/qapi-schema/union-clash-branches.out b/tests/qapi-schema/union-clash-branches.out
deleted file mode 100644
index e69de29bb2..0000000000
--- a/tests/qapi-schema/union-clash-branches.out
+++ /dev/null
diff --git a/tests/qapi-schema/union-clash-member.err b/tests/qapi-schema/union-clash-member.err
new file mode 100644
index 0000000000..c1f3a02552
--- /dev/null
+++ b/tests/qapi-schema/union-clash-member.err
@@ -0,0 +1,2 @@
+union-clash-member.json: In union 'TestUnion':
+union-clash-member.json:11: member 'name' of type 'Branch1' collides with member 'name' of type 'Base'
diff --git a/tests/qapi-schema/flat-union-clash-member.json b/tests/qapi-schema/union-clash-member.json
index 9efc7719b8..9efc7719b8 100644
--- a/tests/qapi-schema/flat-union-clash-member.json
+++ b/tests/qapi-schema/union-clash-member.json
diff --git a/tests/qapi-schema/flat-union-clash-member.out b/tests/qapi-schema/union-clash-member.out
index e69de29bb2..e69de29bb2 100644
--- a/tests/qapi-schema/flat-union-clash-member.out
+++ b/tests/qapi-schema/union-clash-member.out
diff --git a/tests/qapi-schema/union-discriminator-bad-name.err b/tests/qapi-schema/union-discriminator-bad-name.err
new file mode 100644
index 0000000000..5793e9af66
--- /dev/null
+++ b/tests/qapi-schema/union-discriminator-bad-name.err
@@ -0,0 +1,2 @@
+union-discriminator-bad-name.json: In union 'MyUnion':
+union-discriminator-bad-name.json:6: discriminator '*switch' is not a member of 'base'
diff --git a/tests/qapi-schema/flat-union-discriminator-bad-name.json b/tests/qapi-schema/union-discriminator-bad-name.json
index 3ae8c06a89..3ae8c06a89 100644
--- a/tests/qapi-schema/flat-union-discriminator-bad-name.json
+++ b/tests/qapi-schema/union-discriminator-bad-name.json
diff --git a/tests/qapi-schema/flat-union-discriminator-bad-name.out b/tests/qapi-schema/union-discriminator-bad-name.out
index e69de29bb2..e69de29bb2 100644
--- a/tests/qapi-schema/flat-union-discriminator-bad-name.out
+++ b/tests/qapi-schema/union-discriminator-bad-name.out
diff --git a/tests/qapi-schema/union-empty.err b/tests/qapi-schema/union-empty.err
index 59788c94ce..d428439962 100644
--- a/tests/qapi-schema/union-empty.err
+++ b/tests/qapi-schema/union-empty.err
@@ -1,2 +1,2 @@
union-empty.json: In union 'Union':
-union-empty.json:2: union has no branches
+union-empty.json:4: union has no branches
diff --git a/tests/qapi-schema/union-empty.json b/tests/qapi-schema/union-empty.json
index df3e5e639a..584ed6098c 100644
--- a/tests/qapi-schema/union-empty.json
+++ b/tests/qapi-schema/union-empty.json
@@ -1,2 +1,4 @@
-# simple unions cannot be empty
-{ 'union': 'Union', 'data': { } }
+# union discriminator enum cannot be empty
+{ 'enum': 'Empty', 'data': [ ] }
+{ 'struct': 'Base', 'data': { 'type': 'Empty' } }
+{ 'union': 'Union', 'base': 'Base', 'discriminator': 'type', 'data': { } }
diff --git a/tests/qapi-schema/union-inline-invalid-dict.err b/tests/qapi-schema/union-inline-invalid-dict.err
new file mode 100644
index 0000000000..25ddf7c765
--- /dev/null
+++ b/tests/qapi-schema/union-inline-invalid-dict.err
@@ -0,0 +1,2 @@
+union-inline-invalid-dict.json: In union 'TestUnion':
+union-inline-invalid-dict.json:7: 'data' member 'value1' misses key 'type'
diff --git a/tests/qapi-schema/flat-union-inline-invalid-dict.json b/tests/qapi-schema/union-inline-invalid-dict.json
index 1779712795..1779712795 100644
--- a/tests/qapi-schema/flat-union-inline-invalid-dict.json
+++ b/tests/qapi-schema/union-inline-invalid-dict.json
diff --git a/tests/qapi-schema/flat-union-empty.out b/tests/qapi-schema/union-inline-invalid-dict.out
index e69de29bb2..e69de29bb2 100644
--- a/tests/qapi-schema/flat-union-empty.out
+++ b/tests/qapi-schema/union-inline-invalid-dict.out
diff --git a/tests/qapi-schema/union-int-branch.err b/tests/qapi-schema/union-int-branch.err
new file mode 100644
index 0000000000..8fdc81edd1
--- /dev/null
+++ b/tests/qapi-schema/union-int-branch.err
@@ -0,0 +1,2 @@
+union-int-branch.json: In union 'TestUnion':
+union-int-branch.json:8: branch 'value1' cannot use built-in type 'int'
diff --git a/tests/qapi-schema/flat-union-int-branch.json b/tests/qapi-schema/union-int-branch.json
index 9370c349e8..567043d9d2 100644
--- a/tests/qapi-schema/flat-union-int-branch.json
+++ b/tests/qapi-schema/union-int-branch.json
@@ -1,4 +1,4 @@
-# we require flat union branches to be a struct
+# we require union branches to be a struct
{ 'enum': 'TestEnum',
'data': [ 'value1', 'value2' ] }
{ 'struct': 'Base',
diff --git a/tests/qapi-schema/flat-union-inline-invalid-dict.out b/tests/qapi-schema/union-int-branch.out
index e69de29bb2..e69de29bb2 100644
--- a/tests/qapi-schema/flat-union-inline-invalid-dict.out
+++ b/tests/qapi-schema/union-int-branch.out
diff --git a/tests/qapi-schema/union-invalid-branch-key.err b/tests/qapi-schema/union-invalid-branch-key.err
new file mode 100644
index 0000000000..bf58800507
--- /dev/null
+++ b/tests/qapi-schema/union-invalid-branch-key.err
@@ -0,0 +1,2 @@
+union-invalid-branch-key.json: In union 'TestUnion':
+union-invalid-branch-key.json:13: branch 'value_wrong' is not a value of enum type 'TestEnum'
diff --git a/tests/qapi-schema/flat-union-invalid-branch-key.json b/tests/qapi-schema/union-invalid-branch-key.json
index 95ff7746bf..95ff7746bf 100644
--- a/tests/qapi-schema/flat-union-invalid-branch-key.json
+++ b/tests/qapi-schema/union-invalid-branch-key.json
diff --git a/tests/qapi-schema/flat-union-int-branch.out b/tests/qapi-schema/union-invalid-branch-key.out
index e69de29bb2..e69de29bb2 100644
--- a/tests/qapi-schema/flat-union-int-branch.out
+++ b/tests/qapi-schema/union-invalid-branch-key.out
diff --git a/tests/qapi-schema/union-invalid-discriminator.err b/tests/qapi-schema/union-invalid-discriminator.err
new file mode 100644
index 0000000000..38efb24b98
--- /dev/null
+++ b/tests/qapi-schema/union-invalid-discriminator.err
@@ -0,0 +1,2 @@
+union-invalid-discriminator.json: In union 'TestUnion':
+union-invalid-discriminator.json:10: discriminator 'enum_wrong' is not a member of 'base'
diff --git a/tests/qapi-schema/flat-union-invalid-discriminator.json b/tests/qapi-schema/union-invalid-discriminator.json
index c4fce97362..c4fce97362 100644
--- a/tests/qapi-schema/flat-union-invalid-discriminator.json
+++ b/tests/qapi-schema/union-invalid-discriminator.json
diff --git a/tests/qapi-schema/flat-union-invalid-branch-key.out b/tests/qapi-schema/union-invalid-discriminator.out
index e69de29bb2..e69de29bb2 100644
--- a/tests/qapi-schema/flat-union-invalid-branch-key.out
+++ b/tests/qapi-schema/union-invalid-discriminator.out
diff --git a/tests/qapi-schema/union-invalid-if-discriminator.err b/tests/qapi-schema/union-invalid-if-discriminator.err
new file mode 100644
index 0000000000..3f41d03f8e
--- /dev/null
+++ b/tests/qapi-schema/union-invalid-if-discriminator.err
@@ -0,0 +1,2 @@
+union-invalid-if-discriminator.json: In union 'TestUnion':
+union-invalid-if-discriminator.json:10: discriminator member 'enum1' of 'base' must not be conditional
diff --git a/tests/qapi-schema/flat-union-invalid-if-discriminator.json b/tests/qapi-schema/union-invalid-if-discriminator.json
index e49992b798..e49992b798 100644
--- a/tests/qapi-schema/flat-union-invalid-if-discriminator.json
+++ b/tests/qapi-schema/union-invalid-if-discriminator.json
diff --git a/tests/qapi-schema/flat-union-invalid-discriminator.out b/tests/qapi-schema/union-invalid-if-discriminator.out
index e69de29bb2..e69de29bb2 100644
--- a/tests/qapi-schema/flat-union-invalid-discriminator.out
+++ b/tests/qapi-schema/union-invalid-if-discriminator.out
diff --git a/tests/qapi-schema/union-no-base.err b/tests/qapi-schema/union-no-base.err
new file mode 100644
index 0000000000..cbf12ac526
--- /dev/null
+++ b/tests/qapi-schema/union-no-base.err
@@ -0,0 +1,2 @@
+union-no-base.json: In union 'TestUnion':
+union-no-base.json:8: union misses key 'base'
diff --git a/tests/qapi-schema/flat-union-no-base.json b/tests/qapi-schema/union-no-base.json
index 327877b563..f6fe12da3b 100644
--- a/tests/qapi-schema/flat-union-no-base.json
+++ b/tests/qapi-schema/union-no-base.json
@@ -1,4 +1,4 @@
-# flat unions require a base
+# unions require a base
{ 'struct': 'TestTypeA',
'data': { 'string': 'str' } }
{ 'struct': 'TestTypeB',
diff --git a/tests/qapi-schema/flat-union-invalid-if-discriminator.out b/tests/qapi-schema/union-no-base.out
index e69de29bb2..e69de29bb2 100644
--- a/tests/qapi-schema/flat-union-invalid-if-discriminator.out
+++ b/tests/qapi-schema/union-no-base.out
diff --git a/tests/qapi-schema/union-optional-branch.err b/tests/qapi-schema/union-optional-branch.err
deleted file mode 100644
index b33f111de4..0000000000
--- a/tests/qapi-schema/union-optional-branch.err
+++ /dev/null
@@ -1,2 +0,0 @@
-union-optional-branch.json: In union 'Union':
-union-optional-branch.json:2: 'data' member '*a' has an invalid name
diff --git a/tests/qapi-schema/union-optional-branch.json b/tests/qapi-schema/union-optional-branch.json
deleted file mode 100644
index 591615fc68..0000000000
--- a/tests/qapi-schema/union-optional-branch.json
+++ /dev/null
@@ -1,2 +0,0 @@
-# union branches cannot be optional
-{ 'union': 'Union', 'data': { '*a': 'int', 'b': 'str' } }
diff --git a/tests/qapi-schema/union-optional-branch.out b/tests/qapi-schema/union-optional-branch.out
deleted file mode 100644
index e69de29bb2..0000000000
--- a/tests/qapi-schema/union-optional-branch.out
+++ /dev/null
diff --git a/tests/qapi-schema/union-optional-discriminator.err b/tests/qapi-schema/union-optional-discriminator.err
new file mode 100644
index 0000000000..8d980bd2ac
--- /dev/null
+++ b/tests/qapi-schema/union-optional-discriminator.err
@@ -0,0 +1,2 @@
+union-optional-discriminator.json: In union 'MyUnion':
+union-optional-discriminator.json:6: discriminator member 'switch' of base type 'Base' must not be optional
diff --git a/tests/qapi-schema/flat-union-optional-discriminator.json b/tests/qapi-schema/union-optional-discriminator.json
index 2e7f766f60..2e7f766f60 100644
--- a/tests/qapi-schema/flat-union-optional-discriminator.json
+++ b/tests/qapi-schema/union-optional-discriminator.json
diff --git a/tests/qapi-schema/flat-union-no-base.out b/tests/qapi-schema/union-optional-discriminator.out
index e69de29bb2..e69de29bb2 100644
--- a/tests/qapi-schema/flat-union-no-base.out
+++ b/tests/qapi-schema/union-optional-discriminator.out
diff --git a/tests/qapi-schema/union-string-discriminator.err b/tests/qapi-schema/union-string-discriminator.err
new file mode 100644
index 0000000000..eccbe681bd
--- /dev/null
+++ b/tests/qapi-schema/union-string-discriminator.err
@@ -0,0 +1,2 @@
+union-string-discriminator.json: In union 'TestUnion':
+union-string-discriminator.json:13: discriminator member 'kind' of base type 'TestBase' must be of enum type
diff --git a/tests/qapi-schema/flat-union-string-discriminator.json b/tests/qapi-schema/union-string-discriminator.json
index 8af60333b6..8af60333b6 100644
--- a/tests/qapi-schema/flat-union-string-discriminator.json
+++ b/tests/qapi-schema/union-string-discriminator.json
diff --git a/tests/qapi-schema/flat-union-optional-discriminator.out b/tests/qapi-schema/union-string-discriminator.out
index e69de29bb2..e69de29bb2 100644
--- a/tests/qapi-schema/flat-union-optional-discriminator.out
+++ b/tests/qapi-schema/union-string-discriminator.out
diff --git a/tests/qapi-schema/union-unknown.err b/tests/qapi-schema/union-unknown.err
index 7aba9f94da..dad79beae0 100644
--- a/tests/qapi-schema/union-unknown.err
+++ b/tests/qapi-schema/union-unknown.err
@@ -1,2 +1,2 @@
union-unknown.json: In union 'Union':
-union-unknown.json:2: union uses unknown type 'MissingType'
+union-unknown.json:3: branch 'unknown' uses unknown type 'MissingType'
diff --git a/tests/qapi-schema/union-unknown.json b/tests/qapi-schema/union-unknown.json
index 64d3666176..4736f1ab08 100644
--- a/tests/qapi-schema/union-unknown.json
+++ b/tests/qapi-schema/union-unknown.json
@@ -1,3 +1,6 @@
# we reject a union with unknown type in branch
+{ 'enum': 'Enum', 'data': [ 'unknown' ] }
{ 'union': 'Union',
- 'data': { 'unknown': ['MissingType'] } }
+ 'base': { 'type': 'Enum' },
+ 'discriminator': 'type',
+ 'data': { 'unknown': 'MissingType' } }