1 /**
2  * Copyright (c) 2008, http://www.snakeyaml.org
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.yaml.snakeyaml;
17 
18 import java.util.ArrayList;
19 import java.util.Arrays;
20 import java.util.EnumMap;
21 import java.util.LinkedHashMap;
22 import java.util.List;
23 import java.util.Map;
24 
25 import junit.framework.TestCase;
26 
27 import org.yaml.snakeyaml.constructor.Constructor;
28 
29 public class EnumTest extends TestCase {
30 
31     // Dumping
testDumpEnum()32     public void testDumpEnum() {
33         Yaml yaml = new Yaml();
34         String output = yaml.dump(Suit.CLUBS);
35         assertEquals("!!org.yaml.snakeyaml.Suit 'CLUBS'\n", output);
36     }
37 
testDumpOverriddenToString()38     public void testDumpOverriddenToString() {
39         Yaml yaml = new Yaml();
40         String output = yaml.dump(DumperOptions.FlowStyle.BLOCK);
41         assertEquals("!!org.yaml.snakeyaml.DumperOptions$FlowStyle 'BLOCK'\n", output);
42     }
43 
testDumpEnumArray()44     public void testDumpEnumArray() {
45         DumperOptions options = new DumperOptions();
46         options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
47         Yaml yaml = new Yaml(options);
48         String output = yaml.dump(Suit.values());
49         assertEquals(
50                 "- !!org.yaml.snakeyaml.Suit 'CLUBS'\n- !!org.yaml.snakeyaml.Suit 'DIAMONDS'\n- !!org.yaml.snakeyaml.Suit 'HEARTS'\n- !!org.yaml.snakeyaml.Suit 'SPADES'\n",
51                 output);
52     }
53 
testDumpEnumList()54     public void testDumpEnumList() {
55         DumperOptions options = new DumperOptions();
56         options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
57         Yaml yaml = new Yaml(options);
58         List<Suit> list = Arrays.asList(Suit.values());
59         String output = yaml.dump(list);
60         assertEquals(
61                 "- !!org.yaml.snakeyaml.Suit 'CLUBS'\n- !!org.yaml.snakeyaml.Suit 'DIAMONDS'\n- !!org.yaml.snakeyaml.Suit 'HEARTS'\n- !!org.yaml.snakeyaml.Suit 'SPADES'\n",
62                 output);
63     }
64 
testDumpEnumListNoAnchor()65     public void testDumpEnumListNoAnchor() {
66         DumperOptions options = new DumperOptions();
67         options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
68         Yaml yaml = new Yaml(options);
69         List<Suit> list = new ArrayList<Suit>(3);
70         list.add(Suit.CLUBS);
71         list.add(Suit.DIAMONDS);
72         list.add(Suit.CLUBS);
73         String output = yaml.dump(list);
74         assertEquals(
75                 "- !!org.yaml.snakeyaml.Suit 'CLUBS'\n- !!org.yaml.snakeyaml.Suit 'DIAMONDS'\n- !!org.yaml.snakeyaml.Suit 'CLUBS'\n",
76                 output);
77     }
78 
testDumpEnumMap()79     public void testDumpEnumMap() {
80         DumperOptions options = new DumperOptions();
81         options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
82         Yaml yaml = new Yaml(options);
83         Map<String, Suit> map = new LinkedHashMap<String, Suit>();
84         map.put("c", Suit.CLUBS);
85         map.put("d", Suit.DIAMONDS);
86         String output = yaml.dump(map);
87         assertEquals(
88                 "c: !!org.yaml.snakeyaml.Suit 'CLUBS'\nd: !!org.yaml.snakeyaml.Suit 'DIAMONDS'\n",
89                 output);
90     }
91 
testDumpEnumMap2()92     public void testDumpEnumMap2() {
93         DumperOptions options = new DumperOptions();
94         options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
95         Yaml yaml = new Yaml(options);
96         Map<Suit, Integer> map = new EnumMap<Suit, Integer>(Suit.class);
97         map.put(Suit.CLUBS, 0);
98         map.put(Suit.DIAMONDS, 123);
99         String output = yaml.dump(map);
100         assertEquals(
101                 "!!org.yaml.snakeyaml.Suit 'CLUBS': 0\n!!org.yaml.snakeyaml.Suit 'DIAMONDS': 123\n",
102                 output);
103     }
104 
testDumpEnumBean()105     public void testDumpEnumBean() {
106         DumperOptions options = new DumperOptions();
107         options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
108         Yaml yaml = new Yaml(options);
109         EnumBean bean = new EnumBean();
110         bean.setId(17);
111         bean.setSuit(Suit.SPADES);
112         LinkedHashMap<Suit, Integer> map = new LinkedHashMap<Suit, Integer>();
113         map.put(Suit.CLUBS, 1);
114         map.put(Suit.DIAMONDS, 2);
115         bean.setMap(map);
116         String output = yaml.dump(bean);
117         assertEquals(
118                 "!!org.yaml.snakeyaml.EnumBean\nid: 17\nmap:\n  CLUBS: 1\n  DIAMONDS: 2\nsuit: SPADES\n",
119                 output);
120     }
121 
122     // Loading
testLoadEnum()123     public void testLoadEnum() {
124         Yaml yaml = new Yaml();
125         Suit suit = (Suit) yaml.load("!!org.yaml.snakeyaml.Suit 'CLUBS'\n");
126         assertEquals(Suit.CLUBS, suit);
127     }
128 
testLoadOverridenToString()129     public void testLoadOverridenToString() {
130         Yaml yaml = new Yaml();
131         assertEquals(DumperOptions.FlowStyle.BLOCK,
132                 yaml.load("!!org.yaml.snakeyaml.DumperOptions$FlowStyle 'BLOCK'\n"));
133     }
134 
135     @SuppressWarnings("unchecked")
testLoadEnumList()136     public void testLoadEnumList() {
137         Yaml yaml = new Yaml();
138         List<Suit> list = (List<Suit>) yaml
139                 .load("- !!org.yaml.snakeyaml.Suit 'CLUBS'\n- !!org.yaml.snakeyaml.Suit 'DIAMONDS'\n- !!org.yaml.snakeyaml.Suit 'HEARTS'\n- !!org.yaml.snakeyaml.Suit 'SPADES'");
140         assertEquals(4, list.size());
141         assertEquals(Suit.CLUBS, list.get(0));
142         assertEquals(Suit.DIAMONDS, list.get(1));
143         assertEquals(Suit.HEARTS, list.get(2));
144         assertEquals(Suit.SPADES, list.get(3));
145     }
146 
147     @SuppressWarnings("unchecked")
testLoadEnumMap()148     public void testLoadEnumMap() {
149         Yaml yaml = new Yaml();
150         Map<Integer, Suit> map = (Map<Integer, Suit>) yaml
151                 .load("1: !!org.yaml.snakeyaml.Suit 'HEARTS'\n2: !!org.yaml.snakeyaml.Suit 'DIAMONDS'");
152         assertEquals(2, map.size());
153         assertEquals(Suit.HEARTS, map.get(1));
154         assertEquals(Suit.DIAMONDS, map.get(2));
155     }
156 
testLoadEnumBean()157     public void testLoadEnumBean() {
158         Yaml yaml = new Yaml();
159         EnumBean bean = (EnumBean) yaml
160                 .load("!!org.yaml.snakeyaml.EnumBean\nid: 174\nmap:\n  !!org.yaml.snakeyaml.Suit 'CLUBS': 1\n  !!org.yaml.snakeyaml.Suit 'DIAMONDS': 2\nsuit: CLUBS");
161 
162         LinkedHashMap<Suit, Integer> map = new LinkedHashMap<Suit, Integer>();
163         map.put(Suit.CLUBS, 1);
164         map.put(Suit.DIAMONDS, 2);
165 
166         assertEquals(Suit.CLUBS, bean.getSuit());
167         assertEquals(174, bean.getId());
168         assertEquals(map, bean.getMap());
169     }
170 
testLoadEnumBean2()171     public void testLoadEnumBean2() {
172         Constructor c = new Constructor();
173         TypeDescription td = new TypeDescription(EnumBean.class);
174         td.putMapPropertyType("map", Suit.class, Object.class);
175         c.addTypeDescription(td);
176         Yaml yaml = new Yaml(c);
177         EnumBean bean = (EnumBean) yaml
178                 .load("!!org.yaml.snakeyaml.EnumBean\nid: 174\nmap:\n  CLUBS: 1\n  DIAMONDS: 2\nsuit: CLUBS");
179 
180         LinkedHashMap<Suit, Integer> map = new LinkedHashMap<Suit, Integer>();
181         map.put(Suit.CLUBS, 1);
182         map.put(Suit.DIAMONDS, 2);
183 
184         assertEquals(Suit.CLUBS, bean.getSuit());
185         assertEquals(174, bean.getId());
186         assertEquals(map, bean.getMap());
187     }
188 
testLoadWrongEnum()189     public void testLoadWrongEnum() {
190         Yaml yaml = new Yaml();
191         try {
192             yaml.load("1: !!org.yaml.snakeyaml.Suit 'HEARTS'\n2: !!org.yaml.snakeyaml.Suit 'KOSYR'");
193             fail("KOSYR is not Suit");
194         } catch (Exception e) {
195             assertTrue("KOSYR must be reported",
196                     e.getMessage().contains("Unable to find enum value 'KOSYR' for enum"));
197         }
198     }
199 }
200