define(['js/models/xblock_validation'],
    function(XBlockValidationModel) {
        var verifyModel;

        verifyModel = function(model, expected_empty, expected_summary, expected_messages, expected_xblock_id) {
            expect(model.get("empty")).toBe(expected_empty);
            expect(model.get("summary")).toEqual(expected_summary);
            expect(model.get("messages")).toEqual(expected_messages);
            expect(model.get("xblock_id")).toBe(expected_xblock_id);
        };

        describe('XBlockValidationModel', function() {
            it('handles empty variable', function() {
                verifyModel(new XBlockValidationModel({parse: true}), true, {}, [], null);
                verifyModel(new XBlockValidationModel({"empty": true}, {parse: true}), true, {}, [], null);

                // It is assumed that the "empty" state on the JSON object passed in is correct
                // (no attempt is made to correct other variables based on empty==true).
                verifyModel(
                    new XBlockValidationModel(
                        {"empty": true, "messages": [{"text": "Bad JSON case"}], "xblock_id": "id"},
                        {parse: true}
                    ),
                    true,
                    {},
                    [{"text": "Bad JSON case"}], "id"
                );
            });

            it('creates a summary if not defined', function() {
                // Single warning message.
                verifyModel(
                    new XBlockValidationModel({
                        "empty": false,
                        "xblock_id": "id"
                    }, {parse: true}),
                    false,
                    {"text": "This component has validation issues.", "type": "warning"},
                    [],
                    "id"
                );
                // Two messages that compute to a "warning" state in the summary.
                verifyModel(
                    new XBlockValidationModel({
                        "empty": false,
                        "messages": [{"text": "one", "type": "not-configured"}, {"text": "two", "type": "warning"}],
                        "xblock_id": "id"
                    }, {parse: true}),
                    false,
                    {"text": "This component has validation issues.", "type": "warning"},
                    [{"text": "one", "type": "not-configured"}, {"text": "two", "type": "warning"}],
                    "id"
                );
                // Two messages, with one of them "error", resulting in an "error" state in the summary.
                verifyModel(
                    new XBlockValidationModel({
                        "empty": false,
                        "messages": [{"text": "one", "type": "warning"}, {"text": "two", "type": "error"}],
                        "xblock_id": "id"
                    }, {parse: true}),
                    false,
                    {"text": "This component has validation issues.", "type": "error"},
                    [{"text": "one", "type": "warning"}, {"text": "two", "type": "error"}],
                    "id"
                );
            });

            it('respects summary properties that are defined', function() {
                // Summary already present (both text and type), no messages.
                verifyModel(
                    new XBlockValidationModel({
                        "empty": false,
                        "xblock_id": "id",
                        "summary": {"text": "my summary", "type": "custom type"}
                    }, {parse: true}),
                    false,
                    {"text": "my summary", "type": "custom type"},
                    [],
                    "id"
                );
                // Summary text present, but not type (will get default value of warning).
                verifyModel(
                    new XBlockValidationModel({
                        "empty": false,
                        "xblock_id": "id",
                        "summary": {"text": "my summary"}
                    }, {parse: true}),
                    false,
                    {"text": "my summary", "type": "warning"},
                    [],
                    "id"
                );
                // Summary type present, but not text.
                verifyModel(
                    new XBlockValidationModel({
                        "empty": false,
                        "summary": {"type": "custom type"},
                        "messages": [{"text": "one", "type": "not-configured"}, {"text": "two", "type": "warning"}],
                        "xblock_id": "id"
                    }, {parse: true}),
                    false,
                    {"text": "This component has validation issues.", "type": "custom type"},
                    [{"text": "one", "type": "not-configured"}, {"text": "two", "type": "warning"}],
                    "id"
                );
                // Summary text present, type will be computed as error.
                verifyModel(
                    new XBlockValidationModel({
                        "empty": false,
                        "summary": {"text": "my summary"},
                        "messages": [{"text": "one", "type": "warning"}, {"text": "two", "type": "error"}],
                        "xblock_id": "id"
                    }, {parse: true}),
                    false,
                    {"text": "my summary", "type": "error"},
                    [{"text": "one", "type": "warning"}, {"text": "two", "type": "error"}],
                    "id"
                );
            });

            it('clears messages if showSummaryOnly is true', function() {
                verifyModel(
                    new XBlockValidationModel({
                        "empty": false,
                        "xblock_id": "id",
                        "summary": {"text": "my summary"},
                        "messages": [{"text": "one", "type": "warning"}, {"text": "two", "type": "error"}],
                        "showSummaryOnly": true
                    }, {parse: true}),
                    false,
                    {"text": "my summary", "type": "error"},
                    [],
                    "id"
                );

                verifyModel(
                    new XBlockValidationModel({
                        "empty": false,
                        "xblock_id": "id",
                        "summary": {"text": "my summary"},
                        "messages": [{"text": "one", "type": "warning"}, {"text": "two", "type": "error"}],
                        "showSummaryOnly": false
                    }, {parse: true}),
                    false,
                    {"text": "my summary", "type": "error"},
                    [{"text": "one", "type": "warning"}, {"text": "two", "type": "error"}],
                    "id"
                );
            });
        });
    }
);
