/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
test( "testValidateNoHtmlTags", function() {
    expect(4);
    equal($.validator.methods['validate-no-html-tags'].call(this, ""),true);
    equal($.validator.methods['validate-no-html-tags'].call(this, null),true);
    equal($.validator.methods['validate-no-html-tags'].call(this, "abc"),true);
    equal($.validator.methods['validate-no-html-tags'].call(this, "<div>abc</div>"),false);

});

test( "testAllowContainerClassName", function() {
    expect(4);
    var radio = $('<input type="radio" class="change-container-classname"/>');
    radio.appendTo("#qunit-fixture");
    equal($.validator.methods['allow-container-className'].call(this, radio[0]),true);
    var checkbox = $('<input type="checkbox" class="change-container-classname"/>');
    equal($.validator.methods['allow-container-className'].call(this, checkbox[0]),true);
    var radio2 = $('<input type="radio"/>');
    equal($.validator.methods['allow-container-className'].call(this, radio2[0]),false);
    var checkbox2 = $('<input type="checkbox"/>');
    equal($.validator.methods['allow-container-className'].call(this, checkbox2[0]),false);
});

test( "testValidateSelect", function() {
    expect(5);
    equal($.validator.methods['validate-select'].call(this, ""),false);
    equal($.validator.methods['validate-select'].call(this, "none"),false);
    equal($.validator.methods['validate-select'].call(this, null),false);
    equal($.validator.methods['validate-select'].call(this, undefined),false);
    equal($.validator.methods['validate-select'].call(this, "abc"),true);
});

test( "testValidateNotEmpty", function() {
    expect(5);
    ok(!$.validator.methods['validate-no-empty'].call(this, ""));
    ok(!$.validator.methods['validate-no-empty'].call(this, null));
    ok(!$.validator.methods['validate-no-empty'].call(this, undefined));
    ok(!$.validator.methods['validate-no-empty'].call(this, "   "));
    ok($.validator.methods['validate-no-empty'].call(this, "test"));
});

test( "testValidateStreet", function() {
    expect(9);
    equal($.validator.methods['validate-alphanum-with-spaces'].call(this, ""),true);
    equal($.validator.methods['validate-alphanum-with-spaces'].call(this, null),true);
    equal($.validator.methods['validate-alphanum-with-spaces'].call(this, undefined),true);
    equal($.validator.methods['validate-alphanum-with-spaces'].call(this, "   "),true);
    equal($.validator.methods['validate-alphanum-with-spaces'].call(this, "abc   "),true);
    equal($.validator.methods['validate-alphanum-with-spaces'].call(this, " 123  "),true);
    equal($.validator.methods['validate-alphanum-with-spaces'].call(this, "  abc123 "),true);
    equal($.validator.methods['validate-alphanum-with-spaces'].call(this, "  !@# "),false);
    equal($.validator.methods['validate-alphanum-with-spaces'].call(this, "  abc.123 "),false);
});

test( "testValidatePhoneStrict", function() {
    expect(9);
    equal($.validator.methods['validate-phoneStrict'].call(this, ""),true);
    equal($.validator.methods['validate-phoneStrict'].call(this, null),true);
    equal($.validator.methods['validate-phoneStrict'].call(this, undefined),true);
    equal($.validator.methods['validate-phoneStrict'].call(this, "   "),false);
    equal($.validator.methods['validate-phoneStrict'].call(this, "5121231234"),false);
    equal($.validator.methods['validate-phoneStrict'].call(this, "512.123.1234"),false);
    equal($.validator.methods['validate-phoneStrict'].call(this, "512-123-1234"),true);
    equal($.validator.methods['validate-phoneStrict'].call(this, "(512)123-1234"),true);
    equal($.validator.methods['validate-phoneStrict'].call(this, "(512) 123-1234"),true);
});

test( "testValidatePhoneLax", function() {
    expect(11);
    equal($.validator.methods['validate-phoneLax'].call(this, ""),true);
    equal($.validator.methods['validate-phoneLax'].call(this, null),true);
    equal($.validator.methods['validate-phoneLax'].call(this, undefined),true);
    equal($.validator.methods['validate-phoneLax'].call(this, "   "),false);
    equal($.validator.methods['validate-phoneLax'].call(this, "5121231234"),true);
    equal($.validator.methods['validate-phoneLax'].call(this, "512.123.1234"),true);
    equal($.validator.methods['validate-phoneLax'].call(this, "512-123-1234"),true);
    equal($.validator.methods['validate-phoneLax'].call(this, "(512)123-1234"),true);
    equal($.validator.methods['validate-phoneLax'].call(this, "(512) 123-1234"),true);
    equal($.validator.methods['validate-phoneLax'].call(this, "(512)1231234"),true);
    equal($.validator.methods['validate-phoneLax'].call(this, "(512)_123_1234"),false);
});

