QUnit.module( "core" ); QUnit.test( "jQuery.migrateVersion", function( assert ) { assert.expect( 1 ); assert.ok( /^\d+\.\d+\.[\w\-]+/.test( jQuery.migrateVersion ), "Version property" ); } ); QUnit.test( "compareVersions and jQueryVersionSince", function( assert ) { assert.expect( 9 ); assert.equal( compareVersions( "3.0.1", "3.0.0" ), 1, "greater than 1" ); assert.equal( compareVersions( "3.0.1", "2.10.0" ), 1, "greater than 2" ); assert.equal( compareVersions( "3.2.1", "3.3.0" ), -1, "less than 1" ); assert.equal( compareVersions( "3.2.1", "4.1.3" ), -1, "less than 2" ); assert.equal( compareVersions( "3.2.2", "3.11.1" ), -1, "less than 3"); assert.equal( compareVersions( "3.4.1", "3.4.1" ), 0, "equal" ); // Test against live jQuery version with suitably generous comparisons assert.equal( jQueryVersionSince( "1.4.2" ), true, "since - past version" ); assert.equal( jQueryVersionSince( "8.0.3" ), false, "since - future version" ); assert.equal( jQueryVersionSince( jQuery.fn.jquery ), true, "since - equal" ); } ); QUnit.test( "jQuery(html, props)", function( assert ) { assert.expect( 3 ); var $el = jQuery( "", { name: "name", val: "value", size: 42 } ); assert.equal( $el.attr( "name" ), "name", "Name attribute" ); assert.equal( $el.attr( "size" ), jQuery.isEmptyObject( jQuery.attrFn ) ? undefined : "42", "Size attribute" ); assert.equal( $el.val(), "value", "Call setter method" ); } ); QUnit.test( "jQuery( '#' )", function( assert ) { assert.expect( 2 ); expectWarning( assert, "Selector, through the jQuery constructor, nothing but hash", function() { var set = jQuery( "#" ); assert.equal( set.length, 0, "empty set" ); } ); } ); QUnit.test( "Attribute selectors with unquoted hashes", function( assert ) { assert.expect( 31 ); var markup = jQuery( "
" ).appendTo( "#qunit-fixture" ), // No warning, no need to fix okays = [ "a[href='#some-anchor']", "[data-id=\"#junk\"]", "div[data-selector='a[href=#main]']", "input[value~= '[strange*=#stuff]']" ], // Fixable, and gives warning fixables = [ "a[href=#]", "a[href*=#]:not([href=#]):first-child", ".space a[href=#]", "a[href=#some-anchor]", "link[rel*=#stuff]", "p[class *= #junk]", "a[href=space#junk]" ], // False positives that still work positives = [ "div[data-selector='a[href=#main]']:first", "input[value= '[strange*=#stuff]']:eq(0)" ], // Failures due to quotes and jQuery extensions combined failures = [ "p[class ^= #junk]:first", "a[href=space#junk]:eq(1)" ]; expectNoWarning( assert, "Perfectly cromulent selectors are unchanged", function() { okays.forEach( function( okay ) { assert.equal( jQuery( okay, markup ).length, 1, okay ); assert.equal( markup.find( okay ).length, 1, okay ); } ); } ); expectWarning( assert, "Values with unquoted hashes are quoted", fixables.length, function() { fixables.forEach( function( fixable ) { assert.equal( jQuery( fixable, markup ).length, 1, fixable ); assert.equal( markup.find( fixable ).length, 1, fixable ); } ); } ); expectWarning( assert, "False positives", positives.length, function() { positives.forEach( function( positive ) { assert.equal( jQuery( positive, markup ).length, 1, positive ); assert.equal( markup.find( positive ).length, 1, positive ); } ); } ); expectWarning( assert, "Unfixable cases", failures.length, function() { failures.forEach( function( failure ) { try { jQuery( failure, markup ); assert.ok( false, "Expected jQuery() to die!" ); } catch ( err1 ) { } try { markup.find( failure ); assert.ok( false, "Expected .find() to die!" ); } catch ( err2 ) { } } ); } ); // Ensure we don't process jQuery( x ) when x is a function expectNoWarning( assert, "ready function with attribute selector", function() { try { jQuery( function() { if ( jQuery.thisIsNeverTrue ) { jQuery( "a[href=#]" ); } } ); } catch ( e ) {} } ); } ); QUnit.test( "XSS injection (leading hash)", function( assert ) { assert.expect( 1 ); var threw = false; try { jQuery( "#yeahRIGHT
" ); } catch ( e ) { threw = true; } assert.equal( threw, true, "Throw on leading-hash HTML (treated as selector)" ); } ); QUnit.test( "XSS injection (XSS via script tag)", function( assert ) { assert.expect( 2 ); var threw = false; window.XSS = false; try { jQuery( "#