001package beginner;
002
003import com.sandwich.koan.Koan;
004
005import static com.sandwich.koan.constant.KoanConstants.__;
006import static com.sandwich.util.Assert.assertEquals;
007
008public class AboutEnums {
009
010
011    enum Colors {
012        Red, Blue, Green, Yellow // what happens if you add a ; here?
013        // What happens if you type Red() instead?
014    }
015
016    @Koan
017    public void basicEnums() {
018        Colors blue = Colors.Blue;
019        assertEquals(blue == Colors.Blue, __);
020        assertEquals(blue == Colors.Red, __);
021        assertEquals(blue instanceof Colors, __);
022    }
023
024    @Koan
025    public void basicEnumsAccess() {
026        Colors[] colorArray = Colors.values();
027        assertEquals(colorArray[2], __);
028    }
029
030    enum SkatSuits {
031        Clubs(12), Spades(11), Hearts(10), Diamonds(9);
032
033        SkatSuits(int v) {
034            value = v;
035        }
036
037        private int value;
038    }
039
040    @Koan
041    public void enumsWithAttributes() {
042        // value is private but we still can access it. Why?
043        // Try moving the enum outside the AboutEnum class... What do you expect?
044        // What happens?
045        assertEquals(SkatSuits.Clubs.value > SkatSuits.Spades.value, __);
046    }
047
048    enum OpticalMedia {
049        CD(650), DVD(4300), BluRay(50000);
050
051        OpticalMedia(int c) {
052            capacityInMegaBytes = c;
053        }
054
055        int capacityInMegaBytes;
056
057        int getCoolnessFactor() {
058            return (capacityInMegaBytes - 1000) * 10;
059        }
060    }
061
062    @Koan
063    public void enumsWithMethods() {
064        assertEquals(OpticalMedia.CD.getCoolnessFactor(), __);
065        assertEquals(OpticalMedia.BluRay.getCoolnessFactor(), __);
066    }
067}