define( [
	"qunit",
	"jquery",
	"lib/common",
	"lib/helper",
	"ui/widget",
	"ui/form-reset-mixin"
], function( QUnit, $, common, helper ) {
"use strict";

QUnit.module( "widget factory", {
	beforeEach: function() {
		$.widget( "ui.testWidget", [ $.ui.formResetMixin, {
			_create: function() {
				this._bindFormResetHandler();
			},
			_destroy: function() {
				this._unbindFormResetHandler();
			},
			refresh: function() {
				$.ui.testWidget.refreshed.push( this.element.attr( "id" ) );
			}
		} ] );

		$.ui.testWidget.refreshed = [];
	},

	afterEach: function() {
		delete $.ui.testWidget;
		delete $.fn.testWidget;
		return helper.moduleAfterEach.apply( this, arguments );
	}
} );

QUnit.test( "form reset", function( assert ) {
	var ready = assert.async();
	assert.expect( 2 );

	var form = $( "#main" );
	var inputs = form.find( "input" );

	inputs.testWidget();
	form.on( "reset", function() {
		setTimeout( function() {
			assert.deepEqual( $.ui.testWidget.refreshed, [ "input1", "input2", "input3", "input4" ],
				"All widgets are refreshed on form reset" );
			assert.equal( form.data( "ui-form-reset-instances" ).length, 4,
				"All widget instances are tracked against the form" );
			ready();
		} );
	} );
	form[ 0 ].reset();
} );

QUnit.test( "destroy", function( assert ) {
	var ready = assert.async();
	assert.expect( 2 );

	var form = $( "#main" );
	var inputs = form.find( "input" );

	inputs
		.testWidget()
		.eq( 1 )
			.testWidget( "destroy" );

	form.on( "reset", function() {
		setTimeout( function() {
			assert.deepEqual( $.ui.testWidget.refreshed, [ "input1", "input3", "input4" ],
				"All widgets are refreshed on form reset" );
			assert.deepEqual( form.data( "ui-form-reset-instances" ).length, 3,
				"All widget instances are tracked against the form" );
			ready();
		} );
	} );
	form[ 0 ].reset();
} );

QUnit.test( "destroy all", function( assert ) {
	var ready = assert.async();
	assert.expect( 2 );

	var form = $( "#main" );

	form.find( "input" )
		.testWidget()
		.testWidget( "destroy" );

	form.on( "reset", function() {
		setTimeout( function() {
			assert.deepEqual( $.ui.testWidget.refreshed, [], "No widgets are refreshed after destroy" );
			assert.strictEqual( form.data( "ui-form-reset-instances" ), undefined,
				"Form data is removed when the last widget instance is destroyed" );
			ready();
		} );
	} );
	form[ 0 ].reset();
} );

} );
