/*
 * 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.client;

import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.TestAnnotatedMessages.Gender;
import com.google.gwt.i18n.client.TestAnnotatedMessages.Nested;
import com.google.gwt.i18n.client.constants.TimeZoneConstants;
import com.google.gwt.i18n.client.gen.Colors;
import com.google.gwt.i18n.client.gen.TestBadKeys;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
 * Test the same things as I18NTest but with a different module which
 * uses different locales.
 */
public class I18N2Test extends GWTTestCase {

  @Override
  public String getModuleName() {
    return "com.google.gwt.i18n.I18N2Test";
  }

  @SuppressWarnings("deprecation")
  public void testAnnotatedMessages() {
    TestAnnotatedMessages m = GWT.create(TestAnnotatedMessages.class);
    assertEquals("Test me", m.basicText());
    assertEquals("Once more, with meaning", m.withMeaning());
    assertEquals("One argument: one", m.oneArgument("one"));
    assertEquals("One argument, which is optional",
        m.optionalArgument("where am I?"));
    assertEquals("Two arguments, second and first, inverted",
        m.invertedArguments("first", "second"));
    assertEquals("Don't tell me I can't {quote things in braces}", m.quotedText());
    assertEquals("This {0} would be an argument if not quoted", m.quotedArg());
    assertEquals("Total is US$11,305.01", m.currencyFormat(11305.01));
    assertEquals("Default number format is 1,017.1", m.defaultNumberFormat(1017.1));
    assertEquals("It is 12:01 on Saturday, 2007 December 01",
        m.getTimeDate(new Date(107, 11, 1, 12, 1, 2)));
    assertEquals("13 widgets", m.pluralWidgetsOther(13));
//    assertEquals("A widget", m.pluralWidgetsOther(1));
  }

  public void testBadKeys() {
    TestBadKeys test = GWT.create(TestBadKeys.class);
    assertEquals("zh_spacer", test.zh_spacer());
    assertEquals("zh_spacer", test.getString("zh_spacer"));
    assertEquals("logger_org_hibernate_jdbc", test.logger_org_hibernate_jdbc());
    assertEquals("logger_org_hibernate_jdbc",
        test.getString("logger_org_hibernate_jdbc"));
    assertEquals("cell_2_5", test.cell_2_5());
    assertEquals("cell_2_5", test.getString("cell_2_5"));
    assertEquals("_level", test._level());
    assertEquals("_level", test.getString("_level"));
    assertEquals("__s", test.__s());
    assertEquals("__s", test.getString("__s"));
    assertEquals(
        "________________________________________________________________",
        test.________________________________________________________________());
    assertEquals(
        "________________________________________________________________",
        test.getString("________________________________________________________________"));
    assertEquals("_", test._());
    assertEquals("_", test.getString("_"));
    assertEquals("maven_jdiff_old_tag", test.maven_jdiff_old_tag());
    assertEquals("maven_jdiff_old_tag", test.getString("maven_jdiff_old_tag"));
    assertEquals("maven_checkstyle_properties",
        test.maven_checkstyle_properties());
    assertEquals("maven_checkstyle_properties",
        test.getString("maven_checkstyle_properties"));
    assertEquals("_1_2_3_4", test._1_2_3_4());
    assertEquals("_1_2_3_4", test.getString("_1_2_3_4"));
    assertEquals("entity_160", test.entity_160());
    assertEquals("entity_160", test.getString("entity_160"));
    assertEquals("a__b", test.a__b());
    assertEquals("a__b", test.getString("a__b"));
    assertEquals("AWT_f5", test.AWT_f5());
    assertEquals("AWT_f5", test.getString("AWT_f5"));
    assertEquals("Cursor_MoveDrop_32x32_File",
        test.Cursor_MoveDrop_32x32_File());
    assertEquals("Cursor_MoveDrop_32x32_File",
        test.getString("Cursor_MoveDrop_32x32_File"));
    assertEquals("_c_____", test._c_____());
    assertEquals("_c_____", test.getString("_c_____"));
    assertEquals("__s_dup", test.__s_dup());
    assertEquals("__s_dup", test.getString("__s_dup"));
    assertEquals("__dup", test.__dup());
    assertEquals("__dup", test.getString("__dup"));
    assertEquals("AWT_end", test.AWT_end());
    assertEquals("AWT_end", test.getString("AWT_end"));
    assertEquals("permissions_755", test.permissions_755());
    assertEquals("permissions_755", test.getString("permissions_755"));
    assertEquals("a_b_c", test.a_b_c());
    assertEquals("a_b_c", test.getString("a_b_c"));
    assertEquals("__s_dup_dup", test.__s_dup_dup());
    assertEquals("e in b_C_d", test.getString("__dup_dup"));
    assertEquals("e in b_C_d", test.__dup_dup());
    assertEquals("andStar", test.getString("__"));
    assertEquals("andStar", test.__());
  }

