/*
* Copyright (c) 2002-2012 Alibaba Group Holding Limited.
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.citrus.util.i18n;
import static com.alibaba.citrus.test.TestUtil.*;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.nio.charset.UnsupportedCharsetException;
import java.util.Locale;
import org.junit.Test;
public class LocaleInfoTests {
private LocaleInfo localeInfo;
@Test
public void createSystemLocaleInfo() {
localeInfo = new LocaleInfo();
assertNotNull(localeInfo.getLocale());
assertNotNull(localeInfo.getCharset());
}
@Test
public void create_noLocale_noCharset() {
try {
LocaleUtil.setDefault(Locale.CHINA, "GB18030");
localeInfo = new LocaleInfo(null);
assertEquals(Locale.CHINA, localeInfo.getLocale());
assertEquals("GB18030", localeInfo.getCharset().name());
} finally {
LocaleUtil.resetDefault();
}
}
@Test
public void create_withLocale_noCharset() {
try {
LocaleUtil.setDefault(Locale.CHINA, "GB18030");
localeInfo = new LocaleInfo(Locale.US);
assertEquals(Locale.US, localeInfo.getLocale());
assertEquals("UTF-8", localeInfo.getCharset().name()); // 全能charset
} finally {
LocaleUtil.resetDefault();
}
}
@Test
public void create_withLocale_withCharset() {
try {
LocaleUtil.setDefault(Locale.CHINA, "GB18030");
localeInfo = new LocaleInfo(Locale.US, "8859_1");
assertEquals(Locale.US, localeInfo.getLocale());
assertEquals("ISO-8859-1", localeInfo.getCharset().name());
assertTrue(localeInfo.isCharsetSupported());
assertSame(localeInfo, localeInfo.assertCharsetSupported());
} finally {
LocaleUtil.resetDefault();
}
}
@Test
public void create_withLocale_unknwonCharset() {
try {
LocaleUtil.setDefault(Locale.CHINA, "GB18030");
localeInfo = new LocaleInfo(Locale.US, "unknown");
assertEquals(Locale.US, localeInfo.getLocale());
assertEquals("unknown", localeInfo.getCharset().name());
assertFalse(localeInfo.isCharsetSupported());
try {
localeInfo.assertCharsetSupported();
fail();
} catch (UnsupportedCharsetException e) {
assertEquals("unknown", e.getCharsetName());
}
} finally {
LocaleUtil.resetDefault();
}
}
@Test
public void create_noFallback() {
try {
new LocaleInfo(null, null, null);
fail();
} catch (IllegalArgumentException e) {
assertThat(e, exception("fallbackLocaleInfo"));
}
}
@Test
public void equalsHashCode() {
LocaleInfo l1 = new LocaleInfo(Locale.CHINA, "GB18030");
LocaleInfo l2 = new LocaleInfo(Locale.CHINA, "GB18030");
LocaleInfo l3 = new LocaleInfo(Locale.US, "8859_1");
assertEquals(l1, l2);
assertEquals(l1.hashCode(), l2.hashCode());
assertThat(l1, not(equalTo(l3)));
assertThat(l1.hashCode(), not(equalTo(l3.hashCode())));
assertTrue(l1.equals(l1));
assertFalse(l1.equals(null));
assertFalse(l1.equals("not a locale"));
}
@Test
public void clone_() {
localeInfo = new LocaleInfo(Locale.US, "8859_1");
assertNotSame(localeInfo, localeInfo.clone());
assertEquals(localeInfo, localeInfo.clone());
}
@Test
public void toString_() {
localeInfo = new LocaleInfo(Locale.US, "8859_1");
assertEquals("en_US:ISO-8859-1", localeInfo.toString());
}
@Test
public void parse() {
try {
localeInfo = LocaleInfo.parse(null);
fail();
} catch (IllegalArgumentException e) {
assertThat(e, exception("no locale name"));
}
try {
localeInfo = LocaleInfo.parse(" ");
fail();
} catch (IllegalArgumentException e) {
assertThat(e, exception("no locale name"));
}
assertEquals("en_US:UTF-8", LocaleInfo.parse(" en_US ").toString());
assertEquals("en_US:UTF-8", LocaleInfo.parse(" en_US : ").toString());
assertEquals("en_US:ISO-8859-1", LocaleInfo.parse(" en_US : 8859_1").toString());
}
@Test
public void parse_unknown() {
assertEquals("en_US:unknown", LocaleInfo.parse(" en_US : unknown").toString());
assertFalse(LocaleInfo.parse(" en_US : unknown").isCharsetSupported());
try {
LocaleInfo.parse(" en_US : unknown").assertCharsetSupported();
fail();
} catch (UnsupportedCharsetException e) {
assertEquals("unknown", e.getCharsetName());
}
}
@Test
public void serialize() throws Exception {
localeInfo = new LocaleInfo(Locale.US, "8859_1");
// write
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(localeInfo);
oos.close();
// read
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
LocaleInfo copy = (LocaleInfo) ois.readObject();
assertNotSame(localeInfo, copy);
assertEquals(localeInfo, copy);
}
}