There already is an optional discriminator test, although it also noted the discriminator name itself as optional. This already gives us one error test case, to which this patch adds one other, namely whether that using an optional discriminator requires the respective field to have a default value.
Furthermore, a passing test case is added to qapi-schema-test. Signed-off-by: Max Reitz <mre...@redhat.com> --- tests/Makefile.include | 3 ++- ...-optional-discriminator-invalid-specification.json | 11 +++++++++++ ...flat-union-optional-discriminator-no-default.json} | 5 +++-- tests/qapi-schema/qapi-schema-test.json | 10 ++++++++++ ...n-optional-discriminator-invalid-specification.err | 1 + ...optional-discriminator-invalid-specification.exit} | 0 ...-optional-discriminator-invalid-specification.out} | 0 .../flat-union-optional-discriminator-no-default.err | 1 + .../flat-union-optional-discriminator-no-default.exit | 1 + .../flat-union-optional-discriminator-no-default.out | 0 .../qapi-schema/flat-union-optional-discriminator.err | 1 - tests/qapi-schema/qapi-schema-test.out | 9 +++++++++ 12 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 tests/qapi-schema/flat-union-optional-discriminator-invalid-specification.json rename tests/qapi-schema/{flat-union-optional-discriminator.json => flat-union-optional-discriminator-no-default.json} (68%) create mode 100644 tests/qapi-schema/flat-union-optional-discriminator-invalid-specification.err rename tests/qapi-schema/{flat-union-optional-discriminator.exit => flat-union-optional-discriminator-invalid-specification.exit} (100%) rename tests/qapi-schema/{flat-union-optional-discriminator.out => flat-union-optional-discriminator-invalid-specification.out} (100%) create mode 100644 tests/qapi-schema/flat-union-optional-discriminator-no-default.err create mode 100644 tests/qapi-schema/flat-union-optional-discriminator-no-default.exit create mode 100644 tests/qapi-schema/flat-union-optional-discriminator-no-default.out delete mode 100644 tests/qapi-schema/flat-union-optional-discriminator.err diff --git a/tests/Makefile.include b/tests/Makefile.include index 76dc581096..3202ddab10 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -398,7 +398,8 @@ qapi-schema += flat-union-invalid-branch-key.json qapi-schema += flat-union-invalid-discriminator.json qapi-schema += flat-union-invalid-if-discriminator.json qapi-schema += flat-union-no-base.json -qapi-schema += flat-union-optional-discriminator.json +qapi-schema += flat-union-optional-discriminator-invalid-specification.json +qapi-schema += flat-union-optional-discriminator-no-default.json qapi-schema += flat-union-string-discriminator.json qapi-schema += funny-char.json qapi-schema += ident-with-escape.json diff --git a/tests/qapi-schema/flat-union-optional-discriminator-invalid-specification.json b/tests/qapi-schema/flat-union-optional-discriminator-invalid-specification.json new file mode 100644 index 0000000000..d20a2cd295 --- /dev/null +++ b/tests/qapi-schema/flat-union-optional-discriminator-invalid-specification.json @@ -0,0 +1,11 @@ +# For using optional discriminators, only the field in the base struct +# must be marked optional, not the discriminator name itself +{ 'enum': 'Enum', 'data': [ 'one', 'two' ] } +{ 'struct': 'Base', + 'data': { '*switch': { 'type': 'Enum', 'default': 'one' } } } +{ 'struct': 'Branch', 'data': { 'name': 'str' } } +{ 'union': 'MyUnion', + 'base': 'Base', + 'discriminator': '*switch', + 'data': { 'one': 'Branch', + 'two': 'Branch' } } diff --git a/tests/qapi-schema/flat-union-optional-discriminator.json b/tests/qapi-schema/flat-union-optional-discriminator-no-default.json similarity index 68% rename from tests/qapi-schema/flat-union-optional-discriminator.json rename to tests/qapi-schema/flat-union-optional-discriminator-no-default.json index 08a8f7ef8b..31ebb85afb 100644 --- a/tests/qapi-schema/flat-union-optional-discriminator.json +++ b/tests/qapi-schema/flat-union-optional-discriminator-no-default.json @@ -1,10 +1,11 @@ -# we require the discriminator to be non-optional +# Using an optional discriminator requires the respective field to +# have a default { 'enum': 'Enum', 'data': [ 'one', 'two' ] } { 'struct': 'Base', 'data': { '*switch': 'Enum' } } { 'struct': 'Branch', 'data': { 'name': 'str' } } { 'union': 'MyUnion', 'base': 'Base', - 'discriminator': '*switch', + 'discriminator': 'switch', 'data': { 'one': 'Branch', 'two': 'Branch' } } diff --git a/tests/qapi-schema/qapi-schema-test.json b/tests/qapi-schema/qapi-schema-test.json index 12ae387d46..0f4b123a82 100644 --- a/tests/qapi-schema/qapi-schema-test.json +++ b/tests/qapi-schema/qapi-schema-test.json @@ -104,6 +104,16 @@ { 'struct': 'UserDefC', 'data': { 'string1': 'str', 'string2': 'str' } } +# for testing unions with an optional discriminator +{ 'union': 'UserDefFlatUnion3', + 'base': { '*enum1': { 'type': 'EnumOne', 'default': 'value1' } }, + 'discriminator': 'enum1', + 'data': { 'value1' : 'UserDefA', + 'value2' : 'UserDefB', + 'value3' : 'UserDefB' + # 'value4' defaults to empty + } } + # for testing use of 'number' within alternates { 'alternate': 'AltEnumBool', 'data': { 'e': 'EnumOne', 'b': 'bool' } } { 'alternate': 'AltEnumNum', 'data': { 'e': 'EnumOne', 'n': 'number' } } diff --git a/tests/qapi-schema/flat-union-optional-discriminator-invalid-specification.err b/tests/qapi-schema/flat-union-optional-discriminator-invalid-specification.err new file mode 100644 index 0000000000..cbf154e726 --- /dev/null +++ b/tests/qapi-schema/flat-union-optional-discriminator-invalid-specification.err @@ -0,0 +1 @@ +tests/qapi-schema/flat-union-optional-discriminator-invalid-specification.json:7: Discriminator of flat union 'MyUnion' does not allow optional name '*switch' diff --git a/tests/qapi-schema/flat-union-optional-discriminator.exit b/tests/qapi-schema/flat-union-optional-discriminator-invalid-specification.exit similarity index 100% rename from tests/qapi-schema/flat-union-optional-discriminator.exit rename to tests/qapi-schema/flat-union-optional-discriminator-invalid-specification.exit diff --git a/tests/qapi-schema/flat-union-optional-discriminator.out b/tests/qapi-schema/flat-union-optional-discriminator-invalid-specification.out similarity index 100% rename from tests/qapi-schema/flat-union-optional-discriminator.out rename to tests/qapi-schema/flat-union-optional-discriminator-invalid-specification.out diff --git a/tests/qapi-schema/flat-union-optional-discriminator-no-default.err b/tests/qapi-schema/flat-union-optional-discriminator-no-default.err new file mode 100644 index 0000000000..5a022a0bc7 --- /dev/null +++ b/tests/qapi-schema/flat-union-optional-discriminator-no-default.err @@ -0,0 +1 @@ +tests/qapi-schema/flat-union-optional-discriminator-no-default.json:7: Optional discriminator 'switch' has no default value diff --git a/tests/qapi-schema/flat-union-optional-discriminator-no-default.exit b/tests/qapi-schema/flat-union-optional-discriminator-no-default.exit new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/tests/qapi-schema/flat-union-optional-discriminator-no-default.exit @@ -0,0 +1 @@ +1 diff --git a/tests/qapi-schema/flat-union-optional-discriminator-no-default.out b/tests/qapi-schema/flat-union-optional-discriminator-no-default.out new file mode 100644 index 0000000000..e69de29bb2 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 aaabedb3bd..0000000000 --- a/tests/qapi-schema/flat-union-optional-discriminator.err +++ /dev/null @@ -1 +0,0 @@ -tests/qapi-schema/flat-union-optional-discriminator.json:6: Discriminator of flat union 'MyUnion' does not allow optional name '*switch' diff --git a/tests/qapi-schema/qapi-schema-test.out b/tests/qapi-schema/qapi-schema-test.out index 724276f5de..3729736747 100644 --- a/tests/qapi-schema/qapi-schema-test.out +++ b/tests/qapi-schema/qapi-schema-test.out @@ -96,6 +96,15 @@ alternate UserDefAlternate object UserDefC member string1: str optional=False member string2: str optional=False +object q_obj_UserDefFlatUnion3-base + member enum1: EnumOne optional=True default=value1 +object UserDefFlatUnion3 + base q_obj_UserDefFlatUnion3-base + tag enum1 + case value1: UserDefA + case value2: UserDefB + case value3: UserDefB + case value4: q_empty alternate AltEnumBool tag type case e: EnumOne -- 2.21.0