blob: b74364697702401fc0ccc63398bd1787e69f9302 [file] [log] [blame]
/*
* 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());
}
}
}