  public void testBinding() {
    TestBinding t = GWT.create(TestBinding.class);
    assertEquals("b_c_d", t.a());
    assertEquals("default", t.b());
  }

  public void testCheckColorsAndShapes() {
    ColorsAndShapes s = GWT.create(ColorsAndShapes.class);
    // Red comes from Colors_b_C_d
    assertEquals("red_b_C_d", s.red());
    // Blue comes from Colors_b_C
    assertEquals("blue_b_C", s.blue());
    // Yellow comes from Colors_b
    assertEquals("yellow_b", s.yellow());
    // RedSquare comes from ColorsAndShapes
    assertEquals("red square", s.redSquare());
    // Circle comes from Shapes
    assertEquals("a circle", s.circle());
  }

  public void testDynamicCurrency() {
    TestAnnotatedMessages m = GWT.create(TestAnnotatedMessages.class);
    assertEquals("The total is AU$1,001.02", m.totalAmount(1001.02, "AUD"));
    assertEquals("The total is US$1,001.02", m.totalAmount(1001.02, "USD"));

    assertEquals("The total is AU$1,001.02", m.totalAmountAsSafeHtml(1001.02, "AUD").asString());
    assertEquals("The total is US$1,001.02", m.totalAmountAsSafeHtml(1001.02, "USD").asString());
  }

  @SuppressWarnings("deprecation")
  public void testDynamicTimeZone() {
    TestAnnotatedMessages m = GWT.create(TestAnnotatedMessages.class);
    Date date = new Date(Date.UTC(2010 - 1900, 1, 2, 3, 4, 5));
    TimeZoneConstants timeZoneData = GWT.create(TimeZoneConstants.class);
    String str = timeZoneData.americaLosAngeles();
    TimeZoneInfo tzInfo = TimeZoneInfo.buildTimeZoneData(str);
    TimeZone tz = TimeZone.createTimeZone(tzInfo);
    assertEquals("in timezone: 2/1/2010, 7:04:05 PM", m.inTimezone(date, tz));

    assertEquals("in timezone: 2/1/2010, 7:04:05 PM", m.inTimezoneAsSafeHtml(date, tz).asString());
}

  public void testListWithArray() {
    TestAnnotatedMessages m = GWT.create(TestAnnotatedMessages.class);
    assertEquals("There are no values", m.valuesArray(new int[0]));
    assertEquals("The value is -1,001", m.valuesArray(new int[]{-1001}));
    assertEquals("The values are 1 and 2", m.valuesArray(new int[]{1, 2}));
    assertEquals("The values are 1, 3, 5, 7, and 9,009",
        m.valuesArray(new int[]{1, 3, 5, 7, 9009}));

    assertEquals(
        "There are no values", m.valuesArrayAsSafeHtml(new int[0]).asString());
    assertEquals("The value is -1,001",
        m.valuesArrayAsSafeHtml(new int[]{-1001}).asString());
    assertEquals("The values are 1 and 2",
        m.valuesArrayAsSafeHtml(new int[]{1, 2}).asString());
    assertEquals("The values are 1, 3, 5, 7, and 9,009",
        m.valuesArrayAsSafeHtml(new int[]{1, 3, 5, 7, 9009}).asString());
  }

