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

641
test/unit/ajaxTest.js Normal file
View file

@ -0,0 +1,641 @@
module("ajax");
// Safari 3 randomly crashes when running these tests,
// but only in the full suite - you can run just the Ajax
// tests and they'll pass
//if ( !jQuery.browser.safari ) {
test("$.ajax() - success callbacks", function() {
expect( 8 );
$.ajaxSetup({ timeout: 0 });
stop();
setTimeout(function(){
$('#foo').ajaxStart(function(){
ok( true, "ajaxStart" );
}).ajaxStop(function(){
ok( true, "ajaxStop" );
start();
}).ajaxSend(function(){
ok( true, "ajaxSend" );
}).ajaxComplete(function(){
ok( true, "ajaxComplete" );
}).ajaxError(function(){
ok( false, "ajaxError" );
}).ajaxSuccess(function(){
ok( true, "ajaxSuccess" );
});
$.ajax({
url: url("data/name.html"),
beforeSend: function(){ ok(true, "beforeSend"); },
success: function(){ ok(true, "success"); },
error: function(){ ok(false, "error"); },
complete: function(){ ok(true, "complete"); }
});
}, 13);
});
if ( !isLocal ) {
test("$.ajax() - error callbacks", function() {
expect( 8 );
stop();
$('#foo').ajaxStart(function(){
ok( true, "ajaxStart" );
}).ajaxStop(function(){
ok( true, "ajaxStop" );
start();
}).ajaxSend(function(){
ok( true, "ajaxSend" );
}).ajaxComplete(function(){
ok( true, "ajaxComplete" );
}).ajaxError(function(){
ok( true, "ajaxError" );
}).ajaxSuccess(function(){
ok( false, "ajaxSuccess" );
});
$.ajaxSetup({ timeout: 500 });
$.ajax({
url: url("data/name.php?wait=5"),
beforeSend: function(){ ok(true, "beforeSend"); },
success: function(){ ok(false, "success"); },
error: function(){ ok(true, "error"); },
complete: function(){ ok(true, "complete"); }
});
});
}
test("$.ajax() - disabled globals", function() {
expect( 3 );
stop();
$('#foo').ajaxStart(function(){
ok( false, "ajaxStart" );
}).ajaxStop(function(){
ok( false, "ajaxStop" );
}).ajaxSend(function(){
ok( false, "ajaxSend" );
}).ajaxComplete(function(){
ok( false, "ajaxComplete" );
}).ajaxError(function(){
ok( false, "ajaxError" );
}).ajaxSuccess(function(){
ok( false, "ajaxSuccess" );
});
$.ajax({
global: false,
url: url("data/name.html"),
beforeSend: function(){ ok(true, "beforeSend"); },
success: function(){ ok(true, "success"); },
error: function(){ ok(false, "error"); },
complete: function(){
ok(true, "complete");
setTimeout(function(){ start(); }, 13);
}
});
});
test("$.ajax - xml: non-namespace elements inside namespaced elements", function() {
expect(3);
stop();
$.ajax({
url: url("data/with_fries.xml"),
dataType: "xml",
success: function(resp) {
equals( $("properties", resp).length, 1, 'properties in responseXML' );
equals( $("jsconf", resp).length, 1, 'jsconf in responseXML' );
equals( $("thing", resp).length, 2, 'things in responseXML' );
start();
}
});
});
test("$.ajax - beforeSend", function() {
expect(1);
stop();
var check = false;
$.ajaxSetup({ timeout: 0 });
$.ajax({
url: url("data/name.html"),
beforeSend: function(xml) {
check = true;
},
success: function(data) {
ok( check, "check beforeSend was executed" );
start();
}
});
});
var foobar;
test("$.ajax - dataType html", function() {
expect(5);
stop();
foobar = null;
testFoo = undefined;
var verifyEvaluation = function() {
ok( testFoo == "foo", 'Check if script was evaluated for datatype html' );
ok( foobar == "bar", 'Check if script src was evaluated for datatype html' );
start();
};
$.ajax({
dataType: "html",
url: url("data/test.html"),
success: function(data) {
$("#ap").html(data);
ok( data.match(/^html text/), 'Check content for datatype html' );
setTimeout(verifyEvaluation, 600);
}
});
});
test("serialize()", function() {
expect(6);
equals( $('#form').serialize(),
"action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&select1=&select2=3&select3=0&select3=1",
'Check form serialization as query string');
equals( $('#form :input').serialize(),
"action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&select1=&select2=3&select3=0&select3=1",
'Check input serialization as query string');
equals( $('#testForm').serialize(),
'T3=%3F%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=',
'Check form serialization as query string');
equals( $('#testForm :input').serialize(),
'T3=%3F%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=',
'Check input serialization as query string');
equals( $('#form, #testForm').serialize(),
"action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&select1=&select2=3&select3=0&select3=1&T3=%3F%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=",
'Multiple form serialization as query string');
equals( $('#form, #testForm :input').serialize(),
"action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&select1=&select2=3&select3=0&select3=1&T3=%3F%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=",
'Mixed form/input serialization as query string');
});
test("$.param()", function() {
expect(4);
var params = {foo:"bar", baz:42, quux:"All your base are belong to us"};
equals( $.param(params), "foo=bar&baz=42&quux=All+your+base+are+belong+to+us", "simple" );
params = {someName: [1, 2, 3], regularThing: "blah" };
equals( $.param(params), "someName=1&someName=2&someName=3&regularThing=blah", "with array" );
params = {"foo[]":["baz", 42, "All your base are belong to us"]};
equals( $.param(params), "foo%5B%5D=baz&foo%5B%5D=42&foo%5B%5D=All+your+base+are+belong+to+us", "more array" );
params = {"foo[bar]":"baz", "foo[beep]":42, "foo[quux]":"All your base are belong to us"};
equals( $.param(params), "foo%5Bbar%5D=baz&foo%5Bbeep%5D=42&foo%5Bquux%5D=All+your+base+are+belong+to+us", "even more arrays" );
});
test("synchronous request", function() {
expect(1);
ok( /^{ "data"/.test( $.ajax({url: url("data/json_obj.js"), async: false}).responseText ), "check returned text" );
});
test("synchronous request with callbacks", function() {
expect(2);
var result;
$.ajax({url: url("data/json_obj.js"), async: false, success: function(data) { ok(true, "sucess callback executed"); result = data; } });
ok( /^{ "data"/.test( result ), "check returned text" );
});
test("pass-through request object", function() {
expect(1);
stop(true);
var target = "data/name.html";
var count = 0;
var success = function() {
// Disabled
//if(count++ == 5)
start();
};
/* Test disabled, too many simultaneous requests
ok( $.get(url(target), success), "get" );
ok( $.post(url(target), success), "post" );
ok( $.getScript(url("data/test.js"), success), "script" );
ok( $.getJSON(url("data/json_obj.js"), success), "json" );
*/
ok( $.ajax({url: url(target), success: success}), "generic" );
});
test("global ajaxSettings", function() {
expect(3);
var tmp = jQuery.extend({}, jQuery.ajaxSettings);
var orig = { url: "data/with_fries.xml", data: null };
var t;
$.ajaxSetup({ data: {foo: 'bar', bar: 'BAR'} });
t = jQuery.extend({}, orig);
$.ajax(t);
ok( t.url.indexOf('foo') > -1 && t.url.indexOf('bar') > -1, "Check extending null" );
t = jQuery.extend({}, orig);
t.data = {};
$.ajax(t);
ok( t.url.indexOf('foo') > -1 && t.url.indexOf('bar') > -1, "Check extending {}" );
t = jQuery.extend({}, orig);
t.data = { zoo: 'a', ping: 'b' };
$.ajax(t);
ok( t.url.indexOf('ping') > -1 && t.url.indexOf('zoo') > -1 && t.url.indexOf('foo') > -1 && t.url.indexOf('bar') > -1, "Check extending { zoo: 'a', ping: 'b' }" );
jQuery.ajaxSettings = tmp;
});
test("load(String)", function() {
expect(1);
stop(true); // check if load can be called with only url
$('#first').load("data/name.html", start);
});
test("load('url selector')", function() {
expect(1);
stop(true); // check if load can be called with only url
$('#first').load("data/test3.html div.user", function(){
equals( $(this).children("div").length, 2, "Verify that specific elements were injected" );
start();
});
});
test("load(String, Function) - simple: inject text into DOM", function() {
expect(2);
stop();
$('#first').load(url("data/name.html"), function() {
ok( /^ERROR/.test($('#first').text()), 'Check if content was injected into the DOM' );
start();
});
});
test("load(String, Function) - check scripts", function() {
expect(7);
stop();
window.testFoo = undefined;
window.foobar = null;
var verifyEvaluation = function() {
equals( foobar, "bar", 'Check if script src was evaluated after load' );
equals( $('#ap').html(), 'bar', 'Check if script evaluation has modified DOM');
start();
};
$('#first').load(url('data/test.html'), function() {
ok( $('#first').html().match(/^html text/), 'Check content after loading html' );
equals( $('#foo').html(), 'foo', 'Check if script evaluation has modified DOM');
equals( testFoo, "foo", 'Check if script was evaluated after load' );
setTimeout(verifyEvaluation, 600);
});
});
test("load(String, Function) - check file with only a script tag", function() {
expect(3);
stop();
testFoo = undefined;
$('#first').load(url('data/test2.html'), function() {
ok( $('#foo').html() == 'foo', 'Check if script evaluation has modified DOM');
ok( testFoo == "foo", 'Check if script was evaluated after load' );
start();
});
});
test("$.get(String, Hash, Function) - parse xml and use text() on nodes", function() {
expect(2);
stop();
$.get(url('data/dashboard.xml'), function(xml) {
var content = [];
$('tab', xml).each(function() {
content.push($(this).text());
});
equals( content[0], 'blabla', 'Check first tab');
equals( content[1], 'blublu', 'Check second tab');
start();
});
});
test("$.getScript(String, Function) - with callback", function() {
expect(2);
stop();
$.getScript(url("data/test.js"), function() {
equals( foobar, "bar", 'Check if script was evaluated' );
setTimeout(start, 100);
});
});
test("$.getScript(String, Function) - no callback", function() {
expect(1);
stop(true);
$.getScript(url("data/test.js"), start);
});
if ( !isLocal ) {
test("$.ajax() - JSONP, Local", function() {
expect(7);
var count = 0;
function plus(){ if ( ++count == 7 ) start(); }
stop();
$.ajax({
url: "data/jsonp.php",
dataType: "jsonp",
success: function(data){
ok( data.data, "JSON results returned (GET, no callback)" );
plus();
}
});
$.ajax({
url: "data/jsonp.php?callback=?",
dataType: "jsonp",
success: function(data){
ok( data.data, "JSON results returned (GET, url callback)" );
plus();
}
});
$.ajax({
url: "data/jsonp.php",
dataType: "jsonp",
data: "callback=?",
success: function(data){
ok( data.data, "JSON results returned (GET, data callback)" );
plus();
}
});
$.ajax({
url: "data/jsonp.php",
dataType: "jsonp",
data: { callback: "?" },
success: function(data){
ok( data.data, "JSON results returned (GET, data obj callback)" );
plus();
}
});
$.ajax({
type: "POST",
url: "data/jsonp.php",
dataType: "jsonp",
success: function(data){
ok( data.data, "JSON results returned (POST, no callback)" );
plus();
}
});
$.ajax({
type: "POST",
url: "data/jsonp.php",
data: "callback=?",
dataType: "jsonp",
success: function(data){
ok( data.data, "JSON results returned (POST, data callback)" );
plus();
}
});
$.ajax({
type: "POST",
url: "data/jsonp.php",
data: { callback: "?" },
dataType: "jsonp",
success: function(data){
ok( data.data, "JSON results returned (POST, data obj callback)" );
plus();
}
});
});
test("$.ajax() - JSONP, Remote", function() {
expect(4);
var count = 0;
function plus(){ if ( ++count == 4 ) start(); }
var base = window.location.href.replace(/\?.*$/, "");
stop();
$.ajax({
url: base + "data/jsonp.php",
dataType: "jsonp",
success: function(data){
ok( data.data, "JSON results returned (GET, no callback)" );
plus();
}
});
$.ajax({
url: base + "data/jsonp.php?callback=?",
dataType: "jsonp",
success: function(data){
ok( data.data, "JSON results returned (GET, url callback)" );
plus();
}
});
$.ajax({
url: base + "data/jsonp.php",
dataType: "jsonp",
data: "callback=?",
success: function(data){
ok( data.data, "JSON results returned (GET, data callback)" );
plus();
}
});
$.ajax({
url: base + "data/jsonp.php",
dataType: "jsonp",
data: { callback: "?" },
success: function(data){
ok( data.data, "JSON results returned (GET, data obj callback)" );
plus();
}
});
});
test("$.ajax() - script, Remote", function() {
expect(2);
var base = window.location.href.replace(/\?.*$/, "");
stop();
$.ajax({
url: base + "data/test.js",
dataType: "script",
success: function(data){
ok( foobar, "Script results returned (GET, no callback)" );
start();
}
});
});
test("$.getJSON(String, Hash, Function) - JSON array", function() {
expect(4);
stop();
$.getJSON(url("data/json.php"), {json: "array"}, function(json) {
ok( json[0].name == 'John', 'Check JSON: first, name' );
ok( json[0].age == 21, 'Check JSON: first, age' );
ok( json[1].name == 'Peter', 'Check JSON: second, name' );
ok( json[1].age == 25, 'Check JSON: second, age' );
start();
});
});
test("$.getJSON(String, Function) - JSON object", function() {
expect(2);
stop();
$.getJSON(url("data/json.php"), function(json) {
ok( json.data.lang == 'en', 'Check JSON: lang' );
ok( json.data.length == 25, 'Check JSON: length' );
start();
});
});
test("$.post(String, Hash, Function) - simple with xml", function() {
expect(2);
stop();
$.post(url("data/name.php"), {xml: "5-2"}, function(xml){
$('math', xml).each(function() {
ok( $('calculation', this).text() == '5-2', 'Check for XML' );
ok( $('result', this).text() == '3', 'Check for XML' );
});
start();
});
});
test("$.ajaxSetup({timeout: Number}) - with global timeout", function() {
stop();
var passed = 0;
$.ajaxSetup({timeout: 1000});
var pass = function() {
passed++;
if ( passed == 2 ) {
ok( true, 'Check local and global callbacks after timeout' );
$('#main').unbind("ajaxError");
start();
}
};
var fail = function(a,b,c) {
ok( false, 'Check for timeout failed ' + a + ' ' + b );
start();
};
$('#main').ajaxError(pass);
$.ajax({
type: "GET",
url: url("data/name.php?wait=5"),
error: pass,
success: fail
});
// reset timeout
$.ajaxSetup({timeout: 0});
});
test("$.ajaxSetup({timeout: Number}) with localtimeout", function() {
stop();
$.ajaxSetup({timeout: 50});
$.ajax({
type: "GET",
timeout: 5000,
url: url("data/name.php?wait=1"),
error: function() {
ok( false, 'Check for local timeout failed' );
start();
},
success: function() {
ok( true, 'Check for local timeout' );
start();
}
});
// reset timeout
$.ajaxSetup({timeout: 0});
});
test("$.ajax - simple get", function() {
expect(1);
stop();
$.ajax({
type: "GET",
url: url("data/name.php?name=foo"),
success: function(msg){
ok( msg == 'bar', 'Check for GET' );
start();
}
});
});
test("$.ajax - simple post", function() {
expect(1);
stop();
$.ajax({
type: "POST",
url: url("data/name.php"),
data: "name=peter",
success: function(msg){
ok( msg == 'pan', 'Check for POST' );
start();
}
});
});
test("ajaxSetup()", function() {
expect(1);
stop();
$.ajaxSetup({
url: url("data/name.php?name=foo"),
success: function(msg){
ok( msg == 'bar', 'Check for GET' );
start();
}
});
$.ajax();
});
test("custom timeout does not set error message when timeout occurs, see #970", function() {
stop();
$.ajax({
url: "data/name.php?wait=10",
timeout: 500,
error: function(request, status) {
ok( status != null, "status shouldn't be null in error handler" );
equals( "timeout", status );
start();
}
});
});
}
//}

1065
test/unit/coreTest.js Normal file

File diff suppressed because it is too large Load diff

194
test/unit/eventTest.js Normal file
View file

@ -0,0 +1,194 @@
module("event");
test("bind()", function() {
expect(15);
var handler = function(event) {
ok( event.data, "bind() with data, check passed data exists" );
ok( event.data.foo == "bar", "bind() with data, Check value of passed data" );
};
$("#firstp").bind("click", {foo: "bar"}, handler).click().unbind("click", handler);
ok( !$("#firstp").get(0).$events, "Event handler unbound when using data." );
reset();
var handler = function(event, data) {
ok( event.data, "check passed data exists" );
ok( event.data.foo == "bar", "Check value of passed data" );
ok( data, "Check trigger data" );
ok( data.bar == "foo", "Check value of trigger data" );
};
$("#firstp").bind("click", {foo: "bar"}, handler).trigger("click", [{bar: "foo"}]).unbind(handler);
reset();
var handler = function(event) {
ok ( !event.data, "Check that no data is added to the event object" );
};
$("#firstp").bind("click", handler).trigger("click");
// events don't work with iframes, see #939 - this test fails in IE because of contentDocument
// var doc = document.getElementById("iframe").contentDocument;
//
// doc.body.innerHTML = "<input type='text'/>";
//
// var input = doc.getElementsByTagName("input")[0];
//
// $(input).bind("click",function() {
// ok( true, "Binding to element inside iframe" );
// }).click();
var counter = 0;
function selectOnChange(event) {
equals( event.data, counter++, "Event.data is not a global event object" );
};
$("#form select").each(function(i){
$(this).bind('change', i, selectOnChange);
}).trigger('change');
reset();
$("#firstp").bind("click",function(e){
ok(true, "Normal click triggered");
});
$("#firstp").bind("click.test",function(e){
ok(true, "Namespaced click triggered");
});
// Trigger both bound fn (2)
$("#firstp").trigger("click");
// Trigger one bound fn (1)
$("#firstp").trigger("click.test");
// Remove only the one fn
$("#firstp").unbind("click.test");
// Trigger the remaining fn (1)
$("#firstp").trigger("click");
});
test("click()", function() {
expect(4);
$('<li><a href="#">Change location</a></li>').prependTo('#firstUL').find('a').bind('click', function() {
var close = $('spanx', this); // same with $(this).find('span');
ok( close.length == 0, "Context element does not exist, length must be zero" );
ok( !close[0], "Context element does not exist, direct access to element must return undefined" );
return false;
}).click();
$("#check1").click(function() {
ok( true, "click event handler for checkbox gets fired twice, see #815" );
}).click();
var counter = 0;
$('#firstp')[0].onclick = function(event) {
counter++;
};
$('#firstp').click();
ok( counter == 1, "Check that click, triggers onclick event handler also" );
});
test("unbind(event)", function() {
expect(6);
var el = $("#firstp");
el.click(function() {
ok( true, "Fake normal bind" );
});
el.click(function(event) {
el.unbind(event);
ok( true, "Fake onebind" );
});
el.click().click();
el.click(function() { return; });
el.unbind('click');
ok( !el[0].onclick, "Handler is removed" ); // Bug #964
el.click(function() { return; });
el.unbind('change',function(){ return; });
for (var ret in el[0].$events['click']) break;
ok( ret, "Extra handlers weren't accidentally removed." );
el.unbind('click');
ok( !el[0].$events, "Removed the events expando after all handlers are unbound." );
});
test("trigger(event, [data], [fn])", function() {
expect(40);
var handler = function(event, a, b, c) {
equals( event.type, "click", "check passed data" );
equals( a, 1, "check passed data" );
equals( b, "2", "check passed data" );
equals( c, "abc", "check passed data" );
return "test";
};
var handler2 = function(a, b, c) {
equals( a, 1, "check passed data" );
equals( b, "2", "check passed data" );
equals( c, "abc", "check passed data" );
return "test2";
};
// Simulate a "native" click
$("#firstp")[0].click = function(){
ok( true, "Native call was triggered" );
};
// Triggers handlrs and native
// Trigger 5
$("#firstp").bind("click", handler).trigger("click", [1, "2", "abc"]);
// Triggers handlers, native, and extra fn
// Triggers 8
$("#firstp").trigger("click", [1, "2", "abc"], handler2);
// Simulate a "native" click
$("#firstp")[0].click = function(){
ok( false, "Native call was triggered" );
};
// Trigger only the handlers (no native)
// Triggers 5
equals( $("#firstp").triggerHandler("click", [1, "2", "abc"]), "test", "Verify handler response" );
// Trigger only the handlers (no native) and extra fn
// Triggers 8
equals( $("#firstp").triggerHandler("click", [1, "2", "abc"], handler2), "test", "Verify handler response" );
// Build fake click event to pass in
var eventObj = jQuery.event.fix({ type: "click", target: document.body });
// Trigger only the handlers (no native), with external event obj
// Triggers 5
equals( $("#firstp").triggerHandler("foo", [eventObj, 1, "2", "abc"]), "test", "Verify handler response" );
// Trigger only the handlers (no native) and extra fn, with external event obj
// Triggers 9
equals( $("#firstp").triggerHandler("foo", [eventObj, 1, "2", "abc"], handler), "test", "Verify handler response" );
});
test("toggle(Function, Function)", function() {
expect(4);
var count = 0,
fn1 = function(e) { count++; },
fn2 = function(e) { count--; },
preventDefault = function(e) { e.preventDefault() },
link = $('#mark');
link.click(preventDefault).click().toggle(fn1, fn2).click().click().click().click().click();
ok( count == 1, "Check for toggle(fn, fn)" );
var first = 0;
$("#simon1").one("click", function() {
ok( true, "Execute event only once" );
$(this).toggle(function() {
ok( first++ == 0, "toggle(Function,Function) assigned from within one('xxx'), see #1054" );
}, function() {
ok( first == 1, "toggle(Function,Function) assigned from within one('xxx'), see #1054" );
});
return false;
}).click().click().click();
});

307
test/unit/fxTest.js Normal file
View file

@ -0,0 +1,307 @@
module("fx");
test("animate(Hash, Object, Function)", function() {
expect(1);
stop();
var hash = {opacity: 'show'};
var hashCopy = $.extend({}, hash);
$('#foo').animate(hash, 0, function() {
ok( hash.opacity == hashCopy.opacity, 'Check if animate changed the hash parameter' );
start();
});
});
test("stop()", function() {
expect(3);
stop();
reset();
var foo = $("#foo")[0];
var h = foo.style.height;
$("#foo").slideUp(1000);
setTimeout(function(){
var nh = foo.style.height;
ok( nh != h, "An animation occurred " + nh + " " + h );
$("#foo").stop();
nh = foo.style.height;
ok( nh != h, "Stop didn't reset the animation " + nh + " " + h );
setTimeout(function(){
equals( nh, foo.style.height, "The animation didn't continue" );
start();
}, 100);
}, 100);
});
test("toggle()", function() {
expect(3);
var x = $("#foo");
ok( x.is(":visible") );
x.toggle();
ok( x.is(":hidden") );
x.toggle();
ok( x.is(":visible") );
});
var visible = {
Normal: function(elem){},
"CSS Hidden": function(elem){
$(this).addClass("hidden");
},
"JS Hidden": function(elem){
$(this).hide();
}
};
var from = {
"CSS Auto": function(elem,prop){
$(elem).addClass("auto" + prop)
.text("This is a long string of text.");
return "";
},
"JS Auto": function(elem,prop){
$(elem).css(prop,"auto")
.text("This is a long string of text.");
return "";
},
"CSS 100": function(elem,prop){
$(elem).addClass("large" + prop);
return "";
},
"JS 100": function(elem,prop){
$(elem).css(prop,prop == "opacity" ? 1 : "100px");
return prop == "opacity" ? 1 : 100;
},
"CSS 50": function(elem,prop){
$(elem).addClass("med" + prop);
return "";
},
"JS 50": function(elem,prop){
$(elem).css(prop,prop == "opacity" ? 0.50 : "50px");
return prop == "opacity" ? 0.5 : 50;
},
"CSS 0": function(elem,prop){
$(elem).addClass("no" + prop);
return "";
},
"JS 0": function(elem,prop){
$(elem).css(prop,prop == "opacity" ? 0 : "0px");
return 0;
}
};
var to = {
"show": function(elem,prop){
$(elem).hide().addClass("wide"+prop);
return "show";
},
"hide": function(elem,prop){
$(elem).addClass("wide"+prop);
return "hide";
},
"100": function(elem,prop){
$(elem).addClass("wide"+prop);
return prop == "opacity" ? 1 : 100;
},
"50": function(elem,prop){
return prop == "opacity" ? 0.50 : 50;
},
"0": function(elem,prop){
$(elem).addClass("noback");
return 0;
}
};
function checkOverflowDisplay(){
var o = jQuery.css( this, "overflow" );
ok(o == "visible", "Overflow should be visible: " + o);
ok(jQuery.css( this, "display" ) == "inline", "Display shouldn't be tampered with.");
start();
}
test("JS Overflow and Display", function() {
expect(2);
stop();
makeTest( "JS Overflow and Display" )
.addClass("widewidth")
.css({ overflow: "visible", display: "inline" })
.addClass("widewidth")
.text("Some sample text.")
.before("text before")
.after("text after")
.animate({ opacity: 0.5 }, "slow", checkOverflowDisplay);
});
test("CSS Overflow and Display", function() {
expect(2);
stop();
makeTest( "CSS Overflow and Display" )
.addClass("overflow inline")
.addClass("widewidth")
.text("Some sample text.")
.before("text before")
.after("text after")
.animate({ opacity: 0.5 }, "slow", checkOverflowDisplay);
});
jQuery.each( from, function(fn, f){
jQuery.each( to, function(tn, t){
test(fn + " to " + tn, function() {
var elem = makeTest( fn + " to " + tn );
var t_w = t( elem, "width" );
var f_w = f( elem, "width" );
var t_h = t( elem, "height" );
var f_h = f( elem, "height" );
var t_o = t( elem, "opacity" );
var f_o = f( elem, "opacity" );
var num = 0;
if ( t_h == "show" ) num++;
if ( t_w == "show" ) num++;
if ( t_w == "hide"||t_w == "show" ) num++;
if ( t_h == "hide"||t_h == "show" ) num++;
if ( t_o == "hide"||t_o == "show" ) num++;
if ( t_w == "hide" ) num++;
if ( t_o.constructor == Number ) num += 2;
if ( t_w.constructor == Number ) num += 2;
if ( t_h.constructor == Number ) num +=2;
expect(num);
stop();
var anim = { width: t_w, height: t_h, opacity: t_o };
elem.animate(anim, 50, function(){
if ( t_w == "show" )
ok( this.style.display == "block", "Showing, display should block: " + this.style.display);
if ( t_w == "hide"||t_w == "show" )
ok(this.style.width.indexOf(f_w) == 0, "Width must be reset to " + f_w + ": " + this.style.width);
if ( t_h == "hide"||t_h == "show" )
ok(this.style.height.indexOf(f_h) == 0, "Height must be reset to " + f_h + ": " + this.style.height);
var cur_o = jQuery.attr(this.style, "opacity");
if ( cur_o !== "" ) cur_o = parseFloat( cur_o );
if ( t_o == "hide"||t_o == "show" )
ok(cur_o == f_o, "Opacity must be reset to " + f_o + ": " + cur_o);
if ( t_w == "hide" )
ok(this.style.display == "none", "Hiding, display should be none: " + this.style.display);
if ( t_o.constructor == Number ) {
ok(cur_o == t_o, "Final opacity should be " + t_o + ": " + cur_o);
ok(jQuery.curCSS(this, "opacity") != "" || cur_o == t_o, "Opacity should be explicitly set to " + t_o + ", is instead: " + cur_o);
}
if ( t_w.constructor == Number ) {
ok(this.style.width == t_w + "px", "Final width should be " + t_w + ": " + this.style.width);
var cur_w = jQuery.css(this,"width");
ok(this.style.width != "" || cur_w == t_w, "Width should be explicitly set to " + t_w + ", is instead: " + cur_w);
}
if ( t_h.constructor == Number ) {
ok(this.style.height == t_h + "px", "Final height should be " + t_h + ": " + this.style.height);
var cur_h = jQuery.css(this,"height");
ok(this.style.height != "" || cur_h == t_h, "Height should be explicitly set to " + t_h + ", is instead: " + cur_w);
}
if ( t_h == "show" ) {
var old_h = jQuery.curCSS(this, "height");
$(elem).append("<br/>Some more text<br/>and some more...");
ok(old_h != jQuery.css(this, "height" ), "Make sure height is auto.");
}
start();
});
});
});
});
var check = ['opacity','height','width','display','overflow'];
jQuery.fn.saveState = function(){
expect(check.length);
stop();
return this.each(function(){
var self = this;
self.save = {};
jQuery.each(check, function(i,c){
self.save[c] = jQuery.css(self,c);
});
});
};
function checkState(){
var self = this;
jQuery.each(this.save, function(c,v){
var cur = jQuery.css(self,c);
ok( v == cur, "Make sure that " + c + " is reset (Old: " + v + " Cur: " + cur + ")");
});
start();
}
// Chaining Tests
test("Chain fadeOut fadeIn", function() {
$('#fadein div').saveState().fadeOut('fast').fadeIn('fast',checkState);
});
test("Chain fadeIn fadeOut", function() {
$('#fadeout div').saveState().fadeIn('fast').fadeOut('fast',checkState);
});
test("Chain hide show", function() {
$('#show div').saveState().hide('fast').show('fast',checkState);
});
test("Chain show hide", function() {
$('#hide div').saveState().show('fast').hide('fast',checkState);
});
test("Chain toggle in", function() {
$('#togglein div').saveState().toggle('fast').toggle('fast',checkState);
});
test("Chain toggle out", function() {
$('#toggleout div').saveState().toggle('fast').toggle('fast',checkState);
});
test("Chain slideDown slideUp", function() {
$('#slidedown div').saveState().slideDown('fast').slideUp('fast',checkState);
});
test("Chain slideUp slideDown", function() {
$('#slideup div').saveState().slideUp('fast').slideDown('fast',checkState);
});
test("Chain slideToggle in", function() {
$('#slidetogglein div').saveState().slideToggle('fast').slideToggle('fast',checkState);
});
test("Chain slideToggle out", function() {
$('#slidetoggleout div').saveState().slideToggle('fast').slideToggle('fast',checkState);
});
function makeTest( text ){
var elem = $("<div></div>")
.attr("id", "test" + makeTest.id++)
.addClass("box");
$("<h4></h4>")
.text( text )
.appendTo("#fx-tests")
.click(function(){
$(this).next().toggle();
})
.after( elem );
return elem;
}
makeTest.id = 1;

202
test/unit/selectorTest.js Normal file
View file

@ -0,0 +1,202 @@
module("selector");
test("element", function() {
expect(9);
ok( $("*").size() >= 30, "Select all" );
var all = $("*"), good = true;
for ( var i = 0; i < all.length; i++ )
if ( all[i].nodeType == 8 )
good = false;
ok( good, "Select all elements, no comment nodes" );
t( "Element Selector", "p", ["firstp","ap","sndp","en","sap","first"] );
t( "Element Selector", "body", ["body"] );
t( "Element Selector", "html", ["html"] );
t( "Parent Element", "div p", ["firstp","ap","sndp","en","sap","first"] );
ok( $("param", "#object1").length == 2, "Object/param as context" );
ok( $("#length").length, '&lt;input name="length"&gt; cannot be found under IE, see #945' );
ok( $("#lengthtest input").length, '&lt;input name="length"&gt; cannot be found under IE, see #945' );
});
if ( location.protocol != "file:" ) {
test("Element Selector with underscore", function() {
expect(1);
stop();
$.get("data/with_fries.xml", function(xml) {
ok( $("foo_bar", xml).length == 1, "Element Selector with underscore" );
start();
});
});
}
test("broken", function() {
expect(7);
t( "Broken Selector", "[", [] );
t( "Broken Selector", "(", [] );
t( "Broken Selector", "{", [] );
t( "Broken Selector", "<", [] );
t( "Broken Selector", "()", [] );
t( "Broken Selector", "<>", [] );
t( "Broken Selector", "{}", [] );
});
test("id", function() {
expect(25);
t( "ID Selector", "#body", ["body"] );
t( "ID Selector w/ Element", "body#body", ["body"] );
t( "ID Selector w/ Element", "ul#first", [] );
t( "ID selector with existing ID descendant", "#firstp #simon1", ["simon1"] );
t( "ID selector with non-existant descendant", "#firstp #foobar", [] );
t( "ID selector using UTF8", "#台北Táiběi", ["台北Táiběi"] );
t( "Multiple ID selectors using UTF8", "#台北Táiběi, #台北", ["台北Táiběi","台北"] );
t( "Descendant ID selector using UTF8", "div #台北", ["台北"] );
t( "Child ID selector using UTF8", "form > #台北", ["台北"] );
t( "Escaped ID", "#foo\\:bar", ["foo:bar"] );
t( "Escaped ID", "#test\\.foo\\[5\\]bar", ["test.foo[5]bar"] );
t( "Descendant escaped ID", "div #foo\\:bar", ["foo:bar"] );
t( "Descendant escaped ID", "div #test\\.foo\\[5\\]bar", ["test.foo[5]bar"] );
t( "Child escaped ID", "form > #foo\\:bar", ["foo:bar"] );
t( "Child escaped ID", "form > #test\\.foo\\[5\\]bar", ["test.foo[5]bar"] );
t( "ID Selector, child ID present", "#form > #radio1", ["radio1"] ); // bug #267
t( "ID Selector, not an ancestor ID", "#form #first", [] );
t( "ID Selector, not a child ID", "#form > #option1a", [] );
t( "All Children of ID", "#foo > *", ["sndp", "en", "sap"] );
t( "All Children of ID with no children", "#firstUL/*", [] );
$('<a name="tName1">tName1 A</a><a name="tName2">tName2 A</a><div id="tName1">tName1 Div</div>').appendTo('#main');
ok( $("#tName1")[0].id == 'tName1', "ID selector with same value for a name attribute" );
ok( $("#tName2").length == 0, "ID selector non-existing but name attribute on an A tag" );
t( "ID Selector on Form with an input that has a name of 'id'", "#lengthtest", ["lengthtest"] );
t( "ID selector with non-existant ancestor", "#asdfasdf #foobar", [] ); // bug #986
isSet( $("body").find("div#form"), [], "ID selector within the context of another element" );
});
test("class", function() {
expect(16);
t( "Class Selector", ".blog", ["mark","simon"] );
t( "Class Selector", ".blog.link", ["simon"] );
t( "Class Selector w/ Element", "a.blog", ["mark","simon"] );
t( "Parent Class Selector", "p .blog", ["mark","simon"] );
t( "Class selector using UTF8", ".台北Táiběi", ["utf8class1"] );
t( "Class selector using UTF8", ".台北", ["utf8class1","utf8class2"] );
t( "Class selector using UTF8", ".台北Táiběi.台北", ["utf8class1"] );
t( "Class selector using UTF8", ".台北Táiběi, .台北", ["utf8class1","utf8class2"] );
t( "Descendant class selector using UTF8", "div .台北Táiběi", ["utf8class1"] );
t( "Child class selector using UTF8", "form > .台北Táiběi", ["utf8class1"] );
t( "Escaped Class", ".foo\\:bar", ["foo:bar"] );
t( "Escaped Class", ".test\\.foo\\[5\\]bar", ["test.foo[5]bar"] );
t( "Descendant scaped Class", "div .foo\\:bar", ["foo:bar"] );
t( "Descendant scaped Class", "div .test\\.foo\\[5\\]bar", ["test.foo[5]bar"] );
t( "Child escaped Class", "form > .foo\\:bar", ["foo:bar"] );
t( "Child escaped Class", "form > .test\\.foo\\[5\\]bar", ["test.foo[5]bar"] );
});
test("multiple", function() {
expect(4);
t( "Comma Support", "a.blog, p", ["mark","simon","firstp","ap","sndp","en","sap","first"] );
t( "Comma Support", "a.blog , p", ["mark","simon","firstp","ap","sndp","en","sap","first"] );
t( "Comma Support", "a.blog ,p", ["mark","simon","firstp","ap","sndp","en","sap","first"] );
t( "Comma Support", "a.blog,p", ["mark","simon","firstp","ap","sndp","en","sap","first"] );
});
test("child and adjacent", function() {
expect(19);
t( "Child", "p > a", ["simon1","google","groups","mark","yahoo","simon"] );
t( "Child", "p> a", ["simon1","google","groups","mark","yahoo","simon"] );
t( "Child", "p >a", ["simon1","google","groups","mark","yahoo","simon"] );
t( "Child", "p>a", ["simon1","google","groups","mark","yahoo","simon"] );
t( "Child w/ Class", "p > a.blog", ["mark","simon"] );
t( "All Children", "code > *", ["anchor1","anchor2"] );
t( "All Grandchildren", "p > * > *", ["anchor1","anchor2"] );
t( "Adjacent", "a + a", ["groups"] );
t( "Adjacent", "a +a", ["groups"] );
t( "Adjacent", "a+ a", ["groups"] );
t( "Adjacent", "a+a", ["groups"] );
t( "Adjacent", "p + p", ["ap","en","sap"] );
t( "Comma, Child, and Adjacent", "a + a, code > a", ["groups","anchor1","anchor2"] );
t( "First Child", "p:first-child", ["firstp","sndp"] );
t( "Nth Child", "p:nth-child(1)", ["firstp","sndp"] );
t( "Last Child", "p:last-child", ["sap"] );
t( "Last Child", "a:last-child", ["simon1","anchor1","mark","yahoo","anchor2","simon"] );
t( "Nth-child", "#main form#form > *:nth-child(2)", ["text2"] );
t( "Nth-child", "#main form#form > :nth-child(2)", ["text2"] );
});
test("attributes", function() {
expect(20);
t( "Attribute Exists", "a[title]", ["google"] );
t( "Attribute Exists", "*[title]", ["google"] );
t( "Attribute Exists", "[title]", ["google"] );
t( "Attribute Equals", "a[rel='bookmark']", ["simon1"] );
t( "Attribute Equals", 'a[rel="bookmark"]', ["simon1"] );
t( "Attribute Equals", "a[rel=bookmark]", ["simon1"] );
t( "Multiple Attribute Equals", "#form input[type='hidden'],#form input[type='radio']", ["hidden1","radio1","radio2"] );
t( "Multiple Attribute Equals", "#form input[type=\"hidden\"],#form input[type='radio']", ["hidden1","radio1","radio2"] );
t( "Multiple Attribute Equals", "#form input[type=hidden],#form input[type=radio]", ["hidden1","radio1","radio2"] );
t( "Attribute selector using UTF8", "span[lang=中文]", ["台北"] );
t( "Attribute Begins With", "a[href ^= 'http://www']", ["google","yahoo"] );
t( "Attribute Ends With", "a[href $= 'org/']", ["mark"] );
t( "Attribute Contains", "a[href *= 'google']", ["google","groups"] );
t("Select options via [selected]", "#select1 option[selected]", ["option1a"] );
t("Select options via [selected]", "#select2 option[selected]", ["option2d"] );
t("Select options via [selected]", "#select3 option[selected]", ["option3b", "option3c"] );
t( "Grouped Form Elements", "input[name='foo[bar]']", ["hidden2"] );
t( ":not() Existing attribute", "#form select:not([multiple])", ["select1", "select2"]);
t( ":not() Equals attribute", "#form select:not([name=select1])", ["select2", "select3"]);
t( ":not() Equals quoted attribute", "#form select:not([name='select1'])", ["select2", "select3"]);
});
test("pseudo (:) selectors", function() {
expect(32);
t( "First Child", "p:first-child", ["firstp","sndp"] );
t( "Last Child", "p:last-child", ["sap"] );
t( "Only Child", "a:only-child", ["simon1","anchor1","yahoo","anchor2"] );
t( "Empty", "ul:empty", ["firstUL"] );
t( "Enabled UI Element", "#form input:enabled", ["text1","radio1","radio2","check1","check2","hidden1","hidden2","name"] );
t( "Disabled UI Element", "#form input:disabled", ["text2"] );
t( "Checked UI Element", "#form input:checked", ["radio2","check1"] );
t( "Selected Option Element", "#form option:selected", ["option1a","option2d","option3b","option3c"] );
t( "Text Contains", "a:contains('Google')", ["google","groups"] );
t( "Text Contains", "a:contains('Google Groups')", ["groups"] );
t( "Element Preceded By", "p ~ div", ["foo","fx-queue","fx-tests"] );
t( "Not", "a.blog:not(.link)", ["mark"] );
t( "nth Element", "p:nth(1)", ["ap"] );
t( "First Element", "p:first", ["firstp"] );
t( "Last Element", "p:last", ["first"] );
t( "Even Elements", "p:even", ["firstp","sndp","sap"] );
t( "Odd Elements", "p:odd", ["ap","en","first"] );
t( "Position Equals", "p:eq(1)", ["ap"] );
t( "Position Greater Than", "p:gt(0)", ["ap","sndp","en","sap","first"] );
t( "Position Less Than", "p:lt(3)", ["firstp","ap","sndp"] );
t( "Is A Parent", "p:parent", ["firstp","ap","sndp","en","sap","first"] );
t( "Is Visible", "#form input:visible", ["text1","text2","radio1","radio2","check1","check2","name"] );
t( "Is Hidden", "#form input:hidden", ["hidden1","hidden2"] );
t( "Form element :input", "#form :input", ["text1", "text2", "radio1", "radio2", "check1", "check2", "hidden1", "hidden2", "name", "button", "area1", "select1", "select2", "select3"] );
t( "Form element :radio", "#form :radio", ["radio1", "radio2"] );
t( "Form element :checkbox", "#form :checkbox", ["check1", "check2"] );
t( "Form element :text", "#form :text", ["text1", "text2", "hidden2", "name"] );
t( "Form element :radio:checked", "#form :radio:checked", ["radio2"] );
t( "Form element :checkbox:checked", "#form :checkbox:checked", ["check1"] );
t( "Form element :checkbox:checked, :radio:checked", "#form :checkbox:checked, #form :radio:checked", ["check1", "radio2"] );
t( "Headers", ":header", ["header", "banner", "userAgent"] );
t( "Has Children - :has()", "p:has(a)", ["firstp","ap","en","sap"] );
});