module("rules");

test("rules() - internal - input", function () {
    var element = $('#firstname');
    var v = $('#testForm1').validate();
    deepEqual(element.rules(), {required: true, minlength: 2});
});

test("rules(), ignore method:false", function () {
    var element = $('#firstnamec');
    var v = $('#testForm1clean').validate({
        rules: {
            firstname: {required: false, minlength: 2}
        }
    });
    deepEqual(element.rules(), {minlength: 2});
});

test("rules() HTML5 required (no value)", function () {
    var element = $('#testForm11text1');
    var v = $('#testForm11').validate();
    deepEqual(element.rules(), {required: true});
});

test("rules() - internal - select", function () {
    var element = $('#meal');
    var v = $('#testForm3').validate();
    deepEqual(element.rules(), {required: true});
});

test("rules() - external", function () {
    var element = $('#text1');
    var v = $('#form').validate({
        rules: {
            action: {date: true, min: 5}
        }
    });
    deepEqual(element.rules(), {date: true, min: 5});
});

test("rules() - external - complete form", function () {
    expect(1);

    var methods = $.extend({}, $.validator.methods);
    var messages = $.extend({}, $.validator.messages);

    $.validator.addMethod("verifyTest", function () {
        ok(true, "method executed");
        return true;
    });
    var v = $('#form').validate({
        rules: {
            action: {verifyTest: true}
        }
    });
    v.form();

    $.validator.methods = methods;
    $.validator.messages = messages;
});

test("rules() - internal - input", function () {
    var element = $('#form8input');
    var v = $('#testForm8').validate();
    deepEqual(element.rules(), {required: true, number: true, rangelength: [2, 8]});
});

test("rules(), merge min/max to range, minlength/maxlength to rangelength", function () {
    jQuery.validator.autoCreateRanges = true;
    var v = $("#testForm1clean").validate({
        rules: {
            firstname: {
                min: 5,
                max: 12
            },
            lastname: {
                minlength: 2,
                maxlength: 8
            }
        }
    });
    deepEqual($("#firstnamec").rules(), {range: [5, 12]});

    deepEqual($("#lastnamec").rules(), {rangelength: [2, 8]});
    jQuery.validator.autoCreateRanges = false;
});

test("rules(), guarantee that required is at front", function () {
    $("#testForm1").validate();
    var v = $("#v2").validate();
    $("#subformRequired").validate();
    function flatRules(element) {
        var result = [];
        jQuery.each($(element).rules(), function (key, value) {
            result.push(key);
        });
        return result.join(" ");
    }

    equal("required minlength", flatRules("#firstname"));
    equal("required minlength maxlength", flatRules("#v2-i6"));
    equal("required maxlength", flatRules("#co_name"));

    QUnit.reset();
    jQuery.validator.autoCreateRanges = true;
    v = $("#v2").validate();
    equal("required rangelength", flatRules("#v2-i6"));

    $("#subformRequired").validate({
        rules: {
            co_name: "required"
        }
    });
    $("#co_name").removeClass();
    equal("required maxlength", flatRules("#co_name"));
    jQuery.validator.autoCreateRanges = false;
});

test("rules(), evaluate dynamic parameters", function () {
    expect(2);
    var v = $("#testForm1clean").validate({
        rules: {
            firstname: {
                min: function (element) {
                    equal($("#firstnamec")[0], element);
                    return 12;
                }
            }
        }
    });
    deepEqual($("#firstnamec").rules(), {min: 12});
});

test("rules(), class and attribute combinations", function () {

    $.validator.addMethod("customMethod1", function () {
        return false;
    }, "");
    $.validator.addMethod("customMethod2", function () {
        return false;
    }, "");
    var v = $("#v2").validate({
        rules: {
            'v2-i7': {
                required: true,
                minlength: 2,
                customMethod: true
            }
        }
    });
    deepEqual($("#v2-i1").rules(), {required: true});
    deepEqual($("#v2-i2").rules(), {required: true, email: true});
    deepEqual($("#v2-i3").rules(), {url: true});
    deepEqual($("#v2-i4").rules(), {required: true, minlength: 2});
    deepEqual($("#v2-i5").rules(), {required: true, minlength: 2, maxlength: 5, customMethod1: "123"});
    jQuery.validator.autoCreateRanges = true;
    deepEqual($("#v2-i5").rules(), {required: true, customMethod1: "123", rangelength: [2, 5]});
    deepEqual($("#v2-i6").rules(), {required: true, customMethod2: true, rangelength: [2, 5]});
    jQuery.validator.autoCreateRanges = false;
    deepEqual($("#v2-i7").rules(), {required: true, minlength: 2, customMethod: true});

    delete $.validator.methods.customMethod1;
    delete $.validator.messages.customMethod1;
    delete $.validator.methods.customMethod2;
    delete $.validator.messages.customMethod2;
});

