mirror of
https://github.com/jquery/jquery.git
synced 2024-11-23 02:54:22 +00:00
Manage bower dependencies with grunt-bowercopy
Tracked bower dependencies are located at "src/sizzle" and "test/libs". The source-destination mapping is in the Gruntfile. When updating a bower dependency, update the version in bower.json, run `grunt bower`, and then commit the result. When adding a dependency, update the bowercopy task accordingly. Fixes #14615. Closes gh-1452.
This commit is contained in:
parent
ed20e7c645
commit
f9ad13c9ec
7
.gitignore
vendored
7
.gitignore
vendored
@ -1,4 +1,4 @@
|
|||||||
dist
|
/dist
|
||||||
.project
|
.project
|
||||||
.settings
|
.settings
|
||||||
*~
|
*~
|
||||||
@ -6,9 +6,8 @@ dist
|
|||||||
*.patch
|
*.patch
|
||||||
/*.html
|
/*.html
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
.bower.json
|
||||||
|
.sizecache.json
|
||||||
dist/.destination.json
|
dist/.destination.json
|
||||||
dist/.sizecache.json
|
|
||||||
build/.sizecache.json
|
|
||||||
bower_components
|
bower_components
|
||||||
bower_modules
|
|
||||||
node_modules
|
node_modules
|
||||||
|
@ -19,5 +19,5 @@
|
|||||||
"disallowKeywordsOnNewLine": [ "else" ],
|
"disallowKeywordsOnNewLine": [ "else" ],
|
||||||
"requireLineFeedAtFileEnd": true,
|
"requireLineFeedAtFileEnd": true,
|
||||||
|
|
||||||
"excludeFiles": [ "src/intro.js", "src/outro.js" ]
|
"excludeFiles": [ "src/intro.js", "src/outro.js", "src/sizzle/**/*" ]
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
src/intro.js
|
src/intro.js
|
||||||
src/outro.js
|
src/outro.js
|
||||||
|
src/sizzle/**/*
|
||||||
|
test/libs/**/*
|
||||||
test/data/jquery-1.9.1.js
|
test/data/jquery-1.9.1.js
|
||||||
bower_modules
|
|
||||||
test/data/badcall.js
|
test/data/badcall.js
|
||||||
test/data/badjson.js
|
test/data/badjson.js
|
||||||
test/data/json_obj.js
|
test/data/json_obj.js
|
||||||
|
25
Gruntfile.js
25
Gruntfile.js
@ -10,7 +10,6 @@ module.exports = function( grunt ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var gzip = require( "gzip-js" ),
|
var gzip = require( "gzip-js" ),
|
||||||
path = require( "path" ),
|
|
||||||
srcHintOptions = readOptionalJSON( "src/.jshintrc" );
|
srcHintOptions = readOptionalJSON( "src/.jshintrc" );
|
||||||
|
|
||||||
// The concatenated file won't pass onevar
|
// The concatenated file won't pass onevar
|
||||||
@ -47,14 +46,23 @@ module.exports = function( grunt ) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
bower: {
|
bowercopy: {
|
||||||
install: {
|
|
||||||
options: {
|
options: {
|
||||||
targetDir: "bower_modules",
|
clean: true
|
||||||
cleanup: true,
|
},
|
||||||
layout: function( type ) {
|
src: {
|
||||||
return path.join( type );
|
files: {
|
||||||
|
"src/sizzle": "sizzle"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
tests: {
|
||||||
|
options: {
|
||||||
|
destPrefix: "test/libs"
|
||||||
|
},
|
||||||
|
files: {
|
||||||
|
"qunit": "qunit/qunit",
|
||||||
|
"require.js": "requirejs/require.js",
|
||||||
|
"sinon/fake_timers.js": "sinon/lib/sinon/util/fake_timers.js"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -139,6 +147,9 @@ module.exports = function( grunt ) {
|
|||||||
// Integrate jQuery specific tasks
|
// Integrate jQuery specific tasks
|
||||||
grunt.loadTasks( "build/tasks" );
|
grunt.loadTasks( "build/tasks" );
|
||||||
|
|
||||||
|
// Alias bower to bowercopy
|
||||||
|
grunt.registerTask( "bower", "bowercopy" );
|
||||||
|
|
||||||
// Short list as a high frequency watch task
|
// Short list as a high frequency watch task
|
||||||
grunt.registerTask( "dev", [ "build:*:*", "jshint", "jscs" ] );
|
grunt.registerTask( "dev", [ "build:*:*", "jshint", "jscs" ] );
|
||||||
|
|
||||||
|
15
bower.json
15
bower.json
@ -20,21 +20,6 @@
|
|||||||
"qunit": "~1.12.0",
|
"qunit": "~1.12.0",
|
||||||
"sinon": "~1.7.3"
|
"sinon": "~1.7.3"
|
||||||
},
|
},
|
||||||
"exportsOverride": {
|
|
||||||
"sizzle": {
|
|
||||||
"sizzle": "."
|
|
||||||
},
|
|
||||||
|
|
||||||
"requirejs": {
|
|
||||||
"requirejs": "require.js"
|
|
||||||
},
|
|
||||||
"qunit": {
|
|
||||||
"qunit": "qunit"
|
|
||||||
},
|
|
||||||
"sinon": {
|
|
||||||
"sinon": "**/*.js"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"jquery",
|
"jquery",
|
||||||
"javascript",
|
"javascript",
|
||||||
|
@ -18,8 +18,6 @@ var releaseVersion,
|
|||||||
pkg,
|
pkg,
|
||||||
branch,
|
branch,
|
||||||
|
|
||||||
sizzleLoc = "bower_modules/sizzle",
|
|
||||||
|
|
||||||
scpURL = "jqadmin@code.origin.jquery.com:/var/www/html/code.jquery.com/",
|
scpURL = "jqadmin@code.origin.jquery.com:/var/www/html/code.jquery.com/",
|
||||||
cdnURL = "http://code.origin.jquery.com/",
|
cdnURL = "http://code.origin.jquery.com/",
|
||||||
repoURL = "git@github.com:jquery/jquery.git",
|
repoURL = "git@github.com:jquery/jquery.git",
|
||||||
@ -103,9 +101,6 @@ function initialize( next ) {
|
|||||||
if ( !exists( "package.json" ) ) {
|
if ( !exists( "package.json" ) ) {
|
||||||
die( "No package.json in this directory" );
|
die( "No package.json in this directory" );
|
||||||
}
|
}
|
||||||
if ( !exists( sizzleLoc ) ) {
|
|
||||||
die( "Sizzle expected to exist at " + sizzleLoc );
|
|
||||||
}
|
|
||||||
pkg = readJSON( "package.json" );
|
pkg = readJSON( "package.json" );
|
||||||
|
|
||||||
console.log( "Current version is " + pkg.version + "; generating release " + releaseVersion );
|
console.log( "Current version is " + pkg.version + "; generating release " + releaseVersion );
|
||||||
@ -309,18 +304,12 @@ function commitDistFiles( next ) {
|
|||||||
// Add files to be committed
|
// Add files to be committed
|
||||||
git( [ "add", "package.json" ], function() {
|
git( [ "add", "package.json" ], function() {
|
||||||
git( [ "commit", "-m", "Remove scripts property from package.json" ], function() {
|
git( [ "commit", "-m", "Remove scripts property from package.json" ], function() {
|
||||||
// Add sizzle in a separate commit to avoid a big diff
|
|
||||||
// Use force to add normally ignored files
|
|
||||||
git( [ "add", "-f", sizzleLoc ], function() {
|
|
||||||
git( [ "commit", "-m", "Add sizzle" ], function() {
|
|
||||||
// Add jquery files for distribution in a final commit
|
// Add jquery files for distribution in a final commit
|
||||||
git( [ "add", "-f", devFile, minFile, mapFile ], function() {
|
git( [ "add", "-f", devFile, minFile, mapFile ], function() {
|
||||||
git( [ "commit", "-m", releaseVersion ], next, debug );
|
git( [ "commit", "-m", releaseVersion ], next, debug );
|
||||||
}, debug );
|
}, debug );
|
||||||
}, debug );
|
}, debug );
|
||||||
}, debug );
|
}, debug );
|
||||||
}, debug );
|
|
||||||
}, debug );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function tagRelease( next ) {
|
function tagRelease( next ) {
|
||||||
|
@ -26,7 +26,7 @@ module.exports = function( grunt ) {
|
|||||||
endFile: "src/outro.js"
|
endFile: "src/outro.js"
|
||||||
},
|
},
|
||||||
paths: {
|
paths: {
|
||||||
sizzle: "../bower_modules/sizzle/dist/sizzle"
|
sizzle: "sizzle/dist/sizzle"
|
||||||
},
|
},
|
||||||
rawText: {},
|
rawText: {},
|
||||||
onBuildWrite: convert
|
onBuildWrite: convert
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"archiver": "~0.4.10",
|
"archiver": "~0.4.10",
|
||||||
"grunt": "~0.4.1",
|
"grunt": "~0.4.1",
|
||||||
"grunt-bower-task": "~0.3.2",
|
"grunt-bowercopy": "~0.4.1",
|
||||||
"grunt-cli": "~0.1.11",
|
"grunt-cli": "~0.1.11",
|
||||||
"grunt-compare-size": "~0.4.0",
|
"grunt-compare-size": "~0.4.0",
|
||||||
"grunt-contrib-jshint": "~0.7.0",
|
"grunt-contrib-jshint": "~0.7.0",
|
||||||
@ -48,9 +48,6 @@
|
|||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "npm install && grunt",
|
"build": "npm install && grunt",
|
||||||
|
|
||||||
"install": "grunt bower",
|
|
||||||
|
|
||||||
"start": "grunt watch",
|
"start": "grunt watch",
|
||||||
"test": "grunt"
|
"test": "grunt"
|
||||||
}
|
}
|
||||||
|
2013
src/sizzle/dist/sizzle.js
vendored
Normal file
2013
src/sizzle/dist/sizzle.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3
src/sizzle/dist/sizzle.min.js
vendored
Normal file
3
src/sizzle/dist/sizzle.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/sizzle/dist/sizzle.min.map
vendored
Normal file
1
src/sizzle/dist/sizzle.min.map
vendored
Normal file
File diff suppressed because one or more lines are too long
0
src/sizzle/test/data/empty.js
Normal file
0
src/sizzle/test/data/empty.js
Normal file
22
src/sizzle/test/data/mixed_sort.html
Normal file
22
src/sizzle/test/data/mixed_sort.html
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<script>var QUnit = parent.QUnit</script>
|
||||||
|
<script src="testinit.js"></script>
|
||||||
|
<script src="../../dist/sizzle.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<script>
|
||||||
|
var doc = parent.document,
|
||||||
|
unframed = [ doc.getElementById( "qunit-fixture" ), doc.body, doc.documentElement ],
|
||||||
|
framed = Sizzle( "*" );
|
||||||
|
|
||||||
|
window.parent.iframeCallback(
|
||||||
|
Sizzle.uniqueSort( unframed.concat( framed ) ),
|
||||||
|
framed.concat( unframed.reverse() ),
|
||||||
|
"Mixed array was sorted correctly"
|
||||||
|
);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
136
src/sizzle/test/data/testinit.js
Normal file
136
src/sizzle/test/data/testinit.js
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
var fireNative,
|
||||||
|
jQuery = this.jQuery || "jQuery", // For testing .noConflict()
|
||||||
|
$ = this.$ || "$",
|
||||||
|
originaljQuery = jQuery,
|
||||||
|
original$ = $;
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
// Config parameter to force basic code paths
|
||||||
|
QUnit.config.urlConfig.push({
|
||||||
|
id: "basic",
|
||||||
|
label: "Bypass optimizations",
|
||||||
|
tooltip: "Force use of the most basic code by disabling native querySelectorAll; contains; compareDocumentPosition"
|
||||||
|
});
|
||||||
|
if ( QUnit.urlParams.basic ) {
|
||||||
|
document.querySelectorAll = null;
|
||||||
|
document.documentElement.contains = null;
|
||||||
|
document.documentElement.compareDocumentPosition = null;
|
||||||
|
// Return array of length two to pass assertion
|
||||||
|
// But support should be false as its not native
|
||||||
|
document.getElementsByClassName = function() { return [ 0, 1 ]; };
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array of elements with the given IDs
|
||||||
|
* @example q("main", "foo", "bar")
|
||||||
|
* @result [<div id="main">, <span id="foo">, <input id="bar">]
|
||||||
|
*/
|
||||||
|
function q() {
|
||||||
|
var r = [],
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
for ( ; i < arguments.length; i++ ) {
|
||||||
|
r.push( document.getElementById( arguments[i] ) );
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asserts that a select matches the given IDs
|
||||||
|
* @param {String} a - Assertion name
|
||||||
|
* @param {String} b - Sizzle selector
|
||||||
|
* @param {String} c - Array of ids to construct what is expected
|
||||||
|
* @example t("Check for something", "//[a]", ["foo", "baar"]);
|
||||||
|
* @result returns true if "//[a]" return two elements with the IDs 'foo' and 'baar'
|
||||||
|
*/
|
||||||
|
function t( a, b, c ) {
|
||||||
|
var f = Sizzle(b),
|
||||||
|
s = "",
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
for ( ; i < f.length; i++ ) {
|
||||||
|
s += ( s && "," ) + '"' + f[ i ].id + '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
deepEqual(f, q.apply( q, c ), a + " (" + b + ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add random number to url to stop caching
|
||||||
|
*
|
||||||
|
* @example url("data/test.html")
|
||||||
|
* @result "data/test.html?10538358428943"
|
||||||
|
*
|
||||||
|
* @example url("data/test.php?foo=bar")
|
||||||
|
* @result "data/test.php?foo=bar&10538358345554"
|
||||||
|
*/
|
||||||
|
function url( value ) {
|
||||||
|
return value + (/\?/.test(value) ? "&" : "?") + new Date().getTime() + "" + parseInt(Math.random()*100000);
|
||||||
|
}
|
||||||
|
|
||||||
|
var createWithFriesXML = function() {
|
||||||
|
var string = '<?xml version="1.0" encoding="UTF-8"?> \
|
||||||
|
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" \
|
||||||
|
xmlns:xsd="http://www.w3.org/2001/XMLSchema" \
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> \
|
||||||
|
<soap:Body> \
|
||||||
|
<jsconf xmlns="http://www.example.com/ns1"> \
|
||||||
|
<response xmlns:ab="http://www.example.com/ns2"> \
|
||||||
|
<meta> \
|
||||||
|
<component id="seite1" class="component"> \
|
||||||
|
<properties xmlns:cd="http://www.example.com/ns3"> \
|
||||||
|
<property name="prop1"> \
|
||||||
|
<thing /> \
|
||||||
|
<value>1</value> \
|
||||||
|
</property> \
|
||||||
|
<property name="prop2"> \
|
||||||
|
<thing att="something" /> \
|
||||||
|
</property> \
|
||||||
|
<foo_bar>foo</foo_bar> \
|
||||||
|
</properties> \
|
||||||
|
</component> \
|
||||||
|
</meta> \
|
||||||
|
</response> \
|
||||||
|
</jsconf> \
|
||||||
|
</soap:Body> \
|
||||||
|
</soap:Envelope>';
|
||||||
|
|
||||||
|
return jQuery.parseXML( string );
|
||||||
|
};
|
||||||
|
|
||||||
|
fireNative = document.createEvent ?
|
||||||
|
function( node, type ) {
|
||||||
|
var event = document.createEvent("HTMLEvents");
|
||||||
|
event.initEvent( type, true, true );
|
||||||
|
node.dispatchEvent( event );
|
||||||
|
} :
|
||||||
|
function( node, type ) {
|
||||||
|
var event = document.createEventObject();
|
||||||
|
node.fireEvent( "on" + type, event );
|
||||||
|
};
|
||||||
|
|
||||||
|
function testIframeWithCallback( title, fileName, func ) {
|
||||||
|
test( title, function() {
|
||||||
|
var iframe;
|
||||||
|
|
||||||
|
stop();
|
||||||
|
window.iframeCallback = function() {
|
||||||
|
var self = this,
|
||||||
|
args = arguments;
|
||||||
|
setTimeout(function() {
|
||||||
|
window.iframeCallback = undefined;
|
||||||
|
iframe.remove();
|
||||||
|
func.apply( self, args );
|
||||||
|
func = function() {};
|
||||||
|
start();
|
||||||
|
}, 0 );
|
||||||
|
};
|
||||||
|
iframe = jQuery( "<div/>" ).css({ position: "absolute", width: "500px", left: "-600px" })
|
||||||
|
.append( jQuery( "<iframe/>" ).attr( "src", url( "./data/" + fileName ) ) )
|
||||||
|
.appendTo( "#qunit-fixture" );
|
||||||
|
});
|
||||||
|
};
|
||||||
|
window.iframeCallback = undefined;
|
||||||
|
|
||||||
|
function moduleTeardown() {}
|
242
src/sizzle/test/index.html
Normal file
242
src/sizzle/test/index.html
Normal file
@ -0,0 +1,242 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr" id="html">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<title>Sizzle Test Suite</title>
|
||||||
|
<link rel="Stylesheet" media="screen" href="../bower_components/qunit/qunit/qunit.css" />
|
||||||
|
<script type="text/javascript" src="../bower_components/qunit/qunit/qunit.js"></script>
|
||||||
|
<script type="text/javascript" src="data/testinit.js"></script>
|
||||||
|
<script type="text/javascript" src="jquery.js"></script>
|
||||||
|
<script type="text/javascript" src="../dist/sizzle.js"></script>
|
||||||
|
<script type="text/javascript" src="unit/selector.js"></script>
|
||||||
|
<script type="text/javascript" src="unit/utilities.js"></script>
|
||||||
|
<script type="text/javascript" src="unit/extending.js"></script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body id="body">
|
||||||
|
<div id="qunit"></div>
|
||||||
|
|
||||||
|
<!-- Test HTML -->
|
||||||
|
<dl id="dl" style="position:absolute;top:-32767px;left:-32767px;width:1px">
|
||||||
|
<div id="qunit-fixture">
|
||||||
|
<p id="firstp">See <a id="simon1" href="http://simon.incutio.com/archive/2003/03/25/#getElementsBySelector" rel="bookmark">this blog entry</a> for more information.</p>
|
||||||
|
<p id="ap">
|
||||||
|
Here are some [links] in a normal paragraph: <a id="google" href="http://www.google.com/" title="Google!">Google</a>,
|
||||||
|
<a id="groups" href="http://groups.google.com/" class="GROUPS">Google Groups (Link)</a>.
|
||||||
|
This link has <code id="code1"><a href="http://smin" id="anchor1">class="blog"</a></code>:
|
||||||
|
<a href="http://diveintomark.org/" class="blog" hreflang="en" id="mark">diveintomark</a>
|
||||||
|
|
||||||
|
</p>
|
||||||
|
<div id="foo">
|
||||||
|
<p id="sndp">Everything inside the red border is inside a div with <code>id="foo"</code>.</p>
|
||||||
|
<p lang="en" id="en">This is a normal link: <a id="yahoo" href="http://www.yahoo.com/" class="blogTest">Yahoo</a></p>
|
||||||
|
<p id="sap">This link has <code><a href="#2" id="anchor2">class="blog"</a></code>: <a href="http://simon.incutio.com/" class="blog link" id="simon">Simon Willison's Weblog</a></p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div id="nothiddendiv" style="height:1px;background:white;" class="nothiddendiv">
|
||||||
|
<div id="nothiddendivchild"></div>
|
||||||
|
</div>
|
||||||
|
<span id="name+value"></span>
|
||||||
|
<p id="first">Try them out:</p>
|
||||||
|
<ul id="firstUL"></ul>
|
||||||
|
<ol id="empty"><!-- comment --></ol>
|
||||||
|
<form id="form" action="formaction">
|
||||||
|
<label for="action" id="label-for">Action:</label>
|
||||||
|
<input type="text" name="action" value="Test" id="text1" maxlength="30"/>
|
||||||
|
<input type="text" name="text2" value="Test" id="text2" disabled="disabled"/>
|
||||||
|
<input type="radio" name="radio1" id="radio1" value="on"/>
|
||||||
|
|
||||||
|
<input type="radio" name="radio2" id="radio2" checked="checked"/>
|
||||||
|
<input type="checkbox" name="check" id="check1" checked="checked"/>
|
||||||
|
<input type="checkbox" id="check2" value="on"/>
|
||||||
|
|
||||||
|
<input type="hidden" name="hidden" id="hidden1"/>
|
||||||
|
<input type="text" style="display:none;" name="foo[bar]" id="hidden2"/>
|
||||||
|
|
||||||
|
<input type="text" id="name" name="name" value="name" />
|
||||||
|
<input type="search" id="search" name="search" value="search" />
|
||||||
|
|
||||||
|
<button id="button" name="button" type="button">Button</button>
|
||||||
|
|
||||||
|
<textarea id="area1" maxlength="30">foobar</textarea>
|
||||||
|
|
||||||
|
<select name="select1" id="select1">
|
||||||
|
<option id="option1a" class="emptyopt" value="">Nothing</option>
|
||||||
|
<option id="option1b" value="1">1</option>
|
||||||
|
<option id="option1c" value="2">2</option>
|
||||||
|
<option id="option1d" value="3">3</option>
|
||||||
|
</select>
|
||||||
|
<select name="select2" id="select2">
|
||||||
|
<option id="option2a" class="emptyopt" value="">Nothing</option>
|
||||||
|
<option id="option2b" value="1">1</option>
|
||||||
|
<option id="option2c" value="2">2</option>
|
||||||
|
<option id="option2d" selected="selected" value="3">3</option>
|
||||||
|
</select>
|
||||||
|
<select name="select3" id="select3" multiple="multiple">
|
||||||
|
<option id="option3a" class="emptyopt" value="">Nothing</option>
|
||||||
|
<option id="option3b" selected="selected" value="1">1</option>
|
||||||
|
<option id="option3c" selected="selected" value="2">2</option>
|
||||||
|
<option id="option3d" value="3">3</option>
|
||||||
|
<option id="option3e">no value</option>
|
||||||
|
</select>
|
||||||
|
<select name="select4" id="select4" multiple="multiple">
|
||||||
|
<optgroup disabled="disabled">
|
||||||
|
<option id="option4a" class="emptyopt" value="">Nothing</option>
|
||||||
|
<option id="option4b" disabled="disabled" selected="selected" value="1">1</option>
|
||||||
|
<option id="option4c" selected="selected" value="2">2</option>
|
||||||
|
</optgroup>
|
||||||
|
<option selected="selected" disabled="disabled" id="option4d" value="3">3</option>
|
||||||
|
<option id="option4e">no value</option>
|
||||||
|
</select>
|
||||||
|
<select name="select5" id="select5">
|
||||||
|
<option id="option5a" value="3">1</option>
|
||||||
|
<option id="option5b" value="2">2</option>
|
||||||
|
<option id="option5c" value="1">3</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<object id="object1" codebase="stupid">
|
||||||
|
<param name="p1" value="x1" />
|
||||||
|
<param name="p2" value="x2" />
|
||||||
|
</object>
|
||||||
|
|
||||||
|
<span id="台北Táiběi"></span>
|
||||||
|
<span id="台北" lang="中文"></span>
|
||||||
|
<span id="utf8class1" class="台北Táiběi 台北"></span>
|
||||||
|
<span id="utf8class2" class="台北"></span>
|
||||||
|
<span id="foo:bar" class="foo:bar"><span id="foo_descendent"></span></span>
|
||||||
|
<span id="test.foo[5]bar" class="test.foo[5]bar"></span>
|
||||||
|
|
||||||
|
<foo_bar id="foobar">test element</foo_bar>
|
||||||
|
</form>
|
||||||
|
<b id="floatTest">Float test.</b>
|
||||||
|
<iframe id="iframe" name="iframe"></iframe>
|
||||||
|
<form id="lengthtest">
|
||||||
|
<input type="text" id="length" name="test"/>
|
||||||
|
<input type="text" id="idTest" name="id"/>
|
||||||
|
</form>
|
||||||
|
<table id="table"></table>
|
||||||
|
|
||||||
|
<form id="name-tests">
|
||||||
|
<!-- Inputs with a grouped name attribute. -->
|
||||||
|
<input name="types[]" id="types_all" type="checkbox" value="all" />
|
||||||
|
<input name="types[]" id="types_anime" type="checkbox" value="anime" />
|
||||||
|
<input name="types[]" id="types_movie" type="checkbox" value="movie" />
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<form id="testForm" action="#" method="get">
|
||||||
|
<textarea name="T3" rows="2" cols="15">?
|
||||||
|
Z</textarea>
|
||||||
|
<input type="hidden" name="H1" value="x" />
|
||||||
|
<input type="hidden" name="H2" />
|
||||||
|
<input name="PWD" type="password" value="" />
|
||||||
|
<input name="T1" type="text" />
|
||||||
|
<input name="T2" type="text" value="YES" readonly="readonly" />
|
||||||
|
<input type="checkbox" name="C1" value="1" />
|
||||||
|
<input type="checkbox" name="C2" />
|
||||||
|
<input type="radio" name="R1" value="1" />
|
||||||
|
<input type="radio" name="R1" value="2" />
|
||||||
|
<input type="text" name="My Name" value="me" />
|
||||||
|
<input type="reset" name="reset" value="NO" />
|
||||||
|
<select name="S1">
|
||||||
|
<option value="abc">ABC</option>
|
||||||
|
<option value="abc">ABC</option>
|
||||||
|
<option value="abc">ABC</option>
|
||||||
|
</select>
|
||||||
|
<select name="S2" multiple="multiple" size="3">
|
||||||
|
<option value="abc">ABC</option>
|
||||||
|
<option value="abc">ABC</option>
|
||||||
|
<option value="abc">ABC</option>
|
||||||
|
</select>
|
||||||
|
<select name="S3">
|
||||||
|
<option selected="selected">YES</option>
|
||||||
|
</select>
|
||||||
|
<select name="S4">
|
||||||
|
<option value="" selected="selected">NO</option>
|
||||||
|
</select>
|
||||||
|
<input type="submit" name="sub1" value="NO" />
|
||||||
|
<input type="submit" name="sub2" value="NO" />
|
||||||
|
<input type="image" name="sub3" value="NO" />
|
||||||
|
<button name="sub4" type="submit" value="NO">NO</button>
|
||||||
|
<input name="D1" type="text" value="NO" disabled="disabled" />
|
||||||
|
<input type="checkbox" checked="checked" disabled="disabled" name="D2" value="NO" />
|
||||||
|
<input type="radio" name="D3" value="NO" checked="checked" disabled="disabled" />
|
||||||
|
<select name="D4" disabled="disabled">
|
||||||
|
<option selected="selected" value="NO">NO</option>
|
||||||
|
</select>
|
||||||
|
<input id="list-test" type="text" />
|
||||||
|
<datalist id="datalist">
|
||||||
|
<option value="option"></option>
|
||||||
|
</datalist>
|
||||||
|
</form>
|
||||||
|
<div id="moretests">
|
||||||
|
<form>
|
||||||
|
<div id="checkedtest" style="display:none;">
|
||||||
|
<input type="radio" name="checkedtestradios" checked="checked"/>
|
||||||
|
<input type="radio" name="checkedtestradios" value="on"/>
|
||||||
|
<input type="checkbox" name="checkedtestcheckboxes" checked="checked"/>
|
||||||
|
<input type="checkbox" name="checkedtestcheckboxes" />
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<div id="nonnodes"><span>hi</span> there <!-- mon ami --></div>
|
||||||
|
<div id="t2037">
|
||||||
|
<div><div class="hidden">hidden</div></div>
|
||||||
|
</div>
|
||||||
|
<div id="t6652">
|
||||||
|
<div></div>
|
||||||
|
</div>
|
||||||
|
<div id="t12087">
|
||||||
|
<input type="hidden" id="el12087" data-comma="0,1"/>
|
||||||
|
</div>
|
||||||
|
<div id="no-clone-exception"><object><embed></embed></object></div>
|
||||||
|
<div id="names-group">
|
||||||
|
<span id="name-is-example" name="example"></span>
|
||||||
|
<span id="name-is-div" name="div"></span>
|
||||||
|
</div>
|
||||||
|
<script id="script-no-src"></script>
|
||||||
|
<script id="script-src" src="data/empty.js"></script>
|
||||||
|
<div id="id-name-tests">
|
||||||
|
<a id="tName1ID" name="tName1"><span></span></a>
|
||||||
|
<a id="tName2ID" name="tName2"><span></span></a>
|
||||||
|
<div id="tName1"><span id="tName1-span">C</span></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="tabindex-tests">
|
||||||
|
<ol id="listWithTabIndex" tabindex="5">
|
||||||
|
<li id="foodWithNegativeTabIndex" tabindex="-1">Rice</li>
|
||||||
|
<li id="foodNoTabIndex">Beans</li>
|
||||||
|
<li>Blinis</li>
|
||||||
|
<li>Tofu</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<div id="divWithNoTabIndex">I'm hungry. I should...</div>
|
||||||
|
<span>...</span><a href="#" id="linkWithNoTabIndex">Eat lots of food</a><span>...</span> |
|
||||||
|
<span>...</span><a href="#" id="linkWithTabIndex" tabindex="2">Eat a little food</a><span>...</span> |
|
||||||
|
<span>...</span><a href="#" id="linkWithNegativeTabIndex" tabindex="-1">Eat no food</a><span>...</span>
|
||||||
|
<span>...</span><a id="linkWithNoHrefWithNoTabIndex">Eat a burger</a><span>...</span>
|
||||||
|
<span>...</span><a id="linkWithNoHrefWithTabIndex" tabindex="1">Eat some funyuns</a><span>...</span>
|
||||||
|
<span>...</span><a id="linkWithNoHrefWithNegativeTabIndex" tabindex="-1">Eat some funyuns</a><span>...</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="liveHandlerOrder">
|
||||||
|
<span id="liveSpan1"><a href="#" id="liveLink1"></a></span>
|
||||||
|
<span id="liveSpan2"><a href="#" id="liveLink2"></a></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="siblingTest">
|
||||||
|
<em id="siblingfirst">1</em>
|
||||||
|
<em id="siblingnext">2</em>
|
||||||
|
<em id="siblingthird">
|
||||||
|
<em id="siblingchild">
|
||||||
|
<em id="siblinggrandchild">
|
||||||
|
<em id="siblinggreatgrandchild"></em>
|
||||||
|
</em>
|
||||||
|
</em>
|
||||||
|
</em>
|
||||||
|
<span id="siblingspan"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</dl>
|
||||||
|
<br id="last"/>
|
||||||
|
</body>
|
||||||
|
</html>
|
9597
src/sizzle/test/jquery.js
vendored
Normal file
9597
src/sizzle/test/jquery.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
95
src/sizzle/test/unit/extending.js
Normal file
95
src/sizzle/test/unit/extending.js
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
module("extending", { teardown: moduleTeardown });
|
||||||
|
|
||||||
|
test("custom pseudos", function() {
|
||||||
|
expect( 6 );
|
||||||
|
|
||||||
|
Sizzle.selectors.filters.foundation = Sizzle.selectors.filters.root;
|
||||||
|
deepEqual( Sizzle(":foundation"), [ document.documentElement ], "Copy element filter with new name" );
|
||||||
|
delete Sizzle.selectors.filters.foundation;
|
||||||
|
|
||||||
|
Sizzle.selectors.setFilters.primary = Sizzle.selectors.setFilters.first;
|
||||||
|
t( "Copy set filter with new name", "div:primary", ["qunit"] );
|
||||||
|
delete Sizzle.selectors.setFilters.primary;
|
||||||
|
|
||||||
|
Sizzle.selectors.filters.aristotlean = Sizzle.selectors.createPseudo(function() {
|
||||||
|
return function( elem ) {
|
||||||
|
return !!elem.id;
|
||||||
|
};
|
||||||
|
});
|
||||||
|
t( "Custom element filter", "#foo :aristotlean", [ "sndp", "en", "yahoo", "sap", "anchor2", "simon" ] );
|
||||||
|
delete Sizzle.selectors.filters.aristotlean;
|
||||||
|
|
||||||
|
Sizzle.selectors.filters.endswith = Sizzle.selectors.createPseudo(function( text ) {
|
||||||
|
return function( elem ) {
|
||||||
|
return Sizzle.getText( elem ).slice( -text.length ) === text;
|
||||||
|
};
|
||||||
|
});
|
||||||
|
t( "Custom element filter with argument", "a:endswith(ogle)", ["google"] );
|
||||||
|
delete Sizzle.selectors.filters.endswith;
|
||||||
|
|
||||||
|
Sizzle.selectors.setFilters.second = Sizzle.selectors.createPseudo(function() {
|
||||||
|
return Sizzle.selectors.createPseudo(function( seed, matches ) {
|
||||||
|
if ( seed[1] ) {
|
||||||
|
matches[1] = seed[1];
|
||||||
|
seed[1] = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
t( "Custom set filter", "#qunit-fixture p:second", ["ap"] );
|
||||||
|
delete Sizzle.selectors.filters.second;
|
||||||
|
|
||||||
|
Sizzle.selectors.setFilters.slice = Sizzle.selectors.createPseudo(function( argument ) {
|
||||||
|
var bounds = argument.split(":");
|
||||||
|
return Sizzle.selectors.createPseudo(function( seed, matches ) {
|
||||||
|
var i = bounds[1];
|
||||||
|
|
||||||
|
// Match elements found at the specified indexes
|
||||||
|
while ( --i >= bounds[0] ) {
|
||||||
|
if ( seed[i] ) {
|
||||||
|
matches[i] = seed[i];
|
||||||
|
seed[i] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
t( "Custom set filter with argument", "#qunit-fixture p:slice(1:3)", [ "ap", "sndp" ] );
|
||||||
|
delete Sizzle.selectors.filters.slice;
|
||||||
|
});
|
||||||
|
|
||||||
|
test("backwards-compatible custom pseudos", function() {
|
||||||
|
expect( 3 );
|
||||||
|
|
||||||
|
Sizzle.selectors.filters.icontains = function( elem, i, match ) {
|
||||||
|
return Sizzle.getText( elem ).toLowerCase().indexOf( (match[3] || "").toLowerCase() ) > -1;
|
||||||
|
};
|
||||||
|
t( "Custom element filter with argument", "a:icontains(THIS BLOG ENTRY)", ["simon1"] );
|
||||||
|
delete Sizzle.selectors.filters.icontains;
|
||||||
|
|
||||||
|
Sizzle.selectors.setFilters.podium = function( elements, argument ) {
|
||||||
|
var count = argument == null || argument === "" ? 3 : +argument;
|
||||||
|
return elements.slice( 0, count );
|
||||||
|
};
|
||||||
|
// Using TAG as the first token here forces this setMatcher into a fail state
|
||||||
|
// Where the descendent combinator was lost
|
||||||
|
t( "Custom setFilter", "form#form :PODIUM", ["label-for", "text1", "text2"] );
|
||||||
|
t( "Custom setFilter with argument", "#form input:Podium(1)", ["text1"] );
|
||||||
|
delete Sizzle.selectors.setFilters.podium;
|
||||||
|
});
|
||||||
|
|
||||||
|
test("custom attribute getters", function() {
|
||||||
|
expect( 2 );
|
||||||
|
|
||||||
|
var original = Sizzle.selectors.attrHandle.hreflang,
|
||||||
|
selector = "a:contains('mark')[hreflang='http://diveintomark.org/en']";
|
||||||
|
|
||||||
|
Sizzle.selectors.attrHandle.hreflang = function( elem, name ) {
|
||||||
|
var href = elem.getAttribute("href"),
|
||||||
|
lang = elem.getAttribute( name );
|
||||||
|
return lang && ( href + lang );
|
||||||
|
};
|
||||||
|
|
||||||
|
deepEqual( Sizzle(selector, createWithFriesXML()), [], "Custom attrHandle (preferred document)" );
|
||||||
|
t( "Custom attrHandle (preferred document)", selector, ["mark"] );
|
||||||
|
|
||||||
|
Sizzle.selectors.attrHandle.hreflang = original;
|
||||||
|
});
|
1132
src/sizzle/test/unit/selector.js
Normal file
1132
src/sizzle/test/unit/selector.js
Normal file
File diff suppressed because it is too large
Load Diff
169
src/sizzle/test/unit/utilities.js
Normal file
169
src/sizzle/test/unit/utilities.js
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
module("utilities", { teardown: moduleTeardown });
|
||||||
|
|
||||||
|
function testAttr( doc ) {
|
||||||
|
expect( 9 );
|
||||||
|
|
||||||
|
var el;
|
||||||
|
if ( doc ) {
|
||||||
|
// XML
|
||||||
|
el = doc.createElement( "input" );
|
||||||
|
el.setAttribute( "type", "checkbox" );
|
||||||
|
} else {
|
||||||
|
// Set checked on creation by creating with a fragment
|
||||||
|
// See http://jsfiddle.net/8sVgA/1/show/light in oldIE
|
||||||
|
el = jQuery( "<input type='checkbox' checked='checked' />" )[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set it again for good measure
|
||||||
|
el.setAttribute( "checked", "checked" );
|
||||||
|
el.setAttribute( "id", "id" );
|
||||||
|
el.setAttribute( "value", "on" );
|
||||||
|
|
||||||
|
strictEqual( Sizzle.attr( el, "nonexistent" ), null, "nonexistent" );
|
||||||
|
strictEqual( Sizzle.attr( el, "id" ), "id", "existent" );
|
||||||
|
strictEqual( Sizzle.attr( el, "value" ), "on", "value" );
|
||||||
|
strictEqual( Sizzle.attr( el, "checked" ), "checked", "boolean" );
|
||||||
|
strictEqual( Sizzle.attr( el, "href" ), null, "interpolation risk" );
|
||||||
|
strictEqual( Sizzle.attr( el, "constructor" ), null,
|
||||||
|
"Object.prototype property \"constructor\" (negative)" );
|
||||||
|
strictEqual( Sizzle.attr( el, "watch" ), null,
|
||||||
|
"Gecko Object.prototype property \"watch\" (negative)" );
|
||||||
|
el.setAttribute( "constructor", "foo" );
|
||||||
|
el.setAttribute( "watch", "bar" );
|
||||||
|
strictEqual( Sizzle.attr( el, "constructor" ), "foo",
|
||||||
|
"Object.prototype property \"constructor\"" );
|
||||||
|
strictEqual( Sizzle.attr( el, "watch" ), "bar",
|
||||||
|
"Gecko Object.prototype property \"watch\"" );
|
||||||
|
}
|
||||||
|
|
||||||
|
test("Sizzle.attr (HTML)", function() {
|
||||||
|
testAttr();
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Sizzle.attr (XML)", function() {
|
||||||
|
testAttr( jQuery.parseXML("<root/>") );
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Sizzle.contains", function() {
|
||||||
|
expect( 16 );
|
||||||
|
|
||||||
|
var container = document.getElementById("nonnodes"),
|
||||||
|
element = container.firstChild,
|
||||||
|
text = element.nextSibling,
|
||||||
|
nonContained = container.nextSibling,
|
||||||
|
detached = document.createElement("a");
|
||||||
|
ok( element && element.nodeType === 1, "preliminary: found element" );
|
||||||
|
ok( text && text.nodeType === 3, "preliminary: found text" );
|
||||||
|
ok( nonContained, "preliminary: found non-descendant" );
|
||||||
|
ok( Sizzle.contains(container, element), "child" );
|
||||||
|
ok( Sizzle.contains(container.parentNode, element), "grandchild" );
|
||||||
|
ok( Sizzle.contains(container, text), "text child" );
|
||||||
|
ok( Sizzle.contains(container.parentNode, text), "text grandchild" );
|
||||||
|
ok( !Sizzle.contains(container, container), "self" );
|
||||||
|
ok( !Sizzle.contains(element, container), "parent" );
|
||||||
|
ok( !Sizzle.contains(container, nonContained), "non-descendant" );
|
||||||
|
ok( !Sizzle.contains(container, document), "document" );
|
||||||
|
ok( !Sizzle.contains(container, document.documentElement), "documentElement (negative)" );
|
||||||
|
ok( !Sizzle.contains(container, null), "Passing null does not throw an error" );
|
||||||
|
ok( Sizzle.contains(document, document.documentElement), "documentElement (positive)" );
|
||||||
|
ok( Sizzle.contains(document, element), "document container (positive)" );
|
||||||
|
ok( !Sizzle.contains(document, detached), "document container (negative)" );
|
||||||
|
});
|
||||||
|
|
||||||
|
if ( jQuery("<svg xmlns='http://www.w3.org/2000/svg' version='1.1' height='1' width='1'><g/></svg>")[0].firstChild ) {
|
||||||
|
test("Sizzle.contains in SVG (jQuery #10832)", function() {
|
||||||
|
expect( 4 );
|
||||||
|
|
||||||
|
var svg = jQuery(
|
||||||
|
"<svg xmlns='http://www.w3.org/2000/svg' version='1.1' height='1' width='1'>" +
|
||||||
|
"<g><circle cx='1' cy='1' r='1' /></g>" +
|
||||||
|
"</svg>"
|
||||||
|
).appendTo("#qunit-fixture")[0];
|
||||||
|
|
||||||
|
ok( Sizzle.contains( svg, svg.firstChild ), "root child" );
|
||||||
|
ok( Sizzle.contains( svg.firstChild, svg.firstChild.firstChild ), "element child" );
|
||||||
|
ok( Sizzle.contains( svg, svg.firstChild.firstChild ), "root granchild" );
|
||||||
|
ok( !Sizzle.contains( svg.firstChild.firstChild, svg.firstChild ), "parent (negative)" );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
test("Sizzle.uniqueSort", function() {
|
||||||
|
expect( 14 );
|
||||||
|
|
||||||
|
function Arrayish( arr ) {
|
||||||
|
var i = this.length = arr.length;
|
||||||
|
while ( i-- ) {
|
||||||
|
this[ i ] = arr[ i ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Arrayish.prototype = {
|
||||||
|
slice: [].slice,
|
||||||
|
sort: [].sort,
|
||||||
|
splice: [].splice
|
||||||
|
};
|
||||||
|
|
||||||
|
var i, tests,
|
||||||
|
detached = [],
|
||||||
|
body = document.body,
|
||||||
|
fixture = document.getElementById("qunit-fixture"),
|
||||||
|
detached1 = document.createElement("p"),
|
||||||
|
detached2 = document.createElement("ul"),
|
||||||
|
detachedChild = detached1.appendChild( document.createElement("a") ),
|
||||||
|
detachedGrandchild = detachedChild.appendChild( document.createElement("b") );
|
||||||
|
|
||||||
|
for ( i = 0; i < 12; i++ ) {
|
||||||
|
detached.push( document.createElement("li") );
|
||||||
|
detached[i].id = "detached" + i;
|
||||||
|
detached2.appendChild( document.createElement("li") ).id = "detachedChild" + i;
|
||||||
|
}
|
||||||
|
|
||||||
|
tests = {
|
||||||
|
"Empty": {
|
||||||
|
input: [],
|
||||||
|
expected: []
|
||||||
|
},
|
||||||
|
"Single-element": {
|
||||||
|
input: [ fixture ],
|
||||||
|
expected: [ fixture ]
|
||||||
|
},
|
||||||
|
"No duplicates": {
|
||||||
|
input: [ fixture, body ],
|
||||||
|
expected: [ body, fixture ]
|
||||||
|
},
|
||||||
|
"Duplicates": {
|
||||||
|
input: [ body, fixture, fixture, body ],
|
||||||
|
expected: [ body, fixture ]
|
||||||
|
},
|
||||||
|
"Detached": {
|
||||||
|
input: detached.slice( 0 ),
|
||||||
|
expected: detached.slice( 0 )
|
||||||
|
},
|
||||||
|
"Detached children": {
|
||||||
|
input: [
|
||||||
|
detached2.childNodes[0],
|
||||||
|
detached2.childNodes[1],
|
||||||
|
detached2.childNodes[2],
|
||||||
|
detached2.childNodes[3]
|
||||||
|
],
|
||||||
|
expected: [
|
||||||
|
detached2.childNodes[0],
|
||||||
|
detached2.childNodes[1],
|
||||||
|
detached2.childNodes[2],
|
||||||
|
detached2.childNodes[3]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Attached/detached mixture": {
|
||||||
|
input: [ detached1, fixture, detached2, document, detachedChild, body, detachedGrandchild ],
|
||||||
|
expected: [ document, body, fixture ],
|
||||||
|
length: 3
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
jQuery.each( tests, function( label, test ) {
|
||||||
|
var length = test.length || test.input.length;
|
||||||
|
deepEqual( Sizzle.uniqueSort( test.input ).slice( 0, length ), test.expected, label + " (array)" );
|
||||||
|
deepEqual( Sizzle.uniqueSort( new Arrayish(test.input) ).slice( 0, length ), test.expected, label + " (quasi-array)" );
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
testIframeWithCallback( "Sizzle.uniqueSort works cross-window (jQuery #14381)", "mixed_sort.html", deepEqual );
|
@ -300,7 +300,7 @@ this.loadTests = function() {
|
|||||||
|
|
||||||
|
|
||||||
// Subproject tests must be last because they replace our test fixture
|
// Subproject tests must be last because they replace our test fixture
|
||||||
testSubproject( "Sizzle", "../bower_modules/sizzle/test/", /^unit\/.*\.js$/, function() {
|
testSubproject( "Sizzle", "../src/sizzle/test/", /^unit\/.*\.js$/, function() {
|
||||||
// Call load to build module filter select element
|
// Call load to build module filter select element
|
||||||
QUnit.load();
|
QUnit.load();
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
|
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
|
||||||
<title>jQuery Test Suite</title>
|
<title>jQuery Test Suite</title>
|
||||||
<link rel="Stylesheet" media="screen" href="../bower_modules/qunit/qunit.css" />
|
<link rel="Stylesheet" media="screen" href="libs/qunit/qunit.css" />
|
||||||
<link rel="Stylesheet" media="screen" href="data/testsuite.css" />
|
<link rel="Stylesheet" media="screen" href="data/testsuite.css" />
|
||||||
<!-- Includes -->
|
<!-- Includes -->
|
||||||
|
|
||||||
@ -14,9 +14,9 @@
|
|||||||
-->
|
-->
|
||||||
<script src="data/jquery-1.9.1.js"></script>
|
<script src="data/jquery-1.9.1.js"></script>
|
||||||
|
|
||||||
<script src="../bower_modules/qunit/qunit.js"></script>
|
<script src="libs/qunit/qunit.js"></script>
|
||||||
<script src="../bower_modules/requirejs/require.js"></script>
|
<script src="libs/require.js"></script>
|
||||||
<script src="../bower_modules/sinon/fake_timers.js"></script>
|
<script src="libs/sinon/fake_timers.js"></script>
|
||||||
<!-- See testinit for the list of tests -->
|
<!-- See testinit for the list of tests -->
|
||||||
<script src="data/testinit.js"></script>
|
<script src="data/testinit.js"></script>
|
||||||
|
|
||||||
|
2
test/jquery.js
vendored
2
test/jquery.js
vendored
@ -19,7 +19,7 @@
|
|||||||
require.config({
|
require.config({
|
||||||
baseUrl: path,
|
baseUrl: path,
|
||||||
paths: {
|
paths: {
|
||||||
sizzle: path + "bower_modules/sizzle/dist/sizzle"
|
sizzle: "src/sizzle/dist/sizzle"
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
src = "src/jquery";
|
src = "src/jquery";
|
||||||
|
244
test/libs/qunit/qunit.css
Normal file
244
test/libs/qunit/qunit.css
Normal file
@ -0,0 +1,244 @@
|
|||||||
|
/**
|
||||||
|
* QUnit v1.12.0 - A JavaScript Unit Testing Framework
|
||||||
|
*
|
||||||
|
* http://qunitjs.com
|
||||||
|
*
|
||||||
|
* Copyright 2012 jQuery Foundation and other contributors
|
||||||
|
* Released under the MIT license.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Font Family and Sizes */
|
||||||
|
|
||||||
|
#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
|
||||||
|
font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
|
||||||
|
#qunit-tests { font-size: smaller; }
|
||||||
|
|
||||||
|
|
||||||
|
/** Resets */
|
||||||
|
|
||||||
|
#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** Header */
|
||||||
|
|
||||||
|
#qunit-header {
|
||||||
|
padding: 0.5em 0 0.5em 1em;
|
||||||
|
|
||||||
|
color: #8699a4;
|
||||||
|
background-color: #0d3349;
|
||||||
|
|
||||||
|
font-size: 1.5em;
|
||||||
|
line-height: 1em;
|
||||||
|
font-weight: normal;
|
||||||
|
|
||||||
|
border-radius: 5px 5px 0 0;
|
||||||
|
-moz-border-radius: 5px 5px 0 0;
|
||||||
|
-webkit-border-top-right-radius: 5px;
|
||||||
|
-webkit-border-top-left-radius: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#qunit-header a {
|
||||||
|
text-decoration: none;
|
||||||
|
color: #c2ccd1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#qunit-header a:hover,
|
||||||
|
#qunit-header a:focus {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
#qunit-testrunner-toolbar label {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 0 .5em 0 .1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#qunit-banner {
|
||||||
|
height: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#qunit-testrunner-toolbar {
|
||||||
|
padding: 0.5em 0 0.5em 2em;
|
||||||
|
color: #5E740B;
|
||||||
|
background-color: #eee;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
#qunit-userAgent {
|
||||||
|
padding: 0.5em 0 0.5em 2.5em;
|
||||||
|
background-color: #2b81af;
|
||||||
|
color: #fff;
|
||||||
|
text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#qunit-modulefilter-container {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Tests: Pass/Fail */
|
||||||
|
|
||||||
|
#qunit-tests {
|
||||||
|
list-style-position: inside;
|
||||||
|
}
|
||||||
|
|
||||||
|
#qunit-tests li {
|
||||||
|
padding: 0.4em 0.5em 0.4em 2.5em;
|
||||||
|
border-bottom: 1px solid #fff;
|
||||||
|
list-style-position: inside;
|
||||||
|
}
|
||||||
|
|
||||||
|
#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#qunit-tests li strong {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
#qunit-tests li a {
|
||||||
|
padding: 0.5em;
|
||||||
|
color: #c2ccd1;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
#qunit-tests li a:hover,
|
||||||
|
#qunit-tests li a:focus {
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
#qunit-tests li .runtime {
|
||||||
|
float: right;
|
||||||
|
font-size: smaller;
|
||||||
|
}
|
||||||
|
|
||||||
|
.qunit-assert-list {
|
||||||
|
margin-top: 0.5em;
|
||||||
|
padding: 0.5em;
|
||||||
|
|
||||||
|
background-color: #fff;
|
||||||
|
|
||||||
|
border-radius: 5px;
|
||||||
|
-moz-border-radius: 5px;
|
||||||
|
-webkit-border-radius: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.qunit-collapsed {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#qunit-tests table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
margin-top: .2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#qunit-tests th {
|
||||||
|
text-align: right;
|
||||||
|
vertical-align: top;
|
||||||
|
padding: 0 .5em 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#qunit-tests td {
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
#qunit-tests pre {
|
||||||
|
margin: 0;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
word-wrap: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
|
#qunit-tests del {
|
||||||
|
background-color: #e0f2be;
|
||||||
|
color: #374e0c;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#qunit-tests ins {
|
||||||
|
background-color: #ffcaca;
|
||||||
|
color: #500;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*** Test Counts */
|
||||||
|
|
||||||
|
#qunit-tests b.counts { color: black; }
|
||||||
|
#qunit-tests b.passed { color: #5E740B; }
|
||||||
|
#qunit-tests b.failed { color: #710909; }
|
||||||
|
|
||||||
|
#qunit-tests li li {
|
||||||
|
padding: 5px;
|
||||||
|
background-color: #fff;
|
||||||
|
border-bottom: none;
|
||||||
|
list-style-position: inside;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*** Passing Styles */
|
||||||
|
|
||||||
|
#qunit-tests li li.pass {
|
||||||
|
color: #3c510c;
|
||||||
|
background-color: #fff;
|
||||||
|
border-left: 10px solid #C6E746;
|
||||||
|
}
|
||||||
|
|
||||||
|
#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; }
|
||||||
|
#qunit-tests .pass .test-name { color: #366097; }
|
||||||
|
|
||||||
|
#qunit-tests .pass .test-actual,
|
||||||
|
#qunit-tests .pass .test-expected { color: #999999; }
|
||||||
|
|
||||||
|
#qunit-banner.qunit-pass { background-color: #C6E746; }
|
||||||
|
|
||||||
|
/*** Failing Styles */
|
||||||
|
|
||||||
|
#qunit-tests li li.fail {
|
||||||
|
color: #710909;
|
||||||
|
background-color: #fff;
|
||||||
|
border-left: 10px solid #EE5757;
|
||||||
|
white-space: pre;
|
||||||
|
}
|
||||||
|
|
||||||
|
#qunit-tests > li:last-child {
|
||||||
|
border-radius: 0 0 5px 5px;
|
||||||
|
-moz-border-radius: 0 0 5px 5px;
|
||||||
|
-webkit-border-bottom-right-radius: 5px;
|
||||||
|
-webkit-border-bottom-left-radius: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#qunit-tests .fail { color: #000000; background-color: #EE5757; }
|
||||||
|
#qunit-tests .fail .test-name,
|
||||||
|
#qunit-tests .fail .module-name { color: #000000; }
|
||||||
|
|
||||||
|
#qunit-tests .fail .test-actual { color: #EE5757; }
|
||||||
|
#qunit-tests .fail .test-expected { color: green; }
|
||||||
|
|
||||||
|
#qunit-banner.qunit-fail { background-color: #EE5757; }
|
||||||
|
|
||||||
|
|
||||||
|
/** Result */
|
||||||
|
|
||||||
|
#qunit-testresult {
|
||||||
|
padding: 0.5em 0.5em 0.5em 2.5em;
|
||||||
|
|
||||||
|
color: #2b81af;
|
||||||
|
background-color: #D2E0E6;
|
||||||
|
|
||||||
|
border-bottom: 1px solid white;
|
||||||
|
}
|
||||||
|
#qunit-testresult .module-name {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Fixture */
|
||||||
|
|
||||||
|
#qunit-fixture {
|
||||||
|
position: absolute;
|
||||||
|
top: -10000px;
|
||||||
|
left: -10000px;
|
||||||
|
width: 1000px;
|
||||||
|
height: 1000px;
|
||||||
|
}
|
2212
test/libs/qunit/qunit.js
Normal file
2212
test/libs/qunit/qunit.js
Normal file
File diff suppressed because it is too large
Load Diff
2054
test/libs/require.js
Normal file
2054
test/libs/require.js
Normal file
File diff suppressed because it is too large
Load Diff
351
test/libs/sinon/fake_timers.js
Normal file
351
test/libs/sinon/fake_timers.js
Normal file
@ -0,0 +1,351 @@
|
|||||||
|
/*jslint eqeqeq: false, plusplus: false, evil: true, onevar: false, browser: true, forin: false*/
|
||||||
|
/*global module, require, window*/
|
||||||
|
/**
|
||||||
|
* Fake timer API
|
||||||
|
* setTimeout
|
||||||
|
* setInterval
|
||||||
|
* clearTimeout
|
||||||
|
* clearInterval
|
||||||
|
* tick
|
||||||
|
* reset
|
||||||
|
* Date
|
||||||
|
*
|
||||||
|
* Inspired by jsUnitMockTimeOut from JsUnit
|
||||||
|
*
|
||||||
|
* @author Christian Johansen (christian@cjohansen.no)
|
||||||
|
* @license BSD
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010-2013 Christian Johansen
|
||||||
|
*/
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
if (typeof sinon == "undefined") {
|
||||||
|
var sinon = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
(function (global) {
|
||||||
|
var id = 1;
|
||||||
|
|
||||||
|
function addTimer(args, recurring) {
|
||||||
|
if (args.length === 0) {
|
||||||
|
throw new Error("Function requires at least 1 parameter");
|
||||||
|
}
|
||||||
|
|
||||||
|
var toId = id++;
|
||||||
|
var delay = args[1] || 0;
|
||||||
|
|
||||||
|
if (!this.timeouts) {
|
||||||
|
this.timeouts = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
this.timeouts[toId] = {
|
||||||
|
id: toId,
|
||||||
|
func: args[0],
|
||||||
|
callAt: this.now + delay,
|
||||||
|
invokeArgs: Array.prototype.slice.call(args, 2)
|
||||||
|
};
|
||||||
|
|
||||||
|
if (recurring === true) {
|
||||||
|
this.timeouts[toId].interval = delay;
|
||||||
|
}
|
||||||
|
|
||||||
|
return toId;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseTime(str) {
|
||||||
|
if (!str) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
var strings = str.split(":");
|
||||||
|
var l = strings.length, i = l;
|
||||||
|
var ms = 0, parsed;
|
||||||
|
|
||||||
|
if (l > 3 || !/^(\d\d:){0,2}\d\d?$/.test(str)) {
|
||||||
|
throw new Error("tick only understands numbers and 'h:m:s'");
|
||||||
|
}
|
||||||
|
|
||||||
|
while (i--) {
|
||||||
|
parsed = parseInt(strings[i], 10);
|
||||||
|
|
||||||
|
if (parsed >= 60) {
|
||||||
|
throw new Error("Invalid time " + str);
|
||||||
|
}
|
||||||
|
|
||||||
|
ms += parsed * Math.pow(60, (l - i - 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
return ms * 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createObject(object) {
|
||||||
|
var newObject;
|
||||||
|
|
||||||
|
if (Object.create) {
|
||||||
|
newObject = Object.create(object);
|
||||||
|
} else {
|
||||||
|
var F = function () {};
|
||||||
|
F.prototype = object;
|
||||||
|
newObject = new F();
|
||||||
|
}
|
||||||
|
|
||||||
|
newObject.Date.clock = newObject;
|
||||||
|
return newObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
sinon.clock = {
|
||||||
|
now: 0,
|
||||||
|
|
||||||
|
create: function create(now) {
|
||||||
|
var clock = createObject(this);
|
||||||
|
|
||||||
|
if (typeof now == "number") {
|
||||||
|
clock.now = now;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!!now && typeof now == "object") {
|
||||||
|
throw new TypeError("now should be milliseconds since UNIX epoch");
|
||||||
|
}
|
||||||
|
|
||||||
|
return clock;
|
||||||
|
},
|
||||||
|
|
||||||
|
setTimeout: function setTimeout(callback, timeout) {
|
||||||
|
return addTimer.call(this, arguments, false);
|
||||||
|
},
|
||||||
|
|
||||||
|
clearTimeout: function clearTimeout(timerId) {
|
||||||
|
if (!this.timeouts) {
|
||||||
|
this.timeouts = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (timerId in this.timeouts) {
|
||||||
|
delete this.timeouts[timerId];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
setInterval: function setInterval(callback, timeout) {
|
||||||
|
return addTimer.call(this, arguments, true);
|
||||||
|
},
|
||||||
|
|
||||||
|
clearInterval: function clearInterval(timerId) {
|
||||||
|
this.clearTimeout(timerId);
|
||||||
|
},
|
||||||
|
|
||||||
|
tick: function tick(ms) {
|
||||||
|
ms = typeof ms == "number" ? ms : parseTime(ms);
|
||||||
|
var tickFrom = this.now, tickTo = this.now + ms, previous = this.now;
|
||||||
|
var timer = this.firstTimerInRange(tickFrom, tickTo);
|
||||||
|
|
||||||
|
var firstException;
|
||||||
|
while (timer && tickFrom <= tickTo) {
|
||||||
|
if (this.timeouts[timer.id]) {
|
||||||
|
tickFrom = this.now = timer.callAt;
|
||||||
|
try {
|
||||||
|
this.callTimer(timer);
|
||||||
|
} catch (e) {
|
||||||
|
firstException = firstException || e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
timer = this.firstTimerInRange(previous, tickTo);
|
||||||
|
previous = tickFrom;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.now = tickTo;
|
||||||
|
|
||||||
|
if (firstException) {
|
||||||
|
throw firstException;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.now;
|
||||||
|
},
|
||||||
|
|
||||||
|
firstTimerInRange: function (from, to) {
|
||||||
|
var timer, smallest, originalTimer;
|
||||||
|
|
||||||
|
for (var id in this.timeouts) {
|
||||||
|
if (this.timeouts.hasOwnProperty(id)) {
|
||||||
|
if (this.timeouts[id].callAt < from || this.timeouts[id].callAt > to) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!smallest || this.timeouts[id].callAt < smallest) {
|
||||||
|
originalTimer = this.timeouts[id];
|
||||||
|
smallest = this.timeouts[id].callAt;
|
||||||
|
|
||||||
|
timer = {
|
||||||
|
func: this.timeouts[id].func,
|
||||||
|
callAt: this.timeouts[id].callAt,
|
||||||
|
interval: this.timeouts[id].interval,
|
||||||
|
id: this.timeouts[id].id,
|
||||||
|
invokeArgs: this.timeouts[id].invokeArgs
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return timer || null;
|
||||||
|
},
|
||||||
|
|
||||||
|
callTimer: function (timer) {
|
||||||
|
if (typeof timer.interval == "number") {
|
||||||
|
this.timeouts[timer.id].callAt += timer.interval;
|
||||||
|
} else {
|
||||||
|
delete this.timeouts[timer.id];
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (typeof timer.func == "function") {
|
||||||
|
timer.func.apply(null, timer.invokeArgs);
|
||||||
|
} else {
|
||||||
|
eval(timer.func);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
var exception = e;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.timeouts[timer.id]) {
|
||||||
|
if (exception) {
|
||||||
|
throw exception;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (exception) {
|
||||||
|
throw exception;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
reset: function reset() {
|
||||||
|
this.timeouts = {};
|
||||||
|
},
|
||||||
|
|
||||||
|
Date: (function () {
|
||||||
|
var NativeDate = Date;
|
||||||
|
|
||||||
|
function ClockDate(year, month, date, hour, minute, second, ms) {
|
||||||
|
// Defensive and verbose to avoid potential harm in passing
|
||||||
|
// explicit undefined when user does not pass argument
|
||||||
|
switch (arguments.length) {
|
||||||
|
case 0:
|
||||||
|
return new NativeDate(ClockDate.clock.now);
|
||||||
|
case 1:
|
||||||
|
return new NativeDate(year);
|
||||||
|
case 2:
|
||||||
|
return new NativeDate(year, month);
|
||||||
|
case 3:
|
||||||
|
return new NativeDate(year, month, date);
|
||||||
|
case 4:
|
||||||
|
return new NativeDate(year, month, date, hour);
|
||||||
|
case 5:
|
||||||
|
return new NativeDate(year, month, date, hour, minute);
|
||||||
|
case 6:
|
||||||
|
return new NativeDate(year, month, date, hour, minute, second);
|
||||||
|
default:
|
||||||
|
return new NativeDate(year, month, date, hour, minute, second, ms);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return mirrorDateProperties(ClockDate, NativeDate);
|
||||||
|
}())
|
||||||
|
};
|
||||||
|
|
||||||
|
function mirrorDateProperties(target, source) {
|
||||||
|
if (source.now) {
|
||||||
|
target.now = function now() {
|
||||||
|
return target.clock.now;
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
delete target.now;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (source.toSource) {
|
||||||
|
target.toSource = function toSource() {
|
||||||
|
return source.toSource();
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
delete target.toSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
target.toString = function toString() {
|
||||||
|
return source.toString();
|
||||||
|
};
|
||||||
|
|
||||||
|
target.prototype = source.prototype;
|
||||||
|
target.parse = source.parse;
|
||||||
|
target.UTC = source.UTC;
|
||||||
|
target.prototype.toUTCString = source.prototype.toUTCString;
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
|
||||||
|
var methods = ["Date", "setTimeout", "setInterval",
|
||||||
|
"clearTimeout", "clearInterval"];
|
||||||
|
|
||||||
|
function restore() {
|
||||||
|
var method;
|
||||||
|
|
||||||
|
for (var i = 0, l = this.methods.length; i < l; i++) {
|
||||||
|
method = this.methods[i];
|
||||||
|
if (global[method].hadOwnProperty) {
|
||||||
|
global[method] = this["_" + method];
|
||||||
|
} else {
|
||||||
|
delete global[method];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prevent multiple executions which will completely remove these props
|
||||||
|
this.methods = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
function stubGlobal(method, clock) {
|
||||||
|
clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(global, method);
|
||||||
|
clock["_" + method] = global[method];
|
||||||
|
|
||||||
|
if (method == "Date") {
|
||||||
|
var date = mirrorDateProperties(clock[method], global[method]);
|
||||||
|
global[method] = date;
|
||||||
|
} else {
|
||||||
|
global[method] = function () {
|
||||||
|
return clock[method].apply(clock, arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var prop in clock[method]) {
|
||||||
|
if (clock[method].hasOwnProperty(prop)) {
|
||||||
|
global[method][prop] = clock[method][prop];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
global[method].clock = clock;
|
||||||
|
}
|
||||||
|
|
||||||
|
sinon.useFakeTimers = function useFakeTimers(now) {
|
||||||
|
var clock = sinon.clock.create(now);
|
||||||
|
clock.restore = restore;
|
||||||
|
clock.methods = Array.prototype.slice.call(arguments,
|
||||||
|
typeof now == "number" ? 1 : 0);
|
||||||
|
|
||||||
|
if (clock.methods.length === 0) {
|
||||||
|
clock.methods = methods;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0, l = clock.methods.length; i < l; i++) {
|
||||||
|
stubGlobal(clock.methods[i], clock);
|
||||||
|
}
|
||||||
|
|
||||||
|
return clock;
|
||||||
|
};
|
||||||
|
}(typeof global != "undefined" && typeof global !== "function" ? global : this));
|
||||||
|
|
||||||
|
sinon.timers = {
|
||||||
|
setTimeout: setTimeout,
|
||||||
|
clearTimeout: clearTimeout,
|
||||||
|
setInterval: setInterval,
|
||||||
|
clearInterval: clearInterval,
|
||||||
|
Date: Date
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof module == "object" && typeof require == "function") {
|
||||||
|
module.exports = sinon;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user