Revision control

++ // Copyright (C) 2026 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
++
++ #include "qoaicommonglobal.h"
++
++ #include "../basicSchemaAlternatives/client/bankapi.h"
++ #include "../basicSchemaAlternatives/client/dataapi.h"
++ #include "../basicSchemaAlternatives/client/defaultapi.h"
++ #include "../basicSchemaAlternatives/client/dummytestvalue.h"
++ #include "../basicSchemaAlternatives/client/farmapi.h"
++ #include "../basicSchemaAlternatives/client/root.h"
++ #include "../basicSchemaAlternatives/client/rootmap.h"
++ #include "../basicSchemaAlternatives/client/rootmapmodels.h"
++ #include "../basicSchemaAlternatives/client/storeapi.h"
++
++ #include <QtCore/qbuffer.h>
++ #include <QtCore/qobject.h>
++ #include <QtNetwork/qnetworkrequestfactory.h>
++ #include <QtNetwork/qrestaccessmanager.h>
++ #include <QtTest/qtest.h>
++
++ using namespace Qt::StringLiterals;
++ using namespace QtOpenApiCommon;
++
++ static QString mapAsString(const QMap<QString, QJsonValue> &map)
++ {
++ QJsonObject obj;
++ for (const auto &[key, val] : map.asKeyValueRange())
++ obj.insert(key, val);
++ return QString::fromUtf8(QJsonDocument(obj).toJson(QJsonDocument::Compact));
++ }
++
++ class LoggingNetworkAccessManager : public QNetworkAccessManager
++ {
++ public:
++ LoggingNetworkAccessManager(QObject *parent = nullptr)
++ : QNetworkAccessManager(parent)
++ {}
++ ~LoggingNetworkAccessManager() override
++ {}
++
++ protected:
++ QNetworkReply *createRequest(QNetworkAccessManager::Operation op,
++ const QNetworkRequest &originalReq,
++ QIODevice *outgoingData = nullptr) override;
++
++ public:
++ QByteArray m_content;
++ };
++
++ QNetworkReply *LoggingNetworkAccessManager::createRequest(QNetworkAccessManager::Operation op,
++ const QNetworkRequest &originalReq,
++ QIODevice *outgoingData)
++ {
++ // The QNAM::put/post/sendCustomRequest operations that take QByteArray
++ // as a data parameter use QBuffer to wrap the byte array.
++ // It is later passed as a QIODevice* to this method.
++ // We cast the QIODevice to QBuffer, and store its content to intercept
++ // the transferred data.
++ QBuffer *buffer = qobject_cast<QBuffer*>(outgoingData);
++ m_content = buffer ? buffer->data() : QByteArray();
++
++ return QNetworkAccessManager::createRequest(op, originalReq, outgoingData);
++ }
++
++ class OneOfTest : public QObject {
++ Q_OBJECT
++
++ enum class BankApiPatchMode {
++ UsePatchPaymentRequest,
++ UseString,
++ UseBool,
++ UseDouble
++ };
++
++ enum class BankApiPostMode {
++ UsePostPaymentRequest,
++ UseCreditCard,
++ UsePaypal
++ };
++
++ enum class StoreApiMode {
++ UseCat,
++ UseDog,
++ UsePet
++ };
++
++ enum class FarmApiMode {
++ UseBunny,
++ UseDog,
++ UseDuck,
++ UsePostPet
++ };
++
++ private:
++ void generateAlternativeSchemasTestData();
++
++ private Q_SLOTS:
++ void testAccountJsonConversionMethods_data();
++ void testAccountJsonConversionMethods();
++ void testAlternativeSchemasFunctions_data();
++ void testAlternativeSchemasFunctions();
++ void testAlternativeSchemasOptional_data();
++ void testAlternativeSchemasOptional();
++ void testAlternativeSchemasRequired_data();
++ void testAlternativeSchemasRequired();
++ void testClientValueJsonConversionMethods_data();
++ void testClientValueJsonConversionMethods();
++ void testCustomerJsonConversionMethods_data();
++ void testCustomerJsonConversionMethods();
++ void testInlineSchemasJsonConversionMethods_data();
++ void testInlineSchemasJsonConversionMethods();
++ void testInlineSchemasPatch_data();
++ void testInlineSchemasPatch();
++ void testInlineSchemasPost_data();
++ void testInlineSchemasPost();
++ void testOneOfPrimitiveJsonConversionMethods_data();
++ void testOneOfPrimitiveJsonConversionMethods();
++ void testPolymorphedRequestBody_data();
++ void testPolymorphedRequestBody();
++ void testPostAccountRequestJsonConversionMethods_data();
++ void testPostAccountRequestJsonConversionMethods();
++ void testPostFarmPetRequestJsonConversionMethods_data();
++ void testPostFarmPetRequestJsonConversionMethods();
++ void testDummyTestValue();
++ void testRootJsonConversionMethods_data();
++ void testRootJsonConversionMethods();
++ void testRootMapJsonConversionMethods_data();
++ void testRootMapJsonConversionMethods();
++ void testRootMapModelsJsonConversionMethods_data();
++ void testRootMapModelsJsonConversionMethods();
++ };
++
++ void OneOfTest::testAccountJsonConversionMethods_data()
++ {
++ QTest::addColumn<SchemasModelsOneOf::Account>("account");
++ QTest::addColumn<QString>("expectedJson");
++ QTest::addColumn<QJsonValue>("expectedJsonValue");
++ QTest::addColumn<QString>("oneOf0ExpectedJson");
++ QTest::addColumn<QString>("oneOf1ExpectedJson");
++ QTest::addColumn<bool>("isOneOfAccountOneOfValid");
++ QTest::addColumn<bool>("isOneOfAccountOneOfSet");
++ QTest::addColumn<bool>("isOneOfAccountOneOf1Valid");
++ QTest::addColumn<bool>("isOneOfAccountOneOf1Set");
++ QTest::addColumn<bool>("isValid");
++ QTest::addColumn<bool>("isSet");
++
++ // Account has two oneOf alternatives:
++ // oneOf0: Account_oneOf (name: string optional, contractAvailable: bool optional) =>
++ // no required
++ // oneOf1: Account_oneOf_1 (firstname: string optional, lastname: string optional,
++ // additionalProperties) - no required
++ // Both have no required fields => both are always "valid"
++ // This creates ambiguity with empty JSON since both alternatives are valid!
++
++ SchemasModelsOneOf::Account account;
++ QTest::newRow("Empty Account object")
++ // account // expectedJson
++ << account << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOfAccountOneOfValid // isOneOfAccountOneOfSet
++ << false << false
++ // isOneOfAccountOneOf1Valid // isOneOfAccountOneOf1Set
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Set a valid Account_oneOf via setter
++ SchemasModelsOneOf::Account_oneOf acctOneOf0;
++ acctOneOf0.setName("Test Account"_L1);
++ acctOneOf0.setContractAvailable(true);
++ account.setOneOfAccount_oneOf(acctOneOf0);
++ QTest::newRow("Set a valid Account_oneOf object via setter")
++ // account // expectedJson
++ << account << acctOneOf0.asJson()
++ // expectedJsonValue
++ << acctOneOf0.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << acctOneOf0.asJson() << QString("{}"_L1)
++ // isOneOfAccountOneOfValid // isOneOfAccountOneOfSet
++ << true << true
++ // isOneOfAccountOneOf1Valid // isOneOfAccountOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set a valid Account_oneOf_1 via setter
++ SchemasModelsOneOf::Account_oneOf_1 acctOneOf1;
++ acctOneOf1.setFirstname("John"_L1);
++ acctOneOf1.setLastname("Doe"_L1);
++ account.setOneOfAccount_oneOf_1(acctOneOf1);
++ QTest::newRow("Set a valid Account_oneOf_1 object via setter")
++ // account // expectedJson
++ << account << acctOneOf1.asJson()
++ // expectedJsonValue
++ << acctOneOf1.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << acctOneOf1.asJson()
++ // isOneOfAccountOneOfValid // isOneOfAccountOneOfSet
++ << false << false
++ // isOneOfAccountOneOf1Valid // isOneOfAccountOneOf1Set
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ const SchemasModelsOneOf::Account_oneOf emptyAcctOneOf0;
++ account.setOneOfAccount_oneOf(emptyAcctOneOf0);
++ QTest::newRow("Set an empty Account_oneOf object via setter")
++ // account // expectedJson
++ << account << emptyAcctOneOf0.asJson()
++ // expectedJsonValue
++ << emptyAcctOneOf0.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOfAccountOneOfValid // isOneOfAccountOneOfSet
++ << true << true
++ // isOneOfAccountOneOf1Valid // isOneOfAccountOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set an empty Account_oneOf_1 object. No required fields, so it's VALID.
++ const SchemasModelsOneOf::Account_oneOf_1 emptyAcctOneOf1;
++ account.setOneOfAccount_oneOf_1(emptyAcctOneOf1);
++ QTest::newRow("Set an empty Account_oneOf_1 object via setter")
++ // account // expectedJson
++ << account << emptyAcctOneOf1.asJson()
++ // expectedJsonValue
++ << emptyAcctOneOf1.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOfAccountOneOfValid // isOneOfAccountOneOfSet
++ << false << false
++ // isOneOfAccountOneOf1Valid // isOneOfAccountOneOf1Set
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue with EMPTY data => ambiguity, both are valid
++ // Resolution: first valid alternative wins (oneOf0)
++ account.fromJsonValue(emptyAcctOneOf0.asJsonValue());
++ QTest::newRow("Set an empty Account_oneOf via ::fromJsonValue()")
++ // account // expectedJson
++ << account << emptyAcctOneOf0.asJson()
++ // expectedJsonValue
++ << emptyAcctOneOf0.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // !!! NOTE: ambiguity - both coule be valid, but oneOf0 wins
++ // isOneOfAccountOneOfValid // isOneOfAccountOneOfSet
++ << true << true
++ // isOneOfAccountOneOf1Valid // isOneOfAccountOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with EMPTY data => same ambiguity
++ account.fromJson("{}"_L1);
++ QTest::newRow("Set an empty JSON {} via ::fromJson()")
++ // account // expectedJson
++ << account << QString("{}"_L1)
++ // expectedJsonValue
++ << account.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // !!! NOTE: ambiguity - both could be valid, oneOf0 wins
++ // isOneOfAccountOneOfValid // isOneOfAccountOneOfSet
++ << true << true
++ // isOneOfAccountOneOf1Valid // isOneOfAccountOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with Account_oneOf specific field (name)
++ const QString nameOnly("{\"name\":\"Acme Corp\"}"_L1);
++ account.fromJson(nameOnly);
++ QTest::newRow("Set Account_oneOf with name via ::fromJson()")
++ // account // expectedJson
++ << account << nameOnly
++ // expectedJsonValue
++ << account.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << nameOnly << QString("{}"_L1)
++ // isOneOfAccountOneOfValid // isOneOfAccountOneOfSet
++ << true << true
++ // isOneOfAccountOneOf1Valid // isOneOfAccountOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with Account_oneOf specific field (contractAvailable)
++ const QString contractOnly("{\"contractAvailable\":false}"_L1);
++ account.fromJson(contractOnly);
++ QTest::newRow("Set Account_oneOf with contractAvailable via ::fromJson()")
++ // account // expectedJson
++ << account << contractOnly
++ // expectedJsonValue
++ << account.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << contractOnly << QString("{}"_L1)
++ // isOneOfAccountOneOfValid // isOneOfAccountOneOfSet
++ << true << true
++ // isOneOfAccountOneOf1Valid // isOneOfAccountOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with Account_oneOf_1 specific field (firstname)
++ const QString firstnameOnly("{\"firstname\":\"Alice\"}"_L1);
++ account.fromJson(firstnameOnly);
++ QTest::newRow("Set Account_oneOf_1 with firstname via ::fromJson()")
++ // account // expectedJson
++ << account << firstnameOnly
++ // expectedJsonValue
++ << account.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << firstnameOnly
++ // isOneOfAccountOneOfValid // isOneOfAccountOneOfSet
++ << false << false
++ // isOneOfAccountOneOf1Valid // isOneOfAccountOneOf1Set
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with Account_oneOf_1 both fields
++ const QString fullName("{\"firstname\":\"Bob\",\"lastname\":\"Smith\"}"_L1);
++ account.fromJson(fullName);
++ QTest::newRow("Set Account_oneOf_1 with both names via ::fromJson()")
++ // account // expectedJson
++ << account << fullName
++ // expectedJsonValue
++ << account.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << fullName
++ // isOneOfAccountOneOfValid // isOneOfAccountOneOfSet
++ << false << false
++ // isOneOfAccountOneOf1Valid // isOneOfAccountOneOf1Set
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with Account_oneOf both fields
++ const QString fullAcct("{\"contractAvailable\":true,\"name\":\"Premium\"}"_L1);
++ account.fromJson(fullAcct);
++ QTest::newRow("Set Account_oneOf with both fields via ::fromJson()")
++ // account // expectedJson
++ << account << fullAcct
++ // expectedJsonValue
++ << account.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << fullAcct << QString("{}"_L1)
++ // isOneOfAccountOneOfValid // isOneOfAccountOneOfSet
++ << true << true
++ // isOneOfAccountOneOf1Valid // isOneOfAccountOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue with valid Account_oneOf object
++ account.fromJsonValue(acctOneOf0.asJsonValue());
++ QTest::newRow("Set a valid Account_oneOf via ::fromJsonValue()")
++ // account // expectedJson
++ << account << acctOneOf0.asJson()
++ // expectedJsonValue
++ << account.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << acctOneOf0.asJson() << QString("{}"_L1)
++ // isOneOfAccountOneOfValid // isOneOfAccountOneOfSet
++ << true << true
++ // isOneOfAccountOneOf1Valid // isOneOfAccountOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue with valid Account_oneOf_1 object
++ account.fromJsonValue(acctOneOf1.asJsonValue());
++ QTest::newRow("Set a valid Account_oneOf_1 via ::fromJsonValue()")
++ // account // expectedJson
++ << account << acctOneOf1.asJson()
++ // expectedJsonValue
++ << account.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << acctOneOf1.asJson()
++ // isOneOfAccountOneOfValid // isOneOfAccountOneOfSet
++ << false << false
++ // isOneOfAccountOneOf1Valid // isOneOfAccountOneOf1Set
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // invalid json! => the model is RESET to INITIAL state
++ account.fromJson("{invalid json}"_L1);
++ QTest::newRow("Set an invalid json via ::fromJson()")
++ // account // expectedJson
++ << account << QString("{}"_L1)
++ // expectedJsonValue
++ << account.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOfAccountOneOfValid // isOneOfAccountOneOfSet
++ << false << false
++ // isOneOfAccountOneOf1Valid // isOneOfAccountOneOf1Set
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Test with non-object JSON (array) => reset
++ account.fromJson("[]"_L1);
++ QTest::newRow("Account: set an unexpected array via ::fromJson()")
++ // account // expectedJson
++ << account << QString("{}"_L1)
++ // expectedJsonValue
++ << account.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOfAccountOneOfValid // isOneOfAccountOneOfSet
++ << false << false
++ // isOneOfAccountOneOf1Valid // isOneOfAccountOneOf1Set
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Test with non-object JSON (string) => reset
++ account.fromJson("\"string\""_L1);
++ QTest::newRow("Set an unexpected string via ::fromJson()")
++ // account // expectedJson
++ << account << QString("{}"_L1)
++ // expectedJsonValue
++ << account.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOfAccountOneOfValid // isOneOfAccountOneOfSet
++ << false << false
++ // isOneOfAccountOneOf1Valid // isOneOfAccountOneOf1Set
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Invalid field types in Account_oneOf: name should be string
++ account.fromJson("{\"name\":123,\"contractAvailable\":true}"_L1);
++ QTest::newRow("Invalid field 'name=123' in Account_oneOf via ::fromJson()")
++ // account // expectedJson
++ << account << QString("{\"contractAvailable\":true}"_L1)
++ // expectedJsonValue
++ << account.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{\"contractAvailable\":true}"_L1) << QString("{}"_L1)
++ // isOneOfAccountOneOfValid // isOneOfAccountOneOfSet
++ << true << true
++ // isOneOfAccountOneOf1Valid // isOneOfAccountOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Invalid field types in Account_oneOf: contractAvailable should be bool
++ account.fromJson("{\"name\":\"ok\",\"contractAvailable\":\"yes\"}"_L1);
++ QTest::newRow("Invalid field 'contractAvailable=yes' in Account_oneOf via ::fromJson()")
++ // account // expectedJson
++ << account << QString("{\"name\":\"ok\"}"_L1)
++ // expectedJsonValue
++ << account.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{\"name\":\"ok\"}"_L1) << QString("{}"_L1)
++ // isOneOfAccountOneOfValid // isOneOfAccountOneOfSet
++ << true << true
++ // isOneOfAccountOneOf1Valid // isOneOfAccountOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Account_oneOf with only name set via setter
++ SchemasModelsOneOf::Account_oneOf nameOnlyAcct;
++ nameOnlyAcct.setName("PartialName"_L1);
++ account.setOneOfAccount_oneOf(nameOnlyAcct);
++ QTest::newRow("Set Account_oneOf with only name via setter")
++ // account // expectedJson
++ << account << nameOnlyAcct.asJson()
++ // expectedJsonValue
++ << nameOnlyAcct.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << nameOnlyAcct.asJson() << QString("{}"_L1)
++ // isOneOfAccountOneOfValid // isOneOfAccountOneOfSet
++ << true << true
++ // isOneOfAccountOneOf1Valid // isOneOfAccountOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Account_oneOf_1 with only lastname set via setter
++ SchemasModelsOneOf::Account_oneOf_1 lastnameOnlyAcct;
++ lastnameOnlyAcct.setLastname("OnlyLast"_L1);
++ account.setOneOfAccount_oneOf_1(lastnameOnlyAcct);
++ QTest::newRow("Set Account_oneOf_1 with only lastname via setter")
++ // account // expectedJson
++ << account << lastnameOnlyAcct.asJson()
++ // expectedJsonValue
++ << lastnameOnlyAcct.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << lastnameOnlyAcct.asJson()
++ // isOneOfAccountOneOfValid // isOneOfAccountOneOfSet
++ << false << false
++ // isOneOfAccountOneOf1Valid // isOneOfAccountOneOf1Set
++ << true << true
++ // isValid // isSet
++ << true << true;
++ }
++
++ void OneOfTest::testAccountJsonConversionMethods()
++ {
++ QFETCH(SchemasModelsOneOf::Account, account);
++ QFETCH(QString, expectedJson);
++ QFETCH(QJsonValue, expectedJsonValue);
++ QFETCH(QString, oneOf0ExpectedJson);
++ QFETCH(QString, oneOf1ExpectedJson);
++ QFETCH(bool, isOneOfAccountOneOfValid);
++ QFETCH(bool, isOneOfAccountOneOfSet);
++ QFETCH(bool, isOneOfAccountOneOf1Valid);
++ QFETCH(bool, isOneOfAccountOneOf1Set);
++ QFETCH(bool, isValid);
++ QFETCH(bool, isSet);
++
++ QCOMPARE(account.asJson(), expectedJson);
++ QCOMPARE(account.asJsonValue(), expectedJsonValue);
++ QCOMPARE(account.getOneOfAccount_oneOf().asJson(), oneOf0ExpectedJson);
++ QCOMPARE(account.isOneOfAccountOneOfValid(), isOneOfAccountOneOfValid);
++ QCOMPARE(account.isOneOfAccountOneOfSet(), isOneOfAccountOneOfSet);
++ QCOMPARE(account.getOneOfAccount_oneOf_1().asJson(), oneOf1ExpectedJson);
++ QCOMPARE(account.isOneOfAccountOneOf1Valid(), isOneOfAccountOneOf1Valid);
++ QCOMPARE(account.isOneOfAccountOneOf1Set(), isOneOfAccountOneOf1Set);
++ QCOMPARE(account.isValid(), isValid);
++ QCOMPARE(account.isSet(), isSet);
++ }
++
++ void OneOfTest::testAlternativeSchemasFunctions_data()
++ {
++ QTest::addColumn<SchemasModelsOneOf::Pet>("pet");
++ QTest::addColumn<QString>("expectedJson");
++ QTest::addColumn<QJsonValue>("expectedJsonValue");
++ QTest::addColumn<QString>("oneOfCatExpectedJson");
++ QTest::addColumn<QString>("oneOfDogExpectedJson");
++ QTest::addColumn<SchemasModelsOneOf::Cat>("getOneOfCat");
++ QTest::addColumn<SchemasModelsOneOf::Dog>("getOneOfDog");
++ QTest::addColumn<bool>("isOneOfCatValid");
++ QTest::addColumn<bool>("isOneOfCatSet");
++ QTest::addColumn<bool>("isOneOfDogValid");
++ QTest::addColumn<bool>("isOneOfDogSet");
++ QTest::addColumn<bool>("isValid");
++ QTest::addColumn<bool>("isSet");
++
++ SchemasModelsOneOf::Pet pet;
++ QTest::newRow("Empty Pet object")
++ // pet // expectedJson
++ << pet << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // getOneOfCat // getOneOfDog
++ << SchemasModelsOneOf::Cat() << SchemasModelsOneOf::Dog()
++ // isOneOfCatValid // isOneOfCatSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ SchemasModelsOneOf::Cat kitty;
++ kitty.setHunts(false);
++ kitty.setAge(7);
++
++ SchemasModelsOneOf::Dog hund;
++ hund.setBark(false);
++ hund.setBreed("French Bulldog"_L1);
++
++ // check setters work fine
++ pet.setOneOfCat(kitty);
++ QTest::newRow("Set a valid Cat object via setter")
++ // pet // expectedJson
++ << pet << kitty.asJson()
++ // expectedJsonValue
++ << kitty.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << QString("{\"age\":7,\"hunts\":false}"_L1) << QString("{}"_L1)
++ // getOneOfCat // getOneOfDog
++ << kitty << SchemasModelsOneOf::Dog()
++ // isOneOfCatValid // isOneOfCatSet
++ << true << true
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Dog has required field bark, so empty Dog is invalid
++ pet.setOneOfDog(hund);
++ QTest::newRow("Set a valid Dog object via setter")
++ // pet // expectedJson
++ << pet << hund.asJson()
++ // expectedJsonValue
++ << hund.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << QString("{}"_L1) << QString("{\"bark\":false,\"breed\":\"French Bulldog\"}"_L1)
++ // getOneOfCat // getOneOfDog
++ << SchemasModelsOneOf::Cat() << hund
++ // isOneOfCatValid // isOneOfCatSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Set an empty Dog object, the dog has required fields, so an empty
++ // dog is INVALID => entire Pet stays invalid
++ const SchemasModelsOneOf::Dog emptyDog;
++ pet.setOneOfDog(emptyDog);
++ QTest::newRow("Set an empty Dog object via setter")
++ // pet // expectedJson
++ << pet << emptyDog.asJson()
++ // expectedJsonValue
++ << emptyDog.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // getOneOfCat // getOneOfDog
++ << SchemasModelsOneOf::Cat() << emptyDog
++ // isOneOfCatValid // isOneOfCatSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Set an empty Cat object, the cat has no required fields, so an empty
++ // cat is VALID => entire Pet becomes valid
++ const SchemasModelsOneOf::Cat emptyCat;
++ pet.setOneOfCat(emptyCat);
++ QTest::newRow("Set an empty Cat object via setter")
++ // pet // expectedJson
++ << pet << emptyCat.asJson()
++ // expectedJsonValue
++ << emptyCat.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // getOneOfCat // getOneOfDog
++ << emptyCat << emptyDog
++ // isOneOfCatValid // isOneOfCatSet
++ << true << true
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue with EMPTY data.
++ // Attempting to set an empty Dog via pet.fromJsonValue().
++ // Dog defines required fields, so an empty object is INVALID for Dog.
++ //
++ // However, emptyDog.asJsonValue() produces '{}' because it is an empty object.
++ //
++ // The Pet::fromJsonValue() logic cannot determine whether '{}' represents
++ // a Cat or a Dog. The only available approach is to try deserializing '{}'
++ // against each schema and select the one that validates successfully.
++ //
++ // This leads to ambiguity, since '{}' is a valid Cat instance.
++ //
++ // To avoid such situations, the schema should define either a discriminator
++ // or required fields for each Object in the YAML specification.
++ //
++ // This ambiguity is intentional here for testing purposes, to highlight
++ // the importance of well-defined API schemas. Ensuring correctness of the
++ // API design is the responsibility of the API author.
++ pet.fromJsonValue(emptyDog.asJsonValue());
++ QTest::newRow("Set an empty Dog via ::fromJsonValue(emptyDog.asJsonValue())")
++ // pet // expectedJson
++ << pet << emptyDog.asJson()
++ // expectedJsonValue
++ << emptyDog.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // getOneOfCat // getOneOfDog
++ << emptyCat << emptyDog
++ // !!! NOTE: ambiguity is here, cat is VALID!
++ // isOneOfCatValid // isOneOfCatSet
++ << true << true
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with EMPTY data.
++ // Same expectations like with
++ // 'Set an empty Dog via pet.fromJsonValue(emptyDog.asJsonValue())'
++ pet.fromJson(emptyDog.asJson());
++ QTest::newRow("Set an empty Dog via ::fromJson(emptyDog.asJson())")
++ // pet // expectedJson
++ << pet << emptyDog.asJson()
++ // expectedJsonValue
++ << emptyDog.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // getOneOfCat // getOneOfDog
++ << emptyCat << emptyDog
++ // !!! NOTE: ambiguity is here, cat is VALID!
++ // isOneOfCatValid // isOneOfCatSet
++ << true << true
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with EMPTY data.
++ // Same expectations like with
++ // 'Set an empty Dog via pet.fromJsonValue(emptyDog.asJsonValue())'
++ pet.fromJson(emptyCat.asJson());
++ QTest::newRow("Set an empty Cat via ::fromJson(emptyCat.asJson())")
++ // pet // expectedJson
++ << pet << emptyCat.asJson()
++ // expectedJsonValue
++ << emptyCat.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // getOneOfCat // getOneOfDog
++ << emptyCat << emptyDog
++ // isOneOfCatValid // isOneOfCatSet
++ << true << true
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ pet.fromJsonValue(emptyCat.asJsonValue());
++ QTest::newRow("Set an empty Cat via ::fromJsonValue(emptyCat.asJsonValue())")
++ // pet // expectedJson
++ << pet << emptyCat.asJson()
++ // expectedJsonValue
++ << emptyCat.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // getOneOfCat // getOneOfDog
++ << emptyCat << emptyDog
++ // isOneOfCatValid // isOneOfCatSet
++ << true << true
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // check fromJson() works fine for VALID cat object
++ const QString kittyCat("{\"age\":90,\"hunts\":false}"_L1);
++ pet.fromJson(kittyCat);
++ QTest::newRow("Set a valid Cat object via ::fromJson()")
++ // pet // expectedJson
++ << pet << kittyCat
++ // expectedJsonValue
++ << pet.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << kittyCat << QString("{}"_L1)
++ // getOneOfCat // getOneOfDog
++ << SchemasModelsOneOf::Cat(kittyCat) << emptyDog
++ // isOneOfCatValid // isOneOfCatSet
++ << true << true
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // check fromJsonValue() works fine for VALID cat object
++ const SchemasModelsOneOf::Cat okCat(kittyCat);
++ pet.fromJsonValue(okCat.asJsonValue());
++ QTest::newRow("Set a valid Cat object via ::fromJsonValue()")
++ // pet // expectedJson
++ << pet << kittyCat
++ // expectedJsonValue
++ << pet.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << kittyCat << QString("{}"_L1)
++ // getOneOfCat // getOneOfDog
++ << SchemasModelsOneOf::Cat(kittyCat) << emptyDog
++ // isOneOfCatValid // isOneOfCatSet
++ << true << true
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // check fromJson() works fine for VALID cat object
++ const QString doggyDog("{\"bark\":false,\"breed\":\"French Bulldog\"}"_L1);
++ pet.fromJson(doggyDog);
++ QTest::newRow("Set a valid Dog object via ::fromJson()")
++ // pet // expectedJson
++ << pet << doggyDog
++ // expectedJsonValue
++ << pet.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << QString("{}"_L1) << doggyDog
++ // getOneOfCat // getOneOfDog
++ << emptyCat << SchemasModelsOneOf::Dog(doggyDog)
++ // isOneOfCatValid // isOneOfCatSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // check fromJsonValue() works fine for VALID cat object
++ const SchemasModelsOneOf::Dog okDog(doggyDog);
++ pet.fromJsonValue(okDog.asJsonValue());
++ QTest::newRow("Set a valid Dog object via ::fromJsonValue()")
++ // pet // expectedJson
++ << pet << doggyDog
++ // expectedJsonValue
++ << pet.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << QString("{}"_L1) << doggyDog
++ // getOneOfCat // getOneOfDog
++ << emptyCat << okDog
++ // isOneOfCatValid // isOneOfCatSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // invalid json!
++ pet.fromJson("{invalid json}"_L1);
++ QTest::newRow("Set an invalid json via ::fromJson()")
++ // pet // expectedJson
++ << pet << QString("{}"_L1)
++ // expectedJsonValue
++ << pet.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // getOneOfCat // getOneOfDog
++ << emptyCat << emptyDog
++ // isOneOfCatValid // isOneOfCatSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Test with non-object JSON (array)
++ pet.fromJson("[]"_L1);
++ QTest::newRow("Set an unexpected array [] via ::fromJson()")
++ // pet // expectedJson
++ << pet << QString("{}"_L1)
++ // expectedJsonValue
++ << pet.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // getOneOfCat // getOneOfDog
++ << emptyCat << emptyDog
++ // isOneOfCatValid // isOneOfCatSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++
++ // Test with non-object JSON (string)
++ pet.fromJson("\"just a string\""_L1);
++ QTest::newRow("Set an unexpected string via ::fromJson()")
++ // pet // expectedJson
++ << pet << QString("{}"_L1)
++ // expectedJsonValue
++ << pet.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // getOneOfCat // getOneOfDog
++ << emptyCat << emptyDog
++ // isOneOfCatValid // isOneOfCatSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Missing Required Fields (Dog's 'bark' is required)
++ // Dog without required 'bark' field - should not be valid
++ SchemasModelsOneOf::Dog invalidDog;
++ invalidDog.setBreed("Husky-kolbasky"_L1);
++ pet.setOneOfDog(invalidDog);
++ QTest::newRow("Set an invalid Dog via setter")
++ // pet // expectedJson
++ << pet << QString("{}"_L1)
++ // expectedJsonValue
++ << pet.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << QString("{}"_L1) << QString("{\"breed\":\"Husky-kolbasky\"}"_L1)
++ // getOneOfCat // getOneOfDog
++ << emptyCat << invalidDog
++ // isOneOfCatValid // isOneOfCatSet
++ << false << false
++ // The status here reflects the status of the model that was set.
++ // The model's field was set by setter, so invalidDog.isSet() == true
++ // but invalidDog.isValid() == false, because required field is not set.
++ // isOneOfDogValid // isOneOfDogSet
++ << invalidDog.isValid() << invalidDog.isSet()
++ // isValid // isSet
++ << false << true;
++
++ // Try to parse JSON missing required field, the dog is invalid.
++ pet.fromJson("{\"breed\":\"Retriever\"}"_L1);
++ QTest::newRow("Set an invalid Dog via ::fromJson()")
++ // pet // expectedJson
++ << pet << QString("{}"_L1)
++ // expectedJsonValue
++ << pet.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << QString("{}"_L1) << QString("{\"breed\":\"Retriever\"}"_L1)
++ // getOneOfCat // getOneOfDog
++ << emptyCat << SchemasModelsOneOf::Dog("{\"breed\":\"Retriever\"}"_L1)
++ // isOneOfCatValid // isOneOfCatSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << false << true
++ // isValid // isSet
++ << false << true;
++ // Partial/Incomplete JSON Objects
++ // Only one field for Cat (age without hunts),
++ // should work since Cat has no required fields
++ const QString notFullCat("{\"age\":5}"_L1);
++ pet.fromJson(notFullCat);
++ QTest::newRow("Set a valid non-full Cat via ::fromJson()")
++ // pet // expectedJson
++ << pet << notFullCat
++ // expectedJsonValue
++ << pet.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << notFullCat << QString("{}"_L1)
++ // getOneOfCat // getOneOfDog
++ << SchemasModelsOneOf::Cat("{\"age\":5}"_L1) << emptyDog
++ // isOneOfCatValid // isOneOfCatSet
++ << true << true
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Extra/Unknown Fields in JSON
++ // JSON with fields not in schema - should parse known fields and ignore unknown
++ pet.fromJson("{\"age\":7,\"hunts\":false,\"name\":\"Fluffy\",\"color\":\"orange\"}"_L1);
++ QString expected("{\"age\":7,\"hunts\":false}"_L1);
++ QTest::newRow("Extra/Unknown Fields in JSON via ::fromJson()")
++ // pet // expectedJson
++ << pet << expected
++ // expectedJsonValue
++ << pet.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << expected << QString("{}"_L1)
++ // getOneOfCat // getOneOfDog
++ << SchemasModelsOneOf::Cat(expected) << emptyDog
++ // isOneOfCatValid // isOneOfCatSet
++ << true << true
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Empty Strings in Fields
++ expected = QString("{\"bark\":true,\"breed\":\"\"}"_L1);
++ pet.fromJson(expected);
++ QTest::newRow("An empty String in Dog breed field via ::fromJson()")
++ // pet // expectedJson
++ << pet << expected
++ // expectedJsonValue
++ << pet.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << QString("{}"_L1) << expected
++ // getOneOfCat // getOneOfDog
++ << emptyCat << SchemasModelsOneOf::Dog(expected)
++ // isOneOfCatValid // isOneOfCatSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Invalid Field Types for Cat(). Wrong type for age (string instead of integer)
++ // Note: field of Cat type are not required, it means wrong fields can be omitted
++ expected = QString("{\"age\":\"seven\",\"hunts\":false}"_L1);
++ pet.fromJson(expected);
++ QTest::newRow("Invalid field 'age=seven' in Cat via ::fromJson()")
++ // pet // expectedJson
++ << pet << QString("{\"hunts\":false}"_L1)
++ // expectedJsonValue
++ << pet.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << QString("{\"hunts\":false}"_L1) << QString("{}"_L1)
++ // getOneOfCat // getOneOfDog
++ << SchemasModelsOneOf::Cat(expected) << emptyDog
++ // isOneOfCatValid // isOneOfCatSet
++ << true << true
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Invalid Field Types for Cat(). Wrong type for age (double instead of integer)
++ // Note: field of Cat type are not required, it means wrong fields can be omitted
++ expected = QString("{\"age\":0.1,\"hunts\":true}"_L1);
++ pet.fromJson(expected);
++ QTest::newRow("Invalid field 'age=0.1' in Cat via ::fromJson()")
++ // pet // expectedJson
++ << pet << QString("{\"hunts\":true}"_L1)
++ // expectedJsonValue
++ << pet.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << QString("{\"hunts\":true}"_L1) << QString("{}"_L1)
++ // getOneOfCat // getOneOfDog
++ << SchemasModelsOneOf::Cat(expected) << emptyDog
++ // isOneOfCatValid // isOneOfCatSet
++ << true << true
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Invalid Field Types in for Cat(). Wrong type for age (bool instead of integer)
++ // Note: field of Cat type are not required, it means wrong fields can be omitted
++ expected = QString("{\"age\":true,\"hunts\":true}"_L1);
++ pet.fromJson(expected);
++ QTest::newRow("Invalid field 'age=true' in Cat via ::fromJson()")
++ // pet // expectedJson
++ << pet << QString("{\"hunts\":true}"_L1)
++ // expectedJsonValue
++ << pet.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << QString("{\"hunts\":true}"_L1) << QString("{}"_L1)
++ // getOneOfCat // getOneOfDog
++ << SchemasModelsOneOf::Cat(expected) << emptyDog
++ // isOneOfCatValid // isOneOfCatSet
++ << true << true
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ expected = QString("{\"age\":true,\"hunts\":1}"_L1);
++ pet.fromJson(expected);
++ QTest::newRow("Invalid fields: 'age=true', hunts=1 in Cat via ::fromJson()")
++ // pet // expectedJson
++ << pet << QString("{}"_L1)
++ // expectedJsonValue
++ << pet.asJsonValue()
++ // oneOfCatExpectedJson // oneOfDogExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // getOneOfCat // getOneOfDog
++ << emptyCat << emptyDog
++ // isOneOfCatValid // isOneOfCatSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++ }
++
++ void OneOfTest::testAlternativeSchemasFunctions()
++ {
++ QFETCH(SchemasModelsOneOf::Pet, pet);
++ QFETCH(QString, expectedJson);
++ QFETCH(QJsonValue, expectedJsonValue);
++ QFETCH(QString, oneOfCatExpectedJson);
++ QFETCH(QString, oneOfDogExpectedJson);
++ QFETCH(SchemasModelsOneOf::Cat, getOneOfCat);
++ QFETCH(SchemasModelsOneOf::Dog, getOneOfDog);
++ QFETCH(bool, isOneOfCatValid);
++ QFETCH(bool, isOneOfCatSet);
++ QFETCH(bool, isOneOfDogValid);
++ QFETCH(bool, isOneOfDogSet);
++ QFETCH(bool, isValid);
++ QFETCH(bool, isSet);
++
++ QCOMPARE(pet.asJson(), expectedJson);
++ QCOMPARE(pet.asJsonValue(), expectedJsonValue);
++ QCOMPARE(pet.getOneOfCat().asJson(), oneOfCatExpectedJson);
++ QCOMPARE(pet.isOneOfCatValid(), isOneOfCatValid);
++ QCOMPARE(pet.isOneOfCatSet(), isOneOfCatSet);
++ QCOMPARE(pet.getOneOfDog().asJson(), oneOfDogExpectedJson);
++ QCOMPARE(pet.getOneOfCat(), getOneOfCat);
++ QCOMPARE(pet.getOneOfDog(), getOneOfDog);
++ QCOMPARE(pet.isOneOfDogValid(), isOneOfDogValid);
++ QCOMPARE(pet.isOneOfDogSet(), isOneOfDogSet);
++ QCOMPARE(pet.isValid(), isValid);
++ QCOMPARE(pet.isSet(), isSet);
++ }
++
++ void OneOfTest::testAlternativeSchemasOptional_data()
++ {
++ generateAlternativeSchemasTestData();
++ }
++
++ void OneOfTest::testAlternativeSchemasOptional()
++ {
++ QFETCH(SchemasModelsOneOf::Pet, pet);
++ QFETCH(SchemasModelsOneOf::Cat, cat);
++ QFETCH(SchemasModelsOneOf::Dog, dog);
++ QFETCH(OneOfTest::StoreApiMode, mode);
++ QFETCH(QString, expectedJson);
++
++ bool done = true;
++ SchemasModelsOneOf::StoreApi api;
++ LoggingNetworkAccessManager logging(&api);
++ QRestAccessManager restManager(&logging, &api);
++ api.setRestAccessManager(&restManager);
++
++ switch (mode) {
++ case OneOfTest::StoreApiMode::UseCat:
++ {
++ api.postPetData(QtOpenApiCommon::OptionalParameter<SchemasModelsOneOf::Pet>(cat),
++ this, [&](const QRestReply &reply) {
++ done = reply.isSuccess();
++ });
++ } break;
++ case OneOfTest::StoreApiMode::UseDog:
++ {
++ api.postPetData(QtOpenApiCommon::OptionalParameter<SchemasModelsOneOf::Pet>(dog),
++ this, [&](const QRestReply &reply) {
++ done = reply.isSuccess();
++ });
++ } break;
++ case OneOfTest::StoreApiMode::UsePet:
++ {
++ api.postPetData(pet, this, [&](const QRestReply &reply) {
++ done = reply.isSuccess();
++ });
++ } break;
++ }
++ QCOMPARE(logging.m_content, expectedJson);
++ QTRY_COMPARE_EQ(done, false);
++ }
++
++ void OneOfTest::generateAlternativeSchemasTestData()
++ {
++ QTest::addColumn<SchemasModelsOneOf::Pet>("pet");
++ QTest::addColumn<SchemasModelsOneOf::Cat>("cat");
++ QTest::addColumn<SchemasModelsOneOf::Dog>("dog");
++ QTest::addColumn<OneOfTest::StoreApiMode>("mode");
++ QTest::addColumn<QString>("expectedJson");
++
++ QTest::newRow("empty")
++ << SchemasModelsOneOf::Pet{}
++ << SchemasModelsOneOf::Cat{}
++ << SchemasModelsOneOf::Dog{}
++ << OneOfTest::StoreApiMode::UsePet
++ << QString("{}"_L1);
++
++ SchemasModelsOneOf::Pet pet;
++ SchemasModelsOneOf::Cat kitty;
++ kitty.setHunts(true);
++ kitty.setAge(7);
++
++ SchemasModelsOneOf::Dog hund;
++ hund.setBark(false);
++ hund.setBreed("Labrador"_L1);
++
++ QTest::newRow("Use Cat object")
++ << SchemasModelsOneOf::Pet{}
++ << kitty
++ << SchemasModelsOneOf::Dog{}
++ << OneOfTest::StoreApiMode::UseCat
++ << QString("{\"age\":7,\"hunts\":true}"_L1);
++
++ QTest::newRow("Use Dog object")
++ << SchemasModelsOneOf::Pet{}
++ << SchemasModelsOneOf::Cat{}
++ << hund
++ << OneOfTest::StoreApiMode::UseDog
++ << QString("{\"bark\":false,\"breed\":\"Labrador\"}"_L1);
++
++ // Setting the cat the pet()
++ kitty.setAge(9);
++ pet.setOneOfCat(kitty);
++ QTest::newRow("Set the cat data to a pet object")
++ << pet
++ << SchemasModelsOneOf::Cat{}
++ << SchemasModelsOneOf::Dog{}
++ << OneOfTest::StoreApiMode::UsePet
++ << QString("{\"age\":9,\"hunts\":true}"_L1);
++
++ hund.setBark(true);
++ pet.setOneOfDog(hund);
++ QTest::newRow("Set the dog data to a pet object")
++ << pet
++ << SchemasModelsOneOf::Cat{}
++ << SchemasModelsOneOf::Dog{}
++ << OneOfTest::StoreApiMode::UsePet
++ << QString("{\"bark\":true,\"breed\":\"Labrador\"}"_L1);
++
++ pet.setOneOfDog(SchemasModelsOneOf::Dog());
++ QTest::newRow("Reset the pet data to an empty Dog()")
++ << pet
++ << SchemasModelsOneOf::Cat{}
++ << SchemasModelsOneOf::Dog{}
++ << OneOfTest::StoreApiMode::UsePet
++ << QString("{}"_L1);
++
++ SchemasModelsOneOf::Dog invalidDog;
++ invalidDog.setBreed("Unknown"_L1);
++ QTest::newRow("Construct the dog without setting the `required` field(bark)")
++ << SchemasModelsOneOf::Pet{}
++ << SchemasModelsOneOf::Cat{}
++ << invalidDog
++ << OneOfTest::StoreApiMode::UseDog
++ // It's empty because the object is not valid, without setting the required field
++ << QString("{}"_L1);
++
++ // Construct the cat but skipping some fields.
++ // NOTE: Cat type doesn't have `required` fields,
++ // so it will not be empty.
++ SchemasModelsOneOf::Cat cat;
++ cat.setAge(5);
++ QTest::newRow("Construct the cat with only age field set")
++ << SchemasModelsOneOf::Pet{}
++ << cat
++ << SchemasModelsOneOf::Dog{}
++ << OneOfTest::StoreApiMode::UseCat
++ << QString("{\"age\":5}"_L1);
++ }
++
++ void OneOfTest::testAlternativeSchemasRequired_data()
++ {
++ generateAlternativeSchemasTestData();
++ }
++
++ void OneOfTest::testAlternativeSchemasRequired()
++ {
++ QFETCH(SchemasModelsOneOf::Pet, pet);
++ QFETCH(SchemasModelsOneOf::Cat, cat);
++ QFETCH(SchemasModelsOneOf::Dog, dog);
++ QFETCH(OneOfTest::StoreApiMode, mode);
++ QFETCH(QString, expectedJson);
++
++ bool done = true;
++ SchemasModelsOneOf::StoreApi api;
++ LoggingNetworkAccessManager logging(&api);
++ QRestAccessManager restManager(&logging, &api);
++ api.setRestAccessManager(&restManager);
++
++ switch (mode) {
++ case OneOfTest::StoreApiMode::UseCat:
++ {
++ api.patchPetData(cat, this, [&](const QRestReply &reply) {
++ done = reply.isSuccess();
++ });
++ } break;
++ case OneOfTest::StoreApiMode::UseDog:
++ {
++ api.patchPetData(dog, this, [&](const QRestReply &reply) {
++ done = reply.isSuccess();
++ });
++ } break;
++ case OneOfTest::StoreApiMode::UsePet:
++ {
++ api.patchPetData(pet, this, [&](const QRestReply &reply) {
++ done = reply.isSuccess();
++ });
++ } break;
++ }
++ QCOMPARE(logging.m_content, expectedJson);
++ QTRY_COMPARE_EQ(done, false);
++ }
++
++ void OneOfTest::testClientValueJsonConversionMethods_data()
++ {
++ QTest::addColumn<SchemasModelsOneOf::Client_value>("clientValue");
++ QTest::addColumn<QString>("expectedJson");
++ QTest::addColumn<QJsonValue>("expectedJsonValue");
++ QTest::addColumn<QString>("oneOf0ExpectedValue");
++ QTest::addColumn<bool>("oneOf1ExpectedValue");
++ QTest::addColumn<bool>("isOneOf0Valid");
++ QTest::addColumn<bool>("isOneOf0Set");
++ QTest::addColumn<bool>("isOneOf1Valid");
++ QTest::addColumn<bool>("isOneOf1Set");
++ QTest::addColumn<bool>("isValid");
++ QTest::addColumn<bool>("isSet");
++
++ // Client_value has two primitive oneOf alternatives:
++ // oneOf0: string - always valid
++ // oneOf1: boolean - always valid
++ SchemasModelsOneOf::Client_value clientValue;
++ QTest::newRow("Empty Client_value object")
++ // clientValue // expectedJson
++ << clientValue << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << QString() << false
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Set a string value via setter
++ clientValue.setOneOfQString("hello-client"_L1);
++ QTest::newRow("Set a valid string via setter")
++ // clientValue // expectedJson
++ << clientValue << QString("\"hello-client\""_L1)
++ // expectedJsonValue
++ << QJsonValue("hello-client"_L1)
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << QString("hello-client"_L1) << false
++ // isOneOf0Valid // isOneOf0Set
++ << true << true
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set a bool 'true' via setter
++ clientValue.setOneOfBool(true);
++ QTest::newRow("Set a valid bool 'true' via setter")
++ // clientValue // expectedJson
++ << clientValue << QString("true"_L1)
++ // expectedJsonValue
++ << QJsonValue(true)
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << QString() << true
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Set a bool 'false' via setter
++ clientValue.setOneOfBool(false);
++ QTest::newRow("Set a valid bool 'false' via setter")
++ // clientValue // expectedJson
++ << clientValue << QString("false"_L1)
++ // expectedJsonValue
++ << QJsonValue(false)
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << QString() << false
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Set an empty string via setter
++ clientValue.setOneOfQString("");
++ QTest::newRow("Set an empty string via setter")
++ // clientValue // expectedJson
++ << clientValue << QString("\"\""_L1)
++ // expectedJsonValue
++ << QJsonValue(""_L1)
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << QString(""_L1) << false
++ // isOneOf0Valid // isOneOf0Set
++ << true << true
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with a string value
++ clientValue.fromJson("\"client-data\""_L1);
++ QTest::newRow("Set a valid string via ::fromJson()")
++ // clientValue // expectedJson
++ << clientValue << QString("\"client-data\""_L1)
++ // expectedJsonValue
++ << QJsonValue("client-data"_L1)
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << QString("client-data"_L1) << false
++ // isOneOf0Valid // isOneOf0Set
++ << true << true
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with a bool 'true' value
++ clientValue.fromJson("true"_L1);
++ QTest::newRow("Set a valid bool 'true' via ::fromJson()")
++ // clientValue // expectedJson
++ << clientValue << QString("true"_L1)
++ // expectedJsonValue
++ << QJsonValue(true)
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << QString() << true
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with a bool 'false' value
++ clientValue.fromJson("false"_L1);
++ QTest::newRow("Set a valid bool 'false' via ::fromJson()")
++ // clientValue // expectedJson
++ << clientValue << QString("false"_L1)
++ // expectedJsonValue
++ << QJsonValue(false)
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << QString() << false
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue with string
++ clientValue.fromJsonValue(QJsonValue("via-json-value"_L1));
++ QTest::newRow("Set a valid string via ::fromJsonValue()")
++ // clientValue // expectedJson
++ << clientValue << QString("\"via-json-value\""_L1)
++ // expectedJsonValue
++ << QJsonValue("via-json-value"_L1)
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << QString("via-json-value"_L1) << false
++ // isOneOf0Valid // isOneOf0Set
++ << true << true
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue with bool
++ clientValue.fromJsonValue(QJsonValue(true));
++ QTest::newRow("Set a valid bool 'true' via ::fromJsonValue()")
++ // clientValue // expectedJson
++ << clientValue << QString("true"_L1)
++ // expectedJsonValue
++ << QJsonValue(true)
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << QString() << true
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // invalid json! => the model is RESET to INITIAL state
++ clientValue.fromJson("{invalid json}"_L1);
++ QTest::newRow("Set an invalid json via ::fromJson()")
++ // clientValue // expectedJson
++ << clientValue << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << QString() << false
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Test with non-primitive JSON (object) => doesn't match string or bool
++ clientValue.fromJson("{\"key\":\"value\"}"_L1);
++ QTest::newRow("Set an unexpected object via ::fromJson()")
++ // clientValue // expectedJson
++ << clientValue << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << QString() << false
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Test with array JSON => doesn't match string or bool
++ clientValue.fromJson("[1, 2]"_L1);
++ QTest::newRow("Client_value: set an unexpected array via ::fromJson()")
++ // clientValue // expectedJson
++ << clientValue << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << QString() << false
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Test with null JSON => doesn't match string or bool
++ clientValue.fromJson("null"_L1);
++ QTest::newRow("Set a null value via ::fromJson()")
++ // clientValue // expectedJson
++ << clientValue << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << QString() << false
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Test with number JSON => doesn't match string or bool
++ clientValue.fromJson("42"_L1);
++ QTest::newRow("Set an unexpected number via ::fromJson()")
++ // clientValue // expectedJson
++ << clientValue << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << QString() << false
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJson with a string that looks like a bool (but is quoted => string)
++ clientValue.fromJson("\"true\""_L1);
++ QTest::newRow("Set a string 'true' (quoted) via ::fromJson()")
++ // clientValue // expectedJson
++ << clientValue << QString("\"true\""_L1)
++ // expectedJsonValue
++ << QJsonValue("true"_L1)
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << QString("true"_L1) << false
++ // isOneOf0Valid // isOneOf0Set
++ << true << true
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with a string that looks like a number (but is quoted => string)
++ clientValue.fromJson("\"42\""_L1);
++ QTest::newRow("Set a string '42' (quoted) via ::fromJson()")
++ // clientValue // expectedJson
++ << clientValue << QString("\"42\""_L1)
++ // expectedJsonValue
++ << QJsonValue("42"_L1)
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << QString("42"_L1) << false
++ // isOneOf0Valid // isOneOf0Set
++ << true << true
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Override string with bool via setter
++ clientValue.setOneOfQString("will be overridden"_L1);
++ clientValue.setOneOfBool(true);
++ QTest::newRow("Override string with bool via setter")
++ // clientValue // expectedJson
++ << clientValue << QString("true"_L1)
++ // expectedJsonValue
++ << QJsonValue(true)
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << QString() << true
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Override bool with string via setter
++ clientValue.setOneOfBool(false);
++ clientValue.setOneOfQString("override-back"_L1);
++ QTest::newRow("Override bool with string via setter")
++ // clientValue // expectedJson
++ << clientValue << QString("\"override-back\""_L1)
++ // expectedJsonValue
++ << QJsonValue("override-back"_L1)
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << QString("override-back"_L1) << false
++ // isOneOf0Valid // isOneOf0Set
++ << true << true
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // String with special characters
++ clientValue.setOneOfQString("line1\nline2\ttab"_L1);
++ QTest::newRow("Set a string with special characters via setter")
++ // clientValue // expectedJson
++ << clientValue << QString("\"line1\\nline2\\ttab\""_L1)
++ // expectedJsonValue
++ << QJsonValue("line1\nline2\ttab"_L1)
++ // oneOf0ExpectedValue
++ << QString("line1\nline2\ttab"_L1)
++ // oneOf1ExpectedValue
++ << false
++ // isOneOf0Valid // isOneOf0Set
++ << true << true
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++ }
++
++ void OneOfTest::testClientValueJsonConversionMethods()
++ {
++ QFETCH(SchemasModelsOneOf::Client_value, clientValue);
++ QFETCH(QString, expectedJson);
++ QFETCH(QJsonValue, expectedJsonValue);
++ QFETCH(QString, oneOf0ExpectedValue);
++ QFETCH(bool, oneOf1ExpectedValue);
++ QFETCH(bool, isOneOf0Valid);
++ QFETCH(bool, isOneOf0Set);
++ QFETCH(bool, isOneOf1Valid);
++ QFETCH(bool, isOneOf1Set);
++ QFETCH(bool, isValid);
++ QFETCH(bool, isSet);
++
++ QCOMPARE(clientValue.asJson(), expectedJson);
++ QCOMPARE(clientValue.asJsonValue(), expectedJsonValue);
++ QCOMPARE(clientValue.getOneOfQString(), oneOf0ExpectedValue);
++ QCOMPARE(clientValue.isOneOfQStringValid(), isOneOf0Valid);
++ QCOMPARE(clientValue.isOneOfQStringSet(), isOneOf0Set);
++ QCOMPARE(clientValue.getOneOfBool(), oneOf1ExpectedValue);
++ QCOMPARE(clientValue.isOneOfBoolValid(), isOneOf1Valid);
++ QCOMPARE(clientValue.isOneOfBoolSet(), isOneOf1Set);
++ QCOMPARE(clientValue.isValid(), isValid);
++ QCOMPARE(clientValue.isSet(), isSet);
++ }
++
++ void OneOfTest::testCustomerJsonConversionMethods_data()
++ {
++ QTest::addColumn<SchemasModelsOneOf::PostSearchData_request_customer>("customer");
++ QTest::addColumn<QString>("expectedJson");
++ QTest::addColumn<QJsonValue>("expectedJsonValue");
++ QTest::addColumn<qint32>("oneOf0ExpectedValue");
++ QTest::addColumn<QString>("oneOf1ExpectedValue");
++ QTest::addColumn<QString>("oneOf2ExpectedJson");
++ QTest::addColumn<QString>("oneOf3ExpectedJson");
++ QTest::addColumn<bool>("isOneOf0Valid");
++ QTest::addColumn<bool>("isOneOf0Set");
++ QTest::addColumn<bool>("isOneOf1Valid");
++ QTest::addColumn<bool>("isOneOf1Set");
++ QTest::addColumn<bool>("isOneOf2Valid");
++ QTest::addColumn<bool>("isOneOf2Set");
++ QTest::addColumn<bool>("isOneOf3Valid");
++ QTest::addColumn<bool>("isOneOf3Set");
++ QTest::addColumn<bool>("isValid");
++ QTest::addColumn<bool>("isSet");
++
++ // PostSearchData_request_customer has 4 oneOf alternatives:
++ // oneOf0: qint32 (customer ID) - primitive, always valid
++ // oneOf1: QString (phone number) - primitive, always valid
++ // oneOf2: PostSearchData_request_customer_oneOf (userName REQUIRED, channel optional)
++ // oneOf3: PostSearchData_request_customer_oneOf_1 (customerId REQUIRED)
++ SchemasModelsOneOf::PostSearchData_request_customer customer;
++ QTest::newRow("Empty PostSearchData_request_customer object")
++ // customer // expectedJson
++ << customer << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(0) << QString()
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isOneOf2Valid // isOneOf2Valid
++ << false << false
++ // isOneOf3Valid // isOneOf3Set
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Set an integer (customer ID) via setter
++ customer.setOneOfQint32(12345);
++ QTest::newRow("Set a valid integer (customer ID) via setter")
++ // customer // expectedJson
++ << customer << QString("12345"_L1)
++ // expectedJsonValue
++ << QJsonValue(12345)
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(12345) << QString()
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << true << true
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isOneOf2Valid // isOneOf2Valid
++ << false << false
++ // isOneOf3Valid // isOneOf3Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set a string (phone number) via setter
++ customer.setOneOfQString("+1234567890"_L1);
++ QTest::newRow("Set a valid string (phone number) via setter")
++ // customer // expectedJson
++ << customer << QString("\"+1234567890\""_L1)
++ // expectedJsonValue
++ << QJsonValue("+1234567890"_L1)
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(0) << QString("+1234567890"_L1)
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << true << true
++ // isOneOf2Valid // isOneOf2Valid
++ << false << false
++ // isOneOf3Valid // isOneOf3Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set a valid object with userName (required) via setter
++ SchemasModelsOneOf::PostSearchData_request_customer_oneOf userObj;
++ userObj.setUserName("john_doe"_L1);
++ userObj.setChannel("web"_L1);
++ customer.setOneOfPostSearchData_request_customer_oneOf(userObj);
++ QTest::newRow("Set a valid userName object via setter")
++ // customer // expectedJson
++ << customer << userObj.asJson()
++ // expectedJsonValue
++ << userObj.asJsonValue()
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(0) << QString()
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << userObj.asJson() << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isOneOf2Valid // isOneOf2Valid
++ << true << true
++ // isOneOf3Valid // isOneOf3Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set a valid object with customerId (required) via setter
++ SchemasModelsOneOf::PostSearchData_request_customer_oneOf_1 customerIdObj;
++ customerIdObj.setCustomerId("CUST-001"_L1);
++ customer.setOneOfPostSearchData_request_customer_oneOf_1(customerIdObj);
++ QTest::newRow("Set a valid customerId object via setter")
++ // customer // expectedJson
++ << customer << customerIdObj.asJson()
++ // expectedJsonValue
++ << customerIdObj.asJsonValue()
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(0) << QString()
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << QString("{}"_L1) << customerIdObj.asJson()
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isOneOf2Valid // isOneOf2Valid
++ << false << false
++ // isOneOf3Valid // isOneOf3Set
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Set an empty userName object (missing required userName) => invalid
++ SchemasModelsOneOf::PostSearchData_request_customer_oneOf emptyUserObj;
++ customer.setOneOfPostSearchData_request_customer_oneOf(emptyUserObj);
++ QTest::newRow("Set an empty userName object via setter")
++ // customer // expectedJson
++ << customer << emptyUserObj.asJson()
++ // expectedJsonValue
++ << emptyUserObj.asJsonValue()
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(0) << QString()
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isOneOf2Valid // isOneOf2Valid
++ << false << false
++ // isOneOf3Valid // isOneOf3Set
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Set an empty customerId object (missing required customerId) => invalid
++ SchemasModelsOneOf::PostSearchData_request_customer_oneOf_1 emptyCustomerIdObj;
++ customer.setOneOfPostSearchData_request_customer_oneOf_1(emptyCustomerIdObj);
++ QTest::newRow("Set an empty customerId object via setter")
++ // customer // expectedJson
++ << customer << emptyCustomerIdObj.asJson()
++ // expectedJsonValue
++ << emptyCustomerIdObj.asJsonValue()
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(0) << QString()
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isOneOf2Valid // isOneOf2Valid
++ << false << false
++ // isOneOf3Valid // isOneOf3Set
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Set zero integer via setter (still valid - it's a legitimate value)
++ customer.setOneOfQint32(0);
++ QTest::newRow("Set zero integer via setter")
++ // customer // expectedJson
++ << customer << QString("0"_L1)
++ // expectedJsonValue
++ << QJsonValue(0)
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(0) << QString()
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << true << true
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isOneOf2Valid // isOneOf2Valid
++ << false << false
++ // isOneOf3Valid // isOneOf3Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set negative integer via setter
++ customer.setOneOfQint32(-42);
++ QTest::newRow("Set negative integer via setter")
++ // customer // expectedJson
++ << customer << QString("-42"_L1)
++ // expectedJsonValue
++ << QJsonValue(-42)
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(-42) << QString()
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << true << true
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isOneOf2Valid // isOneOf2Valid
++ << false << false
++ // isOneOf3Valid // isOneOf3Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with an integer value
++ customer.fromJson("99999"_L1);
++ QTest::newRow("Set a valid integer via ::fromJson()")
++ // customer // expectedJson
++ << customer << QString("99999"_L1)
++ // expectedJsonValue
++ << QJsonValue(99999)
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(99999) << QString()
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << true << true
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isOneOf2Valid // isOneOf2Valid
++ << false << false
++ // isOneOf3Valid // isOneOf3Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with a string value
++ customer.fromJson("\"+79001234567\""_L1);
++ QTest::newRow("Set a valid phone number string via ::fromJson()")
++ // customer // expectedJson
++ << customer << QString("\"+79001234567\""_L1)
++ // expectedJsonValue
++ << QJsonValue("+79001234567"_L1)
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(0) << QString("+79001234567"_L1)
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << true << true
++ // isOneOf2Valid // isOneOf2Valid
++ << false << false
++ // isOneOf3Valid // isOneOf3Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with a valid userName object
++ const QString validUserJson("{\"channel\":\"mobile\",\"userName\":\"jane_doe\"}"_L1);
++ customer.fromJson(validUserJson);
++ QTest::newRow("Set a valid userName object via ::fromJson()")
++ // customer // expectedJson
++ << customer << validUserJson
++ // expectedJsonValue
++ << customer.asJsonValue()
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(0) << QString()
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << validUserJson << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isOneOf2Valid // isOneOf2Valid
++ << true << true
++ // isOneOf3Valid // isOneOf3Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with a valid customerId object
++ const QString validCustIdJson("{\"customerId\":\"CUST-999\"}"_L1);
++ customer.fromJson(validCustIdJson);
++ QTest::newRow("Set a valid customerId object via ::fromJson()")
++ // customer // expectedJson
++ << customer << validCustIdJson
++ // expectedJsonValue
++ << customer.asJsonValue()
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(0) << QString()
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << QString("{}"_L1) << validCustIdJson
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isOneOf2Valid // isOneOf2Valid
++ << false << false
++ // isOneOf3Valid // isOneOf3Set
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with userName object only (without channel - channel is optional)
++ const QString userOnlyJson("{\"userName\":\"admin\"}"_L1);
++ customer.fromJson(userOnlyJson);
++ QTest::newRow("Set userName object without channel via ::fromJson()")
++ // customer // expectedJson
++ << customer << userOnlyJson
++ // expectedJsonValue
++ << customer.asJsonValue()
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(0) << QString()
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << userOnlyJson << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isOneOf2Valid // isOneOf2Valid
++ << true << true
++ // isOneOf3Valid // isOneOf3Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue with integer
++ customer.fromJsonValue(QJsonValue(777));
++ QTest::newRow("Set a valid integer via ::fromJsonValue()")
++ // customer // expectedJson
++ << customer << QString("777"_L1)
++ // expectedJsonValue
++ << QJsonValue(777)
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(777) << QString()
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << true << true
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isOneOf2Valid // isOneOf2Valid
++ << false << false
++ // isOneOf3Valid // isOneOf3Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue with string
++ customer.fromJsonValue(QJsonValue("+4912345"_L1));
++ QTest::newRow("Set a valid string via ::fromJsonValue()")
++ // customer // expectedJson
++ << customer << QString("\"+4912345\""_L1)
++ // expectedJsonValue
++ << QJsonValue("+4912345"_L1)
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(0) << QString("+4912345"_L1)
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << true << true
++ // isOneOf2Valid // isOneOf2Valid
++ << false << false
++ // isOneOf3Valid // isOneOf3Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue with valid userName object
++ customer.fromJsonValue(userObj.asJsonValue());
++ QTest::newRow("Set a valid userName object via ::fromJsonValue()")
++ // customer // expectedJson
++ << customer << userObj.asJson()
++ // expectedJsonValue
++ << customer.asJsonValue()
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(0) << QString()
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << userObj.asJson() << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isOneOf2Valid // isOneOf2Valid
++ << true << true
++ // isOneOf3Valid // isOneOf3Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue with valid customerId object
++ customer.fromJsonValue(customerIdObj.asJsonValue());
++ QTest::newRow("Set a valid customerId object via ::fromJsonValue()")
++ // customer // expectedJson
++ << customer << customerIdObj.asJson()
++ // expectedJsonValue
++ << customer.asJsonValue()
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(0) << QString()
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << QString("{}"_L1) << customerIdObj.asJson()
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isOneOf2Valid // isOneOf2Valid
++ << false << false
++ // isOneOf3Valid // isOneOf3Set
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // invalid json! => the model is RESET to INITIAL state
++ customer.fromJson("{invalid json}"_L1);
++ QTest::newRow("Set an invalid json via ::fromJson()")
++ // customer // expectedJson
++ << customer << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(0) << QString()
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isOneOf2Valid // isOneOf2Valid
++ << false << false
++ // isOneOf3Valid // isOneOf3Set
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Test with array JSON => doesn't match any alternative
++ customer.fromJson("[]"_L1);
++ QTest::newRow("PostSearchData_request_customer: set an unexpected array via ::fromJson()")
++ // customer // expectedJson
++ << customer << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(0) << QString()
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isOneOf2Valid // isOneOf2Valid
++ << false << false
++ // isOneOf3Valid // isOneOf3Set
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJson with empty object "{}" => neither userName nor customerId objects
++ // are valid (both have required fields). Does not match int or string either.
++ customer.fromJson("{}"_L1);
++ QTest::newRow("Set an empty object {} via ::fromJson()")
++ // customer // expectedJson
++ << customer << QString("{}"_L1)
++ // expectedJsonValue
++ << customer.asJsonValue()
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(0) << QString()
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isOneOf2Valid // isOneOf2Valid
++ << false << false
++ // isOneOf3Valid // isOneOf3Set
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJson with a bool value => doesn't match int, string, or objects
++ customer.fromJson("true"_L1);
++ QTest::newRow("Set an unexpected bool via ::fromJson()")
++ // customer // expectedJson
++ << customer << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(0) << QString()
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isOneOf2Valid // isOneOf2Valid
++ << false << false
++ // isOneOf3Valid // isOneOf3Set
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJson with a double value => doesn't match qint32 (not integer)
++ customer.fromJson("3.14"_L1);
++ QTest::newRow("Set a double via ::fromJson() (no double alternative)")
++ // customer // expectedJson
++ << customer << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(0) << QString()
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isOneOf2Valid // isOneOf2Valid
++ << false << false
++ // isOneOf3Valid // isOneOf3Set
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Invalid userName object - missing required userName, has only channel
++ customer.fromJson("{\"channel\":\"email\"}"_L1);
++ QTest::newRow("Set userName object missing required 'userName' via ::fromJson()")
++ // customer // expectedJson
++ << customer << QString("{}"_L1)
++ // expectedJsonValue
++ << customer.asJsonValue()
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(0) << QString()
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << QString("{\"channel\":\"email\"}"_L1) << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isOneOf2Valid // isOneOf2Valid
++ << false << true
++ // isOneOf3Valid // isOneOf3Set
++ << false << false
++ // isValid // isSet
++ << false << true;
++
++ // Extra/Unknown Fields in userName object JSON
++ customer.fromJson("{\"userName\":\"user1\",\"channel\":\"sms\",\"extra\":\"field\"}"_L1);
++ QString expected("{\"channel\":\"sms\",\"userName\":\"user1\"}"_L1);
++ QTest::newRow("Extra/Unknown Fields in userName object via ::fromJson()")
++ // customer // expectedJson
++ << customer << expected
++ // expectedJsonValue
++ << customer.asJsonValue()
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(0) << QString()
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << expected << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isOneOf2Valid // isOneOf2Valid
++ << true << true
++ // isOneOf3Valid // isOneOf3Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set userName object with invalid type for userName field (int instead of string)
++ customer.fromJson("{\"userName\":123,\"channel\":\"web\"}"_L1);
++ QTest::newRow("Invalid 'userName=123' in userName object via ::fromJson()")
++ // customer // expectedJson
++ << customer << QString("{}"_L1)
++ // expectedJsonValue
++ << customer.asJsonValue()
++ // oneOf0ExpectedValue // oneOf1ExpectedValue
++ << qint32(0) << QString()
++ // oneOf2ExpectedJson // oneOf3ExpectedJson
++ << QString("{\"channel\":\"web\"}"_L1) << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isOneOf2Valid // isOneOf2Valid
++ << false << true
++ // isOneOf3Valid // isOneOf3Set
++ << false << false
++ // isValid // isSet
++ << false << true;
++ }
++
++ void OneOfTest::testCustomerJsonConversionMethods()
++ {
++ QFETCH(SchemasModelsOneOf::PostSearchData_request_customer, customer);
++ QFETCH(QString, expectedJson);
++ QFETCH(QJsonValue, expectedJsonValue);
++ QFETCH(qint32, oneOf0ExpectedValue);
++ QFETCH(QString, oneOf1ExpectedValue);
++ QFETCH(QString, oneOf2ExpectedJson);
++ QFETCH(QString, oneOf3ExpectedJson);
++ QFETCH(bool, isOneOf0Valid);
++ QFETCH(bool, isOneOf0Set);
++ QFETCH(bool, isOneOf1Valid);
++ QFETCH(bool, isOneOf1Set);
++ QFETCH(bool, isOneOf2Valid);
++ QFETCH(bool, isOneOf2Set);
++ QFETCH(bool, isOneOf3Valid);
++ QFETCH(bool, isOneOf3Set);
++ QFETCH(bool, isValid);
++ QFETCH(bool, isSet);
++
++ QCOMPARE(customer.asJson(), expectedJson);
++ QCOMPARE(customer.asJsonValue(), expectedJsonValue);
++ QCOMPARE(customer.getOneOfQint32(), oneOf0ExpectedValue);
++ QCOMPARE(customer.isOneOfQint32Valid(), isOneOf0Valid);
++ QCOMPARE(customer.isOneOfQint32Set(), isOneOf0Set);
++ QCOMPARE(customer.getOneOfQString(), oneOf1ExpectedValue);
++ QCOMPARE(customer.isOneOfQStringValid(), isOneOf1Valid);
++ QCOMPARE(customer.isOneOfQStringSet(), isOneOf1Set);
++ QCOMPARE(customer.getOneOfPostSearchData_request_customer_oneOf().asJson(), oneOf2ExpectedJson);
++ QCOMPARE(customer.isOneOfPostSearchDataRequestCustomerOneOfValid(), isOneOf2Valid);
++ QCOMPARE(customer.isOneOfPostSearchDataRequestCustomerOneOfSet(), isOneOf2Set);
++ QCOMPARE(customer.getOneOfPostSearchData_request_customer_oneOf_1().asJson(), oneOf3ExpectedJson);
++ QCOMPARE(customer.isOneOfPostSearchDataRequestCustomerOneOf1Valid(), isOneOf3Valid);
++ QCOMPARE(customer.isOneOfPostSearchDataRequestCustomerOneOf1Set(), isOneOf3Set);
++ QCOMPARE(customer.isValid(), isValid);
++ QCOMPARE(customer.isSet(), isSet);
++ }
++
++ void OneOfTest::testInlineSchemasJsonConversionMethods_data()
++ {
++ QTest::addColumn<SchemasModelsOneOf::PostPaymentData_request>("postRequest");
++ QTest::addColumn<QString>("expectedJson");
++ QTest::addColumn<QJsonValue>("expectedJsonValue");
++ QTest::addColumn<QString>("oneOf0ExpectedJson");
++ QTest::addColumn<QString>("oneOf1ExpectedJson");
++ QTest::addColumn<SchemasModelsOneOf::PostPaymentData_request_oneOf>("getOneOfPostPaymentData_request_oneOf");
++ QTest::addColumn<SchemasModelsOneOf::PostPaymentData_request_oneOf_1>("getOneOfPostPaymentData_request_oneOf_1");
++ QTest::addColumn<bool>("isOneOfPostPaymentDataRequestOneOfValid");
++ QTest::addColumn<bool>("isOneOfPostPaymentDataRequestOneOfSet");
++ QTest::addColumn<bool>("isOneOfPostPaymentDataRequestOneOf1Valid");
++ QTest::addColumn<bool>("isOneOfPostPaymentDataRequestOneOf1Set");
++ QTest::addColumn<bool>("isValid");
++ QTest::addColumn<bool>("isSet");
++
++ // PostPaymentData_request has two inline object schemas:
++ // oneOf0: PostPaymentData_request_oneOf with cardNumber (string, REQUIRED)
++ // and cardAvailability (bool)
++ // oneOf1: PostPaymentData_request_oneOf_1 with paypalEmail (string)
++ // and paypalAvailability (bool)
++ SchemasModelsOneOf::PostPaymentData_request postRequest;
++ QTest::newRow("Empty PostPaymentData_request object")
++ // postRequest // expectedJson
++ << postRequest << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf()
++ // getOneOfPostPaymentData_request_oneOf_1
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf_1()
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << false
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << false
++ // isValid // isSet
++ << false << false;
++
++ // Create valid credit card (oneOf0) - has required 'cardNumber'
++ SchemasModelsOneOf::PostPaymentData_request_oneOf creditCard;
++ creditCard.setCardNumber("1234-5678-9012-3456"_L1);
++ creditCard.setCardAvailability(true);
++
++ // Create valid paypal (oneOf1) - no required fields
++ SchemasModelsOneOf::PostPaymentData_request_oneOf_1 paypal;
++ paypal.setPaypalEmail("user@example.com"_L1);
++ paypal.setPaypalAvailability(true);
++
++ // Set a valid credit card via setter
++ postRequest.setOneOfPostPaymentData_request_oneOf(creditCard);
++ QTest::newRow("Set a valid CreditCard object via setter")
++ // postRequest // expectedJson
++ << postRequest << creditCard.asJson()
++ // expectedJsonValue
++ << creditCard.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << creditCard.asJson() << QString("{}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << creditCard
++ // getOneOfPostPaymentData_request_oneOf_1
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf_1()
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << true
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << false
++ // isValid // isSet
++ << true << true;
++
++ // Set a valid paypal via setter (overrides credit card)
++ postRequest.setOneOfPostPaymentData_request_oneOf_1(paypal);
++ QTest::newRow("Set a valid Paypal object via setter")
++ // postRequest // expectedJson
++ << postRequest << paypal.asJson()
++ // expectedJsonValue
++ << paypal.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << paypal.asJson()
++ // getOneOfPostPaymentData_request_oneOf
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf()
++ // getOneOfPostPaymentData_request_oneOf_1
++ << paypal
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << false
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << true
++ // isValid // isSet
++ << true << true;
++
++ // Set an empty CreditCard object. CreditCard has required 'cardNumber',
++ // so an empty credit card is INVALID => entire PostPaymentData_request stays invalid
++ const SchemasModelsOneOf::PostPaymentData_request_oneOf emptyCreditCard;
++ postRequest.setOneOfPostPaymentData_request_oneOf(emptyCreditCard);
++ QTest::newRow("Set an empty CreditCard object via setter")
++ // postRequest // expectedJson
++ << postRequest << emptyCreditCard.asJson()
++ // expectedJsonValue
++ << emptyCreditCard.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << emptyCreditCard
++ // getOneOfPostPaymentData_request_oneOf_1
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf_1()
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << false
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << false
++ // isValid // isSet
++ << false << false;
++
++ // Set an empty Paypal object. Paypal has no required fields,
++ // so an empty paypal is VALID => entire PostPaymentData_request becomes valid
++ const SchemasModelsOneOf::PostPaymentData_request_oneOf_1 emptyPaypal;
++ postRequest.setOneOfPostPaymentData_request_oneOf_1(emptyPaypal);
++ QTest::newRow("Set an empty Paypal object via setter")
++ // postRequest // expectedJson
++ << postRequest << emptyPaypal.asJson()
++ // expectedJsonValue
++ << emptyPaypal.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << emptyCreditCard
++ // getOneOfPostPaymentData_request_oneOf_1
++ << emptyPaypal
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << false
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << true
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue with EMPTY data.
++ // Attempting to set an empty CreditCard via postRequest.fromJsonValue().
++ // CreditCard defines required field 'cardNumber', so an empty object is INVALID
++ // for CreditCard.
++ //
++ // However, emptyPaypal.asJsonValue() produces '{}' because it is an empty object.
++ //
++ // The PostPaymentData_request::fromJsonValue() logic cannot determine whether '{}'
++ // represents a CreditCard or Paypal. It tries each schema:
++ // - CreditCard: INVALID (missing required cardNumber)
++ // - Paypal: VALID (no required fields)
++ //
++ // So '{}' resolves to Paypal (oneOf1).
++ postRequest.fromJsonValue(emptyCreditCard.asJsonValue());
++ QTest::newRow("Set an empty CreditCard via ::fromJsonValue(emptyCreditCard.asJsonValue())")
++ // postRequest // expectedJson
++ << postRequest << emptyCreditCard.asJson()
++ // expectedJsonValue
++ << emptyCreditCard.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << emptyCreditCard
++ // getOneOfPostPaymentData_request_oneOf_1
++ << emptyPaypal
++ // !!! NOTE: ambiguity resolved to Paypal (oneOf1) since CreditCard is invalid
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << false
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << true
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with EMPTY data. Same expectations as above.
++ postRequest.fromJson(emptyCreditCard.asJson());
++ QTest::newRow("Set an empty CreditCard via ::fromJson(emptyCreditCard.asJson())")
++ // postRequest // expectedJson
++ << postRequest << emptyCreditCard.asJson()
++ // expectedJsonValue
++ << emptyCreditCard.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << emptyCreditCard
++ // getOneOfPostPaymentData_request_oneOf_1
++ << emptyPaypal
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << false
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << true
++ // isValid // isSet
++ << true << true;
++
++ // ::fromJson with EMPTY Paypal data. Same expectations.
++ postRequest.fromJson(emptyPaypal.asJson());
++ QTest::newRow("Set an empty Paypal via ::fromJson(emptyPaypal.asJson())")
++ // postRequest // expectedJson
++ << postRequest << emptyPaypal.asJson()
++ // expectedJsonValue
++ << emptyPaypal.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << emptyCreditCard
++ // getOneOfPostPaymentData_request_oneOf_1
++ << emptyPaypal
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << false
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << true
++ // isValid // isSet
++ << true << true;
++
++ postRequest.fromJsonValue(emptyPaypal.asJsonValue());
++ QTest::newRow("Set an empty Paypal via ::fromJsonValue(emptyPaypal.asJsonValue())")
++ // postRequest // expectedJson
++ << postRequest << emptyPaypal.asJson()
++ // expectedJsonValue
++ << emptyPaypal.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << emptyCreditCard
++ // getOneOfPostPaymentData_request_oneOf_1
++ << emptyPaypal
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << false
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << true
++ // isValid // isSet
++ << true << true;
++
++ // check ::fromJson() works fine for VALID credit card object
++ const QString validCard("{\"cardAvailability\":true,\"cardNumber\":\"1234-5678-9012-3456\"}"_L1);
++ postRequest.fromJson(validCard);
++ QTest::newRow("Set a valid CreditCard object via ::fromJson()")
++ // postRequest // expectedJson
++ << postRequest << validCard
++ // expectedJsonValue
++ << postRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << validCard << QString("{}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf(validCard)
++ // getOneOfPostPaymentData_request_oneOf_1
++ << emptyPaypal
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << true
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << false
++ // isValid // isSet
++ << true << true;
++
++ // check ::fromJsonValue() works fine for VALID credit card object
++ const SchemasModelsOneOf::PostPaymentData_request_oneOf okCard(validCard);
++ postRequest.fromJsonValue(okCard.asJsonValue());
++ QTest::newRow("Set a valid CreditCard object via ::fromJsonValue()")
++ // postRequest // expectedJson
++ << postRequest << validCard
++ // expectedJsonValue
++ << postRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << validCard << QString("{}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << okCard
++ // getOneOfPostPaymentData_request_oneOf_1
++ << emptyPaypal
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << true
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << false
++ // isValid // isSet
++ << true << true;
++
++ // check ::fromJson() works fine for VALID paypal object
++ // Note: an empty credit card (emptyCreditCard) is not valid and not set,
++ // because it has a required field.
++ const QString validPaypal("{\"paypalAvailability\":true,\"paypalEmail\":\"user@example.com\"}"_L1);
++ postRequest.fromJson(validPaypal);
++ QTest::newRow("Set a valid Paypal object via ::fromJson()")
++ // postRequest // expectedJson
++ << postRequest << validPaypal
++ // expectedJsonValue
++ << postRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << validPaypal
++ // getOneOfPostPaymentData_request_oneOf
++ << emptyCreditCard
++ // getOneOfPostPaymentData_request_oneOf_1
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf_1(validPaypal)
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << false
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << true
++ // isValid // isSet
++ << true << true;
++
++ // check ::fromJsonValue() works fine for VALID paypal object
++ const SchemasModelsOneOf::PostPaymentData_request_oneOf_1 okPaypal(validPaypal);
++ postRequest.fromJsonValue(okPaypal.asJsonValue());
++ QTest::newRow("Set a valid Paypal object via ::fromJsonValue()")
++ // postRequest // expectedJson
++ << postRequest << validPaypal
++ // expectedJsonValue
++ << postRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << validPaypal
++ // getOneOfPostPaymentData_request_oneOf
++ << emptyCreditCard
++ // getOneOfPostPaymentData_request_oneOf_1
++ << okPaypal
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << false
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << true
++ // isValid // isSet
++ << true << true;
++
++ // invalid json! => the model is RESET to INITIAL state
++ postRequest.fromJson("{invalid json}"_L1);
++ QTest::newRow("Set an invalid json via ::fromJson()")
++ // postRequest // expectedJson
++ << postRequest << QString("{}"_L1)
++ // expectedJsonValue
++ << postRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << emptyCreditCard
++ // getOneOfPostPaymentData_request_oneOf_1
++ << emptyPaypal
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << false
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << false
++ // isValid // isSet
++ << false << false;
++
++ // Test with non-object JSON (array) => the model is RESET to INITIAL state
++ postRequest.fromJson("[]"_L1);
++ QTest::newRow("Set an unexpected array [] via ::fromJson()")
++ // postRequest // expectedJson
++ << postRequest << QString("{}"_L1)
++ // expectedJsonValue
++ << postRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << emptyCreditCard
++ // getOneOfPostPaymentData_request_oneOf_1
++ << emptyPaypal
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << false
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << false
++ // isValid // isSet
++ << false << false;
++
++ // Test with non-object JSON (string) => the model is RESET to INITIAL state
++ postRequest.fromJson("\"just a string\""_L1);
++ QTest::newRow("Set an unexpected string via ::fromJson()")
++ // postRequest // expectedJson
++ << postRequest << QString("{}"_L1)
++ // expectedJsonValue
++ << postRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << emptyCreditCard
++ // getOneOfPostPaymentData_request_oneOf_1
++ << emptyPaypal
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << false
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << false
++ // isValid // isSet
++ << false << false;
++
++ // Missing Required Fields (CreditCard's 'cardNumber' is required)
++ // CreditCard without required 'cardNumber' field - should not be valid
++ SchemasModelsOneOf::PostPaymentData_request_oneOf invalidCard;
++ invalidCard.setCardAvailability(true);
++ postRequest.setOneOfPostPaymentData_request_oneOf(invalidCard);
++ QTest::newRow("Set an invalid CreditCard via setter")
++ // postRequest // expectedJson
++ << postRequest << QString("{}"_L1)
++ // expectedJsonValue
++ << postRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{\"cardAvailability\":true}"_L1) << QString("{}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << invalidCard
++ // getOneOfPostPaymentData_request_oneOf_1
++ << emptyPaypal
++ // The status here reflects the status of the model that was set.
++ // The model's field was set by setter, so invalidCard.isSet() == true
++ // but invalidCard.isValid() == false, because required field is not set.
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << invalidCard.isValid()
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << invalidCard.isSet()
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << false
++ // isValid // isSet
++ << false << true;
++
++ // Try to parse JSON missing required field for CreditCard.
++ // cardNumber is required but missing => CreditCard is invalid.
++ // Paypal has paypalAvailability (bool) but not cardAvailability,
++ // so this doesn't match Paypal either since field name differs.
++ postRequest.fromJson("{\"cardAvailability\":true}"_L1);
++ QTest::newRow("Set an invalid CreditCard via ::fromJson()")
++ // postRequest // expectedJson
++ << postRequest << QString("{}"_L1)
++ // expectedJsonValue
++ << postRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{\"cardAvailability\":true}"_L1) << QString("{}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf("{\"cardAvailability\":true}"_L1)
++ // getOneOfPostPaymentData_request_oneOf_1
++ << emptyPaypal
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << false
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << false
++ // isValid // isSet
++ << false << true;
++
++ // Partial/Incomplete JSON Objects
++ // Only cardNumber for CreditCard (without cardAvailability),
++ // should work since cardNumber is required and provided
++ const QString cardOnly("{\"cardNumber\":\"9999-8888-7777-6666\"}"_L1);
++ postRequest.fromJson(cardOnly);
++ QTest::newRow("Set a valid non-full CreditCard via ::fromJson()")
++ // postRequest // expectedJson
++ << postRequest << cardOnly
++ // expectedJsonValue
++ << postRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << cardOnly << QString("{}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf(cardOnly)
++ // getOneOfPostPaymentData_request_oneOf_1
++ << emptyPaypal
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << true
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << false
++ // isValid // isSet
++ << true << true;
++
++ // Only paypalEmail for Paypal (without paypalAvailability),
++ // should work since Paypal has no required fields
++ const QString emailOnly("{\"paypalEmail\":\"test@test.com\"}"_L1);
++ postRequest.fromJson(emailOnly);
++ QTest::newRow("Set a valid non-full Paypal via ::fromJson()")
++ // postRequest // expectedJson
++ << postRequest << emailOnly
++ // expectedJsonValue
++ << postRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << emailOnly
++ // getOneOfPostPaymentData_request_oneOf
++ << emptyCreditCard
++ // getOneOfPostPaymentData_request_oneOf_1
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf_1(emailOnly)
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << false
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << true
++ // isValid // isSet
++ << true << true;
++
++ // Extra/Unknown Fields in JSON
++ // JSON with fields not in schema - should parse known fields and ignore unknown
++ postRequest.fromJson("{\"cardNumber\":\"4444-3333\",\"cardAvailability\":false,"
++ "\"unknown\":\"field\",\"extra\":123}"_L1);
++ QString expected("{\"cardAvailability\":false,\"cardNumber\":\"4444-3333\"}"_L1);
++ QTest::newRow("Extra/Unknown Fields in CreditCard JSON via ::fromJson()")
++ // postRequest // expectedJson
++ << postRequest << expected
++ // expectedJsonValue
++ << postRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << expected << QString("{}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf(expected)
++ // getOneOfPostPaymentData_request_oneOf_1
++ << emptyPaypal
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << true
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << false
++ // isValid // isSet
++ << true << true;
++
++ // Extra/Unknown Fields in Paypal JSON
++ postRequest.fromJson("{\"paypalEmail\":\"a@b.com\",\"paypalAvailability\""
++ ":true,\"foo\":\"bar\"}"_L1);
++ expected = QString("{\"paypalAvailability\":true,\"paypalEmail\":\"a@b.com\"}"_L1);
++ QTest::newRow("Extra/Unknown Fields in Paypal JSON via ::fromJson()")
++ // postRequest // expectedJson
++ << postRequest << expected
++ // expectedJsonValue
++ << postRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << expected
++ // getOneOfPostPaymentData_request_oneOf
++ << emptyCreditCard
++ // getOneOfPostPaymentData_request_oneOf_1
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf_1(expected)
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << false
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << true
++ // isValid // isSet
++ << true << true;
++
++ // Empty String in CreditCard cardNumber field
++ // cardNumber is required and present (even though empty string), so it's valid
++ expected = QString("{\"cardNumber\":\"\"}"_L1);
++ postRequest.fromJson(expected);
++ QTest::newRow("An empty String in CreditCard cardNumber field via ::fromJson()")
++ // postRequest // expectedJson
++ << postRequest << expected
++ // expectedJsonValue
++ << postRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << expected << QString("{}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf(expected)
++ // getOneOfPostPaymentData_request_oneOf_1
++ << emptyPaypal
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << true
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << false
++ // isValid // isSet
++ << true << true;
++
++ // Invalid Field Types for CreditCard. Wrong type for cardNumber (integer instead of string)
++ // The CreditCard is set, but invalid, because the required field is ommited due to invalid
++ // data. The entire model returns {}, the getter returns the data was valid on setting:
++ // {\"cardAvailability\":true}
++ expected = QString("{\"cardNumber\":12345,\"cardAvailability\":true}"_L1);
++ postRequest.fromJson(expected);
++ QTest::newRow("Invalid field 'cardNumber=12345' in CreditCard via ::fromJson()")
++ // postRequest // expectedJson
++ << postRequest << QString("{}"_L1)
++ // expectedJsonValue
++ << postRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{\"cardAvailability\":true}"_L1) << QString("{}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf(expected)
++ // getOneOfPostPaymentData_request_oneOf_1
++ << emptyPaypal
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << false
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << false
++ // isValid // isSet
++ << false << true;
++
++ // Invalid Field Types for CreditCard. Wrong type for cardAvailability (string instead of bool)
++ expected = QString("{\"cardNumber\":\"5555\",\"cardAvailability\":\"yes\"}"_L1);
++ postRequest.fromJson(expected);
++ QTest::newRow("Invalid field 'cardAvailability=yes' in CreditCard via ::fromJson()")
++ // postRequest // expectedJson
++ << postRequest << QString("{\"cardNumber\":\"5555\"}"_L1)
++ // expectedJsonValue
++ << postRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{\"cardNumber\":\"5555\"}"_L1) << QString("{}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf(expected)
++ // getOneOfPostPaymentData_request_oneOf_1
++ << emptyPaypal
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << true
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << false
++ // isValid // isSet
++ << true << true;
++
++ // Invalid Field Types for Paypal. Wrong type for paypalAvailability (integer instead of bool)
++ // Note: paypalAvailability is optional, so wrong type is just omitted
++ expected = QString("{\"paypalEmail\":\"x@y.com\",\"paypalAvailability\":1}"_L1);
++ postRequest.fromJson(expected);
++ QTest::newRow("Invalid field 'paypalAvailability=1' in Paypal via ::fromJson()")
++ // postRequest // expectedJson
++ << postRequest << QString("{\"paypalEmail\":\"x@y.com\"}"_L1)
++ // expectedJsonValue
++ << postRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{\"paypalEmail\":\"x@y.com\"}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << emptyCreditCard
++ // getOneOfPostPaymentData_request_oneOf_1
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf_1(expected)
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << false
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << true
++ // isValid // isSet
++ << true << true;
++
++ // Invalid Field Types for Paypal. Wrong type for paypalEmail (bool instead of string)
++ // Note: paypalEmail is optional, so wrong type is just omitted
++ expected = QString("{\"paypalEmail\":true,\"paypalAvailability\":false}"_L1);
++ postRequest.fromJson(expected);
++ QTest::newRow("Invalid field 'paypalEmail=true' in Paypal via ::fromJson()")
++ // postRequest // expectedJson
++ << postRequest << QString("{\"paypalAvailability\":false}"_L1)
++ // expectedJsonValue
++ << postRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{\"paypalAvailability\":false}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << emptyCreditCard
++ // getOneOfPostPaymentData_request_oneOf_1
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf_1(expected)
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << false
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << true
++ // isValid // isSet
++ << true << true;
++
++ // All fields have wrong types - both oneOfs fail to parse valid data
++ expected = QString("{\"cardNumber\":true,\"cardAvailability\":\"yes\"}"_L1);
++ postRequest.fromJson(expected);
++ QTest::newRow("All invalid fields in CreditCard via ::fromJson()")
++ // postRequest // expectedJson
++ << postRequest << QString("{}"_L1)
++ // expectedJsonValue
++ << postRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << emptyCreditCard
++ // getOneOfPostPaymentData_request_oneOf_1
++ << emptyPaypal
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << false
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << false
++ // isValid // isSet
++ << false << false;
++
++ // CreditCard with only required field set via setter
++ SchemasModelsOneOf::PostPaymentData_request_oneOf cardOnly2;
++ cardOnly2.setCardNumber("0000-1111-2222-3333"_L1);
++ postRequest.setOneOfPostPaymentData_request_oneOf(cardOnly2);
++ QTest::newRow("Set CreditCard with only cardNumber via setter")
++ // postRequest // expectedJson
++ << postRequest << cardOnly2.asJson()
++ // expectedJsonValue
++ << cardOnly2.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << cardOnly2.asJson() << QString("{}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << cardOnly2
++ // getOneOfPostPaymentData_request_oneOf_1
++ << emptyPaypal
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << true
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << false
++ // isValid // isSet
++ << true << true;
++
++ // Paypal with only paypalAvailability set via setter
++ SchemasModelsOneOf::PostPaymentData_request_oneOf_1 availOnly;
++ availOnly.setPaypalAvailability(false);
++ postRequest.setOneOfPostPaymentData_request_oneOf_1(availOnly);
++ QTest::newRow("Set Paypal with only paypalAvailability via setter")
++ // postRequest // expectedJson
++ << postRequest << availOnly.asJson()
++ // expectedJsonValue
++ << availOnly.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << availOnly.asJson()
++ // getOneOfPostPaymentData_request_oneOf
++ << emptyCreditCard
++ // getOneOfPostPaymentData_request_oneOf_1
++ << availOnly
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << false
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << true
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue with valid CreditCard data
++ postRequest.fromJsonValue(creditCard.asJsonValue());
++ QTest::newRow("Set a valid CreditCard via ::fromJsonValue(creditCard.asJsonValue())")
++ // postRequest // expectedJson
++ << postRequest << creditCard.asJson()
++ // expectedJsonValue
++ << postRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << creditCard.asJson() << QString("{}"_L1)
++ // getOneOfPostPaymentData_request_oneOf
++ << creditCard
++ // getOneOfPostPaymentData_request_oneOf_1
++ << emptyPaypal
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << true
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue with valid Paypal data
++ postRequest.fromJsonValue(paypal.asJsonValue());
++ QTest::newRow("Set a valid Paypal via ::fromJsonValue(paypal.asJsonValue())")
++ // postRequest // expectedJson
++ << postRequest << paypal.asJson()
++ // expectedJsonValue
++ << postRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << paypal.asJson()
++ // getOneOfPostPaymentData_request_oneOf
++ << emptyCreditCard
++ // getOneOfPostPaymentData_request_oneOf_1
++ << paypal
++ // isOneOfPostPaymentDataRequestOneOfValid
++ << false
++ // isOneOfPostPaymentDataRequestOneOfSet
++ << false
++ // isOneOfPostPaymentDataRequestOneOf1Valid
++ << true
++ // isOneOfPostPaymentDataRequestOneOf1Set
++ << true
++ // isValid // isSet
++ << true << true;
++ }
++
++ void OneOfTest::testInlineSchemasJsonConversionMethods()
++ {
++ QFETCH(SchemasModelsOneOf::PostPaymentData_request, postRequest);
++ QFETCH(QString, expectedJson);
++ QFETCH(QJsonValue, expectedJsonValue);
++ QFETCH(QString, oneOf0ExpectedJson);
++ QFETCH(QString, oneOf1ExpectedJson);
++ QFETCH(SchemasModelsOneOf::PostPaymentData_request_oneOf,
++ getOneOfPostPaymentData_request_oneOf);
++ QFETCH(SchemasModelsOneOf::PostPaymentData_request_oneOf_1,
++ getOneOfPostPaymentData_request_oneOf_1);
++ QFETCH(bool, isOneOfPostPaymentDataRequestOneOfValid);
++ QFETCH(bool, isOneOfPostPaymentDataRequestOneOfSet);
++ QFETCH(bool, isOneOfPostPaymentDataRequestOneOf1Valid);
++ QFETCH(bool, isOneOfPostPaymentDataRequestOneOf1Set);
++ QFETCH(bool, isValid);
++ QFETCH(bool, isSet);
++
++ QCOMPARE(postRequest.asJson(), expectedJson);
++ QCOMPARE(postRequest.asJsonValue(), expectedJsonValue);
++ QCOMPARE(postRequest.getOneOfPostPaymentData_request_oneOf().asJson(),
++ oneOf0ExpectedJson);
++ QCOMPARE(postRequest.isOneOfPostPaymentDataRequestOneOfValid(),
++ isOneOfPostPaymentDataRequestOneOfValid);
++ QCOMPARE(postRequest.isOneOfPostPaymentDataRequestOneOfSet(),
++ isOneOfPostPaymentDataRequestOneOfSet);
++ QCOMPARE(postRequest.getOneOfPostPaymentData_request_oneOf_1().asJson(),
++ oneOf1ExpectedJson);
++ QCOMPARE(postRequest.isOneOfPostPaymentDataRequestOneOf1Valid(),
++ isOneOfPostPaymentDataRequestOneOf1Valid);
++ QCOMPARE(postRequest.isOneOfPostPaymentDataRequestOneOf1Set(),
++ isOneOfPostPaymentDataRequestOneOf1Set);
++ QCOMPARE(postRequest.getOneOfPostPaymentData_request_oneOf(),
++ getOneOfPostPaymentData_request_oneOf);
++ QCOMPARE(postRequest.getOneOfPostPaymentData_request_oneOf_1(),
++ getOneOfPostPaymentData_request_oneOf_1);
++ QCOMPARE(postRequest.isValid(), isValid);
++ QCOMPARE(postRequest.isSet(), isSet);
++ }
++
++ void OneOfTest::testInlineSchemasPatch_data()
++ {
++ QTest::addColumn<SchemasModelsOneOf::PatchPaymentData_request>("patchPaymentRequest");
++ QTest::addColumn<QString>("stringValue");
++ QTest::addColumn<bool>("boolValue");
++ QTest::addColumn<double>("doubleValue");
++ QTest::addColumn<OneOfTest::BankApiPatchMode>("mode");
++ QTest::addColumn<QString>("expectedJson");
++
++ // Empty patchPaymentRequest
++ QTest::newRow("empty PatchPaymentData_request")
++ << SchemasModelsOneOf::PatchPaymentData_request{}
++ << QString()
++ << false
++ << 0.0
++ << OneOfTest::BankApiPatchMode::UsePatchPaymentRequest
++ << QString("{}"_L1);
++
++ // Test patchPaymentData with string value
++ QTest::newRow("string value")
++ << SchemasModelsOneOf::PatchPaymentData_request{}
++ << QString("test-string-value"_L1)
++ << false
++ << 0.0
++ << OneOfTest::BankApiPatchMode::UseString
++ << QString("\"test-string-value\""_L1);
++
++ // Test patchPaymentData with bool value
++ QTest::newRow("bool value true")
++ << SchemasModelsOneOf::PatchPaymentData_request{}
++ << QString()
++ << true
++ << 0.0
++ << OneOfTest::BankApiPatchMode::UseBool
++ << QString("true"_L1);
++
++ QTest::newRow("bool value false")
++ << SchemasModelsOneOf::PatchPaymentData_request{}
++ << QString()
++ << false
++ << 0.0
++ << OneOfTest::BankApiPatchMode::UseBool
++ << QString("false"_L1);
++
++ // Test patchPaymentData with double value
++ QTest::newRow("double value")
++ << SchemasModelsOneOf::PatchPaymentData_request{}
++ << QString()
++ << false
++ << 42.5
++ << OneOfTest::BankApiPatchMode::UseDouble
++ << QString("42.5"_L1);
++
++ // Test PatchPaymentData_request with string set
++ SchemasModelsOneOf::PatchPaymentData_request patchRequest;
++ patchRequest.setOneOfQString("request-string"_L1);
++ QTest::newRow("PatchPaymentData_request with string")
++ << patchRequest
++ << QString()
++ << false
++ << 0.0
++ << OneOfTest::BankApiPatchMode::UsePatchPaymentRequest
++ << QString("\"request-string\""_L1);
++
++ // Test PatchPaymentData_request with bool set
++ patchRequest.setOneOfBool(true);
++
++ QTest::newRow("PatchPaymentData_request with bool")
++ << patchRequest
++ << QString()
++ << false
++ << 0.0
++ << OneOfTest::BankApiPatchMode::UsePatchPaymentRequest
++ << QString("true"_L1);
++
++ // Test PatchPaymentData_request with double set
++ patchRequest.setOneOfDouble(99.99);
++
++ QTest::newRow("PatchPaymentData_request with double")
++ << patchRequest
++ << QString()
++ << false
++ << 0.0
++ << OneOfTest::BankApiPatchMode::UsePatchPaymentRequest
++ << QString("99.99"_L1);
++ }
++
++ void OneOfTest::testInlineSchemasPatch()
++ {
++ QFETCH(SchemasModelsOneOf::PatchPaymentData_request, patchPaymentRequest);
++ QFETCH(QString, stringValue);
++ QFETCH(bool, boolValue);
++ QFETCH(double, doubleValue);
++ QFETCH(OneOfTest::BankApiPatchMode, mode);
++ QFETCH(QString, expectedJson);
++
++ bool done = true;
++ SchemasModelsOneOf::BankApi bankApi;
++ LoggingNetworkAccessManager logging(&bankApi);
++ QRestAccessManager restManager(&logging, &bankApi);
++ bankApi.setRestAccessManager(&restManager);
++
++ switch (mode) {
++ case OneOfTest::BankApiPatchMode::UsePatchPaymentRequest:
++ {
++ bankApi.patchPaymentData(patchPaymentRequest, this, [&](const QRestReply &reply) {
++ done = reply.isSuccess();
++ });
++ } break;
++ case OneOfTest::BankApiPatchMode::UseString:
++ {
++ bankApi.patchPaymentData(stringValue, this, [&](const QRestReply &reply) {
++ done = reply.isSuccess();
++ });
++ } break;
++ case OneOfTest::BankApiPatchMode::UseBool:
++ {
++ bankApi.patchPaymentData(boolValue, this, [&](const QRestReply &reply) {
++ done = reply.isSuccess();
++ });
++ } break;
++ case OneOfTest::BankApiPatchMode::UseDouble:
++ {
++ bankApi.patchPaymentData(doubleValue, this, [&](const QRestReply &reply) {
++ done = reply.isSuccess();
++ });
++ } break;
++ }
++ QCOMPARE(logging.m_content, expectedJson);
++ QTRY_COMPARE_EQ(done, false);
++ }
++
++ void OneOfTest::testInlineSchemasPost_data()
++ {
++ QTest::addColumn<SchemasModelsOneOf::PostPaymentData_request>("postPaymentRequest");
++ QTest::addColumn<SchemasModelsOneOf::PostPaymentData_request_oneOf>("creditCard");
++ QTest::addColumn<SchemasModelsOneOf::PostPaymentData_request_oneOf_1>("paypal");
++ QTest::addColumn<OneOfTest::BankApiPostMode>("mode");
++ QTest::addColumn<QString>("expectedJson");
++
++ // Empty postPaymentRequest
++ QTest::newRow("empty PostPaymentData_request")
++ << SchemasModelsOneOf::PostPaymentData_request{}
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf{}
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf_1{}
++ << OneOfTest::BankApiPostMode::UsePostPaymentRequest
++ << QString("{}"_L1);
++
++ // Test Credit Card payment with required field
++ SchemasModelsOneOf::PostPaymentData_request_oneOf creditCard;
++ creditCard.setCardNumber("1234-5678-9012-3456"_L1);
++ creditCard.setCardAvailability(true);
++
++ QTest::newRow("credit card with required field")
++ << SchemasModelsOneOf::PostPaymentData_request{}
++ << creditCard
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf_1{}
++ << OneOfTest::BankApiPostMode::UseCreditCard
++ << QString("{\"cardAvailability\":true,\"cardNumber\":\"1234-5678-9012-3456\"}"_L1);
++
++ // Test PayPal payment
++ SchemasModelsOneOf::PostPaymentData_request_oneOf_1 paypal;
++ paypal.setPaypalEmail("user@example.com"_L1);
++ paypal.setPaypalAvailability(true);
++
++ QTest::newRow("paypal payment")
++ << SchemasModelsOneOf::PostPaymentData_request{}
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf{}
++ << paypal
++ << OneOfTest::BankApiPostMode::UsePaypal
++ << QString("{\"paypalAvailability\":true,\"paypalEmail\":\"user@example.com\"}"_L1);
++
++ // Test PostPaymentData_request with credit card set
++ SchemasModelsOneOf::PostPaymentData_request postRequest;
++ postRequest.setOneOfPostPaymentData_request_oneOf(creditCard);
++
++ QTest::newRow("PostPaymentData_request with credit card")
++ << postRequest
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf{}
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf_1{}
++ << OneOfTest::BankApiPostMode::UsePostPaymentRequest
++ << QString("{\"cardAvailability\":true,\"cardNumber\":\"1234-5678-9012-3456\"}"_L1);
++
++ // Test PostPaymentData_request with PayPal set
++ postRequest.setOneOfPostPaymentData_request_oneOf_1(paypal);
++
++ QTest::newRow("PostPaymentData_request with paypal")
++ << postRequest
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf{}
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf_1{}
++ << OneOfTest::BankApiPostMode::UsePostPaymentRequest
++ << QString("{\"paypalAvailability\":true,\"paypalEmail\":\"user@example.com\"}"_L1);
++
++ // Test credit card without required field (cardNumber is required)
++ SchemasModelsOneOf::PostPaymentData_request_oneOf invalidCreditCard;
++ invalidCreditCard.setCardAvailability(true);
++
++ QTest::newRow("invalid credit card missing required field")
++ << SchemasModelsOneOf::PostPaymentData_request{}
++ << invalidCreditCard
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf_1{}
++ << OneOfTest::BankApiPostMode::UseCreditCard
++ << QString("{}"_L1);
++
++ // Test PayPal with only email (paypalAvailability is optional)
++ SchemasModelsOneOf::PostPaymentData_request_oneOf_1 partialPaypal;
++ partialPaypal.setPaypalEmail("partial@example.com"_L1);
++
++ QTest::newRow("paypal with only email")
++ << SchemasModelsOneOf::PostPaymentData_request{}
++ << SchemasModelsOneOf::PostPaymentData_request_oneOf{}
++ << partialPaypal
++ << OneOfTest::BankApiPostMode::UsePaypal
++ << QString("{\"paypalEmail\":\"partial@example.com\"}"_L1);
++ }
++
++ void OneOfTest::testInlineSchemasPost()
++ {
++ QFETCH(SchemasModelsOneOf::PostPaymentData_request, postPaymentRequest);
++ QFETCH(SchemasModelsOneOf::PostPaymentData_request_oneOf, creditCard);
++ QFETCH(SchemasModelsOneOf::PostPaymentData_request_oneOf_1, paypal);
++ QFETCH(OneOfTest::BankApiPostMode, mode);
++ QFETCH(QString, expectedJson);
++
++ bool done = true;
++ SchemasModelsOneOf::BankApi bankApi;
++ LoggingNetworkAccessManager logging(&bankApi);
++ QRestAccessManager restManager(&logging, &bankApi);
++ bankApi.setRestAccessManager(&restManager);
++
++ switch (mode) {
++ case OneOfTest::BankApiPostMode::UsePostPaymentRequest:
++ {
++ bankApi.postPaymentData(postPaymentRequest, this, [&](const QRestReply &reply) {
++ done = reply.isSuccess();
++ });
++ } break;
++ case OneOfTest::BankApiPostMode::UseCreditCard:
++ {
++ bankApi.postPaymentData(creditCard, this, [&](const QRestReply &reply) {
++ done = reply.isSuccess();
++ });
++ } break;
++ case OneOfTest::BankApiPostMode::UsePaypal:
++ {
++ bankApi.postPaymentData(paypal, this, [&](const QRestReply &reply) {
++ done = reply.isSuccess();
++ });
++ } break;
++ }
++ QCOMPARE(logging.m_content, expectedJson);
++ QTRY_COMPARE_EQ(done, false);
++ }
++
++ void OneOfTest::testOneOfPrimitiveJsonConversionMethods_data()
++ {
++ QTest::addColumn<SchemasModelsOneOf::PatchPaymentData_request>("patchRequest");
++ QTest::addColumn<QString>("expectedJson");
++ QTest::addColumn<QJsonValue>("expectedJsonValue");
++ QTest::addColumn<QString>("getOneOfQString");
++ QTest::addColumn<bool>("getOneOfBool");
++ QTest::addColumn<double>("getOneOfDouble");
++ QTest::addColumn<bool>("isOneOfQStringValid");
++ QTest::addColumn<bool>("isOneOfQStringSet");
++ QTest::addColumn<bool>("isOneOfBoolValid");
++ QTest::addColumn<bool>("isOneOfBoolSet");
++ QTest::addColumn<bool>("isOneOfDoubleValid");
++ QTest::addColumn<bool>("isOneOfDoubleSet");
++ QTest::addColumn<bool>("isValid");
++ QTest::addColumn<bool>("isSet");
++
++ // PatchPaymentData_request has three primitive oneOf alternatives:
++ // oneOf0: string
++ // oneOf1: boolean
++ // oneOf2: number (double)
++ // All primitives have no "required fields" concept, so they are always "valid".
++ SchemasModelsOneOf::PatchPaymentData_request patchRequest;
++ QTest::newRow("Empty PatchPaymentData_request object")
++ // patchRequest // expectedJson
++ << patchRequest << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // getOneOfQString // getOneOfBool
++ << QString() << false
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << false << false
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Set a string value via setter
++ const QString hello("hello-world"_L1);
++ patchRequest.setOneOfQString(hello);
++ QTest::newRow("Set a valid string via setter")
++ // patchRequest // expectedJson
++ << patchRequest << QString("\"hello-world\""_L1)
++ // expectedJsonValue
++ << QJsonValue(hello)
++ // getOneOfQString // getOneOfBool
++ << hello << false
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << true << true
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set a bool value via setter (overrides string)
++ patchRequest.setOneOfBool(true);
++ QTest::newRow("Set a valid bool 'true' via setter")
++ // patchRequest // expectedJson
++ << patchRequest << QString("true"_L1)
++ // expectedJsonValue
++ << QJsonValue(true)
++ // getOneOfQString // getOneOfBool
++ << QString() << true
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << false << false
++ // isOneOfBoolValid // isOneOfBoolSet
++ << true << true
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set a bool 'false' value via setter
++ patchRequest.setOneOfBool(false);
++ QTest::newRow("Set a valid bool 'false' via setter")
++ // patchRequest // expectedJson
++ << patchRequest << QString("false"_L1)
++ // expectedJsonValue
++ << QJsonValue(false)
++ // getOneOfQString // getOneOfBool
++ << QString() << false
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << false << false
++ // isOneOfBoolValid // isOneOfBoolSet
++ << true << true
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set a double value via setter (overrides bool)
++ patchRequest.setOneOfDouble(42.5);
++ QTest::newRow("Set a valid double '42.5' via setter")
++ // patchRequest // expectedJson
++ << patchRequest << QString("42.5"_L1)
++ // expectedJsonValue
++ << QJsonValue(42.5)
++ // getOneOfQString // getOneOfBool
++ << QString() << false
++ // getOneOfDouble
++ << 42.5
++ // isOneOfQStringValid // isOneOfQStringSet
++ << false << false
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Set a negative double value via setter
++ patchRequest.setOneOfDouble(-99.99);
++ QTest::newRow("Set a valid double '-99.99' via setter")
++ // patchRequest // expectedJson
++ << patchRequest << QString("-99.99"_L1)
++ // expectedJsonValue
++ << QJsonValue(-99.99)
++ // getOneOfQString // getOneOfBool
++ << QString() << false
++ // getOneOfDouble
++ << -99.99
++ // isOneOfQStringValid // isOneOfQStringSet
++ << false << false
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Set a zero double value via setter
++ patchRequest.setOneOfDouble(0.0);
++ QTest::newRow("Set a valid double '0.0' via setter")
++ // patchRequest // expectedJson
++ << patchRequest << QString("0"_L1)
++ // expectedJsonValue
++ << QJsonValue(0.0)
++ // getOneOfQString // getOneOfBool
++ << QString() << false
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << false << false
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Set an empty string via setter
++ patchRequest.setOneOfQString("");
++ QTest::newRow("Set an empty string via setter")
++ // patchRequest // expectedJson
++ << patchRequest << QString("\"\""_L1)
++ // expectedJsonValue
++ << QJsonValue(""_L1)
++ // getOneOfQString // getOneOfBool
++ << QString(""_L1) << false
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << true << true
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with a string value
++ patchRequest.fromJson("\"payment-token-abc\""_L1);
++ QTest::newRow("Set a valid string via ::fromJson()")
++ // patchRequest // expectedJson
++ << patchRequest << QString("\"payment-token-abc\""_L1)
++ // expectedJsonValue
++ << QJsonValue("payment-token-abc"_L1)
++ // getOneOfQString // getOneOfBool
++ << QString("payment-token-abc"_L1) << false
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << true << true
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with a bool 'true' value
++ patchRequest.fromJson("true"_L1);
++ QTest::newRow("Set a valid bool 'true' via ::fromJson()")
++ // patchRequest // expectedJson
++ << patchRequest << QString("true"_L1)
++ // expectedJsonValue
++ << QJsonValue(true)
++ // getOneOfQString // getOneOfBool
++ << QString() << true
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << false << false
++ // isOneOfBoolValid // isOneOfBoolSet
++ << true << true
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with a bool 'false' value
++ patchRequest.fromJson("false"_L1);
++ QTest::newRow("Set a valid bool 'false' via ::fromJson()")
++ // patchRequest // expectedJson
++ << patchRequest << QString("false"_L1)
++ // expectedJsonValue
++ << QJsonValue(false)
++ // getOneOfQString // getOneOfBool
++ << QString() << false
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << false << false
++ // isOneOfBoolValid // isOneOfBoolSet
++ << true << true
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with a double value
++ patchRequest.fromJson("3.14159"_L1);
++ QTest::newRow("Set a valid double '3.14159' via ::fromJson()")
++ // patchRequest // expectedJson
++ << patchRequest << QString("3.14159"_L1)
++ // expectedJsonValue
++ << QJsonValue(3.14159)
++ // getOneOfQString // getOneOfBool
++ << QString() << false
++ // getOneOfDouble
++ << 3.14159
++ // isOneOfQStringValid // isOneOfQStringSet
++ << false << false
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with a negative double value
++ patchRequest.fromJson("-100.5"_L1);
++ QTest::newRow("Set a valid double '-100.5' via ::fromJson()")
++ // patchRequest // expectedJson
++ << patchRequest << QString("-100.5"_L1)
++ // expectedJsonValue
++ << QJsonValue(-100.5)
++ // getOneOfQString // getOneOfBool
++ << QString() << false
++ // getOneOfDouble
++ << -100.5
++ // isOneOfQStringValid // isOneOfQStringSet
++ << false << false
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with an integer value (should match double/number)
++ patchRequest.fromJson("42"_L1);
++ QTest::newRow("Set an integer '42' via ::fromJson() (matches double)")
++ // patchRequest // expectedJson
++ << patchRequest << QString("42"_L1)
++ // expectedJsonValue
++ << QJsonValue(42.0)
++ // getOneOfQString // getOneOfBool
++ << QString() << false
++ // getOneOfDouble
++ << 42.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << false << false
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue with a string value
++ patchRequest.fromJsonValue(QJsonValue("json-value-string"_L1));
++ QTest::newRow("Set a valid string via ::fromJsonValue()")
++ // patchRequest // expectedJson
++ << patchRequest << QString("\"json-value-string\""_L1)
++ // expectedJsonValue
++ << QJsonValue("json-value-string"_L1)
++ // getOneOfQString // getOneOfBool
++ << QString("json-value-string"_L1) << false
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << true << true
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue with a bool value
++ patchRequest.fromJsonValue(QJsonValue(true));
++ QTest::newRow("Set a valid bool 'true' via ::fromJsonValue()")
++ // patchRequest // expectedJson
++ << patchRequest << QString("true"_L1)
++ // expectedJsonValue
++ << QJsonValue(true)
++ // getOneOfQString // getOneOfBool
++ << QString() << true
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << false << false
++ // isOneOfBoolValid // isOneOfBoolSet
++ << true << true
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue with a double value
++ patchRequest.fromJsonValue(QJsonValue(99.99));
++ QTest::newRow("Set a valid double '99.99' via ::fromJsonValue()")
++ // patchRequest // expectedJson
++ << patchRequest << QString("99.99"_L1)
++ // expectedJsonValue
++ << QJsonValue(99.99)
++ // getOneOfQString // getOneOfBool
++ << QString() << false
++ // getOneOfDouble
++ << 99.99
++ // isOneOfQStringValid // isOneOfQStringSet
++ << false << false
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // invalid json! => the model is RESET to INITIAL state
++ patchRequest.fromJson("{invalid json}"_L1);
++ QTest::newRow("Set an invalid json via ::fromJson()")
++ // patchRequest // expectedJson
++ << patchRequest << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // getOneOfQString // getOneOfBool
++ << QString() << false
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << false << false
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Test with non-primitive JSON (object) => doesn't match any primitive type
++ patchRequest.fromJson("{\"key\":\"value\"}"_L1);
++ QTest::newRow("Set an unexpected object via ::fromJson()")
++ // patchRequest // expectedJson
++ << patchRequest << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // getOneOfQString // getOneOfBool
++ << QString() << false
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << false << false
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Test with non-primitive JSON (array) => doesn't match any primitive type
++ patchRequest.fromJson("[1, 2, 3]"_L1);
++ QTest::newRow("PatchPaymentData_request: set an unexpected array via ::fromJson()")
++ // patchRequest // expectedJson
++ << patchRequest << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // getOneOfQString // getOneOfBool
++ << QString() << false
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << false << false
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Test with null JSON value => doesn't match string/bool/double
++ patchRequest.fromJson("null"_L1);
++ QTest::newRow("Set a null value via ::fromJson()")
++ // patchRequest // expectedJson
++ << patchRequest << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // getOneOfQString // getOneOfBool
++ << QString() << false
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << false << false
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJsonValue with null QJsonValue => doesn't match primitives
++ patchRequest.fromJsonValue(QJsonValue());
++ QTest::newRow("Set a null QJsonValue via ::fromJsonValue()")
++ // patchRequest // expectedJson
++ << patchRequest << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // getOneOfQString // getOneOfBool
++ << QString() << false
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << false << false
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJsonValue with QJsonObject => doesn't match primitives
++ patchRequest.fromJsonValue(QJsonValue(QJsonObject()));
++ QTest::newRow("Set an empty QJsonObject via ::fromJsonValue()")
++ // patchRequest // expectedJson
++ << patchRequest << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // getOneOfQString // getOneOfBool
++ << QString() << false
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << false << false
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJson with an empty string JSON => should match string (oneOf0)
++ patchRequest.fromJson("\"\""_L1);
++ QTest::newRow("Set an empty string via ::fromJson()")
++ // patchRequest // expectedJson
++ << patchRequest << QString("\"\""_L1)
++ // expectedJsonValue
++ << QJsonValue(""_L1)
++ // getOneOfQString // getOneOfBool
++ << QString(""_L1) << false
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << true << true
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with a very large double
++ patchRequest.fromJson("1.7976931348623157e+308"_L1);
++ QTest::newRow("Set a very large double via ::fromJson()")
++ // patchRequest // expectedJson
++ << patchRequest << QString("1.7976931348623157e+308"_L1)
++ // expectedJsonValue
++ << QJsonValue(1.7976931348623157e+308)
++ // getOneOfQString // getOneOfBool
++ << QString() << false
++ // getOneOfDouble
++ << 1.7976931348623157e+308
++ // isOneOfQStringValid // isOneOfQStringSet
++ << false << false
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with a string that looks like a number (but is quoted => string)
++ patchRequest.fromJson("\"42.5\""_L1);
++ QTest::newRow("Set a string '42.5' (quoted) via ::fromJson()")
++ // patchRequest // expectedJson
++ << patchRequest << QString("\"42.5\""_L1)
++ // expectedJsonValue
++ << QJsonValue("42.5"_L1)
++ // getOneOfQString // getOneOfBool
++ << QString("42.5"_L1) << false
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << true << true
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with a string that looks like a bool (but is quoted => string)
++ patchRequest.fromJson("\"true\""_L1);
++ QTest::newRow("Set a string 'true' (quoted) via ::fromJson()")
++ // patchRequest // expectedJson
++ << patchRequest << QString("\"true\""_L1)
++ // expectedJsonValue
++ << QJsonValue("true"_L1)
++ // getOneOfQString // getOneOfBool
++ << QString("true"_L1) << false
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << true << true
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with zero (integer form) => matches double
++ patchRequest.fromJson("0"_L1);
++ QTest::newRow("Set zero '0' via ::fromJson() (matches double)")
++ // patchRequest // expectedJson
++ << patchRequest << QString("0"_L1)
++ // expectedJsonValue
++ << QJsonValue(0.0)
++ // getOneOfQString // getOneOfBool
++ << QString() << false
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << false << false
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Set string with special characters via setter
++ patchRequest.setOneOfQString("hello \"world\" \n\ttab"_L1);
++ QTest::newRow("Set a string with special characters via setter")
++ // patchRequest // expectedJson
++ << patchRequest << QString("\"hello \\\"world\\\" \\n\\ttab\""_L1)
++ // expectedJsonValue
++ << QJsonValue("hello \"world\" \n\ttab"_L1)
++ // getOneOfQString // getOneOfBool
++ << QString("hello \"world\" \n\ttab"_L1) << false
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << true << true
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set double via setter then override with string via setter
++ patchRequest.setOneOfDouble(123.456);
++ patchRequest.setOneOfQString("override"_L1);
++ QTest::newRow("Override double with string via setter")
++ // patchRequest // expectedJson
++ << patchRequest << QString("\"override\""_L1)
++ // expectedJsonValue
++ << QJsonValue("override"_L1)
++ // getOneOfQString // getOneOfBool
++ << QString("override"_L1) << false
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << true << true
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set string via setter then override with bool via setter
++ patchRequest.setOneOfQString("will be overridden"_L1);
++ patchRequest.setOneOfBool(false);
++ QTest::newRow("Override string with bool 'false' via setter")
++ // patchRequest // expectedJson
++ << patchRequest << QString("false"_L1)
++ // expectedJsonValue
++ << QJsonValue(false)
++ // getOneOfQString // getOneOfBool
++ << QString() << false
++ // getOneOfDouble
++ << 0.0
++ // isOneOfQStringValid // isOneOfQStringSet
++ << false << false
++ // isOneOfBoolValid // isOneOfBoolSet
++ << true << true
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set bool via setter then override with double via setter
++ patchRequest.setOneOfBool(true);
++ patchRequest.setOneOfDouble(0.001);
++ QTest::newRow("Override bool with double '0.001' via setter")
++ // patchRequest // expectedJson
++ << patchRequest << QString("0.001"_L1)
++ // expectedJsonValue
++ << QJsonValue(0.001)
++ // getOneOfQString // getOneOfBool
++ << QString() << false
++ // getOneOfDouble
++ << 0.001
++ // isOneOfQStringValid // isOneOfQStringSet
++ << false << false
++ // isOneOfBoolValid // isOneOfBoolSet
++ << false << false
++ // isOneOfDoubleValid // isOneOfDoubleSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++ }
++
++ void OneOfTest::testOneOfPrimitiveJsonConversionMethods()
++ {
++ QFETCH(SchemasModelsOneOf::PatchPaymentData_request, patchRequest);
++ QFETCH(QString, expectedJson);
++ QFETCH(QJsonValue, expectedJsonValue);
++ QFETCH(QString, getOneOfQString);
++ QFETCH(bool, getOneOfBool);
++ QFETCH(double, getOneOfDouble);
++ QFETCH(bool, isOneOfQStringValid);
++ QFETCH(bool, isOneOfQStringSet);
++ QFETCH(bool, isOneOfBoolValid);
++ QFETCH(bool, isOneOfBoolSet);
++ QFETCH(bool, isOneOfDoubleValid);
++ QFETCH(bool, isOneOfDoubleSet);
++ QFETCH(bool, isValid);
++ QFETCH(bool, isSet);
++
++ QCOMPARE(patchRequest.asJson(), expectedJson);
++ QCOMPARE(patchRequest.asJsonValue(), expectedJsonValue);
++ QCOMPARE(patchRequest.getOneOfQString(), getOneOfQString);
++ QCOMPARE(patchRequest.isOneOfQStringValid(), isOneOfQStringValid);
++ QCOMPARE(patchRequest.isOneOfQStringSet(), isOneOfQStringSet);
++ QCOMPARE(patchRequest.getOneOfBool(), getOneOfBool);
++ QCOMPARE(patchRequest.isOneOfBoolValid(), isOneOfBoolValid);
++ QCOMPARE(patchRequest.isOneOfBoolSet(), isOneOfBoolSet);
++ QCOMPARE(patchRequest.getOneOfDouble(), getOneOfDouble);
++ QCOMPARE(patchRequest.isOneOfDoubleValid(), isOneOfDoubleValid);
++ QCOMPARE(patchRequest.isOneOfDoubleSet(), isOneOfDoubleSet);
++ QCOMPARE(patchRequest.isValid(), isValid);
++ QCOMPARE(patchRequest.isSet(), isSet);
++ }
++
++ void OneOfTest::testPolymorphedRequestBody_data()
++ {
++ QTest::addColumn<SchemasModelsOneOf::PostFarmPet_request>("pet");
++ QTest::addColumn<SchemasModelsOneOf::Dog>("dog");
++ QTest::addColumn<SchemasModelsOneOf::Duck>("duck");
++ QTest::addColumn<SchemasModelsOneOf::Bunny>("bunny");
++ QTest::addColumn<OneOfTest::FarmApiMode>("mode");
++ QTest::addColumn<QString>("expectedJson");
++
++ // Empty
++ QTest::newRow("empty duck, bunny, dog and farm pet")
++ << SchemasModelsOneOf::PostFarmPet_request{}
++ << SchemasModelsOneOf::Dog{}
++ << SchemasModelsOneOf::Duck{}
++ << SchemasModelsOneOf::Bunny{}
++ << OneOfTest::FarmApiMode::UsePostPet
++ << QString("{}"_L1);
++
++ SchemasModelsOneOf::PostFarmPet_request model;
++ SchemasModelsOneOf::Duck duck;
++ duck.setHunts(true);
++ duck.setAge(9);
++
++ SchemasModelsOneOf::Bunny bunny;
++ bunny.setBreedType("Wild"_L1);
++ bunny.setWeight(5);
++
++ QTest::newRow("Set Bunny object")
++ << SchemasModelsOneOf::PostFarmPet_request{}
++ << SchemasModelsOneOf::Dog{}
++ << SchemasModelsOneOf::Duck{}
++ << bunny
++ << OneOfTest::FarmApiMode::UseBunny
++ << QString("{\"breed-type\":\"Wild\",\"weight\":5}"_L1);
++
++ QTest::newRow("Set Duck object")
++ << SchemasModelsOneOf::PostFarmPet_request{}
++ << SchemasModelsOneOf::Dog{}
++ << duck
++ << SchemasModelsOneOf::Bunny{}
++ << OneOfTest::FarmApiMode::UseDuck
++ << QString("{\"age\":9,\"hunts\":true}"_L1);
++
++ model.setOneOfDuck(duck);
++ QTest::newRow("Set PostFarmPet_request object with duck data")
++ << model
++ << SchemasModelsOneOf::Dog{}
++ << SchemasModelsOneOf::Duck{}
++ << SchemasModelsOneOf::Bunny{}
++ << OneOfTest::FarmApiMode::UsePostPet
++ << QString("{\"age\":9,\"hunts\":true}"_L1);
++
++ model.setOneOfBunny(bunny);
++ QTest::newRow("Set PostFarmPet_request object with bunny data")
++ << model
++ << SchemasModelsOneOf::Dog{}
++ << SchemasModelsOneOf::Duck{}
++ << SchemasModelsOneOf::Bunny{}
++ << OneOfTest::FarmApiMode::UsePostPet
++ << QString("{\"breed-type\":\"Wild\",\"weight\":5}"_L1);
++
++ model.setOneOfBunny(SchemasModelsOneOf::Bunny{});
++ QTest::newRow("Reset PostFarmPet_request object to empty")
++ << model
++ << SchemasModelsOneOf::Dog{}
++ << SchemasModelsOneOf::Duck{}
++ << SchemasModelsOneOf::Bunny{}
++ << OneOfTest::FarmApiMode::UsePostPet
++ << QString("{}"_L1);
++
++ SchemasModelsOneOf::Dog dog;
++ dog.setBreed("Dingo"_L1);
++ // Should fail because bark is not set, but bark is required
++ QTest::newRow("Set incomplete Dog() object")
++ << SchemasModelsOneOf::PostFarmPet_request{}
++ << dog
++ << SchemasModelsOneOf::Duck{}
++ << SchemasModelsOneOf::Bunny{}
++ << OneOfTest::FarmApiMode::UseDog
++ << QString("{}"_L1);
++
++ dog.setBark(true);
++ QTest::newRow("Set full Dog() object")
++ << SchemasModelsOneOf::PostFarmPet_request{}
++ << dog
++ << SchemasModelsOneOf::Duck{}
++ << SchemasModelsOneOf::Bunny{}
++ << OneOfTest::FarmApiMode::UseDog
++ << QString("{\"bark\":true,\"breed\":\"Dingo\"}"_L1);
++ }
++
++ void OneOfTest::testPolymorphedRequestBody()
++ {
++ QFETCH(SchemasModelsOneOf::PostFarmPet_request, pet);
++ QFETCH(SchemasModelsOneOf::Dog, dog);
++ QFETCH(SchemasModelsOneOf::Duck, duck);
++ QFETCH(SchemasModelsOneOf::Bunny, bunny);
++ QFETCH(OneOfTest::FarmApiMode, mode);
++ QFETCH(QString, expectedJson);
++
++ bool done = true;
++ SchemasModelsOneOf::FarmApi farmApi;
++ LoggingNetworkAccessManager logging(&farmApi);
++ QRestAccessManager restManager(&logging, &farmApi);
++ farmApi.setRestAccessManager(&restManager);
++
++ switch (mode) {
++ case OneOfTest::FarmApiMode::UsePostPet:
++ {
++ farmApi.postFarmPet(pet, this, [&](const QRestReply &reply) {
++ done = reply.isSuccess();
++ });
++ } break;
++ case OneOfTest::FarmApiMode::UseDuck:
++ {
++ farmApi.postFarmPet(duck, this, [&](const QRestReply &reply) {
++ done = reply.isSuccess();
++ });
++ } break;
++ case OneOfTest::FarmApiMode::UseBunny:
++ {
++ farmApi.postFarmPet(bunny, this, [&](const QRestReply &reply) {
++ done = reply.isSuccess();
++ });
++ } break;
++ case OneOfTest::FarmApiMode::UseDog:
++ {
++ farmApi.postFarmPet(dog, this, [&](const QRestReply &reply) {
++ done = reply.isSuccess();
++ });
++ } break;
++ }
++ QCOMPARE(logging.m_content, expectedJson);
++ QTRY_COMPARE_EQ(done, false);
++ }
++
++ void OneOfTest::testPostAccountRequestJsonConversionMethods_data()
++ {
++ QTest::addColumn<SchemasModelsOneOf::PostAccount_request>("postAccountRequest");
++ QTest::addColumn<QString>("expectedJson");
++ QTest::addColumn<QJsonValue>("expectedJsonValue");
++ QTest::addColumn<QString>("oneOf0ExpectedJson");
++ QTest::addColumn<QString>("oneOf1ExpectedJson");
++ QTest::addColumn<bool>("isOneOf0Valid");
++ QTest::addColumn<bool>("isOneOf0Set");
++ QTest::addColumn<bool>("isOneOf1Valid");
++ QTest::addColumn<bool>("isOneOf1Set");
++ QTest::addColumn<bool>("isValid");
++ QTest::addColumn<bool>("isSet");
++
++ // PostAccount_request has two oneOf alternatives:
++ // oneOf0: Account (which is itself a oneOf - see testAccountJsonConversionMethods)
++ // oneOf1: QMap<QString, QJsonValue> (object with additionalProperties: true)
++ //
++ // An empty Account is a oneOf with nothing set => Account.isValid() = false
++ // An empty QMap is valid for additionalProperties: true (no required properties)
++ SchemasModelsOneOf::PostAccount_request postAccountRequest;
++ QTest::newRow("Empty PostAccount_request object")
++ // postAccountRequest // expectedJson
++ << postAccountRequest << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Set a valid Account via setter (Account with Account_oneOf set)
++ SchemasModelsOneOf::Account validAccount;
++ SchemasModelsOneOf::Account_oneOf acctData;
++ acctData.setName("Test Corp"_L1);
++ acctData.setContractAvailable(true);
++ validAccount.setOneOfAccount_oneOf(acctData);
++ postAccountRequest.setOneOfAccount(validAccount);
++ QTest::newRow("Set a valid Account (with Account_oneOf) via setter")
++ // postAccountRequest // expectedJson
++ << postAccountRequest << validAccount.asJson()
++ // expectedJsonValue
++ << validAccount.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << validAccount.asJson() << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << true << true
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set a valid Account via setter (Account with Account_oneOf_1 set)
++ SchemasModelsOneOf::Account validAccount2;
++ SchemasModelsOneOf::Account_oneOf_1 acctData2;
++ acctData2.setFirstname("Jane"_L1);
++ acctData2.setLastname("Doe"_L1);
++ validAccount2.setOneOfAccount_oneOf_1(acctData2);
++ postAccountRequest.setOneOfAccount(validAccount2);
++ QTest::newRow("Set a valid Account (with Account_oneOf_1) via setter")
++ // postAccountRequest // expectedJson
++ << postAccountRequest << validAccount2.asJson()
++ // expectedJsonValue
++ << validAccount2.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << validAccount2.asJson() << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << true << true
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set a QMap (additionalProperties object) via setter
++ QMap<QString, QJsonValue> freeformObj;
++ freeformObj.insert("customField1"_L1, QJsonValue("value1"_L1));
++ freeformObj.insert("customField2"_L1, QJsonValue(42));
++ freeformObj.insert("nested"_L1, QJsonValue(true));
++ postAccountRequest.setOneOfQMapQStringQJsonValue(freeformObj);
++ const QString expectedTestString(
++ "{\"customField1\":\"value1\",\"customField2\":42,\"nested\":true}"_L1);
++ QTest::newRow("Set a valid QMap via setter")
++ // postAccountRequest // expectedJson
++ << postAccountRequest << expectedTestString
++ // expectedJsonValue
++ << postAccountRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << expectedTestString
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Set an empty QMap via setter - empty map should still be valid
++ const QMap<QString, QJsonValue> emptyMap;
++ postAccountRequest.setOneOfQMapQStringQJsonValue(emptyMap);
++ QTest::newRow("Set an empty QMap via setter")
++ // postAccountRequest // expectedJson
++ << postAccountRequest << postAccountRequest.asJson()
++ // expectedJsonValue
++ << postAccountRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Set an empty Account (which is itself invalid - no alternative selected)
++ // NOTE: Account itself is also a OneOf type object! If it is empty, it doesn't
++ // hold any type inside and cannot be valid.
++ const SchemasModelsOneOf::Account emptyAccount;
++ postAccountRequest.setOneOfAccount(emptyAccount);
++ QTest::newRow("Set an empty Account via setter")
++ // postAccountRequest // expectedJson
++ << postAccountRequest << emptyAccount.asJson()
++ // expectedJsonValue
++ << emptyAccount.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJson with Account_oneOf data (name field identifies it)
++ const QString acctJson("{\"contractAvailable\":true,\"name\":\"FromJson Corp\"}"_L1);
++ postAccountRequest.fromJson(acctJson);
++ QTest::newRow("Set Account_oneOf data via ::fromJson()")
++ // postAccountRequest // expectedJson
++ << postAccountRequest << acctJson
++ // expectedJsonValue
++ << postAccountRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << acctJson << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << true << true
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with Account_oneOf_1 data (firstname/lastname fields)
++ const QString nameJson("{\"firstname\":\"Bob\",\"lastname\":\"Jones\"}"_L1);
++ postAccountRequest.fromJson(nameJson);
++ QTest::newRow("Set Account_oneOf_1 data via ::fromJson()")
++ // postAccountRequest // expectedJson
++ << postAccountRequest << nameJson
++ // expectedJsonValue
++ << postAccountRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << nameJson << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << true << true
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with freeform object data (fields that don't match Account)
++ const QString freeformJson("{\"arbitraryKey\":\"arbitraryValue\",\"number\":99}"_L1);
++ postAccountRequest.fromJson(freeformJson);
++ QTest::newRow("Set freeform object data via ::fromJson()")
++ // postAccountRequest // expectedJson
++ << postAccountRequest << postAccountRequest.asJson()
++ // expectedJsonValue
++ << postAccountRequest.asJsonValue()
++ // oneOf0ExpectedJson
++ << QString("{}"_L1)
++ // oneOf1ExpectedJson
++ << freeformJson
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue with valid Account
++ postAccountRequest.fromJsonValue(validAccount.asJsonValue());
++ QTest::newRow("Set a valid Account via ::fromJsonValue()")
++ // postAccountRequest // expectedJson
++ << postAccountRequest << validAccount.asJson()
++ // expectedJsonValue
++ << postAccountRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << validAccount.asJson() << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << true << true
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // invalid json! => the model is RESET to INITIAL state
++ postAccountRequest.fromJson("{invalid json}"_L1);
++ QTest::newRow("Set an invalid json via ::fromJson()")
++ // postAccountRequest // expectedJson
++ << postAccountRequest << QString("{}"_L1)
++ // expectedJsonValue
++ << postAccountRequest.asJsonValue()
++ // oneOf0ExpectedJson
++ << QString("{}"_L1)
++ // oneOf1ExpectedJson
++ << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Test with non-object JSON (array) => reset
++ postAccountRequest.fromJson("[]"_L1);
++ QTest::newRow("PostAccount_request: set an unexpected array via ::fromJson()")
++ // postAccountRequest // expectedJson
++ << postAccountRequest << QString("{}"_L1)
++ // expectedJsonValue
++ << postAccountRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Test with non-object JSON (string) => reset
++ postAccountRequest.fromJson("\"string\""_L1);
++ QTest::newRow("Set an unexpected string via ::fromJson()")
++ // postAccountRequest // expectedJson
++ << postAccountRequest << QString("{}"_L1)
++ // expectedJsonValue
++ << postAccountRequest.asJsonValue()
++ // oneOf0ExpectedJson
++ << QString("{}"_L1)
++ // oneOf1ExpectedJson
++ << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << false << false
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJson with empty object "{}" => Account (oneOf0) has both alternatives
++ // with no required fields, so empty Account resolves internally. But Account
++ // itself needs a selected alternative to be valid. The QMap (oneOf1) is always
++ // valid with empty. This is ambiguous. Account is selected because it is first.
++ postAccountRequest.fromJson("{}"_L1);
++ QTest::newRow("Set an empty object {} via ::fromJson()")
++ // postAccountRequest // expectedJson
++ << postAccountRequest << postAccountRequest.asJson()
++ // expectedJsonValue
++ << postAccountRequest.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // isOneOf0Valid // isOneOf0Set
++ << true << true
++ // isOneOf1Valid // isOneOf1Set
++ << false << false
++ // isValid // isSet
++ << true << true;
++ }
++
++ void OneOfTest::testPostAccountRequestJsonConversionMethods()
++ {
++ QFETCH(SchemasModelsOneOf::PostAccount_request, postAccountRequest);
++ QFETCH(QString, expectedJson);
++ QFETCH(QJsonValue, expectedJsonValue);
++ QFETCH(QString, oneOf0ExpectedJson);
++ QFETCH(QString, oneOf1ExpectedJson);
++ QFETCH(bool, isOneOf0Valid);
++ QFETCH(bool, isOneOf0Set);
++ QFETCH(bool, isOneOf1Valid);
++ QFETCH(bool, isOneOf1Set);
++ QFETCH(bool, isValid);
++ QFETCH(bool, isSet);
++
++ QCOMPARE(postAccountRequest.asJson(), expectedJson);
++ QCOMPARE(postAccountRequest.asJsonValue(), expectedJsonValue);
++ QCOMPARE(postAccountRequest.getOneOfAccount().asJson(), oneOf0ExpectedJson);
++ QCOMPARE(mapAsString(postAccountRequest.getOneOfQMapQStringQJsonValue()), oneOf1ExpectedJson);
++ QCOMPARE(postAccountRequest.isOneOfAccountValid(), isOneOf0Valid);
++ QCOMPARE(postAccountRequest.isOneOfAccountSet(), isOneOf0Set);
++ QCOMPARE(postAccountRequest.isOneOfQMapQStringQJsonValueValid(), isOneOf1Valid);
++ QCOMPARE(postAccountRequest.isOneOfQMapQStringQJsonValueSet(), isOneOf1Set);
++ QCOMPARE(postAccountRequest.isValid(), isValid);
++ QCOMPARE(postAccountRequest.isSet(), isSet);
++ }
++
++ void OneOfTest::testPostFarmPetRequestJsonConversionMethods_data()
++ {
++ QTest::addColumn<SchemasModelsOneOf::PostFarmPet_request>("postFarmPetRequest");
++ QTest::addColumn<QString>("expectedJson");
++ QTest::addColumn<QJsonValue>("expectedJsonValue");
++ QTest::addColumn<QString>("oneOfBunnyExpectedJson");
++ QTest::addColumn<QString>("oneOfDuckExpectedJson");
++ QTest::addColumn<QString>("oneOfDogExpectedJson");
++ QTest::addColumn<SchemasModelsOneOf::Bunny>("getOneOfBunny");
++ QTest::addColumn<SchemasModelsOneOf::Duck>("getOneOfDuck");
++ QTest::addColumn<SchemasModelsOneOf::Dog>("getOneOfDog");
++ QTest::addColumn<bool>("isOneOfBunnyValid");
++ QTest::addColumn<bool>("isOneOfBunnySet");
++ QTest::addColumn<bool>("isOneOfDuckValid");
++ QTest::addColumn<bool>("isOneOfDuckSet");
++ QTest::addColumn<bool>("isOneOfDogValid");
++ QTest::addColumn<bool>("isOneOfDogSet");
++ QTest::addColumn<bool>("isValid");
++ QTest::addColumn<bool>("isSet");
++
++ SchemasModelsOneOf::PostFarmPet_request req;
++ QTest::newRow("Empty PostFarmPet_request object")
++ // postFarmPetRequest // expectedJson
++ << req << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // oneOfDogExpectedJson
++ << QString("{}"_L1)
++ // getOneOfBunny // getOneOfDuck
++ << SchemasModelsOneOf::Bunny() << SchemasModelsOneOf::Duck()
++ // getOneOfDog
++ << SchemasModelsOneOf::Dog()
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << false << false
++ // isOneOfDuckValid // isOneOfDuckSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // no required fields
++ SchemasModelsOneOf::Bunny bunny;
++ bunny.setWeight(5);
++ bunny.setBreedType("Himalayan"_L1);
++
++ // no required fields
++ SchemasModelsOneOf::Duck duck;
++ duck.setHunts(false);
++ duck.setAge(7);
++
++ // has required 'bark' - bool
++ SchemasModelsOneOf::Dog hund;
++ hund.setBark(false);
++ hund.setBreed("French Bulldog"_L1);
++
++ // check setters work fine with valid objects
++ req.setOneOfBunny(bunny);
++ QTest::newRow("Set a valid Bunny object via setter")
++ // postFarmPetRequest // expectedJson
++ << req << bunny.asJson()
++ // expectedJsonValue
++ << bunny.asJsonValue()
++ // oneOfBunnyExpectedJson
++ << bunny.asJson()
++ // oneOfDuckExpectedJson // oneOfDogExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // getOneOfBunny // getOneOfDuck
++ << bunny << SchemasModelsOneOf::Duck()
++ // getOneOfDog
++ << SchemasModelsOneOf::Dog()
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << true << true
++ // isOneOfDuckValid // isOneOfDuckSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ req.setOneOfDuck(duck);
++ QTest::newRow("Set a valid Duck object via setter")
++ // postFarmPetRequest // expectedJson
++ << req << duck.asJson()
++ // expectedJsonValue
++ << duck.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << duck.asJson()
++ // oneOfDogExpectedJson
++ << QString("{}"_L1)
++ // getOneOfBunny // getOneOfDuck
++ << SchemasModelsOneOf::Bunny() << duck
++ // getOneOfDog
++ << SchemasModelsOneOf::Dog()
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << false << false
++ // isOneOfDuckValid // isOneOfDuckSet
++ << true << true
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ req.setOneOfDog(hund);
++ QTest::newRow("Set a valid Dog object via setter")
++ // postFarmPetRequest // expectedJson
++ << req << hund.asJson()
++ // expectedJsonValue
++ << hund.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // oneOfDogExpectedJson
++ << hund.asJson()
++ // getOneOfBunny // getOneOfDuck
++ << SchemasModelsOneOf::Bunny() << SchemasModelsOneOf::Duck()
++ // getOneOfDog
++ << hund
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << false << false
++ // isOneOfDuckValid // isOneOfDuckSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Set an empty Dog object, the dog has required fields, so an empty
++ // dog is INVALID => entire PostFarmPet_request stays invalid
++ const SchemasModelsOneOf::Dog emptyDog;
++ req.setOneOfDog(emptyDog);
++ QTest::newRow("Set an empty Dog object via setter")
++ // postFarmPetRequest // expectedJson
++ << req << emptyDog.asJson()
++ // expectedJsonValue
++ << emptyDog.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // oneOfDogExpectedJson
++ << QString("{}"_L1)
++ // getOneOfBunny // getOneOfDuck
++ << SchemasModelsOneOf::Bunny() << SchemasModelsOneOf::Duck()
++ // getOneOfDog
++ << emptyDog
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << false << false
++ // isOneOfDuckValid // isOneOfDuckSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Set an empty Bunny object, the bunny has no required fields, so an empty
++ // bunny is VALID => entire PostFarmPet_request becomes valid
++ const SchemasModelsOneOf::Bunny emptyBunny;
++ req.setOneOfBunny(emptyBunny);
++ QTest::newRow("Set an empty Bunny object via setter")
++ // postFarmPetRequest // expectedJson
++ << req << emptyBunny.asJson()
++ // expectedJsonValue
++ << emptyBunny.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // oneOfDogExpectedJson
++ << QString("{}"_L1)
++ // getOneOfBunny // getOneOfDuck
++ << emptyBunny << SchemasModelsOneOf::Duck()
++ // getOneOfDog
++ << SchemasModelsOneOf::Dog()
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << true << true
++ // isOneOfDuckValid // isOneOfDuckSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set an empty Duck object, the duck has no required fields, so an empty
++ // duck is VALID => entire PostFarmPet_request becomes valid
++ const SchemasModelsOneOf::Duck emptyDuck;
++ req.setOneOfDuck(emptyDuck);
++ QTest::newRow("Set an empty Duck object via setter")
++ // postFarmPetRequest // expectedJson
++ << req << emptyDuck.asJson()
++ // expectedJsonValue
++ << emptyDuck.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // oneOfDogExpectedJson
++ << QString("{}"_L1)
++ // getOneOfBunny // getOneOfDuck
++ << emptyBunny << emptyDuck
++ // getOneOfDog
++ << SchemasModelsOneOf::Dog()
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << false << false
++ // isOneOfDuckValid // isOneOfDuckSet
++ << true << true
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue with EMPTY data.
++ // Attempting to set an empty Dog via req.fromJsonValue().
++ // Dog defines required field 'bark', so an empty object is INVALID for Dog.
++ //
++ // However, emptyDog.asJsonValue() produces '{}' because it is an empty object.
++ //
++ // The PostFarmPet_request::fromJsonValue() logic cannot determine whether '{}'
++ // represents a Bunny, Duck, or Dog. The only available approach is to try
++ // deserializing '{}' against each schema and select the one that validates
++ // successfully.
++ //
++ // This leads to ambiguity, since '{}' is valid for both Bunny and Duck
++ // (neither has required fields). Bunny is first, so it wins.
++ //
++ // To avoid such situations, the schema should define either a discriminator
++ // or required fields for each Object in the YAML specification.
++ //
++ // This ambiguity is intentional here for testing purposes, to highlight
++ // the importance of well-defined API schemas. Ensuring correctness of the
++ // API design is the responsibility of the API author.
++ req.fromJsonValue(emptyDog.asJsonValue());
++ QTest::newRow("Set an empty Dog via ::fromJsonValue(emptyDog.asJsonValue())")
++ // postFarmPetRequest // expectedJson
++ << req << emptyDog.asJson()
++ // expectedJsonValue
++ << emptyDog.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // oneOfDogExpectedJson
++ << QString("{}"_L1)
++ // getOneOfBunny // getOneOfDuck
++ << emptyBunny << emptyDuck
++ // getOneOfDog
++ << emptyDog
++ // !!! NOTE: ambiguity between Bunny and Duck resolved to Bunny
++ // (because it's first in the list)
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << true << true
++ // isOneOfDuckValid // isOneOfDuckSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson with EMPTY data. Same expectations as with
++ // 'Set an empty Dog via req.fromJsonValue(emptyDog.asJsonValue())'
++ req.fromJson(emptyDog.asJson());
++ QTest::newRow("Set an empty Dog via ::fromJson(emptyDog.asJson())")
++ // postFarmPetRequest // expectedJson
++ << req << emptyDog.asJson()
++ // expectedJsonValue
++ << emptyDog.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // oneOfDogExpectedJson
++ << QString("{}"_L1)
++ // getOneOfBunny // getOneOfDuck
++ << emptyBunny << emptyDuck
++ // getOneOfDog
++ << emptyDog
++ // !!! NOTE: ambiguity between Bunny and Duck, Bunny wins
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << true << true
++ // isOneOfDuckValid // isOneOfDuckSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // ::fromJson with EMPTY Bunny data. Same expectations as above.
++ req.fromJson(emptyBunny.asJson());
++ QTest::newRow("Set an empty Bunny via ::fromJson(emptyBunny.asJson())")
++ // postFarmPetRequest // expectedJson
++ << req << emptyBunny.asJson()
++ // expectedJsonValue
++ << emptyBunny.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // oneOfDogExpectedJson
++ << QString("{}"_L1)
++ // getOneOfBunny // getOneOfDuck
++ << emptyBunny << emptyDuck
++ // getOneOfDog
++ << emptyDog
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << true << true
++ // isOneOfDuckValid // isOneOfDuckSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ req.fromJsonValue(emptyBunny.asJsonValue());
++ QTest::newRow("Set an empty Bunny via ::fromJsonValue(emptyBunny.asJsonValue())")
++ // postFarmPetRequest // expectedJson
++ << req << emptyBunny.asJson()
++ // expectedJsonValue
++ << emptyBunny.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // oneOfDogExpectedJson
++ << QString("{}"_L1)
++ // getOneOfBunny // getOneOfDuck
++ << emptyBunny << emptyDuck
++ // getOneOfDog
++ << emptyDog
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << true << true
++ // isOneOfDuckValid // isOneOfDuckSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ const QString bunnyWeight("{\"weight\":5}"_L1);
++ req.fromJson(bunnyWeight);
++ QTest::newRow("Set a valid Bunny object via ::fromJson()")
++ // postFarmPetRequest // expectedJson
++ << req << bunnyWeight
++ // expectedJsonValue
++ << req.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << bunnyWeight << QString("{}"_L1)
++ // oneOfDogExpectedJson
++ << QString("{}"_L1)
++ // getOneOfBunny // getOneOfDuck
++ << SchemasModelsOneOf::Bunny(bunnyWeight) << emptyDuck
++ // getOneOfDog
++ << emptyDog
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << true << true
++ // isOneOfDuckValid // isOneOfDuckSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // check fromJsonValue() works fine for VALID bunny object
++ const SchemasModelsOneOf::Bunny okBunny(bunnyWeight);
++ req.fromJsonValue(okBunny.asJsonValue());
++ QTest::newRow("Set a valid Bunny object via ::fromJsonValue()")
++ // postFarmPetRequest // expectedJson
++ << req << bunnyWeight
++ // expectedJsonValue
++ << req.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << bunnyWeight << QString("{}"_L1)
++ // oneOfDogExpectedJson
++ << QString("{}"_L1)
++ // getOneOfBunny // getOneOfDuck
++ << SchemasModelsOneOf::Bunny(bunnyWeight) << emptyDuck
++ // getOneOfDog
++ << emptyDog
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << true << true
++ // isOneOfDuckValid // isOneOfDuckSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // check fromJson() works fine for VALID duck object
++ const QString duckyDuck("{\"age\":7,\"hunts\":false}"_L1);
++ req.fromJson(duckyDuck);
++ QTest::newRow("Set a valid Duck object via ::fromJson()")
++ // postFarmPetRequest // expectedJson
++ << req << duckyDuck
++ // expectedJsonValue
++ << req.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << duckyDuck
++ // oneOfDogExpectedJson
++ << QString("{}"_L1)
++ // getOneOfBunny // getOneOfDuck
++ << emptyBunny << SchemasModelsOneOf::Duck(duckyDuck)
++ // getOneOfDog
++ << emptyDog
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << false << false
++ // isOneOfDuckValid // isOneOfDuckSet
++ << true << true
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // check ::fromJsonValue() works fine for VALID duck object
++ const SchemasModelsOneOf::Duck okDuck(duckyDuck);
++ req.fromJsonValue(okDuck.asJsonValue());
++ QTest::newRow("Set a valid Duck object via ::fromJsonValue()")
++ // postFarmPetRequest // expectedJson
++ << req << duckyDuck
++ // expectedJsonValue
++ << req.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << duckyDuck
++ // oneOfDogExpectedJson
++ << QString("{}"_L1)
++ // getOneOfBunny // getOneOfDuck
++ << emptyBunny << SchemasModelsOneOf::Duck(duckyDuck)
++ // getOneOfDog
++ << emptyDog
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << false << false
++ // isOneOfDuckValid // isOneOfDuckSet
++ << true << true
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // check fromJson() works fine for VALID dog object
++ const QString doggyDog("{\"bark\":false}"_L1);
++ req.fromJson(doggyDog);
++ QTest::newRow("Set a valid Dog object via ::fromJson()")
++ // postFarmPetRequest // expectedJson
++ << req << doggyDog
++ // expectedJsonValue
++ << req.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // oneOfDogExpectedJson
++ << doggyDog
++ // getOneOfBunny // getOneOfDuck
++ << emptyBunny << emptyDuck
++ // getOneOfDog
++ << SchemasModelsOneOf::Dog(doggyDog)
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << false << false
++ // isOneOfDuckValid // isOneOfDuckSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // check fromJsonValue() works fine for VALID dog object
++ const SchemasModelsOneOf::Dog okDog(doggyDog);
++ req.fromJsonValue(okDog.asJsonValue());
++ QTest::newRow("Set a valid Dog object via ::fromJsonValue()")
++ // postFarmPetRequest // expectedJson
++ << req << doggyDog
++ // expectedJsonValue
++ << req.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // oneOfDogExpectedJson
++ << doggyDog
++ // getOneOfBunny // getOneOfDuck
++ << emptyBunny << emptyDuck
++ // getOneOfDog
++ << SchemasModelsOneOf::Dog(doggyDog)
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << false << false
++ // isOneOfDuckValid // isOneOfDuckSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // invalid json! => the model is RESET to INITIAL state
++ req.fromJson("{invalid json}"_L1);
++ QTest::newRow("Set an invalid json via ::fromJson()")
++ // postFarmPetRequest // expectedJson
++ << req << QString("{}"_L1)
++ // expectedJsonValue
++ << req.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // oneOfDogExpectedJson
++ << QString("{}"_L1)
++ // getOneOfBunny // getOneOfDuck
++ << emptyBunny << emptyDuck
++ // getOneOfDog
++ << emptyDog
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << false << false
++ // isOneOfDuckValid // isOneOfDuckSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Test with non-object JSON (array) => the model is RESET to INITIAL state
++ req.fromJson("[]"_L1);
++ QTest::newRow("Set an unexpected array [] via ::fromJson()")
++ // postFarmPetRequest // expectedJson
++ << req << QString("{}"_L1)
++ // expectedJsonValue
++ << req.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // oneOfDogExpectedJson
++ << QString("{}"_L1)
++ // getOneOfBunny // getOneOfDuck
++ << emptyBunny << emptyDuck
++ // getOneOfDog
++ << emptyDog
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << false << false
++ // isOneOfDuckValid // isOneOfDuckSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Test with non-object JSON (string) => the model is RESET to INITIAL state
++ req.fromJson("\"just a string\""_L1);
++ QTest::newRow("Set an unexpected string via ::fromJson()")
++ // postFarmPetRequest // expectedJson
++ << req << QString("{}"_L1)
++ // expectedJsonValue
++ << req.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // oneOfDogExpectedJson
++ << QString("{}"_L1)
++ // getOneOfBunny // getOneOfDuck
++ << emptyBunny << emptyDuck
++ // getOneOfDog
++ << emptyDog
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << false << false
++ // isOneOfDuckValid // isOneOfDuckSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Missing Required Fields (Dog's 'bark' is required)
++ // Dog without required 'bark' field - should not be valid
++ SchemasModelsOneOf::Dog invalidDog;
++ invalidDog.setBreed("Husky-kolbasky"_L1);
++ req.setOneOfDog(invalidDog);
++ QTest::newRow("Set an invalid Dog via setter")
++ // postFarmPetRequest // expectedJson
++ << req << QString("{}"_L1)
++ // expectedJsonValue
++ << req.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // oneOfDogExpectedJson
++ << invalidDog.asJson()
++ // getOneOfBunny // getOneOfDuck
++ << emptyBunny << emptyDuck
++ // getOneOfDog
++ << invalidDog
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << false << false
++ // isOneOfDuckValid // isOneOfDuckSet
++ << false << false
++ // The status here reflects the status of the model that was set.
++ // The model's field was set by setter, so invalidDog.isSet() == true
++ // but invalidDog.isValid() == false, because required field is not set.
++ // isOneOfDogValid // isOneOfDogSet
++ << invalidDog.isValid() << invalidDog.isSet()
++ // isValid // isSet
++ << false << true;
++
++ // Try to parse JSON with only 'breed' field
++ // Dog also has 'breed', but bark is missing => Dog is invalid.
++ const QString testValue("{\"breed\":\"Retriever\"}"_L1);
++ req.fromJson(testValue);
++ QTest::newRow("Set a breed-only Dog JSON via ::fromJson()")
++ // postFarmPetRequest // expectedJson
++ << req << QString("{}"_L1)
++ // expectedJsonValue
++ << req.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // oneOfDogExpectedJson
++ << testValue
++ // getOneOfBunny // getOneOfDuck
++ << emptyBunny << emptyDuck
++ // getOneOfDog
++ << SchemasModelsOneOf::Dog(testValue)
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << false << false
++ // isOneOfDuckValid // isOneOfDuckSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << false << true
++ // isValid // isSet
++ << false << true;
++
++ // Partial/Incomplete JSON Objects
++ // Only weight field for Bunny (without breed-type),
++ // should work since Bunny has no required fields
++ const QString notFullBunny("{\"weight\":3}"_L1);
++ req.fromJson(notFullBunny);
++ QTest::newRow("Set a valid non-full Bunny via ::fromJson()")
++ // postFarmPetRequest // expectedJson
++ << req << notFullBunny
++ // expectedJsonValue
++ << req.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << notFullBunny << QString("{}"_L1)
++ // oneOfDogExpectedJson
++ << QString("{}"_L1)
++ // getOneOfBunny // getOneOfDuck
++ << SchemasModelsOneOf::Bunny(notFullBunny) << emptyDuck
++ // getOneOfDog
++ << emptyDog
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << true << true
++ // isOneOfDuckValid // isOneOfDuckSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Extra/Unknown Fields in JSON
++ // JSON with fields not in schema - should parse known fields and ignore unknown
++ // Using Duck fields + unknown fields to avoid breed ambiguity with Dog
++ req.fromJson("{\"age\":7,\"hunts\":false,\"name\":\"Donald\",\"color\":\"white\"}"_L1);
++ QString expected("{\"age\":7,\"hunts\":false}"_L1);
++ QTest::newRow("Extra/Unknown Fields in JSON via ::fromJson()")
++ // postFarmPetRequest // expectedJson
++ << req << expected
++ // expectedJsonValue
++ << req.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << expected
++ // oneOfDogExpectedJson
++ << QString("{}"_L1)
++ // getOneOfBunny // getOneOfDuck
++ << emptyBunny << SchemasModelsOneOf::Duck(expected)
++ // getOneOfDog
++ << emptyDog
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << false << false
++ // isOneOfDuckValid // isOneOfDuckSet
++ << true << true
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Invalid Field Types for Duck(). Wrong type for age (string instead of integer)
++ // Note: fields of Duck type are not required, it means wrong fields can be omitted
++ expected = QString("{\"age\":\"seven\",\"hunts\":false}"_L1);
++ req.fromJson(expected);
++ QTest::newRow("Invalid field 'age=seven' in Duck via ::fromJson()")
++ // postFarmPetRequest // expectedJson
++ << req << QString("{\"hunts\":false}"_L1)
++ // expectedJsonValue
++ << req.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << QString("{\"hunts\":false}"_L1)
++ // oneOfDogExpectedJson
++ << QString("{}"_L1)
++ // getOneOfBunny // getOneOfDuck
++ << emptyBunny << SchemasModelsOneOf::Duck(expected)
++ // getOneOfDog
++ << emptyDog
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << false << false
++ // isOneOfDuckValid // isOneOfDuckSet
++ << true << true
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Invalid Field Types for Duck(). Wrong type for age (double instead of integer)
++ // Note: fields of Duck type are not required, it means wrong fields can be omitted
++ expected = QString("{\"age\":0.1,\"hunts\":true}"_L1);
++ req.fromJson(expected);
++ QTest::newRow("Invalid field 'age=0.1' in Duck via ::fromJson()")
++ // postFarmPetRequest // expectedJson
++ << req << QString("{\"hunts\":true}"_L1)
++ // expectedJsonValue
++ << req.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << QString("{\"hunts\":true}"_L1)
++ // oneOfDogExpectedJson
++ << QString("{}"_L1)
++ // getOneOfBunny // getOneOfDuck
++ << emptyBunny << SchemasModelsOneOf::Duck(expected)
++ // getOneOfDog
++ << emptyDog
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << false << false
++ // isOneOfDuckValid // isOneOfDuckSet
++ << true << true
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Invalid Field Types for Duck(). Wrong type for age (bool instead of integer)
++ // Note: fields of Duck type are not required, it means wrong fields can be omitted
++ expected = QString("{\"age\":true,\"hunts\":true}"_L1);
++ req.fromJson(expected);
++ QTest::newRow("Invalid field 'age=true' in Duck via ::fromJson()")
++ // postFarmPetRequest // expectedJson
++ << req << QString("{\"hunts\":true}"_L1)
++ // expectedJsonValue
++ << req.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << QString("{\"hunts\":true}"_L1)
++ // oneOfDogExpectedJson
++ << QString("{}"_L1)
++ // getOneOfBunny // getOneOfDuck
++ << emptyBunny << SchemasModelsOneOf::Duck(expected)
++ // getOneOfDog
++ << emptyDog
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << false << false
++ // isOneOfDuckValid // isOneOfDuckSet
++ << true << true
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ expected = QString("{\"age\":true,\"hunts\":1}"_L1);
++ req.fromJson(expected);
++ QTest::newRow("Invalid fields: 'age=true', hunts=1 in Duck via ::fromJson()")
++ // postFarmPetRequest // expectedJson
++ << req << QString("{}"_L1)
++ // expectedJsonValue
++ << req.asJsonValue()
++ // oneOfBunnyExpectedJson // oneOfDuckExpectedJson
++ << QString("{}"_L1) << QString("{}"_L1)
++ // oneOfDogExpectedJson
++ << QString("{}"_L1)
++ // getOneOfBunny // getOneOfDuck
++ << emptyBunny << emptyDuck
++ // getOneOfDog
++ << emptyDog
++ // isOneOfBunnyValid // isOneOfBunnySet
++ << false << false
++ // isOneOfDuckValid // isOneOfDuckSet
++ << false << false
++ // isOneOfDogValid // isOneOfDogSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++ }
++
++ void OneOfTest::testPostFarmPetRequestJsonConversionMethods()
++ {
++ QFETCH(SchemasModelsOneOf::PostFarmPet_request, postFarmPetRequest);
++ QFETCH(QString, expectedJson);
++ QFETCH(QJsonValue, expectedJsonValue);
++ QFETCH(QString, oneOfBunnyExpectedJson);
++ QFETCH(QString, oneOfDuckExpectedJson);
++ QFETCH(QString, oneOfDogExpectedJson);
++ QFETCH(SchemasModelsOneOf::Bunny, getOneOfBunny);
++ QFETCH(SchemasModelsOneOf::Duck, getOneOfDuck);
++ QFETCH(SchemasModelsOneOf::Dog, getOneOfDog);
++ QFETCH(bool, isOneOfBunnyValid);
++ QFETCH(bool, isOneOfBunnySet);
++ QFETCH(bool, isOneOfDuckValid);
++ QFETCH(bool, isOneOfDuckSet);
++ QFETCH(bool, isOneOfDogValid);
++ QFETCH(bool, isOneOfDogSet);
++ QFETCH(bool, isValid);
++ QFETCH(bool, isSet);
++
++ QCOMPARE(postFarmPetRequest.asJson(), expectedJson);
++ QCOMPARE(postFarmPetRequest.asJsonValue(), expectedJsonValue);
++ QCOMPARE(postFarmPetRequest.getOneOfBunny().asJson(), oneOfBunnyExpectedJson);
++ QCOMPARE(postFarmPetRequest.isOneOfBunnyValid(), isOneOfBunnyValid);
++ QCOMPARE(postFarmPetRequest.isOneOfBunnySet(), isOneOfBunnySet);
++ QCOMPARE(postFarmPetRequest.getOneOfDuck().asJson(), oneOfDuckExpectedJson);
++ QCOMPARE(postFarmPetRequest.isOneOfDuckValid(), isOneOfDuckValid);
++ QCOMPARE(postFarmPetRequest.isOneOfDuckSet(), isOneOfDuckSet);
++ QCOMPARE(postFarmPetRequest.getOneOfDog().asJson(), oneOfDogExpectedJson);
++ QCOMPARE(postFarmPetRequest.getOneOfBunny(), getOneOfBunny);
++ QCOMPARE(postFarmPetRequest.getOneOfDuck(), getOneOfDuck);
++ QCOMPARE(postFarmPetRequest.getOneOfDog(), getOneOfDog);
++ QCOMPARE(postFarmPetRequest.isOneOfDogValid(), isOneOfDogValid);
++ QCOMPARE(postFarmPetRequest.isOneOfDogSet(), isOneOfDogSet);
++ QCOMPARE(postFarmPetRequest.isValid(), isValid);
++ QCOMPARE(postFarmPetRequest.isSet(), isSet);
++ }
++
++ void OneOfTest::testDummyTestValue()
++ {
++ SchemasModelsOneOf::DummyTestValue dummy;
++ QCOMPARE(dummy.asJson(), "{}"_L1);
++ QCOMPARE(dummy.asJsonValue(), QJsonValue(QJsonValue::Object));
++ QCOMPARE(dummy.isValid(), false);
++ QCOMPARE(dummy.isSet(), false);
++ }
++
++ // Helper: serialize QList<QList<qint32>> to compact JSON string
++ static QString listListInt32AsJson(const QList<QList<qint32>> &v)
++ {
++ QJsonArray outer;
++ for (const auto &inner : v) {
++ QJsonArray arr;
++ for (const auto &i : inner)
++ arr.append(i);
++ outer.append(arr);
++ }
++ return QString::fromUtf8(QJsonValue(outer).toJson(QJsonDocument::Compact));
++ }
++
++ void OneOfTest::testRootJsonConversionMethods_data()
++ {
++ QTest::addColumn<SchemasModelsOneOf::Root>("root");
++ QTest::addColumn<QString>("expectedJson");
++ QTest::addColumn<QJsonValue>("expectedJsonValue");
++ QTest::addColumn<qint32>("oneOf0ExpectedValue");
++ QTest::addColumn<QString>("oneOf1ExpectedJson");
++ QTest::addColumn<QString>("oneOf2ExpectedJson");
++ QTest::addColumn<bool>("isOneOfQint32Valid");
++ QTest::addColumn<bool>("isOneOfQint32Set");
++ QTest::addColumn<bool>("isOneOfQListQListqint32Valid");
++ QTest::addColumn<bool>("isOneOfQListQListqint32Set");
++ QTest::addColumn<bool>("isOneOfContainerValid");
++ QTest::addColumn<bool>("isOneOfContainerSet");
++ QTest::addColumn<bool>("isValid");
++ QTest::addColumn<bool>("isSet");
++
++ // Root has three oneOf alternatives:
++ // oneOf0: qint32 - primitive, always valid when set
++ // oneOf1: QList<QList<qint32>> - nested list, always valid when set
++ // oneOf2: Container - object, valid if Container is valid
++
++ SchemasModelsOneOf::Root root;
++ QTest::newRow("Empty Root object")
++ // root // expectedJson
++ << root << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(0) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << QString("{}"_L1)
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << false << false
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << false << false
++ // isOneOfContainerValid // isOneOfContainerSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Set a valid qint32 via setter
++ root.setOneOfQint32(42);
++ QTest::newRow("Set qint32=42 via setter")
++ // root // expectedJson
++ << root << QString("42"_L1)
++ // expectedJsonValue
++ << QJsonValue(42)
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(42) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << QString("{}"_L1)
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << true << true
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << false << false
++ // isOneOfContainerValid // isOneOfContainerSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set qint32 = 0 via setter (zero is a legitimate value)
++ root.setOneOfQint32(0);
++ QTest::newRow("Set qint32=0 via setter")
++ // root // expectedJson
++ << root << QString("0"_L1)
++ // expectedJsonValue
++ << QJsonValue(0)
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(0) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << QString("{}"_L1)
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << true << true
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << false << false
++ // isOneOfContainerValid // isOneOfContainerSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set negative qint32 via setter
++ root.setOneOfQint32(-7);
++ QTest::newRow("Set qint32=-7 via setter")
++ // root // expectedJson
++ << root << QString("-7"_L1)
++ // expectedJsonValue
++ << QJsonValue(-7)
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(-7) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << QString("{}"_L1)
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << true << true
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << false << false
++ // isOneOfContainerValid // isOneOfContainerSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set a non-empty QList<QList<qint32>> via setter
++ const QList<QList<qint32>> nestedList = {{1, 2}, {3, 4}};
++ root.setOneOfQListQListqint32(nestedList);
++ QTest::newRow("Set QList<QList<qint32>>={{1,2},{3,4}} via setter")
++ // root // expectedJson
++ << root << QString("[[1,2],[3,4]]"_L1)
++ // expectedJsonValue
++ << QJsonValue::fromJson("[[1,2],[3,4]]")
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(0) << QString("[[1,2],[3,4]]"_L1)
++ // oneOf2ExpectedJson
++ << QString("{}"_L1)
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << false << false
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << true << true
++ // isOneOfContainerValid // isOneOfContainerSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set an empty QList<QList<qint32>> via setter (empty list is still a valid value)
++ const QList<QList<qint32>> emptyList;
++ root.setOneOfQListQListqint32(emptyList);
++ QTest::newRow("Set empty QList<QList<qint32>> via setter")
++ // root // expectedJson
++ << root << QString("[]"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonArray())
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(0) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << QString("{}"_L1)
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << false << false
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << true << true
++ // isOneOfContainerValid // isOneOfContainerSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set a valid Container (Container_oneOf with Duck value) via setter
++ SchemasModelsOneOf::Duck duck;
++ duck.setHunts(true);
++ duck.setAge(5);
++ SchemasModelsOneOf::Container_oneOf containerOneOf;
++ containerOneOf.setValue(duck);
++ SchemasModelsOneOf::Container validContainer;
++ validContainer.setOneOfContainer_oneOf(containerOneOf);
++ const QString duckContainerJson("{\"value\":{\"age\":5,\"hunts\":true}}"_L1);
++ root.setOneOfContainer(validContainer);
++ QTest::newRow("Set valid Container (Container_oneOf with Duck) via setter")
++ // root // expectedJson
++ << root << duckContainerJson
++ // expectedJsonValue
++ << validContainer.asJsonValue()
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(0) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << duckContainerJson
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << false << false
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << false << false
++ // isOneOfContainerValid // isOneOfContainerSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Set valid Container (QList<Dog>) via setter.
++ // Root.asJson() for this case returns an array (Container serializes as array
++ // when the active variant is QList<Dog>).
++ SchemasModelsOneOf::Dog dogForContainer;
++ dogForContainer.setBark(true);
++ dogForContainer.setBreed("Lab"_L1);
++ SchemasModelsOneOf::Container dogListContainer;
++ dogListContainer.setOneOfQListDog({dogForContainer});
++ const QString dogListContainerJson("[{\"bark\":true,\"breed\":\"Lab\"}]"_L1);
++ root.setOneOfContainer(dogListContainer);
++ QTest::newRow("Set valid Container (QList<Dog>) via setter")
++ // root // expectedJson
++ << root << dogListContainerJson
++ // expectedJsonValue
++ << dogListContainer.asJsonValue()
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(0) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << dogListContainerJson
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << false << false
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << false << false
++ // isOneOfContainerValid // isOneOfContainerSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Set an empty (invalid) Container via setter.
++ // Empty Container has isValid()=false and isSet()=false,
++ // so Root should have Container not set and not valid.
++ const SchemasModelsOneOf::Container emptyContainer;
++ root.setOneOfContainer(emptyContainer);
++ QTest::newRow("Set empty (invalid) Container via setter")
++ // root // expectedJson
++ << root << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(0) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << QString("{}"_L1)
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << false << false
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << false << false
++ // isOneOfContainerValid // isOneOfContainerSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJson: integer value
++ root.fromJson("42"_L1);
++ QTest::newRow("Set qint32=42 via ::fromJson()")
++ // root // expectedJson
++ << root << QString("42"_L1)
++ // expectedJsonValue
++ << QJsonValue(42)
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(42) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << QString("{}"_L1)
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << true << true
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << false << false
++ // isOneOfContainerValid // isOneOfContainerSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson: zero integer
++ root.fromJson("0"_L1);
++ QTest::newRow("Set qint32=0 via ::fromJson()")
++ // root // expectedJson
++ << root << QString("0"_L1)
++ // expectedJsonValue
++ << QJsonValue(0)
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(0) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << QString("{}"_L1)
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << true << true
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << false << false
++ // isOneOfContainerValid // isOneOfContainerSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson: negative integer
++ root.fromJson("-100"_L1);
++ QTest::newRow("Set qint32=-100 via ::fromJson()")
++ // root // expectedJson
++ << root << QString("-100"_L1)
++ // expectedJsonValue
++ << QJsonValue(-100)
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(-100) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << QString("{}"_L1)
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << true << true
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << false << false
++ // isOneOfContainerValid // isOneOfContainerSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson: 3.14 => json.isDouble() but not an integer => qint32 fails => reset
++ root.fromJson("3.14"_L1);
++ QTest::newRow("Set double 3.14 via ::fromJson() (no double alternative)")
++ // root // expectedJson
++ << root << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(0) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << QString("{}"_L1)
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << false << false
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << false << false
++ // isOneOfContainerValid // isOneOfContainerSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJson: nested array [[1,2],[3,4]]
++ root.fromJson("[[1,2],[3,4]]"_L1);
++ QTest::newRow("Set QList<QList<qint32>> via ::fromJson()")
++ // root // expectedJson
++ << root << QString("[[1,2],[3,4]]"_L1)
++ // expectedJsonValue
++ << root.asJsonValue()
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(0) << QString("[[1,2],[3,4]]"_L1)
++ // oneOf2ExpectedJson
++ << QString("{}"_L1)
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << false << false
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << true << true
++ // isOneOfContainerValid // isOneOfContainerSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson: empty array => empty QList<QList<qint32>>, valid
++ root.fromJson("[]"_L1);
++ QTest::newRow("Set empty array via ::fromJson() => empty QList<QList<qint32>>")
++ // root // expectedJson
++ << root << QString("[]"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonArray())
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(0) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << QString("{}"_L1)
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << false << false
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << true << true
++ // isOneOfContainerValid // isOneOfContainerSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson: array of ints [1,2,3] => each element is int, not QList<qint32>
++ // => QList<QList<qint32>> parse fails => reset
++ root.fromJson("[1,2,3]"_L1);
++ QTest::newRow("Set [1,2,3] via ::fromJson() => fails QList<QList<qint32>>")
++ // root // expectedJson
++ << root << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(0) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << QString("{}"_L1)
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << false << false
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << false << false
++ // isOneOfContainerValid // isOneOfContainerSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJson: Container_oneOf JSON object with a Duck value
++ root.fromJson(duckContainerJson);
++ QTest::newRow("Set Container (Container_oneOf with Duck) via ::fromJson()")
++ // root // expectedJson
++ << root << duckContainerJson
++ // expectedJsonValue
++ << root.asJsonValue()
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(0) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << duckContainerJson
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << false << false
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << false << false
++ // isOneOfContainerValid // isOneOfContainerSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // => Root Container is set and valid
++ root.fromJson("{}"_L1);
++ QTest::newRow("Set empty object {} via ::fromJson() => Container with empty object")
++ // root // expectedJson
++ << root << QString("{}"_L1)
++ // expectedJsonValue
++ << root.asJsonValue()
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(0) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << QString("{}"_L1)
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << false << false
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << false << false
++ // isOneOfContainerValid // isOneOfContainerSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ root.fromJson(dogListContainerJson);
++ QTest::newRow("Set Container(QList<Dog>) JSON via ::fromJson() => no round-trip")
++ // root // expectedJson
++ << root << dogListContainerJson
++ // expectedJsonValue
++ << root.asJsonValue()
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(0) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << dogListContainerJson
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << false << false
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << false << false
++ // isOneOfContainerValid // isOneOfContainerSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // fromJson: bool value => no bool alternative => reset
++ root.fromJson("true"_L1);
++ QTest::newRow("Set bool 'true' via ::fromJson() => no bool alternative")
++ // root // expectedJson
++ << root << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(0) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << QString("{}"_L1)
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << false << false
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << false << false
++ // isOneOfContainerValid // isOneOfContainerSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJson: string value => no string alternative => reset
++ root.fromJson("\"hello\""_L1);
++ QTest::newRow("Set string via ::fromJson() => no string alternative")
++ // root // expectedJson
++ << root << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(0) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << QString("{}"_L1)
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << false << false
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << false << false
++ // isOneOfContainerValid // isOneOfContainerSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJson: invalid JSON => reset
++ root.fromJson("{invalid json}"_L1);
++ QTest::newRow("Set invalid JSON via ::fromJson() => reset")
++ // root // expectedJson
++ << root << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(0) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << QString("{}"_L1)
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << false << false
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << false << false
++ // isOneOfContainerValid // isOneOfContainerSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJson: null => reset
++ root.fromJson("null"_L1);
++ QTest::newRow("Set null via ::fromJson() => reset")
++ // root // expectedJson
++ << root << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(0) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << QString("{}"_L1)
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << false << false
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << false << false
++ // isOneOfContainerValid // isOneOfContainerSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJsonValue: integer
++ root.fromJsonValue(QJsonValue(99));
++ QTest::newRow("Set qint32=99 via ::fromJsonValue()")
++ // root // expectedJson
++ << root << QString("99"_L1)
++ // expectedJsonValue
++ << QJsonValue(99)
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(99) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << QString("{}"_L1)
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << true << true
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << false << false
++ // isOneOfContainerValid // isOneOfContainerSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue: nested array
++ root.fromJsonValue(QJsonValue::fromJson("[[1,2],[3,4]]"));
++ QTest::newRow("Set QList<QList<qint32>> via ::fromJsonValue()")
++ // root // expectedJson
++ << root << QString("[[1,2],[3,4]]"_L1)
++ // expectedJsonValue
++ << root.asJsonValue()
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(0) << QString("[[1,2],[3,4]]"_L1)
++ // oneOf2ExpectedJson
++ << QString("{}"_L1)
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << false << false
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << true << true
++ // isOneOfContainerValid // isOneOfContainerSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue: valid Container object
++ root.fromJsonValue(validContainer.asJsonValue());
++ QTest::newRow("Set valid Container via ::fromJsonValue()")
++ // root // expectedJson
++ << root << duckContainerJson
++ // expectedJsonValue
++ << root.asJsonValue()
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(0) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << duckContainerJson
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << false << false
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << false << false
++ // isOneOfContainerValid // isOneOfContainerSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Implicit construction from qint32
++ SchemasModelsOneOf::Root rootFromInt(7);
++ QTest::newRow("Implicitly construct Root from qint32=7")
++ // root // expectedJson
++ << rootFromInt << QString("7"_L1)
++ // expectedJsonValue
++ << QJsonValue(7)
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(7) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << QString("{}"_L1)
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << true << true
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << false << false
++ // isOneOfContainerValid // isOneOfContainerSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Implicit construction from QList<QList<qint32>>
++ SchemasModelsOneOf::Root rootFromList(nestedList);
++ QTest::newRow("Implicitly construct Root from QList<QList<qint32>>")
++ // rootFromList // expectedJson
++ << rootFromList << QString("[[1,2],[3,4]]"_L1)
++ // expectedJsonValue
++ << rootFromList.asJsonValue()
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(0) << QString("[[1,2],[3,4]]"_L1)
++ // oneOf2ExpectedJson
++ << QString("{}"_L1)
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << false << false
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << true << true
++ // isOneOfContainerValid // isOneOfContainerSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Implicit construction from Container
++ SchemasModelsOneOf::Root rootFromContainer(validContainer);
++ QTest::newRow("Implicitly construct Root from valid Container")
++ // rootFromContainer // expectedJson
++ << rootFromContainer << duckContainerJson
++ // expectedJsonValue
++ << rootFromContainer.asJsonValue()
++ // oneOf0ExpectedValue // oneOf1ExpectedJson
++ << qint32(0) << QString("[]"_L1)
++ // oneOf2ExpectedJson
++ << duckContainerJson
++ // isOneOfQint32Valid // isOneOfQint32Set
++ << false << false
++ // isOneOfQListQListqint32Valid // isOneOfQListQListqint32Set
++ << false << false
++ // isOneOfContainerValid // isOneOfContainerSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++ }
++
++ void OneOfTest::testRootJsonConversionMethods()
++ {
++ QFETCH(SchemasModelsOneOf::Root, root);
++ QFETCH(QString, expectedJson);
++ QFETCH(QJsonValue, expectedJsonValue);
++ QFETCH(qint32, oneOf0ExpectedValue);
++ QFETCH(QString, oneOf1ExpectedJson);
++ QFETCH(QString, oneOf2ExpectedJson);
++ QFETCH(bool, isOneOfQint32Valid);
++ QFETCH(bool, isOneOfQint32Set);
++ QFETCH(bool, isOneOfQListQListqint32Valid);
++ QFETCH(bool, isOneOfQListQListqint32Set);
++ QFETCH(bool, isOneOfContainerValid);
++ QFETCH(bool, isOneOfContainerSet);
++ QFETCH(bool, isValid);
++ QFETCH(bool, isSet);
++
++ QCOMPARE(root.asJson(), expectedJson);
++ QCOMPARE(root.asJsonValue(), expectedJsonValue);
++ QCOMPARE(root.getOneOfQint32(), oneOf0ExpectedValue);
++ QCOMPARE(root.isOneOfQint32Valid(), isOneOfQint32Valid);
++ QCOMPARE(root.isOneOfQint32Set(), isOneOfQint32Set);
++ QCOMPARE(listListInt32AsJson(root.getOneOfQListQListqint32()), oneOf1ExpectedJson);
++ QCOMPARE(root.isOneOfQListQListqint32Valid(), isOneOfQListQListqint32Valid);
++ QCOMPARE(root.isOneOfQListQListqint32Set(), isOneOfQListQListqint32Set);
++ QCOMPARE(root.getOneOfContainer().asJson(), oneOf2ExpectedJson);
++ QCOMPARE(root.isOneOfContainerValid(), isOneOfContainerValid);
++ QCOMPARE(root.isOneOfContainerSet(), isOneOfContainerSet);
++ QCOMPARE(root.isValid(), isValid);
++ QCOMPARE(root.isSet(), isSet);
++ }
++
++ // Helper: serialize QMap<QString, QMap<QString, qint32>> to compact JSON string
++ static QString mapMapInt32AsJson(const QMap<QString, QMap<QString, qint32>> &v)
++ {
++ QJsonObject outer;
++ for (const auto &[key, innerMap] : v.asKeyValueRange()) {
++ QJsonObject inner;
++ for (const auto &[innerKey, val] : innerMap.asKeyValueRange())
++ inner.insert(innerKey, val);
++ outer.insert(key, inner);
++ }
++ return QString::fromUtf8(QJsonDocument(outer).toJson(QJsonDocument::Compact));
++ }
++
++ // Helper: serialize QList<QMap<QString, qint32>> to compact JSON string
++ static QString listMapInt32AsJson(const QList<QMap<QString, qint32>> &v)
++ {
++ QJsonArray arr;
++ for (const auto &map : v) {
++ QJsonObject obj;
++ for (const auto &[key, val] : map.asKeyValueRange())
++ obj.insert(key, val);
++ arr.append(obj);
++ }
++ return QString::fromUtf8(QJsonDocument(arr).toJson(QJsonDocument::Compact));
++ }
++
++ void OneOfTest::testRootMapJsonConversionMethods_data()
++ {
++ QTest::addColumn<SchemasModelsOneOf::RootMap>("rootMap");
++ QTest::addColumn<QString>("expectedJson");
++ QTest::addColumn<QJsonValue>("expectedJsonValue");
++ QTest::addColumn<QString>("oneOf0ExpectedJson");
++ QTest::addColumn<QString>("oneOf1ExpectedJson");
++ QTest::addColumn<bool>("isOneOfMapOfMapsValid");
++ QTest::addColumn<bool>("isOneOfMapOfMapsSet");
++ QTest::addColumn<bool>("isOneOfArrayOfMapsValid");
++ QTest::addColumn<bool>("isOneOfArrayOfMapsSet");
++ QTest::addColumn<bool>("isValid");
++ QTest::addColumn<bool>("isSet");
++
++ // RootMap has two oneOf alternatives:
++ // oneOf0: QMap<QString, QMap<QString, qint32>> - map of maps
++ // oneOf1: QList<QMap<QString, qint32>> - array of maps
++
++ SchemasModelsOneOf::RootMap rootMap;
++ QTest::newRow("Empty RootMap object")
++ // rootMap // expectedJson
++ << rootMap << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << false << false
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Set a valid map-of-maps via setter
++ QMap<QString, QMap<QString, qint32>> mapOfMaps;
++ mapOfMaps.insert("group1"_L1, {{"a"_L1, 1}, {"b"_L1, 2}});
++ mapOfMaps.insert("group2"_L1, {{"c"_L1, 3}});
++ rootMap.setOneOfQMapQStringQMapQStringqint32(mapOfMaps);
++ const QString mapOfMapsJson("{\"group1\":{\"a\":1,\"b\":2},\"group2\":{\"c\":3}}"_L1);
++ QTest::newRow("Set valid map-of-maps via setter")
++ // rootMap // expectedJson
++ << rootMap << mapOfMapsJson
++ // expectedJsonValue
++ << rootMap.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << mapOfMapsJson << QString("[]"_L1)
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << true << true
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set an empty map-of-maps via setter (empty map is still valid)
++ const QMap<QString, QMap<QString, qint32>> emptyMapOfMaps;
++ rootMap.setOneOfQMapQStringQMapQStringqint32(emptyMapOfMaps);
++ QTest::newRow("Set empty map-of-maps via setter")
++ // rootMap // expectedJson
++ << rootMap << QString("{}"_L1)
++ // expectedJsonValue
++ << rootMap.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << true << true
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set a valid array-of-maps via setter
++ QList<QMap<QString, qint32>> arrayOfMaps;
++ arrayOfMaps.append({{"x"_L1, 10}, {"y"_L1, 20}});
++ arrayOfMaps.append({{"z"_L1, 30}});
++ rootMap.setOneOfQListQMapQStringqint32(arrayOfMaps);
++ const QString arrayOfMapsJson("[{\"x\":10,\"y\":20},{\"z\":30}]"_L1);
++ QTest::newRow("Set valid array-of-maps via setter")
++ // rootMap // expectedJson
++ << rootMap << arrayOfMapsJson
++ // expectedJsonValue
++ << rootMap.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << arrayOfMapsJson
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << false << false
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Set an empty array-of-maps via setter (empty list is still valid)
++ const QList<QMap<QString, qint32>> emptyArrayOfMaps;
++ rootMap.setOneOfQListQMapQStringqint32(emptyArrayOfMaps);
++ QTest::newRow("Set empty array-of-maps via setter")
++ // rootMap // expectedJson
++ << rootMap << QString("[]"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonArray())
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << false << false
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Set single-entry map-of-maps via setter
++ QMap<QString, QMap<QString, qint32>> singleMapOfMaps;
++ singleMapOfMaps.insert("only"_L1, {{"val"_L1, 42}});
++ rootMap.setOneOfQMapQStringQMapQStringqint32(singleMapOfMaps);
++ const QString singleMapOfMapsJson("{\"only\":{\"val\":42}}"_L1);
++ QTest::newRow("Set single-entry map-of-maps via setter")
++ // rootMap // expectedJson
++ << rootMap << singleMapOfMapsJson
++ // expectedJsonValue
++ << rootMap.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << singleMapOfMapsJson << QString("[]"_L1)
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << true << true
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set single-entry array-of-maps via setter
++ QList<QMap<QString, qint32>> singleArrayOfMaps;
++ singleArrayOfMaps.append({{"key"_L1, 99}});
++ rootMap.setOneOfQListQMapQStringqint32(singleArrayOfMaps);
++ const QString singleArrayOfMapsJson("[{\"key\":99}]"_L1);
++ QTest::newRow("Set single-entry array-of-maps via setter")
++ // rootMap // expectedJson
++ << rootMap << singleArrayOfMapsJson
++ // expectedJsonValue
++ << rootMap.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << singleArrayOfMapsJson
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << false << false
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // fromJson: valid map-of-maps JSON
++ rootMap.fromJson(mapOfMapsJson);
++ QTest::newRow("Set valid map-of-maps via ::fromJson()")
++ // rootMap // expectedJson
++ << rootMap << mapOfMapsJson
++ // expectedJsonValue
++ << rootMap.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << mapOfMapsJson << QString("[]"_L1)
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << true << true
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson: valid array-of-maps JSON
++ rootMap.fromJson(arrayOfMapsJson);
++ QTest::newRow("Set valid array-of-maps via ::fromJson()")
++ // rootMap // expectedJson
++ << rootMap << arrayOfMapsJson
++ // expectedJsonValue
++ << rootMap.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << arrayOfMapsJson
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << false << false
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // fromJson: empty object {} => map-of-maps
++ rootMap.fromJson("{}"_L1);
++ QTest::newRow("Set empty object {} via ::fromJson() => map-of-maps")
++ // rootMap // expectedJson
++ << rootMap << QString("{}"_L1)
++ // expectedJsonValue
++ << rootMap.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << true << true
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson: empty array [] => array-of-maps
++ rootMap.fromJson("[]"_L1);
++ QTest::newRow("Set empty array [] via ::fromJson() => empty array-of-maps")
++ // rootMap // expectedJson
++ << rootMap << QString("[]"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonArray())
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << false << false
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // fromJson: array of ints [1,2,3] => each element is int, not a map
++ // => QList<QMap<QString, qint32>> parse fails => reset
++ rootMap.fromJson("[1,2,3]"_L1);
++ QTest::newRow("Set [1,2,3] via ::fromJson() => fails array-of-maps")
++ // rootMap // expectedJson
++ << rootMap << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << false << false
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJson: integer value => no integer alternative => reset
++ rootMap.fromJson("42"_L1);
++ QTest::newRow("Set integer via ::fromJson() => no integer alternative")
++ // rootMap // expectedJson
++ << rootMap << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << false << false
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJson: bool value => no bool alternative => reset
++ rootMap.fromJson("true"_L1);
++ QTest::newRow("Set bool 'true' via ::fromJson() => no bool alternative")
++ // rootMap // expectedJson
++ << rootMap << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << false << false
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJson: string value => no string alternative => reset
++ rootMap.fromJson("\"hello\""_L1);
++ QTest::newRow("Set string via ::fromJson() => no string alternative")
++ // rootMap // expectedJson
++ << rootMap << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << false << false
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJson: invalid JSON => reset
++ rootMap.fromJson("{invalid json}"_L1);
++ QTest::newRow("Set invalid JSON via ::fromJson() => reset")
++ // rootMap // expectedJson
++ << rootMap << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << false << false
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJson: null => reset
++ rootMap.fromJson("null"_L1);
++ QTest::newRow("Set null via ::fromJson() => reset")
++ // rootMap // expectedJson
++ << rootMap << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << false << false
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJsonValue: valid map-of-maps object
++ rootMap.fromJsonValue(QJsonValue::fromJson(mapOfMapsJson.toUtf8()));
++ QTest::newRow("Set valid map-of-maps via ::fromJsonValue()")
++ // rootMap // expectedJson
++ << rootMap << mapOfMapsJson
++ // expectedJsonValue
++ << rootMap.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << mapOfMapsJson << QString("[]"_L1)
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << true << true
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue: valid array-of-maps
++ rootMap.fromJsonValue(QJsonValue::fromJson(arrayOfMapsJson.toUtf8()));
++ QTest::newRow("Set valid array-of-maps via ::fromJsonValue()")
++ // rootMap // expectedJson
++ << rootMap << arrayOfMapsJson
++ // expectedJsonValue
++ << rootMap.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << arrayOfMapsJson
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << false << false
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue: empty QJsonObject => map-of-maps
++ rootMap.fromJsonValue(QJsonValue(QJsonObject()));
++ QTest::newRow("Set empty QJsonObject via ::fromJsonValue() => map-of-maps")
++ // rootMap // expectedJson
++ << rootMap << QString("{}"_L1)
++ // expectedJsonValue
++ << rootMap.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << true << true
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue: empty QJsonArray => array-of-maps
++ rootMap.fromJsonValue(QJsonValue(QJsonArray()));
++ QTest::newRow("Set empty QJsonArray via ::fromJsonValue() => array-of-maps")
++ // rootMap // expectedJson
++ << rootMap << QString("[]"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonArray())
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << false << false
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Implicit construction from QMap<QString, QMap<QString, qint32>>
++ SchemasModelsOneOf::RootMap rootFromMap(mapOfMaps);
++ QTest::newRow("Implicitly construct RootMap from map-of-maps")
++ // rootFromMap // expectedJson
++ << rootFromMap << mapOfMapsJson
++ // expectedJsonValue
++ << rootFromMap.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << mapOfMapsJson << QString("[]"_L1)
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << true << true
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Implicit construction from QList<QMap<QString, qint32>>
++ SchemasModelsOneOf::RootMap rootFromList(arrayOfMaps);
++ QTest::newRow("Implicitly construct RootMap from array-of-maps")
++ // rootFromList // expectedJson
++ << rootFromList << arrayOfMapsJson
++ // expectedJsonValue
++ << rootFromList.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << arrayOfMapsJson
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << false << false
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Override map-of-maps with array-of-maps via setter
++ rootMap.setOneOfQMapQStringQMapQStringqint32(mapOfMaps);
++ rootMap.setOneOfQListQMapQStringqint32(arrayOfMaps);
++ QTest::newRow("Override map-of-maps with array-of-maps via setter")
++ // rootMap // expectedJson
++ << rootMap << arrayOfMapsJson
++ // expectedJsonValue
++ << rootMap.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << arrayOfMapsJson
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << false << false
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Override array-of-maps with map-of-maps via setter
++ rootMap.setOneOfQListQMapQStringqint32(arrayOfMaps);
++ rootMap.setOneOfQMapQStringQMapQStringqint32(mapOfMaps);
++ QTest::newRow("Override array-of-maps with map-of-maps via setter")
++ // rootMap // expectedJson
++ << rootMap << mapOfMapsJson
++ // expectedJsonValue
++ << rootMap.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << mapOfMapsJson << QString("[]"_L1)
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << true << true
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson: map-of-maps with negative values
++ const QString negMapJson("{\"neg\":{\"val\":-5}}"_L1);
++ rootMap.fromJson(negMapJson);
++ QTest::newRow("Set map-of-maps with negative values via ::fromJson()")
++ // rootMap // expectedJson
++ << rootMap << negMapJson
++ // expectedJsonValue
++ << rootMap.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << negMapJson << QString("[]"_L1)
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << true << true
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson: array-of-maps with empty inner maps
++ const QString emptyInnerJson("[{},{}]"_L1);
++ rootMap.fromJson(emptyInnerJson);
++ QTest::newRow("Set array-of-maps with empty inner maps via ::fromJson()")
++ // rootMap // expectedJson
++ << rootMap << emptyInnerJson
++ // expectedJsonValue
++ << rootMap.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << emptyInnerJson
++ // isOneOfMapOfMapsValid // isOneOfMapOfMapsSet
++ << false << false
++ // isOneOfArrayOfMapsValid // isOneOfArrayOfMapsSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++ }
++
++ void OneOfTest::testRootMapJsonConversionMethods()
++ {
++ QFETCH(SchemasModelsOneOf::RootMap, rootMap);
++ QFETCH(QString, expectedJson);
++ QFETCH(QJsonValue, expectedJsonValue);
++ QFETCH(QString, oneOf0ExpectedJson);
++ QFETCH(QString, oneOf1ExpectedJson);
++ QFETCH(bool, isOneOfMapOfMapsValid);
++ QFETCH(bool, isOneOfMapOfMapsSet);
++ QFETCH(bool, isOneOfArrayOfMapsValid);
++ QFETCH(bool, isOneOfArrayOfMapsSet);
++ QFETCH(bool, isValid);
++ QFETCH(bool, isSet);
++
++ QCOMPARE(rootMap.asJson(), expectedJson);
++ QCOMPARE(rootMap.asJsonValue(), expectedJsonValue);
++ QCOMPARE(mapMapInt32AsJson(rootMap.getOneOfQMapQStringQMapQStringqint32()),
++ oneOf0ExpectedJson);
++ QCOMPARE(rootMap.isOneOfQMapQStringQMapQStringqint32Valid(),
++ isOneOfMapOfMapsValid);
++ QCOMPARE(rootMap.isOneOfQMapQStringQMapQStringqint32Set(),
++ isOneOfMapOfMapsSet);
++ QCOMPARE(listMapInt32AsJson(rootMap.getOneOfQListQMapQStringqint32()),
++ oneOf1ExpectedJson);
++ QCOMPARE(rootMap.isOneOfQListQMapQStringqint32Valid(),
++ isOneOfArrayOfMapsValid);
++ QCOMPARE(rootMap.isOneOfQListQMapQStringqint32Set(),
++ isOneOfArrayOfMapsSet);
++ QCOMPARE(rootMap.isValid(), isValid);
++ QCOMPARE(rootMap.isSet(), isSet);
++ }
++
++ // Helper: serialize QMap<QString, Dog> to compact JSON string
++ static QString mapDogAsJson(const QMap<QString, SchemasModelsOneOf::Dog> &v)
++ {
++ QJsonObject outer;
++ for (const auto &[key, dog] : v.asKeyValueRange())
++ outer.insert(key, dog.asJsonValue());
++ return QString::fromUtf8(QJsonDocument(outer).toJson(QJsonDocument::Compact));
++ }
++
++ // Helper: serialize QList<QMap<QString, Duck>> to compact JSON string
++ static QString listMapDuckAsJson(const QList<QMap<QString, SchemasModelsOneOf::Duck>> &v)
++ {
++ QJsonArray arr;
++ for (const auto &map : v) {
++ QJsonObject obj;
++ for (const auto &[key, duck] : map.asKeyValueRange())
++ obj.insert(key, duck.asJsonValue());
++ arr.append(obj);
++ }
++ return QString::fromUtf8(QJsonDocument(arr).toJson(QJsonDocument::Compact));
++ }
++
++ void OneOfTest::testRootMapModelsJsonConversionMethods_data()
++ {
++ QTest::addColumn<SchemasModelsOneOf::RootMapModels>("rootMapModels");
++ QTest::addColumn<QString>("expectedJson");
++ QTest::addColumn<QJsonValue>("expectedJsonValue");
++ QTest::addColumn<QString>("oneOf0ExpectedJson");
++ QTest::addColumn<QString>("oneOf1ExpectedJson");
++ QTest::addColumn<bool>("isOneOfMapOfDogsValid");
++ QTest::addColumn<bool>("isOneOfMapOfDogsSet");
++ QTest::addColumn<bool>("isOneOfArrayOfMapDucksValid");
++ QTest::addColumn<bool>("isOneOfArrayOfMapDucksSet");
++ QTest::addColumn<bool>("isValid");
++ QTest::addColumn<bool>("isSet");
++
++ // RootMapModels has two oneOf alternatives:
++ // oneOf0: QMap<QString, Dog> - map of Dog models
++ // oneOf1: QList<QMap<QString, Duck>> - array of maps of Duck models
++ SchemasModelsOneOf::RootMapModels rootMapModels;
++ QTest::newRow("Empty RootMapModels object")
++ // rootMapModels // expectedJson
++ << rootMapModels << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << false << false
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // Set a valid map-of-Dogs via setter
++ SchemasModelsOneOf::Dog dog1;
++ dog1.setBark(true);
++ dog1.setBreed("Husky"_L1);
++ SchemasModelsOneOf::Dog dog2;
++ dog2.setBark(false);
++ dog2.setBreed("Dingo"_L1);
++ QMap<QString, SchemasModelsOneOf::Dog> mapOfDogs;
++ mapOfDogs.insert("rex"_L1, dog1);
++ mapOfDogs.insert("fido"_L1, dog2);
++ rootMapModels.setOneOfQMapQStringDog(mapOfDogs);
++ const QString mapOfDogsJson = mapDogAsJson(mapOfDogs);
++ QTest::newRow("Set valid map-of-Dogs via setter")
++ // rootMapModels // expectedJson
++ << rootMapModels << mapOfDogsJson
++ // expectedJsonValue
++ << rootMapModels.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << mapOfDogsJson << QString("[]"_L1)
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << true << true
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set an empty map-of-Dogs via setter (empty map is still valid)
++ const QMap<QString, SchemasModelsOneOf::Dog> emptyMapOfDogs;
++ rootMapModels.setOneOfQMapQStringDog(emptyMapOfDogs);
++ QTest::newRow("Set empty map-of-Dogs via setter")
++ // rootMapModels // expectedJson
++ << rootMapModels << QString("{}"_L1)
++ // expectedJsonValue
++ << rootMapModels.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << true << true
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set a valid array-of-maps-of-Ducks via setter
++ SchemasModelsOneOf::Duck duck1;
++ duck1.setHunts(true);
++ duck1.setAge(3);
++ SchemasModelsOneOf::Duck duck2;
++ duck2.setHunts(false);
++ duck2.setAge(5);
++ QList<QMap<QString, SchemasModelsOneOf::Duck>> arrayOfMapDucks;
++ arrayOfMapDucks.append({{"donald"_L1, duck1}, {"daisy"_L1, duck2}});
++ arrayOfMapDucks.append({{"scrooge"_L1, duck1}});
++ rootMapModels.setOneOfQListQMapQStringDuck(arrayOfMapDucks);
++ const QString arrayOfMapDucksJson = listMapDuckAsJson(arrayOfMapDucks);
++ QTest::newRow("Set valid array-of-map-Ducks via setter")
++ // rootMapModels // expectedJson
++ << rootMapModels << arrayOfMapDucksJson
++ // expectedJsonValue
++ << rootMapModels.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << arrayOfMapDucksJson
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << false << false
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Set an empty array-of-maps-of-Ducks via setter (empty list is still valid)
++ const QList<QMap<QString, SchemasModelsOneOf::Duck>> emptyArrayOfMapDucks;
++ rootMapModels.setOneOfQListQMapQStringDuck(emptyArrayOfMapDucks);
++ QTest::newRow("Set empty array-of-map-Ducks via setter")
++ // rootMapModels // expectedJson
++ << rootMapModels << QString("[]"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonArray())
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << false << false
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Set single-entry map-of-Dogs via setter
++ QMap<QString, SchemasModelsOneOf::Dog> singleMapOfDogs;
++ singleMapOfDogs.insert("buddy"_L1, dog1);
++ rootMapModels.setOneOfQMapQStringDog(singleMapOfDogs);
++ const QString singleMapOfDogsJson = mapDogAsJson(singleMapOfDogs);
++ QTest::newRow("Set single-entry map-of-Dogs via setter")
++ // rootMapModels // expectedJson
++ << rootMapModels << singleMapOfDogsJson
++ // expectedJsonValue
++ << rootMapModels.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << singleMapOfDogsJson << QString("[]"_L1)
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << true << true
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Set single-entry array-of-maps-of-Ducks via setter
++ QList<QMap<QString, SchemasModelsOneOf::Duck>> singleArrayOfMapDucks;
++ singleArrayOfMapDucks.append({{"quack"_L1, duck2}});
++ rootMapModels.setOneOfQListQMapQStringDuck(singleArrayOfMapDucks);
++ const QString singleArrayOfMapDucksJson = listMapDuckAsJson(singleArrayOfMapDucks);
++ QTest::newRow("Set single-entry array-of-map-Ducks via setter")
++ // rootMapModels // expectedJson
++ << rootMapModels << singleArrayOfMapDucksJson
++ // expectedJsonValue
++ << rootMapModels.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << singleArrayOfMapDucksJson
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << false << false
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // fromJson: valid map-of-Dogs JSON
++ rootMapModels.fromJson(mapOfDogsJson);
++ QTest::newRow("Set valid map-of-Dogs via ::fromJson()")
++ // rootMapModels // expectedJson
++ << rootMapModels << mapOfDogsJson
++ // expectedJsonValue
++ << rootMapModels.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << mapOfDogsJson << QString("[]"_L1)
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << true << true
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson: valid array-of-maps-of-Ducks JSON
++ rootMapModels.fromJson(arrayOfMapDucksJson);
++ QTest::newRow("Set valid array-of-map-Ducks via ::fromJson()")
++ // rootMapModels // expectedJson
++ << rootMapModels << arrayOfMapDucksJson
++ // expectedJsonValue
++ << rootMapModels.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << arrayOfMapDucksJson
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << false << false
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // fromJson: empty object {}
++ rootMapModels.fromJson("{}"_L1);
++ QTest::newRow("Set empty object {} via ::fromJson()")
++ // rootMapModels // expectedJson
++ << rootMapModels << QString("{}"_L1)
++ // expectedJsonValue
++ << rootMapModels.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << true << true
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson: empty array [] => array-of-maps-of-Ducks
++ rootMapModels.fromJson("[]"_L1);
++ QTest::newRow("Set empty array [] via ::fromJson() => empty array-of-map-Ducks")
++ // rootMapModels // expectedJson
++ << rootMapModels << QString("[]"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonArray())
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << false << false
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // fromJson: array of ints [1,2,3] => each element is int, not a map
++ rootMapModels.fromJson("[1,2,3]"_L1);
++ QTest::newRow("Set [1,2,3] via ::fromJson() => fails array-of-map-Ducks")
++ // rootMapModels // expectedJson
++ << rootMapModels << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << false << false
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJson: integer value => no integer alternative => reset
++ rootMapModels.fromJson("42"_L1);
++ QTest::newRow("Set integer via ::fromJson() => no integer alternative")
++ // rootMapModels // expectedJson
++ << rootMapModels << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << false << false
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJson: bool value => no bool alternative => reset
++ rootMapModels.fromJson("true"_L1);
++ QTest::newRow("Set bool 'true' via ::fromJson() => no bool alternative")
++ // rootMapModels // expectedJson
++ << rootMapModels << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << false << false
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJson: string value => no string alternative => reset
++ rootMapModels.fromJson("\"hello\""_L1);
++ QTest::newRow("Set string via ::fromJson() => no string alternative")
++ // rootMapModels // expectedJson
++ << rootMapModels << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << false << false
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJson: invalid JSON => reset
++ rootMapModels.fromJson("{invalid json}"_L1);
++ QTest::newRow("Set invalid JSON via ::fromJson() => reset")
++ // rootMapModels // expectedJson
++ << rootMapModels << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << false << false
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJson: null => reset
++ rootMapModels.fromJson("null"_L1);
++ QTest::newRow("Set null via ::fromJson() => reset")
++ // rootMapModels // expectedJson
++ << rootMapModels << QString("{}"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonObject())
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << false << false
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << false << false
++ // isValid // isSet
++ << false << false;
++
++ // fromJsonValue: valid map-of-Dogs object
++ rootMapModels.fromJsonValue(QJsonValue::fromJson(mapOfDogsJson.toUtf8()));
++ QTest::newRow("Set valid map-of-Dogs via ::fromJsonValue()")
++ // rootMapModels // expectedJson
++ << rootMapModels << mapOfDogsJson
++ // expectedJsonValue
++ << rootMapModels.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << mapOfDogsJson << QString("[]"_L1)
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << true << true
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue: valid array-of-maps-of-Ducks
++ rootMapModels.fromJsonValue(QJsonValue::fromJson(arrayOfMapDucksJson.toUtf8()));
++ // !!! ERROR: map-of-Dogs valid/set flags are not reset when array-of-Ducks wins
++ QTest::newRow("Set valid array-of-map-Ducks via ::fromJsonValue()")
++ // rootMapModels // expectedJson
++ << rootMapModels << arrayOfMapDucksJson
++ // expectedJsonValue
++ << rootMapModels.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << arrayOfMapDucksJson
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << false << false
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue: empty QJsonObject => map-of-Dogs wins
++ rootMapModels.fromJsonValue(QJsonValue(QJsonObject()));
++ QTest::newRow("Set empty QJsonObject via ::fromJsonValue()")
++ // rootMapModels // expectedJson
++ << rootMapModels << QString("{}"_L1)
++ // expectedJsonValue
++ << rootMapModels.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << true << true
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJsonValue: empty QJsonArray => array-of-maps-of-Ducks
++ rootMapModels.fromJsonValue(QJsonValue(QJsonArray()));
++ QTest::newRow("Set empty QJsonArray via ::fromJsonValue() => array-of-map-Ducks")
++ // rootMapModels // expectedJson
++ << rootMapModels << QString("[]"_L1)
++ // expectedJsonValue
++ << QJsonValue(QJsonArray())
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << QString("[]"_L1)
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << false << false
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Implicit construction from QMap<QString, Dog>
++ SchemasModelsOneOf::RootMapModels rootFromMap(mapOfDogs);
++ QTest::newRow("Implicitly construct RootMapModels from map-of-Dogs")
++ // rootFromMap // expectedJson
++ << rootFromMap << mapOfDogsJson
++ // expectedJsonValue
++ << rootFromMap.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << mapOfDogsJson << QString("[]"_L1)
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << true << true
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // Implicit construction from QList<QMap<QString, Duck>>
++ SchemasModelsOneOf::RootMapModels rootFromList(arrayOfMapDucks);
++ QTest::newRow("Implicitly construct RootMapModels from array-of-map-Ducks")
++ // rootFromList // expectedJson
++ << rootFromList << arrayOfMapDucksJson
++ // expectedJsonValue
++ << rootFromList.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << arrayOfMapDucksJson
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << false << false
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Override map-of-Dogs with array-of-maps-of-Ducks via setter
++ rootMapModels.setOneOfQMapQStringDog(mapOfDogs);
++ rootMapModels.setOneOfQListQMapQStringDuck(arrayOfMapDucks);
++ QTest::newRow("Override map-of-Dogs with array-of-map-Ducks via setter")
++ // rootMapModels // expectedJson
++ << rootMapModels << arrayOfMapDucksJson
++ // expectedJsonValue
++ << rootMapModels.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << arrayOfMapDucksJson
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << false << false
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++
++ // Override array-of-maps-of-Ducks with map-of-Dogs via setter
++ rootMapModels.setOneOfQListQMapQStringDuck(arrayOfMapDucks);
++ rootMapModels.setOneOfQMapQStringDog(mapOfDogs);
++ QTest::newRow("Override array-of-map-Ducks with map-of-Dogs via setter")
++ // rootMapModels // expectedJson
++ << rootMapModels << mapOfDogsJson
++ // expectedJsonValue
++ << rootMapModels.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << mapOfDogsJson << QString("[]"_L1)
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << true << true
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson: map with Dog that has only required field (bark)
++ const QString minimalDogMapJson("{\"spot\":{\"bark\":true}}"_L1);
++ rootMapModels.fromJson(minimalDogMapJson);
++ QTest::newRow("Set map-of-Dogs with minimal Dog (bark only) via ::fromJson()")
++ // rootMapModels // expectedJson
++ << rootMapModels << minimalDogMapJson
++ // expectedJsonValue
++ << rootMapModels.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << minimalDogMapJson << QString("[]"_L1)
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << true << true
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << false << false
++ // isValid // isSet
++ << true << true;
++
++ // fromJson: array with maps of Ducks with empty inner maps
++ const QString emptyInnerDucksJson("[{},{}]"_L1);
++ rootMapModels.fromJson(emptyInnerDucksJson);
++ QTest::newRow("Set array-of-map-Ducks with empty inner maps via ::fromJson()")
++ // rootMapModels // expectedJson
++ << rootMapModels << emptyInnerDucksJson
++ // expectedJsonValue
++ << rootMapModels.asJsonValue()
++ // oneOf0ExpectedJson // oneOf1ExpectedJson
++ << QString("{}"_L1) << emptyInnerDucksJson
++ // isOneOfMapOfDogsValid // isOneOfMapOfDogsSet
++ << false << false
++ // isOneOfArrayOfMapDucksValid // isOneOfArrayOfMapDucksSet
++ << true << true
++ // isValid // isSet
++ << true << true;
++ }
++
++ void OneOfTest::testRootMapModelsJsonConversionMethods()
++ {
++ QFETCH(SchemasModelsOneOf::RootMapModels, rootMapModels);
++ QFETCH(QString, expectedJson);
++ QFETCH(QJsonValue, expectedJsonValue);
++ QFETCH(QString, oneOf0ExpectedJson);
++ QFETCH(QString, oneOf1ExpectedJson);
++ QFETCH(bool, isOneOfMapOfDogsValid);
++ QFETCH(bool, isOneOfMapOfDogsSet);
++ QFETCH(bool, isOneOfArrayOfMapDucksValid);
++ QFETCH(bool, isOneOfArrayOfMapDucksSet);
++ QFETCH(bool, isValid);
++ QFETCH(bool, isSet);
++
++ QCOMPARE(rootMapModels.asJson(), expectedJson);
++ QCOMPARE(rootMapModels.asJsonValue(), expectedJsonValue);
++ QCOMPARE(mapDogAsJson(rootMapModels.getOneOfQMapQStringDog()),
++ oneOf0ExpectedJson);
++ QCOMPARE(rootMapModels.isOneOfQMapQStringDogValid(),
++ isOneOfMapOfDogsValid);
++ QCOMPARE(rootMapModels.isOneOfQMapQStringDogSet(),
++ isOneOfMapOfDogsSet);
++ QCOMPARE(listMapDuckAsJson(rootMapModels.getOneOfQListQMapQStringDuck()),
++ oneOf1ExpectedJson);
++ QCOMPARE(rootMapModels.isOneOfQListQMapQStringDuckValid(),
++ isOneOfArrayOfMapDucksValid);
++ QCOMPARE(rootMapModels.isOneOfQListQMapQStringDuckSet(),
++ isOneOfArrayOfMapDucksSet);
++ QCOMPARE(rootMapModels.isValid(), isValid);
++ QCOMPARE(rootMapModels.isSet(), isSet);
++ }
++
++ QTEST_MAIN(OneOfTest)
++ #include "tst_oneof.moc"