"use strict"; // Helper assertion functions to validate dictionary fields // on dictionary objects returned from APIs function assert_string(object) { assert_equals(typeof object, "string", `Expect ${object} to be string`); } function assert_string_field(object, field) { const str = object[field]; assert_equals(typeof str, "string", `Expect dictionary.${field} to be string`); } function assert_number_field(object, field) { const num = object[field]; assert_equals(typeof num, "number", `Expect dictionary.${field} to be number`); } function assert_boolean_field(object, field, value = "") { const bool = object[field]; assert_equals(typeof bool, "boolean", `Expect dictionary.${field} to be boolean`); if (object[field] !== "") { assert_equals(object[field], value, `Expect default value of dictionary.${field} to be ${value}`); } } function assert_array_field(object, field) { assert_true(Array.isArray(object[field]), `Expect dictionary.${field} to be array`); } function assert_enum_field(object, field, validValues) { assert_string_field(object, field); assert_true(validValues.includes(object[field]), `Expect dictionary.${field} to have one of the valid enum values: ${validValues}`); } function assert_number_range_field(object, field, key) { const num = object[field][key]; assert_equals(typeof num, "number", `Expect dictionary.${field}.${key} to be number`); } function assert_boolean_range_field(object, field, key) { const bool = object[field][key]; assert_equals(typeof bool, "boolean", `Expect dictionary.${field}.${key} to be boolean`); } function assert_number_or_number_range_field(object, field) { if (typeof object[field] !== "object") { assert_number_field(object, field); } else { if (object[field]["max"] !== undefined) assert_number_range_field(object, field, "max"); if (object[field]["min"] !== undefined) assert_number_range_field(object, field, "min"); if (object[field]["max"] === undefined && object[field]["min"] === undefined) assert_unreached(); } } function assert_constrain_string_field(object, field) { // test DOMString type if (typeof object[field] !== "object") { assert_string_field(object, field); // test ConstrainDOMStringParameters type } else if (typeof object[field]["exact"] !== undefined || typeof object[field]["ideal"] !== undefined) { if (object[field]["exact"] !== undefined) { // test DOMString type key value of ConstrainDOMStringParameters dictionary if (typeof object[field] !== "object") { assert_string_field(object[field], "exact"); // test sequence type key value of ConstrainDOMStringParameters dictionary } else { assert_array_field(object[field], "exact"); for(const item of object[field]["exact"]) { assert_string(item); } } } if (object[field]["ideal"] !== undefined) { // test DOMString type key value of ConstrainDOMStringParameters dictionary if (typeof object[field] !== "object") { assert_string_field(object[field], "ideal"); // test sequence type key value of ConstrainDOMStringParameters dictionary } else { assert_array_field(object[field], "ideal"); for(const item of object[field]["ideal"]) { assert_string(item); } } } // test sequence type } else { assert_array_field(object, field); for(const item of object[field]) { assert_string(item); } } } function assert_constrain_number_field(object, field) { if (typeof object[field] !== "object") { assert_number_field(object, field); } else { if (object[field]["max"] !== undefined) assert_number_range_field(object, field, "max"); if (object[field]["min"] !== undefined) assert_number_range_field(object, field, "min"); if (object[field]["exact"] !== undefined) assert_number_range_field(object, field, "exact"); if (object[field]["ideal"] !== undefined) assert_number_range_field(object, field, "ideal"); if (object[field]["max"] === undefined && object[field]["min"] === undefined && object[field]["exact"] === undefined && object[field]["ideal"] === undefined) assert_unreached(); } } function assert_constrain_boolean_field(object, field) { if (typeof object[field] !== "object") { assert_boolean_field(object, field); } else { if (object[field]["exact"] !== undefined) assert_boolean_range_field(object, field, "exact"); if (object[field]["ideal"] !== undefined) assert_boolean_range_field(object, field, "ideal"); if (object[field]["exact"] === undefined && object[field]["ideal"] === undefined) assert_unreached(); } }