test( "testValidateFax", function() {
    expect(9);
    equal($.validator.methods['validate-fax'].call(this, ""),true);
    equal($.validator.methods['validate-fax'].call(this, null),true);
    equal($.validator.methods['validate-fax'].call(this, undefined),true);
    equal($.validator.methods['validate-fax'].call(this, "   "),false);
    equal($.validator.methods['validate-fax'].call(this, "5121231234"),false);
    equal($.validator.methods['validate-fax'].call(this, "512.123.1234"),false);
    equal($.validator.methods['validate-fax'].call(this, "512-123-1234"),true);
    equal($.validator.methods['validate-fax'].call(this, "(512)123-1234"),true);
    equal($.validator.methods['validate-fax'].call(this, "(512) 123-1234"),true);
});

test( "testValidateEmail", function() {
    expect(11);
    equal($.validator.methods['validate-email'].call(this, ""),true);
    equal($.validator.methods['validate-email'].call(this, null),true);
    equal($.validator.methods['validate-email'].call(this, undefined),true);
    equal($.validator.methods['validate-email'].call(this, "   "),false);
    equal($.validator.methods['validate-email'].call(this, "123@123.com"),true);
    equal($.validator.methods['validate-email'].call(this, "abc@124.en"),true);
    equal($.validator.methods['validate-email'].call(this, "abc@abc.commmmm"),true);
    equal($.validator.methods['validate-email'].call(this, "abc.abc.abc@abc.commmmm"),true);
    equal($.validator.methods['validate-email'].call(this, "abc.abc-abc@abc.commmmm"),true);
    equal($.validator.methods['validate-email'].call(this, "abc.abc_abc@abc.commmmm"),true);
    equal($.validator.methods['validate-email'].call(this, "abc.abc_abc@abc"),false);
});

test( "testValidateEmailSender", function() {
    expect(10);
    equal($.validator.methods['validate-emailSender'].call(this, ""),true);
    equal($.validator.methods['validate-emailSender'].call(null),true);
    equal($.validator.methods['validate-emailSender'].call(undefined),true);
    equal($.validator.methods['validate-emailSender'].call("   "),true);
    equal($.validator.methods['validate-emailSender'].call("123@123.com"),true);
    equal($.validator.methods['validate-emailSender'].call("abc@124.en"),true);
    equal($.validator.methods['validate-emailSender'].call("abc@abc.commmmm"),true);
    equal($.validator.methods['validate-emailSender'].call("abc.abc.abc@abc.commmmm"),true);
    equal($.validator.methods['validate-emailSender'].call("abc.abc-abc@abc.commmmm"),true);
    equal($.validator.methods['validate-emailSender'].call("abc.abc_abc@abc.commmmm"),true);
});

test( "testValidatePassword", function() {
    expect(9);
    equal($.validator.methods['validate-password'].call(this, ""),true);
    equal($.validator.methods['validate-password'].call(this, null),false);
    equal($.validator.methods['validate-password'].call(this, undefined),false);
    equal($.validator.methods['validate-password'].call(this, "   "),true);
    equal($.validator.methods['validate-password'].call(this, "123@123.com"),true);
    equal($.validator.methods['validate-password'].call(this, "abc"),false);
    equal($.validator.methods['validate-password'].call(this, "abc       "),false);
    equal($.validator.methods['validate-password'].call(this, "     abc      "),false);
    equal($.validator.methods['validate-password'].call(this, "dddd"),false);
});

test( "testValidateAdminPassword", function() {
    expect(9);
    equal(true, $.validator.methods['validate-admin-password'].call(this, ""));
    equal(false, $.validator.methods['validate-admin-password'].call(this, null));
    equal(false, $.validator.methods['validate-admin-password'].call(this, undefined));
    equal(true, $.validator.methods['validate-admin-password'].call(this, "   "));
    equal(true, $.validator.methods['validate-admin-password'].call(this, "123@123.com"));
    equal(false, $.validator.methods['validate-admin-password'].call(this, "abc"));
    equal(false, $.validator.methods['validate-admin-password'].call(this, "abc       "));
    equal(false, $.validator.methods['validate-admin-password'].call(this, "     abc      "));
    equal(false, $.validator.methods['validate-admin-password'].call(this, "dddd"));
});

