diff --git a/Gruntfile.js b/Gruntfile.js index 3018702f55a..48b9c59dbb5 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -96,7 +96,15 @@ var "demos/tooltip/ajax/content*.html", "tests/unit/core/core.html", "tests/unit/tabs/data/test.html" - ]; + ], + + serverOptions = {}, + binPath = require( "chromedriver" ).path, + rdefineEnd = /\}\);[^}\w]*$/, + pkg = grunt.file.readJSON( "package.json" ); + +serverOptions[ "Dwebdriver.chrome.driver=" + binPath ] = ""; + function mapMinFile( file ) { return "dist/" + file.replace( /ui\//, "minified/" ); @@ -125,6 +133,7 @@ uiFiles.forEach(function( file ) { // grunt plugins require( "load-grunt-tasks" )( grunt ); +grunt.loadNpmTasks( 'intern' ) // local testswarm and build tasks grunt.loadTasks( "build/tasks" ); @@ -179,6 +188,24 @@ grunt.initConfig({ } }, + intern: { + options: { + runType: "runner" + }, + unitLocal: { + options: { + config: "tests/intern-local", + suites: [ "tests/unit/all" ] + } + }, + unitCi: { + options: { + config: "tests/intern", + suites: [ "tests/unit/all" ] + } + } + }, + // Remove the requireSpacesInsideParentheses override once everything is fixed jscs: { "ui-good": [ "ui/*.js" ].concat( jscsBad.map( function( file ) { @@ -290,6 +317,7 @@ grunt.initConfig({ "qunit-composite/LICENSE.txt": "qunit-composite/LICENSE.txt", "requirejs/require.js": "requirejs/require.js", + "requirejs-text/text.js": "requirejs-text/text.js", "jquery-mousewheel/jquery.mousewheel.js": "jquery-mousewheel/jquery.mousewheel.js", "jquery-mousewheel/LICENSE.txt": "jquery-mousewheel/LICENSE.txt", @@ -378,6 +406,22 @@ grunt.initConfig({ } }, + "start-selenium-server": { + dev: { + options: { + downloadUrl: "https://selenium-release.storage.googleapis.com/2.45/" + + "selenium-server-standalone-2.45.0.jar", + downloadLocation: "node_modules/grunt-selenium-server/", + serverOptions: serverOptions, + systemProperties: {} + } + } + }, + + "stop-selenium-server": { + dev: {} + }, + authors: { prior: [ "Paul Bakaus ", @@ -442,4 +486,6 @@ grunt.registerTask( "test", [ "qunit" ]); grunt.registerTask( "sizer", [ "concat:ui", "uglify:main", "compare_size:all" ]); grunt.registerTask( "sizer_all", [ "concat:ui", "uglify", "compare_size" ]); +grunt.registerTask( "test-local", [ "start-selenium-server", "intern:unitLocal", "stop-selenium-server" ]) + }; diff --git a/bower.json b/bower.json index 2c8b5a6baee..1db344f305c 100644 --- a/bower.json +++ b/bower.json @@ -16,9 +16,10 @@ "jshint": "2.4.4", "qunit": "1.18.0", "qunit-assert-classes": "1.0.2", - "qunit-assert-close": "JamesMGreene/qunit-assert-close#v1.1.1", + "qunit-assert-close": "apsdehal/qunit-assert-close#amd-patch", "qunit-composite": "JamesMGreene/qunit-composite#v1.1.0", "requirejs": "2.1.14", + "requirejs-text": "2.0.14", "jquery-1.7.0": "jquery#1.7.0", "jquery-1.7.1": "jquery#1.7.1", diff --git a/external/qunit-assert-close/qunit-assert-close.js b/external/qunit-assert-close/qunit-assert-close.js index bd843810a52..63c79086df1 100644 --- a/external/qunit-assert-close/qunit-assert-close.js +++ b/external/qunit-assert-close/qunit-assert-close.js @@ -1,106 +1,120 @@ -/** - * Checks that the first two arguments are equal, or are numbers close enough to be considered equal - * based on a specified maximum allowable difference. - * - * @example assert.close(3.141, Math.PI, 0.001); - * - * @param Number actual - * @param Number expected - * @param Number maxDifference (the maximum inclusive difference allowed between the actual and expected numbers) - * @param String message (optional) - */ -function close(actual, expected, maxDifference, message) { - var actualDiff = (actual === expected) ? 0 : Math.abs(actual - expected), - result = actualDiff <= maxDifference; - message = message || (actual + " should be within " + maxDifference + " (inclusive) of " + expected + (result ? "" : ". Actual: " + actualDiff)); - QUnit.push(result, actual, expected, message); -} +(function (factory) { + if (typeof define === "function" && define.amd) { + // AMD. Register as an anonymous module. + define([ + "qunit" + ], factory); + } else { -/** - * Checks that the first two arguments are equal, or are numbers close enough to be considered equal - * based on a specified maximum allowable difference percentage. - * - * @example assert.close.percent(155, 150, 3.4); // Difference is ~3.33% - * - * @param Number actual - * @param Number expected - * @param Number maxPercentDifference (the maximum inclusive difference percentage allowed between the actual and expected numbers) - * @param String message (optional) - */ -close.percent = function closePercent(actual, expected, maxPercentDifference, message) { - var actualDiff, result; - if (actual === expected) { - actualDiff = 0; - result = actualDiff <= maxPercentDifference; + // Browser globals + factory(QUnit); } - else if (actual !== 0 && expected !== 0 && expected !== Infinity && expected !== -Infinity) { - actualDiff = Math.abs(100 * (actual - expected) / expected); - result = actualDiff <= maxPercentDifference; +}(function (QUnit) { + /** + * Checks that the first two arguments are equal, or are numbers close enough to be considered equal + * based on a specified maximum allowable difference. + * + * @example assert.close(3.141, Math.PI, 0.001); + * + * @param Number actual + * @param Number expected + * @param Number maxDifference (the maximum inclusive difference allowed between the actual and expected numbers) + * @param String message (optional) + */ + function close(actual, expected, maxDifference, message) { + var actualDiff = (actual === expected) ? 0 : Math.abs(actual - expected), + result = actualDiff <= maxDifference; + message = message || (actual + " should be within " + maxDifference + " (inclusive) of " + expected + (result ? "" : ". Actual: " + actualDiff)); + QUnit.push(result, actual, expected, message); } - else { - // Dividing by zero (0)! Should return `false` unless the max percentage was `Infinity` - actualDiff = Infinity; - result = maxPercentDifference === Infinity; - } - message = message || (actual + " should be within " + maxPercentDifference + "% (inclusive) of " + expected + (result ? "" : ". Actual: " + actualDiff + "%")); - QUnit.push(result, actual, expected, message); -}; + /** + * Checks that the first two arguments are equal, or are numbers close enough to be considered equal + * based on a specified maximum allowable difference percentage. + * + * @example assert.close.percent(155, 150, 3.4); // Difference is ~3.33% + * + * @param Number actual + * @param Number expected + * @param Number maxPercentDifference (the maximum inclusive difference percentage allowed between the actual and expected numbers) + * @param String message (optional) + */ + close.percent = function closePercent(actual, expected, maxPercentDifference, message) { + var actualDiff, result; + if (actual === expected) { + actualDiff = 0; + result = actualDiff <= maxPercentDifference; + } + else if (actual !== 0 && expected !== 0 && expected !== Infinity && expected !== -Infinity) { + actualDiff = Math.abs(100 * (actual - expected) / expected); + result = actualDiff <= maxPercentDifference; + } + else { + // Dividing by zero (0)! Should return `false` unless the max percentage was `Infinity` + actualDiff = Infinity; + result = maxPercentDifference === Infinity; + } + message = message || (actual + " should be within " + maxPercentDifference + "% (inclusive) of " + expected + (result ? "" : ". Actual: " + actualDiff + "%")); -/** - * Checks that the first two arguments are numbers with differences greater than the specified - * minimum difference. - * - * @example assert.notClose(3.1, Math.PI, 0.001); - * - * @param Number actual - * @param Number expected - * @param Number minDifference (the minimum exclusive difference allowed between the actual and expected numbers) - * @param String message (optional) - */ -function notClose(actual, expected, minDifference, message) { - var actualDiff = Math.abs(actual - expected), - result = actualDiff > minDifference; - message = message || (actual + " should not be within " + minDifference + " (exclusive) of " + expected + (result ? "" : ". Actual: " + actualDiff)); - QUnit.push(result, actual, expected, message); -} + QUnit.push(result, actual, expected, message); + }; -/** - * Checks that the first two arguments are numbers with differences greater than the specified - * minimum difference percentage. - * - * @example assert.notClose.percent(156, 150, 3.5); // Difference is 4.0% - * - * @param Number actual - * @param Number expected - * @param Number minPercentDifference (the minimum exclusive difference percentage allowed between the actual and expected numbers) - * @param String message (optional) - */ -notClose.percent = function notClosePercent(actual, expected, minPercentDifference, message) { - var actualDiff, result; - if (actual === expected) { - actualDiff = 0; - result = actualDiff > minPercentDifference; - } - else if (actual !== 0 && expected !== 0 && expected !== Infinity && expected !== -Infinity) { - actualDiff = Math.abs(100 * (actual - expected) / expected); - result = actualDiff > minPercentDifference; - } - else { - // Dividing by zero (0)! Should only return `true` if the min percentage was `Infinity` - actualDiff = Infinity; - result = minPercentDifference !== Infinity; + /** + * Checks that the first two arguments are numbers with differences greater than the specified + * minimum difference. + * + * @example assert.notClose(3.1, Math.PI, 0.001); + * + * @param Number actual + * @param Number expected + * @param Number minDifference (the minimum exclusive difference allowed between the actual and expected numbers) + * @param String message (optional) + */ + function notClose(actual, expected, minDifference, message) { + var actualDiff = Math.abs(actual - expected), + result = actualDiff > minDifference; + message = message || (actual + " should not be within " + minDifference + " (exclusive) of " + expected + (result ? "" : ". Actual: " + actualDiff)); + QUnit.push(result, actual, expected, message); } - message = message || (actual + " should not be within " + minPercentDifference + "% (exclusive) of " + expected + (result ? "" : ". Actual: " + actualDiff + "%")); - QUnit.push(result, actual, expected, message); -}; + + /** + * Checks that the first two arguments are numbers with differences greater than the specified + * minimum difference percentage. + * + * @example assert.notClose.percent(156, 150, 3.5); // Difference is 4.0% + * + * @param Number actual + * @param Number expected + * @param Number minPercentDifference (the minimum exclusive difference percentage allowed between the actual and expected numbers) + * @param String message (optional) + */ + notClose.percent = function notClosePercent(actual, expected, minPercentDifference, message) { + var actualDiff, result; + if (actual === expected) { + actualDiff = 0; + result = actualDiff > minPercentDifference; + } + else if (actual !== 0 && expected !== 0 && expected !== Infinity && expected !== -Infinity) { + actualDiff = Math.abs(100 * (actual - expected) / expected); + result = actualDiff > minPercentDifference; + } + else { + // Dividing by zero (0)! Should only return `true` if the min percentage was `Infinity` + actualDiff = Infinity; + result = minPercentDifference !== Infinity; + } + message = message || (actual + " should not be within " + minPercentDifference + "% (exclusive) of " + expected + (result ? "" : ". Actual: " + actualDiff + "%")); + + QUnit.push(result, actual, expected, message); + }; -QUnit.extend(QUnit.assert, { - close: close, - notClose: notClose -}); \ No newline at end of file + QUnit.extend(QUnit.assert, { + close: close, + notClose: notClose + }); +})); diff --git a/external/requirejs-text/text.js b/external/requirejs-text/text.js new file mode 100644 index 00000000000..4c311edcebe --- /dev/null +++ b/external/requirejs-text/text.js @@ -0,0 +1,391 @@ +/** + * @license RequireJS text 2.0.14 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved. + * Available via the MIT or new BSD license. + * see: http://github.com/requirejs/text for details + */ +/*jslint regexp: true */ +/*global require, XMLHttpRequest, ActiveXObject, + define, window, process, Packages, + java, location, Components, FileUtils */ + +define(['module'], function (module) { + 'use strict'; + + var text, fs, Cc, Ci, xpcIsWindows, + progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'], + xmlRegExp = /^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, + bodyRegExp = /]*>\s*([\s\S]+)\s*<\/body>/im, + hasLocation = typeof location !== 'undefined' && location.href, + defaultProtocol = hasLocation && location.protocol && location.protocol.replace(/\:/, ''), + defaultHostName = hasLocation && location.hostname, + defaultPort = hasLocation && (location.port || undefined), + buildMap = {}, + masterConfig = (module.config && module.config()) || {}; + + text = { + version: '2.0.14', + + strip: function (content) { + //Strips declarations so that external SVG and XML + //documents can be added to a document without worry. Also, if the string + //is an HTML document, only the part inside the body tag is returned. + if (content) { + content = content.replace(xmlRegExp, ""); + var matches = content.match(bodyRegExp); + if (matches) { + content = matches[1]; + } + } else { + content = ""; + } + return content; + }, + + jsEscape: function (content) { + return content.replace(/(['\\])/g, '\\$1') + .replace(/[\f]/g, "\\f") + .replace(/[\b]/g, "\\b") + .replace(/[\n]/g, "\\n") + .replace(/[\t]/g, "\\t") + .replace(/[\r]/g, "\\r") + .replace(/[\u2028]/g, "\\u2028") + .replace(/[\u2029]/g, "\\u2029"); + }, + + createXhr: masterConfig.createXhr || function () { + //Would love to dump the ActiveX crap in here. Need IE 6 to die first. + var xhr, i, progId; + if (typeof XMLHttpRequest !== "undefined") { + return new XMLHttpRequest(); + } else if (typeof ActiveXObject !== "undefined") { + for (i = 0; i < 3; i += 1) { + progId = progIds[i]; + try { + xhr = new ActiveXObject(progId); + } catch (e) {} + + if (xhr) { + progIds = [progId]; // so faster next time + break; + } + } + } + + return xhr; + }, + + /** + * Parses a resource name into its component parts. Resource names + * look like: module/name.ext!strip, where the !strip part is + * optional. + * @param {String} name the resource name + * @returns {Object} with properties "moduleName", "ext" and "strip" + * where strip is a boolean. + */ + parseName: function (name) { + var modName, ext, temp, + strip = false, + index = name.lastIndexOf("."), + isRelative = name.indexOf('./') === 0 || + name.indexOf('../') === 0; + + if (index !== -1 && (!isRelative || index > 1)) { + modName = name.substring(0, index); + ext = name.substring(index + 1); + } else { + modName = name; + } + + temp = ext || modName; + index = temp.indexOf("!"); + if (index !== -1) { + //Pull off the strip arg. + strip = temp.substring(index + 1) === "strip"; + temp = temp.substring(0, index); + if (ext) { + ext = temp; + } else { + modName = temp; + } + } + + return { + moduleName: modName, + ext: ext, + strip: strip + }; + }, + + xdRegExp: /^((\w+)\:)?\/\/([^\/\\]+)/, + + /** + * Is an URL on another domain. Only works for browser use, returns + * false in non-browser environments. Only used to know if an + * optimized .js version of a text resource should be loaded + * instead. + * @param {String} url + * @returns Boolean + */ + useXhr: function (url, protocol, hostname, port) { + var uProtocol, uHostName, uPort, + match = text.xdRegExp.exec(url); + if (!match) { + return true; + } + uProtocol = match[2]; + uHostName = match[3]; + + uHostName = uHostName.split(':'); + uPort = uHostName[1]; + uHostName = uHostName[0]; + + return (!uProtocol || uProtocol === protocol) && + (!uHostName || uHostName.toLowerCase() === hostname.toLowerCase()) && + ((!uPort && !uHostName) || uPort === port); + }, + + finishLoad: function (name, strip, content, onLoad) { + content = strip ? text.strip(content) : content; + if (masterConfig.isBuild) { + buildMap[name] = content; + } + onLoad(content); + }, + + load: function (name, req, onLoad, config) { + //Name has format: some.module.filext!strip + //The strip part is optional. + //if strip is present, then that means only get the string contents + //inside a body tag in an HTML string. For XML/SVG content it means + //removing the declarations so the content can be inserted + //into the current doc without problems. + + // Do not bother with the work if a build and text will + // not be inlined. + if (config && config.isBuild && !config.inlineText) { + onLoad(); + return; + } + + masterConfig.isBuild = config && config.isBuild; + + var parsed = text.parseName(name), + nonStripName = parsed.moduleName + + (parsed.ext ? '.' + parsed.ext : ''), + url = req.toUrl(nonStripName), + useXhr = (masterConfig.useXhr) || + text.useXhr; + + // Do not load if it is an empty: url + if (url.indexOf('empty:') === 0) { + onLoad(); + return; + } + + //Load the text. Use XHR if possible and in a browser. + if (!hasLocation || useXhr(url, defaultProtocol, defaultHostName, defaultPort)) { + text.get(url, function (content) { + text.finishLoad(name, parsed.strip, content, onLoad); + }, function (err) { + if (onLoad.error) { + onLoad.error(err); + } + }); + } else { + //Need to fetch the resource across domains. Assume + //the resource has been optimized into a JS module. Fetch + //by the module name + extension, but do not include the + //!strip part to avoid file system issues. + req([nonStripName], function (content) { + text.finishLoad(parsed.moduleName + '.' + parsed.ext, + parsed.strip, content, onLoad); + }); + } + }, + + write: function (pluginName, moduleName, write, config) { + if (buildMap.hasOwnProperty(moduleName)) { + var content = text.jsEscape(buildMap[moduleName]); + write.asModule(pluginName + "!" + moduleName, + "define(function () { return '" + + content + + "';});\n"); + } + }, + + writeFile: function (pluginName, moduleName, req, write, config) { + var parsed = text.parseName(moduleName), + extPart = parsed.ext ? '.' + parsed.ext : '', + nonStripName = parsed.moduleName + extPart, + //Use a '.js' file name so that it indicates it is a + //script that can be loaded across domains. + fileName = req.toUrl(parsed.moduleName + extPart) + '.js'; + + //Leverage own load() method to load plugin value, but only + //write out values that do not have the strip argument, + //to avoid any potential issues with ! in file names. + text.load(nonStripName, req, function (value) { + //Use own write() method to construct full module value. + //But need to create shell that translates writeFile's + //write() to the right interface. + var textWrite = function (contents) { + return write(fileName, contents); + }; + textWrite.asModule = function (moduleName, contents) { + return write.asModule(moduleName, fileName, contents); + }; + + text.write(pluginName, nonStripName, textWrite, config); + }, config); + } + }; + + if (masterConfig.env === 'node' || (!masterConfig.env && + typeof process !== "undefined" && + process.versions && + !!process.versions.node && + !process.versions['node-webkit'] && + !process.versions['atom-shell'])) { + //Using special require.nodeRequire, something added by r.js. + fs = require.nodeRequire('fs'); + + text.get = function (url, callback, errback) { + try { + var file = fs.readFileSync(url, 'utf8'); + //Remove BOM (Byte Mark Order) from utf8 files if it is there. + if (file[0] === '\uFEFF') { + file = file.substring(1); + } + callback(file); + } catch (e) { + if (errback) { + errback(e); + } + } + }; + } else if (masterConfig.env === 'xhr' || (!masterConfig.env && + text.createXhr())) { + text.get = function (url, callback, errback, headers) { + var xhr = text.createXhr(), header; + xhr.open('GET', url, true); + + //Allow plugins direct access to xhr headers + if (headers) { + for (header in headers) { + if (headers.hasOwnProperty(header)) { + xhr.setRequestHeader(header.toLowerCase(), headers[header]); + } + } + } + + //Allow overrides specified in config + if (masterConfig.onXhr) { + masterConfig.onXhr(xhr, url); + } + + xhr.onreadystatechange = function (evt) { + var status, err; + //Do not explicitly handle errors, those should be + //visible via console output in the browser. + if (xhr.readyState === 4) { + status = xhr.status || 0; + if (status > 399 && status < 600) { + //An http 4xx or 5xx error. Signal an error. + err = new Error(url + ' HTTP status: ' + status); + err.xhr = xhr; + if (errback) { + errback(err); + } + } else { + callback(xhr.responseText); + } + + if (masterConfig.onXhrComplete) { + masterConfig.onXhrComplete(xhr, url); + } + } + }; + xhr.send(null); + }; + } else if (masterConfig.env === 'rhino' || (!masterConfig.env && + typeof Packages !== 'undefined' && typeof java !== 'undefined')) { + //Why Java, why is this so awkward? + text.get = function (url, callback) { + var stringBuffer, line, + encoding = "utf-8", + file = new java.io.File(url), + lineSeparator = java.lang.System.getProperty("line.separator"), + input = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(file), encoding)), + content = ''; + try { + stringBuffer = new java.lang.StringBuffer(); + line = input.readLine(); + + // Byte Order Mark (BOM) - The Unicode Standard, version 3.0, page 324 + // http://www.unicode.org/faq/utf_bom.html + + // Note that when we use utf-8, the BOM should appear as "EF BB BF", but it doesn't due to this bug in the JDK: + // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4508058 + if (line && line.length() && line.charAt(0) === 0xfeff) { + // Eat the BOM, since we've already found the encoding on this file, + // and we plan to concatenating this buffer with others; the BOM should + // only appear at the top of a file. + line = line.substring(1); + } + + if (line !== null) { + stringBuffer.append(line); + } + + while ((line = input.readLine()) !== null) { + stringBuffer.append(lineSeparator); + stringBuffer.append(line); + } + //Make sure we return a JavaScript string and not a Java string. + content = String(stringBuffer.toString()); //String + } finally { + input.close(); + } + callback(content); + }; + } else if (masterConfig.env === 'xpconnect' || (!masterConfig.env && + typeof Components !== 'undefined' && Components.classes && + Components.interfaces)) { + //Avert your gaze! + Cc = Components.classes; + Ci = Components.interfaces; + Components.utils['import']('resource://gre/modules/FileUtils.jsm'); + xpcIsWindows = ('@mozilla.org/windows-registry-key;1' in Cc); + + text.get = function (url, callback) { + var inStream, convertStream, fileObj, + readData = {}; + + if (xpcIsWindows) { + url = url.replace(/\//g, '\\'); + } + + fileObj = new FileUtils.File(url); + + //XPCOM, you so crazy + try { + inStream = Cc['@mozilla.org/network/file-input-stream;1'] + .createInstance(Ci.nsIFileInputStream); + inStream.init(fileObj, 1, 0, false); + + convertStream = Cc['@mozilla.org/intl/converter-input-stream;1'] + .createInstance(Ci.nsIConverterInputStream); + convertStream.init(inStream, "utf-8", inStream.available(), + Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER); + + convertStream.readString(inStream.available(), readData); + convertStream.close(); + inStream.close(); + callback(readData.value); + } catch (e) { + throw new Error((fileObj && fileObj.path || '') + ': ' + e); + } + }; + } + return text; +}); diff --git a/package.json b/package.json index d6dabf36605..297b0446b2f 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ }, "dependencies": {}, "devDependencies": { + "chromedriver": "2.13.0", "commitplease": "2.0.0", "grunt": "0.4.2", "grunt-bowercopy": "1.1.0", @@ -69,8 +70,11 @@ "grunt-git-authors": "2.0.0", "grunt-html": "4.0.1", "grunt-jscs": "1.5.0", + "grunt-selenium-server": "0.1.2", + "intern": "git://github.com/theintern/intern", "load-grunt-tasks": "0.3.0", "rimraf": "2.1.4", + "requirejs": "2.1.17", "testswarm": "1.1.0" }, "keywords": [] diff --git a/tests/config-helper.js b/tests/config-helper.js new file mode 100644 index 00000000000..02d39c4a507 --- /dev/null +++ b/tests/config-helper.js @@ -0,0 +1,34 @@ +define(function () { + // Parse the URL into key/value pairs + function parseUrl() { + var data = {}; + var parts = document.location.search.slice( 1 ).split( "&" ); + var length = parts.length; + var i = 0; + var current; + + for ( ; i < length; i++ ) { + current = parts[ i ].split( "=" ); + data[ current[ 0 ] ] = current[ 1 ]; + } + + return data; + } + + function jqueryUrl () { + var version = parseUrl().jquery; + var url; + + if ( version === "git" || version === "compat-git" ) { + url = "http://code.jquery.com/jquery-" + version; + } else { + url = "external/jquery-" + ( version || "1.11.3" ) + "/jquery"; + } + + return url; + } + + return { + jqueryUrl: jqueryUrl + }; +}); diff --git a/tests/intern-local.js b/tests/intern-local.js new file mode 100644 index 00000000000..9f8ba7d4c4d --- /dev/null +++ b/tests/intern-local.js @@ -0,0 +1,5 @@ +define([ "./intern" ], function (config) { + config.environments = [ { browserName: "chrome" } ]; + config.tunnel = "NullTunnel"; + return config; +}); diff --git a/tests/intern.js b/tests/intern.js new file mode 100644 index 00000000000..ac0baaf6e49 --- /dev/null +++ b/tests/intern.js @@ -0,0 +1,50 @@ + +define( [ "./config-helper" ], function ( configHelper ) { + return { + proxyPort: 9000, + proxyUrl: "http://localhost:9000/", + capabilities: {}, + environments: [ + { browserName: "chrome" }, + { browserName: "internet explorer", version: [ "11", "10", "9" ] }, + // TODO: Firefox 35 is broken for Browserstack, fix when they have Selenium 2.46 + { browserName: "firefox", version: [ "34" ] } + ], + maxConcurrency: 2, + tunnel: "BrowserStackTunnel", + loaders: { + "host-node": "requirejs", + "host-browser": "external/requirejs/require.js" + }, + loaderOptions: { + paths: { + "globalize": "external/globalize/globalize", + "globalize/ja-JP": "external/globalize/globalize.culture.ja-JP", + "jquery": "external/jquery/jquery", + "jquery-simulate": "external/jquery-simulate/jquery.simulate", + "jshint": "external/jshint/jshint", + "lib": "tests/lib", + "qunit-assert-classes": "external/qunit-assert-classes/qunit-assert-classes", + // "qunit-assert-close": "external/qunit-assert-close/qunit-assert-close", + "text": "external/requirejs-text/text", + "ui": "ui", + "unit": "tests/unit", + "intern!qunit": "node_modules/intern/lib/interfaces/qunit" + }, + map: { + "*": { + "qunit": "intern!qunit" + } + }, + shim: { + "globalize/ja-JP": [ "globalize" ], + "jquery-simulate": [ "jquery" ], + "qunit-assert-close": [ "qunit" ] + } + }, + suites: [ + "tests/unit/all", + ], + excludeInstrumentation: /^(?:node_modules|test)\// + }; +}); diff --git a/tests/lib/bootstrap.js b/tests/lib/bootstrap.js index 47289494cc3..3bd39f840e2 100644 --- a/tests/lib/bootstrap.js +++ b/tests/lib/bootstrap.js @@ -1,146 +1,81 @@ -( function() { +define( [], function() { -requirejs.config({ - paths: { - "globalize": "../../../external/globalize/globalize", - "globalize/ja-JP": "../../../external/globalize/globalize.culture.ja-JP", - "jquery": jqueryUrl(), - "jquery-simulate": "../../../external/jquery-simulate/jquery.simulate", - "jshint": "../../../external/jshint/jshint", - "lib": "../../lib", - "phantom-bridge": "../../../node_modules/grunt-contrib-qunit/phantomjs/bridge", - "qunit-assert-classes": "../../../external/qunit-assert-classes/qunit-assert-classes", - "qunit-assert-close": "../../../external/qunit-assert-close/qunit-assert-close", - "qunit": "../../../external/qunit/qunit", - "testswarm": "http://swarm.jquery.org/js/inject.js?" + (new Date()).getTime(), - "ui": "../../../ui" - }, - shim: { - "globalize/ja-JP": [ "globalize" ], - "jquery-simulate": [ "jquery" ], - "qunit-assert-close": [ "qunit" ], - "testswarm": [ "qunit" ] - } -}); - -// Create a module that disables back compat for UI modules -define( "jquery-no-back-compat", [ "jquery" ], function( $ ) { - $.uiBackCompat = false; - - return $; -} ); - -// Create a dummy bridge if we're not actually testing in PhantomJS -if ( !/PhantomJS/.test( navigator.userAgent ) ) { - define( "phantom-bridge", function() {} ); -} - -// Load all modules in series -function requireModules( dependencies, callback, modules ) { - if ( !dependencies.length ) { - if ( callback ) { - callback.apply( null, modules ); - } - return; - } - - if ( !modules ) { - modules = []; - } + // Create a module that disables back compat for UI modules + define( "jquery-no-back-compat", [ "jquery" ], function( $ ) { + $.uiBackCompat = false; - var dependency = dependencies.shift(); - require( [ dependency ], function( module ) { - modules.push( module ); - requireModules( dependencies, callback, modules ); + return $; } ); -} - -// Load a set of test file along with the required test infrastructure -function requireTests( dependencies, noBackCompat ) { - dependencies = [ - "lib/qunit", - noBackCompat ? "jquery-no-back-compat" : "jquery", - "jquery-simulate" - ].concat( dependencies ); - - // Load the TestSwarm injector, if necessary - if ( parseUrl().swarmURL ) { - dependencies.push( "testswarm" ); - } - requireModules( dependencies, function( QUnit ) { - QUnit.start(); - } ); -} + // Load all modules in series + function requireModules( dependencies, callback, modules ) { + if ( !dependencies.length ) { + if ( callback ) { + callback.apply( null, modules ); + } + return; + } -// Parse the URL into key/value pairs -function parseUrl() { - var data = {}; - var parts = document.location.search.slice( 1 ).split( "&" ); - var length = parts.length; - var i = 0; - var current; + if ( !modules ) { + modules = []; + } - for ( ; i < length; i++ ) { - current = parts[ i ].split( "=" ); - data[ current[ 0 ] ] = current[ 1 ]; + var dependency = dependencies.shift(); + require( [ dependency ], function( module ) { + modules.push( module ); + requireModules( dependencies, callback, modules ); + } ); } - return data; -} - -function jqueryUrl() { - var version = parseUrl().jquery; - var url; - - if ( version === "git" || version === "compat-git" ) { - url = "http://code.jquery.com/jquery-" + version; - } else { - url = "../../../external/jquery-" + ( version || "1.11.3" ) + "/jquery"; + // Load a set of test file along with the required test infrastructure + function requireTests( dependencies, noBackCompat ) { + dependencies = [ + "lib/qunit", + noBackCompat ? "jquery-no-back-compat" : "jquery", + "jquery-simulate" + ].concat( dependencies ); + + requireModules( dependencies, function( QUnit ) { + QUnit.start(); + } ); } - return url; -} - -// Load test modules based on data attributes -// - data-modules: list of test modules to load -// - data-widget: A widget to load test modules for -// - Automatically loads common, core, events, methods, and options -// - data-deprecated: Loads the deprecated test modules for a widget -// - data-no-back-compat: Set $.uiBackCompat to false -(function() { - // Find the script element - var scripts = document.getElementsByTagName( "script" ); - var script = scripts[ scripts.length - 1 ]; - - // Read the modules - var modules = script.getAttribute( "data-modules" ); - if ( modules ) { - modules = modules - .replace( /^\s+|\s+$/g, "" ) - .split( /\s+/ ); - } else { - modules = []; - } - var widget = script.getAttribute( "data-widget" ); - var deprecated = !!script.getAttribute( "data-deprecated" ); - var noBackCompat = !!script.getAttribute( "data-no-back-compat" ); - - if ( widget ) { - modules = modules.concat([ - ( deprecated ? "common-deprecated" : "common" ), - "core", - "events", - "methods", - "options" - ]); - if ( deprecated ) { - modules = modules.concat( "deprecated" ); + // Load test modules based on data attributes + // - modules: list of test modules to load + // - widget: A widget to load test modules for + // - Automatically loads common, core, events, methods, and options + // - deprecated: Loads the deprecated test modules for a widget + // - no-back-compat: Set $.uiBackCompat to false + return function( options ) { + + // Read the modules + var modules = options[ "modules" ]; + if ( modules ) { + modules = modules + .replace( /^\s+|\s+$/g, "" ) + .split( /\s+/ ); + } else { + modules = []; + } + var widget = options[ "widget" ]; + var deprecated = !!options[ "deprecated" ]; + var noBackCompat = !!options[ "no-back-compat" ]; + + if ( widget ) { + modules = modules.concat([ + ( deprecated ? "common-deprecated" : "common" ), + "core", + "events", + "methods", + "options" + ]); + if ( deprecated ) { + modules = modules.concat( "deprecated" ); + } } - } - requireTests( modules, noBackCompat ); -} )(); + requireTests( modules, noBackCompat ); + }; -} )(); +}) ; diff --git a/tests/lib/common.js b/tests/lib/common.js index 9faa4e246b1..dab6ce7c377 100644 --- a/tests/lib/common.js +++ b/tests/lib/common.js @@ -1,6 +1,7 @@ define([ + "lib/qunit", "jquery" -], function( $ ) { +], function( QUnit, $ ) { var exports = {}; @@ -8,39 +9,39 @@ function testWidgetDefaults( widget, defaults ) { var pluginDefaults = $.ui[ widget ].prototype.options; // Ensure that all defaults have the correct value - test( "defined defaults", function() { + QUnit.test( "defined defaults", function( assert ) { var count = 0; $.each( defaults, function( key, val ) { - expect( ++count ); + assert.expect( ++count ); if ( $.isFunction( val ) ) { - ok( $.isFunction( pluginDefaults[ key ] ), key ); + assert.ok( $.isFunction( pluginDefaults[ key ] ), key ); return; } - deepEqual( pluginDefaults[ key ], val, key ); + assert.deepEqual( pluginDefaults[ key ], val, key ); }); }); // Ensure that all defaults were tested - test( "tested defaults", function() { + QUnit.test( "tested defaults", function( assert ) { var count = 0; $.each( pluginDefaults, function( key ) { - expect( ++count ); - ok( key in defaults, key ); + assert.expect( ++count ); + assert.ok( key in defaults, key ); }); }); } function testWidgetOverrides( widget ) { if ( $.uiBackCompat === false ) { - test( "$.widget overrides", function() { - expect( 4 ); + QUnit.test( "$.widget overrides", function( assert ) { + assert.expect( 4 ); $.each([ "_createWidget", "destroy", "option", "_trigger" ], function( i, method ) { - strictEqual( $.ui[ widget ].prototype[ method ], + assert.strictEqual( $.ui[ widget ].prototype[ method ], $.Widget.prototype[ method ], "should not override " + method ); }); }); @@ -48,32 +49,32 @@ function testWidgetOverrides( widget ) { } function testBasicUsage( widget ) { - test( "basic usage", function() { - expect( 3 ); + QUnit.test( "basic usage", function( assert ) { + assert.expect( 3 ); var defaultElement = $.ui[ widget ].prototype.defaultElement; $( defaultElement ).appendTo( "body" )[ widget ]().remove(); - ok( true, "initialized on element" ); + assert.ok( true, "initialized on element" ); $( defaultElement )[ widget ]().remove(); - ok( true, "initialized on disconnected DOMElement - never connected" ); + assert.ok( true, "initialized on disconnected DOMElement - never connected" ); // Ensure manipulating removed elements works (#3664) $( defaultElement ).appendTo( "body" ).remove()[ widget ]().remove(); - ok( true, "initialized on disconnected DOMElement - removed" ); + assert.ok( true, "initialized on disconnected DOMElement - removed" ); }); } exports.testWidget = function( widget, settings ) { - module( widget + ": common widget" ); + QUnit.module( widget + ": common widget" ); - exports.testJshint( widget ); + // exports.testJshint( widget ); testWidgetDefaults( widget, settings.defaults ); testWidgetOverrides( widget ); testBasicUsage( widget ); - test( "version", function() { - expect( 1 ); - ok( "version" in $.ui[ widget ].prototype, "version property exists" ); + QUnit.test( "version", function( assert ) { + assert.expect( 1 ); + assert.ok( "version" in $.ui[ widget ].prototype, "version property exists" ); }); }; @@ -81,13 +82,14 @@ exports.testJshint = function( module ) { // Function.prototype.bind check is needed because JSHint doesn't work in ES3 browsers anymore // https://github.com/jshint/jshint/issues/1384 - if ( QUnit.urlParams.nojshint || !Function.prototype.bind ) { + if ( //QUnit.urlParams.nojshint || + !Function.prototype.bind ) { return; } - asyncTest( "JSHint", function() { + QUnit.asyncTest( "JSHint", function( assert ) { require( [ "jshint" ], function() { - expect( 1 ); + assert.expect( 1 ); $.when( $.ajax( { @@ -117,12 +119,12 @@ exports.testJshint = function( module ) { return "[L" + error.line + ":C" + error.character + "] " + error.reason + "\n" + error.evidence + "\n"; } ).join( "\n" ); - ok( passed, errors ); - start(); + assert.ok( passed, errors ); + QUnit.start(); } ) .fail(function( hintError, srcError ) { - ok( false, "error loading source: " + ( hintError || srcError ).statusText ); - start(); + assert.ok( false, "error loading source: " + ( hintError || srcError ).statusText ); + QUnit.start(); } ); }); }); diff --git a/tests/lib/css.js b/tests/lib/css.js index 37353e912ef..7997f20b175 100644 --- a/tests/lib/css.js +++ b/tests/lib/css.js @@ -1,23 +1,27 @@ -(function() { +define( [], function () { + return function( options ) { -function includeStyle( url ) { - document.write( "" ); -} + function includeStyle( url ) { + var link = document.createElement( "link" ); + link.rel = "stylesheet" + link.href = "../../" + url; + document.head.appendChild( link ); + } -// Find the script element -var scripts = document.getElementsByTagName( "script" ); -var script = scripts[ scripts.length - 1 ]; + // Find the script element + var scripts = document.getElementsByTagName( "script" ); + var script = scripts[ scripts.length - 1 ]; -// Load the modules -var modules = script.getAttribute( "data-modules" ); -if ( modules ) { - modules = modules.split( /\s+/ ); - for ( var i = 0; i < modules.length; i++ ) { - includeStyle( "themes/base/" + modules[ i ] + ".css" ); - } -} - -// Load the QUnit stylesheet -includeStyle( "external/qunit/qunit.css" ); + // Load the modules + var modules = options[ "data-modules" ]; + if ( modules ) { + modules = modules.split( /\s+/ ); + for ( var i = 0; i < modules.length; i++ ) { + includeStyle( "themes/base/" + modules[ i ] + ".css" ); + } + } -} )(); + // Load the QUnit stylesheet + includeStyle( "external/qunit/qunit.css" ); + } +}); diff --git a/tests/lib/helper.js b/tests/lib/helper.js index cc7d8c00032..eded5c4486f 100644 --- a/tests/lib/helper.js +++ b/tests/lib/helper.js @@ -1,5 +1,6 @@ define([ - "jquery" + "jquery", + "qunit" ], function( $ ) { var exports = {}; diff --git a/tests/lib/qunit-assert-domequal.js b/tests/lib/qunit-assert-domequal.js index ba516453d9d..c40f9769afa 100644 --- a/tests/lib/qunit-assert-domequal.js +++ b/tests/lib/qunit-assert-domequal.js @@ -5,7 +5,7 @@ * otherwise the text. Then compares the result using deepEqual(). */ define( [ - "qunit", + "intern!qunit", "jquery" ], function( QUnit, $ ) { @@ -18,7 +18,7 @@ var domEqual = QUnit.assert.domEqual = function( selector, modifier, message ) { function done() { var actual = extract( selector, message ); - assert.push( QUnit.equiv( actual, expected ), actual, expected, message ); + assert.deepEqual( actual, expected, message ); } // Run modifier (async or sync), then compare state via done() diff --git a/tests/lib/qunit.js b/tests/lib/qunit.js index 87ef8b6625d..2b66d3d0f34 100644 --- a/tests/lib/qunit.js +++ b/tests/lib/qunit.js @@ -1,36 +1,35 @@ define( [ - "qunit", + "intern!qunit", "jquery", "qunit-assert-classes", - "qunit-assert-close", + "external/qunit-assert-close/qunit-assert-close", "lib/qunit-assert-domequal", - "phantom-bridge" + // "phantom-bridge" ], function( QUnit, $ ) { -QUnit.config.autostart = false; QUnit.config.requireExpects = true; - -QUnit.config.urlConfig.push({ - id: "nojshint", - label: "Skip JSHint", - tooltip: "Skip running JSHint, e.g., within TestSwarm, where Jenkins runs it already" -}); - -QUnit.config.urlConfig.push({ - id: "jquery", - label: "jQuery version", - value: [ - "1.7.0", "1.7.1", "1.7.2", - "1.8.0", "1.8.1", "1.8.2", "1.8.3", - "1.9.0", "1.9.1", - "1.10.0", "1.10.1", "1.10.2", - "1.11.0", "1.11.1", "1.11.2", "1.11.3", - "2.0.0", "2.0.1", "2.0.2", "2.0.3", - "2.1.0", "2.1.1", "2.1.2", "2.1.3", - "compat-git", "git", "custom" - ], - tooltip: "Which jQuery Core version to test against" -}); +QUnit.config.testTimeout = 10000; +// QUnit.config.urlConfig.push({ +// id: "nojshint", +// label: "Skip JSHint", +// tooltip: "Skip running JSHint, e.g., within TestSwarm, where Jenkins runs it already" +// }); + +// QUnit.config.urlConfig.push({ +// id: "jquery", +// label: "jQuery version", +// value: [ +// "1.7.0", "1.7.1", "1.7.2", +// "1.8.0", "1.8.1", "1.8.2", "1.8.3", +// "1.9.0", "1.9.1", +// "1.10.0", "1.10.1", "1.10.2", +// "1.11.0", "1.11.1", "1.11.2", "1.11.3", +// "2.0.0", "2.0.1", "2.0.2", "2.0.3", +// "2.1.0", "2.1.1", "2.1.2", "2.1.3", +// "compat-git", "git", "custom" +// ], +// tooltip: "Which jQuery Core version to test against" +// }); QUnit.reset = ( function( reset ) { return function() { diff --git a/tests/unit/accordion/accordion.html b/tests/unit/accordion/accordion.html index 683b87456cb..5d4879805aa 100644 --- a/tests/unit/accordion/accordion.html +++ b/tests/unit/accordion/accordion.html @@ -1,12 +1,4 @@ - - - - - jQuery UI Accordion Test Suite - - - - +
- - -
-
-
-

There is one obvious advantage:

-
-

- You've seen it coming! -
- Buy now and get nothing for free! -
- Well, at least no free beer. Perhaps a bear, if you can afford it. -

-
-

Now that you've got...

-
-

- your bear, you have to admit it! -
- No, we aren't selling bears. -

-

- We could talk about renting one. -

-
-

Rent one bear, ...

-
-

- get two for three beer. -

-

- And now, for something completely different. -

+
+

There is one obvious advantage:

+
+

+ You've seen it coming! +
+ Buy now and get nothing for free! +
+ Well, at least no free beer. Perhaps a bear, if you can afford it. +

+
+

Now that you've got...

+
+

+ your bear, you have to admit it! +
+ No, we aren't selling bears. +

+

+ We could talk about renting one. +

+
+

Rent one bear, ...

+
+

+ get two for three beer. +

+

+ And now, for something completely different. +

+
-
- - -
-
- Accordion Header 1 -
-
- Accordion Content 1 -
-
- Accordion Header 2 -
-
- Accordion Content 2 -
-
- Accordion Header 3 -
-
- Accordion Content 3 -
-
+ +
+
+ Accordion Header 1 +
+
+ Accordion Content 1 +
+
+ Accordion Header 2 +
+
+ Accordion Content 2 +
+
+ Accordion Header 3 +
+
+ Accordion Content 3 +
+
- - diff --git a/tests/unit/accordion/core.js b/tests/unit/accordion/core.js index 0a39311624c..cd29e1506e0 100644 --- a/tests/unit/accordion/core.js +++ b/tests/unit/accordion/core.js @@ -1,129 +1,130 @@ define( [ + "lib/qunit", "jquery", "./helper", "ui/accordion" -], function( $, testHelper ) { +], function( QUnit, $, testHelper ) { var setupTeardown = testHelper.setupTeardown, state = testHelper.state; -module( "accordion: core", setupTeardown() ); +QUnit.module( "accordion: core", setupTeardown() ); $.each( { div: "#list1", ul: "#navigation", dl: "#accordion-dl" }, function( type, selector ) { - test( "markup structure: " + type, function( assert ) { - expect( 10 ); + QUnit.test( "markup structure: " + type, function( assert ) { + assert.expect( 10 ); var element = $( selector ).accordion(), headers = element.find( ".ui-accordion-header" ), content = headers.next(); assert.hasClasses( element, "ui-accordion ui-widget" ); - equal( headers.length, 3, ".ui-accordion-header elements exist, correct number" ); + assert.equal( headers.length, 3, ".ui-accordion-header elements exist, correct number" ); assert.hasClasses( headers[ 0 ], "ui-accordion-header ui-accordion-header-active ui-accordion-icons" ); assert.hasClasses( headers[ 1 ], "ui-accordion-header ui-accordion-header-collapsed ui-accordion-icons" ); assert.hasClasses( headers[ 2 ], "ui-accordion-header ui-accordion-header-collapsed ui-accordion-icons" ); - equal( content.length, 3, ".ui-accordion-content elements exist, correct number" ); + assert.equal( content.length, 3, ".ui-accordion-content elements exist, correct number" ); assert.hasClasses( content[ 0 ], "ui-accordion-content ui-widget-content ui-accordion-content-active" ); assert.hasClasses( content[ 1 ], "ui-accordion-content ui-widget-content" ); assert.hasClasses( content[ 2 ], "ui-accordion-content ui-widget-content" ); - deepEqual( element.find( ".ui-accordion-header" ).next().get(), + assert.deepEqual( element.find( ".ui-accordion-header" ).next().get(), element.find( ".ui-accordion-content" ).get(), "content panels come immediately after headers" ); }); }); -test( "handle click on header-descendant", function() { - expect( 1 ); +QUnit.test( "handle click on header-descendant", function( assert ) { + assert.expect( 1 ); var element = $( "#navigation" ).accordion(); $( "#navigation h2:eq(1) a" ).trigger( "click" ); - state( element, 0, 1, 0 ); + state( assert, element, 0, 1, 0 ); }); -test( "accessibility", function () { - expect( 61 ); +QUnit.test( "accessibility", function ( assert ) { + assert.expect( 61 ); var element = $( "#list1" ).accordion({ active: 1, collapsible: true }), headers = element.find( ".ui-accordion-header" ); - equal( element.attr( "role" ), "tablist", "element role" ); + assert.equal( element.attr( "role" ), "tablist", "element role" ); headers.each(function( i ) { var header = headers.eq( i ), panel = header.next(); - equal( header.attr( "role" ), "tab", "header " + i + " role" ); - equal( header.attr( "aria-controls" ), panel.attr( "id" ), "header " + i + " aria-controls" ); - equal( panel.attr( "role" ), "tabpanel", "panel " + i + " role" ); - equal( panel.attr( "aria-labelledby" ), header.attr( "id" ), "panel " + i + " aria-labelledby" ); + assert.equal( header.attr( "role" ), "tab", "header " + i + " role" ); + assert.equal( header.attr( "aria-controls" ), panel.attr( "id" ), "header " + i + " aria-controls" ); + assert.equal( panel.attr( "role" ), "tabpanel", "panel " + i + " role" ); + assert.equal( panel.attr( "aria-labelledby" ), header.attr( "id" ), "panel " + i + " aria-labelledby" ); }); - equal( headers.eq( 1 ).attr( "tabindex" ), 0, "active header has tabindex=0" ); - equal( headers.eq( 1 ).attr( "aria-selected" ), "true", "active tab (1) has aria-selected=true" ); - equal( headers.eq( 1 ).attr( "aria-expanded" ), "true", "active tab (1) has aria-expanded=true" ); - equal( headers.eq( 1 ).next().attr( "aria-hidden" ), "false", "active tabpanel (1) has aria-hidden=false" ); - equal( headers.eq( 0 ).attr( "tabindex" ), -1, "inactive header (0) has tabindex=-1" ); - equal( headers.eq( 0 ).attr( "aria-selected" ), "false", "inactive tab (0) has aria-selected=false" ); - equal( headers.eq( 0 ).attr( "aria-expanded" ), "false", "inactive tab (0) has aria-expanded=false" ); - equal( headers.eq( 0 ).next().attr( "aria-hidden" ), "true", "inactive tabpanel (0) has aria-hidden=true" ); - equal( headers.eq( 2 ).attr( "tabindex" ), -1, "inactive header (2) has tabindex=-1" ); - equal( headers.eq( 2 ).attr( "aria-selected" ), "false", "inactive tab (2) has aria-selected=false" ); - equal( headers.eq( 2 ).attr( "aria-expanded" ), "false", "inactive tab (2) has aria-expanded=false" ); - equal( headers.eq( 2 ).next().attr( "aria-hidden" ), "true", "inactive tabpanel (2) has aria-hidden=true" ); + assert.equal( headers.eq( 1 ).attr( "tabindex" ), 0, "active header has tabindex=0" ); + assert.equal( headers.eq( 1 ).attr( "aria-selected" ), "true", "active tab (1) has aria-selected=true" ); + assert.equal( headers.eq( 1 ).attr( "aria-expanded" ), "true", "active tab (1) has aria-expanded=true" ); + assert.equal( headers.eq( 1 ).next().attr( "aria-hidden" ), "false", "active tabpanel (1) has aria-hidden=false" ); + assert.equal( headers.eq( 0 ).attr( "tabindex" ), -1, "inactive header (0) has tabindex=-1" ); + assert.equal( headers.eq( 0 ).attr( "aria-selected" ), "false", "inactive tab (0) has aria-selected=false" ); + assert.equal( headers.eq( 0 ).attr( "aria-expanded" ), "false", "inactive tab (0) has aria-expanded=false" ); + assert.equal( headers.eq( 0 ).next().attr( "aria-hidden" ), "true", "inactive tabpanel (0) has aria-hidden=true" ); + assert.equal( headers.eq( 2 ).attr( "tabindex" ), -1, "inactive header (2) has tabindex=-1" ); + assert.equal( headers.eq( 2 ).attr( "aria-selected" ), "false", "inactive tab (2) has aria-selected=false" ); + assert.equal( headers.eq( 2 ).attr( "aria-expanded" ), "false", "inactive tab (2) has aria-expanded=false" ); + assert.equal( headers.eq( 2 ).next().attr( "aria-hidden" ), "true", "inactive tabpanel (2) has aria-hidden=true" ); element.accordion( "option", "active", 0 ); - equal( headers.eq( 0 ).attr( "tabindex" ), 0, "active header (0) has tabindex=0" ); - equal( headers.eq( 0 ).attr( "aria-selected" ), "true", "active tab (0) has aria-selected=true" ); - equal( headers.eq( 0 ).attr( "aria-expanded" ), "true", "active tab (0) has aria-expanded=true" ); - equal( headers.eq( 0 ).next().attr( "aria-hidden" ), "false", "active tabpanel (0) has aria-hidden=false" ); - equal( headers.eq( 1 ).attr( "tabindex" ), -1, "inactive header (1) has tabindex=-1" ); - equal( headers.eq( 1 ).attr( "aria-selected" ), "false", "inactive tab (1) has aria-selected=false" ); - equal( headers.eq( 1 ).attr( "aria-expanded" ), "false", "inactive tab (1) has aria-expanded=false" ); - equal( headers.eq( 1 ).next().attr( "aria-hidden" ), "true", "inactive tabpanel (1) has aria-hidden=true" ); - equal( headers.eq( 2 ).attr( "tabindex" ), -1, "inactive header (2) has tabindex=-1" ); - equal( headers.eq( 2 ).attr( "aria-selected" ), "false", "inactive tab (2) has aria-selected=false" ); - equal( headers.eq( 2 ).attr( "aria-expanded" ), "false", "inactive tab (2) has aria-expanded=false" ); - equal( headers.eq( 2 ).next().attr( "aria-hidden" ), "true", "inactive tabpanel (2) has aria-hidden=true" ); + assert.equal( headers.eq( 0 ).attr( "tabindex" ), 0, "active header (0) has tabindex=0" ); + assert.equal( headers.eq( 0 ).attr( "aria-selected" ), "true", "active tab (0) has aria-selected=true" ); + assert.equal( headers.eq( 0 ).attr( "aria-expanded" ), "true", "active tab (0) has aria-expanded=true" ); + assert.equal( headers.eq( 0 ).next().attr( "aria-hidden" ), "false", "active tabpanel (0) has aria-hidden=false" ); + assert.equal( headers.eq( 1 ).attr( "tabindex" ), -1, "inactive header (1) has tabindex=-1" ); + assert.equal( headers.eq( 1 ).attr( "aria-selected" ), "false", "inactive tab (1) has aria-selected=false" ); + assert.equal( headers.eq( 1 ).attr( "aria-expanded" ), "false", "inactive tab (1) has aria-expanded=false" ); + assert.equal( headers.eq( 1 ).next().attr( "aria-hidden" ), "true", "inactive tabpanel (1) has aria-hidden=true" ); + assert.equal( headers.eq( 2 ).attr( "tabindex" ), -1, "inactive header (2) has tabindex=-1" ); + assert.equal( headers.eq( 2 ).attr( "aria-selected" ), "false", "inactive tab (2) has aria-selected=false" ); + assert.equal( headers.eq( 2 ).attr( "aria-expanded" ), "false", "inactive tab (2) has aria-expanded=false" ); + assert.equal( headers.eq( 2 ).next().attr( "aria-hidden" ), "true", "inactive tabpanel (2) has aria-hidden=true" ); element.accordion( "option", "active", false ); - equal( headers.eq( 0 ).attr( "tabindex" ), 0, "previously active header (0) has tabindex=0" ); - equal( headers.eq( 0 ).attr( "aria-selected" ), "false", "inactive tab (0) has aria-selected=false" ); - equal( headers.eq( 0 ).attr( "aria-expanded" ), "false", "inactive tab (0) has aria-expanded=false" ); - equal( headers.eq( 0 ).next().attr( "aria-hidden" ), "true", "inactive tabpanel (0) has aria-hidden=true" ); - equal( headers.eq( 1 ).attr( "tabindex" ), -1, "inactive header (1) has tabindex=-1" ); - equal( headers.eq( 1 ).attr( "aria-selected" ), "false", "inactive tab (1) has aria-selected=false" ); - equal( headers.eq( 1 ).attr( "aria-expanded" ), "false", "inactive tab (1) has aria-expanded=false" ); - equal( headers.eq( 1 ).next().attr( "aria-hidden" ), "true", "inactive tabpanel (1) has aria-hidden=true" ); - equal( headers.eq( 2 ).attr( "tabindex" ), -1, "inactive header (2) has tabindex=-1" ); - equal( headers.eq( 2 ).attr( "aria-selected" ), "false", "inactive tab (2) has aria-selected=false" ); - equal( headers.eq( 2 ).attr( "aria-expanded" ), "false", "inactive tab (2) has aria-expanded=false" ); - equal( headers.eq( 2 ).next().attr( "aria-hidden" ), "true", "inactive tabpanel (2) has aria-hidden=true" ); + assert.equal( headers.eq( 0 ).attr( "tabindex" ), 0, "previously active header (0) has tabindex=0" ); + assert.equal( headers.eq( 0 ).attr( "aria-selected" ), "false", "inactive tab (0) has aria-selected=false" ); + assert.equal( headers.eq( 0 ).attr( "aria-expanded" ), "false", "inactive tab (0) has aria-expanded=false" ); + assert.equal( headers.eq( 0 ).next().attr( "aria-hidden" ), "true", "inactive tabpanel (0) has aria-hidden=true" ); + assert.equal( headers.eq( 1 ).attr( "tabindex" ), -1, "inactive header (1) has tabindex=-1" ); + assert.equal( headers.eq( 1 ).attr( "aria-selected" ), "false", "inactive tab (1) has aria-selected=false" ); + assert.equal( headers.eq( 1 ).attr( "aria-expanded" ), "false", "inactive tab (1) has aria-expanded=false" ); + assert.equal( headers.eq( 1 ).next().attr( "aria-hidden" ), "true", "inactive tabpanel (1) has aria-hidden=true" ); + assert.equal( headers.eq( 2 ).attr( "tabindex" ), -1, "inactive header (2) has tabindex=-1" ); + assert.equal( headers.eq( 2 ).attr( "aria-selected" ), "false", "inactive tab (2) has aria-selected=false" ); + assert.equal( headers.eq( 2 ).attr( "aria-expanded" ), "false", "inactive tab (2) has aria-expanded=false" ); + assert.equal( headers.eq( 2 ).next().attr( "aria-hidden" ), "true", "inactive tabpanel (2) has aria-hidden=true" ); element.accordion( "option", "active", 1 ); - equal( headers.eq( 1 ).attr( "tabindex" ), 0, "active header has tabindex=0" ); - equal( headers.eq( 1 ).attr( "aria-selected" ), "true", "active tab (1) has aria-selected=true" ); - equal( headers.eq( 1 ).attr( "aria-expanded" ), "true", "active tab (1) has aria-expanded=true" ); - equal( headers.eq( 1 ).next().attr( "aria-hidden" ), "false", "active tabpanel (1) has aria-hidden=false" ); - equal( headers.eq( 0 ).attr( "tabindex" ), -1, "inactive header (0) has tabindex=-1" ); - equal( headers.eq( 0 ).attr( "aria-selected" ), "false", "inactive tab (0) has aria-selected=false" ); - equal( headers.eq( 0 ).attr( "aria-expanded" ), "false", "inactive tab (0) has aria-expanded=false" ); - equal( headers.eq( 0 ).next().attr( "aria-hidden" ), "true", "inactive tabpanel (0) has aria-hidden=true" ); - equal( headers.eq( 2 ).attr( "tabindex" ), -1, "inactive header (2) has tabindex=-1" ); - equal( headers.eq( 2 ).attr( "aria-selected" ), "false", "inactive tab (2) has aria-selected=false" ); - equal( headers.eq( 2 ).attr( "aria-expanded" ), "false", "inactive tab (2) has aria-expanded=false" ); - equal( headers.eq( 2 ).next().attr( "aria-hidden" ), "true", "inactive tabpanel (2) has aria-hidden=true" ); + assert.equal( headers.eq( 1 ).attr( "tabindex" ), 0, "active header has tabindex=0" ); + assert.equal( headers.eq( 1 ).attr( "aria-selected" ), "true", "active tab (1) has aria-selected=true" ); + assert.equal( headers.eq( 1 ).attr( "aria-expanded" ), "true", "active tab (1) has aria-expanded=true" ); + assert.equal( headers.eq( 1 ).next().attr( "aria-hidden" ), "false", "active tabpanel (1) has aria-hidden=false" ); + assert.equal( headers.eq( 0 ).attr( "tabindex" ), -1, "inactive header (0) has tabindex=-1" ); + assert.equal( headers.eq( 0 ).attr( "aria-selected" ), "false", "inactive tab (0) has aria-selected=false" ); + assert.equal( headers.eq( 0 ).attr( "aria-expanded" ), "false", "inactive tab (0) has aria-expanded=false" ); + assert.equal( headers.eq( 0 ).next().attr( "aria-hidden" ), "true", "inactive tabpanel (0) has aria-hidden=true" ); + assert.equal( headers.eq( 2 ).attr( "tabindex" ), -1, "inactive header (2) has tabindex=-1" ); + assert.equal( headers.eq( 2 ).attr( "aria-selected" ), "false", "inactive tab (2) has aria-selected=false" ); + assert.equal( headers.eq( 2 ).attr( "aria-expanded" ), "false", "inactive tab (2) has aria-expanded=false" ); + assert.equal( headers.eq( 2 ).next().attr( "aria-hidden" ), "true", "inactive tabpanel (2) has aria-hidden=true" ); }); -asyncTest( "keyboard support", function( assert ) { - expect( 13 ); +QUnit.asyncTest( "keyboard support", function( assert ) { + assert.expect( 13 ); var element = $( "#list1" ).accordion(), headers = element.find( ".ui-accordion-header" ), anchor = headers.eq( 1 ).next().find( "a" ).eq( 0 ), keyCode = $.ui.keyCode; - equal( headers.filter( ".ui-state-focus" ).length, 0, "no headers focused on init" ); + assert.equal( headers.filter( ".ui-state-focus" ).length, 0, "no headers focused on init" ); headers.eq( 0 ).simulate( "focus" ); setTimeout( step1 ); @@ -180,13 +181,13 @@ asyncTest( "keyboard support", function( assert ) { } function step9() { - equal( element.accordion( "option", "active" ) , 2, "ENTER activates panel" ); + assert.equal( element.accordion( "option", "active" ) , 2, "ENTER activates panel" ); headers.eq( 1 ).simulate( "keydown", { keyCode: keyCode.SPACE } ); setTimeout( step10 ); } function step10() { - equal( element.accordion( "option", "active" ), 1, "SPACE activates panel" ); + assert.equal( element.accordion( "option", "active" ), 1, "SPACE activates panel" ); anchor.simulate( "focus" ); setTimeout( step11 ); } @@ -200,7 +201,7 @@ asyncTest( "keyboard support", function( assert ) { function step12() { assert.hasClasses( headers.eq( 1 ), "ui-state-focus", "CTRL+UP moves focus to header" ); - start(); + QUnit.start(); } }); diff --git a/tests/unit/accordion/events.js b/tests/unit/accordion/events.js index fef1a0aac50..ccf56bdabb0 100644 --- a/tests/unit/accordion/events.js +++ b/tests/unit/accordion/events.js @@ -1,16 +1,17 @@ define( [ + "lib/qunit", "jquery", "./helper", "ui/accordion" -], function( $, testHelper ) { +], function( QUnit, $, testHelper ) { var setupTeardown = testHelper.setupTeardown, state = testHelper.state; -module( "accordion: events", setupTeardown() ); +QUnit.module( "accordion: events", setupTeardown() ); -test( "create", function() { - expect( 10 ); +QUnit.test( "create", function( assert ) { + assert.expect( 10 ); var element = $( "#list1" ), headers = element.children( "h3" ), @@ -18,10 +19,10 @@ test( "create", function() { element.accordion({ create: function( event, ui ) { - equal( ui.header.length, 1, "header length" ); - strictEqual( ui.header[ 0 ], headers[ 0 ], "header" ); - equal( ui.panel.length, 1, "panel length" ); - strictEqual( ui.panel[ 0 ], contents[ 0 ], "panel" ); + assert.equal( ui.header.length, 1, "header length" ); + assert.strictEqual( ui.header[ 0 ], headers[ 0 ], "header" ); + assert.equal( ui.panel.length, 1, "panel length" ); + assert.strictEqual( ui.panel[ 0 ], contents[ 0 ], "panel" ); } }); element.accordion( "destroy" ); @@ -29,10 +30,10 @@ test( "create", function() { element.accordion({ active: 2, create: function( event, ui ) { - equal( ui.header.length, 1, "header length" ); - strictEqual( ui.header[ 0 ], headers[ 2 ], "header" ); - equal( ui.panel.length, 1, "panel length" ); - strictEqual( ui.panel[ 0 ], contents[ 2 ], "panel" ); + assert.equal( ui.header.length, 1, "header length" ); + assert.strictEqual( ui.header[ 0 ], headers[ 2 ], "header" ); + assert.equal( ui.panel.length, 1, "panel length" ); + assert.strictEqual( ui.panel[ 0 ], contents[ 2 ], "panel" ); } }); element.accordion( "destroy" ); @@ -41,15 +42,15 @@ test( "create", function() { active: false, collapsible: true, create: function( event, ui ) { - equal( ui.header.length, 0, "header length" ); - equal( ui.panel.length, 0, "panel length" ); + assert.equal( ui.header.length, 0, "header length" ); + assert.equal( ui.panel.length, 0, "panel length" ); } }); element.accordion( "destroy" ); }); -test( "beforeActivate", function() { - expect( 38 ); +QUnit.test( "beforeActivate", function( assert ) { + assert.expect( 38 ); var element = $( "#list1" ).accordion({ active: false, collapsible: true @@ -58,63 +59,63 @@ test( "beforeActivate", function() { content = element.find( ".ui-accordion-content" ); element.one( "accordionbeforeactivate", function( event, ui ) { - ok( !( "originalEvent" in event ) ); - equal( ui.oldHeader.length, 0 ); - equal( ui.oldPanel.length, 0 ); - equal( ui.newHeader.length, 1 ); - strictEqual( ui.newHeader[ 0 ], headers[ 0 ] ); - equal( ui.newPanel.length, 1 ); - strictEqual( ui.newPanel[ 0 ], content[ 0 ] ); - state( element, 0, 0, 0 ); + assert.ok( !( "originalEvent" in event ) ); + assert.equal( ui.oldHeader.length, 0 ); + assert.equal( ui.oldPanel.length, 0 ); + assert.equal( ui.newHeader.length, 1 ); + assert.strictEqual( ui.newHeader[ 0 ], headers[ 0 ] ); + assert.equal( ui.newPanel.length, 1 ); + assert.strictEqual( ui.newPanel[ 0 ], content[ 0 ] ); + state( assert, element, 0, 0, 0 ); }); element.accordion( "option", "active", 0 ); - state( element, 1, 0, 0 ); + state( assert, element, 1, 0, 0 ); element.one( "accordionbeforeactivate", function( event, ui ) { - equal( event.originalEvent.type, "click" ); - equal( ui.oldHeader.length, 1 ); - strictEqual( ui.oldHeader[ 0 ], headers[ 0 ] ); - equal( ui.oldPanel.length, 1 ); - strictEqual( ui.oldPanel[ 0 ], content[ 0 ] ); - equal( ui.newHeader.length, 1 ); - strictEqual( ui.newHeader[ 0 ], headers[ 1 ] ); - equal( ui.newPanel.length, 1 ); - strictEqual( ui.newPanel[ 0 ], content[ 1 ] ); - state( element, 1, 0, 0 ); + assert.equal( event.originalEvent.type, "click" ); + assert.equal( ui.oldHeader.length, 1 ); + assert.strictEqual( ui.oldHeader[ 0 ], headers[ 0 ] ); + assert.equal( ui.oldPanel.length, 1 ); + assert.strictEqual( ui.oldPanel[ 0 ], content[ 0 ] ); + assert.equal( ui.newHeader.length, 1 ); + assert.strictEqual( ui.newHeader[ 0 ], headers[ 1 ] ); + assert.equal( ui.newPanel.length, 1 ); + assert.strictEqual( ui.newPanel[ 0 ], content[ 1 ] ); + state( assert, element, 1, 0, 0 ); }); headers.eq( 1 ).trigger( "click" ); - state( element, 0, 1, 0 ); + state( assert, element, 0, 1, 0 ); element.one( "accordionbeforeactivate", function( event, ui ) { - ok( !( "originalEvent" in event ) ); - equal( ui.oldHeader.length, 1 ); - strictEqual( ui.oldHeader[ 0 ], headers[ 1 ] ); - equal( ui.oldPanel.length, 1 ); - strictEqual( ui.oldPanel[ 0 ], content[ 1 ] ); - equal( ui.newHeader.length, 0 ); - equal( ui.newPanel.length, 0 ); - state( element, 0, 1, 0 ); + assert.ok( !( "originalEvent" in event ) ); + assert.equal( ui.oldHeader.length, 1 ); + assert.strictEqual( ui.oldHeader[ 0 ], headers[ 1 ] ); + assert.equal( ui.oldPanel.length, 1 ); + assert.strictEqual( ui.oldPanel[ 0 ], content[ 1 ] ); + assert.equal( ui.newHeader.length, 0 ); + assert.equal( ui.newPanel.length, 0 ); + state( assert, element, 0, 1, 0 ); }); element.accordion( "option", "active", false ); - state( element, 0, 0, 0 ); + state( assert, element, 0, 0, 0 ); element.one( "accordionbeforeactivate", function( event, ui ) { - ok( !( "originalEvent" in event ) ); - equal( ui.oldHeader.length, 0 ); - equal( ui.oldPanel.length, 0 ); - equal( ui.newHeader.length, 1 ); - strictEqual( ui.newHeader[ 0 ], headers[ 2 ] ); - equal( ui.newPanel.length, 1 ); - strictEqual( ui.newPanel[ 0 ], content[ 2 ] ); + assert.ok( !( "originalEvent" in event ) ); + assert.equal( ui.oldHeader.length, 0 ); + assert.equal( ui.oldPanel.length, 0 ); + assert.equal( ui.newHeader.length, 1 ); + assert.strictEqual( ui.newHeader[ 0 ], headers[ 2 ] ); + assert.equal( ui.newPanel.length, 1 ); + assert.strictEqual( ui.newPanel[ 0 ], content[ 2 ] ); event.preventDefault(); - state( element, 0, 0, 0 ); + state( assert, element, 0, 0, 0 ); }); element.accordion( "option", "active", 2 ); - state( element, 0, 0, 0 ); + state( assert, element, 0, 0, 0 ); }); -test( "activate", function() { - expect( 21 ); +QUnit.test( "activate", function( assert ) { + assert.expect( 21 ); var element = $( "#list1" ).accordion({ active: false, collapsible: true @@ -123,44 +124,44 @@ test( "activate", function() { content = element.find( ".ui-accordion-content" ); element.one( "accordionactivate", function( event, ui ) { - equal( ui.oldHeader.length, 0 ); - equal( ui.oldPanel.length, 0 ); - equal( ui.newHeader.length, 1 ); - strictEqual( ui.newHeader[ 0 ], headers[ 0 ] ); - equal( ui.newPanel.length, 1 ); - strictEqual( ui.newPanel[ 0 ], content[ 0 ] ); + assert.equal( ui.oldHeader.length, 0 ); + assert.equal( ui.oldPanel.length, 0 ); + assert.equal( ui.newHeader.length, 1 ); + assert.strictEqual( ui.newHeader[ 0 ], headers[ 0 ] ); + assert.equal( ui.newPanel.length, 1 ); + assert.strictEqual( ui.newPanel[ 0 ], content[ 0 ] ); }); element.accordion( "option", "active", 0 ); element.one( "accordionactivate", function( event, ui ) { - equal( ui.oldHeader.length, 1 ); - strictEqual( ui.oldHeader[ 0 ], headers[ 0 ] ); - equal( ui.oldPanel.length, 1 ); - strictEqual( ui.oldPanel[ 0 ], content[ 0 ] ); - equal( ui.newHeader.length, 1 ); - strictEqual( ui.newHeader[ 0 ], headers[ 1 ] ); - equal( ui.newPanel.length, 1 ); - strictEqual( ui.newPanel[ 0 ], content[ 1 ] ); + assert.equal( ui.oldHeader.length, 1 ); + assert.strictEqual( ui.oldHeader[ 0 ], headers[ 0 ] ); + assert.equal( ui.oldPanel.length, 1 ); + assert.strictEqual( ui.oldPanel[ 0 ], content[ 0 ] ); + assert.equal( ui.newHeader.length, 1 ); + assert.strictEqual( ui.newHeader[ 0 ], headers[ 1 ] ); + assert.equal( ui.newPanel.length, 1 ); + assert.strictEqual( ui.newPanel[ 0 ], content[ 1 ] ); }); headers.eq( 1 ).trigger( "click" ); element.one( "accordionactivate", function( event, ui ) { - equal( ui.oldHeader.length, 1 ); - strictEqual( ui.oldHeader[ 0 ], headers[ 1 ] ); - equal( ui.oldPanel.length, 1 ); - strictEqual( ui.oldPanel[ 0 ], content[ 1 ] ); - equal( ui.newHeader.length, 0 ); - equal( ui.newPanel.length, 0 ); + assert.equal( ui.oldHeader.length, 1 ); + assert.strictEqual( ui.oldHeader[ 0 ], headers[ 1 ] ); + assert.equal( ui.oldPanel.length, 1 ); + assert.strictEqual( ui.oldPanel[ 0 ], content[ 1 ] ); + assert.equal( ui.newHeader.length, 0 ); + assert.equal( ui.newPanel.length, 0 ); }); element.accordion( "option", "active", false ); // prevent activation element.one( "accordionbeforeactivate", function( event ) { - ok( true ); + assert.ok( true ); event.preventDefault(); }); element.one( "accordionactivate", function() { - ok( false ); + assert.ok( false ); }); element.accordion( "option", "active", 1 ); }); diff --git a/tests/unit/accordion/helper.js b/tests/unit/accordion/helper.js index 5eb3a4bc3f2..faa24e840d0 100644 --- a/tests/unit/accordion/helper.js +++ b/tests/unit/accordion/helper.js @@ -1,13 +1,19 @@ define( [ + "intern!qunit", "jquery", "lib/helper", - "ui/accordion" -], function( $, helper ) { + "lib/css", + "text!tests/unit/accordion/accordion.html", + "ui/accordion", + "jquery-simulate", + "./common" +], function( QUnit, $, helper, cssjs, htmlContent ) { +cssjs( { module: "core accordion" } ); return $.extend( helper, { - equalHeight: function( accordion, height ) { + equalHeight: function( assert, accordion, height ) { accordion.find( ".ui-accordion-content" ).each(function() { - equal( $( this ).outerHeight(), height ); + assert.equal( $( this ).outerHeight(), height ); }); }, @@ -15,20 +21,22 @@ return $.extend( helper, { var animate = $.ui.accordion.prototype.options.animate; return { setup: function() { + $("body").append(htmlContent); $.ui.accordion.prototype.options.animate = false; }, teardown: function() { + $("#qunit-fixture").remove(); $.ui.accordion.prototype.options.animate = animate; } }; }, - state: function( accordion ) { - var expected = $.makeArray( arguments ).slice( 1 ), + state: function( assert, accordion ) { + var expected = $.makeArray( arguments ).slice( 2 ), actual = accordion.find( ".ui-accordion-content" ).map(function() { return $( this ).css( "display" ) === "none" ? 0 : 1; }).get(); - QUnit.push( QUnit.equiv(actual, expected), actual, expected ); + assert.deepEqual(actual, expected, "State Assert") } } ); diff --git a/tests/unit/accordion/methods.js b/tests/unit/accordion/methods.js index efabfed10b1..5c1c66ba624 100644 --- a/tests/unit/accordion/methods.js +++ b/tests/unit/accordion/methods.js @@ -1,46 +1,47 @@ define( [ + "lib/qunit", "jquery", "./helper", "ui/accordion" -], function( $, testHelper ) { +], function( QUnit, $, testHelper ) { var equalHeight = testHelper.equalHeight, setupTeardown = testHelper.setupTeardown, state = testHelper.state; -module( "accordion: methods", setupTeardown() ); +QUnit.module( "accordion: methods", setupTeardown() ); -test( "destroy", function( assert ) { - expect( 1 ); +QUnit.test( "destroy", function( assert ) { + assert.expect( 1 ); assert.domEqual( "#list1", function() { $( "#list1" ).accordion().accordion( "destroy" ); }); }); -test( "enable/disable", function( assert ) { - expect( 7 ); +QUnit.test( "enable/disable", function( assert ) { + assert.expect( 7 ); var element = $( "#list1" ).accordion(); - state( element, 1, 0, 0 ); + state( assert, element, 1, 0, 0 ); element.accordion( "disable" ); assert.hasClasses( element, "ui-state-disabled" ); - equal( element.attr( "aria-disabled" ), "true", "element gets aria-disabled" ); + assert.equal( element.attr( "aria-disabled" ), "true", "element gets aria-disabled" ); assert.hasClasses( element, "ui-accordion-disabled" ); // event does nothing element.find( ".ui-accordion-header" ).eq( 1 ).trigger( "click" ); - state( element, 1, 0, 0 ); + state( assert, element, 1, 0, 0 ); // option still works element.accordion( "option", "active", 1 ); - state( element, 0, 1, 0 ); + state( assert, element, 0, 1, 0 ); element.accordion( "enable" ); element.accordion( "option", "active", 2 ); - state( element, 0, 0, 1 ); + state( assert, element, 0, 0, 1 ); }); -test( "refresh", function() { - expect( 19 ); +QUnit.test( "refresh", function( assert ) { + assert.expect( 19 ); var element = $( "#navigation" ) .parent() .height( 300 ) @@ -48,37 +49,37 @@ test( "refresh", function() { .accordion({ heightStyle: "fill" }); - equalHeight( element, 255 ); + equalHeight( assert, element, 255 ); element.parent().height( 500 ); element.accordion( "refresh" ); - equalHeight( element, 455 ); + equalHeight( assert, element, 455 ); element = $( "#list1" ); element.accordion(); - state( element, 1, 0, 0 ); + state( assert, element, 1, 0, 0 ); // disable panel via markup element.find( "h3.bar" ).eq( 1 ).addClass( "ui-state-disabled" ); element.accordion( "refresh" ); - state( element, 1, 0, 0 ); + state( assert, element, 1, 0, 0 ); // don't add multiple icons element.accordion( "refresh" ); - equal( element.find( ".ui-accordion-header-icon" ).length, 3 ); + assert.equal( element.find( ".ui-accordion-header-icon" ).length, 3 ); // add a panel element .append("

new 1

") .append("
new 1
"); element.accordion( "refresh" ); - state( element, 1, 0, 0, 0 ); + state( assert, element, 1, 0, 0, 0 ); // remove all tabs element.find( "h3.bar, div.foo" ).remove(); element.accordion( "refresh" ); - state( element ); - equal( element.accordion( "option", "active" ), false, "no active accordion panel" ); + state( assert, element ); + assert.equal( element.accordion( "option", "active" ), false, "no active accordion panel" ); // add panels element @@ -91,46 +92,46 @@ test( "refresh", function() { .append("

new 5

") .append("
new 5
"); element.accordion( "refresh" ); - state( element, 1, 0, 0, 0 ); + state( assert, element, 1, 0, 0, 0 ); // activate third tab element.accordion( "option", "active", 2 ); - state( element, 0, 0, 1, 0 ); + state( assert, element, 0, 0, 1, 0 ); // remove fourth panel, third panel should stay active element.find( "h3.bar" ).eq( 3 ).remove(); element.find( "div.foo" ).eq( 3 ).remove(); element.accordion( "refresh" ); - state( element, 0, 0, 1 ); + state( assert, element, 0, 0, 1 ); // remove third (active) panel, second panel should become active element.find( "h3.bar" ).eq( 2 ).remove(); element.find( "div.foo" ).eq( 2 ).remove(); element.accordion( "refresh" ); - state( element, 0, 1 ); + state( assert, element, 0, 1 ); // remove first panel, previously active panel (now first) should stay active element.find( "h3.bar" ).eq( 0 ).remove(); element.find( "div.foo" ).eq( 0 ).remove(); element.accordion( "refresh" ); - state( element, 1 ); + state( assert, element, 1 ); // collapse all panels element.accordion( "option", { collapsible: true, active: false }); - state( element, 0 ); + state( assert, element, 0 ); element.accordion( "refresh" ); - state( element, 0 ); + state( assert, element, 0 ); }); -test( "widget", function() { - expect( 2 ); +QUnit.test( "widget", function( assert ) { + assert.expect( 2 ); var element = $( "#list1" ).accordion(), widgetElement = element.accordion( "widget" ); - equal( widgetElement.length, 1, "one element" ); - strictEqual( widgetElement[ 0 ], element[ 0 ], "same element" ); + assert.equal( widgetElement.length, 1, "one element" ); + assert.strictEqual( widgetElement[ 0 ], element[ 0 ], "same element" ); }); } ); diff --git a/tests/unit/accordion/options.js b/tests/unit/accordion/options.js index 52d54ed32e4..af1a3206e5a 100644 --- a/tests/unit/accordion/options.js +++ b/tests/unit/accordion/options.js @@ -1,115 +1,116 @@ define( [ + "lib/qunit", "jquery", "./helper", "ui/accordion" -], function( $, testHelper ) { +], function( QUnit, $, testHelper ) { var equalHeight = testHelper.equalHeight, setupTeardown = testHelper.setupTeardown, state = testHelper.state; -module( "accordion: options", setupTeardown() ); +QUnit.module( "accordion: options", setupTeardown() ); -test( "{ active: default }", function() { - expect( 2 ); +QUnit.test( "{ active: default }", function( assert ) { + assert.expect( 2 ); var element = $( "#list1" ).accordion(); - equal( element.accordion( "option", "active" ), 0 ); - state( element, 1, 0, 0 ); + assert.equal( element.accordion( "option", "active" ), 0 ); + state( assert, element, 1, 0, 0 ); }); -test( "{ active: null }", function() { - expect( 2 ); +QUnit.test( "{ active: null }", function( assert ) { + assert.expect( 2 ); var element = $( "#list1" ).accordion({ active: null }); - equal( element.accordion( "option", "active" ), 0 ); - state( element, 1, 0, 0 ); + assert.equal( element.accordion( "option", "active" ), 0 ); + state( assert, element, 1, 0, 0 ); }); -test( "{ active: false }", function() { - expect( 7 ); +QUnit.test( "{ active: false }", function( assert ) { + assert.expect( 7 ); var element = $( "#list1" ).accordion({ active: false, collapsible: true }); - state( element, 0, 0, 0 ); - equal( element.find( ".ui-accordion-header.ui-state-active" ).length, 0, "no headers selected" ); - equal( element.accordion( "option", "active" ), false ); + state( assert, element, 0, 0, 0 ); + assert.equal( element.find( ".ui-accordion-header.ui-state-active" ).length, 0, "no headers selected" ); + assert.equal( element.accordion( "option", "active" ), false ); element.accordion( "option", "collapsible", false ); - state( element, 1, 0, 0 ); - equal( element.accordion( "option", "active" ), 0 ); + state( assert, element, 1, 0, 0 ); + assert.equal( element.accordion( "option", "active" ), 0 ); element.accordion( "destroy" ); element.accordion({ active: false }); - state( element, 1, 0, 0 ); - strictEqual( element.accordion( "option", "active" ), 0 ); + state( assert, element, 1, 0, 0 ); + assert.strictEqual( element.accordion( "option", "active" ), 0 ); }); -test( "{ active: Number }", function() { - expect( 8 ); +QUnit.test( "{ active: Number }", function( assert ) { + assert.expect( 8 ); var element = $( "#list1" ).accordion({ active: 2 }); - equal( element.accordion( "option", "active" ), 2 ); - state( element, 0, 0, 1 ); + assert.equal( element.accordion( "option", "active" ), 2 ); + state( assert, element, 0, 0, 1 ); element.accordion( "option", "active", 0 ); - equal( element.accordion( "option", "active" ), 0 ); - state( element, 1, 0, 0 ); + assert.equal( element.accordion( "option", "active" ), 0 ); + state( assert, element, 1, 0, 0 ); element.find( ".ui-accordion-header" ).eq( 1 ).trigger( "click" ); - equal( element.accordion( "option", "active" ), 1 ); - state( element, 0, 1, 0 ); + assert.equal( element.accordion( "option", "active" ), 1 ); + state( assert, element, 0, 1, 0 ); element.accordion( "option", "active", 10 ); - equal( element.accordion( "option", "active" ), 1 ); - state( element, 0, 1, 0 ); + assert.equal( element.accordion( "option", "active" ), 1 ); + state( assert, element, 0, 1, 0 ); }); -test( "{ active: -Number }", function() { - expect( 8 ); +QUnit.test( "{ active: -Number }", function( assert ) { + assert.expect( 8 ); var element = $( "#list1" ).accordion({ active: -1 }); - equal( element.accordion( "option", "active" ), 2 ); - state( element, 0, 0, 1 ); + assert.equal( element.accordion( "option", "active" ), 2 ); + state( assert, element, 0, 0, 1 ); element.accordion( "option", "active", -2 ); - equal( element.accordion( "option", "active" ), 1 ); - state( element, 0, 1, 0 ); + assert.equal( element.accordion( "option", "active" ), 1 ); + state( assert, element, 0, 1, 0 ); element.accordion( "option", "active", -10 ); - equal( element.accordion( "option", "active" ), 1 ); - state( element, 0, 1, 0 ); + assert.equal( element.accordion( "option", "active" ), 1 ); + state( assert, element, 0, 1, 0 ); element.accordion( "option", "active", -3 ); - equal( element.accordion( "option", "active" ), 0 ); - state( element, 1, 0, 0 ); + assert.equal( element.accordion( "option", "active" ), 0 ); + state( assert, element, 1, 0, 0 ); }); -test( "{ animate: false }", function() { - expect( 3 ); +QUnit.test( "{ animate: false }", function( assert ) { + assert.expect( 3 ); var element = $( "#list1" ).accordion({ animate: false }), panels = element.find( ".ui-accordion-content" ), animate = $.fn.animate; $.fn.animate = function() { - ok( false, ".animate() called" ); + assert.ok( false, ".animate() called" ); }; - ok( panels.eq( 0 ).is( ":visible" ), "first panel visible" ); + assert.ok( panels.eq( 0 ).is( ":visible" ), "first panel visible" ); element.accordion( "option", "active", 1 ); - ok( panels.eq( 0 ).is( ":hidden" ), "first panel hidden" ); - ok( panels.eq( 1 ).is( ":visible" ), "second panel visible" ); + assert.ok( panels.eq( 0 ).is( ":hidden" ), "first panel hidden" ); + assert.ok( panels.eq( 1 ).is( ":visible" ), "second panel visible" ); $.fn.animate = animate; }); -asyncTest( "{ animate: Number }", function() { - expect( 7 ); +QUnit.asyncTest( "{ animate: Number }", function( assert ) { + assert.expect( 7 ); var element = $( "#list1" ).accordion({ animate: 100 }), @@ -117,23 +118,23 @@ asyncTest( "{ animate: Number }", function() { animate = $.fn.animate; // called twice (both panels) $.fn.animate = function( props, options ) { - equal( options.duration, 100, "correct duration" ); - equal( options.easing, undefined, "default easing" ); + assert.equal( options.duration, 100, "correct duration" ); + assert.equal( options.easing, undefined, "default easing" ); animate.apply( this, arguments ); }; - ok( panels.eq( 0 ).is( ":visible" ), "first panel visible" ); + assert.ok( panels.eq( 0 ).is( ":visible" ), "first panel visible" ); element.accordion( "option", "active", 1 ); panels.promise().done(function() { - ok( panels.eq( 0 ).is( ":hidden" ), "first panel hidden" ); - ok( panels.eq( 1 ).is( ":visible" ), "second panel visible" ); + assert.ok( panels.eq( 0 ).is( ":hidden" ), "first panel hidden" ); + assert.ok( panels.eq( 1 ).is( ":visible" ), "second panel visible" ); $.fn.animate = animate; - start(); + QUnit.start(); }); }); -asyncTest( "{ animate: String }", function() { - expect( 7 ); +QUnit.asyncTest( "{ animate: String }", function( assert ) { + assert.expect( 7 ); var element = $( "#list1" ).accordion({ animate: "linear" }), @@ -141,23 +142,23 @@ asyncTest( "{ animate: String }", function() { animate = $.fn.animate; // called twice (both panels) $.fn.animate = function( props, options ) { - equal( options.duration, undefined, "default duration" ); - equal( options.easing, "linear", "correct easing" ); + assert.equal( options.duration, undefined, "default duration" ); + assert.equal( options.easing, "linear", "correct easing" ); animate.apply( this, arguments ); }; - ok( panels.eq( 0 ).is( ":visible" ), "first panel visible" ); + assert.ok( panels.eq( 0 ).is( ":visible" ), "first panel visible" ); element.accordion( "option", "active", 1 ); panels.promise().done(function() { - ok( panels.eq( 0 ).is( ":hidden" ), "first panel hidden" ); - ok( panels.eq( 1 ).is( ":visible" ), "second panel visible" ); + assert.ok( panels.eq( 0 ).is( ":hidden" ), "first panel hidden" ); + assert.ok( panels.eq( 1 ).is( ":visible" ), "second panel visible" ); $.fn.animate = animate; - start(); + QUnit.start(); }); }); -asyncTest( "{ animate: {} }", function() { - expect( 7 ); +QUnit.asyncTest( "{ animate: {} }", function( assert ) { + assert.expect( 7 ); var element = $( "#list1" ).accordion({ animate: {} }), @@ -165,23 +166,23 @@ asyncTest( "{ animate: {} }", function() { animate = $.fn.animate; // called twice (both panels) $.fn.animate = function( props, options ) { - equal( options.duration, undefined, "default duration" ); - equal( options.easing, undefined, "default easing" ); + assert.equal( options.duration, undefined, "default duration" ); + assert.equal( options.easing, undefined, "default easing" ); animate.apply( this, arguments ); }; - ok( panels.eq( 0 ).is( ":visible" ), "first panel visible" ); + assert.ok( panels.eq( 0 ).is( ":visible" ), "first panel visible" ); element.accordion( "option", "active", 1 ); panels.promise().done(function() { - ok( panels.eq( 0 ).is( ":hidden" ), "first panel hidden" ); - ok( panels.eq( 1 ).is( ":visible" ), "second panel visible" ); + assert.ok( panels.eq( 0 ).is( ":hidden" ), "first panel hidden" ); + assert.ok( panels.eq( 1 ).is( ":visible" ), "second panel visible" ); $.fn.animate = animate; - start(); + QUnit.start(); }); }); -asyncTest( "{ animate: { duration, easing } }", function() { - expect( 7 ); +QUnit.asyncTest( "{ animate: { duration, easing } }", function( assert ) { + assert.expect( 7 ); var element = $( "#list1" ).accordion({ animate: { duration: 100, easing: "linear" } }), @@ -189,23 +190,23 @@ asyncTest( "{ animate: { duration, easing } }", function() { animate = $.fn.animate; // called twice (both panels) $.fn.animate = function( props, options ) { - equal( options.duration, 100, "correct duration" ); - equal( options.easing, "linear", "correct easing" ); + assert.equal( options.duration, 100, "correct duration" ); + assert.equal( options.easing, "linear", "correct easing" ); animate.apply( this, arguments ); }; - ok( panels.eq( 0 ).is( ":visible" ), "first panel visible" ); + assert.ok( panels.eq( 0 ).is( ":visible" ), "first panel visible" ); element.accordion( "option", "active", 1 ); panels.promise().done(function() { - ok( panels.eq( 0 ).is( ":hidden" ), "first panel hidden" ); - ok( panels.eq( 1 ).is( ":visible" ), "second panel visible" ); + assert.ok( panels.eq( 0 ).is( ":hidden" ), "first panel hidden" ); + assert.ok( panels.eq( 1 ).is( ":visible" ), "second panel visible" ); $.fn.animate = animate; - start(); + QUnit.start(); }); }); -asyncTest( "{ animate: { duration, easing } }, animate down", function() { - expect( 7 ); +QUnit.asyncTest( "{ animate: { duration, easing } }, animate down", function( assert ) { + assert.expect( 7 ); var element = $( "#list1" ).accordion({ active: 1, animate: { duration: 100, easing: "linear" } @@ -214,23 +215,23 @@ asyncTest( "{ animate: { duration, easing } }, animate down", function() { animate = $.fn.animate; // called twice (both panels) $.fn.animate = function( props, options ) { - equal( options.duration, 100, "correct duration" ); - equal( options.easing, "linear", "correct easing" ); + assert.equal( options.duration, 100, "correct duration" ); + assert.equal( options.easing, "linear", "correct easing" ); animate.apply( this, arguments ); }; - ok( panels.eq( 1 ).is( ":visible" ), "first panel visible" ); + assert.ok( panels.eq( 1 ).is( ":visible" ), "first panel visible" ); element.accordion( "option", "active", 0 ); panels.promise().done(function() { - ok( panels.eq( 1 ).is( ":hidden" ), "first panel hidden" ); - ok( panels.eq( 0 ).is( ":visible" ), "second panel visible" ); + assert.ok( panels.eq( 1 ).is( ":hidden" ), "first panel hidden" ); + assert.ok( panels.eq( 0 ).is( ":visible" ), "second panel visible" ); $.fn.animate = animate; - start(); + QUnit.start(); }); }); -asyncTest( "{ animate: { duration, easing, down } }, animate down", function() { - expect( 7 ); +QUnit.asyncTest( "{ animate: { duration, easing, down } }, animate down", function( assert ) { + assert.expect( 7 ); var element = $( "#list1" ).accordion({ active: 1, animate: { @@ -245,154 +246,154 @@ asyncTest( "{ animate: { duration, easing, down } }, animate down", function() { animate = $.fn.animate; // called twice (both panels) $.fn.animate = function( props, options ) { - equal( options.duration, 100, "correct duration" ); - equal( options.easing, "swing", "correct easing" ); + assert.equal( options.duration, 100, "correct duration" ); + assert.equal( options.easing, "swing", "correct easing" ); animate.apply( this, arguments ); }; - ok( panels.eq( 1 ).is( ":visible" ), "first panel visible" ); + assert.ok( panels.eq( 1 ).is( ":visible" ), "first panel visible" ); element.accordion( "option", "active", 0 ); panels.promise().done(function() { - ok( panels.eq( 1 ).is( ":hidden" ), "first panel hidden" ); - ok( panels.eq( 0 ).is( ":visible" ), "second panel visible" ); + assert.ok( panels.eq( 1 ).is( ":hidden" ), "first panel hidden" ); + assert.ok( panels.eq( 0 ).is( ":visible" ), "second panel visible" ); $.fn.animate = animate; - start(); + QUnit.start(); }); }); -test( "{ collapsible: false }", function() { - expect( 4 ); +QUnit.test( "{ collapsible: false }", function( assert ) { + assert.expect( 4 ); var element = $( "#list1" ).accordion({ active: 1 }); element.accordion( "option", "active", false ); - equal( element.accordion( "option", "active" ), 1 ); - state( element, 0, 1, 0 ); + assert.equal( element.accordion( "option", "active" ), 1 ); + state( assert, element, 0, 1, 0 ); element.find( ".ui-accordion-header" ).eq( 1 ).trigger( "click" ); - equal( element.accordion( "option", "active" ), 1 ); - state( element, 0, 1, 0 ); + assert.equal( element.accordion( "option", "active" ), 1 ); + state( assert, element, 0, 1, 0 ); }); -test( "{ collapsible: true }", function() { - expect( 6 ); +QUnit.test( "{ collapsible: true }", function( assert ) { + assert.expect( 6 ); var element = $( "#list1" ).accordion({ active: 1, collapsible: true }); element.accordion( "option", "active", false ); - equal( element.accordion( "option", "active" ), false ); - state( element, 0, 0, 0 ); + assert.equal( element.accordion( "option", "active" ), false ); + state( assert, element, 0, 0, 0 ); element.accordion( "option", "active", 1 ); - equal( element.accordion( "option", "active" ), 1 ); - state( element, 0, 1, 0 ); + assert.equal( element.accordion( "option", "active" ), 1 ); + state( assert, element, 0, 1, 0 ); element.find( ".ui-accordion-header" ).eq( 1 ).trigger( "click" ); - equal( element.accordion( "option", "active" ), false ); - state( element, 0, 0, 0 ); + assert.equal( element.accordion( "option", "active" ), false ); + state( assert, element, 0, 0, 0 ); }); -test( "{ event: null }", function() { - expect( 5 ); +QUnit.test( "{ event: null }", function( assert ) { + assert.expect( 5 ); var element = $( "#list1" ).accordion({ event: null }); - state( element, 1, 0, 0 ); + state( assert, element, 1, 0, 0 ); element.accordion( "option", "active", 1 ); - equal( element.accordion( "option", "active" ), 1 ); - state( element, 0, 1, 0 ); + assert.equal( element.accordion( "option", "active" ), 1 ); + state( assert, element, 0, 1, 0 ); // ensure default click handler isn't bound element.find( ".ui-accordion-header" ).eq( 2 ).trigger( "click" ); - equal( element.accordion( "option", "active" ), 1 ); - state( element, 0, 1, 0 ); + assert.equal( element.accordion( "option", "active" ), 1 ); + state( assert, element, 0, 1, 0 ); }); -test( "{ event: custom }", function() { - expect( 11 ); +QUnit.test( "{ event: custom }", function( assert ) { + assert.expect( 11 ); var element = $( "#list1" ).accordion({ event: "custom1 custom2" }); - state( element, 1, 0, 0 ); + state( assert, element, 1, 0, 0 ); element.find( ".ui-accordion-header" ).eq( 1 ).trigger( "custom1" ); - equal( element.accordion( "option", "active" ), 1 ); - state( element, 0, 1, 0 ); + assert.equal( element.accordion( "option", "active" ), 1 ); + state( assert, element, 0, 1, 0 ); // ensure default click handler isn't bound element.find( ".ui-accordion-header" ).eq( 2 ).trigger( "click" ); - equal( element.accordion( "option", "active" ), 1 ); - state( element, 0, 1, 0 ); + assert.equal( element.accordion( "option", "active" ), 1 ); + state( assert, element, 0, 1, 0 ); element.find( ".ui-accordion-header" ).eq( 2 ).trigger( "custom2" ); - equal( element.accordion( "option", "active" ), 2 ); - state( element, 0, 0, 1 ); + assert.equal( element.accordion( "option", "active" ), 2 ); + state( assert, element, 0, 0, 1 ); element.accordion( "option", "event", "custom3" ); // ensure old event handlers are unbound element.find( ".ui-accordion-header" ).eq( 1 ).trigger( "custom1" ); element.find( ".ui-accordion-header" ).eq( 1 ).trigger( "custom2" ); - equal( element.accordion( "option", "active" ), 2 ); - state( element, 0, 0, 1 ); + assert.equal( element.accordion( "option", "active" ), 2 ); + state( assert, element, 0, 0, 1 ); element.find( ".ui-accordion-header" ).eq( 1 ).trigger( "custom3" ); - equal( element.accordion( "option", "active" ), 1 ); - state( element, 0, 1, 0 ); + assert.equal( element.accordion( "option", "active" ), 1 ); + state( assert, element, 0, 1, 0 ); }); -test( "{ header: default }", function() { - expect( 2 ); +QUnit.test( "{ header: default }", function( assert ) { + assert.expect( 2 ); // default: > li > :first-child,> :not(li):even // > :not(li):even - state( $( "#list1" ).accordion(), 1, 0, 0); + state( assert, $( "#list1" ).accordion(), 1, 0, 0); // > li > :first-child - state( $( "#navigation" ).accordion(), 1, 0, 0); + state( assert, $( "#navigation" ).accordion(), 1, 0, 0); }); -test( "{ header: custom }", function( assert ) { - expect( 6 ); +QUnit.test( "{ header: custom }", function( assert ) { + assert.expect( 6 ); var element = $( "#navigationWrapper" ).accordion({ header: "h2" }); element.find( "h2" ).each(function() { assert.hasClasses( this, "ui-accordion-header" ); }); - equal( element.find( ".ui-accordion-header" ).length, 3 ); - state( element, 1, 0, 0 ); + assert.equal( element.find( ".ui-accordion-header" ).length, 3 ); + state( assert, element, 1, 0, 0 ); element.accordion( "option", "active", 2 ); - state( element, 0, 0, 1 ); + state( assert, element, 0, 0, 1 ); }); -test( "{ heightStyle: 'auto' }", function() { - expect( 3 ); +QUnit.test( "{ heightStyle: 'auto' }", function( assert ) { + assert.expect( 3 ); var element = $( "#navigation" ).accordion({ heightStyle: "auto" }); - equalHeight( element, 105 ); + equalHeight( assert, element, 105 ); }); -test( "{ heightStyle: 'content' }", function() { - expect( 3 ); +QUnit.test( "{ heightStyle: 'content' }", function( assert ) { + assert.expect( 3 ); var element = $( "#navigation" ).accordion({ heightStyle: "content" }), sizes = element.find( ".ui-accordion-content" ).map(function() { return $( this ).height(); }).get(); - equal( sizes[ 0 ], 75 ); - equal( sizes[ 1 ], 105 ); - equal( sizes[ 2 ], 45 ); + assert.equal( sizes[ 0 ], 75 ); + assert.equal( sizes[ 1 ], 105 ); + assert.equal( sizes[ 2 ], 45 ); }); -test( "{ heightStyle: 'fill' }", function() { - expect( 3 ); +QUnit.test( "{ heightStyle: 'fill' }", function( assert ) { + assert.expect( 3 ); $( "#navigationWrapper" ).height( 500 ); var element = $( "#navigation" ).accordion({ heightStyle: "fill" }); - equalHeight( element, 455 ); + equalHeight( assert, element, 455 ); }); -test( "{ heightStyle: 'fill' } with sibling", function() { - expect( 3 ); +QUnit.test( "{ heightStyle: 'fill' } with sibling", function( assert ) { + assert.expect( 3 ); $( "#navigationWrapper" ).height( 500 ); $( "

Lorem Ipsum

" ) .css({ @@ -402,11 +403,11 @@ test( "{ heightStyle: 'fill' } with sibling", function() { }) .prependTo( "#navigationWrapper" ); var element = $( "#navigation" ).accordion({ heightStyle: "fill" }); - equalHeight( element , 355 ); + equalHeight( assert, element , 355 ); }); -test( "{ heightStyle: 'fill' } with multiple siblings", function() { - expect( 3 ); +QUnit.test( "{ heightStyle: 'fill' } with multiple siblings", function( assert ) { + assert.expect( 3 ); $( "#navigationWrapper" ).height( 500 ); $( "

Lorem Ipsum

" ) .css({ @@ -431,15 +432,15 @@ test( "{ heightStyle: 'fill' } with multiple siblings", function() { }) .prependTo( "#navigationWrapper" ); var element = $( "#navigation" ).accordion({ heightStyle: "fill" }); - equalHeight( element, 305 ); + equalHeight( assert, element, 305 ); }); -test( "{ icons: false }", function() { - expect( 8 ); +QUnit.test( "{ icons: false }", function( assert ) { + assert.expect( 8 ); var element = $( "#list1" ); function icons( on ) { - deepEqual( element.find( "span.ui-icon").length, on ? 3 : 0 ); - deepEqual( element.find( ".ui-accordion-header.ui-accordion-icons" ).length, on ? 3 : 0 ); + assert.deepEqual( element.find( "span.ui-icon").length, on ? 3 : 0 ); + assert.deepEqual( element.find( ".ui-accordion-header.ui-accordion-icons" ).length, on ? 3 : 0 ); } element.accordion(); icons( true ); @@ -453,8 +454,8 @@ test( "{ icons: false }", function() { icons( false ); }); -test( "{ icons: hash }", function( assert ) { - expect( 3 ); +QUnit.test( "{ icons: hash }", function( assert ) { + assert.expect( 3 ); var element = $( "#list1" ).accordion({ icons: { activeHeader: "a1", header: "h1" } }); diff --git a/tests/unit/all.js b/tests/unit/all.js new file mode 100644 index 00000000000..f9a1860c73b --- /dev/null +++ b/tests/unit/all.js @@ -0,0 +1,10 @@ +define([ + "tests/unit/accordion/core", + "tests/unit/accordion/events", + "tests/unit/accordion/methods", + "tests/unit/accordion/options", + "tests/unit/autocomplete/core", + "tests/unit/autocomplete/events", + "tests/unit/autocomplete/methods", + "tests/unit/autocomplete/options", +]); diff --git a/tests/unit/autocomplete/autocomplete.html b/tests/unit/autocomplete/autocomplete.html index 484f2d95758..def2fc06902 100644 --- a/tests/unit/autocomplete/autocomplete.html +++ b/tests/unit/autocomplete/autocomplete.html @@ -1,16 +1,3 @@ - - - - - jQuery UI Autocomplete Test Suite - - - - - - - -
@@ -19,5 +6,3 @@
- - diff --git a/tests/unit/autocomplete/core.js b/tests/unit/autocomplete/core.js index 184bcdbf423..3e812d7023e 100644 --- a/tests/unit/autocomplete/core.js +++ b/tests/unit/autocomplete/core.js @@ -1,12 +1,14 @@ -define( [ +define([ 'qunit', 'qunit', "jquery", + "./helper", "ui/autocomplete" -], function( $ ) { +], function( QUnit, QUnit, $ , testHelper) { -module( "autocomplete: core" ); +var setupTeardown = testHelper.setupTeardown; +QUnit.module( "autocomplete: core", setupTeardown() ); -test( "markup structure", function( assert ) { - expect( 2 ); +QUnit.test( "markup structure", function( assert ) { + assert.expect( 2 ); var element = $( "#autocomplete" ).autocomplete(), menu = element.autocomplete( "widget" ); @@ -14,8 +16,8 @@ test( "markup structure", function( assert ) { assert.hasClasses( menu, "ui-autocomplete ui-widget ui-widget-content" ); }); -test( "prevent form submit on enter when menu is active", function() { - expect( 2 ); +QUnit.test( "prevent form submit on enter when menu is active", function( assert ) { + assert.expect( 2 ); var event, element = $( "#autocomplete" ) .autocomplete({ @@ -28,17 +30,17 @@ test( "prevent form submit on enter when menu is active", function() { event = $.Event( "keydown" ); event.keyCode = $.ui.keyCode.DOWN; element.trigger( event ); - equal( menu.find( ".ui-menu-item-wrapper.ui-state-active" ).length, 1, + assert.equal( menu.find( ".ui-menu-item-wrapper.ui-state-active" ).length, 1, "menu item is active" ); event = $.Event( "keydown" ); event.keyCode = $.ui.keyCode.ENTER; element.trigger( event ); - ok( event.isDefaultPrevented(), "default action is prevented" ); + assert.ok( event.isDefaultPrevented(), "default action is prevented" ); }); -test( "allow form submit on enter when menu is not active", function() { - expect( 1 ); +QUnit.test( "allow form submit on enter when menu is not active", function( assert ) { + assert.expect( 1 ); var event, element = $( "#autocomplete" ) .autocomplete({ @@ -51,84 +53,84 @@ test( "allow form submit on enter when menu is not active", function() { event = $.Event( "keydown" ); event.keyCode = $.ui.keyCode.ENTER; element.trigger( event ); - ok( !event.isDefaultPrevented(), "default action is prevented" ); + assert.ok( !event.isDefaultPrevented(), "default action is prevented" ); }); (function() { - test( "up arrow invokes search - input", function() { - arrowsInvokeSearch( "#autocomplete", true, true ); + QUnit.test( "up arrow invokes search - input", function( assert ) { + arrowsInvokeSearch( assert, "#autocomplete", true, true ); }); - test( "down arrow invokes search - input", function() { - arrowsInvokeSearch( "#autocomplete", false, true ); + QUnit.test( "down arrow invokes search - input", function( assert ) { + arrowsInvokeSearch( assert, "#autocomplete", false, true ); }); - test( "up arrow invokes search - textarea", function() { - arrowsInvokeSearch( "#autocomplete-textarea", true, false ); + QUnit.test( "up arrow invokes search - textarea", function( assert ) { + arrowsInvokeSearch( assert, "#autocomplete-textarea", true, false ); }); - test( "down arrow invokes search - textarea", function() { - arrowsInvokeSearch( "#autocomplete-textarea", false, false ); + QUnit.test( "down arrow invokes search - textarea", function( assert ) { + arrowsInvokeSearch( assert, "#autocomplete-textarea", false, false ); }); - test( "up arrow invokes search - contenteditable", function() { - arrowsInvokeSearch( "#autocomplete-contenteditable", true, false ); + QUnit.test( "up arrow invokes search - contenteditable", function( assert ) { + arrowsInvokeSearch( assert, "#autocomplete-contenteditable", true, false ); }); - test( "down arrow invokes search - contenteditable", function() { - arrowsInvokeSearch( "#autocomplete-contenteditable", false, false ); + QUnit.test( "down arrow invokes search - contenteditable", function( assert ) { + arrowsInvokeSearch( assert, "#autocomplete-contenteditable", false, false ); }); - test( "up arrow moves focus - input", function() { - arrowsMoveFocus( "#autocomplete", true ); + QUnit.test( "up arrow moves focus - input", function( assert ) { + arrowsMoveFocus( assert, "#autocomplete", true ); }); - test( "down arrow moves focus - input", function() { - arrowsMoveFocus( "#autocomplete", false ); + QUnit.test( "down arrow moves focus - input", function( assert ) { + arrowsMoveFocus( assert, "#autocomplete", false ); }); - test( "up arrow moves focus - textarea", function() { - arrowsMoveFocus( "#autocomplete-textarea", true ); + QUnit.test( "up arrow moves focus - textarea", function( assert ) { + arrowsMoveFocus( assert, "#autocomplete-textarea", true ); }); - test( "down arrow moves focus - textarea", function() { - arrowsMoveFocus( "#autocomplete-textarea", false ); + QUnit.test( "down arrow moves focus - textarea", function( assert ) { + arrowsMoveFocus( assert, "#autocomplete-textarea", false ); }); - test( "up arrow moves focus - contenteditable", function() { - arrowsMoveFocus( "#autocomplete-contenteditable", true ); + QUnit.test( "up arrow moves focus - contenteditable", function( assert ) { + arrowsMoveFocus( assert, "#autocomplete-contenteditable", true ); }); - test( "down arrow moves focus - contenteditable", function() { - arrowsMoveFocus( "#autocomplete-contenteditable", false ); + QUnit.test( "down arrow moves focus - contenteditable", function( assert ) { + arrowsMoveFocus( assert, "#autocomplete-contenteditable", false ); }); - test( "up arrow moves cursor - input", function() { - arrowsNavigateElement( "#autocomplete", true, false ); + QUnit.test( "up arrow moves cursor - input", function( assert ) { + arrowsNavigateElement( assert, "#autocomplete", true, false ); }); - test( "down arrow moves cursor - input", function() { - arrowsNavigateElement( "#autocomplete", false, false ); + QUnit.test( "down arrow moves cursor - input", function( assert ) { + arrowsNavigateElement( assert, "#autocomplete", false, false ); }); - test( "up arrow moves cursor - textarea", function() { - arrowsNavigateElement( "#autocomplete-textarea", true, true ); + QUnit.test( "up arrow moves cursor - textarea", function( assert ) { + arrowsNavigateElement( assert, "#autocomplete-textarea", true, true ); }); - test( "down arrow moves cursor - textarea", function() { - arrowsNavigateElement( "#autocomplete-textarea", false, true ); + QUnit.test( "down arrow moves cursor - textarea", function( assert ) { + arrowsNavigateElement( assert, "#autocomplete-textarea", false, true ); }); - test( "up arrow moves cursor - contenteditable", function() { - arrowsNavigateElement( "#autocomplete-contenteditable", true, true ); + QUnit.test( "up arrow moves cursor - contenteditable", function( assert ) { + arrowsNavigateElement( assert, "#autocomplete-contenteditable", true, true ); }); - test( "down arrow moves cursor - contenteditable", function() { - arrowsNavigateElement( "#autocomplete-contenteditable", false, true ); + QUnit.test( "down arrow moves cursor - contenteditable", function( assert ) { + arrowsNavigateElement( assert, "#autocomplete-contenteditable", false, true ); }); - function arrowsInvokeSearch( id, isKeyUp, shouldMove ) { - expect( 1 ); + function arrowsInvokeSearch( assert, id, isKeyUp, shouldMove ) { + assert.expect( 1 ); var didMove = false, element = $( id ).autocomplete({ @@ -140,11 +142,11 @@ test( "allow form submit on enter when menu is not active", function() { didMove = true; }; element.simulate( "keydown", { keyCode: ( isKeyUp ? $.ui.keyCode.UP : $.ui.keyCode.DOWN ) } ); - equal( didMove, shouldMove, "respond to arrow" ); + assert.equal( didMove, shouldMove, "respond to arrow" ); } - function arrowsMoveFocus( id, isKeyUp ) { - expect( 1 ); + function arrowsMoveFocus( assert, id, isKeyUp ) { + assert.expect( 1 ); var element = $( id ).autocomplete({ source: [ "a" ], @@ -152,14 +154,14 @@ test( "allow form submit on enter when menu is not active", function() { minLength: 0 }); element.autocomplete( "instance" )._move = function() { - ok( true, "repsond to arrow" ); + assert.ok( true, "repsond to arrow" ); }; element.autocomplete( "search" ); element.simulate( "keydown", { keyCode: ( isKeyUp ? $.ui.keyCode.UP : $.ui.keyCode.DOWN ) } ); } - function arrowsNavigateElement( id, isKeyUp, shouldMove ) { - expect( 1 ); + function arrowsNavigateElement( assert, id, isKeyUp, shouldMove ) { + assert.expect( 1 ); var didMove = false, element = $( id ).autocomplete({ @@ -172,19 +174,19 @@ test( "allow form submit on enter when menu is not active", function() { }); element.simulate( "keydown", { keyCode: ( isKeyUp ? $.ui.keyCode.UP : $.ui.keyCode.DOWN ) } ); element.simulate( "keypress" ); - equal( didMove, shouldMove, "respond to arrow" ); + assert.equal( didMove, shouldMove, "respond to arrow" ); } })(); -asyncTest( "past end of menu in multiline autocomplete", function() { - expect( 2 ); +QUnit.asyncTest( "past end of menu in multiline autocomplete", function( assert ) { + assert.expect( 2 ); var customVal = "custom value", element = $( "#autocomplete-contenteditable" ).autocomplete({ delay: 0, source: [ "javascript" ], focus: function( event, ui ) { - equal( ui.item.value, "javascript", "Item gained focus" ); + assert.equal( ui.item.value, "javascript", "Item gained focus" ); $( this ).text( customVal ); event.preventDefault(); } @@ -197,20 +199,20 @@ asyncTest( "past end of menu in multiline autocomplete", function() { setTimeout(function() { element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); - equal( element.text(), customVal ); - start(); + assert.equal( element.text(), customVal ); + QUnit.start(); }); }); -asyncTest( "ESCAPE in multiline autocomplete", function() { - expect( 2 ); +QUnit.asyncTest( "ESCAPE in multiline autocomplete", function( assert ) { + assert.expect( 2 ); var customVal = "custom value", element = $( "#autocomplete-contenteditable" ).autocomplete({ delay: 0, source: [ "javascript" ], focus: function( event, ui ) { - equal( ui.item.value, "javascript", "Item gained focus" ); + assert.equal( ui.item.value, "javascript", "Item gained focus" ); $( this ).text( customVal ); event.preventDefault(); } @@ -223,26 +225,26 @@ asyncTest( "ESCAPE in multiline autocomplete", function() { setTimeout(function() { element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); element.simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE } ); - equal( element.text(), customVal ); - start(); + assert.equal( element.text(), customVal ); + QUnit.start(); }); }); -asyncTest( "handle race condition", function() { - expect( 3 ); +QUnit.asyncTest( "handle race condition", function( assert ) { + assert.expect( 3 ); var count = 0, element = $( "#autocomplete" ).autocomplete({ source: function( request, response ) { count++; if ( request.term.length === 1 ) { - equal( count, 1, "request with 1 character is first" ); + assert.equal( count, 1, "request with 1 character is first" ); setTimeout(function() { response([ "one" ]); setTimeout( checkResults ); }); return; } - equal( count, 2, "request with 2 characters is second" ); + assert.equal( count, 2, "request with 2 characters is second" ); response([ "two" ]); } }); @@ -251,14 +253,14 @@ asyncTest( "handle race condition", function() { element.autocomplete( "search", "ab" ); function checkResults() { - equal( element.autocomplete( "widget" ).find( ".ui-menu-item" ).text(), "two", + assert.equal( element.autocomplete( "widget" ).find( ".ui-menu-item" ).text(), "two", "correct results displayed" ); - start(); + QUnit.start(); } }); -asyncTest( "simultaneous searches (#9334)", function() { - expect( 2 ); +QUnit.asyncTest( "simultaneous searches (#9334)", function( assert ) { + assert.expect( 2 ); var element = $( "#autocomplete" ).autocomplete({ source: function( request, response ) { setTimeout(function() { @@ -266,7 +268,7 @@ asyncTest( "simultaneous searches (#9334)", function() { }); }, response: function() { - ok( true, "response from first instance" ); + assert.ok( true, "response from first instance" ); } }), element2 = $( "#autocomplete-textarea" ).autocomplete({ @@ -276,8 +278,8 @@ asyncTest( "simultaneous searches (#9334)", function() { }); }, response: function() { - ok( true, "response from second instance" ); - start(); + assert.ok( true, "response from second instance" ); + QUnit.start(); } }); @@ -285,60 +287,60 @@ asyncTest( "simultaneous searches (#9334)", function() { element2.autocomplete( "search", "test" ); }); -test( "ARIA", function() { - expect( 13 ); +QUnit.test( "ARIA", function( assert ) { + assert.expect( 13 ); var element = $( "#autocomplete" ).autocomplete({ source: [ "java", "javascript" ] }), liveRegion = element.autocomplete( "instance" ).liveRegion; - equal( liveRegion.children().length, 0, "Empty live region on create" ); - equal( liveRegion.attr( "aria-live" ), "assertive", + assert.equal( liveRegion.children().length, 0, "Empty live region on create" ); + assert.equal( liveRegion.attr( "aria-live" ), "assertive", "Live region's aria-live attribute must be assertive" ); - equal( liveRegion.attr( "aria-relevant" ), "additions", + assert.equal( liveRegion.attr( "aria-relevant" ), "additions", "Live region's aria-relevant attribute must be additions" ); - equal( liveRegion.attr( "role" ), "status", + assert.equal( liveRegion.attr( "role" ), "status", "Live region's role attribute must be status" ); element.autocomplete( "search", "j" ); - equal( liveRegion.children().first().text(), + assert.equal( liveRegion.children().first().text(), "2 results are available, use up and down arrow keys to navigate.", "Live region for multiple values" ); element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); - equal( liveRegion.children().filter( ":visible" ).text(), "java", + assert.equal( liveRegion.children().filter( ":visible" ).text(), "java", "Live region changed on keydown to announce the highlighted value" ); element.one( "autocompletefocus", function( event ) { event.preventDefault(); }); element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); - equal( liveRegion.children().filter( ":visible" ).text(), "javascript", + assert.equal( liveRegion.children().filter( ":visible" ).text(), "javascript", "Live region updated when default focus is prevented" ); element.autocomplete( "search", "javas" ); - equal( liveRegion.children().filter( ":visible" ).text(), + assert.equal( liveRegion.children().filter( ":visible" ).text(), "1 result is available, use up and down arrow keys to navigate.", "Live region for one value" ); element.autocomplete( "search", "z" ); - equal( liveRegion.children().filter( ":visible" ).text(), "No search results.", + assert.equal( liveRegion.children().filter( ":visible" ).text(), "No search results.", "Live region for no values" ); - equal( liveRegion.children().length, 5, + assert.equal( liveRegion.children().length, 5, "Should be five children in the live region after the above" ); - equal( liveRegion.children().filter( ":visible" ).length, 1, + assert.equal( liveRegion.children().filter( ":visible" ).length, 1, "Only one should be still visible" ); - ok( liveRegion.children().filter( ":visible" )[ 0 ] === liveRegion.children().last()[ 0 ], + assert.ok( liveRegion.children().filter( ":visible" )[ 0 ] === liveRegion.children().last()[ 0 ], "The last one should be the visible one" ); element.autocomplete( "destroy" ); - equal( liveRegion.parent().length, 0, + assert.equal( liveRegion.parent().length, 0, "The liveRegion should be detached after destroy" ); }); -test( "ARIA, aria-label announcement", function() { - expect( 1 ); +QUnit.test( "ARIA, aria-label announcement", function( assert ) { + assert.expect( 1 ); $.widget( "custom.catcomplete", $.ui.autocomplete, { _renderMenu: function( ul, items ) { var that = this; @@ -354,31 +356,31 @@ test( "ARIA, aria-label announcement", function() { liveRegion = element.catcomplete( "instance" ).liveRegion; element.catcomplete( "search", "a" ); element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); - equal( liveRegion.children().filter( ":visible" ).text(), "People : anders andersson", + assert.equal( liveRegion.children().filter( ":visible" ).text(), "People : anders andersson", "Live region changed on keydown to announce the highlighted value's aria-label attribute" ); }); -test( "ARIA, init on detached input", function() { - expect( 1 ); +QUnit.test( "ARIA, init on detached input", function( assert ) { + assert.expect( 1 ); var element = $( "" ).autocomplete({ source: [ "java", "javascript" ] }), liveRegion = element.autocomplete( "instance" ).liveRegion; - equal( liveRegion.parent().length, 1, "liveRegion must have a parent" ); + assert.equal( liveRegion.parent().length, 1, "liveRegion must have a parent" ); }); -test( ".replaceWith() (#9172)", function() { - expect( 1 ); +QUnit.test( ".replaceWith() (#9172)", function( assert ) { + assert.expect( 1 ); var element = $( "#autocomplete" ).autocomplete(), replacement = "
test
", parent = element.parent(); element.replaceWith( replacement ); - equal( parent.html().toLowerCase(), replacement ); + assert.equal( parent.html().toLowerCase(), replacement ); }); -asyncTest( "Search if the user retypes the same value (#7434)", function() { - expect( 3 ); +QUnit.asyncTest( "Search if the user retypes the same value (#7434)", function( assert ) { + assert.expect( 3 ); var element = $( "#autocomplete" ).autocomplete({ source: [ "java", "javascript" ], delay: 0 @@ -387,13 +389,13 @@ asyncTest( "Search if the user retypes the same value (#7434)", function() { element.val( "j" ).simulate( "keydown" ); setTimeout(function() { - ok( menu.is( ":visible" ), "menu displays initially" ); + assert.ok( menu.is( ":visible" ), "menu displays initially" ); element.trigger( "blur" ); - ok( !menu.is( ":visible" ), "menu hidden after blur" ); + assert.ok( !menu.is( ":visible" ), "menu hidden after blur" ); element.val( "j" ).simulate( "keydown" ); setTimeout(function() { - ok( menu.is( ":visible" ), "menu displays after typing the same value" ); - start(); + assert.ok( menu.is( ":visible" ), "menu displays after typing the same value" ); + QUnit.start(); }); }); }); diff --git a/tests/unit/autocomplete/events.js b/tests/unit/autocomplete/events.js index 8f96fb77f1d..2ef9a464d52 100644 --- a/tests/unit/autocomplete/events.js +++ b/tests/unit/autocomplete/events.js @@ -1,9 +1,13 @@ -define( [ +define([ + "lib/qunit", "jquery", + "./helper", "ui/autocomplete" -], function( $ ) { +], function( QUnit, $, testHelper ) { -module( "autocomplete: events" ); +var setupTeardown = testHelper.setupTeardown; + +QUnit.module( "autocomplete: events", setupTeardown() ); var data = [ "Clojure", "COBOL", "ColdFusion", "Java", "JavaScript", "Scala", "Scheme" ]; @@ -24,18 +28,18 @@ $.each([ valueMethod: "text" } ], function( i, settings ) { - asyncTest( "all events - " + settings.type, function() { - expect( 13 ); + QUnit.asyncTest( "all events - " + settings.type, function( assert ) { + assert.expect( 13 ); var element = $( settings.selector ) .autocomplete({ autoFocus: false, delay: 0, source: data, search: function( event ) { - equal( event.originalEvent.type, "keydown", "search originalEvent" ); + assert.equal( event.originalEvent.type, "keydown", "search originalEvent" ); }, response: function( event, ui ) { - deepEqual( ui.content, [ + assert.deepEqual( ui.content, [ { label: "Clojure", value: "Clojure" }, { label: "Java", value: "Java" }, { label: "JavaScript", value: "JavaScript" } @@ -43,32 +47,32 @@ $.each([ ui.content.splice( 0, 1 ); }, open: function() { - ok( menu.is( ":visible" ), "menu open on open" ); + assert.ok( menu.is( ":visible" ), "menu open on open" ); }, focus: function( event, ui ) { - equal( event.originalEvent.type, "menufocus", "focus originalEvent" ); - deepEqual( ui.item, { label: "Java", value: "Java" }, "focus ui.item" ); + assert.equal( event.originalEvent.type, "menufocus", "focus originalEvent" ); + assert.deepEqual( ui.item, { label: "Java", value: "Java" }, "focus ui.item" ); }, close: function( event ) { - equal( event.originalEvent.type, "menuselect", "close originalEvent" ); - ok( menu.is( ":hidden" ), "menu closed on close" ); + assert.equal( event.originalEvent.type, "menuselect", "close originalEvent" ); + assert.ok( menu.is( ":hidden" ), "menu closed on close" ); }, select: function( event, ui ) { - equal( event.originalEvent.type, "menuselect", "select originalEvent" ); - deepEqual( ui.item, { label: "Java", value: "Java" }, "select ui.item" ); + assert.equal( event.originalEvent.type, "menuselect", "select originalEvent" ); + assert.deepEqual( ui.item, { label: "Java", value: "Java" }, "select ui.item" ); }, change: function( event, ui ) { - equal( event.originalEvent.type, "blur", "change originalEvent" ); - deepEqual( ui.item, { label: "Java", value: "Java" }, "change ui.item" ); - ok( menu.is( ":hidden" ), "menu closed on change" ); - start(); + assert.equal( event.originalEvent.type, "blur", "change originalEvent" ); + assert.deepEqual( ui.item, { label: "Java", value: "Java" }, "change ui.item" ); + assert.ok( menu.is( ":hidden" ), "menu closed on change" ); + QUnit.start(); } }), menu = element.autocomplete( "widget" ); element.simulate( "focus" )[ settings.valueMethod ]( "j" ).trigger( "keydown" ); setTimeout(function() { - ok( menu.is( ":visible" ), "menu is visible after delay" ); + assert.ok( menu.is( ":visible" ), "menu is visible after delay" ); element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); element.simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); // blur must be async for IE to handle it properly @@ -79,53 +83,53 @@ $.each([ }); }); -asyncTest( "change without selection", function() { - expect( 1 ); +QUnit.asyncTest( "change without selection", function( assert ) { + assert.expect( 1 ); var element = $( "#autocomplete" ).autocomplete({ delay: 0, source: data, change: function( event, ui ) { - strictEqual( ui.item, null ); - start(); + assert.strictEqual( ui.item, null ); + QUnit.start(); } }); element.triggerHandler( "focus" ); element.val( "ja" ).triggerHandler( "blur" ); }); -asyncTest( "cancel search", function() { - expect( 6 ); +QUnit.asyncTest( "cancel search", function( assert ) { + assert.expect( 6 ); var first = true, element = $( "#autocomplete" ).autocomplete({ delay: 0, source: data, search: function() { if ( first ) { - equal( element.val(), "ja", "val on first search" ); + assert.equal( element.val(), "ja", "val on first search" ); first = false; return false; } - equal( element.val(), "java", "val on second search" ); + assert.equal( element.val(), "java", "val on second search" ); }, open: function() { - ok( true, "menu opened" ); + assert.ok( true, "menu opened" ); } }), menu = element.autocomplete( "widget" ); element.val( "ja" ).trigger( "keydown" ); setTimeout(function() { - ok( menu.is( ":hidden" ), "menu is hidden after first search" ); + assert.ok( menu.is( ":hidden" ), "menu is hidden after first search" ); element.val( "java" ).trigger( "keydown" ); setTimeout(function() { - ok( menu.is( ":visible" ), "menu is visible after second search" ); - equal( menu.find( ".ui-menu-item" ).length, 2, "# of menu items" ); - start(); + assert.ok( menu.is( ":visible" ), "menu is visible after second search" ); + assert.equal( menu.find( ".ui-menu-item" ).length, 2, "# of menu items" ); + QUnit.start(); }); }); }); -asyncTest( "cancel focus", function() { - expect( 1 ); +QUnit.asyncTest( "cancel focus", function( assert ) { + assert.expect( 1 ); var customVal = "custom value", element = $( "#autocomplete" ).autocomplete({ delay: 0, @@ -138,13 +142,13 @@ asyncTest( "cancel focus", function() { element.val( "ja" ).trigger( "keydown" ); setTimeout(function() { element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); - equal( element.val(), customVal ); - start(); + assert.equal( element.val(), customVal ); + QUnit.start(); }); }); -asyncTest( "cancel select", function() { - expect( 1 ); +QUnit.asyncTest( "cancel select", function( assert ) { + assert.expect( 1 ); var customVal = "custom value", element = $( "#autocomplete" ).autocomplete({ delay: 0, @@ -158,25 +162,25 @@ asyncTest( "cancel select", function() { setTimeout(function() { element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); element.simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); - equal( element.val(), customVal ); - start(); + assert.equal( element.val(), customVal ); + QUnit.start(); }); }); -asyncTest( "blur during remote search", function() { - expect( 1 ); +QUnit.asyncTest( "blur during remote search", function( assert ) { + assert.expect( 1 ); var ac = $( "#autocomplete" ).autocomplete({ delay: 0, source: function( request, response ) { - ok( true, "trigger request" ); + assert.ok( true, "trigger request" ); ac.simulate( "blur" ); setTimeout(function() { response([ "result" ]); - start(); + QUnit.start(); }, 25); }, open: function() { - ok( false, "opened after a blur" ); + assert.ok( false, "opened after a blur" ); } }); ac.val( "ro" ).trigger( "keydown" ); diff --git a/tests/unit/autocomplete/helper.js b/tests/unit/autocomplete/helper.js new file mode 100644 index 00000000000..e382857a261 --- /dev/null +++ b/tests/unit/autocomplete/helper.js @@ -0,0 +1,26 @@ +define( [ + "intern!qunit", + "jquery", + "lib/helper", + "lib/css", + "text!tests/unit/autocomplete/autocomplete.html", + "ui/accordion", + "jquery-simulate", + "./common" +], function( QUnit, $, helper, cssjs, htmlContent ) { +cssjs( { module: "core menu autocomplete" } ); + +return $.extend( helper, { + setupTeardown: function() { + return { + setup: function() { + $("body").append(htmlContent); + }, + teardown: function() { + $("#qunit-fixture").remove(); + } + }; + } +} ); + +} ); diff --git a/tests/unit/autocomplete/methods.js b/tests/unit/autocomplete/methods.js index 32080207add..72423f7b6ce 100644 --- a/tests/unit/autocomplete/methods.js +++ b/tests/unit/autocomplete/methods.js @@ -1,19 +1,22 @@ -define( [ +define([ 'qunit', "jquery", + "./helper", "ui/autocomplete" -], function( $ ) { +], function( QUnit, $, testHelper ) { -module( "autocomplete: methods" ); +var setupTeardown = testHelper.setupTeardown; -test( "destroy", function( assert ) { - expect( 1 ); +QUnit.module( "autocomplete: methods", setupTeardown() ); + +QUnit.test( "destroy", function( assert ) { + assert.expect( 1 ); assert.domEqual( "#autocomplete", function() { $( "#autocomplete" ).autocomplete().autocomplete( "destroy" ); }); }); -test( "search, close", function() { - expect( 6 ); +QUnit.test( "search, close", function( assert ) { + assert.expect( 6 ); var data = [ "c++", "java", "php", "coldfusion", "javascript", "asp", "ruby", "python", "c", "scala", "groovy", "haskell", "perl" ], element = $( "#autocomplete" ).autocomplete({ source: data, @@ -21,27 +24,27 @@ test( "search, close", function() { }), menu = element.autocomplete( "widget" ); - ok( menu.is( ":hidden" ), "menu is hidden on init" ); + assert.ok( menu.is( ":hidden" ), "menu is hidden on init" ); element.autocomplete( "search" ); - ok( menu.is( ":visible" ), "menu is visible after search" ); - equal( menu.find( ".ui-menu-item" ).length, data.length, "all items for a blank search" ); + assert.ok( menu.is( ":visible" ), "menu is visible after search" ); + assert.equal( menu.find( ".ui-menu-item" ).length, data.length, "all items for a blank search" ); element.val( "has" ).autocomplete( "search" ); - equal( menu.find( ".ui-menu-item" ).text(), "haskell", "only one item for set input value" ); + assert.equal( menu.find( ".ui-menu-item" ).text(), "haskell", "only one item for set input value" ); element.autocomplete( "search", "ja" ); - equal( menu.find( ".ui-menu-item" ).length, 2, "only java and javascript for 'ja'" ); + assert.equal( menu.find( ".ui-menu-item" ).length, 2, "only java and javascript for 'ja'" ); element.autocomplete( "close" ); - ok( menu.is( ":hidden" ), "menu is hidden after close" ); + assert.ok( menu.is( ":hidden" ), "menu is hidden after close" ); }); -test( "widget", function( assert ) { - expect( 2 ); +QUnit.test( "widget", function( assert ) { + assert.expect( 2 ); var element = $( "#autocomplete" ).autocomplete(), widgetElement = element.autocomplete( "widget" ); - equal( widgetElement.length, 1, "one element" ); + assert.equal( widgetElement.length, 1, "one element" ); assert.hasClasses( widgetElement, "ui-menu" ); }); diff --git a/tests/unit/autocomplete/options.js b/tests/unit/autocomplete/options.js index 06c75722b32..63bffe71863 100644 --- a/tests/unit/autocomplete/options.js +++ b/tests/unit/autocomplete/options.js @@ -1,108 +1,110 @@ -define( [ +define([ 'qunit', "jquery", + "./helper", "ui/autocomplete" -], function( $ ) { +], function( QUnit, $, testHelper ) { -module( "autocomplete: options" ); +var setupTeardown = testHelper.setupTeardown; + +QUnit.module( "autocomplete: options", setupTeardown() ); var data = [ "c++", "java", "php", "coldfusion", "javascript", "asp", "ruby", "python", "c", "scala", "groovy", "haskell", "perl" ]; -test( "appendTo: null", function() { - expect( 1 ); +QUnit.test( "appendTo: null", function( assert ) { + assert.expect( 1 ); var element = $( "#autocomplete" ).autocomplete(); - equal( element.autocomplete( "widget" ).parent()[ 0 ], document.body, + assert.equal( element.autocomplete( "widget" ).parent()[ 0 ], document.body, "defaults to body" ); element.autocomplete( "destroy" ); }); -test( "appendTo: explicit", function() { - expect( 6 ); +QUnit.test( "appendTo: explicit", function( assert ) { + assert.expect( 6 ); var detached = $( "
" ), element = $( "#autocomplete" ); element.autocomplete({ appendTo: ".autocomplete-wrap" }); - equal( element.autocomplete( "widget" ).parent()[ 0 ], + assert.equal( element.autocomplete( "widget" ).parent()[ 0 ], $( "#autocomplete-wrap1" )[ 0 ], "first found element" ); - equal( $( "#autocomplete-wrap2 .ui-autocomplete" ).length, 0, + assert.equal( $( "#autocomplete-wrap2 .ui-autocomplete" ).length, 0, "only appends to one element" ); element.autocomplete( "destroy" ); element.autocomplete().autocomplete( "option", "appendTo", "#autocomplete-wrap1" ); - equal( element.autocomplete( "widget" ).parent()[ 0 ], + assert.equal( element.autocomplete( "widget" ).parent()[ 0 ], $( "#autocomplete-wrap1" )[ 0 ], "modified after init" ); element.autocomplete( "destroy" ); element.autocomplete({ appendTo: detached }); - equal( element.autocomplete( "widget" ).parent()[ 0 ], detached[ 0 ], + assert.equal( element.autocomplete( "widget" ).parent()[ 0 ], detached[ 0 ], "detached jQuery object" ); element.autocomplete( "destroy" ); element.autocomplete({ appendTo: detached[ 0 ] }); - equal( element.autocomplete( "widget" ).parent()[ 0 ], detached[ 0 ], + assert.equal( element.autocomplete( "widget" ).parent()[ 0 ], detached[ 0 ], "detached DOM element" ); element.autocomplete( "destroy" ); element.autocomplete().autocomplete( "option", "appendTo", detached ); - equal( element.autocomplete( "widget" ).parent()[ 0 ], detached[ 0 ], + assert.equal( element.autocomplete( "widget" ).parent()[ 0 ], detached[ 0 ], "detached DOM element via option()" ); element.autocomplete( "destroy" ); }); -test( "appendTo: ui-front", function() { - expect( 2 ); +QUnit.test( "appendTo: ui-front", function( assert ) { + assert.expect( 2 ); var element = $( "#autocomplete" ); $( "#autocomplete-wrap2" ).addClass( "ui-front" ); element.autocomplete(); - equal( element.autocomplete( "widget" ).parent()[ 0 ], + assert.equal( element.autocomplete( "widget" ).parent()[ 0 ], $( "#autocomplete-wrap2" )[ 0 ], "null, inside .ui-front" ); element.autocomplete( "destroy" ); element.autocomplete({ appendTo: $() }); - equal( element.autocomplete( "widget" ).parent()[ 0 ], + assert.equal( element.autocomplete( "widget" ).parent()[ 0 ], $( "#autocomplete-wrap2" )[ 0 ], "empty jQuery object, inside .ui-front" ); }); -function autoFocusTest( afValue, focusedLength ) { +function autoFocusTest( assert, afValue, focusedLength ) { var element = $( "#autocomplete" ).autocomplete({ autoFocus: afValue, delay: 0, source: data, open: function() { - equal( + assert.equal( element.autocomplete( "widget" ) .find( ".ui-menu-item-wrapper.ui-state-active" ) .length, focusedLength, "first item is " + (afValue ? "" : "not") + " auto focused" ); - start(); + QUnit.start(); } }); element.val( "ja" ).trigger( "keydown" ); - stop(); } -test( "autoFocus: false", function() { - expect( 1 ); - autoFocusTest( false, 0 ); +QUnit.asyncTest( "autoFocus: false", function( assert ) { + assert.expect( 1 ); + autoFocusTest( assert, false, 0 ); }); -test( "autoFocus: true", function() { - expect( 1 ); - autoFocusTest( true, 1 ); +QUnit.asyncTest( "autoFocus: true", function( assert ) { + assert.expect( 1 ); + autoFocusTest( assert, true, 1 ); }); -asyncTest( "delay", function() { - expect( 2 ); +QUnit.asyncTest( "delay", function( assert ) { + assert.expect( 2 ); var element = $( "#autocomplete" ).autocomplete({ source: data, delay: 25 @@ -110,16 +112,16 @@ asyncTest( "delay", function() { menu = element.autocomplete( "widget" ); element.val( "ja" ).trigger( "keydown" ); - ok( menu.is( ":hidden" ), "menu is closed immediately after search" ); + assert.ok( menu.is( ":hidden" ), "menu is closed immediately after search" ); setTimeout(function() { - ok( menu.is( ":visible" ), "menu is open after delay" ); - start(); + assert.ok( menu.is( ":visible" ), "menu is open after delay" ); + QUnit.start(); }, 50 ); }); -asyncTest( "disabled", function( assert ) { - expect( 5 ); +QUnit.asyncTest( "disabled", function( assert ) { + assert.expect( 5 ); var element = $( "#autocomplete" ).autocomplete({ source: data, delay: 0 @@ -127,38 +129,38 @@ asyncTest( "disabled", function( assert ) { menu = element.autocomplete( "disable" ).autocomplete( "widget" ); element.val( "ja" ).trigger( "keydown" ); - ok( menu.is( ":hidden" ) ); + assert.ok( menu.is( ":hidden" ) ); assert.lacksClasses( element, "ui-state-disabled" ); assert.hasClasses( menu, "ui-autocomplete-disabled" ); - ok( !element.attr( "aria-disabled" ), "element doesn't get aria-disabled" ); + assert.ok( !element.attr( "aria-disabled" ), "element doesn't get aria-disabled" ); setTimeout(function() { - ok( menu.is( ":hidden" ) ); - start(); + assert.ok( menu.is( ":hidden" ) ); + QUnit.start(); }); }); -test( "minLength", function() { - expect( 2 ); +QUnit.test( "minLength", function( assert ) { + assert.expect( 2 ); var element = $( "#autocomplete" ).autocomplete({ source: data }), menu = element.autocomplete( "widget" ); element.autocomplete( "search", "" ); - ok( menu.is( ":hidden" ), "blank not enough for minLength: 1" ); + assert.ok( menu.is( ":hidden" ), "blank not enough for minLength: 1" ); element.autocomplete( "option", "minLength", 0 ); element.autocomplete( "search", "" ); - ok( menu.is( ":visible" ), "blank enough for minLength: 0" ); + assert.ok( menu.is( ":visible" ), "blank enough for minLength: 0" ); }); -asyncTest( "minLength, exceed then drop below", function() { - expect( 4 ); +QUnit.asyncTest( "minLength, exceed then drop below", function( assert ) { + assert.expect( 4 ); var element = $( "#autocomplete" ).autocomplete({ minLength: 2, source: function( req, res ) { - equal( req.term, "12", "correct search term" ); + assert.equal( req.term, "12", "correct search term" ); setTimeout(function() { res([ "item" ]); }); @@ -166,20 +168,20 @@ asyncTest( "minLength, exceed then drop below", function() { }), menu = element.autocomplete( "widget" ); - ok( menu.is( ":hidden" ), "menu is hidden before first search" ); + assert.ok( menu.is( ":hidden" ), "menu is hidden before first search" ); element.autocomplete( "search", "12" ); - ok( menu.is( ":hidden" ), "menu is hidden before second search" ); + assert.ok( menu.is( ":hidden" ), "menu is hidden before second search" ); element.autocomplete( "search", "1" ); setTimeout(function() { - ok( menu.is( ":hidden" ), "menu is hidden after searches" ); - start(); + assert.ok( menu.is( ":hidden" ), "menu is hidden after searches" ); + QUnit.start(); }); }); -test( "minLength, exceed then drop below then exceed", function() { - expect( 3 ); +QUnit.test( "minLength, exceed then drop below then exceed", function( assert ) { + assert.expect( 3 ); var _res = [], element = $( "#autocomplete" ).autocomplete({ minLength: 2, @@ -190,11 +192,11 @@ test( "minLength, exceed then drop below then exceed", function() { menu = element.autocomplete( "widget" ); // trigger a valid search - ok( menu.is( ":hidden" ), "menu is hidden before first search" ); + assert.ok( menu.is( ":hidden" ), "menu is hidden before first search" ); element.autocomplete( "search", "12" ); // trigger a search below the minLength, to turn on cancelSearch flag - ok( menu.is( ":hidden" ), "menu is hidden before second search" ); + assert.ok( menu.is( ":hidden" ), "menu is hidden before second search" ); element.autocomplete( "search", "1" ); // trigger a valid search @@ -204,46 +206,45 @@ test( "minLength, exceed then drop below then exceed", function() { // react to second search _res[ 1 ]([ "13" ]); - ok( menu.is( ":visible" ), "menu is visible after searches" ); + assert.ok( menu.is( ":visible" ), "menu is visible after searches" ); }); -test( "source, local string array", function() { - expect( 1 ); +QUnit.test( "source, local string array", function( assert ) { + assert.expect( 1 ); var element = $( "#autocomplete" ).autocomplete({ source: data }), menu = element.autocomplete( "widget" ); element.val( "ja" ).autocomplete( "search" ); - equal( menu.find( ".ui-menu-item" ).text(), "javajavascript" ); + assert.equal( menu.find( ".ui-menu-item" ).text(), "javajavascript" ); }); -function sourceTest( source, async ) { +function sourceTest( assert, source, async ) { var element = $( "#autocomplete" ).autocomplete({ source: source }), menu = element.autocomplete( "widget" ); function result() { var items = menu.find( ".ui-menu-item" ); - equal( items.length, 3, "Should find three results." ); - deepEqual( items.eq( 0 ).data( "ui-autocomplete-item" ), { + assert.equal( items.length, 3, "Should find three results." ); + assert.deepEqual( items.eq( 0 ).data( "ui-autocomplete-item" ), { label: "java", value: "java" }); - deepEqual( items.eq( 1 ).data( "ui-autocomplete-item" ), { + assert.deepEqual( items.eq( 1 ).data( "ui-autocomplete-item" ), { label: "javascript", value: "javascript" }); - deepEqual( items.eq( 2 ).data( "ui-autocomplete-item" ), { + assert.deepEqual( items.eq( 2 ).data( "ui-autocomplete-item" ), { label: "clojure", value: "clojure" }); element.autocomplete( "destroy" ); if ( async ) { - start(); + QUnit.start(); } } if ( async ) { - stop(); $( document ).one( "ajaxStop", result ); } element.val( "j" ).autocomplete( "search" ); @@ -252,9 +253,9 @@ function sourceTest( source, async ) { } } -test( "source, local object array, only labels", function() { - expect( 4 ); - sourceTest([ +QUnit.test( "source, local object array, only labels", function( assert ) { + assert.expect( 4 ); + sourceTest( assert, [ { label: "java", value: null }, { label: "php", value: null }, { label: "coldfusion", value: "" }, @@ -263,9 +264,9 @@ test( "source, local object array, only labels", function() { ]); }); -test( "source, local object array, only values", function() { - expect( 4 ); - sourceTest([ +QUnit.test( "source, local object array, only values", function( assert ) { + assert.expect( 4 ); + sourceTest( assert, [ { value: "java", label: null }, { value: "php", label: null }, { value: "coldfusion", label: "" }, @@ -274,25 +275,25 @@ test( "source, local object array, only values", function() { ]); }); -test( "source, url string with remote json string array", function() { - expect( 4 ); - sourceTest( "remote_string_array.txt", true ); +QUnit.asyncTest( "source, url string with remote json string array", function( assert ) { + assert.expect( 4 ); + sourceTest( assert, "../../tests/unit/autocomplete/remote_string_array.txt", true ); }); -test( "source, url string with remote json object array, only value properties", function() { - expect( 4 ); - sourceTest( "remote_object_array_values.txt", true ); +QUnit.asyncTest( "source, url string with remote json object array, only value properties", function( assert ) { + assert.expect( 4 ); + sourceTest( assert, "../../tests/unit/autocomplete/remote_object_array_values.txt", true ); }); -test( "source, url string with remote json object array, only label properties", function() { - expect( 4 ); - sourceTest( "remote_object_array_labels.txt", true ); +QUnit.asyncTest( "source, url string with remote json object array, only label properties", function( assert ) { + assert.expect( 4 ); + sourceTest( assert, "../../tests/unit/autocomplete/remote_object_array_labels.txt", true ); }); -test( "source, custom", function() { - expect( 5 ); - sourceTest(function( request, response ) { - equal( request.term, "j" ); +QUnit.test( "source, custom", function( assert ) { + assert.expect( 5 ); + sourceTest( assert,function( request, response ) { + assert.equal( request.term, "j" ); response([ "java", { label: "javascript", value: null }, @@ -301,17 +302,17 @@ test( "source, custom", function() { }); }); -test( "source, update after init", function() { - expect( 2 ); +QUnit.test( "source, update after init", function( assert ) { + assert.expect( 2 ); var element = $( "#autocomplete" ).autocomplete({ source: [ "java", "javascript", "haskell" ] }), menu = element.autocomplete( "widget" ); element.val( "ja" ).autocomplete( "search" ); - equal( menu.find( ".ui-menu-item" ).text(), "javajavascript" ); + assert.equal( menu.find( ".ui-menu-item" ).text(), "javajavascript" ); element.autocomplete( "option", "source", [ "php", "asp" ] ); element.val( "ph" ).autocomplete( "search" ); - equal( menu.find( ".ui-menu-item" ).text(), "php" ); + assert.equal( menu.find( ".ui-menu-item" ).text(), "php" ); }); } );