Reorganzing the jQuery source (first phase).

This commit is contained in:
John Resig 2007-09-08 12:42:32 +00:00
parent 13b66c8ba9
commit b4e23b5af0
29 changed files with 16 additions and 16 deletions

BIN
test/data/cow.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

11
test/data/dashboard.xml Normal file
View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<dashboard>
<locations class="foo">
<location for="bar">
<infowindowtab>
<tab title="Location"><![CDATA[blabla]]></tab>
<tab title="Users"><![CDATA[blublu]]></tab>
</infowindowtab>
</location>
</locations>
</dashboard>

9
test/data/json.php Normal file
View file

@ -0,0 +1,9 @@
<?php
error_reporting(0);
$json = $_REQUEST['json'];
if($json) {
echo '[ {"name": "John", "age": 21}, {"name": "Peter", "age": 25 } ]';
} else {
echo '{ "data": {"lang": "en", "length": 25} }';
}
?>

1
test/data/json_obj.js Normal file
View file

@ -0,0 +1 @@
{ "data": {"lang": "en", "length": 25} }

10
test/data/jsonp.php Normal file
View file

@ -0,0 +1,10 @@
<?php
error_reporting(0);
$callback = $_REQUEST['callback'];
$json = $_REQUEST['json'];
if($json) {
echo $callback . '([ {"name": "John", "age": 21}, {"name": "Peter", "age": 25 } ])';
} else {
echo $callback . '({ "data": {"lang": "en", "length": 25} })';
}
?>

1
test/data/name.html Normal file
View file

@ -0,0 +1 @@
ERROR <script type="text/javascript">ok( true, "name.html retrieved" );</script>

29
test/data/name.php Normal file
View file

@ -0,0 +1,29 @@
<?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();
}
$request = apache_request_headers();
$request = $request['X-Custom-Header'];
if(strlen($request) > 0) {
echo $request;
die();
}
echo 'ERROR <script type="text/javascript">ok( true, "name.php executed" );</script>';
?>

7
test/data/test.html Normal file
View file

@ -0,0 +1,7 @@
html text<br/>
<script type="text/javascript">/* <![CDATA[ */
testFoo = "foo"; $('#foo').html('foo');
ok( true, "test.html executed" );
/* ]]> */</script>
<script src="data/test.js"></script>
blabla

3
test/data/test.js Normal file
View file

@ -0,0 +1,3 @@
var foobar = "bar";
$('#ap').html('bar');
ok( true, "test.js executed");

7
test/data/test.php Normal file
View file

@ -0,0 +1,7 @@
html text<br/>
<script type="text/javascript">/* <![CDATA[ */
testFoo = "foo"; $('#foo').html('foo');
ok( true, "test.php executed" );
/* ]]> */</script>
<script src="data/test.js?<?php srand(); echo time() . '' . rand(); ?>"></script>
blabla

5
test/data/test2.html Normal file
View file

@ -0,0 +1,5 @@
<script type="text/javascript">
var testFoo = "foo";
$('#foo').html('foo');
ok( true, "test2.html executed" );
</script>

3
test/data/test3.html Normal file
View file

@ -0,0 +1,3 @@
<div class="user">This is a user</div>
<div class="user">This is a user</div>
<div class="teacher">This is a teacher</div>

303
test/data/testrunner.js Normal file
View file