test( "testValidateUrl", function() {
    expect(8);
    equal(true, $.validator.methods['validate-url'].call(this, ""));
    equal(true, $.validator.methods['validate-url'].call(this, null));
    equal(true, $.validator.methods['validate-url'].call(this, undefined));
    equal(false, $.validator.methods['validate-url'].call(this, "   "));
    equal(true, $.validator.methods['validate-url'].call(this, "http://www.google.com"));
    equal(true, $.validator.methods['validate-url'].call(this, "http://127.0.0.1:8080/index.php"));
    equal(true, $.validator.methods['validate-url'].call(this, "http://app-spot.com/index.php"));
    equal(true, $.validator.methods['validate-url'].call(this, "http://app-spot_space.com/index.php"));
});

test( "testValidateCleanUrl", function() {
    expect(8);
    equal(true, $.validator.methods['validate-clean-url'].call(this, ""));
    equal(true, $.validator.methods['validate-clean-url'].call(this, null));
    equal(true, $.validator.methods['validate-clean-url'].call(this, undefined));
    equal(false, $.validator.methods['validate-clean-url'].call(this, "   "));
    equal(true, $.validator.methods['validate-clean-url'].call(this, "http://www.google.com"));
    equal(false, $.validator.methods['validate-clean-url'].call(this, "http://127.0.0.1:8080/index.php"));
    equal(false, $.validator.methods['validate-clean-url'].call(this, "http://127.0.0.1:8080"));
    equal(false, $.validator.methods['validate-clean-url'].call(this, "http://127.0.0.1"));
});

test( "testValidateXmlIdentifier", function() {
    expect(8);
    equal(true, $.validator.methods['validate-xml-identifier'].call(this, ""));
    equal(true, $.validator.methods['validate-xml-identifier'].call(this, null));
    equal(true, $.validator.methods['validate-xml-identifier'].call(this, undefined));
    equal(false, $.validator.methods['validate-xml-identifier'].call(this, "   "));
    equal(true, $.validator.methods['validate-xml-identifier'].call(this, "abc"));
    equal(true, $.validator.methods['validate-xml-identifier'].call(this, "abc_123"));
    equal(true, $.validator.methods['validate-xml-identifier'].call(this, "abc-123"));
    equal(false, $.validator.methods['validate-xml-identifier'].call(this, "123-abc"));
});

test( "testValidateSsn", function() {
    expect(8);
    equal(true, $.validator.methods['validate-ssn'].call(this, ""));
    equal(true, $.validator.methods['validate-ssn'].call(this, null));
    equal(true, $.validator.methods['validate-ssn'].call(this, undefined));
    equal(false, $.validator.methods['validate-ssn'].call(this, "   "));
    equal(false, $.validator.methods['validate-ssn'].call(this, "abc"));
    equal(true, $.validator.methods['validate-ssn'].call(this, "123-13-1234"));
    equal(true, $.validator.methods['validate-ssn'].call(this, "012-12-1234"));
    equal(false, $.validator.methods['validate-ssn'].call(this, "23-12-1234"));
});

test( "testValidateZip", function() {
    expect(8);
    equal(true, $.validator.methods['validate-zip-us'].call(this, ""));
    equal(true, $.validator.methods['validate-zip-us'].call(this, null));
    equal(true, $.validator.methods['validate-zip-us'].call(this, undefined));
    equal(false, $.validator.methods['validate-zip-us'].call(this, "   "));
    equal(true, $.validator.methods['validate-zip-us'].call(this, "12345-1234"));
    equal(true, $.validator.methods['validate-zip-us'].call(this, "02345"));
    equal(false, $.validator.methods['validate-zip-us'].call(this, "1234"));
    equal(false, $.validator.methods['validate-zip-us'].call(this, "1234-1234"));
});

test( "testValidateDateAu", function() {
    expect(8);
    equal(true, $.validator.methods['validate-date-au'].call(this, ""));
    equal(true, $.validator.methods['validate-date-au'].call(this, null));
    equal(true, $.validator.methods['validate-date-au'].call(this, undefined));
    equal(false, $.validator.methods['validate-date-au'].call(this, "   "));
    equal(true, $.validator.methods['validate-date-au'].call(this, "01/01/2012"));
    equal(true, $.validator.methods['validate-date-au'].call(this, "30/01/2012"));
    equal(false, $.validator.methods['validate-date-au'].call(this, "01/30/2012"));
    equal(false, $.validator.methods['validate-date-au'].call(this, "1/1/2012"));
});

