diff options
Diffstat (limited to 'testing/web-platform/tests/html/semantics/forms/constraints/support/validator.js')
-rw-r--r-- | testing/web-platform/tests/html/semantics/forms/constraints/support/validator.js | 377 |
1 files changed, 377 insertions, 0 deletions
diff --git a/testing/web-platform/tests/html/semantics/forms/constraints/support/validator.js b/testing/web-platform/tests/html/semantics/forms/constraints/support/validator.js new file mode 100644 index 000000000..e969ce460 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/constraints/support/validator.js @@ -0,0 +1,377 @@ +var validator = { + test_tooLong: function(ctl, data) { + var self = this; + test(function () { + self.pre_check(ctl, "tooLong"); + self.set_conditions(ctl, data.conditions); + if (data.dirty) + self.set_dirty(ctl); + + if (data.expected) + assert_true(ctl.validity.tooLong, "The validity.tooLong should be true."); + else + assert_false(ctl.validity.tooLong, "The validity.tooLong should be false."); + }, data.name); + }, + + test_tooShort: function(ctl, data) { + var self = this; + test(function () { + self.pre_check(ctl, "tooShort"); + self.set_conditions(ctl, data.conditions); + if (data.dirty) + self.set_dirty(ctl); + + if (data.expected) + assert_true(ctl.validity.tooShort, "The validity.tooShort should be true."); + else + assert_false(ctl.validity.tooShort, "The validity.tooShort should be false."); + }, data.name); + }, + + test_patternMismatch: function(ctl, data) { + var self = this; + test(function () { + self.pre_check(ctl, "patternMismatch"); + self.set_conditions(ctl, data.conditions); + + if (data.expected) + assert_true(ctl.validity.patternMismatch, "The validity.patternMismatch should be true."); + else + assert_false(ctl.validity.patternMismatch, "The validity.patternMismatch should be false."); + }, data.name); + }, + + test_valueMissing: function(ctl, data) { + var self = this; + test(function () { + self.pre_check(ctl, "valueMissing"); + self.set_conditions(ctl, data.conditions); + if (data.expected) + assert_true(ctl.validity.valueMissing, "The validity.valueMissing should be true."); + else + assert_false(ctl.validity.valueMissing, "The validity.valueMissing should be false."); + }, data.name); + }, + + test_typeMismatch: function(ctl, data) { + var self = this; + test(function () { + self.pre_check(ctl, "typeMismatch"); + self.set_conditions(ctl, data.conditions); + + if (data.expected) + assert_true(ctl.validity.typeMismatch, "The validity.typeMismatch should be true."); + else + assert_false(ctl.validity.typeMismatch, "The validity.typeMismatch should be false."); + }, data.name); + }, + + test_rangeOverflow: function(ctl, data) { + var self = this; + test(function () { + self.pre_check(ctl, "rangeOverflow"); + self.set_conditions(ctl, data.conditions); + + if (data.expected) + assert_true(ctl.validity.rangeOverflow, "The validity.rangeOverflow should be true."); + else + assert_false(ctl.validity.rangeOverflow, "The validity.rangeOverflow should be false."); + }, data.name); + }, + + test_rangeUnderflow: function(ctl, data) { + var self = this; + test(function () { + self.pre_check(ctl, "rangeUnderflow"); + self.set_conditions(ctl, data.conditions); + if (data.expected) + assert_true(ctl.validity.rangeUnderflow, "The validity.rangeUnderflow should be true."); + else + assert_false(ctl.validity.rangeUnderflow, "The validity.rangeUnderflow should be false."); + }, data.name); + }, + + test_stepMismatch: function(ctl, data) { + var self = this; + test(function () { + self.pre_check(ctl, "stepMismatch"); + self.set_conditions(ctl, data.conditions); + + if (data.expected) + assert_true(ctl.validity.stepMismatch, "The validity.stepMismatch should be true."); + else + assert_false(ctl.validity.stepMismatch, "The validity.stepMismatch should be false."); + }, data.name); + }, + + test_badInput: function(ctl, data) { + var self = this; + test(function () { + self.pre_check(ctl, "badInput"); + self.set_conditions(ctl, data.conditions); + + if (data.expected) + assert_true(ctl.validity.badInput, "The validity.badInput should be true."); + else + assert_false(ctl.validity.badInput, "The validity.badInput should be false."); + }, data.name); + }, + + test_customError: function(ctl, data) { + var self = this; + test(function () { + self.pre_check(ctl, "customError"); + ctl.setCustomValidity(data.conditions.message); + + if (data.expected) { + assert_true(ctl.validity.customError, "The validity.customError attribute should be true."); + assert_equals(ctl.validationMessage, data.conditions.message, + "The validationMessage attribute should be '" + data.conditions.message + "'."); + } else { + assert_false(ctl.validity.customError, "The validity.customError attribute should be false."); + assert_equals(ctl.validationMessage, "", "The validationMessage attribute must be empty."); + } + }, data.name); + }, + + test_isValid: function (ctl, data) { + var self = this; + test(function () { + self.set_conditions(ctl, data.conditions); + if (data.dirty) + self.set_dirty(ctl); + + if (data.expected) + assert_true(ctl.validity.valid, "The validity.valid should be true."); + else + assert_false(ctl.validity.valid, "The validity.valid should be false."); + }, data.name); + }, + + test_willValidate: function(ctl, data) { + var self = this; + test(function () { + self.pre_check(ctl, "willValidate"); + self.set_conditions(ctl, data.conditions); + if (data.ancestor) { + var dl = document.createElement("datalist"); + dl.appendChild(ctl); + } + + if (data.expected) + assert_true(ctl.willValidate, "The willValidate attribute should be true."); + else + assert_false(ctl.willValidate, "The willValidate attribute should be false."); + }, data.name); + }, + + test_checkValidity: function (ctl, data) { + var self = this; + test(function () { + var eventFired = false; + self.pre_check(ctl, "checkValidity"); + self.set_conditions(ctl, data.conditions); + if (data.dirty) + self.set_dirty(ctl); + + on_event(ctl, "invalid", function(e){ + assert_equals(e.type, "invalid", "The invalid event should be fired."); + eventFired = true; + }); + + if (data.expected) { + assert_true(ctl.checkValidity(), "The checkValidity method should be true."); + assert_false(eventFired, "The invalid event should not be fired."); + } else { + assert_false(ctl.checkValidity(), "The checkValidity method should be false."); + assert_true(eventFired, "The invalid event should be fired."); + } + }, data.name); + + test(function () { + var fm = document.createElement("form"); + var ctl2 = ctl.cloneNode(true); + + self.pre_check(ctl, "checkValidity"); + self.set_conditions(ctl2, data.conditions); + fm.appendChild(ctl2); + document.body.appendChild(fm); + if (data.dirty) + self.set_dirty(ctl2); + + var result = fm.checkValidity(); + document.body.removeChild(fm); + + if (data.expected) + assert_true(result, "The checkValidity method of the element's form owner should return true."); + else + assert_false(result, "The checkValidity method of the element's form owner should return false."); + }, data.name + " (in a form)"); + }, + + test_reportValidity: function (ctl, data) { + var self = this; + test(function () { + var eventFired = false; + + self.pre_check(ctl, "reportValidity"); + self.set_conditions(ctl, data.conditions); + if (data.dirty) + self.set_dirty(ctl); + + on_event(ctl, "invalid", function(e){ + assert_equals(e.type, "invalid", "The invalid event should be fired."); + eventFired = true; + }); + + if (data.expected) { + assert_true(ctl.reportValidity(), "The reportValidity method should be true."); + assert_false(eventFired, "The invalid event should not be fired."); + } else { + assert_false(ctl.reportValidity(), "The reportValidity method should be false."); + assert_true(eventFired, "The invalid event should be fired."); + } + }, data.name); + + test(function () { + var fm = document.createElement("form"); + var ctl2 = ctl.cloneNode(true); + + self.pre_check(ctl, "reportValidity"); + self.set_conditions(ctl2, data.conditions); + fm.appendChild(ctl2); + document.body.appendChild(fm); + if (data.dirty) + self.set_dirty(ctl2); + + var result = fm.reportValidity(); + document.body.removeChild(fm); + + if (data.expected) + assert_true(result, "The reportValidity method of the element's form owner should return true."); + else + assert_false(result, "The reportValidity method of the element's form owner should return false."); + }, data.name + " (in a form)"); + }, + + test_support_type: function (ctl, typ, testName) { + test(function () { + assert_equals(ctl.type, typ, "The " + typ + " type should be supported."); + }, testName); + }, + + set_conditions: function (ctl, obj) { + [ + "checked", + "disabled", + "max", + "maxlength", + "min", + "minlength", + "multiple", + "pattern", + "required", + "selected", + "step", + "value" + ].forEach(function(item) { + ctl.removeAttribute(item); + }); + for (var attr in obj) { + if (attr === "checked" || obj[attr] || obj[attr] === "") + ctl[attr] = obj[attr]; + } + }, + + set_dirty: function(ctl) { + ctl.focus(); + var old_value = ctl.value; + ctl.value = "a"; + ctl.value = old_value; + }, + + pre_check: function(ctl, item) { + switch (item) { + case "willValidate": + assert_true(item in ctl, "The " + item + " attribute doesn't exist."); + break; + case "checkValidity": + case "reportValidity": + assert_true(item in ctl, "The " + item + " method doesn't exist."); + break; + case "tooLong": + case "tooShort": + case "patternMismatch": + case "typeMismatch": + case "stepMismatch": + case "rangeOverflow": + case "rangeUnderflow": + case "valueMissing": + case "badInput": + case "valid": + assert_true("validity" in ctl, "The validity attribute doesn't exist."); + assert_true(item in ctl.validity, "The " + item + " attribute doesn't exist."); + break; + case "customError": + assert_true("validity" in ctl, "The validity attribute doesn't exist."); + assert_true("setCustomValidity" in ctl, "The validity attribute doesn't exist."); + assert_true("validationMessage" in ctl, "The validity attribute doesn't exist."); + assert_true(item in ctl.validity, "The " + item + " attribute doesn't exist."); + break; + } + }, + + run_test: function (testee, method) { + var testMethod = "test_" + method; + if (typeof this[testMethod] !== "function") { + return false; + } + + var ele = null, + prefix = ""; + + for (var i = 0; i < testee.length; i++) { + if (testee[i].types.length > 0) { + for (var typ in testee[i].types) { + ele = document.createElement(testee[i].tag); + document.body.appendChild(ele); + try { + ele.type = testee[i].types[typ]; + } catch (e) { + //Do nothing, avoid the runtime error breaking the test + } + + prefix = "[" + testee[i].tag.toUpperCase() + " in " + testee[i].types[typ].toUpperCase() + " status] "; + if (ele.type != testee[i].types[typ]) { + this.test_support_type( + ele, + testee[i].types[typ], + prefix + "The " + testee[i].types[typ] + " type must be supported." + ); + continue; + } + + for (var j = 0; j < testee[i].testData.length; j++) { + testee[i].testData[j].name = testee[i].testData[j].name.replace(/\[.*\]\s/g, prefix); + this[testMethod](ele, testee[i].testData[j]); + } + } + } else { + ele = document.createElement(testee[i].tag); + document.body.appendChild(ele); + prefix = "[" + testee[i].tag + "] "; + + if (testElements[i].tag === "select") { + ele.add(new Option("test1", "")); + ele.add(new Option("test2", 1)); + } + + for (var item in testee[i].testData) { + testee[i].testData[item].name = testee[i].testData[item].name.replace("[target]", prefix); + this[testMethod](ele, testee[i].testData[item]); + } + } + } + } +} |