aboutsummaryrefslogtreecommitdiffstats
path: root/test/data
diff options
context:
space:
mode:
authorTimo Tijhof <krinklemail@gmail.com>2017-08-01 09:52:45 -0700
committerTimmy Willison <4timmywil@gmail.com>2017-12-18 12:27:38 -0500
commitecd8ddea33dc40ae2a57e4340be03faf2ba2f99b (patch)
treed0f248befa82620226708059db84bc3a7f1ec076 /test/data
parente84d3bc02eddeb0e0ca0438952ac560a794ff463 (diff)
downloadjquery-ecd8ddea33dc40ae2a57e4340be03faf2ba2f99b.tar.gz
jquery-ecd8ddea33dc40ae2a57e4340be03faf2ba2f99b.zip
Tests: Add support for running unit tests via grunt with karma
- Update QUnit to 1.23.1 - Remove unused dl#dl from test/index.html - Remove unused map#imgmap from test/index.html - Ensure all urls to data use baseURI - Add the 'grunt karma:main' task - customContextFile & customDebugFile - Add 'npm run jenkins' script Close gh-3744 Fixes gh-1999
Diffstat (limited to 'test/data')
-rw-r--r--test/data/ajax/content-type.php5
-rw-r--r--test/data/ajax/evalScript.php1
-rw-r--r--test/data/ajax/method.php1
-rw-r--r--test/data/ajax/unreleasedXHR.html2
-rw-r--r--test/data/atom+xml.php4
-rw-r--r--test/data/core/dont_return.php3
-rw-r--r--test/data/core/dynamic_ready.html2
-rw-r--r--test/data/csp.include.html14
-rw-r--r--test/data/echoData.php1
-rw-r--r--test/data/echoQuery.php1
-rw-r--r--test/data/errorWithJSON.php6
-rw-r--r--test/data/errorWithText.php5
-rw-r--r--test/data/etag.php24
-rw-r--r--test/data/event/interactiveReady.html2
-rw-r--r--test/data/event/syncReady.html2
-rw-r--r--test/data/headers.php23
-rw-r--r--test/data/if_modified_since.php20
-rw-r--r--test/data/json.php13
-rw-r--r--test/data/jsonp.php14
-rw-r--r--test/data/longLoadScript.php4
-rw-r--r--test/data/mock.php244
-rw-r--r--test/data/name.php24
-rw-r--r--test/data/nocontent.php5
-rw-r--r--test/data/params_html.php12
-rw-r--r--test/data/qunit-fixture.html237
-rw-r--r--test/data/qunit-fixture.js4
-rw-r--r--test/data/script.php11
-rw-r--r--test/data/statusText.php5
-rw-r--r--test/data/support/csp-clean.php3
-rw-r--r--test/data/support/csp-log.php3
-rw-r--r--test/data/support/csp.php19
-rw-r--r--test/data/test.include.html (renamed from test/data/test.html)4
-rw-r--r--test/data/test.php7
-rw-r--r--test/data/testbar.php3
-rw-r--r--test/data/testinit.js37
-rw-r--r--test/data/text.txt (renamed from test/data/text.php)0
-rw-r--r--test/data/with_fries_over_jsonp.php7
37 files changed, 530 insertions, 242 deletions
diff --git a/test/data/ajax/content-type.php b/test/data/ajax/content-type.php
deleted file mode 100644
index 162e3636d..000000000
--- a/test/data/ajax/content-type.php
+++ /dev/null
@@ -1,5 +0,0 @@
-<?php
- $type = $_REQUEST['content-type'];
- header("Content-type: $type");
- echo $_REQUEST['response']
-?>
diff --git a/test/data/ajax/evalScript.php b/test/data/ajax/evalScript.php
deleted file mode 100644
index ea9b8c55f..000000000
--- a/test/data/ajax/evalScript.php
+++ /dev/null
@@ -1 +0,0 @@
-ok( "<?php echo $_SERVER['REQUEST_METHOD'] ?>" === "GET", "request method is <?php echo $_SERVER['REQUEST_METHOD'] ?>" ); \ No newline at end of file
diff --git a/test/data/ajax/method.php b/test/data/ajax/method.php
deleted file mode 100644
index d76ff964b..000000000
--- a/test/data/ajax/method.php
+++ /dev/null
@@ -1 +0,0 @@
-<?php echo $_SERVER['REQUEST_METHOD'] ?>
diff --git a/test/data/ajax/unreleasedXHR.html b/test/data/ajax/unreleasedXHR.html
index 3eedaabf8..51c5b9486 100644
--- a/test/data/ajax/unreleasedXHR.html
+++ b/test/data/ajax/unreleasedXHR.html
@@ -15,7 +15,7 @@ jQuery(function() {
}, 200 );
var number = 50;
while( number-- ) {
- jQuery.ajax("../name.php?wait=10");
+ jQuery.ajax("../mock.php?action=wait&wait=10");
}
});
</script>
diff --git a/test/data/atom+xml.php b/test/data/atom+xml.php
deleted file mode 100644
index 944591abf..000000000
--- a/test/data/atom+xml.php
+++ /dev/null
@@ -1,4 +0,0 @@
-<?php header("Content-type: atom+xml") ?>
-<root>
- <element />
-</root> \ No newline at end of file
diff --git a/test/data/core/dont_return.php b/test/data/core/dont_return.php
deleted file mode 100644
index 1eef33692..000000000
--- a/test/data/core/dont_return.php
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php
-sleep(30);
-?>
diff --git a/test/data/core/dynamic_ready.html b/test/data/core/dynamic_ready.html
index 1db068b95..e8180cd2b 100644
--- a/test/data/core/dynamic_ready.html
+++ b/test/data/core/dynamic_ready.html
@@ -7,7 +7,7 @@
<script src="../iframeTest.js"></script>
</head>
<body>
-<iframe id="dont_return" src="dont_return.php"></iframe>
+<iframe id="dont_return" src="../mock.php?action=wait&wait=30"></iframe>
<script>
var timeoutId, $,
timeoutFired = false;
diff --git a/test/data/csp.include.html b/test/data/csp.include.html
new file mode 100644
index 000000000..17e2ef0d8
--- /dev/null
+++ b/test/data/csp.include.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <title>CSP Test Page</title>
+ <script src="../jquery.js"></script>
+ <script src="iframeTest.js"></script>
+ <script src="support/csp.js"></script>
+ <script src="support/getComputedSupport.js"></script>
+</head>
+<body>
+ <p>CSP Test Page</p>
+</body>
+</html>
diff --git a/test/data/echoData.php b/test/data/echoData.php
deleted file mode 100644
index a37ba515a..000000000
--- a/test/data/echoData.php
+++ /dev/null
@@ -1 +0,0 @@
-<?php echo file_get_contents('php://input'); ?>
diff --git a/test/data/echoQuery.php b/test/data/echoQuery.php
deleted file mode 100644
index b72f329c9..000000000
--- a/test/data/echoQuery.php
+++ /dev/null
@@ -1 +0,0 @@
-<?php echo $_SERVER['QUERY_STRING']; ?> \ No newline at end of file
diff --git a/test/data/errorWithJSON.php b/test/data/errorWithJSON.php
deleted file mode 100644
index 62b187ecc..000000000
--- a/test/data/errorWithJSON.php
+++ /dev/null
@@ -1,6 +0,0 @@
-<?php
-
-header("HTTP/1.0 400 Bad Request");
-header("Content-Type: application/json");
-
-echo '{ "code": 40, "message": "Bad Request" }'; \ No newline at end of file
diff --git a/test/data/errorWithText.php b/test/data/errorWithText.php
deleted file mode 100644
index abd873217..000000000
--- a/test/data/errorWithText.php
+++ /dev/null
@@ -1,5 +0,0 @@
-<?php
-
-header("HTTP/1.0 400 Bad Request");
-
-echo "plain text message"; \ No newline at end of file
diff --git a/test/data/etag.php b/test/data/etag.php
deleted file mode 100644
index 66eca4bb1..000000000
--- a/test/data/etag.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-error_reporting(0);
-
-$ts = $_REQUEST['ts'];
-$etag = md5($ts);
-
-$ifNoneMatch = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) : "";
-preg_match('/"([^"]+)"/', $ifNoneMatch, $matches);
-$ifNoneMatch = isset($matches[1]) ? $matches[1] : false;
-
-if ($ifNoneMatch == $etag) {
- header('HTTP/1.0 304 Not Modified');
- die; // stop processing
-}
-
-header("Etag: W/\"" . $etag . "\"");
-
-if ( $ifNoneMatch ) {
- echo "OK: " . $etag;
-} else {
- echo "FAIL";
-}
-
-?>
diff --git a/test/data/event/interactiveReady.html b/test/data/event/interactiveReady.html
index 3fb25f907..a80b79467 100644
--- a/test/data/event/interactiveReady.html
+++ b/test/data/event/interactiveReady.html
@@ -18,7 +18,7 @@ jQuery( function () {
oldIE into thinking the dom is ready, but it's not...
leaving this check here for future trailblazers to attempt
fixing this...-->
-<script type="text/javascript" src="../longLoadScript.php?sleep=1"></script>
+<script type="text/javascript" src="../mock.php?action=wait&wait=1"></script>
<div id="container" style="height: 300px"></div>
</body>
</html>
diff --git a/test/data/event/syncReady.html b/test/data/event/syncReady.html
index 61a50e423..5aa510459 100644
--- a/test/data/event/syncReady.html
+++ b/test/data/event/syncReady.html
@@ -18,7 +18,7 @@ jQuery( document ).ready(function () {
oldIE into thinking the dom is ready, but it's not...
leaving this check here for future trailblazers to attempt
fixing this...-->
-<script type="text/javascript" src="../longLoadScript.php?sleep=1"></script>
+<script type="text/javascript" src="../mock.php?action=wait&wait=1"></script>
<div id="container" style="height: 300px"></div>
</body>
</html>
diff --git a/test/data/headers.php b/test/data/headers.php
deleted file mode 100644
index 79c183055..000000000
--- a/test/data/headers.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-header( "Sample-Header: Hello World" );
-header( "Empty-Header: " );
-header( "Sample-Header2: Hello World 2" );
-
-$headers = array();
-
-foreach( $_SERVER as $key => $value ) {
-
- $key = str_replace( "_" , "-" , substr( $key , 0 , 5 ) == "HTTP_" ? substr( $key , 5 ) : $key );
- $headers[ $key ] = $value;
-
-}
-
-foreach( explode( "_" , $_GET[ "keys" ] ) as $key ) {
-
- // Only echo if key exists in the header
- if ( isset( $headers[ strtoupper( $key ) ] ) ) {
- echo "$key: " . @$headers[ strtoupper( $key ) ] . "\n";
- }
-
-}
diff --git a/test/data/if_modified_since.php b/test/data/if_modified_since.php
deleted file mode 100644
index 098b7da85..000000000
--- a/test/data/if_modified_since.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-error_reporting(0);
-
-$ts = $_REQUEST['ts'];
-
-$ifModifiedSince = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) : false;
-if ($ifModifiedSince == $ts) {
- header('HTTP/1.0 304 Not Modified');
- die; // stop processing
-}
-
-header("Last-Modified: " . $ts);
-
-if ( $ifModifiedSince ) {
- echo "OK: " . $ts;
-} else {
- echo "FAIL";
-}
-
-?>
diff --git a/test/data/json.php b/test/data/json.php
deleted file mode 100644
index d6e0f2fc7..000000000
--- a/test/data/json.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-error_reporting(0);
-if ( $_REQUEST['header'] ) {
- header("Content-type: application/json");
-}
-
-$json = $_REQUEST['json'];
-if($json) {
- echo '[ {"name": "John", "age": 21}, {"name": "Peter", "age": 25 } ]';
-} else {
- echo '{ "data": {"lang": "en", "length": 25} }';
-}
-?>
diff --git a/test/data/jsonp.php b/test/data/jsonp.php
deleted file mode 100644
index 6c13d72e9..000000000
--- a/test/data/jsonp.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-error_reporting(0);
-$callback = $_REQUEST['callback'];
-if ( ! $callback ) {
- $callback = explode("?",end(explode("/",$_SERVER['REQUEST_URI'])));
- $callback = $callback[0];
-}
-$json = $_REQUEST['json'];
-if($json) {
- echo $callback . '([ {"name": "John", "age": 21}, {"name": "Peter", "age": 25 } ])';
-} else {
- echo $callback . '({ "data": {"lang": "en", "length": 25} })';
-}
-?>
diff --git a/test/data/longLoadScript.php b/test/data/longLoadScript.php
deleted file mode 100644
index ba47168b4..000000000
--- a/test/data/longLoadScript.php
+++ /dev/null
@@ -1,4 +0,0 @@
-<?php
-sleep((int)$_GET['sleep']);
-header('Content-type: text/javascript');
-?> \ No newline at end of file
diff --git a/test/data/mock.php b/test/data/mock.php
new file mode 100644
index 000000000..692c417e8
--- /dev/null
+++ b/test/data/mock.php
@@ -0,0 +1,244 @@
+<?php
+/**
+ * Keep in sync with /test/middleware-mockserver.js
+ */
+class MockServer {
+ protected function contentType( $req ) {
+ $type = $req->query['contentType'];
+ header("Content-type: $type");
+ echo $req->query['response'];
+ }
+
+ protected function wait( $req ) {
+ $wait = (int) $req->query['wait'];
+ sleep( $wait );
+ if ( isset( $req->query['script'] ) ) {
+ header( 'Content-type: text/javascript' );
+ } else {
+ header( 'Content-type: text/html' );
+ echo 'ERROR <script>ok( true, "mock executed" );</script>';
+ }
+ }
+
+ protected function name( $req ) {
+ if ( $req->query['name'] === 'foo' ) {
+ echo 'bar';
+ } elseif ( $_POST['name'] === 'peter' ) {
+ echo 'pan';
+ } else {
+ echo 'ERROR';
+ }
+ }
+
+ protected function xml( $req ) {
+ header( 'Content-type: text/xml' );
+ if ( $req->query['cal'] !== '5-2' && $_POST['cal'] !== '5-2' ) {
+ echo '<error>ERROR</error>';
+ return;
+ }
+ echo "<math><calculation>5-2</calculation><result>3</result></math>\n";
+ }
+
+ protected function atom( $req ) {
+ header( 'Content-type: atom+xml' );
+ echo '<root><element /></root>';
+ }
+
+ protected function script( $req ) {
+ if ( isset( $req->query['header'] ) ) {
+ if ( $req->query['header'] === 'ecma' ) {
+ header( 'Content-type: application/ecmascript' );
+ } else {
+ header( 'Content-type: text/javascript' );
+ }
+ } else {
+ header( 'Content-type: text/html' );
+ }
+ echo 'ok( true, "mock executed" );';
+ }
+
+ // Used to be in test.js, but was renamed to testbar.php
+ // https://github.com/jquery/jquery/commit/d89c278a33#commitcomment-23423165
+ protected function testbar( $req ) {
+ echo 'this.testBar = "bar";
+jQuery("#ap").html("bar");
+ok( true, "mock executed");';
+ }
+
+ protected function json( $req ) {
+ if ( isset( $req->query['header'] ) ) {
+ header( 'Content-type: application/json' );
+ }
+
+ if ( isset( $req->query['array'] ) ) {
+ echo '[ {"name": "John", "age": 21}, {"name": "Peter", "age": 25 } ]';
+ } else {
+ echo '{ "data": {"lang": "en", "length": 25} }';
+ }
+ }
+
+ protected function jsonp( $req ) {
+ if ( isset( $req->query['callback'] ) ) {
+ $callback = $req->query['callback'];
+ } elseif ( $req->method === 'GET' ) {
+ // Try REST-like path
+ preg_match( '/\/([^\/?]+)\?.+$/', $req->url, $m );
+ $callback = $m[1];
+ } else {
+ $callback = $_POST['callback'];
+ }
+ if ( isset( $req->query['array'] ) ) {
+ echo $callback . '([ {"name": "John", "age": 21}, {"name": "Peter", "age": 25 } ])';
+ } else {
+ echo $callback . '({ "data": {"lang": "en", "length": 25} })';
+ }
+ }
+
+ protected function xmlOverJsonp( $req ) {
+ $callback = $_REQUEST['callback'];
+ $text = json_encode( file_get_contents( __DIR__ . '/with_fries.xml' ) );
+ echo "$callback($text)\n";
+ }
+
+ protected function error( $req ) {
+ header( 'HTTP/1.0 400 Bad Request' );
+ if ( isset( $req->query['json'] ) ) {
+ header( 'Content-Type: application/json' );
+ echo '{ "code": 40, "message": "Bad Request" }';
+ } else {
+ echo 'plain text message';
+ }
+ }
+
+ protected function headers( $req ) {
+ header( 'Sample-Header: Hello World' );
+ header( 'Empty-Header: ' );
+ header( 'Sample-Header2: Hello World 2' );
+
+ foreach ( explode( '|' , $req->query[ 'keys' ] ) as $key ) {
+ // Only echo if key exists in the header
+ if ( isset( $req->headers[ strtoupper( $key ) ] ) ) {
+ echo "$key: " . $req->headers[ strtoupper( $key ) ] . "\n";
+ }
+ }
+
+ }
+
+ protected function echoData( $req ) {
+ echo file_get_contents('php://input');
+ }
+
+ protected function echoQuery( $req ) {
+ echo $_SERVER['QUERY_STRING'];
+ }
+
+ protected function echoMethod( $req ) {
+ echo $req->method;
+ }
+
+ protected function echoHtml( $req ) {
+ header( 'Content-type: text/html' );
+ echo '<div id="method">' . $req->method . '</div>';
+ echo '<div id="query">' . $_SERVER['QUERY_STRING'] . '</div>';
+ echo '<div id="data">' . file_get_contents('php://input') . '</div>';
+ }
+
+ protected function etag( $req ) {
+ $hash = md5( $req->query['ts'] );
+ $etag = 'W/"' . $hash . '"';
+
+ $ifNoneMatch = isset( $req->headers['IF-NONE-MATCH'] ) ? $req->headers['IF-NONE-MATCH'] : '';
+ if ($ifNoneMatch === $etag) {
+ header('HTTP/1.0 304 Not Modified');
+ return;
+ }
+
+ header("Etag: $etag");
+ echo "ETag: $etag\n";
+ if ( $ifNoneMatch ) {
+ echo "If-None-Match: $ifNoneMatch\n";
+ }
+ }
+
+ protected function ims( $req ) {
+ $ts = $req->query['ts'];
+
+ $ims = isset( $req->headers['IF-MODIFIED-SINCE'] ) ? $req->headers['IF-MODIFIED-SINCE'] : '';
+ if ($ims === $ts) {
+ header('HTTP/1.0 304 Not Modified');
+ return;
+ }
+
+ header("Last-Modified: $ts");
+ echo "Last-Modified: $ts\n";
+ if ( $ims ) {
+ echo "If-Modified-Since: $ims\n";
+ }
+ }
+
+ protected function status( $req ) {
+ header( "HTTP/1.0 {$req->query['code']} {$req->query['text']}" );
+ }
+
+ protected function testHTML( $req ) {
+ header( 'Content-type: text/html' );
+ $html = file_get_contents( __DIR__ . '/test.include.html' );
+ $html = str_replace( '{{baseURL}}', $req->query['baseURL'], $html );
+ echo $html;
+ }
+
+ protected function cspFrame( $req ) {
+ // This is CSP only for browsers with "Content-Security-Policy" header support
+ // i.e. no old WebKit or old Firefox
+ header( "Content-Security-Policy: default-src 'self'; report-uri ./mock.php?action=cspLog" );
+ header( 'Content-type: text/html' );
+ echo file_get_contents( __DIR__ . '/csp.include.html' );
+ }
+
+ protected function cspLog( $req ) {
+ file_put_contents( $this->cspFile, 'error' );
+ }
+
+ protected function cspClean( $req ) {
+ file_put_contents( $this->cspFile, '' );
+ unlink( $this->cspFile );
+ }
+
+ public function __construct() {
+ $this->cspFile = __DIR__ . '/support/csp.log';
+ }
+
+ public function respond( stdClass $req ) {
+ if ( !isset( $req->query['action'] ) || !method_exists( $this, $req->query['action'] ) ) {
+ header( "HTTP/1.0 400 Bad Request" );
+ echo "Invalid action query.\n";
+ return;
+ }
+ $this->{$req->query['action']}( $req );
+ }
+}
+
+// Don't include PHP errors in http response
+error_reporting( 0 );
+
+// Collect headers
+$headers = array();
+foreach ( $_SERVER as $name => $value ) {
+ if ( substr( $name, 0, 5 ) === 'HTTP_' ) {
+ $name = str_replace( '_', '-', substr( $name, 5 ) );
+ $headers[$name] = $value;
+ } elseif ( $name === 'CONTENT_LENGTH' ) {
+ $headers['CONTENT-LENGTH'] = $value;
+ } elseif ( $name === 'CONTENT_TYPE' ) {
+ $headers['CONTENT-TYPE'] = $value;
+ }
+}
+
+$mock = new MockServer();
+$req = (object) array(
+ 'query' => $_GET,
+ 'headers' => $headers,
+ 'method' => $_SERVER['REQUEST_METHOD'],
+ 'url' => $_SERVER['REQUEST_URI'],
+);
+$mock->respond( $req );
diff --git a/test/data/name.php b/test/data/name.php
deleted file mode 100644
index 64028585d..000000000
--- a/test/data/name.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-error_reporting(0);
-$wait = $_REQUEST['wait'];
-if($wait) {
- sleep($wait);
-}
-$xml = $_REQUEST['xml'];
-if($xml) {
- header("Content-type: text/xml");
- $result = ($xml == "5-2") ? "3" : "?";
- echo "<math><calculation>$xml</calculation><result>$result</result></math>";
- die();
-}
-$name = $_REQUEST['name'];
-if($name == 'foo') {
- echo "bar";
- die();
-} else if($name == 'peter') {
- echo "pan";
- die();
-}
-
-echo 'ERROR <script type="text/javascript">ok( true, "name.php executed" );</script>';
-?> \ No newline at end of file
diff --git a/test/data/nocontent.php b/test/data/nocontent.php
deleted file mode 100644
index 9c8431bd7..000000000
--- a/test/data/nocontent.php
+++ /dev/null
@@ -1,5 +0,0 @@
-<?php
-
-header('HTTP/1.0 204 No Content');
-
-?> \ No newline at end of file
diff --git a/test/data/params_html.php b/test/data/params_html.php
deleted file mode 100644
index e88ef1521..000000000
--- a/test/data/params_html.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<div id="post">
-<?php
- foreach( $_POST as $key=>$value )
- echo "<b id='$key'>$value</b>";
-?>
-</div>
-<div id="get">
-<?php
- foreach( $_GET as $key=>$value )
- echo "<b id='$key'>$value</b>";
-?>
-</div> \ No newline at end of file
diff --git a/test/data/qunit-fixture.html b/test/data/qunit-fixture.html
new file mode 100644
index 000000000..e0fd3e60e
--- /dev/null
+++ b/test/data/qunit-fixture.html
@@ -0,0 +1,237 @@
+<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><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"></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" data-attr="">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>
+ <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 id="nonnodesElement">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="no-clone-exception"><object><embed></embed></object></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>
+ <input id="inputWithoutTabIndex"/>
+ <button id="buttonWithoutTabIndex"></button>
+ <textarea id="textareaWithoutTabIndex"></textarea>
+ <menu type="popup">
+ <menuitem id="menuitemWithoutTabIndex" command="submitbutton" default/>
+ </menu>
+</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 id="fx-test-group" style="position: absolute; width: 1px; height: 1px; overflow: hidden;">
+ <div id="fx-queue" name="test">
+ <div id="fadein" class='chain-test' name='div'>fadeIn<div>fadeIn</div></div>
+ <div id="fadeout" class='chain-test chain-test-out'>fadeOut<div>fadeOut</div></div>
+
+ <div id="show" class='chain-test'>show<div>show</div></div>
+ <div id="hide" class='chain-test chain-test-out'>hide<div>hide</div></div>
+ <div id="easehide" class='chain-test chain-test-out'>hide<div>hide</div></div>
+
+ <div id="togglein" class='chain-test'>togglein<div>togglein</div></div>
+ <div id="toggleout" class='chain-test chain-test-out'>toggleout<div>toggleout</div></div>
+ <div id="easetoggleout" class='chain-test chain-test-out'>toggleout<div>toggleout</div></div>
+
+ <div id="slideup" class='chain-test'>slideUp<div>slideUp</div></div>
+ <div id="slidedown" class='chain-test chain-test-out'>slideDown<div>slideDown</div></div>
+ <div id="easeslideup" class='chain-test'>slideUp<div>slideUp</div></div>
+
+ <div id="slidetogglein" class='chain-test'>slideToggleIn<div>slideToggleIn</div></div>
+ <div id="slidetoggleout" class='chain-test chain-test-out'>slideToggleOut<div>slideToggleOut</div></div>
+
+ <div id="fadetogglein" class='chain-test'>fadeToggleIn<div>fadeToggleIn</div></div>
+ <div id="fadetoggleout" class='chain-test chain-test-out'>fadeToggleOut<div>fadeToggleOut</div></div>
+
+ <div id="fadeto" class='chain-test'>fadeTo<div>fadeTo</div></div>
+ </div>
+
+ <div id="fx-tests"></div>
+ <span id="display"></span>
+</div>
diff --git a/test/data/qunit-fixture.js b/test/data/qunit-fixture.js
new file mode 100644
index 000000000..6ea2f3b3d
--- /dev/null
+++ b/test/data/qunit-fixture.js
@@ -0,0 +1,4 @@
+// Generated by build/tasks/qunit_fixture.js
+QUnit.config.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>\n<p id=\"ap\">\n\tHere are some links in a normal paragraph: <a id=\"google\" href=\"http://www.google.com/\" title=\"Google!\">Google</a>,\n\t<a id=\"groups\" href=\"http://groups.google.com/\" class=\"GROUPS\">Google Groups (Link)</a>.\n\tThis link has <code><a href=\"http://smin\" id=\"anchor1\">class=\"blog\"</a></code>:\n\t<a href=\"http://diveintomark.org/\" class=\"blog\" hreflang=\"en\" id=\"mark\">diveintomark</a>\n\n</p>\n<div id=\"foo\">\n\t<p id=\"sndp\">Everything inside the red border is inside a div with <code>id=\"foo\"</code>.</p>\n\t<p lang=\"en\" id=\"en\">This is a normal link: <a id=\"yahoo\" href=\"http://www.yahoo.com/\" class=\"blogTest\">Yahoo</a></p>\n\t<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>\n\n</div>\n<div id=\"nothiddendiv\" style=\"height:1px;background:white;\" class=\"nothiddendiv\">\n\t<div id=\"nothiddendivchild\"></div>\n</div>\n<span id=\"name+value\"></span>\n<p id=\"first\">Try them out:</p>\n<ul id=\"firstUL\"></ul>\n<ol id=\"empty\"></ol>\n<form id=\"form\" action=\"formaction\">\n\t<label for=\"action\" id=\"label-for\">Action:</label>\n\t<input type=\"text\" name=\"action\" value=\"Test\" id=\"text1\" maxlength=\"30\"/>\n\t<input type=\"text\" name=\"text2\" value=\"Test\" id=\"text2\" disabled=\"disabled\"/>\n\t<input type=\"radio\" name=\"radio1\" id=\"radio1\" value=\"on\"/>\n\n\t<input type=\"radio\" name=\"radio2\" id=\"radio2\" checked=\"checked\"/>\n\t<input type=\"checkbox\" name=\"check\" id=\"check1\" checked=\"checked\"/>\n\t<input type=\"checkbox\" id=\"check2\" value=\"on\"/>\n\n\t<input type=\"hidden\" name=\"hidden\" id=\"hidden1\"/>\n\t<input type=\"text\" style=\"display:none;\" name=\"foo[bar]\" id=\"hidden2\"/>\n\n\t<input type=\"text\" id=\"name\" name=\"name\" value=\"name\" />\n\t<input type=\"search\" id=\"search\" name=\"search\" value=\"search\" />\n\n\t<button id=\"button\" name=\"button\" type=\"button\">Button</button>\n\n\t<textarea id=\"area1\" maxlength=\"30\">foobar</textarea>\n\n\t<select name=\"select1\" id=\"select1\">\n\t\t<option id=\"option1a\" class=\"emptyopt\" value=\"\">Nothing</option>\n\t\t<option id=\"option1b\" value=\"1\">1</option>\n\t\t<option id=\"option1c\" value=\"2\">2</option>\n\t\t<option id=\"option1d\" value=\"3\">3</option>\n\t</select>\n\t<select name=\"select2\" id=\"select2\">\n\t\t<option id=\"option2a\" class=\"emptyopt\" value=\"\">Nothing</option>\n\t\t<option id=\"option2b\" value=\"1\">1</option>\n\t\t<option id=\"option2c\" value=\"2\">2</option>\n\t\t<option id=\"option2d\" selected=\"selected\" value=\"3\">3</option>\n\t</select>\n\t<select name=\"select3\" id=\"select3\" multiple=\"multiple\">\n\t\t<option id=\"option3a\" class=\"emptyopt\" value=\"\">Nothing</option>\n\t\t<option id=\"option3b\" selected=\"selected\" value=\"1\">1</option>\n\t\t<option id=\"option3c\" selected=\"selected\" value=\"2\">2</option>\n\t\t<option id=\"option3d\" value=\"3\">3</option>\n\t\t<option id=\"option3e\">no value</option>\n\t</select>\n\t<select name=\"select4\" id=\"select4\" multiple=\"multiple\">\n\t\t<optgroup disabled=\"disabled\">\n\t\t\t<option id=\"option4a\" class=\"emptyopt\" value=\"\">Nothing</option>\n\t\t\t<option id=\"option4b\" disabled=\"disabled\" selected=\"selected\" value=\"1\">1</option>\n\t\t\t<option id=\"option4c\" selected=\"selected\" value=\"2\">2</option>\n\t\t</optgroup>\n\t\t<option selected=\"selected\" disabled=\"disabled\" id=\"option4d\" value=\"3\">3</option>\n\t\t<option id=\"option4e\">no value</option>\n\t</select>\n\t<select name=\"select5\" id=\"select5\">\n\t\t<option id=\"option5a\" value=\"3\">1</option>\n\t\t<option id=\"option5b\" value=\"2\">2</option>\n\t\t<option id=\"option5c\" value=\"1\" data-attr=\"\">3</option>\n\t</select>\n\n\t<object id=\"object1\" codebase=\"stupid\">\n\t\t<param name=\"p1\" value=\"x1\" />\n\t\t<param name=\"p2\" value=\"x2\" />\n\t</object>\n\n\t<span id=\"台北Táiběi\"></span>\n\t<span id=\"台北\" lang=\"中文\"></span>\n\t<span id=\"utf8class1\" class=\"台北Táiběi 台北\"></span>\n\t<span id=\"utf8class2\" class=\"台北\"></span>\n\t<span id=\"foo:bar\" class=\"foo:bar\"></span>\n\t<span id=\"test.foo[5]bar\" class=\"test.foo[5]bar\"></span>\n\n\t<foo_bar id=\"foobar\">test element</foo_bar>\n</form>\n<b id=\"floatTest\">Float test.</b>\n<iframe id=\"iframe\" name=\"iframe\"></iframe>\n<form id=\"lengthtest\">\n\t<input type=\"text\" id=\"length\" name=\"test\"/>\n\t<input type=\"text\" id=\"idTest\" name=\"id\"/>\n</form>\n<table id=\"table\"></table>\n\n<form id=\"name-tests\">\n\t<!-- Inputs with a grouped name attribute. -->\n\t<input name=\"types[]\" id=\"types_all\" type=\"checkbox\" value=\"all\" />\n\t<input name=\"types[]\" id=\"types_anime\" type=\"checkbox\" value=\"anime\" />\n\t<input name=\"types[]\" id=\"types_movie\" type=\"checkbox\" value=\"movie\" />\n</form>\n\n<form id=\"testForm\" action=\"#\" method=\"get\">\n\t<textarea name=\"T3\" rows=\"2\" cols=\"15\">?\nZ</textarea>\n\t<input type=\"hidden\" name=\"H1\" value=\"x\" />\n\t<input type=\"hidden\" name=\"H2\" />\n\t<input name=\"PWD\" type=\"password\" value=\"\" />\n\t<input name=\"T1\" type=\"text\" />\n\t<input name=\"T2\" type=\"text\" value=\"YES\" readonly=\"readonly\" />\n\t<input type=\"checkbox\" name=\"C1\" value=\"1\" />\n\t<input type=\"checkbox\" name=\"C2\" />\n\t<input type=\"radio\" name=\"R1\" value=\"1\" />\n\t<input type=\"radio\" name=\"R1\" value=\"2\" />\n\t<input type=\"text\" name=\"My Name\" value=\"me\" />\n\t<input type=\"reset\" name=\"reset\" value=\"NO\" />\n\t<select name=\"S1\">\n\t\t<option value=\"abc\">ABC</option>\n\t\t<option value=\"abc\">ABC</option>\n\t\t<option value=\"abc\">ABC</option>\n\t</select>\n\t<select name=\"S2\" multiple=\"multiple\" size=\"3\">\n\t\t<option value=\"abc\">ABC</option>\n\t\t<option value=\"abc\">ABC</option>\n\t\t<option value=\"abc\">ABC</option>\n\t</select>\n\t<select name=\"S3\">\n\t\t<option selected=\"selected\">YES</option>\n\t</select>\n\t<select name=\"S4\">\n\t\t<option value=\"\" selected=\"selected\">NO</option>\n\t</select>\n\t<input type=\"submit\" name=\"sub1\" value=\"NO\" />\n\t<input type=\"submit\" name=\"sub2\" value=\"NO\" />\n\t<input type=\"image\" name=\"sub3\" value=\"NO\" />\n\t<button name=\"sub4\" type=\"submit\" value=\"NO\">NO</button>\n\t<input name=\"D1\" type=\"text\" value=\"NO\" disabled=\"disabled\" />\n\t<input type=\"checkbox\" checked=\"checked\" disabled=\"disabled\" name=\"D2\" value=\"NO\" />\n\t<input type=\"radio\" name=\"D3\" value=\"NO\" checked=\"checked\" disabled=\"disabled\" />\n\t<select name=\"D4\" disabled=\"disabled\">\n\t\t<option selected=\"selected\" value=\"NO\">NO</option>\n\t</select>\n\t<input id=\"list-test\" type=\"text\" />\n\t<datalist id=\"datalist\">\n\t\t<option value=\"option\"></option>\n\t</datalist>\n</form>\n<div id=\"moretests\">\n\t<form>\n\t\t<div id=\"checkedtest\" style=\"display:none;\">\n\t\t\t<input type=\"radio\" name=\"checkedtestradios\" checked=\"checked\"/>\n\t\t\t<input type=\"radio\" name=\"checkedtestradios\" value=\"on\"/>\n\t\t\t<input type=\"checkbox\" name=\"checkedtestcheckboxes\" checked=\"checked\"/>\n\t\t\t<input type=\"checkbox\" name=\"checkedtestcheckboxes\" />\n\t\t</div>\n\t</form>\n\t<div id=\"nonnodes\"><span id=\"nonnodesElement\">hi</span> there <!-- mon ami --></div>\n\t<div id=\"t2037\">\n\t\t<div><div class=\"hidden\">hidden</div></div>\n\t</div>\n\t<div id=\"t6652\">\n\t\t<div></div>\n\t</div>\n\t<div id=\"no-clone-exception\"><object><embed></embed></object></div>\n</div>\n\n<div id=\"tabindex-tests\">\n\t<ol id=\"listWithTabIndex\" tabindex=\"5\">\n\t\t<li id=\"foodWithNegativeTabIndex\" tabindex=\"-1\">Rice</li>\n\t\t<li id=\"foodNoTabIndex\">Beans</li>\n\t\t<li>Blinis</li>\n\t\t<li>Tofu</li>\n\t</ol>\n\n\t<div id=\"divWithNoTabIndex\">I'm hungry. I should...</div>\n\t<span>...</span><a href=\"#\" id=\"linkWithNoTabIndex\">Eat lots of food</a><span>...</span> |\n\t<span>...</span><a href=\"#\" id=\"linkWithTabIndex\" tabindex=\"2\">Eat a little food</a><span>...</span> |\n\t<span>...</span><a href=\"#\" id=\"linkWithNegativeTabIndex\" tabindex=\"-1\">Eat no food</a><span>...</span>\n\t<span>...</span><a id=\"linkWithNoHrefWithNoTabIndex\">Eat a burger</a><span>...</span>\n\t<span>...</span><a id=\"linkWithNoHrefWithTabIndex\" tabindex=\"1\">Eat some funyuns</a><span>...</span>\n\t<span>...</span><a id=\"linkWithNoHrefWithNegativeTabIndex\" tabindex=\"-1\">Eat some funyuns</a><span>...</span>\n\t<input id=\"inputWithoutTabIndex\"/>\n\t<button id=\"buttonWithoutTabIndex\"></button>\n\t<textarea id=\"textareaWithoutTabIndex\"></textarea>\n\t<menu type=\"popup\">\n\t\t<menuitem id=\"menuitemWithoutTabIndex\" command=\"submitbutton\" default/>\n\t</menu>\n</div>\n\n<div id=\"liveHandlerOrder\">\n\t<span id=\"liveSpan1\"><a href=\"#\" id=\"liveLink1\"></a></span>\n\t<span id=\"liveSpan2\"><a href=\"#\" id=\"liveLink2\"></a></span>\n</div>\n\n<div id=\"siblingTest\">\n\t<em id=\"siblingfirst\">1</em>\n\t<em id=\"siblingnext\">2</em>\n\t<em id=\"siblingthird\">\n\t\t<em id=\"siblingchild\">\n\t\t\t<em id=\"siblinggrandchild\">\n\t\t\t\t<em id=\"siblinggreatgrandchild\"></em>\n\t\t\t</em>\n\t\t</em>\n\t</em>\n\t<span id=\"siblingspan\"></span>\n</div>\n<div id=\"fx-test-group\" style=\"position: absolute; width: 1px; height: 1px; overflow: hidden;\">\n\t<div id=\"fx-queue\" name=\"test\">\n\t\t<div id=\"fadein\" class='chain-test' name='div'>fadeIn<div>fadeIn</div></div>\n\t\t<div id=\"fadeout\" class='chain-test chain-test-out'>fadeOut<div>fadeOut</div></div>\n\n\t\t<div id=\"show\" class='chain-test'>show<div>show</div></div>\n\t\t<div id=\"hide\" class='chain-test chain-test-out'>hide<div>hide</div></div>\n\t\t<div id=\"easehide\" class='chain-test chain-test-out'>hide<div>hide</div></div>\n\n\t\t<div id=\"togglein\" class='chain-test'>togglein<div>togglein</div></div>\n\t\t<div id=\"toggleout\" class='chain-test chain-test-out'>toggleout<div>toggleout</div></div>\n\t\t<div id=\"easetoggleout\" class='chain-test chain-test-out'>toggleout<div>toggleout</div></div>\n\n\t\t<div id=\"slideup\" class='chain-test'>slideUp<div>slideUp</div></div>\n\t\t<div id=\"slidedown\" class='chain-test chain-test-out'>slideDown<div>slideDown</div></div>\n\t\t<div id=\"easeslideup\" class='chain-test'>slideUp<div>slideUp</div></div>\n\n\t\t<div id=\"slidetogglein\" class='chain-test'>slideToggleIn<div>slideToggleIn</div></div>\n\t\t<div id=\"slidetoggleout\" class='chain-test chain-test-out'>slideToggleOut<div>slideToggleOut</div></div>\n\n\t\t<div id=\"fadetogglein\" class='chain-test'>fadeToggleIn<div>fadeToggleIn</div></div>\n\t\t<div id=\"fadetoggleout\" class='chain-test chain-test-out'>fadeToggleOut<div>fadeToggleOut</div></div>\n\n\t\t<div id=\"fadeto\" class='chain-test'>fadeTo<div>fadeTo</div></div>\n\t</div>\n\n\t<div id=\"fx-tests\"></div>\n\t<span id=\"display\"></span>\n</div>\n";
+// Compat with QUnit 1.x:
+document.getElementById( "qunit-fixture" ).innerHTML = QUnit.config.fixture;
diff --git a/test/data/script.php b/test/data/script.php
deleted file mode 100644
index fb7110491..000000000
--- a/test/data/script.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-error_reporting(0);
-if ( $_REQUEST['header'] ) {
- if ( $_REQUEST['header'] == "ecma" ) {
- header("Content-type: application/ecmascript");
- } else {
- header("Content-type: text/javascript");
- }
-}
-?>
-ok( true, "Script executed correctly." );
diff --git a/test/data/statusText.php b/test/data/statusText.php
deleted file mode 100644
index daf58ce3f..000000000
--- a/test/data/statusText.php
+++ /dev/null
@@ -1,5 +0,0 @@
-<?php
-
-header( "HTTP/1.0 $_GET[status] $_GET[text]" );
-
-?> \ No newline at end of file
diff --git a/test/data/support/csp-clean.php b/test/data/support/csp-clean.php
deleted file mode 100644
index e16d047a3..000000000
--- a/test/data/support/csp-clean.php
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php
- file_put_contents("csp.log", "", LOCK_EX);
-?>
diff --git a/test/data/support/csp-log.php b/test/data/support/csp-log.php
deleted file mode 100644
index efbb9d7bc..000000000
--- a/test/data/support/csp-log.php
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php
- file_put_contents("csp.log", "error", LOCK_EX);
-?>
diff --git a/test/data/support/csp.php b/test/data/support/csp.php
deleted file mode 100644
index 446000239..000000000
--- a/test/data/support/csp.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
- # This test page checks CSP only for browsers with "Content-Security-Policy" header support
- # i.e. no old WebKit or old Firefox
- header("Content-Security-Policy: default-src 'self'; report-uri csp-log.php");
-?>
-<!DOCTYPE html>
-<html>
-<head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>CSP Test Page</title>
- <script src="../../jquery.js"></script>
- <script src="../iframeTest.js"></script>
- <script src="csp.js"></script>
- <script src="getComputedSupport.js"></script>
-</head>
-<body>
- <p>CSP Test Page</p>
-</body>
-</html>
diff --git a/test/data/test.html b/test/data/test.include.html
index f5bc2199f..73299db07 100644
--- a/test/data/test.html
+++ b/test/data/test.include.html
@@ -1,7 +1,7 @@
html text<br/>
<script type="text/javascript">/* <![CDATA[ */
testFoo = "foo"; jQuery('#foo').html('foo');
-ok( true, "test.html executed" );
+ok( true, "test.include.html executed" );
/* ]]> */</script>
-<script src="data/testbar.php"></script>
+<script src="{{baseURL}}mock.php?action=testbar"></script>
blabla
diff --git a/test/data/test.php b/test/data/test.php
deleted file mode 100644
index d93dafad8..000000000
--- a/test/data/test.php
+++ /dev/null
@@ -1,7 +0,0 @@
-html text<br/>
-<script type="text/javascript">/* <![CDATA[ */
-testFoo = "foo"; jQuery('#foo').html('foo');
-ok( true, "test.php executed" );
-/* ]]> */</script>
-<script src="data/testbar.php?<?php srand(); echo time() . '' . rand(); ?>"></script>
-blabla
diff --git a/test/data/testbar.php b/test/data/testbar.php
deleted file mode 100644
index 21aa6882b..000000000
--- a/test/data/testbar.php
+++ /dev/null
@@ -1,3 +0,0 @@
-this.testBar = "bar";
-jQuery("#ap").html("bar");
-ok( true, "testbar.php executed");
diff --git a/test/data/testinit.js b/test/data/testinit.js
index 1aa9a65da..d6c0236e6 100644
--- a/test/data/testinit.js
+++ b/test/data/testinit.js
@@ -1,6 +1,11 @@
/* eslint no-multi-str: "off" */
-var baseURL = "",
+// baseURL is intentionally set to "data/" instead of "".
+// This is not just for convenience (since most files are in data/)
+// but also to ensure that urls without prefix fail.
+// Otherwise it's easy to write tests that pass on test/index.html
+// but fail in Karma runner (where the baseURL is different).
+var baseURL = "data/",
supportjQuery = this.jQuery,
// see RFC 2606
@@ -148,11 +153,13 @@ window.fireNative = document.createEvent ?
/**
* Add random number to url to stop caching
*
- * @example url("data/test.html")
- * @result "data/test.html?10538358428943"
+ * Also prefixes with baseURL automatically.
*
- * @example url("data/test.php?foo=bar")
- * @result "data/test.php?foo=bar&10538358345554"
+ * @example url("index.html")
+ * @result "data/index.html?10538358428943"
+ *
+ * @example url("mock.php?foo=bar")
+ * @result "data/mock.php?foo=bar&10538358345554"
*/
function url( value ) {
return baseURL + value + ( /\?/.test( value ) ? "&" : "?" ) +
@@ -239,7 +246,7 @@ this.testIframe = function( title, fileName, func, wrapper ) {
var done = assert.async(),
$iframe = supportjQuery( "<iframe/>" )
.css( { position: "absolute", top: "0", left: "-600px", width: "500px" } )
- .attr( { id: "qunit-fixture-iframe", src: url( "./data/" + fileName ) } );
+ .attr( { id: "qunit-fixture-iframe", src: url( fileName ) } );
// Test iframes are expected to invoke this via startIframeTest (cf. iframeTest.js)
window.iframeCallback = function() {
@@ -264,14 +271,20 @@ this.testIframe = function( title, fileName, func, wrapper ) {
};
this.iframeCallback = undefined;
-// Tests are always loaded async
-QUnit.config.autostart = false;
-this.loadTests = function() {
+if ( window.__karma__ ) {
+ // In Karma, files are served from /base
+ baseURL = "base/test/data/";
+} else {
+ // Tests are always loaded async
+ // except when running tests in Karma (See Gruntfile)
+ QUnit.config.autostart = false;
+}
- // Leverage QUnit URL parsing to detect testSwarm environment and "basic" testing mode
- QUnit.isSwarm = ( QUnit.urlParams.swarmURL + "" ).indexOf( "http" ) === 0;
- QUnit.basicTests = ( QUnit.urlParams.module + "" ) === "basic";
+// Leverage QUnit URL parsing to detect testSwarm environment and "basic" testing mode
+QUnit.isSwarm = ( QUnit.urlParams.swarmURL + "" ).indexOf( "http" ) === 0;
+QUnit.basicTests = ( QUnit.urlParams.module + "" ) === "basic";
+this.loadTests = function() {
// Get testSubproject from testrunner first
require( [ "data/testrunner.js" ], function() {
var i = 0,
diff --git a/test/data/text.php b/test/data/text.txt
index b9df4cf3b..b9df4cf3b 100644
--- a/test/data/text.php
+++ b/test/data/text.txt
diff --git a/test/data/with_fries_over_jsonp.php b/test/data/with_fries_over_jsonp.php
deleted file mode 100644
index 456aeb3bd..000000000
--- a/test/data/with_fries_over_jsonp.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-error_reporting(0);
-$callback = $_REQUEST['callback'];
-$json = $_REQUEST['json'];
-$text = json_encode(file_get_contents(dirname(__FILE__)."/with_fries.xml"));
-echo "$callback($text)";
-?>