/*
* Copyright 2008 Google Inc.
*
* 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.google.gwt.i18n.server;
import com.google.gwt.i18n.server.MessageFormatUtils.ArgumentChunk;
import com.google.gwt.i18n.server.MessageFormatUtils.MessageStyle;
import com.google.gwt.i18n.server.MessageFormatUtils.StaticArgChunk;
import com.google.gwt.i18n.server.MessageFormatUtils.StringChunk;
import com.google.gwt.i18n.server.MessageFormatUtils.TemplateChunk;
import com.google.gwt.i18n.server.MessageFormatUtils.VisitorAbortException;
import junit.framework.TestCase;
import java.text.ParseException;
import java.util.List;
import java.util.Map;
/**
* Test for {@link MessageFormatUtils}.
*/
public class MessageFormatParserTest extends TestCase {
public void testList() throws ParseException {
String str = "{0,list:max=3,number:curcode=1:space,currency}";
List<TemplateChunk> parsed = MessageStyle.MESSAGE_FORMAT.parse(str);
assertEquals(1, parsed.size());
ArgumentChunk chunk = (ArgumentChunk) parsed.get(0);
assertTrue(chunk.isList());
assertEquals("number", chunk.getFormat());
assertEquals("currency", chunk.getSubFormat());
Map<String, String> args = chunk.getListArgs();
assertEquals(1, args.size());
assertEquals("3", args.get("max"));
args = chunk.getFormatArgs();
assertEquals(2, args.size());
assertEquals("1", args.get("curcode"));
assertEquals("", args.get("space"));
str = "{0,list,number}";
parsed = MessageStyle.MESSAGE_FORMAT.parse(str);
assertEquals(1, parsed.size());
chunk = (ArgumentChunk) parsed.get(0);
assertTrue(chunk.isList());
assertEquals("number", chunk.getFormat());
assertNull(chunk.getSubFormat());
args = chunk.getListArgs();
assertEquals(0, args.size());
args = chunk.getFormatArgs();
assertEquals(0, args.size());
}
public void testParseInnerPlural() throws ParseException {
String str = "You have {#} widgets";
List<TemplateChunk> parsed = MessageStyle.MESSAGE_FORMAT.parse(str);
assertEquals(3, parsed.size());
StringChunk stringChunk = (StringChunk) parsed.get(0);
assertEquals("You have ", stringChunk.getString());
ArgumentChunk argChunk = (ArgumentChunk) parsed.get(1);
assertEquals(-1, argChunk.getArgumentNumber());
assertEquals("{#}", argChunk.getAsMessageFormatString());
stringChunk = (StringChunk) parsed.get(2);
assertEquals(" widgets", stringChunk.getString());
}
public void testParseLiteral() throws ParseException {
String str = "Simple string literal";
List<TemplateChunk> parsed = MessageStyle.MESSAGE_FORMAT.parse(str);
assertEquals(1, parsed.size());
TemplateChunk chunk = parsed.get(0);
assertTrue(chunk.isLiteral());
assertEquals(str, chunk.getString());
}
public void testParseNestedQuoting() throws ParseException {
String str = "'Don''t worry about nested quotes'";
List<TemplateChunk> parsed = MessageStyle.MESSAGE_FORMAT.parse(str);
assertEquals(1, parsed.size());
TemplateChunk chunk = parsed.get(0);
assertTrue(chunk.isLiteral());
assertEquals("Don't worry about nested quotes", chunk.getString());
}
public void testParseQuoting() throws ParseException {
String str = "Don''t replace '{0}' or '{'0'}'";
List<TemplateChunk> parsed = MessageStyle.MESSAGE_FORMAT.parse(str);
assertEquals(1, parsed.size());
TemplateChunk chunk = parsed.get(0);
assertTrue(chunk.isLiteral());
assertEquals("Don't replace {0} or {0}", chunk.getString());
}
public void testParseSimple1() throws ParseException {
String str = "{0}";
List<TemplateChunk> parsed = MessageStyle.MESSAGE_FORMAT.parse(str);
assertEquals(1, parsed.size());
TemplateChunk chunk = parsed.get(0);
assertFalse(chunk.isLiteral());
assertEquals("{0}", chunk.getString());
ArgumentChunk argChunk = (ArgumentChunk) chunk;
assertEquals(0, argChunk.getArgumentNumber());
assertNull(argChunk.getFormat());
assertNull(argChunk.getSubFormat());
}
public void testParseSimple2() throws ParseException {
String str = "Message {0} has one arg, '{0}'";
List<TemplateChunk> parsed = MessageStyle.MESSAGE_FORMAT.parse(str);
assertEquals(3, parsed.size());
TemplateChunk chunk = parsed.get(0);
assertTrue(chunk.isLiteral());
assertEquals("Message ", chunk.getString());
chunk = parsed.get(1);
assertFalse(chunk.isLiteral());
assertEquals("{0}", chunk.getString());
ArgumentChunk argChunk = (ArgumentChunk) chunk;
assertEquals(0, argChunk.getArgumentNumber());
assertNull(argChunk.getFormat());
assertNull(argChunk.getSubFormat());
chunk = parsed.get(2);
assertTrue(chunk.isLiteral());
assertEquals(" has one arg, {0}", chunk.getString());
}
public void testRoundTrip() throws ParseException, VisitorAbortException {
// Note that the quoting will not necessarily be reproduced, only that the
// returned result is functionally equivalent. So, some of these strings
// are carefully constructed to match the form which will be returned.
String[] testStrings = new String[] {
"Simple string literal",
"{0}",
"'{'0'}'",
"Don''t tell me it''s broken",
"'{'0'}' {1,list:max=3,a'{'0'}'=''b''}",
};
for (String str : testStrings) {
List<TemplateChunk> parsed = MessageStyle.MESSAGE_FORMAT.parse(str);
String out = MessageStyle.MESSAGE_FORMAT.assemble(parsed);
assertEquals(str, out);
}
}
public void testStaticArg() throws ParseException {
String str = "{beginBold,<b>}bold{endBold,</b>}";
List<TemplateChunk> parsed = MessageStyle.MESSAGE_FORMAT.parse(str);
assertEquals(3, parsed.size());
StaticArgChunk staticArg = (StaticArgChunk) parsed.get(0);
assertEquals("beginBold", staticArg.getArgName());
assertEquals("<b>", staticArg.getReplacement());
StringChunk stringChunk = (StringChunk) parsed.get(1);
assertEquals("bold", stringChunk.getString());
staticArg = (StaticArgChunk) parsed.get(2);
assertEquals("endBold", staticArg.getArgName());
assertEquals("</b>", staticArg.getReplacement());
str = "{test,'{}'''}";
parsed = MessageStyle.MESSAGE_FORMAT.parse(str);
assertEquals(1, parsed.size());
staticArg = (StaticArgChunk) parsed.get(0);
assertEquals("test", staticArg.getArgName());
assertEquals("{}'", staticArg.getReplacement());
}
}