test( "testValidateCurrencyDollar", function() {
    expect(8);
    equal(true, $.validator.methods['validate-currency-dollar'].call(this, ""));
    equal(true, $.validator.methods['validate-currency-dollar'].call(this, null));
    equal(true, $.validator.methods['validate-currency-dollar'].call(this, undefined));
    equal(false, $.validator.methods['validate-currency-dollar'].call(this, "   "));
    equal(true, $.validator.methods['validate-currency-dollar'].call(this, "$123"));
    equal(true, $.validator.methods['validate-currency-dollar'].call(this, "$1,123.00"));
    equal(true, $.validator.methods['validate-currency-dollar'].call(this, "$1234"));
    equal(false, $.validator.methods['validate-currency-dollar'].call(this, "$1234.1234"));
});

test( "testValidateNotNegativeNumber", function() {
    expect(11);
    equal(true, $.validator.methods['validate-not-negative-number'].call(this, ""));
    equal(true, $.validator.methods['validate-not-negative-number'].call(this, null));
    equal(true, $.validator.methods['validate-not-negative-number'].call(this, undefined));
    equal(false, $.validator.methods['validate-not-negative-number'].call(this, "   "));
    equal(true, $.validator.methods['validate-not-negative-number'].call(this, "0"));
    equal(true, $.validator.methods['validate-not-negative-number'].call(this, "1"));
    equal(true, $.validator.methods['validate-not-negative-number'].call(this, "1234"));
    equal(true, $.validator.methods['validate-not-negative-number'].call(this, "1,234.1234"));
    equal(false, $.validator.methods['validate-not-negative-number'].call(this, "-1"));
    equal(false, $.validator.methods['validate-not-negative-number'].call(this, "-1e"));
    equal(false, $.validator.methods['validate-not-negative-number'].call(this, "-1,234.1234"));
});

test( "testValidateGreaterThanZero", function() {
    expect(11);
    equal(true, $.validator.methods['validate-greater-than-zero'].call(this, ""));
    equal(true, $.validator.methods['validate-greater-than-zero'].call(this, null));
    equal(true, $.validator.methods['validate-greater-than-zero'].call(this, undefined));
    equal(false, $.validator.methods['validate-greater-than-zero'].call(this, "   "));
    equal(false, $.validator.methods['validate-greater-than-zero'].call(this, "0"));
    equal(true, $.validator.methods['validate-greater-than-zero'].call(this, "1"));
    equal(true, $.validator.methods['validate-greater-than-zero'].call(this, "1234"));
    equal(true, $.validator.methods['validate-greater-than-zero'].call(this, "1,234.1234"));
    equal(false, $.validator.methods['validate-greater-than-zero'].call(this, "-1"));
    equal(false, $.validator.methods['validate-greater-than-zero'].call(this, "-1e"));
    equal(false, $.validator.methods['validate-greater-than-zero'].call(this, "-1,234.1234"));
});

test( "testValidateCssLength", function() {
    expect(11);
    equal(true, $.validator.methods['validate-css-length'].call(this, ""));
    equal(true, $.validator.methods['validate-css-length'].call(this, null));
    equal(true, $.validator.methods['validate-css-length'].call(this, undefined));
    equal(false, $.validator.methods['validate-css-length'].call(this, "   "));
    equal(false, $.validator.methods['validate-css-length'].call(this, "0"));
    equal(true, $.validator.methods['validate-css-length'].call(this, "1"));
    equal(true, $.validator.methods['validate-css-length'].call(this, "1234"));
    equal(true, $.validator.methods['validate-css-length'].call(this, "1,234.1234"));
    equal(false, $.validator.methods['validate-css-length'].call(this, "-1"));
    equal(false, $.validator.methods['validate-css-length'].call(this, "-1e"));
    equal(false, $.validator.methods['validate-css-length'].call(this, "-1,234.1234"));
});

test( "testValidateData", function() {
    expect(9);
    equal(true, $.validator.methods['validate-data'].call(this, ""));
    equal(true, $.validator.methods['validate-data'].call(this, null));
    equal(true, $.validator.methods['validate-data'].call(this, undefined));
    equal(false, $.validator.methods['validate-data'].call(this, "   "));
    equal(false, $.validator.methods['validate-data'].call(this, "123abc"));
    equal(true, $.validator.methods['validate-data'].call(this, "abc"));
    equal(false, $.validator.methods['validate-data'].call(this, " abc"));
    equal(true, $.validator.methods['validate-data'].call(this, "abc123"));
    equal(false, $.validator.methods['validate-data'].call(this, "abc-123"));
});


