/*
 * Created on 12.04.2006
 * 
 */
package org.jdesktop.swingx.combobox;

import org.jdesktop.swingx.InteractiveTestCase;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.junit.Test;
import org.junit.Before;
import org.junit.After;


@RunWith(JUnit4.class)
public class EnumComboBoxModelUnitTest extends InteractiveTestCase {
    enum MyEnum1 {
        GoodStuff, BadStuff
    };

    enum MyEnum2 {
        EasyStuff, HardStuff;
        public String toString() {
            switch (this) {
            case EasyStuff:
                return "Easy Stuff";
            case HardStuff:
                return "Hard Stuff";
            }

            return "ERROR";
        }
    };

    enum MyEnum3 {
        RightStuff, WrongStuff;
        public String toString() {
            switch (this) {
            case RightStuff:
                return "One Value";
            case WrongStuff:
                return "One Value";
            }

            return "ERROR";
        }
    }

    /**
     * Issue #303-swingx: EnumComboBoxModel getSelectedItem throws
     * ClassCastException. Fixed.
     */
    @Test
    public void testSetSelectedItem() {
        EnumComboBoxModel<MyEnum1> model1 = new EnumComboBoxModel<MyEnum1>(
                MyEnum1.class);
        // always starts by selecting the first value
        assertEquals(model1.getSelectedItem(), MyEnum1.GoodStuff);

        // should ignore the non-mapped string
        model1.setSelectedItem("something else");
        assertEquals(model1.getSelectedItem(), MyEnum1.GoodStuff);

        model1.setSelectedItem(MyEnum1.BadStuff);
        assertEquals(model1.getSelectedItem(), MyEnum1.BadStuff);

        model1.setSelectedItem(null);
        assertNull(model1.getSelectedItem());

        model1.setSelectedItem("GoodStuff");
        assertEquals(model1.getSelectedItem(), MyEnum1.GoodStuff);

        // ensure that custom strings map correctly
        EnumComboBoxModel<MyEnum2> model2 = new EnumComboBoxModel<MyEnum2>(
                MyEnum2.class);

        // always starts by selecting the first value
        assertEquals(model2.getSelectedItem(), MyEnum2.EasyStuff);

        // should ignore the non-mapped string and set to null
        model2.setSelectedItem("something else");
        assertEquals(model2.getSelectedItem(), MyEnum2.EasyStuff);

        model2.setSelectedItem(MyEnum2.HardStuff);
        assertEquals(model2.getSelectedItem(), MyEnum2.HardStuff);

        model2.setSelectedItem(null);
        assertNull(model2.getSelectedItem());

        model2.setSelectedItem("Easy Stuff");
        assertEquals(model2.getSelectedItem(), MyEnum2.EasyStuff);
    }

    @Test
    public void testNonUniqueToString() {
        try {
            new EnumComboBoxModel<MyEnum3>(MyEnum3.class);
            fail("expected IllegalArgumentException");
        } catch (IllegalArgumentException e) {
            // success
        }
    }

}