@ -0,0 +1,303 @@
var _config = {
fixture: null,
Test: [],
stats: {
all: 0,
bad: 0
},
queue: [],
blocking: true,
timeout: null,
expected: null,
currentModule: null,
asyncTimeout: 2 // seconds for async timeout
};
var isLocal = !!(window.location.protocol == 'file:');
$(function() {
$('#userAgent').html(navigator.userAgent);
runTest();
});
function synchronize(callback) {
_config.queue[_config.queue.length] = callback;
if(!_config.blocking) {
process();
}
}
function process() {
while(_config.queue.length && !_config.blocking) {
var call = _config.queue[0];
_config.queue = _config.queue.slice(1);
call();
}
}
function stop(allowFailure) {
_config.blocking = true;
var handler = allowFailure ? start : function() {
ok( false, "Test timed out" );
start();
};
// Disabled, caused too many random errors
//_config.timeout = setTimeout(handler, _config.asyncTimeout * 1000);
}
function start() {
// A slight delay, to avoid any current callbacks
setTimeout(function(){
if(_config.timeout)
clearTimeout(_config.timeout);
_config.blocking = false;
process();
}, 13);
}
function runTest() {
_config.blocking = false;
var time = new Date();
_config.fixture = document.getElementById('main').innerHTML;
synchronize(function() {
time = new Date() - time;
$("<div>").html(['<p class="result">Tests completed in ',
time, ' milliseconds.<br/>',
_config.stats.bad, ' tests of ', _config.stats.all, ' failed.</p>']
.join(''))
.appendTo("body");
$("#banner").addClass(_config.stats.bad ? "fail" : "pass");
});
}
function test(name, callback, nowait) {
if(_config.currentModule)
name = _config.currentModule + " module: " + name;
var filter = location.search.slice(1);
if ( filter && encodeURIComponent(name).indexOf(filter) == -1 )
return;
synchronize(function() {
_config.Test = [];
try {
callback();
} catch(e) {
if( typeof console != "undefined" && console.error && console.warn ) {
console.error("Test " + name + " died, exception and test follows");
console.error(e);
console.warn(callback.toString());
}
_config.Test.push( [ false, "Died on test #" + (_config.Test.length+1) + ": " + e ] );
}
});
synchronize(function() {
reset();
// don't output pause tests
if(nowait) return;
if(_config.expected && _config.expected != _config.Test.length) {
_config.Test.push( [ false, "Expected " + _config.expected + " assertions, but " + _config.Test.length + " were run" ] );
}
_config.expected = null;
var good = 0, bad = 0;
var ol = document.createElement("ol");
ol.style.display = "none";
var li = "", state = "pass";
for ( var i = 0; i < _config.Test.length; i++ ) {
var li = document.createElement("li");
li.className = _config.Test[i][0] ? "pass" : "fail";
li.innerHTML = _config.Test[i][1];
ol.appendChild( li );
_config.stats.all++;
if ( !_config.Test[i][0] ) {
state = "fail";
bad++;
_config.stats.bad++;
} else good++;
}
var li = document.createElement("li");
li.className = state;
var b = document.createElement("strong");
b.innerHTML = name + " <b style='color:black;'>(<b class='fail'>" + bad + "</b>, <b class='pass'>" + good + "</b>, " + _config.Test.length + ")</b>";
b.onclick = function(){
var n = this.nextSibling;
if ( jQuery.css( n, "display" ) == "none" )
n.style.display = "block";
else
n.style.display = "none";
};
$(b).dblclick(function(event) {
var target = jQuery(event.target).filter("strong").clone();
if ( target.length ) {
target.children().remove();
location.href = location.href.match(/^(.+?)(\?.*)?$/)[1] + "?" + encodeURIComponent($.trim(target.text()));
}
});
li.appendChild( b );
li.appendChild( ol );
document.getElementById("tests").appendChild( li );
});
}
// call on start of module test to prepend name to all tests
function module(moduleName) {
_config.currentModule = moduleName;
}
/**
* Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through.
*/
function expect(asserts) {
_config.expected = asserts;
}
/**
* Resets the test setup. Useful for tests that modify the DOM.
*/
function reset() {
document.getElementById('main').innerHTML = _config.fixture;
}
/**
* Asserts true.
* @example ok( $("a").size() > 5, "There must be at least 5 anchors" );
*/
function ok(a, msg) {
_config.Test.push( [ !!a, msg ] );
}
/**
* Asserts that two arrays are the same
*/
function isSet(a, b, msg) {
var ret = true;
if ( a && b && a.length != undefined && a.length == b.length ) {
for ( var i = 0; i < a.length; i++ )
if ( a[i] != b[i] )
ret = false;
} else
ret = false;
if ( !ret )
_config.Test.push( [ ret, msg + " expected: " + serialArray(b) + " result: " + serialArray(a) ] );
else
_config.Test.push( [ ret, msg ] );
}
/**
* Asserts that two objects are equivalent
*/
function isObj(a, b, msg) {
var ret = true;
if ( a && b ) {
for ( var i in a )
if ( a[i] != b[i] )
ret = false;
for ( i in b )
if ( a[i] != b[i] )
ret = false;
} else
ret = false;
_config.Test.push( [ ret, msg ] );
}
function serialArray( a ) {
var r = [];
if ( a && a.length )
for ( var i = 0; i < a.length; i++ ) {
var str = a[i].nodeName;
if ( str ) {
str = str.toLowerCase();
if ( a[i].id )
str += "#" + a[i].id;
} else
str = a[i];
r.push( str );
}
return "[ " + r.join(", ") + " ]"
}
/**
* Returns an array of elements with the given IDs, eg.
* @example q("main", "foo", "bar")
* @result [<div id="main">, <span id="foo">, <input id="bar">]
*/
function q() {
var r = [];
for ( var i = 0; i < arguments.length; i++ )
r.push( document.getElementById( arguments[i] ) );
return r;
}
/**
* Asserts that a select matches the given IDs
* @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 = jQuery(b);
var s = "";
for ( var i = 0; i < f.length; i++ )
s += (s && ",") + '"' + f[i].id + '"';
isSet(f, q.apply(q,c), a + " (" + b + ")");
}
/**
* Add random number to url to stop IE from 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);
}
/**
* Checks that the first two arguments are equal, with an optional message.
* Prints out both expected and actual values on failure.
*
* Prefered to ok( expected == actual, message )
*
* @example equals( "Expected 2 characters.", v.formatMessage("Expected {0} characters.", 2) );
*
* @param Object expected
* @param Object actual
* @param String message (optional)
*/
function equals(actual, expected, message) {
var result = expected == actual;
message = message || (result ? "okay" : "failed");
_config.Test.push( [ result, result ? message + ": " + expected : message + " expected: " + expected + " actual: " + actual ] );
}
/**
* Trigger an event on an element.
*
* @example triggerEvent( document.body, "click" );
*
* @param DOMElement elem
* @param String type
*/
function triggerEvent( elem, type, event ) {
if ( jQuery.browser.mozilla || jQuery.browser.opera ) {
event = document.createEvent("MouseEvents");
event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
0, 0, 0, 0, 0, false, false, false, false, 0, null);
elem.dispatchEvent( event );
} else if ( jQuery.browser.msie ) {
elem.fireEvent("on"+type);
}
}

