text: module( "placement" );
  
  test( "elements() order", function() {
  	var container = $( "#orderContainer" ),
  		v = $( "#elementsOrder" ).validate({
  			errorLabelContainer: container,
  			wrap: "li"
  		});
  
  	deepEqual(
  		v.elements().map( function() {
  			return $( this ).attr( "id" );
  		}).get(),
  		[
  			"order1",
  			"order2",
  			"order3",
  			"order4",
  			"order5",
  			"order6"
  		],
  		"elements must be in document order"
  	);
  
  	v.form();
  	deepEqual(
  		container.children().map( function() {
  			return $( this ).attr( "id" );
  		}).get(),
  		[
  			"order1-error",
  			"order2-error",
  			"order3-error",
  			"order4-error",
  			"order5-error",
  			"order6-error"
  		],
  		"labels in error container must be in document order"
  	);
  });
  
  test( "error containers, simple", function() {
  	expect( 14 );
  	var container = $( "#simplecontainer" ),
  		v = $( "#form" ).validate({
  			errorLabelContainer: container,
  			showErrors: function() {
  				container.find( "h3" ).html( jQuery.validator.format( "There are {0} errors in your form.", this.size()) );
  				this.defaultShowErrors();
  			}
  		});
  
  	v.prepareForm();
  	ok( v.valid(), "form is valid" );
  	equal( 0, container.find( ".error:not(input)" ).length, "There should be no error labels" );
  	equal( "", container.find( "h3" ).html() );
  
  	v.prepareForm();
  	v.errorList = [
  		{
  			message: "bar",
  			element: {
  				name: "foo"
  			}
  		},
  		{
  			message: "necessary",
  			element: {
  				name: "required"
  			}
  		}
  	];
  
  	ok( !v.valid(), "form is not valid after adding errors manually" );
  	v.showErrors();
  	equal( container.find( ".error:not(input)" ).length, 2, "There should be two error labels" );
  	ok( container.is( ":visible" ), "Check that the container is visible" );
  	container.find( ".error:not(input)" ).each(function() {
  		ok( $( this ).is( ":visible" ), "Check that each label is visible" );
  	});
  	equal( "There are 2 errors in your form.", container.find( "h3" ).html() );
  
  	v.prepareForm();
  	ok( v.valid(), "form is valid after a reset" );
  	v.showErrors();
  	equal( container.find( ".error:not(input)" ).length, 2, "There should still be two error labels" );
  	ok( container.is( ":hidden" ), "Check that the container is hidden" );
  	container.find( ".error:not(input)" ).each(function() {
  		ok( $( this ).is( ":hidden" ), "Check that each label is hidden" );
  	});
  });
  
  test( "error containers, with labelcontainer I", function() {
  	expect( 16 );
  	var container = $( "#container" ),
  		labelcontainer = $( "#labelcontainer" ),
  		v = $( "#form" ).validate({
  			errorContainer: container,
  			errorLabelContainer: labelcontainer,
  			wrapper: "li"
  		});
  
  	ok( v.valid(), "form is valid" );
  	equal( 0, container.find( ".error:not(input)" ).length, "There should be no error labels in the container" );
  	equal( 0, labelcontainer.find( ".error:not(input)" ).length, "There should be no error labels in the labelcontainer" );
  	equal( 0, labelcontainer.find( "li" ).length, "There should be no lis labels in the labelcontainer" );
  
  	v.errorList = [
  		{
  			message: "bar",
  			element: {
  				name: "foo"
  			}
  		},
  		{
  			name: "required",
  			message: "necessary",
  			element: {
  				name: "required"
  			}
  		}
  	];
  
  	ok( !v.valid(), "form is not valid after adding errors manually" );
  	v.showErrors();
  	equal( 0, container.find( ".error:not(input)" ).length, "There should be no error label in the container" );
  	equal( 2, labelcontainer.find( ".error:not(input)" ).length, "There should be two error labels in the labelcontainer" );
  	equal( 2, labelcontainer.find( "li" ).length, "There should be two error lis in the labelcontainer" );
  	ok( container.is( ":visible" ), "Check that the container is visible" );
  	ok( labelcontainer.is( ":visible" ), "Check that the labelcontainer is visible" );
  	labelcontainer.find( ".error:not(input)" ).each(function() {
  		ok( $( this ).is( ":visible" ), "Check that each label is visible1" );
  		equal( "li", $( this ).parent()[0].tagName.toLowerCase(), "Check that each label is wrapped in an li" );
  		ok( $( this ).parent( "li" ).is( ":visible" ), "Check that each parent li is visible" );
  	});
  });
  
  test( "errorcontainer, show/hide only on submit", function() {
  	expect( 14 );
  	var container = $( "#container" ),
  		labelContainer = $( "#labelcontainer" ),
  		v = $( "#testForm1" ).bind( "invalid-form.validate", function() {
  			ok( true, "invalid-form event triggered called" );
  		}).validate({
  			errorContainer: container,
  			errorLabelContainer: labelContainer,
  			showErrors: function() {
  				container.html( jQuery.validator.format( "There are {0} errors in your form.", this.numberOfInvalids()) );
  				ok( true, "showErrors called" );
  				this.defaultShowErrors();
  			}
  		});
  
  	equal( "", container.html(), "must be empty" );
  	equal( "", labelContainer.html(), "must be empty" );
  	// validate whole form, both showErrors and invalidHandler must be called once
  	// preferably invalidHandler first, showErrors second
  	ok( !v.form(), "invalid form" );
  	equal( 2, labelContainer.find( ".error:not(input)" ).length );
  	equal( "There are 2 errors in your form.", container.html() );
  	ok( labelContainer.is( ":visible" ), "must be visible" );
  	ok( container.is( ":visible" ), "must be visible" );
  
  	$( "#firstname" ).val( "hix" ).keyup();
  	$( "#testForm1" ).triggerHandler( "keyup", [
  			jQuery.event.fix({
  				type: "keyup",
  				target: $( "#firstname" )[ 0 ]
  			})
  		]);
  	equal( 1, labelContainer.find( ".error:visible" ).length );
  	equal( "There are 1 errors in your form.", container.html() );
  
  	$( "#lastname" ).val( "abc" );
  	ok( v.form(), "Form now valid, trigger showErrors but not invalid-form" );
  });
  
  test( "test label used as error container", function(assert) {
  	expect( 8 );
  	var form = $( "#testForm16" ),
  		field = $( "#testForm16text" );
  
  	form.validate({
  		errorPlacement: function( error, element ) {
  			// Append error within linked label
  			$( "label[for='" + element.attr( "id" ) + "']" ).append( error );
  		},
  		errorElement: "span"
  	});
  
  	ok( !field.valid() );
  	equal( "Field Label", field.next( "label" ).contents().first().text(), "container label isn't disrupted" );
  	assert.hasError(field, "missing");
  	ok( !field.attr( "aria-describedby" ), "field does not require aria-describedby attribute" );
  
  	field.val( "foo" );
  	ok( field.valid() );
  	equal( "Field Label", field.next( "label" ).contents().first().text(), "container label isn't disrupted" );
  	ok( !field.attr( "aria-describedby" ), "field does not require aria-describedby attribute" );
  	assert.noErrorFor(field);
  });
  
  test( "test error placed adjacent to descriptive label", function(assert) {
  	expect( 8 );
  	var form = $( "#testForm16" ),
  		field = $( "#testForm16text" );
  
  	form.validate({
  		errorElement: "span"
  	});
  
  	ok( !field.valid() );
  	equal( 1, form.find( "label" ).length );
  	equal( "Field Label", form.find( "label" ).text(), "container label isn't disrupted" );
  	assert.hasError( field, "missing" );
  
  	field.val( "foo" );
  	ok( field.valid() );
  	equal( 1, form.find( "label" ).length );
  	equal( "Field Label", form.find( "label" ).text(), "container label isn't disrupted" );
  	assert.noErrorFor( field );
  });
  
  test( "test descriptive label used alongside error label", function(assert) {
  	expect( 8 );
  	var form = $( "#testForm16" ),
  		field = $( "#testForm16text" );
  
  	form.validate({
  		errorElement: "label"
  	});
  
  	ok( !field.valid() );
  	equal( 1, form.find( "label.title" ).length );
  	equal( "Field Label", form.find( "label.title" ).text(), "container label isn't disrupted" );
  	assert.hasError( field, "missing" );
  
  	field.val( "foo" );
  	ok( field.valid() );
  	equal( 1, form.find( "label.title" ).length );
  	equal( "Field Label", form.find( "label.title" ).text(), "container label isn't disrupted" );
  	assert.noErrorFor( field );
  });
  
  test( "test custom errorElement", function(assert) {
  	expect( 4 );
  	var form = $( "#userForm" ),
  		field = $( "#username" );
  
  	form.validate({
  		messages: {
  			username: "missing"
  		},
  		errorElement: "label"
  	});
  
  	ok( !field.valid() );
  	assert.hasError( field, "missing", "Field should have error 'missing'" );
  	field.val( "foo" );
  	ok( field.valid() );
  	assert.noErrorFor( field, "Field should not have a visible error" );
  });
  
  test( "test existing label used as error element", function(assert) {
  	expect( 4 );
  	var form = $( "#testForm14" ),
  		field = $( "#testForm14text" );
  
  	form.validate({ errorElement: "label" });
  
  	ok( !field.valid() );
  	assert.hasError( field, "required" );
  
  	field.val( "foo" );
  	ok( field.valid() );
  	assert.noErrorFor( field );
  });
  
  test( "test existing non-label used as error element", function(assert) {
  	expect( 4 );
  	var form = $( "#testForm15" ),
  		field = $( "#testForm15text" );
  
  	form.validate({ errorElement: "span" });
  
  	ok( !field.valid() );
  	assert.hasError( field, "required" );
  
  	field.val( "foo" );
  	ok( field.valid() );
  	assert.noErrorFor( field );
  });
  
  test( "test existing non-error aria-describedby", function( assert ) {
  	expect( 8 );
  	var form = $( "#testForm17" ),
  		field = $( "#testForm17text" );
  
  	equal( field.attr( "aria-describedby" ), "testForm17text-description" );
  	form.validate({ errorElement: "span" });
  
  	ok( !field.valid() );
  	equal( field.attr( "aria-describedby" ), "testForm17text-description testForm17text-error" );
  	assert.hasError( field, "required" );
  
  	field.val( "foo" );
  	ok( field.valid() );
  	assert.noErrorFor( field );
  
  	strictEqual( "This is where you enter your data", $("#testForm17text-description").text() );
  	strictEqual( "", $("#testForm17text-error").text(), "Error label is empty for valid field" );
  });
  
  test( "test pre-assigned non-error aria-describedby", function( assert ) {
  	expect( 7 );
  	var form = $( "#testForm17" ),
  		field = $( "#testForm17text" );
  
  	// Pre-assign error identifier
  	field.attr( "aria-describedby", "testForm17text-description testForm17text-error" );
  	form.validate({ errorElement: "span" });
  
  	ok( !field.valid() );
  	equal( field.attr( "aria-describedby" ), "testForm17text-description testForm17text-error" );
  	assert.hasError( field, "required" );
  
  	field.val( "foo" );
  	ok( field.valid() );
  	assert.noErrorFor( field );
  
  	strictEqual( "This is where you enter your data", $("#testForm17text-description").text() );
  	strictEqual( "", $("#testForm17text-error").text(), "Error label is empty for valid field" );
  });
  
  test( "test id/name containing brackets", function( assert ) {
  	var form = $( "#testForm18" ),
  		field = $( "#testForm18\\[text\\]" );
  
  	form.validate({
  		errorElement: "span"
  	});
  
  	form.valid();
  	field.valid();
  	assert.hasError( field, "required" );
  });
  