test( "testValidateOneRequiredByName", function() {
    expect(4);
    var radio = $('<input type="radio" name="radio"/>');
    radio.appendTo("#qunit-fixture");
    ok(!$.validator.methods['validate-one-required-by-name'].call(this,
        null, radio[0]));
    var radio2 = $('<input type="radio" name="radio" checked/>');
    radio2.appendTo("#qunit-fixture");
    ok($.validator.methods['validate-one-required-by-name'].call(this,
        null, radio2[0]));

    var checkbox = $('<input type="checkbox" name="checkbox"/>');
    checkbox.appendTo("#qunit-fixture");
    ok(!$.validator.methods['validate-one-required-by-name'].call(this,
        null, checkbox[0]));
    var checkbox2 = $('<input type="checkbox" name="checkbox" checked/>');
    checkbox2.appendTo("#qunit-fixture");
    ok($.validator.methods['validate-one-required-by-name'].call(this,
        null, checkbox2[0]));
});

test( "testLessThanEqualsTo", function() {
    expect(5);
    var elm1 =  $('<input type="text" value=6 id="element1" />');
    var elm2 =  $('<input type="text" value=5 id="element2" />');
    ok(!$.validator.methods['less-than-equals-to'].call(this, elm1[0].value,
        elm1, elm2));
    elm1[0].value = 4;
    ok($.validator.methods['less-than-equals-to'].call(this, elm1[0].value,
        elm1, elm2));

    var elm3 =  $('<input type="text" id="element3" />');
    var elm4=  $('<input type="text" value=5 id="element4" />');
    ok($.validator.methods['less-than-equals-to'].call(this, elm3[0].value,
        elm3, elm4));

    var elm5 =  $('<input type="text" id="element6" />');
    var elm6=  $('<input type="text" value=6 id="element5" />');
    ok($.validator.methods['less-than-equals-to'].call(this, elm5[0].value,
        elm5, elm6));

    var elm7 =  $('<input type="text" value=20 id="element7" />');
    var elm8=  $('<input type="text" value=100 id="element8" />');
    ok($.validator.methods['less-than-equals-to'].call(this, elm7[0].value,
        elm7, elm8));
});

test( "testGreaterThanEqualsTo", function() {
    expect(5);

    var elm1 =  $('<input type="text" value=6 id="element1" />');
    var elm2 =  $('<input type="text" value=7 id="element2" />');
    ok(!$.validator.methods['greater-than-equals-to'].call(this, elm1[0].value,
        elm1, elm2));
    elm1[0].value = 9;
    ok($.validator.methods['greater-than-equals-to'].call(this, elm1[0].value,
        elm1, elm2));

    var elm3 =  $('<input type="text" id="element3" />');
    var elm4=  $('<input type="text" value=5 id="element4" />');
    ok($.validator.methods['greater-than-equals-to'].call(this, elm3[0].value,
        elm3, elm4));

    var elm5 =  $('<input type="text" id="element6" />');
    var elm6=  $('<input type="text" value=6 id="element5" />');
    ok($.validator.methods['greater-than-equals-to'].call(this, elm5[0].value,
        elm5, elm6));

    var elm7 =  $('<input type="text" value=100 id="element7" />');
    var elm8=  $('<input type="text" value=20 id="element8" />');
    ok($.validator.methods['greater-than-equals-to'].call(this, elm7[0].value,
        elm7, elm8));
});

test( "testValidateGroupedQty", function() {
    expect(5);
    var div1 = $('<div id="div1"/>');
    $('<input type="text"/>').attr("data-validate","{'validate-grouped-qty':'#super-product-table'}")
                             .appendTo(div1);
    $('<input type="text"/>').attr("data-validate","{'validate-grouped-qty':'#super-product-table'}")
                             .appendTo(div1);
    $('<input type="text"/>').appendTo(div1);

    ok(!$.validator.methods['validate-grouped-qty'].call(this, null, null, div1[0]));

    var div2 = $('<div id="div2"/>');
    $('<input type="text"/>').attr("data-validate","{'validate-grouped-qty':'#super-product-table'}")
        .appendTo(div2);
    $('<input type="text" value="a"/>').attr("data-validate","{'validate-grouped-qty':'#super-product-table'}")
        .appendTo(div2);
    $('<input type="text"/>').appendTo(div2);
    ok(!$.validator.methods['validate-grouped-qty'].call(this, null, null, div2[0]));

    var div3 = $('<div id="div3"/>');
    $('<input type="text"/>').attr("data-validate","{'validate-grouped-qty':'#super-product-table'}")
        .appendTo(div3);
    $('<input type="text" value="-6"/>').attr("data-validate","{'validate-grouped-qty':'#super-product-table'}")
        .appendTo(div3);
    $('<input type="text"/>').appendTo(div3);
    ok(!$.validator.methods['validate-grouped-qty'].call(this, null, null, div3[0]));

    var div4 = $('<div id="div4"/>');
    $('<input type="text"/>').attr("data-validate","{'validate-grouped-qty':'#super-product-table'}")
        .appendTo(div4);
    $('<input type="text" value="6"/>').attr("data-validate","{'validate-grouped-qty':'#super-product-table'}")
        .appendTo(div4);
    $('<input type="text"/>').appendTo(div4);
    ok($.validator.methods['validate-grouped-qty'].call(this, null, null, div4[0]));

    var div5 = $('<div id="div5"/>');
    $('<input type="text" value=""/>').attr("data-validate","{'validate-grouped-qty':'#super-product-table'}")
        .appendTo(div5);
    $('<input type="text" value="6"/>').attr("data-validate","{'validate-grouped-qty':'#super-product-table'}")
        .appendTo(div5);
    $('<input type="text"/>').appendTo(div5);
    ok($.validator.methods['validate-grouped-qty'].call(this, null, null, div5[0]));

});