113
test/data/testsuite.css Normal file
View file

@ -0,0 +1,113 @@
body, div, h1 { font-family: 'trebuchet ms', verdana, arial; margin: 0; padding: 0 }
body {font-size: 10pt; }
h1 { padding: 15px; font-size: large; background-color: #06b; color: white; }
h2 { padding: 10px; background-color: #eee; color: black; margin: 0; font-size: small; font-weight: normal }
.pass { color: green; }
.fail { color: red; }
p.result { margin-left: 1em; }
#banner { height: 2em; border-bottom: 1px solid white; }
h2.pass { background-color: green; }
h2.fail { background-color: red; }
div#fx-tests h4 {
background: red;
}
div#fx-tests h4.pass {
background: green;
}
div#fx-tests div.box {
background: red url(data/cow.jpg) no-repeat;
overflow: hidden;
border: 2px solid #000;
}
div#fx-tests div.overflow {
overflow: visible;
}
div.inline {
display: inline;
}
div.autoheight {
height: auto;
}
div.autowidth {
width: auto;
}
div.autoopacity {
opacity: auto;
}
div.largewidth {
width: 100px;
}
div.largeheight {
height: 100px;
}
div.largeopacity {
filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
}
div.medwidth {
width: 50px;
}
div.medheight {
height: 50px;
}
div.medopacity {
opacity: 0.5;
filter: progid:DXImageTransform.Microsoft.Alpha(opacity=50);
}
div.nowidth {
width: 0px;
}
div.noheight {
height: 0px;
}
div.noopacity {
opacity: 0;
filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0);
}
div.hidden {
display: none;
}
div#fx-tests div.widewidth {
background-repeat: repeat-x;
}
div#fx-tests div.wideheight {
background-repeat: repeat-y;
}
div#fx-tests div.widewidth.wideheight {
background-repeat: repeat;
}
div#fx-tests div.noback {
background-image: none;
}
div.chain, div.chain div { width: 100px; height: 20px; position: relative; float: left; }
div.chain div { position: absolute; top: 0px; left: 0px; }
div.chain.test { background: red; }
div.chain.test div { background: green; }
div.chain.out { background: green; }
div.chain.out div { background: red; display: none; }

12
test/data/text.php Normal file
View file

@ -0,0 +1,12 @@
Lorem ipsum dolor sit amet
consectetuer adipiscing elit
Sed lorem leo
lorem leo consectetuer adipiscing elit
Sed lorem leo
rhoncus sit amet
elementum at
bibendum at, eros
Cras at mi et tortor egestas vestibulum
sed Cras at mi vestibulum
Phasellus sed felis sit amet
orci dapibus semper.

25
test/data/with_fries.xml Normal file
View file

@ -0,0 +1,25 @@
<?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">
<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>