  public void testListWithList() {
    TestAnnotatedMessages m = GWT.create(TestAnnotatedMessages.class);
    assertEquals(
        "There are no values", m.valuesList(Arrays.<Integer> asList()));
    assertEquals("The value is -1,001", m.valuesList(Arrays.asList(-1001)));
    assertEquals("The values are 1 and 2", m.valuesList(Arrays.asList(1, 2)));
    assertEquals("The values are 1, 3, 5, 7, and 9,009",
        m.valuesList(Arrays.asList(1, 3, 5, 7, 9009)));

    assertEquals("There are no values",
        m.valuesListAsSafeHtml(Arrays.<Integer> asList()).asString());
    assertEquals("The value is -1,001",
        m.valuesListAsSafeHtml(Arrays.asList(-1001)).asString());
    assertEquals("The values are 1 and 2",
        m.valuesListAsSafeHtml(Arrays.asList(1, 2)).asString());
    assertEquals("The values are 1, 3, 5, 7, and 9,009",
        m.valuesListAsSafeHtml(Arrays.asList(1, 3, 5, 7, 9009)).asString());
  }

  public void testListWtihVarArgs() {
    TestAnnotatedMessages m = GWT.create(TestAnnotatedMessages.class);
    assertEquals("There are no values", m.valuesVarArgs());
    assertEquals("The value is -1,001", m.valuesVarArgs(-1001));
    assertEquals("The values are 1 and 2", m.valuesVarArgs(1, 2));
    assertEquals("The values are 1, 3, 5, 7, and 9,009",
        m.valuesVarArgs(1, 3, 5, 7, 9009));

    assertEquals("There are no names", m.valuesVarArgsAsSafeHtml().asString());
    assertEquals(
        "The name is John", m.valuesVarArgsAsSafeHtml(sh("John")).asString());
    assertEquals("The names are John and Jeff",
        m.valuesVarArgsAsSafeHtml(sh("John"), sh("Jeff")).asString());
    assertEquals("The names are John, Jeff, and Bob",
        m.valuesVarArgsAsSafeHtml(sh("John"), sh("Jeff"), sh("Bob")).asString(
        ));
  }

