diff options
Diffstat (limited to 'www/test/1.8.6/node_modules/chai-dom/chai-dom.js')
-rw-r--r-- | www/test/1.8.6/node_modules/chai-dom/chai-dom.js | 429 |
1 files changed, 429 insertions, 0 deletions
diff --git a/www/test/1.8.6/node_modules/chai-dom/chai-dom.js b/www/test/1.8.6/node_modules/chai-dom/chai-dom.js new file mode 100644 index 00000000..23a3d31d --- /dev/null +++ b/www/test/1.8.6/node_modules/chai-dom/chai-dom.js @@ -0,0 +1,429 @@ +(function(chaiDom) { + if (typeof require === 'function' && typeof exports === 'object' && typeof module === 'object') { + module.exports = chaiDom + } else if (typeof define === 'function' && define.amd) { + define(function() { + return chaiDom + }) + } else { + chai.use(chaiDom) + } +}(function(chai, utils) { + var flag = utils.flag, + + elToString = function(el) { + var desc + if (isNodeList(el)) { + if (el.length === 0) { + return 'empty NodeList' + } + + desc = Array.prototype.slice.call(el, 0, 5).map(elToString).join(', ') + return el.length > 5 ? desc + '... (+' + (el.length - 5) + ' more)' : desc + } + if (!isHTMLElement(el)) { + return String(el) + } + + desc = el.tagName.toLowerCase() + if (el.id) { + desc += '#' + el.id + } + if (el.className) { + desc += '.' + String(el.className).replace(/\s+/g, '.') + } + Array.prototype.forEach.call(el.attributes, function(attr) { + if (attr.name !== 'class' && attr.name !== 'id') { + desc += '[' + attr.name + (attr.value ? '="' + attr.value + '"]' : ']') + } + }) + return desc + }, + + attrAssert = function(name, val) { + var el = flag(this, 'object'), actual = el.getAttribute(name) + + if (!flag(this, 'negate') || undefined === val) { + this.assert( + !!el.attributes[name] + , 'expected ' + elToString(el) + ' to have an attribute #{exp}' + , 'expected ' + elToString(el) + ' not to have an attribute #{exp}' + , name + ) + } + + if (undefined !== val) { + this.assert( + val === actual + , 'expected ' + elToString(el) + ' to have an attribute ' + utils.inspect(name) + ' with the value #{exp}, but the value was #{act}' + , 'expected ' + elToString(el) + ' not to have an attribute ' + utils.inspect(name) + ' with the value #{act}' + , val + , actual + ) + } + + flag(this, 'object', actual) + }, + + isHTMLElement = function(el) { + return el.nodeType === 1 // window.Node.ELEMENT_NODE + }, + + isNodeList = function(obj) { + return Object.prototype.toString.call(obj) === '[object NodeList]' + } + + utils.elToString = elToString + chai.Assertion.addMethod('attr', attrAssert) + chai.Assertion.addMethod('attribute', attrAssert) + + chai.Assertion.addMethod('class', function(className) { + var el = flag(this, 'object') + + if (className instanceof RegExp) { + return this.assert( + Array.from(el.classList).some(function(cls) { return className.test(cls) }) + , 'expected ' + elToString(el) + ' to have class matching #{exp}' + , 'expected ' + elToString(el) + ' not to have class matching #{exp}' + , className + ) + } + + this.assert( + el.classList.contains(className) + , 'expected ' + elToString(el) + ' to have class #{exp}' + , 'expected ' + elToString(el) + ' not to have class #{exp}' + , className + ) + }) + + chai.Assertion.addMethod('id', function(id) { + var el = flag(this, 'object') + this.assert( + el.id == id + , 'expected ' + elToString(el) + ' to have id #{exp}' + , 'expected ' + elToString(el) + ' not to have id #{exp}' + , id + ) + }) + + chai.Assertion.addMethod('html', function(html) { + var el = flag(this, 'object'), actual = flag(this, 'object').innerHTML + + if (flag(this, 'contains')) { + this.assert( + actual.indexOf(html) >= 0 + , 'expected #{act} to contain HTML #{exp}' + , 'expected #{act} not to contain HTML #{exp}' + , html + , actual + ) + } else { + this.assert( + actual === html + , 'expected ' + elToString(el) + ' to have HTML #{exp}, but the HTML was #{act}' + , 'expected ' + elToString(el) + ' not to have HTML #{exp}' + , html + , actual + ) + } + }) + + chai.Assertion.addChainableMethod('trimmed', null, function() { + flag(this, 'trim-text', true) + }) + + chai.Assertion.addProperty('rendered', function() { + flag(this, 'rendered-text', true) + }) + + chai.Assertion.addMethod('text', function(text) { + var obj = flag(this, 'object'), contains = flag(this, 'contains'), + trim = flag(this, 'trim-text'), actual, result + var property = flag(this, 'rendered-text') ? 'innerText' : 'textContent' + + if (isNodeList(obj)) { + actual = Array.prototype.map.call(obj, function(el) { return trim ? el[property].trim() : el[property] }) + if (Array.isArray(text)) { + result = contains ? + text[flag(this, 'negate') ? 'some' : 'every'](function(t) { + return Array.prototype.some.call(obj, function(el) { + return (trim ? el[property].trim() : el[property]) === t + }) + }) + : + utils.eql(actual, text) + + actual = actual.join() + text = text.join() + } else { + actual = actual.join('') + result = contains ? actual.indexOf(text) >= 0 : actual === text + } + } else { + actual = trim ? obj[property].trim() : obj[property] + result = contains ? actual.indexOf(text) >= 0 : actual === text + } + + var objDesc = elToString(obj) + var textMsg = '' + + if (trim) { + textMsg += 'trimmed ' + } + if (flag(this, 'rendered-text')) { + textMsg += 'rendered ' + } + textMsg += 'text' + + if (contains) { + this.assert( + result + , 'expected ' + objDesc + ' to contain #{exp}, but the ' + textMsg + ' was #{act}' + , 'expected ' + objDesc + ' not to contain #{exp}, but the ' + textMsg + ' was #{act}' + , text + , actual + ) + } else { + this.assert( + result + , 'expected ' + objDesc + ' to have ' + textMsg + ' #{exp}, but the ' + textMsg + ' was #{act}' + , 'expected ' + objDesc + ' not to have ' + textMsg + ' #{exp}' + , text + , actual + ) + } + }) + + chai.Assertion.addMethod('value', function(value) { + var el = flag(this, 'object'), actual = flag(this, 'object').value + this.assert( + flag(this, 'object').value === value + , 'expected ' + elToString(el) + ' to have value #{exp}, but the value was #{act}' + , 'expected ' + elToString(el) + ' not to have value #{exp}' + , value + , actual + ) + }) + + chai.Assertion.overwriteProperty('exist', function(_super) { + return function() { + var obj = flag(this, 'object') + if (isNodeList(obj)) { + this.assert( + obj.length > 0 + , 'expected an empty NodeList to have nodes' + , 'expected ' + elToString(obj) + ' to not exist') + } else { + _super.apply(this, arguments) + } + } + }) + + chai.Assertion.overwriteProperty('empty', function(_super) { + return function() { + var obj = flag(this, 'object') + if (isHTMLElement(obj)) { + this.assert( + obj.children.length === 0 + , 'expected ' + elToString(obj) + ' to be empty' + , 'expected ' + elToString(obj) + ' to not be empty') + } else if (isNodeList(obj)) { + this.assert( + obj.length === 0 + , 'expected ' + elToString(obj) + ' to be empty' + , 'expected ' + elToString(obj) + ' to not be empty') + } else { + _super.apply(this, arguments) + } + } + }) + + chai.Assertion.overwriteChainableMethod('length', + function(_super) { + return function(length) { + var obj = flag(this, 'object') + if (isNodeList(obj) || isHTMLElement(obj)) { + var actualLength = obj.children ? obj.children.length : obj.length + this.assert( + actualLength === length + , 'expected ' + elToString(obj) + ' to have #{exp} children but it had #{act} children' + , 'expected ' + elToString(obj) + ' to not have #{exp} children' + , length + , actualLength + ) + } else { + _super.apply(this, arguments) + } + } + }, + function(_super) { + return function() { + _super.call(this) + } + } + ) + + + chai.Assertion.overwriteMethod('match', function(_super) { + return function(selector) { + var obj = flag(this, 'object') + if (isHTMLElement(obj)) { + this.assert( + obj.matches(selector) + , 'expected ' + elToString(obj) + ' to match #{exp}' + , 'expected ' + elToString(obj) + ' to not match #{exp}' + , selector + ) + } else if (isNodeList(obj)) { + this.assert( + (!!obj.length && Array.prototype.every.call(obj, function(el) { return el.matches(selector) })) + , 'expected ' + elToString(obj) + ' to match #{exp}' + , 'expected ' + elToString(obj) + ' to not match #{exp}' + , selector + ) + } else { + _super.apply(this, arguments) + } + } + }) + + chai.Assertion.overwriteChainableMethod('contain', + function(_super) { + return function(subitem) { + var obj = flag(this, 'object') + if (isHTMLElement(obj)) { + if (typeof subitem === 'string') { + this.assert( + !!obj.querySelector(subitem) + , 'expected ' + elToString(obj) + ' to contain #{exp}' + , 'expected ' + elToString(obj) + ' to not contain #{exp}' + , subitem) + } else { + this.assert( + obj.contains(subitem) + , 'expected ' + elToString(obj) + ' to contain ' + elToString(subitem) + , 'expected ' + elToString(obj) + ' to not contain ' + elToString(subitem)) + } + } else { + _super.apply(this, arguments) + } + } + }, + function(_super) { + return function() { + _super.call(this) + } + } + ) + + chai.Assertion.addMethod('descendant', function(subitem) { + var obj = flag(this, 'object'), actual = subitem + + if (typeof subitem === 'string') { + actual = obj.querySelector(subitem) + this.assert( + !!actual + , 'expected ' + elToString(obj) + ' to have descendant #{exp}' + , 'expected ' + elToString(obj) + ' to not have descendant #{exp}' + , subitem) + } else { + this.assert( + obj.contains(subitem) + , 'expected ' + elToString(obj) + ' to contain ' + elToString(subitem) + , 'expected ' + elToString(obj) + ' to not contain ' + elToString(subitem)) + } + + flag(this, 'object', actual) + }) + + chai.Assertion.addMethod('descendants', function(selector) { + var obj = flag(this, 'object'), + actual = obj.querySelectorAll(selector) + this.assert( + !!actual.length + , 'expected ' + elToString(obj) + ' to have descendants #{exp}' + , 'expected ' + elToString(obj) + ' to not have descendants #{exp}' + , selector) + flag(this, 'object', actual) + }) + + chai.Assertion.addProperty('displayed', function() { + var el = flag(this, 'object'), + actual = document.body.contains(el) ? window.getComputedStyle(el).display : el.style.display + + this.assert( + actual !== 'none' + , 'expected ' + elToString(el) + ' to be displayed, but it was not' + , 'expected ' + elToString(el) + ' to not be displayed, but it was as ' + actual + , actual + ) + }) + + chai.Assertion.addProperty('visible', function() { + var el = flag(this, 'object'), + actual = document.body.contains(el) ? window.getComputedStyle(el).visibility : el.style.visibility + + this.assert( + actual !== 'hidden' && actual !== 'collapse' + , 'expected ' + elToString(el) + ' to be visible, but it was ' + (actual === 'hidden' ? 'hidden' : 'collapsed') + , 'expected ' + elToString(el) + ' to not be visible, but it was' + , actual + ) + }) + + chai.Assertion.addMethod('tagName', function(tagName) { + var el = flag(this, 'object'), + actual = el.tagName; + + this.assert( + actual.toUpperCase() === tagName.toUpperCase() + , 'expected ' + elToString(el) + ' to have tagName ' + tagName + ', but it was ' + actual + , 'expected ' + elToString(el) + ' to not have tagName ' + tagName + ', but it was ' + actual + , actual + ) + }) + + chai.Assertion.addMethod('style', function (styleProp, styleValue) { + var el = flag(this, 'object'), + style = window.getComputedStyle(el), + actual = style.getPropertyValue(styleProp).trim(); + + this.assert( + actual === styleValue + , 'expected ' + elToString(el) + ' to have style property ' + styleProp + ' equal to ' + styleValue + ', but it was equal to ' + actual + , 'expected ' + elToString(el) + ' to not have style property ' + styleProp + ' equal to ' + styleValue + ', but it was equal to ' + actual + , actual + ) + }) + + chai.Assertion.overwriteProperty('focus', function() { + return function () { + var el = flag(this, 'object'), actual = el.ownerDocument.activeElement + + this.assert( + el === el.ownerDocument.activeElement + , 'expected #{this} to have focus' + , 'expected #{this} not to have focus' + , el + , actual + ) + + } + }) + + chai.Assertion.overwriteProperty('checked', function() { + return function () { + var el = flag(this, 'object') + + if(!(el instanceof HTMLInputElement && (el.type === 'checkbox' || el.type === 'radio'))) { + throw new TypeError(elToString(el) + ' is not a checkbox or radio input'); + } + + this.assert( + el.checked + , 'expected ' + elToString(el) + ' to be checked' + , 'expected ' + elToString(el) + ' to not be checked') + } + }) +})); |