001 package org.apache.commons.configuration;
002
003 /*
004 * Licensed to the Apache Software Foundation (ASF) under one or more
005 * contributor license agreements. See the NOTICE file distributed with
006 * this work for additional information regarding copyright ownership.
007 * The ASF licenses this file to You under the Apache License, Version 2.0
008 * (the "License"); you may not use this file except in compliance with
009 * the License. You may obtain a copy of the License at
010 *
011 * http://www.apache.org/licenses/LICENSE-2.0
012 *
013 * Unless required by applicable law or agreed to in writing, software
014 * distributed under the License is distributed on an "AS IS" BASIS,
015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016 * See the License for the specific language governing permissions and
017 * limitations under the License.
018 */
019
020 import static org.junit.Assert.assertEquals;
021 import static org.junit.Assert.assertFalse;
022 import static org.junit.Assert.assertTrue;
023 import static org.junit.Assert.fail;
024
025 import java.util.NoSuchElementException;
026
027 import org.junit.Test;
028
029 /**
030 * Test class for ConfigurationKey.
031 *
032 * @version $Id: TestConfigurationKey.java 1231749 2012-01-15 20:48:56Z oheger $
033 */
034 @SuppressWarnings("deprecation")
035 public class TestConfigurationKey
036 {
037 private static final String TESTPROPS = "tables.table(0).fields.field(1)";
038
039 private static final String TESTATTR = "[@dataType]";
040
041 private static final String TESTKEY = TESTPROPS + TESTATTR;
042
043 @Test
044 public void testAppend()
045 {
046 ConfigurationKey key = new ConfigurationKey();
047 key.append("tables").append("table.").appendIndex(0);
048 key.append("fields.").append("field").appendIndex(1);
049 key.appendAttribute("dataType");
050 assertEquals(TESTKEY, key.toString());
051 }
052
053 @Test
054 public void testIterate()
055 {
056 ConfigurationKey key = new ConfigurationKey(TESTKEY);
057 ConfigurationKey.KeyIterator it = key.iterator();
058 assertTrue(it.hasNext());
059 assertEquals("tables", it.nextKey());
060 assertEquals("table", it.nextKey());
061 assertTrue(it.hasIndex());
062 assertEquals(0, it.getIndex());
063 assertEquals("fields", it.nextKey());
064 assertFalse(it.hasIndex());
065 assertEquals("field", it.nextKey(true));
066 assertEquals(1, it.getIndex());
067 assertFalse(it.isAttribute());
068 assertEquals("field", it.currentKey(true));
069 assertEquals("dataType", it.nextKey());
070 assertEquals("[@dataType]", it.currentKey(true));
071 assertTrue(it.isAttribute());
072 assertFalse(it.hasNext());
073 try
074 {
075 it.next();
076 fail("Could iterate over the iteration's end!");
077 }
078 catch(NoSuchElementException nex)
079 {
080 //ok
081 }
082
083 key = new ConfigurationKey();
084 assertFalse(key.iterator().hasNext());
085 key.append("simple");
086 it = key.iterator();
087 assertTrue(it.hasNext());
088 assertEquals("simple", it.next());
089 try
090 {
091 it.remove();
092 fail("Could remove key component!");
093 }
094 catch(UnsupportedOperationException uex)
095 {
096 //ok
097 }
098 }
099
100 @Test
101 public void testAttribute()
102 {
103 assertTrue(ConfigurationKey.isAttributeKey(TESTATTR));
104 assertFalse(ConfigurationKey.isAttributeKey(TESTPROPS));
105 assertFalse(ConfigurationKey.isAttributeKey(TESTKEY));
106
107 ConfigurationKey key = new ConfigurationKey(TESTPROPS);
108 key.append(TESTATTR);
109 assertEquals(TESTKEY, key.toString());
110 }
111
112 @Test
113 public void testLength()
114 {
115 ConfigurationKey key = new ConfigurationKey(TESTPROPS);
116 assertEquals(TESTPROPS.length(), key.length());
117 key.appendAttribute("dataType");
118 assertEquals(TESTKEY.length(), key.length());
119 key.setLength(TESTPROPS.length());
120 assertEquals(TESTPROPS.length(), key.length());
121 assertEquals(TESTPROPS, key.toString());
122 }
123
124 @Test
125 public void testConstructAttributeKey()
126 {
127 assertEquals("[@attribute]", ConfigurationKey.constructAttributeKey("attribute"));
128 assertEquals("attribute", ConfigurationKey.attributeName("[@attribute]"));
129 assertEquals("attribute", ConfigurationKey.attributeName("attribute"));
130 }
131
132 @Test
133 public void testEquals()
134 {
135 ConfigurationKey k1 = new ConfigurationKey(TESTKEY);
136 ConfigurationKey k2 = new ConfigurationKey(TESTKEY);
137 assertTrue(k1.equals(k2));
138 assertTrue(k2.equals(k1));
139 assertEquals(k1.hashCode(), k2.hashCode());
140 k2.append("anotherPart");
141 assertFalse(k1.equals(k2));
142 assertFalse(k2.equals(k1));
143 assertFalse(k1.equals(null));
144 assertTrue(k1.equals(TESTKEY));
145 }
146
147 @Test
148 public void testCommonKey()
149 {
150 ConfigurationKey k1 = new ConfigurationKey(TESTKEY);
151 ConfigurationKey k2 = new ConfigurationKey("tables.table(0).name");
152 ConfigurationKey kc = k1.commonKey(k2);
153 assertEquals(new ConfigurationKey("tables.table(0)"), kc);
154 assertEquals(kc, k2.commonKey(k1));
155
156 k2 = new ConfigurationKey("tables.table(1).fields.field(1)");
157 kc = k1.commonKey(k2);
158 assertEquals(new ConfigurationKey("tables"), kc);
159
160 k2 = new ConfigurationKey("completely.different.key");
161 kc = k1.commonKey(k2);
162 assertEquals(0, kc.length());
163
164 k2 = new ConfigurationKey();
165 kc = k1.commonKey(k2);
166 assertEquals(0, kc.length());
167
168 kc = k1.commonKey(k1);
169 assertEquals(kc, k1);
170
171 try
172 {
173 kc.commonKey(null);
174 fail("Could construct common key with null key!");
175 }
176 catch(IllegalArgumentException iex)
177 {
178 //ok
179 }
180 }
181
182 @Test
183 public void testDifferenceKey()
184 {
185 ConfigurationKey k1 = new ConfigurationKey(TESTKEY);
186 ConfigurationKey kd = k1.differenceKey(k1);
187 assertEquals(0, kd.length());
188
189 ConfigurationKey k2 = new ConfigurationKey("tables.table(0).name");
190 kd = k1.differenceKey(k2);
191 assertEquals("name", kd.toString());
192
193 k2 = new ConfigurationKey("tables.table(1).fields.field(1)");
194 kd = k1.differenceKey(k2);
195 assertEquals("table(1).fields.field(1)", kd.toString());
196
197 k2 = new ConfigurationKey("completely.different.key");
198 kd = k1.differenceKey(k2);
199 assertEquals(k2, kd);
200 }
201
202 @Test
203 public void testEscapedDelimiters()
204 {
205 ConfigurationKey k = new ConfigurationKey();
206 k.append("my..elem");
207 k.append("trailing..dot..");
208 k.append("strange");
209 assertEquals("my..elem.trailing..dot...strange", k.toString());
210
211 ConfigurationKey.KeyIterator kit = k.iterator();
212 assertEquals("my.elem", kit.nextKey());
213 assertEquals("trailing.dot.", kit.nextKey());
214 assertEquals("strange", kit.nextKey());
215 assertFalse(kit.hasNext());
216 }
217
218 /**
219 * Tests some funny keys.
220 */
221 @Test
222 public void testIterateStrangeKeys()
223 {
224 ConfigurationKey k = new ConfigurationKey("key.");
225 ConfigurationKey.KeyIterator it = k.iterator();
226 assertTrue(it.hasNext());
227 assertEquals("key", it.next());
228 assertFalse(it.hasNext());
229
230 k = new ConfigurationKey(".");
231 it = k.iterator();
232 assertFalse(it.hasNext());
233
234 k = new ConfigurationKey("key().index()undefined(0).test");
235 it = k.iterator();
236 assertEquals("key()", it.next());
237 assertFalse(it.hasIndex());
238 assertEquals("index()undefined", it.nextKey(false));
239 assertTrue(it.hasIndex());
240 assertEquals(0, it.getIndex());
241 }
242
243 /**
244 * Tests iterating over an attribute key that has an index.
245 */
246 @Test
247 public void testAttributeKeyWithIndex()
248 {
249 ConfigurationKey k = new ConfigurationKey(TESTATTR);
250 k.appendIndex(0);
251 assertEquals("Wrong attribute key with index", TESTATTR + "(0)", k.toString());
252
253 ConfigurationKey.KeyIterator it = k.iterator();
254 assertTrue("No first element", it.hasNext());
255 it.next();
256 assertTrue("Index not found", it.hasIndex());
257 assertEquals("Incorrect index", 0, it.getIndex());
258 assertTrue("Attribute not found", it.isAttribute());
259 assertEquals("Wrong plain key", "dataType", it.currentKey(false));
260 assertEquals("Wrong decorated key", TESTATTR, it.currentKey(true));
261 }
262 }