Reorganzing the jQuery source (first phase).
This commit is contained in:
parent
13b66c8ba9
commit
b4e23b5af0
29 changed files with 16 additions and 16 deletions
641
test/unit/ajaxTest.js
Normal file
641
test/unit/ajaxTest.js
Normal 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®ularThing=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
1065
test/unit/coreTest.js
Normal file
File diff suppressed because it is too large
Load diff
194
test/unit/eventTest.js
Normal file
194
test/unit/eventTest.js
Normal 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
307
test/unit/fxTest.js
Normal 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
202
test/unit/selectorTest.js
Normal 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, '<input name="length"> cannot be found under IE, see #945' );
|
||||
ok( $("#lengthtest input").length, '<input name="length"> 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"] );
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue