test("ItemDescriptor", function () {

        var option = jQuery("<option />");

        var optionDescriptor = new ItemDescriptor({
            value: "test",
            title: "I am a test title",
            selected: true,
            label: "I am a test label",
            styleClass: "test-class",
            icon: "url()",
            model: option
        });

        equal(optionDescriptor.value(), "test");
        equal(optionDescriptor.title(), "I am a test title");
        equal(optionDescriptor.label(), "I am a test label");
        equal(optionDescriptor.icon(), "url()");
        equal(optionDescriptor.selected(), true);
        equal(optionDescriptor.styleClass(), "test-class");
        var serializer = new XMLSerializer();
        equal(serializer.serializeToString(optionDescriptor.model()[0]),
                serializer.serializeToString(option[0]), "Expected model() to be jQuery wrapped option element");

    });
    test("Setting Selected", function () {


        function getDescriptor(val, label, hasOption) {

            var $option,
                    descriptor;

            if (hasOption) {
                $option = jQuery("<option />").attr({
                    value: val,
                    label: label
                });
            }

            descriptor = new ItemDescriptor({
                value: val,
                label: label,
                model: $option
            });

            if (hasOption) {
                $option.data("descriptor", descriptor);
            }

            return descriptor;
        }

        MockSelect = SelectModel.extend({
            init: function () {
                this.options = {};
                this.$element = jQuery("<select multiple='multiple' />");
            }
        });

        var select = new MockSelect();

        // Selecting a single element

        var kellySlaterDescriptor = getDescriptor("kelly-slator", "Kelly Slator", true);

        select.$element.append(kellySlaterDescriptor.model());
        select.setSelected(kellySlaterDescriptor);

        ok(kellySlaterDescriptor.model().prop("selected"), "Expected option [Kelly Slator] to be selected");
        ok(kellySlaterDescriptor.selected(), "Expected descriptor [kellySlaterDescriptor] to be selected");



        // Selecting two options

        var kdogDescriptor = getDescriptor("kelly-slator", "k-dog", true);

        select.$element.append(kdogDescriptor.model());
        select.setSelected(kellySlaterDescriptor); // should still set kdog also as they have the same value

        ok(kdogDescriptor.model().prop("selected") && kellySlaterDescriptor.model().prop("selected"), "Expected option [Kelly Slator] and [k-dog] to be selected");
        ok(kdogDescriptor.selected() && kellySlaterDescriptor.selected(), "Expected descriptor [kellySlaterDescriptor] and [kdogDescriptor] to be selected");


        // If an option matching the descriptor does not exist, it should create a new one an select it

        var aiDescriptor = getDescriptor("andy-irons", "Andy Irons", false);

        select.setSelected(aiDescriptor);

        ok(select.$element.find("option:contains(Andy Irons)").length === 1, "Expected option to be appended to <select>");
        ok(select.$element.find("option:contains(Andy Irons)").prop("selected"), "Expected option [Andy Irons] to be selected");

        ok(aiDescriptor.selected(), "Expected descriptor [aiDescriptor] to be selected");

        var item = new ItemDescriptor({
            highlighted: true,
            html: "<b>Actual</b> Label",
            label: "False, illegitimate, imposter label!",
            value: "10001"
        });

        select.setAllUnSelected();
        equal(select.getSelectedValues().length, 0, "No options are selected");

        select.setSelected(item);
        equal(select.getSelectedValues().length, 1, "1 option is selected");
        equal(select.getSelectedValues()[0], "10001", "Selected value matches item");
        equal(item.selected(), true, "Item reports itself as selected");
        equal(item.highlighted(), false, "Item is no longer highlighted after it is selected");
        equal(item.label(), "Actual Label", "Item label is adapted from HTML");
    });