| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You 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 libcore.java.text; |
| |
| import java.text.ChoiceFormat; |
| import java.text.DateFormat; |
| import java.text.FieldPosition; |
| import java.text.Format; |
| import java.text.MessageFormat; |
| import java.text.NumberFormat; |
| import java.text.ParseException; |
| import java.text.ParsePosition; |
| import java.util.Calendar; |
| import java.util.Date; |
| import java.util.Locale; |
| import java.util.TimeZone; |
| import junit.framework.TestCase; |
| import tests.support.Support_MessageFormat; |
| |
| public class OldMessageFormatTest extends TestCase { |
| |
| private MessageFormat format1; |
| |
| protected void setUp() { |
| Locale.setDefault(Locale.US); |
| |
| // test with repeating formats and max argument index < max offset |
| String pattern = "A {3, number, currency} B {2, time} C {0, number, percent} D {4} E {1,choice,0#off|1#on} F {0, date}"; |
| format1 = new MessageFormat(pattern); |
| } |
| |
| public void test_applyPatternLjava_lang_String_AndroidFailure() { |
| MessageFormat format = new MessageFormat("test"); |
| format.setLocale(Locale.FRENCH); // use French since English has the |
| // same LONG and FULL time patterns |
| format.applyPattern("{0,time, Full}"); |
| assertEquals("Wrong full time pattern", "{0,time,full}", format |
| .toPattern()); |
| } |
| |
| public void test_formatToCharacterIteratorLjava_lang_Object() { |
| // Test for method formatToCharacterIterator(java.lang.Object) |
| new Support_MessageFormat( |
| "test_formatToCharacterIteratorLjava_lang_Object") |
| .t_formatToCharacterIterator(); |
| |
| try { |
| new MessageFormat("{1, number}").formatToCharacterIterator(null); |
| fail("NullPointerException was not thrown."); |
| } catch(NullPointerException npe) { |
| //expected |
| } |
| |
| try { |
| new MessageFormat("{0, time}").formatToCharacterIterator(new Object[]{""}); |
| fail("IllegalArgumentException was not thrown."); |
| } catch(IllegalArgumentException iae) { |
| //expected |
| } |
| } |
| |
| public void test_getLocale() { |
| try { |
| Locale[] l = { |
| Locale.FRANCE, |
| Locale.KOREA, |
| new Locale(Locale.FRANCE.getCountry(), Locale.FRANCE |
| .getLanguage()), new Locale("mk"), |
| new Locale("mk", "MK"), Locale.US, |
| new Locale("#ru", "@31230") }; |
| |
| String pattern = "getLocale test {0,number,#,####}"; |
| MessageFormat mf; |
| |
| for (int i = 0; i < 0; i++) { |
| mf = new MessageFormat(pattern, l[i]); |
| Locale result = mf.getLocale(); |
| assertEquals("Returned local: " + result + " instead of " |
| + l[i], l[i], result); |
| assertEquals("Returned language: " + result.getLanguage() |
| + " instead of " + l[i].getLanguage(), l[i] |
| .getLanguage(), result.getLanguage()); |
| assertEquals("Returned country: " + result.getCountry() |
| + " instead of " + l[i].getCountry(), |
| l[i].getCountry(), result.getCountry()); |
| } |
| |
| mf = new MessageFormat(pattern); |
| mf.setLocale(null); |
| Locale result = mf.getLocale(); |
| assertEquals("Returned local: " + result + " instead of null", |
| null, result); |
| } catch (Exception e) { |
| fail("unexpected exception " + e.toString()); |
| } |
| } |
| |
| /** |
| * @tests java.text.MessageFormat#setFormat(int, Format) Test of method |
| * java.text.MessageFormat#setFormat(int, Format). Case 1: Compare |
| * getFormats() results after calls to setFormat(). Case 2: Try to |
| * call setFormat() using incorrect index. |
| */ |
| public void test_setFormatILjava_text_Format() { |
| try { |
| // case 1: Compare getFormats() results after calls to setFormat() |
| MessageFormat f1 = (MessageFormat) format1.clone(); |
| f1.setFormat(0, DateFormat.getTimeInstance()); |
| f1.setFormat(1, DateFormat.getTimeInstance()); |
| f1.setFormat(2, NumberFormat.getInstance()); |
| f1.setFormat(3, new ChoiceFormat("0#off|1#on")); |
| f1.setFormat(4, new ChoiceFormat("1#few|2#ok|3#a lot")); |
| f1.setFormat(5, DateFormat.getTimeInstance()); |
| |
| Format[] formats = f1.getFormats(); |
| formats = f1.getFormats(); |
| |
| Format[] correctFormats = new Format[] { |
| DateFormat.getTimeInstance(), DateFormat.getTimeInstance(), |
| NumberFormat.getInstance(), new ChoiceFormat("0#off|1#on"), |
| new ChoiceFormat("1#few|2#ok|3#a lot"), |
| DateFormat.getTimeInstance() }; |
| |
| assertEquals("Test1A:Returned wrong number of formats:", |
| correctFormats.length, formats.length); |
| for (int i = 0; i < correctFormats.length; i++) { |
| assertEquals( |
| "Test1B:wrong format for pattern index " + i + ":", |
| correctFormats[i], formats[i]); |
| } |
| |
| // case 2: Try to setFormat using incorrect index |
| try { |
| f1.setFormat(-1, DateFormat.getDateInstance()); |
| fail("Expected ArrayIndexOutOfBoundsException was not thrown"); |
| f1.setFormat(f1.getFormats().length, DateFormat |
| .getDateInstance()); |
| fail("Expected ArrayIndexOutOfBoundsException was not thrown"); |
| } catch (ArrayIndexOutOfBoundsException e) { |
| // expected |
| } |
| } catch (Exception e) { |
| fail("Unexpected exception " + e.toString()); |
| } |
| } |
| |
| public void test_format$Ljava_lang_ObjectLjava_lang_StringBufferLjava_text_FieldPosition() { |
| // Test for method java.lang.StringBuffer |
| // java.text.MessageFormat.format(java.lang.Object [], |
| // java.lang.StringBuffer, java.text.FieldPosition) |
| MessageFormat format = new MessageFormat("{1,number,integer}"); |
| StringBuffer buffer = new StringBuffer(); |
| format.format(new Object[] { "0", new Double(53.863) }, buffer, |
| new FieldPosition(MessageFormat.Field.ARGUMENT)); |
| assertEquals("Wrong result", "54", buffer.toString()); |
| |
| format.format(new Object[] { "0", new Double(53.863) }, buffer, |
| new FieldPosition(MessageFormat.Field.ARGUMENT)); |
| |
| assertEquals("Wrong result", "5454", buffer.toString()); |
| |
| buffer = new StringBuffer(); |
| format |
| .applyPattern("{0,choice,0#zero|1#one '{1,choice,2#two {2,time}}'}"); |
| Date date = new Date(); |
| String expected = "one two " |
| + DateFormat.getTimeInstance().format(date); |
| format.format(new Object[] { new Double(1.6), |
| new Integer(3), date }, buffer, new FieldPosition(MessageFormat |
| .Field.ARGUMENT)); |
| assertEquals("Choice not recursive:\n" + expected + "\n" + buffer, |
| expected, buffer.toString()); |
| |
| StringBuffer str = format.format(new Object[] { new Double(0.6), |
| new Integer(3)}, buffer, null); |
| |
| assertEquals(expected + "zero", str.toString()); |
| assertEquals(expected + "zero", buffer.toString()); |
| |
| try { |
| format.format(new Object[] { "0", new Double(1), "" }, buffer, |
| new FieldPosition(MessageFormat.Field.ARGUMENT)); |
| fail("IllegalArgumentException was not thrown."); |
| } catch(IllegalArgumentException iae) { |
| //expected |
| } |
| |
| try { |
| format.format(new Object[] { "", new Integer(3)}, buffer, |
| new FieldPosition(MessageFormat.Field.ARGUMENT)); |
| fail("IllegalArgumentException was not thrown."); |
| } catch(IllegalArgumentException iae) { |
| //expected |
| } |
| } |
| |
| public void test_formatLjava_lang_StringLjava_lang_Object() { |
| TimeZone.setDefault(TimeZone.getTimeZone("UTC")); |
| int iCurrency = 123; |
| int iInteger = Integer.MIN_VALUE; |
| |
| Date date = new Date(12345678); |
| Object[] args = { date, iCurrency, iInteger }; |
| String resStr = "Date: Jan 1, 1970 Currency: $" + iCurrency |
| + ".00 Integer: -2,147,483,648"; |
| String pattern = "Date: {0,date} Currency: {1, number, currency} Integer: {2, number, integer}"; |
| String sFormat = MessageFormat.format(pattern, (Object[]) args); |
| assertEquals( |
| "format(String, Object[]) with valid parameters returns incorrect string: case 1", |
| sFormat, resStr); |
| |
| pattern = "abc {4, number, integer} def {3,date} ghi {2,number} jkl {1,choice,0#low|1#high} mnop {0}"; |
| resStr = "abc -2,147,483,648 def Jan 1, 1970 ghi -2,147,483,648 jkl high mnop -2,147,483,648"; |
| Object[] args_ = { iInteger, 1, iInteger, date, iInteger }; |
| sFormat = MessageFormat.format(pattern, args_); |
| assertEquals( |
| "format(String, Object[]) with valid parameters returns incorrect string: case 1", |
| sFormat, resStr); |
| |
| try { |
| args = null; |
| MessageFormat.format(null, args); |
| fail("Doesn't throw IllegalArgumentException: null, null"); |
| } catch (Exception e) { |
| // expected |
| } |
| |
| try { |
| MessageFormat.format("Invalid {1,foobar} format descriptor!", |
| new Object[] {iInteger} ); |
| fail("Doesn't throw IllegalArgumentException with invalid pattern as a parameter: case 1"); |
| } catch (IllegalArgumentException ex) { |
| // expected |
| } |
| |
| try { |
| MessageFormat.format( |
| "Invalid {1,date,invalid-spec} format descriptor!", new Object[]{""}); |
| fail("Doesn't throw IllegalArgumentException with invalid pattern as a parameter: case 2"); |
| } catch (IllegalArgumentException ex) { |
| // expected |
| } |
| |
| try { |
| MessageFormat.format("{0,number,integer", new Object[] {iInteger}); |
| fail("Doesn't throw IllegalArgumentException, doesn't detect unmatched brackets"); |
| } catch (IllegalArgumentException ex) { |
| // expected |
| } |
| |
| try { |
| MessageFormat.format( |
| "Valid {1, date} format {0, number} descriptor!", new Object[]{ "" } ); |
| fail("Doesn't throw IllegalArgumentException with invalid Object array"); |
| } catch (IllegalArgumentException ex) { |
| // expected |
| } |
| } |
| |
| public void test_formatLjava_lang_ObjectLjava_lang_StringBufferLjava_text_FieldPosition() { |
| // Test for method java.lang.StringBuffer |
| // java.text.MessageFormat.format(java.lang.Object, |
| // java.lang.StringBuffer, java.text.FieldPosition) |
| new Support_MessageFormat( |
| "test_formatLjava_lang_ObjectLjava_lang_StringBufferLjava_text_FieldPosition") |
| .t_format_with_FieldPosition(); |
| |
| String pattern = "On {4,date} at {3,time}, he ate {2,number, integer} " + |
| "hamburger{2,choice,1#|1<s}."; |
| MessageFormat format = new MessageFormat(pattern, Locale.US); |
| |
| Object[] objects = new Object[] { "", new Integer(3), 8, ""}; |
| |
| try { |
| format.format(objects, new StringBuffer(), |
| new FieldPosition(DateFormat.Field.AM_PM)); |
| fail("IllegalArgumentException was not thrown."); |
| } catch(IllegalArgumentException iae) { |
| //expected |
| } |
| } |
| |
| public void test_setFormats$Ljava_text_Format() { |
| try { |
| MessageFormat f1 = (MessageFormat) format1.clone(); |
| |
| // case 1: Test with repeating formats and max argument index < max |
| // offset |
| // compare getFormats() results after calls to setFormats(Format[]) |
| Format[] correctFormats = new Format[] { |
| DateFormat.getTimeInstance(), |
| new ChoiceFormat("0#off|1#on"), |
| DateFormat.getTimeInstance(), |
| NumberFormat.getCurrencyInstance(), |
| new ChoiceFormat("1#few|2#ok|3#a lot") }; |
| |
| f1.setFormats(correctFormats); |
| Format[] formats = f1.getFormats(); |
| |
| assertTrue("Test1A:Returned wrong number of formats:", |
| correctFormats.length <= formats.length); |
| for (int i = 0; i < correctFormats.length; i++) { |
| assertEquals("Test1B:wrong format for argument index " + i |
| + ":", correctFormats[i], formats[i]); |
| } |
| |
| // case 2: Try to pass null argument to setFormats(). |
| try { |
| f1.setFormats(null); |
| fail("Expected exception NullPointerException was not thrown"); |
| } catch (NullPointerException e) { |
| // expected |
| } |
| } catch (Exception e) { |
| fail("Unexpected exception " + e.toString()); |
| } |
| } |
| |
| public void test_parseLjava_lang_String() throws ParseException { |
| String pattern = "A {3, number, currency} B {2, time} C {0, number, percent} D {4} E {1,choice,0#off|1#on} F {0, date}"; |
| MessageFormat mf = new MessageFormat(pattern); |
| String sToParse = "A $12,345.00 B 9:56:07 AM C 3,200% D 1/15/70 9:56 AM E on F Jan 1, 1970"; |
| Object[] result; |
| try { |
| result = mf.parse(sToParse); |
| |
| assertTrue("No result: " + result.length, result.length == 5); |
| assertTrue("Object 0 is not date", result[0] instanceof Date); |
| assertEquals("Object 1 is not stringr", result[1].toString(), "1.0"); |
| assertTrue("Object 2 is not date", result[2] instanceof Date); |
| assertEquals("Object 3 is not number", result[3].toString(), |
| "12345"); |
| assertEquals("Object 4 is not string", result[4].toString(), |
| "1/15/70 9:56 AM"); |
| |
| } catch (java.text.ParseException pe) { |
| fail("ParseException is thrown for incorrect string " + sToParse); |
| } |
| |
| sToParse = "xxdate is Feb 28, 1999"; |
| try { |
| result = format1.parse(sToParse); |
| fail("ParseException is thrown for incorrect string " + sToParse); |
| } catch (java.text.ParseException pe) { |
| // expected |
| } |
| |
| sToParse = "vm=Test, @3 4 6, 3 "; |
| mf = new MessageFormat("vm={0},{1},{2}"); |
| try { |
| result = mf.parse(sToParse); |
| assertTrue("No result: " + result.length, result.length == 3); |
| assertEquals("Object 0 is not string", result[0].toString(), "Test"); |
| assertEquals("Object 1 is not string", result[1].toString(), |
| " @3 4 6"); |
| assertEquals("Object 2 is not string", result[2].toString(), |
| " 3 "); |
| } catch (java.text.ParseException pe) { |
| fail("ParseException is thrown for correct string " + sToParse); |
| } |
| |
| try { |
| result = mf.parse(null); |
| fail("ParseException is not thrown for null " + sToParse); |
| } catch (java.text.ParseException pe) { |
| // expected |
| } |
| } |
| |
| /** |
| * @tests java.text.MessageFormat#parseObject(java.lang.String, |
| * java.text.ParsePosition) Test of method |
| * java.text.MessageFormat#parseObject(java.lang.String, |
| * java.text.ParsePosition). Case 1: Parsing of correct data string. |
| * Case 2: Parsing of partial correct data string. Case 3: Try to use |
| * argument ParsePosition as null. |
| */ |
| public void test_parseObjectLjava_lang_StringLjavajava_text_ParsePosition() { |
| MessageFormat mf = new MessageFormat("{0,number,#.##}, {0,number,#.#}"); |
| try { |
| // case 1: Try to parse correct data string. |
| Object[] objs = { new Double(3.1415) }; |
| String result = mf.format(objs); |
| // result now equals "3.14, 3.1" |
| Object[] res = null; |
| ParsePosition pp = new ParsePosition(0); |
| int parseIndex = pp.getIndex(); |
| res = (Object[]) mf.parseObject(result, pp); |
| assertTrue("Parse operation return null", res != null); |
| assertTrue("parse operation return array with incorrect length", |
| 1 == res.length); |
| assertTrue("ParseIndex is incorrect", pp.getIndex() != parseIndex); |
| assertTrue("Result object is incorrect", new Double(3.1) |
| .equals(res[0])); |
| |
| // case 2: Try to parse partially correct data string. |
| pp.setIndex(0); |
| char[] cur = result.toCharArray(); |
| cur[cur.length / 2] = 'Z'; |
| String partialCorrect = new String(cur); |
| res = (Object[]) mf.parseObject(partialCorrect, pp); |
| assertTrue("Parse operation return null", res == null); |
| assertTrue("ParseIndex is incorrect", pp.getIndex() == 0); |
| assertTrue("ParseErrorIndex is incorrect", |
| pp.getErrorIndex() == cur.length / 2); |
| |
| // case 3: Try to use argument ParsePosition as null. |
| try { |
| mf.parseObject(result, null); |
| fail("Expected NullPointerException was not thrown"); |
| } catch (NullPointerException e) { |
| // expected |
| } |
| } catch (Exception e) { |
| fail("Unexpected exception " + e.toString()); |
| } |
| } |
| |
| public void test_format_Object() { |
| // Regression for HARMONY-1875 |
| Locale.setDefault(Locale.CANADA); |
| TimeZone.setDefault(TimeZone.getTimeZone("UTC")); |
| String pat = "text here {0,date,yyyyyyyyy} and here"; |
| Calendar c = Calendar.getInstance(); |
| String etalon = "text here 00000" + c.get(Calendar.YEAR) + " and here"; |
| MessageFormat obj = new MessageFormat(pat); |
| assertEquals(etalon, obj.format(new Object[] { new Date() })); |
| } |
| |
| public void test_parseLjava_lang_StringLjava_text_ParsePosition() { |
| ParsePosition pos = new ParsePosition(2); |
| |
| MessageFormat mf = new MessageFormat("{0}; {0}; {0}"); |
| String parse = "a; b; c"; |
| try { |
| mf.parse(parse, null); |
| fail("NullPointerException was not thrown."); |
| } catch(NullPointerException npe) { |
| //expected |
| } |
| |
| try { |
| mf.parse(null, pos); |
| } catch(NullPointerException npe) { |
| fail("NullPointerException was thrown."); |
| } |
| } |
| } |