/* * 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()); } }