1   package org.itracker.core.resources;
2   
3   import java.util.Enumeration;
4   import java.util.Locale;
5   import java.util.ResourceBundle;
6   
7   import org.itracker.AbstractDependencyInjectionTest;
8   import org.junit.Test;
9   
10  public class ITrackerResourcesTest extends AbstractDependencyInjectionTest {
11  	private String defaultLocaleString_;
12  	private Locale defaultLocale_;
13  	private ResourceBundle defaultResourceBundle_;
14  	private String testLocaleString_ = "en_ID";
15  	private Locale testLocale_;
16  	private ITrackerResourceBundle testResourceBundle_;
17  
18  	@Override
19  	public void onSetUp() throws Exception {
20  		super.onSetUp();
21  		defaultLocaleString_ = ITrackerResources.getDefaultLocale();
22  		assertNotNull(defaultLocaleString_);
23  		if (defaultLocaleString_.length() == 2) {
24  			defaultLocale_ = new Locale(defaultLocaleString_);
25  		} else if (defaultLocaleString_.length() == 5) {
26  			defaultLocale_ = new Locale(defaultLocaleString_.substring(0, 2), defaultLocaleString_.substring(3, 5));
27  		} else {
28  			fail();
29  		}
30  		assertNotNull(defaultLocale_);
31  		defaultResourceBundle_ = ITrackerResources.getBundle();
32  
33  		Object[][] data = {{"itracker.web.attr.admin", "itracker.web.attr.administer", "itracker.web.attr.adminTask", "itracker.web.attr.longString", "itracker.web.attr.newLine"},
34  				{"Admin", "Administer", "The {0} {1} {2}", "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567", "abc\nde"}};
35  
36  		testLocale_ = new Locale(testLocaleString_);
37  		testResourceBundle_ = new ITrackerResourceBundle(testLocale_, data);
38  		assertNotNull(testResourceBundle_);
39  		ITrackerResources.putBundle(testLocale_, testResourceBundle_);
40  	}
41  
42  	@Override
43  	public void onTearDown() throws Exception {
44  		super.onTearDown();
45  		ITrackerResources.setDefaultLocale(defaultLocaleString_);
46  	}
47  
48  	@Test
49  	public void testGetLocaleNull() {
50  		Locale locale = ITrackerResources.getLocale(null);
51  		assertNotNull(locale);
52  		assertEquals(ITrackerResources.getLocale(ITrackerResources.getDefaultLocale()), locale);
53  	}
54  
55  	@Test
56  	public void testGetLocaleInvalidString() {
57  		Locale localeInvalid = ITrackerResources.getLocale("ABCDEFG");
58  		Locale localeDefault = ITrackerResources.getLocale(ITrackerResources.getDefaultLocale());
59  		assertEquals(localeInvalid, localeDefault);
60  		ITrackerResources.setDefaultLocale("ABCDEFG");
61  		localeInvalid  = ITrackerResources.getLocale("ABCDEFG");
62  		localeDefault = ITrackerResources.getLocale(ITrackerResources.DEFAULT_LOCALE);
63  		assertEquals(localeInvalid, localeDefault);
64  	}
65  
66  	@Test
67  	public void testGetBundleEmptyString() {
68  		ResourceBundle resourceBundle = ITrackerResources.getBundle("");
69  		assertNotNull(resourceBundle);
70  		assertEquals(defaultResourceBundle_, resourceBundle);
71  	}
72  
73  	@Test
74  	public void testGetBundleStringParameter() {
75  		ResourceBundle resourceBundle = ITrackerResources.getBundle(defaultLocaleString_);
76  		assertNotNull(resourceBundle);
77  		assertEquals(defaultResourceBundle_, resourceBundle);
78  	}
79  
80  	@Test
81  	public void testGetBundleNullLocale() {
82  		ResourceBundle resourceBundle = ITrackerResources.getBundle((Locale) null);
83  		assertNotNull(resourceBundle);
84  		assertEquals(defaultResourceBundle_, resourceBundle);
85  	}
86  
87  	@Test
88  	public void testGetEditBundleNullLocale() {
89  		//TODO: set languageDAO of ConfigurationService
90  		ResourceBundle resourceBundle = ITrackerResources.getEditBundle(null);
91  		assertNotNull(resourceBundle);
92  		assertEquals(defaultResourceBundle_.getLocale(), resourceBundle.getLocale());
93  		Enumeration<String> keys = resourceBundle.getKeys(); // keys of copy bundle
94  		while (keys.hasMoreElements()) {
95  			String key = keys.nextElement();
96  			assertEquals(defaultResourceBundle_.getString(key), resourceBundle.getString(key));
97  		}
98  		keys = defaultResourceBundle_.getKeys(); // keys of original bundle
99  		while (keys.hasMoreElements()) {
100 			String key = keys.nextElement();
101 			assertEquals(defaultResourceBundle_.getString(key), resourceBundle.getString(key));
102 		}
103 	}
104 
105 	@Test
106 	public void testClearBundles() {
107 		Enumeration<String> keys = ITrackerResources.getBundle(ITrackerResources.BASE_LOCALE).getKeys();
108 		int nKeys = 0;
109 		while (keys.hasMoreElements()) {
110 			keys.nextElement();
111 			++nKeys;
112 		}
113 		assertTrue(5 < nKeys);
114 
115 		ITrackerResources.clearBundles();
116 
117 		keys = ITrackerResources.getBundle(testLocale_).getKeys();
118 		nKeys = 0;
119 		while (keys.hasMoreElements()) {
120 			keys.nextElement();
121 			++nKeys;
122 		}
123 		assertTrue(5 < nKeys);
124 	}
125 
126 	@Test
127 	public void testClearKeyFromBundles() {
128 		ResourceBundle resourceBundle = ITrackerResources.getBundle(testLocale_);
129 		String value = resourceBundle.getString("itracker.web.attr.admin");
130 		assertNotNull(value);
131 		assertEquals("Admin", value);
132 
133 		ITrackerResources.clearKeyFromBundles("itracker.web.attr.admin", false);
134 
135 		resourceBundle = ITrackerResources.getBundle(testLocale_);
136 
137 		try {
138 			assertNotNull(resourceBundle.getString("itracker.web.attr.admin"));
139 			assertEquals("", ResourceBundle.getBundle(ITrackerResources.RESOURCE_BUNDLE_NAME, resourceBundle.getLocale()).getString("itracker.web.attr.admin"), 
140 					resourceBundle.getString("itracker.web.attr.admin"));
141 //			fail("Should throw MissingResourceException");
142 		} catch (RuntimeException exception) {
143 			fail("should fall back to properties resource, but throwed " + exception.getClass() + ", " + exception.getMessage());
144 		}	
145 	}
146 
147 	@Test
148 	public void testGetStringNullKey() {
149 		assertEquals("", ITrackerResources.getString(null, testLocaleString_));
150 	}
151 
152 	@Test
153 	public void testGetStringDefaultLocaleString() {
154 		ITrackerResources.setDefaultLocale(testLocaleString_);
155 		assertEquals("Admin", ITrackerResources.getString("itracker.web.attr.admin", (String) null));
156 	}
157 
158 	@Test
159 	public void testGetStringWithLocaleString() {
160 		assertEquals("Admin", ITrackerResources.getString("itracker.web.attr.admin", testLocaleString_));
161 	}
162 
163 	@Test
164 	public void testGetStringWithLocaleWithNullKey() {
165 		assertEquals("", ITrackerResources.getString(null, testLocale_));
166 	}
167 
168 	@Test
169 	public void testGetStringWithLocaleWithDirtyKey() {
170 		testResourceBundle_.removeValue("itracker.web.attr.admin", true);
171 		String value = ITrackerResources.getString("itracker.web.attr.admin", testLocale_);
172 
173 
174         // When a language items is removed, the default is loaded from properties.
175         assertEquals("Admin", value);
176 	}
177 
178 	@Test
179 
180 	public void testGetStringWithLocaleWithRemovedKey() {
181 		testResourceBundle_.removeValue("itracker.web.attr.admin", false);
182 		String value = ITrackerResources.getString("itracker.web.attr.admin", testLocale_);
183         // When a language items is removed, the default is loaded from properties.
184 		assertEquals("Admin", value);
185 	}
186 
187 	@Test
188 	public void testGetStringWithWrongLocale() {
189 		Locale locale = new Locale("EEEEEEEEEEe");
190 		String value = ITrackerResources.getString("itracker.web.attr.admin", locale);
191 
192 
193         // When a language items is removed, the default is loaded from properties.
194         assertEquals("Admin", value);
195 	}
196 
197 	@Test
198 	public void testGetStringWithMultipleOptions() {
199 		Object[] options = {"administrator", "administer", "the library"};
200 		String value = ITrackerResources.getString("itracker.web.attr.adminTask", testLocaleString_, options);
201 		assertEquals("The administrator administer the library", value);
202 	}
203 
204 	@Test
205 	public void testGetStringWithSingleOption() {
206 		String value = ITrackerResources.getString("itracker.web.attr.adminTask", testLocaleString_, "administrator");
207 		assertEquals("The administrator  ", value);
208 	}
209 
210 	@Test
211 	public void testGetStringWithLocaleWithSingleOption() {
212 		String value = ITrackerResources.getString("itracker.web.attr.adminTask", testLocale_, "administrator");
213 		assertEquals("The administrator  ", value);
214 	}
215 
216 	@Test
217 	public void testGetCheckForKey() {
218 		ITrackerResources.setDefaultLocale(testLocaleString_);
219 		String value = ITrackerResources.getCheckForKey("itracker.web.attr.admin");
220 		assertEquals("Admin", value);
221 	}
222 
223 	@Test
224 	public void testGetCheckForKeyDirty() {
225 		ITrackerResources.setDefaultLocale(testLocaleString_);
226 		testResourceBundle_.removeValue("itracker.web.attr.admin", true);
227 		String value = ITrackerResources.getCheckForKey("itracker.web.attr.admin");
228 
229         // When a language items is removed, the default is reloaded by the configuration service.
230 
231         assertEquals("Admin", value);
232 	}
233 
234 	@Test
235 	public void testGetCheckForKeyWithWrongBundle() {
236 		ITrackerResources.setDefaultLocale("AAAAAA");
237 		try {
238 			ITrackerResources.getCheckForKey("itracker.web.attr.admin");
239 
240 		} catch (RuntimeException exception) {
241 
242 			fail("throwed " + exception.getClass() + ": " + exception.getMessage());
243 		}
244 	}
245 
246 	@Test
247 	public void testIsLongStringFalse() {
248 		ITrackerResources.setDefaultLocale(testLocaleString_);
249 		assertFalse(ITrackerResources.isLongString("itracker.web.attr.admin"));
250 	}
251 
252 	@Test
253 	public void testIsLongStringTrueLong() {
254 		ITrackerResources.setDefaultLocale(testLocaleString_);
255 		assertTrue(ITrackerResources.isLongString("itracker.web.attr.longString"));
256 	}
257 
258 	@Test
259 	public void testIsLongStringTrueNewLine() {
260 		ITrackerResources.setDefaultLocale(testLocaleString_);
261 		assertTrue(ITrackerResources.isLongString("itracker.web.attr.newLine"));
262 	}
263 
264 	@Test
265 	public void testInitialized() {
266 		ITrackerResources.setInitialized(false);
267 		assertFalse(ITrackerResources.isInitialized());
268 		ITrackerResources.setInitialized(true);
269 		assertTrue(ITrackerResources.isInitialized());
270 	}
271 
272 	@Test
273 	public void testHex() {
274 		assertEquals('0', ITrackerResources.encodeHex(0));
275 		assertEquals(0, ITrackerResources.decodeHex('0'));
276 		assertEquals('1', ITrackerResources.encodeHex(1));
277 		assertEquals(1, ITrackerResources.decodeHex('1'));
278 		assertEquals('2', ITrackerResources.encodeHex(2));
279 		assertEquals(2, ITrackerResources.decodeHex('2'));
280 		assertEquals('3', ITrackerResources.encodeHex(3));
281 		assertEquals(3, ITrackerResources.decodeHex('3'));
282 		assertEquals('4', ITrackerResources.encodeHex(4));
283 		assertEquals(4, ITrackerResources.decodeHex('4'));
284 		assertEquals('5', ITrackerResources.encodeHex(5));
285 		assertEquals(5, ITrackerResources.decodeHex('5'));
286 		assertEquals('6', ITrackerResources.encodeHex(6));
287 		assertEquals(6, ITrackerResources.decodeHex('6'));
288 		assertEquals('7', ITrackerResources.encodeHex(7));
289 		assertEquals(7, ITrackerResources.decodeHex('7'));
290 		assertEquals('8', ITrackerResources.encodeHex(8));
291 		assertEquals(8, ITrackerResources.decodeHex('8'));
292 		assertEquals('9', ITrackerResources.encodeHex(9));
293 		assertEquals(9, ITrackerResources.decodeHex('9'));
294 		assertEquals('A', ITrackerResources.encodeHex(10));
295 		assertEquals(10, ITrackerResources.decodeHex('A'));
296 		assertEquals(10, ITrackerResources.decodeHex('a'));
297 		assertEquals('B', ITrackerResources.encodeHex(11));
298 		assertEquals(11, ITrackerResources.decodeHex('B'));
299 		assertEquals(11, ITrackerResources.decodeHex('b'));
300 		assertEquals('C', ITrackerResources.encodeHex(12));
301 		assertEquals(12, ITrackerResources.decodeHex('C'));
302 		assertEquals(12, ITrackerResources.decodeHex('c'));
303 		assertEquals('D', ITrackerResources.encodeHex(13));
304 		assertEquals(13, ITrackerResources.decodeHex('D'));
305 		assertEquals(13, ITrackerResources.decodeHex('d'));
306 		assertEquals('E', ITrackerResources.encodeHex(14));
307 		assertEquals(14, ITrackerResources.decodeHex('E'));
308 		assertEquals(14, ITrackerResources.decodeHex('e'));
309 		assertEquals('F', ITrackerResources.encodeHex(15));
310 		assertEquals(15, ITrackerResources.decodeHex('F'));
311 		assertEquals(15, ITrackerResources.decodeHex('f'));
312 	}
313 
314 	@Test
315 	public void testUnicodeString() {
316 		String originalString = "itracker unit testing";
317 		String escapedString = ITrackerResources.escapeUnicodeString(originalString, true);
318 		assertEquals(originalString, ITrackerResources.unescapeUnicodeString(escapedString));
319 		escapedString = ITrackerResources.escapeUnicodeString(originalString, false);
320 		assertEquals(originalString, ITrackerResources.unescapeUnicodeString(escapedString));
321 	}
322 
323 	@Override
324 	protected String[] getDataSetFiles() {
325         return new String[]{};
326 	}
327 
328 	@Override
329 	protected String[] getConfigLocations() {
330 		return new String[]{"application-context.xml"};
331 	}
332 }
333 
334