test( "testValidateCCTypeSelect", function() {
    expect(14);
     var visaValid = $('<input id="visa-valid" type="text" value="4916808263499650"/>');
     var visaInvalid = $('<input id="visa-invalid" type="text" value="1234567890123456"/>');
     var mcValid = $('<input id="mc-valid" type="text" value="5203731841177490"/>');
     var mcInvalid = $('<input id="mc-invalid" type="text" value="1111222233334444"/>');
     var aeValid = $('<input id="ae-valid" type="text" value="376244899619217"/>');
     var aeInvalid = $('<input id="ae-invalid" type="text" value="123451234512345"/>');

    var diValid = $('<input id="di-valid" type="text" value="6011050000000009"/>');
    var diInvalid = $('<input id="di-invalid" type="text" value="6011199900000005"/>');
    var dnValid = $('<input id="dn-valid" type="text" value="3095434000000001"/>');
    var dnInvalid = $('<input id="dn-invalid" type="text" value="3799999900000003"/>');
    var jcbValid = $('<input id="jcb-valid" type="text" value="3528000000000007"/>');
    var jcbInvalid = $('<input id="jcb-invalid" type="text" value="359000001111118"/>');
    var upValid = $('<input id="up-valid" type="text" value="6221260000000000"/>');
    var upInvalid = $('<input id="up-invalid" type="text" value="6229260000000002"/>');

    ok($.validator.methods['validate-cc-type-select'].call(this, 'VI', null, visaValid));
    ok(!$.validator.methods['validate-cc-type-select'].call(this, 'VI', null, visaInvalid));
    ok($.validator.methods['validate-cc-type-select'].call(this, 'MC', null, mcValid));
    ok(!$.validator.methods['validate-cc-type-select'].call(this, 'MC', null, mcInvalid));
    ok($.validator.methods['validate-cc-type-select'].call(this, 'AE', null, aeValid));
    ok(!$.validator.methods['validate-cc-type-select'].call(this, 'AE', null, aeInvalid));
    ok($.validator.methods['validate-cc-type-select'].call(this, 'DI', null, diValid));
    ok(!$.validator.methods['validate-cc-type-select'].call(this, 'DI', null, diInvalid));
    ok($.validator.methods['validate-cc-type-select'].call(this, 'DN', null, dnValid));
    ok(!$.validator.methods['validate-cc-type-select'].call(this, 'DN', null, dnInvalid));
    ok($.validator.methods['validate-cc-type-select'].call(this, 'JCB', null, jcbValid));
    ok(!$.validator.methods['validate-cc-type-select'].call(this, 'JCB', null, jcbInvalid));
    ok($.validator.methods['validate-cc-type-select'].call(this, 'UP', null, upValid));
    ok(!$.validator.methods['validate-cc-type-select'].call(this, 'UP', null, upInvalid));
});

