jquery-ui/tests/unit/widget/core.js

1682 lines
47 KiB
JavaScript
Raw Normal View History

define( [
2016-04-06 14:06:47 +00:00
"qunit",
"jquery",
"lib/common",
"lib/helper",
"ui/widget"
], function( QUnit, $, common, helper ) {
"use strict";
2016-04-06 14:06:47 +00:00
QUnit.module( "widget factory", {
afterEach: function() {
2012-04-30 00:22:31 +00:00
if ( $.ui ) {
delete $.ui.testWidget;
delete $.fn.testWidget;
2012-04-30 00:22:31 +00:00
}
return helper.moduleAfterEach.apply( this, arguments );
}
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "widget creation", function( assert ) {
assert.expect( 5 );
var method,
myPrototype = {
_create: function() {
2016-04-06 14:06:47 +00:00
assert.equal( method, "_create", "create function is copied over" );
},
creationTest: function() {
2016-04-06 14:06:47 +00:00
assert.equal( method, "creationTest", "random function is copied over" );
}
};
2010-08-26 14:59:51 +00:00
$.widget( "ui.testWidget", myPrototype );
assert.ok( typeof $.ui.testWidget === "function", "constructor was created" );
2016-04-06 14:06:47 +00:00
assert.equal( typeof $.ui.testWidget.prototype, "object", "prototype was created" );
method = "_create";
$.ui.testWidget.prototype._create();
method = "creationTest";
$.ui.testWidget.prototype.creationTest();
2016-04-06 14:06:47 +00:00
assert.equal( $.ui.testWidget.prototype.option, $.Widget.prototype.option,
2010-08-26 14:59:51 +00:00
"option method copied over from base widget" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "element normalization", function( assert ) {
assert.expect( 11 );
var elem;
$.widget( "ui.testWidget", {} );
$.ui.testWidget.prototype._create = function() {
2015-08-24 13:32:13 +00:00
2016-04-06 14:06:47 +00:00
// Workaround for core ticket #8381
this.element.appendTo( "#qunit-fixture" );
2016-04-06 14:06:47 +00:00
assert.ok( this.element.is( "div" ), "generated div" );
assert.deepEqual( this.element.testWidget( "instance" ), this, "instance stored in .data()" );
};
$.ui.testWidget();
$.ui.testWidget.prototype.defaultElement = "<span data-test='pass'></span>";
$.ui.testWidget.prototype._create = function() {
2016-04-06 14:06:47 +00:00
assert.ok( this.element.is( "span[data-test=pass]" ), "generated span with properties" );
assert.deepEqual( this.element.testWidget( "instance" ), this, "instance stored in .data()" );
};
$.ui.testWidget();
elem = $( "<input>" );
$.ui.testWidget.prototype._create = function() {
2016-04-06 14:06:47 +00:00
assert.deepEqual( this.element[ 0 ], elem[ 0 ], "from element" );
assert.deepEqual( elem.testWidget( "instance" ), this, "instance stored in .data()" );
};
$.ui.testWidget( {}, elem[ 0 ] );
elem = $( "<div>" );
$.ui.testWidget.prototype._create = function() {
2016-04-06 14:06:47 +00:00
assert.deepEqual( this.element[ 0 ], elem[ 0 ], "from jQuery object" );
assert.deepEqual( elem.testWidget( "instance" ), this, "instance stored in .data()" );
};
$.ui.testWidget( {}, elem );
elem = $( "<div id='element-normalization-selector'></div>" )
.appendTo( "#qunit-fixture" );
$.ui.testWidget.prototype._create = function() {
2016-04-06 14:06:47 +00:00
assert.deepEqual( this.element[ 0 ], elem[ 0 ], "from selector" );
assert.deepEqual( elem.testWidget( "instance" ), this, "instance stored in .data()" );
};
$.ui.testWidget( {}, "#element-normalization-selector" );
$.ui.testWidget.prototype.defaultElement = null;
$.ui.testWidget.prototype._create = function() {
2015-08-24 13:32:13 +00:00
2016-04-06 14:06:47 +00:00
// Using strictEqual throws an error (Maximum call stack size exceeded)
assert.ok( this.element[ 0 ] === this, "instance as element" );
};
$.ui.testWidget();
2015-08-24 13:32:13 +00:00
} );
QUnit.test( "contextless construction", function( assert ) {
assert.expect( 1 );
var testWidget,
elem = $( "<div>" );
$.widget( "ui.testWidget", {} );
testWidget = $.ui.testWidget;
testWidget( {}, elem );
assert.ok( true, "No crash" );
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "custom selector expression", function( assert ) {
assert.expect( 1 );
var elem = $( "<div>" ).appendTo( "#qunit-fixture" );
$.widget( "ui.testWidget", {} );
elem.testWidget();
2016-04-06 14:06:47 +00:00
assert.deepEqual( $( ":ui-testwidget" )[ 0 ], elem[ 0 ] );
elem.testWidget( "destroy" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "jQuery usage", function( assert ) {
assert.expect( 14 );
2010-08-26 14:59:51 +00:00
var elem, instance, ret,
2012-04-19 02:36:15 +00:00
shouldCreate = false;
2010-08-26 14:59:51 +00:00
$.widget( "ui.testWidget", {
getterSetterVal: 5,
_create: function() {
2016-04-06 14:06:47 +00:00
assert.ok( shouldCreate, "create called on instantiation" );
},
2010-08-26 14:59:51 +00:00
methodWithParams: function( param1, param2 ) {
2016-04-06 14:06:47 +00:00
assert.ok( true, "method called via .pluginName(methodName)" );
assert.equal( param1, "value1",
2010-08-26 14:59:51 +00:00
"parameter passed via .pluginName(methodName, param)" );
2016-04-06 14:06:47 +00:00
assert.equal( param2, "value2",
2010-08-26 14:59:51 +00:00
"multiple parameters passed via .pluginName(methodName, param, param)" );
2011-06-19 12:42:15 +00:00
return this;
},
2010-08-26 14:59:51 +00:00
getterSetterMethod: function( val ) {
if ( val ) {
this.getterSetterVal = val;
} else {
return this.getterSetterVal;
}
},
jQueryObject: function() {
return $( "body" );
}
2015-08-24 13:32:13 +00:00
} );
2010-08-26 14:59:51 +00:00
shouldCreate = true;
2012-04-19 02:36:15 +00:00
elem = $( "<div>" )
.on( "testwidgetcreate", function() {
2016-04-06 14:06:47 +00:00
assert.ok( shouldCreate, "create event triggered on instantiation" );
2015-08-24 13:32:13 +00:00
} )
.testWidget();
shouldCreate = false;
2010-08-26 14:59:51 +00:00
instance = elem.testWidget( "instance" );
2016-04-06 14:06:47 +00:00
assert.equal( typeof instance, "object", "instance stored in .data(pluginName)" );
assert.equal( instance.element[ 0 ], elem[ 0 ], "element stored on widget" );
2012-04-19 02:36:15 +00:00
ret = elem.testWidget( "methodWithParams", "value1", "value2" );
2016-04-06 14:06:47 +00:00
assert.equal( ret, elem, "jQuery object returned from method call" );
2010-08-26 14:59:51 +00:00
ret = elem.testWidget( "getterSetterMethod" );
2016-04-06 14:06:47 +00:00
assert.equal( ret, 5, "getter/setter can act as getter" );
2010-08-26 14:59:51 +00:00
ret = elem.testWidget( "getterSetterMethod", 30 );
2016-04-06 14:06:47 +00:00
assert.equal( ret, elem, "getter/setter method can be chainable" );
assert.equal( instance.getterSetterVal, 30, "getter/setter can act as setter" );
ret = elem.testWidget( "jQueryObject" );
2016-04-06 14:06:47 +00:00
assert.equal( ret[ 0 ], document.body, "returned jQuery object" );
assert.equal( ret.end(), elem, "stack preserved" );
elem.testWidget( "destroy" );
2016-04-06 14:06:47 +00:00
assert.equal( elem.testWidget( "instance" ), null );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "direct usage", function( assert ) {
assert.expect( 9 );
2010-08-26 14:59:51 +00:00
2012-04-19 02:36:15 +00:00
var elem, instance, ret,
shouldCreate = false;
2010-08-26 14:59:51 +00:00
$.widget( "ui.testWidget", {
getterSetterVal: 5,
_create: function() {
2016-04-06 14:06:47 +00:00
assert.ok( shouldCreate, "create called on instantiation" );
},
2010-08-26 14:59:51 +00:00
methodWithParams: function( param1, param2 ) {
2016-04-06 14:06:47 +00:00
assert.ok( true, "method called dirctly" );
assert.equal( param1, "value1", "parameter passed via direct call" );
assert.equal( param2, "value2", "multiple parameters passed via direct call" );
2010-08-26 14:59:51 +00:00
return this;
},
2010-08-26 14:59:51 +00:00
getterSetterMethod: function( val ) {
if ( val ) {
this.getterSetterVal = val;
} else {
return this.getterSetterVal;
}
}
2015-08-24 13:32:13 +00:00
} );
2011-06-19 12:42:15 +00:00
2012-04-19 02:36:15 +00:00
elem = $( "<div>" )[ 0 ];
2011-06-19 12:42:15 +00:00
shouldCreate = true;
2012-04-19 02:36:15 +00:00
instance = new $.ui.testWidget( {}, elem );
shouldCreate = false;
2010-08-26 14:59:51 +00:00
2016-04-06 14:06:47 +00:00
assert.equal( $( elem ).testWidget( "instance" ), instance,
2010-08-26 14:59:51 +00:00
"instance stored in .data(pluginName)" );
2016-04-06 14:06:47 +00:00
assert.equal( instance.element[ 0 ], elem, "element stored on widget" );
2011-06-19 12:42:15 +00:00
2012-04-19 02:36:15 +00:00
ret = instance.methodWithParams( "value1", "value2" );
2016-04-06 14:06:47 +00:00
assert.equal( ret, instance, "plugin returned from method call" );
2010-08-26 14:59:51 +00:00
ret = instance.getterSetterMethod();
2016-04-06 14:06:47 +00:00
assert.equal( ret, 5, "getter/setter can act as getter" );
2010-08-26 14:59:51 +00:00
instance.getterSetterMethod( 30 );
2016-04-06 14:06:47 +00:00
assert.equal( instance.getterSetterVal, 30, "getter/setter can act as setter" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "error handling", function( assert ) {
assert.expect( 3 );
var error = $.error;
$.widget( "ui.testWidget", {
2015-08-24 13:32:13 +00:00
_privateMethod: function() {}
} );
$.error = function( msg ) {
2016-04-06 14:06:47 +00:00
assert.equal( msg, "cannot call methods on testWidget prior to initialization; " +
"attempted to call method 'missing'", "method call before init" );
};
$( "<div>" ).testWidget( "missing" );
$.error = function( msg ) {
2016-04-06 14:06:47 +00:00
assert.equal( msg, "no such method 'missing' for testWidget widget instance",
"invalid method call on widget instance" );
};
$( "<div>" ).testWidget().testWidget( "missing" );
2015-08-24 13:32:13 +00:00
$.error = function( msg ) {
2016-04-06 14:06:47 +00:00
assert.equal( msg, "no such method '_privateMethod' for testWidget widget instance",
"invalid method call on widget instance" );
};
2011-06-19 12:42:15 +00:00
$( "<div>" ).testWidget().testWidget( "_privateMethod" );
$.error = error;
2015-08-24 13:32:13 +00:00
} );
QUnit.test( "Prototype pollution", function( assert ) {
assert.expect( 3 );
var elem = $( "<div>" );
$.widget( "ui.testWidget", {} );
elem.testWidget();
try {
$.widget( "ui.__proto__", {} );
} catch ( _e ) {}
try {
$.widget( "ui.constructor", {} );
} catch ( _e ) {}
assert.strictEqual( Object.getPrototypeOf( $.ui ), Object.prototype,
"$.ui constructor not modified" );
assert.ok( $.ui instanceof Object, "$.ui is an Object instance" );
assert.notOk( $.ui instanceof Function, "$.ui is not a Function instance" );
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "merge multiple option arguments", function( assert ) {
assert.expect( 1 );
2010-08-26 14:59:51 +00:00
$.widget( "ui.testWidget", {
_create: function() {
2016-04-06 14:06:47 +00:00
assert.deepEqual( this.options, {
classes: {},
create: null,
disabled: false,
option1: "value1",
option2: "value2",
option3: "value3",
option4: {
option4a: "valuea",
option4b: "valueb"
}
2015-08-24 13:32:13 +00:00
} );
}
2015-08-24 13:32:13 +00:00
} );
$( "<div>" ).testWidget( {
option1: "valuex",
option2: "valuex",
option3: "value3",
option4: {
option4a: "valuex"
}
}, {
option1: "value1",
option2: "value2",
option4: {
option4b: "valueb"
}
}, {
option4: {
option4a: "valuea"
}
2015-08-24 13:32:13 +00:00
} );
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "._getCreateOptions()", function( assert ) {
assert.expect( 4 );
$.widget( "ui.testWidget", {
options: {
option1: "valuex",
option2: "valuex",
option3: "value3"
},
_getCreateOptions: function() {
var superOptions = this._super();
2016-04-06 14:06:47 +00:00
assert.deepEqual( superOptions, {}, "Base implementation returns empty object" );
assert.strictEqual( this.window[ 0 ], window, "this.window is properly defined" );
2016-04-06 14:06:47 +00:00
assert.strictEqual( this.document[ 0 ], document, "this.document is properly defined" );
return {
option1: "override1",
option2: "overideX"
};
},
_create: function() {
2016-04-06 14:06:47 +00:00
assert.deepEqual( this.options, {
classes: {},
create: null,
disabled: false,
option1: "override1",
option2: "value2",
option3: "value3"
2015-08-24 13:32:13 +00:00
} );
}
2015-08-24 13:32:13 +00:00
} );
$( "<div>" ).testWidget( { option2: "value2" } );
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "._getCreateEventData()", function( assert ) {
assert.expect( 1 );
var data = { foo: "bar" };
$.widget( "ui.testWidget", {
_getCreateEventData: function() {
return data;
}
2015-08-24 13:32:13 +00:00
} );
$( "<div>" ).testWidget( {
create: function( event, ui ) {
2016-04-06 14:06:47 +00:00
assert.strictEqual( ui, data, "event data" );
}
2015-08-24 13:32:13 +00:00
} );
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "re-init", function( assert ) {
assert.expect( 3 );
2011-01-25 02:22:40 +00:00
var div = $( "<div>" ),
actions = [];
$.widget( "ui.testWidget", {
_create: function() {
actions.push( "create" );
},
_init: function() {
actions.push( "init" );
},
_setOption: function( key ) {
actions.push( "option" + key );
}
2015-08-24 13:32:13 +00:00
} );
actions = [];
2015-08-24 13:32:13 +00:00
div.testWidget( { foo: "bar" } );
2016-04-06 14:06:47 +00:00
assert.deepEqual( actions, [ "create", "init" ], "correct methods called on init" );
actions = [];
div.testWidget();
2016-04-06 14:06:47 +00:00
assert.deepEqual( actions, [ "init" ], "correct methods call on re-init" );
actions = [];
2015-08-24 13:32:13 +00:00
div.testWidget( { foo: "bar" } );
2016-04-06 14:06:47 +00:00
assert.deepEqual( actions, [ "optionfoo", "init" ], "correct methods called on re-init with options" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "redeclare", function( assert ) {
assert.expect( 2 );
$.widget( "ui.testWidget", {} );
2016-04-06 14:06:47 +00:00
assert.equal( $.ui.testWidget.prototype.widgetEventPrefix, "testWidget" );
$.widget( "ui.testWidget", {} );
2016-04-06 14:06:47 +00:00
assert.equal( $.ui.testWidget.prototype.widgetEventPrefix, "testWidget" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "inheritance", function( assert ) {
assert.expect( 6 );
2015-08-24 13:32:13 +00:00
// #5830 - Widget: Using inheritance overwrites the base classes options
$.widget( "ui.testWidgetBase", {
options: {
obj: {
key1: "foo",
key2: "bar"
},
arr: [ "testing" ]
}
2015-08-24 13:32:13 +00:00
} );
$.widget( "ui.testWidgetExtension", $.ui.testWidgetBase, {
options: {
obj: {
key1: "baz"
},
arr: [ "alpha", "beta" ]
}
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
assert.equal( $.ui.testWidgetBase.prototype.widgetEventPrefix, "testWidgetBase",
"base class event prefix" );
2016-04-06 14:06:47 +00:00
assert.deepEqual( $.ui.testWidgetBase.prototype.options.obj, {
key1: "foo",
key2: "bar"
2015-08-24 13:32:13 +00:00
}, "base class option object not overridden" );
2016-04-06 14:06:47 +00:00
assert.deepEqual( $.ui.testWidgetBase.prototype.options.arr, [ "testing" ],
2015-08-24 13:32:13 +00:00
"base class option array not overridden" );
2016-04-06 14:06:47 +00:00
assert.equal( $.ui.testWidgetExtension.prototype.widgetEventPrefix, "testWidgetExtension",
"extension class event prefix" );
2016-04-06 14:06:47 +00:00
assert.deepEqual( $.ui.testWidgetExtension.prototype.options.obj, {
key1: "baz",
key2: "bar"
2015-08-24 13:32:13 +00:00
}, "extension class option object extends base" );
2016-04-06 14:06:47 +00:00
assert.deepEqual( $.ui.testWidgetExtension.prototype.options.arr, [ "alpha", "beta" ],
2015-08-24 13:32:13 +00:00
"extension class option array overwrites base" );
delete $.ui.testWidgetBase;
2015-05-13 18:58:39 +00:00
delete $.fn.testWidgetBase;
delete $.ui.testWidgetExtension;
2015-05-13 18:58:39 +00:00
delete $.fn.testWidgetExtension;
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "._super()", function( assert ) {
assert.expect( 9 );
var instance;
$.widget( "ui.testWidget", {
method: function( a, b ) {
2016-04-06 14:06:47 +00:00
assert.deepEqual( this, instance, "this is correct in testWidget" );
assert.deepEqual( a, 5, "parameter passed to testWidget" );
assert.deepEqual( b, 20, "second parameter passed to testWidget" );
return a + b;
}
2015-08-24 13:32:13 +00:00
} );
$.widget( "ui.testWidget2", $.ui.testWidget, {
method: function( a, b ) {
2016-04-06 14:06:47 +00:00
assert.deepEqual( this, instance, "this is correct in testWidget2" );
assert.deepEqual( a, 5, "parameter passed to testWidget2" );
assert.deepEqual( b, 10, "parameter passed to testWidget2" );
2015-08-24 13:32:13 +00:00
return this._super( a, b * 2 );
}
2015-08-24 13:32:13 +00:00
} );
$.widget( "ui.testWidget3", $.ui.testWidget2, {
method: function( a ) {
2016-04-06 14:06:47 +00:00
assert.deepEqual( this, instance, "this is correct in testWidget3" );
assert.deepEqual( a, 5, "parameter passed to testWidget3" );
2015-08-24 13:32:13 +00:00
var ret = this._super( a, a * 2 );
2016-04-06 14:06:47 +00:00
assert.deepEqual( ret, 25, "super returned value" );
}
2015-08-24 13:32:13 +00:00
} );
instance = $( "<div>" ).testWidget3().testWidget3( "instance" );
instance.method( 5 );
delete $.ui.testWidget3;
2015-05-13 18:58:39 +00:00
delete $.fn.testWidget3;
delete $.ui.testWidget2;
2015-05-13 18:58:39 +00:00
delete $.fn.testWidget2;
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "._superApply()", function( assert ) {
assert.expect( 10 );
var instance;
$.widget( "ui.testWidget", {
method: function( a, b ) {
2016-04-06 14:06:47 +00:00
assert.deepEqual( this, instance, "this is correct in testWidget" );
assert.deepEqual( a, 5, "parameter passed to testWidget" );
assert.deepEqual( b, 10, "second parameter passed to testWidget" );
return a + b;
}
2015-08-24 13:32:13 +00:00
} );
$.widget( "ui.testWidget2", $.ui.testWidget, {
method: function( a, b ) {
2016-04-06 14:06:47 +00:00
assert.deepEqual( this, instance, "this is correct in testWidget2" );
assert.deepEqual( a, 5, "parameter passed to testWidget2" );
assert.deepEqual( b, 10, "second parameter passed to testWidget2" );
return this._superApply( arguments );
}
2015-08-24 13:32:13 +00:00
} );
$.widget( "ui.testWidget3", $.ui.testWidget2, {
method: function( a, b ) {
2016-04-06 14:06:47 +00:00
assert.deepEqual( this, instance, "this is correct in testWidget3" );
assert.deepEqual( a, 5, "parameter passed to testWidget3" );
assert.deepEqual( b, 10, "second parameter passed to testWidget3" );
var ret = this._superApply( arguments );
2016-04-06 14:06:47 +00:00
assert.deepEqual( ret, 15, "super returned value" );
}
2015-08-24 13:32:13 +00:00
} );
instance = $( "<div>" ).testWidget3().testWidget3( "instance" );
instance.method( 5, 10 );
delete $.ui.testWidget3;
2015-05-13 18:58:39 +00:00
delete $.fn.testWidget3;
delete $.ui.testWidget2;
2015-05-13 18:58:39 +00:00
delete $.fn.testWidget2;
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "mixins", function( assert ) {
assert.expect( 5 );
var mixin1 = {
foo: function() {
2016-04-06 14:06:47 +00:00
assert.equal( method, "foo", "Methods from first mixin are copied over" );
}
};
var mixin2 = {
bar: function() {
2016-04-06 14:06:47 +00:00
assert.equal( method, "bar", "Methods from second mixin are copied over" );
}
};
var prototype = {
baz: function() {
2016-04-06 14:06:47 +00:00
assert.equal( method, "baz", "Methods from protoype are copied over" );
}
};
var existingBar = mixin2.bar;
var method;
$.widget( "ui.testWidget", [ mixin1, mixin2, prototype ] );
method = "foo";
$.ui.testWidget.prototype.foo();
method = "bar";
$.ui.testWidget.prototype.bar();
method = "baz";
$.ui.testWidget.prototype.baz();
mixin1.foo = function() {
2016-04-06 14:06:47 +00:00
assert.ok( false, "Changes to a mixin don't change the prototype" );
};
method = "foo";
$.ui.testWidget.prototype.foo();
$.ui.testWidget.prototype.bar = function() {};
2016-04-06 14:06:47 +00:00
assert.strictEqual( mixin2.bar, existingBar, "Changes to a prototype don't change the mixin" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "mixins with inheritance", function( assert ) {
assert.expect( 4 );
var mixin1 = {
foo: function() {
2016-04-06 14:06:47 +00:00
assert.equal( method, "foo", "Methods from first mixin are copied over" );
}
};
var mixin2 = {
bar: function() {
2016-04-06 14:06:47 +00:00
assert.equal( method, "bar", "Methods from second mixin are copied over" );
}
};
var parentPrototype = {
baz: function() {
2016-04-06 14:06:47 +00:00
assert.equal( method, "baz", "Methods from parent protoype are copied over" );
}
};
var childPrototype = {
qux: function() {
2016-04-06 14:06:47 +00:00
assert.equal( method, "qux", "Methods from child protoype are copied over" );
}
};
var method;
$.widget( "ui.testWidget", [ mixin1, parentPrototype ] );
$.widget( "ui.testWidget2", $.ui.testWidget, [ mixin2, childPrototype ] );
method = "foo";
$.ui.testWidget2.prototype.foo();
method = "bar";
$.ui.testWidget2.prototype.bar();
method = "baz";
$.ui.testWidget2.prototype.baz();
method = "qux";
$.ui.testWidget2.prototype.qux();
delete $.ui.testWidget2;
delete $.fn.testWidget2;
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( ".option() - getter", function( assert ) {
assert.expect( 6 );
2010-08-26 14:50:26 +00:00
$.widget( "ui.testWidget", {
_create: function() {}
2015-08-24 13:32:13 +00:00
} );
2010-08-26 14:50:26 +00:00
2012-04-19 02:36:15 +00:00
var options,
2015-08-24 13:32:13 +00:00
div = $( "<div>" ).testWidget( {
2012-04-19 02:36:15 +00:00
foo: "bar",
baz: 5,
qux: [ "quux", "quuux" ]
2015-08-24 13:32:13 +00:00
} );
2010-08-26 14:50:26 +00:00
2016-04-06 14:06:47 +00:00
assert.deepEqual( div.testWidget( "option", "x" ), null, "non-existent option" );
assert.deepEqual( div.testWidget( "option", "foo" ), "bar", "single option - string" );
assert.deepEqual( div.testWidget( "option", "baz" ), 5, "single option - number" );
assert.deepEqual( div.testWidget( "option", "qux" ), [ "quux", "quuux" ],
2010-08-26 14:50:26 +00:00
"single option - array" );
2012-04-19 02:36:15 +00:00
options = div.testWidget( "option" );
2016-04-06 14:06:47 +00:00
assert.deepEqual( options, {
baz: 5,
classes: {},
create: null,
2010-08-26 14:50:26 +00:00
disabled: false,
foo: "bar",
qux: [ "quux", "quuux" ]
}, "full options hash returned" );
options.foo = "notbar";
2016-04-06 14:06:47 +00:00
assert.deepEqual( div.testWidget( "option", "foo" ), "bar",
2010-08-26 14:50:26 +00:00
"modifying returned options hash does not modify plugin instance" );
2015-08-24 13:32:13 +00:00
} );
2010-08-26 14:50:26 +00:00
2016-04-06 14:06:47 +00:00
QUnit.test( ".option() - deep option getter", function( assert ) {
assert.expect( 5 );
$.widget( "ui.testWidget", {} );
2015-08-24 13:32:13 +00:00
var div = $( "<div>" ).testWidget( {
foo: {
bar: "baz",
qux: {
quux: "xyzzy"
}
}
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
assert.equal( div.testWidget( "option", "foo.bar" ), "baz", "one level deep - string" );
assert.deepEqual( div.testWidget( "option", "foo.qux" ), { quux: "xyzzy" },
"one level deep - object" );
2016-04-06 14:06:47 +00:00
assert.equal( div.testWidget( "option", "foo.qux.quux" ), "xyzzy", "two levels deep - string" );
assert.equal( div.testWidget( "option", "x.y" ), null, "top level non-existent" );
assert.equal( div.testWidget( "option", "foo.x.y" ), null, "one level deep - non-existent" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( ".option() - delegate to ._setOptions()", function( assert ) {
assert.expect( 2 );
2012-04-19 02:36:15 +00:00
var div,
calls = [];
$.widget( "ui.testWidget", {
_create: function() {},
_setOptions: function( options ) {
calls.push( options );
}
2015-08-24 13:32:13 +00:00
} );
2012-04-19 02:36:15 +00:00
div = $( "<div>" ).testWidget();
calls = [];
div.testWidget( "option", "foo", "bar" );
2016-04-06 14:06:47 +00:00
assert.deepEqual( calls, [ { foo: "bar" } ], "_setOptions called for single option" );
2011-06-19 12:42:15 +00:00
calls = [];
div.testWidget( "option", {
bar: "qux",
quux: "quuux"
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
assert.deepEqual( calls, [ { bar: "qux", quux: "quuux" } ],
"_setOptions called with multiple options" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( ".option() - delegate to ._setOption()", function( assert ) {
assert.expect( 3 );
2012-04-19 02:36:15 +00:00
var div,
calls = [];
2010-08-26 14:50:26 +00:00
$.widget( "ui.testWidget", {
_create: function() {},
_setOption: function( key, val ) {
2015-08-24 13:32:13 +00:00
calls.push( {
2010-08-26 14:50:26 +00:00
key: key,
val: val
2015-08-24 13:32:13 +00:00
} );
2010-08-26 14:50:26 +00:00
}
2015-08-24 13:32:13 +00:00
} );
2012-04-19 02:36:15 +00:00
div = $( "<div>" ).testWidget();
2010-08-26 14:50:26 +00:00
calls = [];
div.testWidget( "option", "foo", "bar" );
2016-04-06 14:06:47 +00:00
assert.deepEqual( calls, [ { key: "foo", val: "bar" } ],
2010-08-26 14:50:26 +00:00
"_setOption called for single option" );
2011-06-19 12:42:15 +00:00
calls = [];
div.testWidget( "option", "foo", undefined );
2016-04-06 14:06:47 +00:00
assert.deepEqual( calls, [ { key: "foo", val: undefined } ],
"_setOption called for single option where value is undefined" );
2010-08-26 14:50:26 +00:00
calls = [];
div.testWidget( "option", {
bar: "qux",
quux: "quuux"
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
assert.deepEqual( calls, [
2010-08-26 14:50:26 +00:00
{ key: "bar", val: "qux" },
{ key: "quux", val: "quuux" }
], "_setOption called with multiple options" );
2015-08-24 13:32:13 +00:00
} );
2010-08-26 14:50:26 +00:00
2016-04-06 14:06:47 +00:00
QUnit.test( ".option() - deep option setter", function( assert ) {
assert.expect( 9 );
$.widget( "ui.testWidget", {} );
var result, div = $( "<div>" ).testWidget();
function deepOption( from, to, msg ) {
div.testWidget( "instance" ).options.foo = from;
$.ui.testWidget.prototype._setOption = function( key, value ) {
2016-04-06 14:06:47 +00:00
assert.deepEqual( key, "foo", msg + ": key" );
assert.deepEqual( value, to, msg + ": value" );
};
}
deepOption( { bar: "baz" }, { bar: "qux" }, "one deep" );
div.testWidget( "option", "foo.bar", "qux" );
deepOption( { bar: "baz" }, { bar: undefined }, "one deep - value = undefined" );
result = div.testWidget( "option", "foo.bar", undefined );
2016-04-06 14:06:47 +00:00
assert.deepEqual( result, div, "option should return widget on successful set operation" );
deepOption( null, { bar: "baz" }, "null" );
div.testWidget( "option", "foo.bar", "baz" );
deepOption(
{ bar: "baz", qux: { quux: "quuux" } },
{ bar: "baz", qux: { quux: "quuux", newOpt: "newVal" } },
"add property" );
div.testWidget( "option", "foo.qux.newOpt", "newVal" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( ".enable()", function( assert ) {
assert.expect( 2 );
2010-08-26 14:59:51 +00:00
$.widget( "ui.testWidget", {
2010-08-26 14:50:26 +00:00
_create: function() {},
_setOption: function( key, val ) {
2016-04-06 14:06:47 +00:00
assert.deepEqual( key, "disabled", "_setOption called with disabled option" );
assert.deepEqual( val, false, "disabled set to false" );
2010-08-26 14:50:26 +00:00
}
2015-08-24 13:32:13 +00:00
} );
2011-01-25 02:22:40 +00:00
$( "<div>" ).testWidget().testWidget( "enable" );
2015-08-24 13:32:13 +00:00
} );
2010-08-26 14:50:26 +00:00
2016-04-06 14:06:47 +00:00
QUnit.test( ".disable()", function( assert ) {
assert.expect( 2 );
2010-08-26 14:59:51 +00:00
$.widget( "ui.testWidget", {
2010-08-26 14:50:26 +00:00
_create: function() {},
_setOption: function( key, val ) {
2016-04-06 14:06:47 +00:00
assert.deepEqual( key, "disabled", "_setOption called with disabled option" );
assert.deepEqual( val, true, "disabled set to true" );
2010-08-26 14:50:26 +00:00
}
2015-08-24 13:32:13 +00:00
} );
2011-01-25 02:22:40 +00:00
$( "<div>" ).testWidget().testWidget( "disable" );
2015-08-24 13:32:13 +00:00
} );
2010-08-26 14:50:26 +00:00
2016-04-06 14:06:47 +00:00
QUnit.test( "._setOptionDisabled()", function( assert ) {
assert.expect( 3 );
var method;
var widget;
$.widget( "ui.testWidget", {
_setOptionDisabled: function( value ) {
method( value );
}
} );
method = function() {
2016-04-06 14:06:47 +00:00
assert.ok( false, "._setOptionDisabled() called on init when not disabled" );
};
$( "<div>" ).testWidget();
method = function( value ) {
2016-04-06 14:06:47 +00:00
assert.strictEqual( value, true, "._setOptionDisabled called on init when disabled" );
};
widget = $( "<div>" ).testWidget( { disabled: true } );
method = function( value ) {
2016-04-06 14:06:47 +00:00
assert.strictEqual( value, false, "._setOptionDisabled called when enabling" );
};
widget.testWidget( "enable" );
method = function( value ) {
2016-04-06 14:06:47 +00:00
assert.strictEqual( value, true, "._setOptionDisabled called when disabling" );
};
widget.testWidget( "option", "disabled", true );
} );
2016-04-06 14:06:47 +00:00
QUnit.test( ".widget() - base", function( assert ) {
assert.expect( 2 );
var constructor = $.widget( "ui.testWidget", {
_create: function() {}
2015-08-24 13:32:13 +00:00
} ),
div = $( "<div>" ).testWidget();
2016-04-06 14:06:47 +00:00
assert.deepEqual( div[ 0 ], div.testWidget( "widget" )[ 0 ] );
assert.deepEqual( constructor, $.ui.testWidget, "$.widget returns the constructor" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( ".widget() - overriden", function( assert ) {
assert.expect( 1 );
2011-01-25 02:22:40 +00:00
var wrapper = $( "<div>" );
2010-08-26 14:59:51 +00:00
$.widget( "ui.testWidget", {
_create: function() {},
widget: function() {
return wrapper;
}
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
assert.deepEqual( wrapper[ 0 ], $( "<div>" ).testWidget().testWidget( "widget" )[ 0 ] );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( ".instance()", function( assert ) {
assert.expect( 3 );
2013-03-19 16:53:09 +00:00
var div;
$.widget( "ui.testWidget", {
2013-03-19 16:53:09 +00:00
_create: function() {}
2015-08-24 13:32:13 +00:00
} );
div = $( "<div>" );
assert.equal( div.testWidget( "instance" ), undefined, "uninitialized" );
div.testWidget();
assert.equal( div.testWidget( "instance" ), div.testWidget( "instance" ), "initialized" );
assert.equal( $().testWidget( "instance" ), undefined, "empty set" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "._on() to element (default)", function( assert ) {
assert.expect( 12 );
2012-04-19 02:36:15 +00:00
var that, widget;
$.widget( "ui.testWidget", {
_create: function() {
2011-09-12 21:23:54 +00:00
that = this;
2015-08-24 13:32:13 +00:00
this._on( {
keyup: this.keyup,
keydown: "keydown"
2015-08-24 13:32:13 +00:00
} );
},
keyup: function( event ) {
2016-04-06 14:06:47 +00:00
assert.equal( that, this );
assert.equal( that.element[ 0 ], event.currentTarget );
assert.equal( "keyup", event.type );
},
keydown: function( event ) {
2016-04-06 14:06:47 +00:00
assert.equal( that, this );
assert.equal( that.element[ 0 ], event.currentTarget );
assert.equal( "keydown", event.type );
}
2015-08-24 13:32:13 +00:00
} );
2012-04-19 02:36:15 +00:00
widget = $( "<div></div>" )
.testWidget()
.trigger( "keyup" )
.trigger( "keydown" );
widget
.testWidget( "disable" )
.trigger( "keyup" )
.trigger( "keydown" );
widget
.testWidget( "enable" )
.trigger( "keyup" )
.trigger( "keydown" );
widget
.testWidget( "destroy" )
.trigger( "keyup" )
.trigger( "keydown" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "._on() to element with suppressDisabledCheck", function( assert ) {
assert.expect( 18 );
var that, widget;
$.widget( "ui.testWidget", {
_create: function() {
that = this;
this._on( true, {
keyup: this.keyup,
keydown: "keydown"
2015-08-24 13:32:13 +00:00
} );
},
keyup: function( event ) {
2016-04-06 14:06:47 +00:00
assert.equal( that, this );
assert.equal( that.element[ 0 ], event.currentTarget );
assert.equal( "keyup", event.type );
},
keydown: function( event ) {
2016-04-06 14:06:47 +00:00
assert.equal( that, this );
assert.equal( that.element[ 0 ], event.currentTarget );
assert.equal( "keydown", event.type );
}
2015-08-24 13:32:13 +00:00
} );
widget = $( "<div></div>" )
.testWidget()
.trigger( "keyup" )
.trigger( "keydown" );
widget
.testWidget( "disable" )
.trigger( "keyup" )
.trigger( "keydown" );
widget
.testWidget( "enable" )
.trigger( "keyup" )
.trigger( "keydown" );
widget
.testWidget( "destroy" )
.trigger( "keyup" )
.trigger( "keydown" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "._on() to descendent", function( assert ) {
assert.expect( 12 );
2012-04-19 02:36:15 +00:00
var that, widget, descendant;
$.widget( "ui.testWidget", {
_create: function() {
2011-09-12 21:23:54 +00:00
that = this;
this._on( this.element.find( "strong" ), {
keyup: this.keyup,
keydown: "keydown"
2015-08-24 13:32:13 +00:00
} );
},
keyup: function( event ) {
2016-04-06 14:06:47 +00:00
assert.equal( that, this );
assert.equal( that.element.find( "strong" )[ 0 ], event.currentTarget );
assert.equal( "keyup", event.type );
},
2015-08-24 13:32:13 +00:00
keydown: function( event ) {
2016-04-06 14:06:47 +00:00
assert.equal( that, this );
assert.equal( that.element.find( "strong" )[ 0 ], event.currentTarget );
assert.equal( "keydown", event.type );
}
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
// Trigger events on both widget and descendent to ensure that only descendent receives them
2012-04-19 02:36:15 +00:00
widget = $( "<div><p><strong>hello</strong> world</p></div>" )
.testWidget()
.trigger( "keyup" )
.trigger( "keydown" );
2012-04-19 02:36:15 +00:00
descendant = widget.find( "strong" )
.trigger( "keyup" )
.trigger( "keydown" );
widget
.testWidget( "disable" )
.trigger( "keyup" )
.trigger( "keydown" );
2012-04-19 02:36:15 +00:00
descendant
.trigger( "keyup" )
.trigger( "keydown" );
widget
.testWidget( "enable" )
.trigger( "keyup" )
.trigger( "keydown" );
2012-04-19 02:36:15 +00:00
descendant
.trigger( "keyup" )
.trigger( "keydown" );
2012-04-19 02:36:15 +00:00
descendant
.addClass( "ui-state-disabled" )
.trigger( "keyup" )
.trigger( "keydown" );
widget
.testWidget( "destroy" )
.trigger( "keyup" )
.trigger( "keydown" );
2012-04-19 02:36:15 +00:00
descendant
.trigger( "keyup" )
.trigger( "keydown" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "_on() with delegate", function( assert ) {
assert.expect( 8 );
$.widget( "ui.testWidget", {
_create: function() {
var uuid = this.uuid;
this.element = {
on: function( event, handler ) {
2016-04-06 14:06:47 +00:00
assert.equal( event, "click.testWidget" + uuid );
assert.ok( typeof handler === "function" );
},
trigger: $.noop
};
this.widget = function() {
return {
on: function( event, selector, handler ) {
2016-04-06 14:06:47 +00:00
assert.equal( selector, "a" );
assert.equal( event, "click.testWidget" + uuid );
assert.ok( typeof handler === "function" );
}
};
};
2015-08-24 13:32:13 +00:00
this._on( {
"click": "handler",
"click a": "handler"
2015-08-24 13:32:13 +00:00
} );
this.widget = function() {
return {
on: function( event, selector, handler ) {
2016-04-06 14:06:47 +00:00
assert.equal( selector, "form fieldset > input" );
assert.equal( event, "change.testWidget" + uuid );
assert.ok( typeof handler === "function" );
}
};
};
2015-08-24 13:32:13 +00:00
this._on( {
"change form fieldset > input": "handler"
2015-08-24 13:32:13 +00:00
} );
}
2015-08-24 13:32:13 +00:00
} );
$.ui.testWidget();
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "_on() with delegate to descendent", function( assert ) {
assert.expect( 4 );
$.widget( "ui.testWidget", {
_create: function() {
this.target = $( "<p><strong>hello</strong> world</p>" );
this.child = this.target.children();
this._on( this.target, {
"keyup": "handlerDirect",
"keyup strong": "handlerDelegated"
2015-08-24 13:32:13 +00:00
} );
this.child.trigger( "keyup" );
},
handlerDirect: function( event ) {
2016-04-06 14:06:47 +00:00
assert.deepEqual( event.currentTarget, this.target[ 0 ] );
assert.deepEqual( event.target, this.child[ 0 ] );
},
handlerDelegated: function( event ) {
2016-04-06 14:06:47 +00:00
assert.deepEqual( event.currentTarget, this.child[ 0 ] );
assert.deepEqual( event.target, this.child[ 0 ] );
}
2015-08-24 13:32:13 +00:00
} );
$.ui.testWidget();
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "_on() to common element", function( assert ) {
assert.expect( 4 );
$.widget( "ui.testWidget", {
_create: function() {
this._on( this.document, {
"customevent": "_handler",
"with:colons": "_colonHandler",
"with-dashes": "_dashHandler",
"with-dashes:and-colons": "_commbinedHandler"
2015-08-24 13:32:13 +00:00
} );
},
_handler: function() {
2016-04-06 14:06:47 +00:00
assert.ok( true, "handler triggered" );
},
_colonHandler: function() {
2016-04-06 14:06:47 +00:00
assert.ok( true, "colon handler triggered" );
},
_dashHandler: function() {
2016-04-06 14:06:47 +00:00
assert.ok( true, "dash handler triggered" );
},
_commbinedHandler: function() {
2016-04-06 14:06:47 +00:00
assert.ok( true, "combined handler triggered" );
}
2015-08-24 13:32:13 +00:00
} );
var widget = $( "#widget" ).testWidget().testWidget( "instance" );
$( "#widget-wrapper" ).testWidget();
widget.destroy();
$( document ).trigger( "customevent" );
$( document ).trigger( "with:colons" );
$( document ).trigger( "with-dashes" );
$( document ).trigger( "with-dashes:and-colons" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "_off() - single event", function( assert ) {
assert.expect( 3 );
$.widget( "ui.testWidget", {} );
var shouldTriggerWidget, shouldTriggerOther,
element = $( "#widget" ),
widget = element.testWidget().testWidget( "instance" );
widget._on( element, { foo: function() {
2016-04-06 14:06:47 +00:00
assert.ok( shouldTriggerWidget, "foo called from _on" );
2015-08-24 13:32:13 +00:00
} } );
element.on( "foo", function() {
2016-04-06 14:06:47 +00:00
assert.ok( shouldTriggerOther, "foo called from bind" );
2015-08-24 13:32:13 +00:00
} );
shouldTriggerWidget = true;
shouldTriggerOther = true;
element.trigger( "foo" );
shouldTriggerWidget = false;
widget._off( element, "foo" );
element.trigger( "foo" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "_off() - multiple events", function( assert ) {
assert.expect( 6 );
$.widget( "ui.testWidget", {} );
var shouldTriggerWidget, shouldTriggerOther,
element = $( "#widget" ),
widget = element.testWidget().testWidget( "instance" );
widget._on( element, {
foo: function() {
2016-04-06 14:06:47 +00:00
assert.ok( shouldTriggerWidget, "foo called from _on" );
},
bar: function() {
2016-04-06 14:06:47 +00:00
assert.ok( shouldTriggerWidget, "bar called from _on" );
}
2015-08-24 13:32:13 +00:00
} );
element.on( "foo bar", function( event ) {
2016-04-06 14:06:47 +00:00
assert.ok( shouldTriggerOther, event.type + " called from bind" );
2015-08-24 13:32:13 +00:00
} );
shouldTriggerWidget = true;
shouldTriggerOther = true;
element.trigger( "foo" );
element.trigger( "bar" );
shouldTriggerWidget = false;
widget._off( element, "foo bar" );
element.trigger( "foo" );
element.trigger( "bar" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "_off() - all events", function( assert ) {
assert.expect( 6 );
$.widget( "ui.testWidget", {} );
var shouldTriggerWidget, shouldTriggerOther,
element = $( "#widget" ),
widget = element.testWidget().testWidget( "instance" );
widget._on( element, {
foo: function() {
2016-04-06 14:06:47 +00:00
assert.ok( shouldTriggerWidget, "foo called from _on" );
},
bar: function() {
2016-04-06 14:06:47 +00:00
assert.ok( shouldTriggerWidget, "bar called from _on" );
}
2015-08-24 13:32:13 +00:00
} );
element.on( "foo bar", function( event ) {
2016-04-06 14:06:47 +00:00
assert.ok( shouldTriggerOther, event.type + " called from bind" );
2015-08-24 13:32:13 +00:00
} );
shouldTriggerWidget = true;
shouldTriggerOther = true;
element.trigger( "foo" );
element.trigger( "bar" );
shouldTriggerWidget = false;
widget._off( element );
element.trigger( "foo" );
element.trigger( "bar" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "._hoverable()", function( assert ) {
assert.expect( 10 );
$.widget( "ui.testWidget", {
_create: function() {
this._hoverable( this.element.children() );
}
2015-08-24 13:32:13 +00:00
} );
var div = $( "#widget" ).testWidget().children();
assert.lacksClasses( div, "ui-state-hover", "not hovered on init" );
div.trigger( "mouseenter" );
assert.hasClasses( div, "ui-state-hover", "hovered after mouseenter" );
div.trigger( "mouseleave" );
assert.lacksClasses( div, "ui-state-hover", "not hovered after mouseleave" );
div.trigger( "mouseenter" );
assert.hasClasses( div, "ui-state-hover", "hovered after mouseenter" );
$( "#widget" ).testWidget( "disable" );
assert.lacksClasses( div, "ui-state-hover", "not hovered while disabled" );
div.trigger( "mouseenter" );
assert.lacksClasses( div, "ui-state-hover", "can't hover while disabled" );
$( "#widget" ).testWidget( "enable" );
assert.lacksClasses( div, "ui-state-hover", "enabling doesn't reset hover" );
div.trigger( "mouseenter" );
assert.hasClasses( div, "ui-state-hover", "hovered after mouseenter" );
$( "#widget" ).testWidget( "destroy" );
assert.lacksClasses( div, "ui-state-hover", "not hovered after destroy" );
div.trigger( "mouseenter" );
assert.lacksClasses( div, "ui-state-hover", "event handler removed on destroy" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "._focusable()", function( assert ) {
assert.expect( 10 );
$.widget( "ui.testWidget", {
_create: function() {
this._focusable( this.element.children() );
}
2015-08-24 13:32:13 +00:00
} );
2011-06-19 12:42:15 +00:00
var div = $( "#widget" ).testWidget().children();
assert.lacksClasses( div, "ui-state-focus", "not focused on init" );
div.trigger( "focusin" );
assert.hasClasses( div, "ui-state-focus", "focused after explicit focus" );
div.trigger( "focusout" );
assert.lacksClasses( div, "ui-state-focus", "not focused after blur" );
2011-06-19 12:42:15 +00:00
div.trigger( "focusin" );
assert.hasClasses( div, "ui-state-focus", "focused after explicit focus" );
$( "#widget" ).testWidget( "disable" );
assert.lacksClasses( div, "ui-state-focus", "not focused while disabled" );
div.trigger( "focusin" );
assert.lacksClasses( div, "ui-state-focus", "can't focus while disabled" );
$( "#widget" ).testWidget( "enable" );
assert.lacksClasses( div, "ui-state-focus", "enabling doesn't reset focus" );
2011-06-19 12:42:15 +00:00
div.trigger( "focusin" );
assert.hasClasses( div, "ui-state-focus", "focused after explicit focus" );
$( "#widget" ).testWidget( "destroy" );
assert.lacksClasses( div, "ui-state-focus", "not focused after destroy" );
div.trigger( "focusin" );
assert.lacksClasses( div, "ui-state-focus", "event handler removed on destroy" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "._trigger() - no event, no ui", function( assert ) {
assert.expect( 7 );
2010-08-26 15:49:07 +00:00
var handlers = [];
$.widget( "ui.testWidget", {
_create: function() {}
2015-08-24 13:32:13 +00:00
} );
2010-08-26 15:49:07 +00:00
2015-08-24 13:32:13 +00:00
$( "#widget" ).testWidget( {
2010-08-26 15:49:07 +00:00
foo: function( event, ui ) {
2016-04-06 14:06:47 +00:00
assert.deepEqual( event.type, "testwidgetfoo", "correct event type in callback" );
assert.deepEqual( ui, {}, "empty ui hash passed" );
2010-08-26 15:49:07 +00:00
handlers.push( "callback" );
}
2015-08-24 13:32:13 +00:00
} );
2010-08-26 15:49:07 +00:00
$( document ).add( "#widget-wrapper" ).add( "#widget" )
.on( "testwidgetfoo", function( event, ui ) {
2016-04-06 14:06:47 +00:00
assert.deepEqual( ui, {}, "empty ui hash passed" );
2010-08-26 15:49:07 +00:00
handlers.push( this );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
assert.deepEqual( $( "#widget" ).testWidget( "instance" )._trigger( "foo" ), true,
2010-08-26 15:49:07 +00:00
"_trigger returns true when event is not cancelled" );
2016-04-06 14:06:47 +00:00
assert.deepEqual( handlers, [
2010-08-26 15:49:07 +00:00
$( "#widget" )[ 0 ],
$( "#widget-wrapper" )[ 0 ],
document,
"callback"
], "event bubbles and then invokes callback" );
$( document ).off( "testwidgetfoo" );
2015-08-24 13:32:13 +00:00
} );
2010-08-26 15:49:07 +00:00
2016-04-06 14:06:47 +00:00
QUnit.test( "._trigger() - cancelled event", function( assert ) {
assert.expect( 3 );
2010-08-26 15:49:07 +00:00
$.widget( "ui.testWidget", {
_create: function() {}
2015-08-24 13:32:13 +00:00
} );
2010-08-26 15:49:07 +00:00
2015-08-24 13:32:13 +00:00
$( "#widget" ).testWidget( {
foo: function() {
2016-04-06 14:06:47 +00:00
assert.ok( true, "callback invoked even if event is cancelled" );
2010-08-26 15:49:07 +00:00
}
2015-08-24 13:32:13 +00:00
} )
.on( "testwidgetfoo", function() {
2016-04-06 14:06:47 +00:00
assert.ok( true, "event was triggered" );
2010-08-26 15:49:07 +00:00
return false;
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
assert.deepEqual( $( "#widget" ).testWidget( "instance" )._trigger( "foo" ), false,
2010-08-26 15:49:07 +00:00
"_trigger returns false when event is cancelled" );
2015-08-24 13:32:13 +00:00
} );
2010-08-26 15:49:07 +00:00
2016-04-06 14:06:47 +00:00
QUnit.test( "._trigger() - cancelled callback", function( assert ) {
assert.expect( 1 );
2010-08-26 15:49:07 +00:00
$.widget( "ui.testWidget", {
_create: function() {}
2015-08-24 13:32:13 +00:00
} );
2010-08-26 15:49:07 +00:00
2015-08-24 13:32:13 +00:00
$( "#widget" ).testWidget( {
foo: function() {
2010-08-26 15:49:07 +00:00
return false;
}
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
assert.deepEqual( $( "#widget" ).testWidget( "instance" )._trigger( "foo" ), false,
2010-08-26 15:49:07 +00:00
"_trigger returns false when callback returns false" );
2015-08-24 13:32:13 +00:00
} );
2010-08-26 15:49:07 +00:00
2016-04-06 14:06:47 +00:00
QUnit.test( "._trigger() - provide event and ui", function( assert ) {
assert.expect( 7 );
2010-08-26 15:49:07 +00:00
var originalEvent = $.Event( "originalTest" );
$.widget( "ui.testWidget", {
_create: function() {},
testEvent: function() {
var ui = {
foo: "bar",
baz: {
qux: 5,
quux: 20
}
};
this._trigger( "foo", originalEvent, ui );
2016-04-06 14:06:47 +00:00
assert.deepEqual( ui, {
2010-08-26 15:49:07 +00:00
foo: "notbar",
baz: {
qux: 10,
quux: "jQuery"
}
}, "ui object modified" );
}
2015-08-24 13:32:13 +00:00
} );
$( "#widget" ).on( "testwidgetfoo", function( event, ui ) {
2016-04-06 14:06:47 +00:00
assert.equal( event.originalEvent, originalEvent, "original event object passed" );
assert.deepEqual( ui, {
2010-08-26 15:49:07 +00:00
foo: "bar",
baz: {
qux: 5,
quux: 20
}
}, "ui hash passed" );
ui.foo = "notbar";
2015-08-24 13:32:13 +00:00
} );
$( "#widget-wrapper" ).on( "testwidgetfoo", function( event, ui ) {
2016-04-06 14:06:47 +00:00
assert.equal( event.originalEvent, originalEvent, "original event object passed" );
assert.deepEqual( ui, {
2010-08-26 15:49:07 +00:00
foo: "notbar",
baz: {
qux: 5,
quux: 20
}
}, "modified ui hash passed" );
ui.baz.qux = 10;
2015-08-24 13:32:13 +00:00
} );
$( "#widget" ).testWidget( {
2010-08-26 15:49:07 +00:00
foo: function( event, ui ) {
2016-04-06 14:06:47 +00:00
assert.equal( event.originalEvent, originalEvent, "original event object passed" );
assert.deepEqual( ui, {
2010-08-26 15:49:07 +00:00
foo: "notbar",
baz: {
qux: 10,
quux: 20
}
}, "modified ui hash passed" );
ui.baz.quux = "jQuery";
}
2015-08-24 13:32:13 +00:00
} )
2010-08-26 15:49:07 +00:00
.testWidget( "testEvent" );
2015-08-24 13:32:13 +00:00
} );
2010-08-26 15:49:07 +00:00
2016-04-06 14:06:47 +00:00
QUnit.test( "._trigger() - array as ui", function( assert ) {
2015-08-24 13:32:13 +00:00
// #6795 - Widget: handle array arguments to _trigger consistently
2016-04-06 14:06:47 +00:00
assert.expect( 4 );
$.widget( "ui.testWidget", {
_create: function() {},
testEvent: function() {
var ui = {
foo: "bar",
baz: {
qux: 5,
quux: 20
}
2012-04-19 02:36:15 +00:00
},
extra = {
bar: 5
};
this._trigger( "foo", null, [ ui, extra ] );
}
2015-08-24 13:32:13 +00:00
} );
$( "#widget" ).on( "testwidgetfoo", function( event, ui, extra ) {
2016-04-06 14:06:47 +00:00
assert.deepEqual( ui, {
foo: "bar",
baz: {
qux: 5,
quux: 20
}
}, "event: ui hash passed" );
2016-04-06 14:06:47 +00:00
assert.deepEqual( extra, {
bar: 5
}, "event: extra argument passed" );
2015-08-24 13:32:13 +00:00
} );
$( "#widget" ).testWidget( {
foo: function( event, ui, extra ) {
2016-04-06 14:06:47 +00:00
assert.deepEqual( ui, {
foo: "bar",
baz: {
qux: 5,
quux: 20
}
}, "callback: ui hash passed" );
2016-04-06 14:06:47 +00:00
assert.deepEqual( extra, {
bar: 5
}, "callback: extra argument passed" );
}
2015-08-24 13:32:13 +00:00
} )
.testWidget( "testEvent" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "._trigger() - instance as element", function( assert ) {
assert.expect( 4 );
$.widget( "ui.testWidget", {
defaultElement: null,
testEvent: function() {
2012-04-19 02:36:15 +00:00
this._trigger( "foo", null, { foo: "bar" } );
}
2015-08-24 13:32:13 +00:00
} );
var instance = $.ui.testWidget( {
foo: function( event, ui ) {
2016-04-06 14:06:47 +00:00
assert.equal( event.type, "testwidgetfoo", "event object passed to callback" );
assert.deepEqual( ui, { foo: "bar" }, "ui object passed to callback" );
}
2015-08-24 13:32:13 +00:00
} );
$( instance ).on( "testwidgetfoo", function( event, ui ) {
2016-04-06 14:06:47 +00:00
assert.equal( event.type, "testwidgetfoo", "event object passed to event handler" );
assert.deepEqual( ui, { foo: "bar" }, "ui object passed to event handler" );
2015-08-24 13:32:13 +00:00
} );
instance.testEvent();
2015-08-24 13:32:13 +00:00
} );
2015-08-24 13:32:13 +00:00
( function() {
2016-04-06 14:06:47 +00:00
function shouldDestroy( assert, expected, callback ) {
assert.expect( 1 );
2011-07-28 12:26:59 +00:00
var destroyed = false;
$.widget( "ui.testWidget", {
_create: function() {},
destroy: function() {
destroyed = true;
}
2015-08-24 13:32:13 +00:00
} );
2011-07-28 12:26:59 +00:00
callback();
2016-04-06 14:06:47 +00:00
assert.equal( destroyed, expected );
2011-07-28 12:26:59 +00:00
}
2016-04-06 14:06:47 +00:00
QUnit.test( "auto-destroy - .remove()", function( assert ) {
shouldDestroy( assert, true, function() {
2011-07-28 12:26:59 +00:00
$( "#widget" ).testWidget().remove();
2015-08-24 13:32:13 +00:00
} );
} );
2011-09-12 21:23:54 +00:00
2016-04-06 14:06:47 +00:00
QUnit.test( "auto-destroy - .remove() when disabled", function( assert ) {
shouldDestroy( assert, true, function() {
2015-08-24 13:32:13 +00:00
$( "#widget" ).testWidget( { disabled: true } ).remove();
} );
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "auto-destroy - .remove() on parent", function( assert ) {
shouldDestroy( assert, true, function() {
2011-07-28 12:26:59 +00:00
$( "#widget" ).testWidget().parent().remove();
2015-08-24 13:32:13 +00:00
} );
} );
2011-09-12 21:23:54 +00:00
2016-04-06 14:06:47 +00:00
QUnit.test( "auto-destroy - .remove() on child", function( assert ) {
shouldDestroy( assert, false, function() {
2011-07-28 12:26:59 +00:00
$( "#widget" ).testWidget().children().remove();
2015-08-24 13:32:13 +00:00
} );
} );
2011-09-12 21:23:54 +00:00
2016-04-06 14:06:47 +00:00
QUnit.test( "auto-destroy - .empty()", function( assert ) {
shouldDestroy( assert, false, function() {
2011-07-28 12:26:59 +00:00
$( "#widget" ).testWidget().empty();
2015-08-24 13:32:13 +00:00
} );
} );
2011-09-12 21:23:54 +00:00
2016-04-06 14:06:47 +00:00
QUnit.test( "auto-destroy - .empty() on parent", function( assert ) {
shouldDestroy( assert, true, function() {
2011-07-28 12:26:59 +00:00
$( "#widget" ).testWidget().parent().empty();
2015-08-24 13:32:13 +00:00
} );
} );
2011-09-12 21:23:54 +00:00
2016-04-06 14:06:47 +00:00
QUnit.test( "auto-destroy - .detach()", function( assert ) {
shouldDestroy( assert, false, function() {
2011-07-28 12:26:59 +00:00
$( "#widget" ).testWidget().detach();
2015-08-24 13:32:13 +00:00
} );
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "destroy - remove event bubbling", function( assert ) {
shouldDestroy( assert, false, function() {
$( "<div>child</div>" ).appendTo( $( "#widget" ).testWidget() )
.trigger( "remove" );
2015-08-24 13:32:13 +00:00
} );
} );
} )();
2016-04-06 14:06:47 +00:00
QUnit.test( "redefine", function( assert ) {
assert.expect( 4 );
$.widget( "ui.testWidget", {
method: function( str ) {
2016-04-06 14:06:47 +00:00
assert.strictEqual( this, instance, "original invoked with correct this" );
assert.equal( str, "bar", "original invoked with correct parameter" );
}
2015-08-24 13:32:13 +00:00
} );
$.ui.testWidget.foo = "bar";
$.widget( "ui.testWidget", $.ui.testWidget, {
method: function( str ) {
2016-04-06 14:06:47 +00:00
assert.equal( str, "foo", "new invoked with correct parameter" );
this._super( "bar" );
}
2015-08-24 13:32:13 +00:00
} );
2015-08-24 13:32:13 +00:00
var instance = new $.ui.testWidget( {} );
instance.method( "foo" );
2016-04-06 14:06:47 +00:00
assert.equal( $.ui.testWidget.foo, "bar", "static properties remain" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "redefine deep prototype chain", function( assert ) {
assert.expect( 8 );
$.widget( "ui.testWidget", {
method: function( str ) {
2016-04-06 14:06:47 +00:00
assert.strictEqual( this, instance, "original invoked with correct this" );
assert.equal( str, "level 4", "original invoked with correct parameter" );
}
2015-08-24 13:32:13 +00:00
} );
$.widget( "ui.testWidget2", $.ui.testWidget, {
method: function( str ) {
2016-04-06 14:06:47 +00:00
assert.strictEqual( this, instance, "testWidget2 invoked with correct this" );
assert.equal( str, "level 2", "testWidget2 invoked with correct parameter" );
this._super( "level 3" );
}
2015-08-24 13:32:13 +00:00
} );
$.widget( "ui.testWidget3", $.ui.testWidget2, {
method: function( str ) {
2016-04-06 14:06:47 +00:00
assert.strictEqual( this, instance, "testWidget3 invoked with correct this" );
assert.equal( str, "level 1", "testWidget3 invoked with correct parameter" );
this._super( "level 2" );
}
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
// Redefine testWidget after other widgets have inherited from it
// this tests whether the inheriting widgets get updated prototype chains
$.widget( "ui.testWidget", $.ui.testWidget, {
method: function( str ) {
2016-04-06 14:06:47 +00:00
assert.strictEqual( this, instance, "new invoked with correct this" );
assert.equal( str, "level 3", "new invoked with correct parameter" );
this._super( "level 4" );
}
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
// Redefine testWidget3 after it has been automatically redefined
// this tests whether we properly handle _super() when the topmost prototype
// doesn't have the method defined
$.widget( "ui.testWidget3", $.ui.testWidget3, {} );
2015-08-24 13:32:13 +00:00
var instance = new $.ui.testWidget3( {} );
instance.method( "level 1" );
delete $.ui.testWidget3;
2015-05-13 18:58:39 +00:00
delete $.fn.testWidget3;
delete $.ui.testWidget2;
2015-05-13 18:58:39 +00:00
delete $.fn.testWidget2;
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "redefine - widgetEventPrefix", function( assert ) {
assert.expect( 2 );
$.widget( "ui.testWidget", {
widgetEventPrefix: "test"
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
assert.equal( $.ui.testWidget.prototype.widgetEventPrefix, "test",
"cusotm prefix in original" );
$.widget( "ui.testWidget", $.ui.testWidget, {} );
2016-04-06 14:06:47 +00:00
assert.equal( $.ui.testWidget.prototype.widgetEventPrefix, "test",
"cusotm prefix in extension" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "mixins", function( assert ) {
assert.expect( 2 );
var mixin = {
method: function() {
return "mixed " + this._super();
}
};
$.widget( "ui.testWidget1", {
method: function() {
return "testWidget1";
}
2015-08-24 13:32:13 +00:00
} );
$.widget( "ui.testWidget2", {
method: function() {
return "testWidget2";
}
2015-08-24 13:32:13 +00:00
} );
$.widget( "ui.testWidget1", $.ui.testWidget1, mixin );
$.widget( "ui.testWidget2", $.ui.testWidget2, mixin );
2016-04-06 14:06:47 +00:00
assert.equal( $( "<div>" ).testWidget1().testWidget1( "method" ),
"mixed testWidget1", "testWidget1 mixin successful" );
2016-04-06 14:06:47 +00:00
assert.equal( $( "<div>" ).testWidget2().testWidget2( "method" ),
"mixed testWidget2", "testWidget2 mixin successful" );
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "_delay", function( assert ) {
var ready = assert.async();
assert.expect( 6 );
var order = 0,
that;
$.widget( "ui.testWidget", {
defaultElement: null,
_create: function() {
that = this;
2015-08-24 13:32:13 +00:00
var timer = this._delay( function() {
2016-04-06 14:06:47 +00:00
assert.strictEqual( this, that );
assert.equal( order, 1 );
ready();
2015-08-24 13:32:13 +00:00
}, 500 );
2016-04-06 14:06:47 +00:00
assert.ok( timer !== undefined );
2015-08-24 13:32:13 +00:00
timer = this._delay( "callback" );
2016-04-06 14:06:47 +00:00
assert.ok( timer !== undefined );
},
callback: function() {
2016-04-06 14:06:47 +00:00
assert.strictEqual( this, that );
assert.equal( order, 0 );
order += 1;
}
2015-08-24 13:32:13 +00:00
} );
$( "#widget" ).testWidget();
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "$.widget.bridge()", function( assert ) {
assert.expect( 14 );
var instance, ret,
elem = $( "<div>" );
function TestWidget( options, element ) {
2016-04-06 14:06:47 +00:00
assert.deepEqual( options, { foo: "bar" }, "options passed" );
assert.strictEqual( element, elem[ 0 ], "element passed" );
}
$.extend( TestWidget.prototype, {
method: function( param ) {
2016-04-06 14:06:47 +00:00
assert.ok( true, "method called via .pluginName(methodName)" );
assert.equal( param, "value1",
"parameter passed via .pluginName(methodName, param)" );
},
getter: function() {
return "qux";
},
option: function( options ) {
2016-04-06 14:06:47 +00:00
assert.deepEqual( options, {} );
}
2015-08-24 13:32:13 +00:00
} );
$.widget.bridge( "testWidget", TestWidget );
assert.ok( typeof $.fn.testWidget === "function", "jQuery plugin was created" );
2016-04-06 14:06:47 +00:00
assert.strictEqual( elem.testWidget( { foo: "bar" } ), elem, "plugin returns original jQuery object" );
instance = elem.data( "testWidget" );
2016-04-06 14:06:47 +00:00
assert.equal( typeof instance, "object", "instance stored in .data(pluginName)" );
assert.equal( typeof elem.testWidget( "instance" ), "object", "also retrievable via instance method" );
ret = elem.testWidget( "method", "value1" );
2016-04-06 14:06:47 +00:00
assert.equal( ret, elem, "jQuery object returned from method call" );
ret = elem.testWidget( "getter" );
2016-04-06 14:06:47 +00:00
assert.equal( ret, "qux", "getter returns value" );
elem.testWidget();
2016-04-06 14:06:47 +00:00
assert.ok( true, "_init is optional" );
TestWidget.prototype._init = function() {
2016-04-06 14:06:47 +00:00
assert.ok( "_init", "_init now exists, so its called" );
};
elem.testWidget();
2015-08-24 13:32:13 +00:00
} );
2016-04-06 14:06:47 +00:00
QUnit.test( "$.widget.bridge() - widgetFullName", function( assert ) {
assert.expect( 1 );
var instance,
elem = $( "<div>" );
function TestWidget() {}
TestWidget.prototype.widgetFullName = "custom-widget";
$.widget.bridge( "testWidget", TestWidget );
elem.testWidget();
instance = elem.data( "custom-widget" );
2016-04-06 14:06:47 +00:00
assert.equal( typeof instance, "object", "instance stored in .data(widgetFullName)" );
2015-08-24 13:32:13 +00:00
} );
} );