  /**
   * Verifies correct output for multiple, nested selectors, using an enum
   * for gender selection (and SafeHtml output).
   */
  public void testMultiSelectEnum() {
    TestAnnotatedMessages m = GWT.create(TestAnnotatedMessages.class);
    List<String> names = new ArrayList<String>();
    
    // empty list of names
    assertEquals("Nobody liked his message",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, Gender.MALE).asString());
    assertEquals("Nobody liked his 2 messages",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 2, Gender.MALE).asString());
    assertEquals("Nobody liked her message",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, Gender.FEMALE).asString());
    assertEquals("Nobody liked her 3 messages",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 3, Gender.FEMALE).asString());
    assertEquals("Nobody liked their message",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, null).asString());
    assertEquals("Nobody liked their 4 messages",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 4, Gender.UNKNOWN).asString());

    // one name
    names.add("John");
    assertEquals("John liked his message",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, Gender.MALE).asString());
    assertEquals("John liked his 2 messages",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 2, Gender.MALE).asString());
    assertEquals("John liked her message",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, Gender.FEMALE).asString());
    assertEquals("John liked her 3 messages",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 3, Gender.FEMALE).asString());
    assertEquals("John liked their message",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, Gender.UNKNOWN).asString());
    assertEquals("John liked their 4 messages",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 4, null).asString());

    // two names
    names.add("Bob");
    assertEquals("John and Bob liked his message",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, Gender.MALE).asString());
    assertEquals("John and Bob liked his 2 messages",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 2, Gender.MALE).asString());
    assertEquals("John and Bob liked her message",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, Gender.FEMALE).asString());
    assertEquals("John and Bob liked her 3 messages",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 3, Gender.FEMALE).asString());
    assertEquals("John and Bob liked their message",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, null).asString());
    assertEquals("John and Bob liked their 4 messages",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 4, Gender.UNKNOWN).asString());

    // three names
    names.add("Alice");
    assertEquals("John, Bob, and one other liked his message",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, Gender.MALE).asString());
    assertEquals("John, Bob, and one other liked his 2 messages",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 2, Gender.MALE).asString());
    assertEquals("John, Bob, and one other liked her message",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, Gender.FEMALE).asString());
    assertEquals("John, Bob, and one other liked her 3 messages",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 3, Gender.FEMALE).asString());
    assertEquals("John, Bob, and one other liked their message",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, Gender.UNKNOWN).asString());
    assertEquals("John, Bob, and one other liked their 4 messages",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 4, null).asString());

    // four names
    names.add("Carol");
    assertEquals("John, Bob, and 2 others liked his message",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, Gender.MALE).asString());
    assertEquals("John, Bob, and 2 others liked his 2 messages",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 2, Gender.MALE).asString());
    assertEquals("John, Bob, and 2 others liked her message",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, Gender.FEMALE).asString());
    assertEquals("John, Bob, and 2 others liked her 3 messages",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 3, Gender.FEMALE).asString());
    assertEquals("John, Bob, and 2 others liked their message",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, Gender.UNKNOWN).asString());
    assertEquals("John, Bob, and 2 others liked their 4 messages",
        m.multiSelectEnum(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 4, null).asString());
  }

  /**
   * Verifies correct output for multiple, nested selectors, using a string
   * for gender selection.
   */
  public void testMultiSelectString() {
    TestAnnotatedMessages m = GWT.create(TestAnnotatedMessages.class);
    List<String> names = new ArrayList<String>();
    
    // empty list of names
    assertEquals("Nobody liked his message",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, "MALE"));
    assertEquals("Nobody liked his 2 messages",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 2, "MALE"));
    assertEquals("Nobody liked her message",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, "FEMALE"));
    assertEquals("Nobody liked her 3 messages",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 3, "FEMALE"));
    assertEquals("Nobody liked their message",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, "unknown"));
    assertEquals("Nobody liked their 4 messages",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 4, "unknown"));

    // one name
    names.add("John");
    assertEquals("John liked his message",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, "MALE"));
    assertEquals("John liked his 2 messages",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 2, "MALE"));
    assertEquals("John liked her message",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, "FEMALE"));
    assertEquals("John liked her 3 messages",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 3, "FEMALE"));
    assertEquals("John liked their message",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, "unknown"));
    assertEquals("John liked their 4 messages",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 4, "unknown"));

    // two names
    names.add("Bob");
    assertEquals("John and Bob liked his message",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, "MALE"));
    assertEquals("John and Bob liked his 2 messages",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 2, "MALE"));
    assertEquals("John and Bob liked her message",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, "FEMALE"));
    assertEquals("John and Bob liked her 3 messages",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 3, "FEMALE"));
    assertEquals("John and Bob liked their message",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, "unknown"));
    assertEquals("John and Bob liked their 4 messages",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 4, "unknown"));

    // three names
    names.add("Alice");
    assertEquals("John, Bob, and one other liked his message",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, "MALE"));
    assertEquals("John, Bob, and one other liked his 2 messages",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 2, "MALE"));
    assertEquals("John, Bob, and one other liked her message",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, "FEMALE"));
    assertEquals("John, Bob, and one other liked her 3 messages",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 3, "FEMALE"));
    assertEquals("John, Bob, and one other liked their message",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, "unknown"));
    assertEquals("John, Bob, and one other liked their 4 messages",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 4, "unknown"));

    // four names
    names.add("Carol");
    assertEquals("John, Bob, and 2 others liked his message",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, "MALE"));
    assertEquals("John, Bob, and 2 others liked his 2 messages",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 2, "MALE"));
    assertEquals("John, Bob, and 2 others liked her message",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, "FEMALE"));
    assertEquals("John, Bob, and 2 others liked her 3 messages",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 3, "FEMALE"));
    assertEquals("John, Bob, and 2 others liked their message",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 1, "unknown"));
    assertEquals("John, Bob, and 2 others liked their 4 messages",
        m.multiSelectString(names, names.size() > 0 ? names.get(0) : null,
        names.size() > 1 ? names.get(1) : null, 4, "unknown"));
  }

  /**
   * Verify that nested annotations are looked up with both A$B names
   * and A_B names.  Note that $ takes precedence and only one file for a
   * given level in the inheritance tree will be used, so A$B_locale will
   * be used and A_B_locale ignored.
   */
  public void testNestedAnnotations() {
    Nested m = GWT.create(Nested.class);
    assertEquals("nested dollar b_C", m.nestedDollar());
    assertEquals("nested underscore b", m.nestedUnderscore());
  }

  @SuppressWarnings("deprecation")
  public void testPredefDateFormat() {
    TestAnnotatedMessages m = GWT.create(TestAnnotatedMessages.class);
    Date date = new Date(Date.UTC(2010 - 1900, 1, 2, 3, 4, 5));
    assertEquals("Short: 2010-02-01", m.predef(date));
  }

  public void testSpecialPlurals() {
    TestAnnotatedMessages m = GWT.create(TestAnnotatedMessages.class);
    assertEquals("No widgets", m.specialPlurals(0));
    assertEquals("A widget", m.specialPlurals(1));
    assertEquals("2 widgets", m.specialPlurals(2));
    assertEquals("No one has reviewed this movie", m.reviewers(0, null, null));
    assertEquals(
        "John Doe has reviewed this movie", m.reviewers(1, "John Doe", null));
    assertEquals("John Doe and Betty Smith have reviewed this movie",
        m.reviewers(2, "John Doe", "Betty Smith"));
    assertEquals(
        "John Doe, Betty Smith, and one other have reviewed this movie",
        m.reviewers(3, "John Doe", "Betty Smith"));
    assertEquals(
        "John Doe, Betty Smith, and 3 others have reviewed this movie",
        m.reviewers(5, "John Doe", "Betty Smith"));

    assertEquals("No widgets", m.specialPluralsAsSafeHtml(0).asString());
    assertEquals("A widget", m.specialPluralsAsSafeHtml(1).asString());
    assertEquals("2 widgets", m.specialPluralsAsSafeHtml(2).asString());
    assertEquals("No one has reviewed this movie",
        m.reviewersAsSafeHtml(0, null, null).asString());
    assertEquals("John Doe has reviewed this movie", m.reviewersAsSafeHtml(1,
        "John Doe", null).asString());
    assertEquals("John Doe and Betty Smith have reviewed this movie",
        m.reviewersAsSafeHtml(2, "John Doe", sh("Betty Smith")).asString());
    assertEquals(
        "John Doe, Betty Smith, and one other have reviewed this movie",
        m.reviewersAsSafeHtml(3, "John Doe", sh("Betty Smith")).asString());
    assertEquals(
        "John Doe, Betty Smith, and 3 others have reviewed this movie",
        m.reviewersAsSafeHtml(5, "John Doe", sh("Betty Smith")).asString());
}

  public void testStaticArg() {
    TestAnnotatedMessages m = GWT.create(TestAnnotatedMessages.class);
    assertEquals("This is <b>bold</b>", m.staticArgs());
    assertEquals("This is <b>bold</b>", m.staticArgsSafeHtml().asString());
  }

  public void testStaticCurrency() {
    TestAnnotatedMessages m = GWT.create(TestAnnotatedMessages.class);
    assertEquals("The total is AU$1,001.02", m.australianDollars(1001.02));

    assertEquals("The total is AU$1,001.02", m.australianDollarsAsSafeHtml(
        1001.02).asString());
  }

  @SuppressWarnings("deprecation")
  public void testStaticTimeZone() {
    TestAnnotatedMessages m = GWT.create(TestAnnotatedMessages.class);
    Date date = new Date(Date.UTC(2010 - 1900, 1, 2, 3, 4, 5));
    assertEquals("in GMT: 2/2/2010, 3:04:05 AM", m.gmt(date));

    assertEquals("in GMT: 2/2/2010, 3:04:05 AM", m.gmtAsSafeHtml(date).asString(
        ));
  }

  public void testWalkUpColorTree() {
    Colors colors = GWT.create(Colors.class);
    assertEquals("red_b_C_d", colors.red());
    assertEquals("blue_b_C", colors.blue());
    assertEquals("yellow_b", colors.yellow());
  }

  /**
   * Wrapper to easily convert a String literal to a SafeHtml instance.
   * 
   * @param string
   * @return a SafeHtml wrapper around the supplied string
   */
  private SafeHtml sh(String string) {
    SafeHtmlBuilder buf = new SafeHtmlBuilder();
    buf.appendHtmlConstant(string);
    return buf.toSafeHtml();
  }
}