test( "testValidateCCNumber", function() {
    expect(37);
    ok($.validator.methods['validate-cc-number'].call(this, '4916835098995909', null, null));
    ok($.validator.methods['validate-cc-number'].call(this, '5265071363284878', null, null));
    ok($.validator.methods['validate-cc-number'].call(this, '6011120623356953', null, null));
    ok($.validator.methods['validate-cc-number'].call(this, '371293266574617', null, null));
    ok(!$.validator.methods['validate-cc-number'].call(this, '4916835098995901', null, null));
    ok(!$.validator.methods['validate-cc-number'].call(this, '5265071363284870', null, null));
    ok(!$.validator.methods['validate-cc-number'].call(this, '6011120623356951', null, null));
    ok(!$.validator.methods['validate-cc-number'].call(this, '371293266574619', null, null));
    ok($.validator.methods['validate-cc-number'].call(this, '2221220000000003', null, null));
    ok(!$.validator.methods['validate-cc-number'].call(this, '2721220000000008', null, null));
    ok($.validator.methods['validate-cc-number'].call(this, '601109020000000003', null, null));
    ok(!$.validator.methods['validate-cc-number'].call(this, '6011111144444444', null, null));
    ok($.validator.methods['validate-cc-number'].call(this, '6011222233334444', null, null));
    ok(!$.validator.methods['validate-cc-number'].call(this, '6011522233334447', null, null));
    ok($.validator.methods['validate-cc-number'].call(this, '601174455555553', null, null));
    ok(!$.validator.methods['validate-cc-number'].call(this, '6011745555555550', null, null));
    ok($.validator.methods['validate-cc-number'].call(this, '601177455555556', null, null));
    ok(!$.validator.methods['validate-cc-number'].call(this, '601182455555556', null, null));
    ok($.validator.methods['validate-cc-number'].call(this, '601187999555558', null, null));
    ok(!$.validator.methods['validate-cc-number'].call(this, '601287999555556', null, null));
    ok($.validator.methods['validate-cc-number'].call(this, '6444444444444443', null, null));
    ok(!$.validator.methods['validate-cc-number'].call(this, '6644444444444441', null, null));
    ok($.validator.methods['validate-cc-number'].call(this, '3044444444444444', null, null));
    ok(!$.validator.methods['validate-cc-number'].call(this, '3064444444444449', null, null));
    ok($.validator.methods['validate-cc-number'].call(this, '3095444444444442', null, null));
    ok(!$.validator.methods['validate-cc-number'].call(this, '3096444444444441', null, null));
    ok($.validator.methods['validate-cc-number'].call(this, '3696444444444445', null, null));
    ok(!$.validator.methods['validate-cc-number'].call(this, '3796444444444444', null, null));
    ok($.validator.methods['validate-cc-number'].call(this, '3896444444444443', null, null));
    ok($.validator.methods['validate-cc-number'].call(this, '3528444444444449', null, null));
    ok(!$.validator.methods['validate-cc-number'].call(this, '3529444444444448', null, null));
    ok($.validator.methods['validate-cc-number'].call(this, '6221262244444440', null, null));
    ok(!$.validator.methods['validate-cc-number'].call(this, '6229981111111111', null, null));
    ok($.validator.methods['validate-cc-number'].call(this, '6249981111111117', null, null));
    ok(!$.validator.methods['validate-cc-number'].call(this, '6279981111111110', null, null));
    ok($.validator.methods['validate-cc-number'].call(this, '6282981111111115', null, null));
    ok(!$.validator.methods['validate-cc-number'].call(this, '6289981111111118', null, null));
});

test( "testValidateCCType", function() {
    expect(14);
    var select = $('<select id="cc-type">' +
        '<option value="">' +
        '</option><option value="VI">' +
        '</option><option value="MC">' +
        '</option><option value="AE">' +
        '</option><option value="DI">' +
        '</option><option value="DN">' +
        '</option><option value="JCB">' +
        '</option><option value="UP">' +
        '</option>' +
        '</select>');

    select.val('VI');
    ok($.validator.methods['validate-cc-type'].call(this, '4916835098995909', null, select));
    ok(!$.validator.methods['validate-cc-type'].call(this, '5265071363284878', null, select));
    select.val('MC');
    ok($.validator.methods['validate-cc-type'].call(this, '5265071363284878', null, select));
    ok(!$.validator.methods['validate-cc-type'].call(this, '4916835098995909', null, select));
    select.val('AE');
    ok($.validator.methods['validate-cc-type'].call(this, '371293266574617', null, select));
    ok(!$.validator.methods['validate-cc-type'].call(this, '5265071363284878', null, select));
    select.val('DI');
    ok($.validator.methods['validate-cc-type'].call(this, '6011050000000009', null, select));
    ok(!$.validator.methods['validate-cc-type'].call(this, '371293266574617', null, select));
    select.val('DN');
    ok($.validator.methods['validate-cc-type'].call(this, '3095434000000001', null, select));
    ok(!$.validator.methods['validate-cc-type'].call(this, '6011050000000009', null, select));
    select.val('JCB');
    ok($.validator.methods['validate-cc-type'].call(this, '3528000000000007', null, select));
    ok(!$.validator.methods['validate-cc-type'].call(this, '3095434000000001', null, select));
    select.val('UP');
    ok($.validator.methods['validate-cc-type'].call(this, '6221260000000000', null, select));
    ok(!$.validator.methods['validate-cc-type'].call(this, '3528000000000007', null, select));
});