test("rules(), dependency checks", function () {
    var v = $("#testForm1clean").validate({
        rules: {
            firstname: {
                min: {
                    param: 5,
                    depends: function (el) {
                        return (/^a/).test($(el).val());
                    }
                }
            },
            lastname: {
                max: {
                    param: 12
                },
                email: {
                    depends: function () {
                        return true;
                    }
                }
            }
        }
    });

    var rules = $("#firstnamec").rules();
    equal(0, v.objectLength(rules));

    $("#firstnamec").val('ab');
    deepEqual($("#firstnamec").rules(), {min: 5});

    deepEqual($("#lastnamec").rules(), {max: 12, email: true});
});

test("rules(), add and remove", function () {
    $.validator.addMethod("customMethod1", function () {
        return false;
    }, "");
    $("#v2").validate();
    var removedAttrs = $("#v2-i5").removeClass("required").removeAttrs("minlength maxlength");
    deepEqual($("#v2-i5").rules(), {customMethod1: "123"});

    $("#v2-i5").addClass("required").attr(removedAttrs);
    deepEqual($("#v2-i5").rules(), {required: true, minlength: 2, maxlength: 5, customMethod1: "123"});

    $("#v2-i5").addClass("email").attr({min: 5});
    deepEqual($("#v2-i5").rules(), {
        required: true,
        email: true,
        minlength: 2,
        maxlength: 5,
        min: 5,
        customMethod1: "123"
    });

    $("#v2-i5").removeClass("required email").removeAttrs("minlength maxlength customMethod1 min");
    deepEqual($("#v2-i5").rules(), {});

    delete $.validator.methods.customMethod1;
    delete $.validator.messages.customMethod1;
});

test("rules(), add and remove static rules", function () {
    var v = $("#testForm1clean").validate({
        rules: {
            firstname: "required date"
        }
    });
    deepEqual($("#firstnamec").rules(), {required: true, date: true});

    $("#firstnamec").rules("remove", "date");
    deepEqual($("#firstnamec").rules(), {required: true});
    $("#firstnamec").rules("add", "email");
    deepEqual($("#firstnamec").rules(), {required: true, email: true});

    $("#firstnamec").rules("remove", "required");
    deepEqual($("#firstnamec").rules(), {email: true});

    deepEqual($("#firstnamec").rules("remove"), {email: true});
    deepEqual($("#firstnamec").rules(), {});

    $("#firstnamec").rules("add", "required email");
    deepEqual($("#firstnamec").rules(), {required: true, email: true});


    deepEqual($("#lastnamec").rules(), {});
    $("#lastnamec").rules("add", "required");
    $("#lastnamec").rules("add", {
        minlength: 2
    });
    deepEqual($("#lastnamec").rules(), {required: true, minlength: 2});


    var removedRules = $("#lastnamec").rules("remove", "required email");
    deepEqual($("#lastnamec").rules(), {minlength: 2});
    $("#lastnamec").rules("add", removedRules);
    deepEqual($("#lastnamec").rules(), {required: true, minlength: 2});
});

test("rules(), add messages", function () {
    $("#firstnamec").attr("title", null);
    var v = $("#testForm1clean").validate({
        rules: {
            firstname: "required"
        }
    });
    $("#testForm1clean").valid();
    $("#firstnamec").valid();
    deepEqual(v.settings.messages.firstname, undefined);

    $("#firstnamec").rules("add", {
        messages: {
            required: "required"
        }
    });

    $("#firstnamec").valid();
    deepEqual(v.errorList[0] && v.errorList[0].message, "required");

    $("#firstnamec").val("test");
    $("#firstnamec").valid();
    equal(v.errorList.length, 0);
});
