From c39fc1e31b50471261beea1d8a68ab45a585ad8d Mon Sep 17 00:00:00 2001 From: William Cheng Date: Mon, 3 Oct 2022 22:32:29 +0800 Subject: [PATCH] [JS] Refactor oneOf validation logic, add more tests (#13575) * refactor oneof validation logic, add more tests * update samples --- .../Javascript/partial_model_oneof.mustache | 391 +++++++++--------- .../javascript-apollo/src/model/Color.js | 172 ++++---- .../javascript-apollo/src/model/Pig.js | 88 ++-- .../javascript-es6/src/model/Color.js | 172 ++++---- .../petstore/javascript-es6/src/model/Pig.js | 88 ++-- .../javascript-es6/test/PetstoreTest.js | 88 +++- .../javascript-promise-es6/src/model/Color.js | 172 ++++---- .../javascript-promise-es6/src/model/Pig.js | 88 ++-- 8 files changed, 689 insertions(+), 570 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/Javascript/partial_model_oneof.mustache b/modules/openapi-generator/src/main/resources/Javascript/partial_model_oneof.mustache index 307d265e983..b226851ffc3 100644 --- a/modules/openapi-generator/src/main/resources/Javascript/partial_model_oneof.mustache +++ b/modules/openapi-generator/src/main/resources/Javascript/partial_model_oneof.mustache @@ -11,11 +11,206 @@ class {{classname}} { * Constructs a new {{classname}}.{{#description}} * {{.}}{{/description}} * @alias module:{{#invokerPackage}}{{.}}/{{/invokerPackage}}{{#modelPackage}}{{.}}/{{/modelPackage}}{{classname}} - * @param {{=< >=}}{(<#oneOf>module:<#invokerPackage>/<#modelPackage>/<&.><^-last>|)}<={{ }}=> The actual instance to initialize {{classname}}. + * @param {{=< >=}}{(<#oneOf>module:<#invokerPackage>/<#modelPackage>/<&.><^-last>|)}<={{ }}=> instance The actual instance to initialize {{classname}}. */ {{/emitJSDoc}} - constructor(obj = null) { - this.actualInstance = obj; + constructor(instance = null) { + if (instance === null) { + this.actualInstance = null; + return; + } + var match = 0; + var errorMessages = []; + {{#composedSchemas.oneOf}} + {{#description}} + // {{{description}}} + {{/description}} + try { + {{#isPrimitiveType}} + {{#isArray}} + // validate array data type + if (!Array.isArray(instance)) { + throw new Error("Invalid data type. Expecting array. Input: " + instance); + } + {{#minItems}} + {{#maxItems}} + if (instance.length > {{{maxItems}}} || instance.length < {{{minItems}}}) { + throw new Error("Invalid array size. Minimim: {{minItems}}. Maximum: {{maxItems}}. Input: " + instance); + } + {{/maxItems}} + {{^maxItems}} + if (instance.length < {{{minItems}}}) { + throw new Error("Invalid array size. Minimim: {{minItems}}. Input: " + instance); + } + {{/maxItems}} + {{/minItems}} + {{^minItems}} + {{#maxItems}} + if (instance.length > {{{maxItems}}}) { + throw new Error("Invalid array size. Maximum: {{maxItems}}. Input: " + instance); + } + {{/maxItems}} + {{/minItems}} + {{#items.isInteger}} + // validate array of integer + for (const item of instance) { + if (!(typeof item === 'number' && item % 1 === 0)) { + throw new Error("Invalid array items. Must be integer. Input: " + instance); + } + {{#items.maximum}} + {{#items.minimum}} + if (item > {{items.maximum}} || item < {{items.minimum}}) { + throw new Error("Invalid integer value in an array items. Max.: {{items.maximum}}. Min.: {{items.minimum}}. Input: " + instance); + } + {{/items.minimum}} + {{^items.minimum}} + if (item > {{items.maximum}}) { + throw new Error("Invalid integer value in an array items. Max.: {{items.maximum}}. Input: " + instance); + } + {{/items.minimum}} + {{/items.maximum}} + {{^items.maximum}} + {{#items.minimum}} + if (item < {{items.minimum}}) { + throw new Error("Invalid integer value in an array items. Min.: {{items.minimum}}. Input: " + instance); + } + {{/items.minimum}} + {{/items.maximum}} + } + {{/items.isInteger}} + {{#items.isString}} + // validate array of string + for (const item of instance) { + if (!(typeof item === 'number' && item % 1 === 0)) { + throw new Error("Invalid array items. Must be string. Input: " + instance); + } + {{#items.pattern}} + if (!{{{items.pattern}}}.test(item)) { + throw new Error("Invalid string value in an array items. Must conform to {{{items.pattern}}}. Input: " + item); + } + {{/items.pattern}} + {{#items.minLength}} + {{#items.maxLength}} + if (item.length > {{items.maxLength}} && item.length < {{items.minLength}}) { + throw new Error("Invalid string value in an array items. Max. length: {{{items.maxLength}}}. Min. length: {{{items.minLength}}}. Input: " + item); + } + {{/items.maxLength}} + {{^items.maxLength}} + if (item.length < {{items.minLength}}) { + throw new Error("Invalid string value in an array items. Min. length: {{{items.minLength}}}. Input: " + item); + } + {{/items.maxLength}} + {{/items.minLength}} + {{^items.minLength}} + {{#items.maxLength}} + if (item.length > {{items.maxLength}}) { + throw new Error("Invalid string value in an array items. Max. length: {{{items.maxLength}}}. Input: " + item) + } + {{/items.maxLength}} + {{/items.minLength}} + } + {{/items.isString}} + {{#items.isNumber}} + // validate array of string + for (const item of instance) { + if (!(typeof instance === 'number' && instance % 1 != 0)) { + throw new Error("Invalid array items. Must be number. Input: " + JSON.stringify(instance)); + } + } + {{/items.isNumber}} + {{/isArray}} + {{^isArray}} + {{#isInteger}} + // validate array of integer + if (!(typeof instance === 'number' && instance % 1 === 0)) { + throw new Error("Invalid array items. Must be integer. Input: " + JSON.stringify(instance)); + } + {{#maximum}} + {{#minimum}} + if (instance > {{maximum}} || instance < {{minimum}}) { + throw new Error("Invalid integer value in an array items. Max.: {{maximum}}. Min.: {{minimum}}. Input: " + JSON.stringify(instance)); + } + {{/minimum}} + {{^minimum}} + if (instance > {{maximum}}) { + throw new Error("Invalid integer value in an array items. Max.: {{maximum}}. Input: " + JSON.stringify(instance)); + } + {{/minimum}} + {{/maximum}} + {{^maximum}} + {{#minimum}} + if (instance < {{minimum}}) { + throw new Error("Invalid integer value in an array items. Min.: {{minimum}}. Input: " + JSON.stringify(instance)); + } + {{/minimum}} + {{/maximum}} + {{/isInteger}} + {{#isString}} + // validate array of string + if (!(typeof instance === 'string')) { + throw new Error("Invalid input. Must be string. Input: " + JSON.stringify(instance)); + } + {{#pattern}} + if (!{{{pattern}}}.test(instance)) { + throw new Error("Invalid string value in an array items. Must conform to {{{.}}}. Input: " + JSON.stringify(instance)); + } + {{/pattern}} + {{#minLength}} + {{#maxLength}} + if (instance.length > {{maxLength}} && instance.length < {{minLength}}) { + throw new Error("Invalid string value in an array items. Max. length: {{{maxLength}}}. Min. length: {{{minLength}}}. Input: " + JSON.stringify(instance)); + } + {{/maxLength}} + {{^maxLength}} + if (instance.length < {{minLength}}) { + throw new Error("Invalid string value in an array items. Min. length: {{{minLength}}}. Input: " + instance); + } + {{/maxLength}} + {{/minLength}} + {{^minLength}} + {{#maxLength}} + if (instance.length > {{maxLength}}) { + throw new Error("Invalid string value in an array items. Max. length: {{{maxLength}}}. Input: " + JSON.stringify(instance)); + } + {{/maxLength}} + {{/minLength}} + {{/isString}} + {{#isNumber}} + // validate array of string + if (!(typeof instance === 'number' && instance % 1 != 0)) { + throw new Error("Invalid array items. Must be number. Input: " + JSON.stringify(instance)); + } + {{/isNumber}} + {{/isArray}} + this.actualInstance = instance; + {{/isPrimitiveType}} + {{^isPrimitiveType}} + if (typeof instance === "{{{dataType}}}") { + this.actualInstance = instance; + } else { + // plain JS object + // validate the object + {{{dataType}}}.validateJSON(instance); // throw an exception if no match + // create {{{dataType}}} from JS object + this.actualInstance = {{{dataType}}}.constructFromObject(instance); + } + {{/isPrimitiveType}} + match++; + } catch(err) { + // json data failed to deserialize into {{{dataType}}} + errorMessages.push("Failed to construct {{{dataType}}}: " + err) + } + + {{/composedSchemas.oneOf}} + if (match > 1) { + throw new Error("Multiple matches found constructing `{{{classname}}}` with oneOf schemas {{#oneOf}}{{{.}}}{{^-last}}, {{/-last}}{{/oneOf}}. Input: " + JSON.stringify(instance)); + } else if (match === 0) { + this.actualInstance = null; // clear the actual instance in case there are multiple matches + throw new Error("No match found constructing `{{{classname}}}` with oneOf schemas {{#oneOf}}{{{.}}}{{^-last}}, {{/-last}}{{/oneOf}}. Details: " + + errorMessages.join(", ")); + } else { // only 1 match + // the input is valid + } } {{#emitJSDoc}} @@ -28,195 +223,7 @@ class {{classname}} { */ {{/emitJSDoc}} static constructFromObject(data, obj) { - if (!data) { - return new {{classname}}(); - } - var match = 0; - var errorMessages = []; - {{#composedSchemas.oneOf}} - {{#description}} - // {{{description}}} - {{/description}} - try { - {{#isPrimitiveType}} - {{#isArray}} - // validate array data type - if (!Array.isArray(data)) { - throw new Error("Invalid data type. Expecting array. Data: " + data); - } - {{#minItems}} - {{#maxItems}} - if (data.length > {{{maxItems}}} || data.length < {{{minItems}}}) { - throw new Error("Invalid array size. Minimim: {{minItems}}. Maximum: {{maxItems}}. Data: " + data); - } - {{/maxItems}} - {{^maxItems}} - if (data.length < {{{minItems}}}) { - throw new Error("Invalid array size. Minimim: {{minItems}}. Data: " + data); - } - {{/maxItems}} - {{/minItems}} - {{^minItems}} - {{#maxItems}} - if (data.length > {{{maxItems}}}) { - throw new Error("Invalid array size. Maximum: {{maxItems}}. Data: " + data); - } - {{/maxItems}} - {{/minItems}} - {{#items.isInteger}} - // validate array of integer - for (const item of data) { - if (!(typeof item === 'number' && item % 1 === 0)) { - throw new Error("Invalid array items. Must be integer. Data: " + data); - } - {{#items.maximum}} - {{#items.minimum}} - if (item > {{items.maximum}} || item < {{items.minimum}}) { - throw new Error("Invalid integer value in an array items. Max.: {{items.maximum}}. Min.: {{items.minimum}}. Data: " + data); - } - {{/items.minimum}} - {{^items.minimum}} - if (item > {{items.maximum}}) { - throw new Error("Invalid integer value in an array items. Max.: {{items.maximum}}. Data: " + data); - } - {{/items.minimum}} - {{/items.maximum}} - {{^items.maximum}} - {{#items.minimum}} - if (item < {{items.minimum}}) { - throw new Error("Invalid integer value in an array items. Min.: {{items.minimum}}. Data: " + data); - } - {{/items.minimum}} - {{/items.maximum}} - } - {{/items.isInteger}} - {{#items.isString}} - // validate array of string - for (const item of data) { - if (!(typeof item === 'number' && item % 1 === 0)) { - throw new Error("Invalid array items. Must be string. Data: " + data); - } - {{#items.pattern}} - if (!{{{items.pattern}}}.test(item)) { - throw new Error("Invalid string value in an array items. Must conform to {{{items.pattern}}}. Data: " + item); - } - {{/items.pattern}} - {{#items.minLength}} - {{#items.maxLength}} - if (item.length > {{items.maxLength}} && item.length < {{items.minLength}}) { - throw new Error("Invalid string value in an array items. Max. length: {{{items.maxLength}}}. Min. length: {{{items.minLength}}}. Data: " + item); - } - {{/items.maxLength}} - {{^items.maxLength}} - if (item.length < {{items.minLength}}) { - throw new Error("Invalid string value in an array items. Min. length: {{{items.minLength}}}. Data: " + item); - } - {{/items.maxLength}} - {{/items.minLength}} - {{^items.minLength}} - {{#items.maxLength}} - if (item.length > {{items.maxLength}}) { - throw new Error("Invalid string value in an array items. Max. length: {{{items.maxLength}}}. Data: " + item) - } - {{/items.maxLength}} - {{/items.minLength}} - } - {{/items.isString}} - {{#items.isNumber}} - // validate array of string - for (const item of data) { - if (!(typeof data === 'number' && data % 1 != 0)) { - throw new Error("Invalid array items. Must be number. Data: " + JSON.stringify(data)); - } - } - {{/items.isNumber}} - {{/isArray}} - {{^isArray}} - {{#isInteger}} - // validate array of integer - if (!(typeof data === 'number' && data % 1 === 0)) { - throw new Error("Invalid array items. Must be integer. Data: " + JSON.stringify(data)); - } - {{#maximum}} - {{#minimum}} - if (data > {{maximum}} || data < {{minimum}}) { - throw new Error("Invalid integer value in an array items. Max.: {{maximum}}. Min.: {{minimum}}. Data: " + JSON.stringify(data)); - } - {{/minimum}} - {{^minimum}} - if (data > {{maximum}}) { - throw new Error("Invalid integer value in an array items. Max.: {{maximum}}. Data: " + JSON.stringify(data)); - } - {{/minimum}} - {{/maximum}} - {{^maximum}} - {{#minimum}} - if (data < {{minimum}}) { - throw new Error("Invalid integer value in an array items. Min.: {{minimum}}. Data: " + JSON.stringify(data)); - } - {{/minimum}} - {{/maximum}} - {{/isInteger}} - {{#isString}} - // validate array of string - if (!(typeof data === 'string')) { - throw new Error("Invalid data. Must be string. Data: " + JSON.stringify(data)); - } - {{#pattern}} - if (!{{{pattern}}}.test(data)) { - throw new Error("Invalid string value in an array items. Must conform to {{{.}}}. Data: " + JSON.stringify(data)); - } - {{/pattern}} - {{#minLength}} - {{#maxLength}} - if (data.length > {{maxLength}} && data.length < {{minLength}}) { - throw new Error("Invalid string value in an array items. Max. length: {{{maxLength}}}. Min. length: {{{minLength}}}. Data: " + JSON.stringify(data)); - } - {{/maxLength}} - {{^maxLength}} - if (data.length < {{minLength}}) { - throw new Error("Invalid string value in an array items. Min. length: {{{minLength}}}. Data: " + data); - } - {{/maxLength}} - {{/minLength}} - {{^minLength}} - {{#maxLength}} - if (data.length > {{maxLength}}) { - throw new Error("Invalid string value in an array items. Max. length: {{{maxLength}}}. Data: " + JSON.stringify(data)); - } - {{/maxLength}} - {{/minLength}} - {{/isString}} - {{#isNumber}} - // validate array of string - if (!(typeof data === 'number' && data % 1 != 0)) { - throw new Error("Invalid array items. Must be number. Data: " + JSON.stringify(data)); - } - {{/isNumber}} - {{/isArray}} - obj = new {{classname}}(data); - {{/isPrimitiveType}} - {{^isPrimitiveType}} - // validate the JSON data - {{{dataType}}}.validateJSON(data); - // create {{{dataType}}} from JSON data - obj = new {{classname}}({{{dataType}}}.constructFromObject(data)); - {{/isPrimitiveType}} - match++; - } catch(err) { - // json data failed to deserialize into {{{dataType}}} - errorMessages.push("Failed to construct {{{dataType}}}: " + err) - } - - {{/composedSchemas.oneOf}} - if (match > 1) { - throw new Error("Multiple matches found constructing `{{{classname}}}` with oneOf schemas {{#oneOf}}{{{.}}}{{^-last}}, {{/-last}}{{/oneOf}}. JSON data: " + JSON.stringify(data)); - } else if (match === 0) { - throw new Error("No match found constructing `{{{classname}}}` with oneOf schemas {{#oneOf}}{{{.}}}{{^-last}}, {{/-last}}{{/oneOf}}. Details: " + - errorMessages.join(", ")); - } else { // only 1 match - return obj; - } + return new {{classname}}(data); } {{#emitJSDoc}} diff --git a/samples/client/petstore/javascript-apollo/src/model/Color.js b/samples/client/petstore/javascript-apollo/src/model/Color.js index a8bfc635973..b071fff068a 100644 --- a/samples/client/petstore/javascript-apollo/src/model/Color.js +++ b/samples/client/petstore/javascript-apollo/src/model/Color.js @@ -23,10 +23,93 @@ class Color { * Constructs a new Color. * RGB array, RGBA array, or hex string. * @alias module:model/Color - * @param {(module:model/String|module:model/[Number])} The actual instance to initialize Color. + * @param {(module:model/String|module:model/[Number])} instance The actual instance to initialize Color. */ - constructor(obj = null) { - this.actualInstance = obj; + constructor(instance = null) { + if (instance === null) { + this.actualInstance = null; + return; + } + var match = 0; + var errorMessages = []; + // RGB three element array with values 0-255. + try { + // validate array data type + if (!Array.isArray(instance)) { + throw new Error("Invalid data type. Expecting array. Input: " + instance); + } + if (instance.length > 3 || instance.length < 3) { + throw new Error("Invalid array size. Minimim: 3. Maximum: 3. Input: " + instance); + } + // validate array of integer + for (const item of instance) { + if (!(typeof item === 'number' && item % 1 === 0)) { + throw new Error("Invalid array items. Must be integer. Input: " + instance); + } + if (item > 255 || item < 0) { + throw new Error("Invalid integer value in an array items. Max.: 255. Min.: 0. Input: " + instance); + } + } + this.actualInstance = instance; + match++; + } catch(err) { + // json data failed to deserialize into [Number] + errorMessages.push("Failed to construct [Number]: " + err) + } + + // RGBA four element array with values 0-255. + try { + // validate array data type + if (!Array.isArray(instance)) { + throw new Error("Invalid data type. Expecting array. Input: " + instance); + } + if (instance.length > 4 || instance.length < 4) { + throw new Error("Invalid array size. Minimim: 4. Maximum: 4. Input: " + instance); + } + // validate array of integer + for (const item of instance) { + if (!(typeof item === 'number' && item % 1 === 0)) { + throw new Error("Invalid array items. Must be integer. Input: " + instance); + } + if (item > 255 || item < 0) { + throw new Error("Invalid integer value in an array items. Max.: 255. Min.: 0. Input: " + instance); + } + } + this.actualInstance = instance; + match++; + } catch(err) { + // json data failed to deserialize into [Number] + errorMessages.push("Failed to construct [Number]: " + err) + } + + // Hex color string, such as #00FF00. + try { + // validate array of string + if (!(typeof instance === 'string')) { + throw new Error("Invalid input. Must be string. Input: " + JSON.stringify(instance)); + } + if (!/^#(?:[0-9a-fA-F]{3}){1,2}$/.test(instance)) { + throw new Error("Invalid string value in an array items. Must conform to /^#(?:[0-9a-fA-F]{3}){1,2}$/. Input: " + JSON.stringify(instance)); + } + if (instance.length > 7 && instance.length < 7) { + throw new Error("Invalid string value in an array items. Max. length: 7. Min. length: 7. Input: " + JSON.stringify(instance)); + } + this.actualInstance = instance; + match++; + } catch(err) { + // json data failed to deserialize into String + errorMessages.push("Failed to construct String: " + err) + } + + if (match > 1) { + throw new Error("Multiple matches found constructing `Color` with oneOf schemas String, [Number]. Input: " + JSON.stringify(instance)); + } else if (match === 0) { + this.actualInstance = null; // clear the actual instance in case there are multiple matches + throw new Error("No match found constructing `Color` with oneOf schemas String, [Number]. Details: " + + errorMessages.join(", ")); + } else { // only 1 match + // the input is valid + } } /** @@ -37,88 +120,7 @@ class Color { * @return {module:model/Color} The populated Color instance. */ static constructFromObject(data, obj) { - if (!data) { - return new Color(); - } - var match = 0; - var errorMessages = []; - // RGB three element array with values 0-255. - try { - // validate array data type - if (!Array.isArray(data)) { - throw new Error("Invalid data type. Expecting array. Data: " + data); - } - if (data.length > 3 || data.length < 3) { - throw new Error("Invalid array size. Minimim: 3. Maximum: 3. Data: " + data); - } - // validate array of integer - for (const item of data) { - if (!(typeof item === 'number' && item % 1 === 0)) { - throw new Error("Invalid array items. Must be integer. Data: " + data); - } - if (item > 255 || item < 0) { - throw new Error("Invalid integer value in an array items. Max.: 255. Min.: 0. Data: " + data); - } - } - obj = new Color(data); - match++; - } catch(err) { - // json data failed to deserialize into [Number] - errorMessages.push("Failed to construct [Number]: " + err) - } - - // RGBA four element array with values 0-255. - try { - // validate array data type - if (!Array.isArray(data)) { - throw new Error("Invalid data type. Expecting array. Data: " + data); - } - if (data.length > 4 || data.length < 4) { - throw new Error("Invalid array size. Minimim: 4. Maximum: 4. Data: " + data); - } - // validate array of integer - for (const item of data) { - if (!(typeof item === 'number' && item % 1 === 0)) { - throw new Error("Invalid array items. Must be integer. Data: " + data); - } - if (item > 255 || item < 0) { - throw new Error("Invalid integer value in an array items. Max.: 255. Min.: 0. Data: " + data); - } - } - obj = new Color(data); - match++; - } catch(err) { - // json data failed to deserialize into [Number] - errorMessages.push("Failed to construct [Number]: " + err) - } - - // Hex color string, such as #00FF00. - try { - // validate array of string - if (!(typeof data === 'string')) { - throw new Error("Invalid data. Must be string. Data: " + JSON.stringify(data)); - } - if (!/^#(?:[0-9a-fA-F]{3}){1,2}$/.test(data)) { - throw new Error("Invalid string value in an array items. Must conform to /^#(?:[0-9a-fA-F]{3}){1,2}$/. Data: " + JSON.stringify(data)); - } - if (data.length > 7 && data.length < 7) { - throw new Error("Invalid string value in an array items. Max. length: 7. Min. length: 7. Data: " + JSON.stringify(data)); - } - obj = new Color(data); - match++; - } catch(err) { - // json data failed to deserialize into String - errorMessages.push("Failed to construct String: " + err) - } - - if (match > 1) { - throw new Error("Multiple matches found constructing `Color` with oneOf schemas String, [Number]. JSON data: " + JSON.stringify(data)); - } else if (match === 0) { - throw new Error("No match found constructing `Color` with oneOf schemas String, [Number]. Details: " + - errorMessages.join(", ")); - } else { // only 1 match - return obj; - } + return new Color(data); } /** diff --git a/samples/client/petstore/javascript-apollo/src/model/Pig.js b/samples/client/petstore/javascript-apollo/src/model/Pig.js index ac867a3525e..da6cdc07656 100644 --- a/samples/client/petstore/javascript-apollo/src/model/Pig.js +++ b/samples/client/petstore/javascript-apollo/src/model/Pig.js @@ -24,10 +24,56 @@ class Pig { /** * Constructs a new Pig. * @alias module:model/Pig - * @param {(module:model/BasquePig|module:model/DanishPig)} The actual instance to initialize Pig. + * @param {(module:model/BasquePig|module:model/DanishPig)} instance The actual instance to initialize Pig. */ - constructor(obj = null) { - this.actualInstance = obj; + constructor(instance = null) { + if (instance === null) { + this.actualInstance = null; + return; + } + var match = 0; + var errorMessages = []; + try { + if (typeof instance === "BasquePig") { + this.actualInstance = instance; + } else { + // plain JS object + // validate the object + BasquePig.validateJSON(instance); // throw an exception if no match + // create BasquePig from JS object + this.actualInstance = BasquePig.constructFromObject(instance); + } + match++; + } catch(err) { + // json data failed to deserialize into BasquePig + errorMessages.push("Failed to construct BasquePig: " + err) + } + + try { + if (typeof instance === "DanishPig") { + this.actualInstance = instance; + } else { + // plain JS object + // validate the object + DanishPig.validateJSON(instance); // throw an exception if no match + // create DanishPig from JS object + this.actualInstance = DanishPig.constructFromObject(instance); + } + match++; + } catch(err) { + // json data failed to deserialize into DanishPig + errorMessages.push("Failed to construct DanishPig: " + err) + } + + if (match > 1) { + throw new Error("Multiple matches found constructing `Pig` with oneOf schemas BasquePig, DanishPig. Input: " + JSON.stringify(instance)); + } else if (match === 0) { + this.actualInstance = null; // clear the actual instance in case there are multiple matches + throw new Error("No match found constructing `Pig` with oneOf schemas BasquePig, DanishPig. Details: " + + errorMessages.join(", ")); + } else { // only 1 match + // the input is valid + } } /** @@ -38,41 +84,7 @@ class Pig { * @return {module:model/Pig} The populated Pig instance. */ static constructFromObject(data, obj) { - if (!data) { - return new Pig(); - } - var match = 0; - var errorMessages = []; - try { - // validate the JSON data - BasquePig.validateJSON(data); - // create BasquePig from JSON data - obj = new Pig(BasquePig.constructFromObject(data)); - match++; - } catch(err) { - // json data failed to deserialize into BasquePig - errorMessages.push("Failed to construct BasquePig: " + err) - } - - try { - // validate the JSON data - DanishPig.validateJSON(data); - // create DanishPig from JSON data - obj = new Pig(DanishPig.constructFromObject(data)); - match++; - } catch(err) { - // json data failed to deserialize into DanishPig - errorMessages.push("Failed to construct DanishPig: " + err) - } - - if (match > 1) { - throw new Error("Multiple matches found constructing `Pig` with oneOf schemas BasquePig, DanishPig. JSON data: " + JSON.stringify(data)); - } else if (match === 0) { - throw new Error("No match found constructing `Pig` with oneOf schemas BasquePig, DanishPig. Details: " + - errorMessages.join(", ")); - } else { // only 1 match - return obj; - } + return new Pig(data); } /** diff --git a/samples/client/petstore/javascript-es6/src/model/Color.js b/samples/client/petstore/javascript-es6/src/model/Color.js index a8bfc635973..b071fff068a 100644 --- a/samples/client/petstore/javascript-es6/src/model/Color.js +++ b/samples/client/petstore/javascript-es6/src/model/Color.js @@ -23,10 +23,93 @@ class Color { * Constructs a new Color. * RGB array, RGBA array, or hex string. * @alias module:model/Color - * @param {(module:model/String|module:model/[Number])} The actual instance to initialize Color. + * @param {(module:model/String|module:model/[Number])} instance The actual instance to initialize Color. */ - constructor(obj = null) { - this.actualInstance = obj; + constructor(instance = null) { + if (instance === null) { + this.actualInstance = null; + return; + } + var match = 0; + var errorMessages = []; + // RGB three element array with values 0-255. + try { + // validate array data type + if (!Array.isArray(instance)) { + throw new Error("Invalid data type. Expecting array. Input: " + instance); + } + if (instance.length > 3 || instance.length < 3) { + throw new Error("Invalid array size. Minimim: 3. Maximum: 3. Input: " + instance); + } + // validate array of integer + for (const item of instance) { + if (!(typeof item === 'number' && item % 1 === 0)) { + throw new Error("Invalid array items. Must be integer. Input: " + instance); + } + if (item > 255 || item < 0) { + throw new Error("Invalid integer value in an array items. Max.: 255. Min.: 0. Input: " + instance); + } + } + this.actualInstance = instance; + match++; + } catch(err) { + // json data failed to deserialize into [Number] + errorMessages.push("Failed to construct [Number]: " + err) + } + + // RGBA four element array with values 0-255. + try { + // validate array data type + if (!Array.isArray(instance)) { + throw new Error("Invalid data type. Expecting array. Input: " + instance); + } + if (instance.length > 4 || instance.length < 4) { + throw new Error("Invalid array size. Minimim: 4. Maximum: 4. Input: " + instance); + } + // validate array of integer + for (const item of instance) { + if (!(typeof item === 'number' && item % 1 === 0)) { + throw new Error("Invalid array items. Must be integer. Input: " + instance); + } + if (item > 255 || item < 0) { + throw new Error("Invalid integer value in an array items. Max.: 255. Min.: 0. Input: " + instance); + } + } + this.actualInstance = instance; + match++; + } catch(err) { + // json data failed to deserialize into [Number] + errorMessages.push("Failed to construct [Number]: " + err) + } + + // Hex color string, such as #00FF00. + try { + // validate array of string + if (!(typeof instance === 'string')) { + throw new Error("Invalid input. Must be string. Input: " + JSON.stringify(instance)); + } + if (!/^#(?:[0-9a-fA-F]{3}){1,2}$/.test(instance)) { + throw new Error("Invalid string value in an array items. Must conform to /^#(?:[0-9a-fA-F]{3}){1,2}$/. Input: " + JSON.stringify(instance)); + } + if (instance.length > 7 && instance.length < 7) { + throw new Error("Invalid string value in an array items. Max. length: 7. Min. length: 7. Input: " + JSON.stringify(instance)); + } + this.actualInstance = instance; + match++; + } catch(err) { + // json data failed to deserialize into String + errorMessages.push("Failed to construct String: " + err) + } + + if (match > 1) { + throw new Error("Multiple matches found constructing `Color` with oneOf schemas String, [Number]. Input: " + JSON.stringify(instance)); + } else if (match === 0) { + this.actualInstance = null; // clear the actual instance in case there are multiple matches + throw new Error("No match found constructing `Color` with oneOf schemas String, [Number]. Details: " + + errorMessages.join(", ")); + } else { // only 1 match + // the input is valid + } } /** @@ -37,88 +120,7 @@ class Color { * @return {module:model/Color} The populated Color instance. */ static constructFromObject(data, obj) { - if (!data) { - return new Color(); - } - var match = 0; - var errorMessages = []; - // RGB three element array with values 0-255. - try { - // validate array data type - if (!Array.isArray(data)) { - throw new Error("Invalid data type. Expecting array. Data: " + data); - } - if (data.length > 3 || data.length < 3) { - throw new Error("Invalid array size. Minimim: 3. Maximum: 3. Data: " + data); - } - // validate array of integer - for (const item of data) { - if (!(typeof item === 'number' && item % 1 === 0)) { - throw new Error("Invalid array items. Must be integer. Data: " + data); - } - if (item > 255 || item < 0) { - throw new Error("Invalid integer value in an array items. Max.: 255. Min.: 0. Data: " + data); - } - } - obj = new Color(data); - match++; - } catch(err) { - // json data failed to deserialize into [Number] - errorMessages.push("Failed to construct [Number]: " + err) - } - - // RGBA four element array with values 0-255. - try { - // validate array data type - if (!Array.isArray(data)) { - throw new Error("Invalid data type. Expecting array. Data: " + data); - } - if (data.length > 4 || data.length < 4) { - throw new Error("Invalid array size. Minimim: 4. Maximum: 4. Data: " + data); - } - // validate array of integer - for (const item of data) { - if (!(typeof item === 'number' && item % 1 === 0)) { - throw new Error("Invalid array items. Must be integer. Data: " + data); - } - if (item > 255 || item < 0) { - throw new Error("Invalid integer value in an array items. Max.: 255. Min.: 0. Data: " + data); - } - } - obj = new Color(data); - match++; - } catch(err) { - // json data failed to deserialize into [Number] - errorMessages.push("Failed to construct [Number]: " + err) - } - - // Hex color string, such as #00FF00. - try { - // validate array of string - if (!(typeof data === 'string')) { - throw new Error("Invalid data. Must be string. Data: " + JSON.stringify(data)); - } - if (!/^#(?:[0-9a-fA-F]{3}){1,2}$/.test(data)) { - throw new Error("Invalid string value in an array items. Must conform to /^#(?:[0-9a-fA-F]{3}){1,2}$/. Data: " + JSON.stringify(data)); - } - if (data.length > 7 && data.length < 7) { - throw new Error("Invalid string value in an array items. Max. length: 7. Min. length: 7. Data: " + JSON.stringify(data)); - } - obj = new Color(data); - match++; - } catch(err) { - // json data failed to deserialize into String - errorMessages.push("Failed to construct String: " + err) - } - - if (match > 1) { - throw new Error("Multiple matches found constructing `Color` with oneOf schemas String, [Number]. JSON data: " + JSON.stringify(data)); - } else if (match === 0) { - throw new Error("No match found constructing `Color` with oneOf schemas String, [Number]. Details: " + - errorMessages.join(", ")); - } else { // only 1 match - return obj; - } + return new Color(data); } /** diff --git a/samples/client/petstore/javascript-es6/src/model/Pig.js b/samples/client/petstore/javascript-es6/src/model/Pig.js index ac867a3525e..da6cdc07656 100644 --- a/samples/client/petstore/javascript-es6/src/model/Pig.js +++ b/samples/client/petstore/javascript-es6/src/model/Pig.js @@ -24,10 +24,56 @@ class Pig { /** * Constructs a new Pig. * @alias module:model/Pig - * @param {(module:model/BasquePig|module:model/DanishPig)} The actual instance to initialize Pig. + * @param {(module:model/BasquePig|module:model/DanishPig)} instance The actual instance to initialize Pig. */ - constructor(obj = null) { - this.actualInstance = obj; + constructor(instance = null) { + if (instance === null) { + this.actualInstance = null; + return; + } + var match = 0; + var errorMessages = []; + try { + if (typeof instance === "BasquePig") { + this.actualInstance = instance; + } else { + // plain JS object + // validate the object + BasquePig.validateJSON(instance); // throw an exception if no match + // create BasquePig from JS object + this.actualInstance = BasquePig.constructFromObject(instance); + } + match++; + } catch(err) { + // json data failed to deserialize into BasquePig + errorMessages.push("Failed to construct BasquePig: " + err) + } + + try { + if (typeof instance === "DanishPig") { + this.actualInstance = instance; + } else { + // plain JS object + // validate the object + DanishPig.validateJSON(instance); // throw an exception if no match + // create DanishPig from JS object + this.actualInstance = DanishPig.constructFromObject(instance); + } + match++; + } catch(err) { + // json data failed to deserialize into DanishPig + errorMessages.push("Failed to construct DanishPig: " + err) + } + + if (match > 1) { + throw new Error("Multiple matches found constructing `Pig` with oneOf schemas BasquePig, DanishPig. Input: " + JSON.stringify(instance)); + } else if (match === 0) { + this.actualInstance = null; // clear the actual instance in case there are multiple matches + throw new Error("No match found constructing `Pig` with oneOf schemas BasquePig, DanishPig. Details: " + + errorMessages.join(", ")); + } else { // only 1 match + // the input is valid + } } /** @@ -38,41 +84,7 @@ class Pig { * @return {module:model/Pig} The populated Pig instance. */ static constructFromObject(data, obj) { - if (!data) { - return new Pig(); - } - var match = 0; - var errorMessages = []; - try { - // validate the JSON data - BasquePig.validateJSON(data); - // create BasquePig from JSON data - obj = new Pig(BasquePig.constructFromObject(data)); - match++; - } catch(err) { - // json data failed to deserialize into BasquePig - errorMessages.push("Failed to construct BasquePig: " + err) - } - - try { - // validate the JSON data - DanishPig.validateJSON(data); - // create DanishPig from JSON data - obj = new Pig(DanishPig.constructFromObject(data)); - match++; - } catch(err) { - // json data failed to deserialize into DanishPig - errorMessages.push("Failed to construct DanishPig: " + err) - } - - if (match > 1) { - throw new Error("Multiple matches found constructing `Pig` with oneOf schemas BasquePig, DanishPig. JSON data: " + JSON.stringify(data)); - } else if (match === 0) { - throw new Error("No match found constructing `Pig` with oneOf schemas BasquePig, DanishPig. Details: " + - errorMessages.join(", ")); - } else { // only 1 match - return obj; - } + return new Pig(data); } /** diff --git a/samples/client/petstore/javascript-es6/test/PetstoreTest.js b/samples/client/petstore/javascript-es6/test/PetstoreTest.js index 56c8993781a..dfa424b5aec 100644 --- a/samples/client/petstore/javascript-es6/test/PetstoreTest.js +++ b/samples/client/petstore/javascript-es6/test/PetstoreTest.js @@ -74,6 +74,12 @@ describe('Petstore', function() { } }); + it('should run Pig new correctly', function() { + var bpig = OpenAPIPetstore.BasquePig.constructFromObject(JSON.parse('{"className":"BasquePig","color":"red"}')); + var pig = new OpenAPIPetstore.Pig(bpig); + expect(JSON.stringify(pig)).to.be('{"className":"BasquePig","color":"red"}'); + }); + it('should run Pig constructFromObject correctly', function() { var bpig = '{"className":"BasquePig","color":"red"}'; var pig = OpenAPIPetstore.Pig.constructFromObject(JSON.parse(bpig)); @@ -96,14 +102,6 @@ describe('Petstore', function() { //expect(tag_result.id).to.be(1); //expect(JSON.stringify(tag_result)).to.be(tag_json); }); - - it('should deserialize nested oneOf models correctly', function() { - var nested_one_of_json = '{"size":28,"nested_pig":{"className":"BasquePig","color":"red"}}' - var result = OpenAPIPetstore.ApiClient.convertToType(JSON.parse(nested_one_of_json), OpenAPIPetstore.NestedOneOf); - expect(result).to.be.a(OpenAPIPetstore.NestedOneOf); - expect(JSON.stringify(result)).to.be(nested_one_of_json); - }); - it('should run Color constructFromObject correctly from array', function() { // construct from RgbColor let array_integer = [0,128,255]; @@ -123,6 +121,23 @@ describe('Petstore', function() { } }); + it('should run Color new correctly', function() { + // valid hex color + var input = "#00FF00"; + var color = new OpenAPIPetstore.Color(input); + expect(color.getActualInstance()).to.be(input); + + // valid RgbColor + input = [0,128,255]; + color = new OpenAPIPetstore.Color(input); + expect(color.getActualInstance()).to.be(input); + + // valid RgbaColor + input = [0,128,200,255]; + color = new OpenAPIPetstore.Color(input); + expect(color.getActualInstance()).to.be(input); + }); + it('should run Color constructFromObject correctly', function() { // valid hex color var json = '"#00FF00"'; @@ -140,6 +155,54 @@ describe('Petstore', function() { expect(JSON.stringify(color)).to.be(json); }); + it('should thrown an error when running Color new with invalid data', function() { + // invalid hex color + try { + let input = "#00FF00ZZZZ"; + new OpenAPIPetstore.Color(input); + expect(true).to.be(false); // this line should not run if the error is thrown correctly + } catch (err) { + expect(err).to.be.eql(new Error('No match found constructing Color with oneOf schemas String, [Number]. Details: Failed to desserialize JSON data into [Number]: Error: Invalid data type. Expecting array. Data: #00FF00ZZZZ, Failed to desserialize JSON data into [Number]: Error: Invalid data type. Expecting array. Data: #00FF00ZZZZ, Failed to desserialize JSON data into String: Error: Invalid string value in an array items. Must conform to /^#(?:[0-9a-fA-F]{3}){1,2}$/. Data: "#00FF00ZZZZ"')); + } + + // invalid RgbColor <0 + try { + let input = [-1,128,255]; + new OpenAPIPetstore.Color(input); + expect(true).to.be(false); // this line should not run if the error is thrown correctly + } catch (err) { + expect(err).to.be.eql(new Error('No match found constructing Color with oneOf schemas String, [Number]. Details: Failed to desserialize JSON data into [Number]: Error: Invalid integer value in an array items. Max.: 255. Min.: 0. Data: -1,128,255, Failed to desserialize JSON data into [Number]: Error: Invalid array size. Minimim: 4. Maximum: 4. Data: -1,128,255, Failed to desserialize JSON data into String: Error: Invalid data. Must be string. Data: [-1,128,255]')); + } + + // invalid RgbColor >255 + try { + let input = [1,128,256]; + new OpenAPIPetstore.Color(input); + expect(true).to.be(false); // this line should not run if the error is thrown correctly + } catch (err) { + expect(err).to.be.eql(new Error('No match found constructing Color with oneOf schemas String, [Number]. Details: Failed to desserialize JSON data into [Number]: Error: Invalid integer value in an array items. Max.: 255. Min.: 0. Data: 1,128,256, Failed to desserialize JSON data into [Number]: Error: Invalid array size. Minimim: 4. Maximum: 4. Data: 1,128,256, Failed to desserialize JSON data into String: Error: Invalid data. Must be string. Data: [1,128,256]')); + } + + // invalid RgbaColor <0 + try { + let input = [-1,1,128,255]; + new OpenAPIPetstore.Color(input); + expect(true).to.be(false); // this line should not run if the error is thrown correctly + } catch (err) { + expect(err).to.be.eql(new Error('No match found constructing Color with oneOf schemas String, [Number]. Details: Failed to desserialize JSON data into [Number]: Error: Invalid array size. Minimim: 3. Maximum: 3. Data: -1,1,128,255, Failed to desserialize JSON data into [Number]: Error: Invalid integer value in an array items. Max.: 255. Min.: 0. Data: -1,1,128,255, Failed to desserialize JSON data into String: Error: Invalid data. Must be string. Data: [-1,1,128,255]')); + } + + // invalid RgbaColor >255 + try { + let input = [1,11,128,256]; + new OpenAPIPetstore.Color(input); + expect(true).to.be(false); // this line should not run if the error is thrown correctly + } catch (err) { + expect(err).to.be.eql(new Error('[Error: No match found constructing Color with oneOf schemas String, [Number]. Details: Failed to desserialize JSON data into [Number]: Error: Invalid array size. Minimim: 3. Maximum: 3. Data: 1,11,128,256, Failed to desserialize JSON data into [Number]: Error: Invalid integer value in an array items. Max.: 255. Min.: 0. Data: 1,11,128,256, Failed to desserialize JSON data into String: Error: Invalid data. Must be string. Data: [1,11,128,256]')); + } + }); + + it('should thrown an error when running Color constructFromObject with invalid data', function() { // invalid hex color try { @@ -203,13 +266,20 @@ describe('Petstore', function() { expect(JSON.stringify(color)).to.be(json); }); - it('should deserialize nested oneOf models correctly', function() { + it('should deserialize NestedColor with nested oneOf model color correctly', function() { var json = '{"nested":"#00FF00","size":256}' var result = OpenAPIPetstore.ApiClient.convertToType(JSON.parse(json), OpenAPIPetstore.NestedColor); expect(result).to.be.a(OpenAPIPetstore.NestedColor); expect(JSON.stringify(result)).to.be('{"size":256,"nested":"#00FF00"}'); }); + it('should deserialize NestedOneOf with nested oneOf model correctly', function() { + var nested_one_of_json = '{"size":28,"nested_pig":{"className":"BasquePig","color":"red"}}' + var result = OpenAPIPetstore.ApiClient.convertToType(JSON.parse(nested_one_of_json), OpenAPIPetstore.NestedOneOf); + expect(result).to.be.a(OpenAPIPetstore.NestedOneOf); + expect(JSON.stringify(result)).to.be(nested_one_of_json); + }); + }); }); diff --git a/samples/client/petstore/javascript-promise-es6/src/model/Color.js b/samples/client/petstore/javascript-promise-es6/src/model/Color.js index a8bfc635973..b071fff068a 100644 --- a/samples/client/petstore/javascript-promise-es6/src/model/Color.js +++ b/samples/client/petstore/javascript-promise-es6/src/model/Color.js @@ -23,10 +23,93 @@ class Color { * Constructs a new Color. * RGB array, RGBA array, or hex string. * @alias module:model/Color - * @param {(module:model/String|module:model/[Number])} The actual instance to initialize Color. + * @param {(module:model/String|module:model/[Number])} instance The actual instance to initialize Color. */ - constructor(obj = null) { - this.actualInstance = obj; + constructor(instance = null) { + if (instance === null) { + this.actualInstance = null; + return; + } + var match = 0; + var errorMessages = []; + // RGB three element array with values 0-255. + try { + // validate array data type + if (!Array.isArray(instance)) { + throw new Error("Invalid data type. Expecting array. Input: " + instance); + } + if (instance.length > 3 || instance.length < 3) { + throw new Error("Invalid array size. Minimim: 3. Maximum: 3. Input: " + instance); + } + // validate array of integer + for (const item of instance) { + if (!(typeof item === 'number' && item % 1 === 0)) { + throw new Error("Invalid array items. Must be integer. Input: " + instance); + } + if (item > 255 || item < 0) { + throw new Error("Invalid integer value in an array items. Max.: 255. Min.: 0. Input: " + instance); + } + } + this.actualInstance = instance; + match++; + } catch(err) { + // json data failed to deserialize into [Number] + errorMessages.push("Failed to construct [Number]: " + err) + } + + // RGBA four element array with values 0-255. + try { + // validate array data type + if (!Array.isArray(instance)) { + throw new Error("Invalid data type. Expecting array. Input: " + instance); + } + if (instance.length > 4 || instance.length < 4) { + throw new Error("Invalid array size. Minimim: 4. Maximum: 4. Input: " + instance); + } + // validate array of integer + for (const item of instance) { + if (!(typeof item === 'number' && item % 1 === 0)) { + throw new Error("Invalid array items. Must be integer. Input: " + instance); + } + if (item > 255 || item < 0) { + throw new Error("Invalid integer value in an array items. Max.: 255. Min.: 0. Input: " + instance); + } + } + this.actualInstance = instance; + match++; + } catch(err) { + // json data failed to deserialize into [Number] + errorMessages.push("Failed to construct [Number]: " + err) + } + + // Hex color string, such as #00FF00. + try { + // validate array of string + if (!(typeof instance === 'string')) { + throw new Error("Invalid input. Must be string. Input: " + JSON.stringify(instance)); + } + if (!/^#(?:[0-9a-fA-F]{3}){1,2}$/.test(instance)) { + throw new Error("Invalid string value in an array items. Must conform to /^#(?:[0-9a-fA-F]{3}){1,2}$/. Input: " + JSON.stringify(instance)); + } + if (instance.length > 7 && instance.length < 7) { + throw new Error("Invalid string value in an array items. Max. length: 7. Min. length: 7. Input: " + JSON.stringify(instance)); + } + this.actualInstance = instance; + match++; + } catch(err) { + // json data failed to deserialize into String + errorMessages.push("Failed to construct String: " + err) + } + + if (match > 1) { + throw new Error("Multiple matches found constructing `Color` with oneOf schemas String, [Number]. Input: " + JSON.stringify(instance)); + } else if (match === 0) { + this.actualInstance = null; // clear the actual instance in case there are multiple matches + throw new Error("No match found constructing `Color` with oneOf schemas String, [Number]. Details: " + + errorMessages.join(", ")); + } else { // only 1 match + // the input is valid + } } /** @@ -37,88 +120,7 @@ class Color { * @return {module:model/Color} The populated Color instance. */ static constructFromObject(data, obj) { - if (!data) { - return new Color(); - } - var match = 0; - var errorMessages = []; - // RGB three element array with values 0-255. - try { - // validate array data type - if (!Array.isArray(data)) { - throw new Error("Invalid data type. Expecting array. Data: " + data); - } - if (data.length > 3 || data.length < 3) { - throw new Error("Invalid array size. Minimim: 3. Maximum: 3. Data: " + data); - } - // validate array of integer - for (const item of data) { - if (!(typeof item === 'number' && item % 1 === 0)) { - throw new Error("Invalid array items. Must be integer. Data: " + data); - } - if (item > 255 || item < 0) { - throw new Error("Invalid integer value in an array items. Max.: 255. Min.: 0. Data: " + data); - } - } - obj = new Color(data); - match++; - } catch(err) { - // json data failed to deserialize into [Number] - errorMessages.push("Failed to construct [Number]: " + err) - } - - // RGBA four element array with values 0-255. - try { - // validate array data type - if (!Array.isArray(data)) { - throw new Error("Invalid data type. Expecting array. Data: " + data); - } - if (data.length > 4 || data.length < 4) { - throw new Error("Invalid array size. Minimim: 4. Maximum: 4. Data: " + data); - } - // validate array of integer - for (const item of data) { - if (!(typeof item === 'number' && item % 1 === 0)) { - throw new Error("Invalid array items. Must be integer. Data: " + data); - } - if (item > 255 || item < 0) { - throw new Error("Invalid integer value in an array items. Max.: 255. Min.: 0. Data: " + data); - } - } - obj = new Color(data); - match++; - } catch(err) { - // json data failed to deserialize into [Number] - errorMessages.push("Failed to construct [Number]: " + err) - } - - // Hex color string, such as #00FF00. - try { - // validate array of string - if (!(typeof data === 'string')) { - throw new Error("Invalid data. Must be string. Data: " + JSON.stringify(data)); - } - if (!/^#(?:[0-9a-fA-F]{3}){1,2}$/.test(data)) { - throw new Error("Invalid string value in an array items. Must conform to /^#(?:[0-9a-fA-F]{3}){1,2}$/. Data: " + JSON.stringify(data)); - } - if (data.length > 7 && data.length < 7) { - throw new Error("Invalid string value in an array items. Max. length: 7. Min. length: 7. Data: " + JSON.stringify(data)); - } - obj = new Color(data); - match++; - } catch(err) { - // json data failed to deserialize into String - errorMessages.push("Failed to construct String: " + err) - } - - if (match > 1) { - throw new Error("Multiple matches found constructing `Color` with oneOf schemas String, [Number]. JSON data: " + JSON.stringify(data)); - } else if (match === 0) { - throw new Error("No match found constructing `Color` with oneOf schemas String, [Number]. Details: " + - errorMessages.join(", ")); - } else { // only 1 match - return obj; - } + return new Color(data); } /** diff --git a/samples/client/petstore/javascript-promise-es6/src/model/Pig.js b/samples/client/petstore/javascript-promise-es6/src/model/Pig.js index ac867a3525e..da6cdc07656 100644 --- a/samples/client/petstore/javascript-promise-es6/src/model/Pig.js +++ b/samples/client/petstore/javascript-promise-es6/src/model/Pig.js @@ -24,10 +24,56 @@ class Pig { /** * Constructs a new Pig. * @alias module:model/Pig - * @param {(module:model/BasquePig|module:model/DanishPig)} The actual instance to initialize Pig. + * @param {(module:model/BasquePig|module:model/DanishPig)} instance The actual instance to initialize Pig. */ - constructor(obj = null) { - this.actualInstance = obj; + constructor(instance = null) { + if (instance === null) { + this.actualInstance = null; + return; + } + var match = 0; + var errorMessages = []; + try { + if (typeof instance === "BasquePig") { + this.actualInstance = instance; + } else { + // plain JS object + // validate the object + BasquePig.validateJSON(instance); // throw an exception if no match + // create BasquePig from JS object + this.actualInstance = BasquePig.constructFromObject(instance); + } + match++; + } catch(err) { + // json data failed to deserialize into BasquePig + errorMessages.push("Failed to construct BasquePig: " + err) + } + + try { + if (typeof instance === "DanishPig") { + this.actualInstance = instance; + } else { + // plain JS object + // validate the object + DanishPig.validateJSON(instance); // throw an exception if no match + // create DanishPig from JS object + this.actualInstance = DanishPig.constructFromObject(instance); + } + match++; + } catch(err) { + // json data failed to deserialize into DanishPig + errorMessages.push("Failed to construct DanishPig: " + err) + } + + if (match > 1) { + throw new Error("Multiple matches found constructing `Pig` with oneOf schemas BasquePig, DanishPig. Input: " + JSON.stringify(instance)); + } else if (match === 0) { + this.actualInstance = null; // clear the actual instance in case there are multiple matches + throw new Error("No match found constructing `Pig` with oneOf schemas BasquePig, DanishPig. Details: " + + errorMessages.join(", ")); + } else { // only 1 match + // the input is valid + } } /** @@ -38,41 +84,7 @@ class Pig { * @return {module:model/Pig} The populated Pig instance. */ static constructFromObject(data, obj) { - if (!data) { - return new Pig(); - } - var match = 0; - var errorMessages = []; - try { - // validate the JSON data - BasquePig.validateJSON(data); - // create BasquePig from JSON data - obj = new Pig(BasquePig.constructFromObject(data)); - match++; - } catch(err) { - // json data failed to deserialize into BasquePig - errorMessages.push("Failed to construct BasquePig: " + err) - } - - try { - // validate the JSON data - DanishPig.validateJSON(data); - // create DanishPig from JSON data - obj = new Pig(DanishPig.constructFromObject(data)); - match++; - } catch(err) { - // json data failed to deserialize into DanishPig - errorMessages.push("Failed to construct DanishPig: " + err) - } - - if (match > 1) { - throw new Error("Multiple matches found constructing `Pig` with oneOf schemas BasquePig, DanishPig. JSON data: " + JSON.stringify(data)); - } else if (match === 0) { - throw new Error("No match found constructing `Pig` with oneOf schemas BasquePig, DanishPig. Details: " + - errorMessages.join(", ")); - } else { // only 1 match - return obj; - } + return new Pig(data); } /**