test( "testValidateCCExp", function() {
    expect(3);
    var year = $('<input id="year" type="text" value="4916808263499650"/>'),
        currentTime  = new Date(),
        currentMonth = currentTime.getMonth() + 1,
        currentYear  = currentTime.getFullYear();
    year.val(currentYear);
    if (currentMonth > 1) {
        ok(!$.validator.methods['validate-cc-exp'].call(this, currentMonth - 1, null, year));
    }
    ok($.validator.methods['validate-cc-exp'].call(this, currentMonth, null, year));
    year.val(currentYear + 1);
    ok($.validator.methods['validate-cc-exp'].call(this, currentMonth, null, year));

});

test( "testValidateCCCvn", function() {
    expect(8);
     var ccType = $('<select id="cc-type">'+
     '<option value=""></option>'+
     '<option value="VI"></option>'+
     '<option value="MC"></option>'+
     '<option value="AE"></option>'+
     '<option value="DI"></option>'+
     '</select>');

    ccType.val('VI');
    ok($.validator.methods['validate-cc-cvn'].call(this, '123', null, ccType));
    ok(!$.validator.methods['validate-cc-cvn'].call(this, '1234', null, ccType));
    ccType.val('MC');
    ok($.validator.methods['validate-cc-cvn'].call(this, '123', null, ccType));
    ok(!$.validator.methods['validate-cc-cvn'].call(this, '1234', null, ccType));
    ccType.val('AE');
    ok($.validator.methods['validate-cc-cvn'].call(this, '1234', null, ccType));
    ok(!$.validator.methods['validate-cc-cvn'].call(this, '123', null, ccType));
    ccType.val('DI');
    ok($.validator.methods['validate-cc-cvn'].call(this, '123', null, ccType));
    ok(!$.validator.methods['validate-cc-cvn'].call(this, '1234', null, ccType));
});

test( "testValidateNumberRange", function() {
    expect(14);
    ok($.validator.methods['validate-number-range'].call(this, '-1', null, null));
    ok($.validator.methods['validate-number-range'].call(this, '1', null, null));
    ok($.validator.methods['validate-number-range'].call(this, '', null, null));
    ok($.validator.methods['validate-number-range'].call(this, null, null, null));
    ok($.validator.methods['validate-number-range'].call(this, '0', null, null));
    ok(!$.validator.methods['validate-number-range'].call(this, 'asds', null, null));

    ok($.validator.methods['validate-number-range'].call(this, '10', null, '10-20.06'));
    ok($.validator.methods['validate-number-range'].call(this, '15', null, '10-20.06'));
    ok(!$.validator.methods['validate-number-range'].call(this, '1', null, '10-20.06'));
    ok(!$.validator.methods['validate-number-range'].call(this, '30', null, '10-20.06'));

    var el1 = $('<input type="text" value="" class="validate-number-range number-range-10-20 number-range-10-100.20">').get(0);
    ok($.validator.methods['validate-number-range'].call(this, '10', el1, null));
    ok($.validator.methods['validate-number-range'].call(this, '15', el1, null));
    ok(!$.validator.methods['validate-number-range'].call(this, '1', el1, null));
    ok($.validator.methods['validate-number-range'].call(this, '30', el1, null));
});



test( "testValidateDigitsRange", function() {
    expect(15);
    ok($.validator.methods['validate-digits-range'].call(this, '-1', null, null));
    ok($.validator.methods['validate-digits-range'].call(this, '1', null, null));
    ok($.validator.methods['validate-digits-range'].call(this, '', null, null));
    ok($.validator.methods['validate-digits-range'].call(this, null, null, null));
    ok($.validator.methods['validate-digits-range'].call(this, '0', null, null));
    ok(!$.validator.methods['validate-digits-range'].call(this, 'asds', null, null));

    ok($.validator.methods['validate-digits-range'].call(this, '10', null, '10-20'));
    ok($.validator.methods['validate-digits-range'].call(this, '15', null, '10-20'));
    ok(!$.validator.methods['validate-digits-range'].call(this, '1', null, '10-20'));
    ok(!$.validator.methods['validate-digits-range'].call(this, '30', null, '10-20'));
    ok($.validator.methods['validate-digits-range'].call(this, '30', null, '10-20.06'));

    var el1 = $('<input type="text" value="" class="validate-digits-range digits-range-10-20 digits-range-10-100.20">').get(0);
    ok($.validator.methods['validate-digits-range'].call(this, '10', el1, null));
    ok($.validator.methods['validate-digits-range'].call(this, '15', el1, null));
    ok(!$.validator.methods['validate-digits-range'].call(this, '1', el1, null));
    ok(!$.validator.methods['validate-digits-range'].call(this, '30', el1, null));
});