/* * Copyright 2011 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.client.Constants; import com.google.gwt.i18n.client.LocalizableResource; import com.google.gwt.i18n.client.LocalizableResource.DefaultLocale; import com.google.gwt.i18n.client.Messages; import com.google.gwt.i18n.server.MessageCatalogFactory.Context; import com.google.gwt.i18n.server.MessageCatalogFactory.Writer; import com.google.gwt.i18n.server.impl.ReflectionMessageInterface; import com.google.gwt.i18n.server.testing.MockMessageCatalogContext; import com.google.gwt.i18n.shared.GwtLocaleFactory; import com.google.gwt.safehtml.shared.SafeHtml; import junit.framework.TestCase; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.util.Map; /** * Base class for tests of {@link MessageCatalogFactory} implementations. */ public abstract class MessageCatalogFactoryTestBase extends TestCase { // NOTE: ALL ARGUMENT NAMES ARE ARG0 ETC DUE TO CURRENT LIMITATIONS IN THE // REFLECTION-BASED IMPLEMENTATION /** * Test various messages with alternate forms. */ public interface AlternateFormMessages extends Messages { @Description("Notification that you gave access to another person") @DefaultMessage("You gave them access to your profile") @AlternateMessage({ "MALE", "You gave him access to your profile", "FEMALE", "You gave her access to your profile"}) @Key("1") String genderSelect(@Select Gender arg0); @Description("Time until next meeting, either full or abbreviated") @DefaultMessage("Your next meeting is in {1} hours") @AlternateMessage({ "true|one", "Next meeting: 1 hr", "other|one", "Your next meeting is in one hour", "true|other", "Next meeting: {1} hrs" }) @Key("2") String nextMeeting(@Select boolean arg0, @PluralCount @Example("3") int arg1); @Description("Number of widgets you have") @DefaultMessage("You have {0} widgets") @AlternateMessage({"one", "You have one widget"}) @Key("3") String onePlural(@PluralCount @Example("42") int arg0); } /** * Represents gender of a person. */ public enum Gender { MALE, FEMALE, UNKNOWN, } /** * Test interface that mixes Messages and Constants together. */ @DefaultLocale("en_US") public interface MixedConstantsMessages extends Messages, Constants { @Description("Example string constant with single quote") @DefaultStringValue("don't quote me") @Key("1") String constantSingleQuote(); @Description("Example integer constant") @DefaultIntValue(42) @Key("2") int lifeTheUniverseAndEverything(); @Description("Example string map constant") @DefaultStringMapValue({ "apple", "red", "orange", "orange", "banana", "yellow", "pepper", "green" }) @Key("3") Map<String, String> mapFruitsToColors(); @Description("A message that tests MessageFormat-style quoting") @DefaultMessage("don''t quote me '{'0'}' - {0}") @Key("4") SafeHtml messageSingleQuote(@Example("arbitrary") String arg0); @Description("A message with a meaning") @Meaning("the fruit") @DefaultMessage("orange") @Key("5") String orange(); } protected static BufferedReader getReader(byte[] bytes) throws UnsupportedEncodingException { return new BufferedReader(new InputStreamReader( new ByteArrayInputStream(bytes), "UTF8")); } protected final GwtLocaleFactory localeFactory = new GwtLocaleFactoryImpl(); protected abstract MessageCatalogFactory getMessageCatalogFactory(); protected byte[] run(Class<? extends LocalizableResource> clazz) throws MessageProcessingException, IOException { MessageCatalogFactory factory = getMessageCatalogFactory(); MessageInterface msgIntf = new ReflectionMessageInterface(localeFactory, clazz); ByteArrayOutputStream baos = new ByteArrayOutputStream(); Context ctx = new MockMessageCatalogContext(baos); Writer writer = factory.getWriter(ctx, clazz.getCanonicalName()); try { MessageInterfaceVisitor cv = writer.visitClass(); msgIntf.accept(cv); } finally { writer.close(); } return baos.toByteArray(); } protected void assertResult(byte[] bytes, String... lines) throws IOException { String error = "Mismatch from:\n" + new String(bytes, "UTF-8"); BufferedReader reader = getReader(bytes); int lineNum = 0; for (String line : lines) { assertEquals(error + " - line " + (++lineNum), line, reader.readLine()); } } }