/*
 * Copyright (C) 2009 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.i18n.phonenumbers;

import junit.framework.TestCase;

import java.io.InputStream;

/**
 * Unit tests for PhoneNumberUtil.java
 *
 * Note that these tests use the metadata contained in the file specified by TEST_META_DATA_FILE,
 * not the normal metadata file, so should not be used for regression test purposes - these tests
 * are illustrative only and test functionality.
 *
 * @author Shaopeng Jia
 */
public class AsYouTypeFormatterTest extends TestCase {
  private PhoneNumberUtil phoneUtil;
  private static final String TEST_META_DATA_FILE =
      "/com/google/i18n/phonenumbers/PhoneNumberMetadataProtoForTesting";

  public AsYouTypeFormatterTest() {
    PhoneNumberUtil.resetInstance();
    InputStream in = PhoneNumberUtilTest.class.getResourceAsStream(TEST_META_DATA_FILE);
    phoneUtil = PhoneNumberUtil.getInstance(in);
  }

  public void testAsYouTypeFormatterUS() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US");
    assertEquals("6", formatter.inputDigit('6'));
    assertEquals("65", formatter.inputDigit('5'));
    assertEquals("650", formatter.inputDigit('0'));
    assertEquals("6502", formatter.inputDigit('2'));
    assertEquals("65025", formatter.inputDigit('5'));
    assertEquals("650 253", formatter.inputDigit('3'));
    assertEquals("650 253 2", formatter.inputDigit('2'));
    assertEquals("650 253 22", formatter.inputDigit('2'));
    assertEquals("650 253 222", formatter.inputDigit('2'));
    assertEquals("650 253 2222", formatter.inputDigit('2'));

    formatter.clear();
    assertEquals("1", formatter.inputDigit('1'));
    assertEquals("16", formatter.inputDigit('6'));
    assertEquals("165", formatter.inputDigit('5'));
    assertEquals("1650", formatter.inputDigit('0'));
    assertEquals("16502", formatter.inputDigit('2'));
    assertEquals("1 650 25", formatter.inputDigit('5'));
    assertEquals("1 650 253", formatter.inputDigit('3'));
    assertEquals("1 650 253 2", formatter.inputDigit('2'));
    assertEquals("1 650 253 22", formatter.inputDigit('2'));
    assertEquals("1 650 253 222", formatter.inputDigit('2'));
    assertEquals("1 650 253 2222", formatter.inputDigit('2'));

    formatter.clear();
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("01", formatter.inputDigit('1'));
    assertEquals("011", formatter.inputDigit('1'));
    assertEquals("0114", formatter.inputDigit('4'));
    assertEquals("01144", formatter.inputDigit('4'));
    assertEquals("011 44 6", formatter.inputDigit('6'));
    assertEquals("011 44 61", formatter.inputDigit('1'));
    assertEquals("011 44 612", formatter.inputDigit('2'));
    assertEquals("011 44 6 123", formatter.inputDigit('3'));
    assertEquals("011 44 6 123 1", formatter.inputDigit('1'));
    assertEquals("011 44 6 123 12", formatter.inputDigit('2'));
    assertEquals("011 44 6 123 123", formatter.inputDigit('3'));
    assertEquals("011 44 6 123 123 1", formatter.inputDigit('1'));
    assertEquals("011 44 6 123 123 12", formatter.inputDigit('2'));
    assertEquals("011 44 6 123 123 123", formatter.inputDigit('3'));

    formatter.clear();
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("01", formatter.inputDigit('1'));
    assertEquals("011", formatter.inputDigit('1'));
    assertEquals("0115", formatter.inputDigit('5'));
    assertEquals("01154", formatter.inputDigit('4'));
    assertEquals("011 54 9", formatter.inputDigit('9'));
    assertEquals("011 54 91", formatter.inputDigit('1'));
    assertEquals("011 54 911", formatter.inputDigit('1'));
    assertEquals("011 54 9 11 2",
                 formatter.inputDigit('2'));
    assertEquals("011 54 9 11 23", formatter.inputDigit('3'));
    assertEquals("011 54 9 11 231", formatter.inputDigit('1'));
    assertEquals("011 54 9 11 2312", formatter.inputDigit('2'));
    assertEquals("011 54 9 11 2312 1", formatter.inputDigit('1'));
    assertEquals("011 54 9 11 2312 12", formatter.inputDigit('2'));
    assertEquals("011 54 9 11 2312 123", formatter.inputDigit('3'));
    assertEquals("011 54 9 11 2312 1234", formatter.inputDigit('4'));

    formatter.clear();
    assertEquals("+", formatter.inputDigit('+'));
    assertEquals("+4", formatter.inputDigit('4'));
    assertEquals("+48", formatter.inputDigit('8'));
    assertEquals("+488", formatter.inputDigit('8'));
    assertEquals("+4888", formatter.inputDigit('8'));
    assertEquals("+48 881", formatter.inputDigit('1'));
    assertEquals("+48 88 12", formatter.inputDigit('2'));
    assertEquals("+48 88 123", formatter.inputDigit('3'));
    assertEquals("+48 88 123 1", formatter.inputDigit('1'));
    assertEquals("+48 88 123 12", formatter.inputDigit('2'));
    assertEquals("+48 88 123 12 1", formatter.inputDigit('1'));
    assertEquals("+48 88 123 12 12", formatter.inputDigit('2'));
  }

  public void testAsYouTypeFormatterUSFullWidthCharacters() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US");
    assertEquals("\uFF16", formatter.inputDigit('\uFF16'));
    assertEquals("\uFF16\uFF15", formatter.inputDigit('\uFF15'));
    assertEquals("\uFF16\uFF15\uFF10", formatter.inputDigit('\uFF10'));
    assertEquals("\uFF16\uFF15\uFF10\uFF12", formatter.inputDigit('\uFF12'));
    assertEquals("\uFF16\uFF15\uFF10\uFF12\uFF15", formatter.inputDigit('\uFF15'));
    assertEquals("650 253", formatter.inputDigit('\uFF13'));
    assertEquals("650 253 2", formatter.inputDigit('\uFF12'));
    assertEquals("650 253 22", formatter.inputDigit('\uFF12'));
    assertEquals("650 253 222", formatter.inputDigit('\uFF12'));
    assertEquals("650 253 2222", formatter.inputDigit('\uFF12'));
  }

  public void testAsYouTypeFormatterUSMobileShortCode() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US");
    assertEquals("*", formatter.inputDigit('*'));
    assertEquals("*1", formatter.inputDigit('1'));
    assertEquals("*12", formatter.inputDigit('2'));
    assertEquals("*121", formatter.inputDigit('1'));
    assertEquals("*121#", formatter.inputDigit('#'));
  }

  public void testAsYouTypeFormatterUSVanityNumber() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US");
    assertEquals("8", formatter.inputDigit('8'));
    assertEquals("80", formatter.inputDigit('0'));
    assertEquals("800", formatter.inputDigit('0'));
    assertEquals("800 ", formatter.inputDigit(' '));
    assertEquals("800 M", formatter.inputDigit('M'));
    assertEquals("800 MY", formatter.inputDigit('Y'));
    assertEquals("800 MY ", formatter.inputDigit(' '));
    assertEquals("800 MY A", formatter.inputDigit('A'));
    assertEquals("800 MY AP", formatter.inputDigit('P'));
    assertEquals("800 MY APP", formatter.inputDigit('P'));
    assertEquals("800 MY APPL", formatter.inputDigit('L'));
    assertEquals("800 MY APPLE", formatter.inputDigit('E'));
  }

  public void testAsYouTypeFormatterAndRememberPositionUS() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US");
    assertEquals("1", formatter.inputDigitAndRememberPosition('1'));
    assertEquals(1, formatter.getRememberedPosition());
    assertEquals("16", formatter.inputDigit('6'));
    assertEquals("165", formatter.inputDigit('5'));
    assertEquals(1, formatter.getRememberedPosition());
    assertEquals("1650", formatter.inputDigitAndRememberPosition('0'));
    assertEquals(4, formatter.getRememberedPosition());
    assertEquals("16502", formatter.inputDigit('2'));
    assertEquals("1 650 25", formatter.inputDigit('5'));
    // Note the remembered position for digit "0" changes from 4 to 5, because a space is now
    // inserted in the front.
    assertEquals(5, formatter.getRememberedPosition());
    assertEquals("1 650 253", formatter.inputDigit('3'));
    assertEquals("1 650 253 2", formatter.inputDigit('2'));
    assertEquals("1 650 253 22", formatter.inputDigit('2'));
    assertEquals(5, formatter.getRememberedPosition());
    assertEquals("1 650 253 222", formatter.inputDigitAndRememberPosition('2'));
    assertEquals(13, formatter.getRememberedPosition());
    assertEquals("1 650 253 2222", formatter.inputDigit('2'));
    assertEquals(13, formatter.getRememberedPosition());
    assertEquals("165025322222", formatter.inputDigit('2'));
    assertEquals(10, formatter.getRememberedPosition());
    assertEquals("1650253222222", formatter.inputDigit('2'));
    assertEquals(10, formatter.getRememberedPosition());

    formatter.clear();
    assertEquals("1", formatter.inputDigit('1'));
    assertEquals("16", formatter.inputDigit('6'));
    assertEquals("165", formatter.inputDigitAndRememberPosition('5'));
    assertEquals("1650", formatter.inputDigit('0'));
    assertEquals(3, formatter.getRememberedPosition());
    assertEquals("16502", formatter.inputDigit('2'));
    assertEquals("1 650 25", formatter.inputDigit('5'));
    assertEquals(4, formatter.getRememberedPosition());
    assertEquals("1 650 253", formatter.inputDigit('3'));
    assertEquals("1 650 253 2", formatter.inputDigit('2'));
    assertEquals("1 650 253 22", formatter.inputDigit('2'));
    assertEquals(4, formatter.getRememberedPosition());
    assertEquals("1 650 253 222", formatter.inputDigit('2'));
    assertEquals("1 650 253 2222", formatter.inputDigit('2'));
    assertEquals("165025322222", formatter.inputDigit('2'));
    assertEquals(3, formatter.getRememberedPosition());
    assertEquals("1650253222222", formatter.inputDigit('2'));
    assertEquals(3, formatter.getRememberedPosition());

    formatter.clear();
    assertEquals("6", formatter.inputDigit('6'));
    assertEquals("65", formatter.inputDigit('5'));
    assertEquals("650", formatter.inputDigit('0'));
    assertEquals("6502", formatter.inputDigit('2'));
    assertEquals("65025", formatter.inputDigitAndRememberPosition('5'));
    assertEquals(5, formatter.getRememberedPosition());
    assertEquals("650 253", formatter.inputDigit('3'));
    assertEquals(6, formatter.getRememberedPosition());
    assertEquals("650 253 2", formatter.inputDigit('2'));
    assertEquals("650 253 22", formatter.inputDigit('2'));
    assertEquals("650 253 222", formatter.inputDigit('2'));
    // No more formatting when semicolon is entered.
    assertEquals("650253222;", formatter.inputDigit(';'));
    assertEquals(5, formatter.getRememberedPosition());
    assertEquals("650253222;2", formatter.inputDigit('2'));

    formatter.clear();
    assertEquals("6", formatter.inputDigit('6'));
    assertEquals("65", formatter.inputDigit('5'));
    assertEquals("650", formatter.inputDigit('0'));
    // No more formatting when users choose to do their own formatting.
    assertEquals("650-", formatter.inputDigit('-'));
    assertEquals("650-2", formatter.inputDigitAndRememberPosition('2'));
    assertEquals(5, formatter.getRememberedPosition());
    assertEquals("650-25", formatter.inputDigit('5'));
    assertEquals(5, formatter.getRememberedPosition());
    assertEquals("650-253", formatter.inputDigit('3'));
    assertEquals(5, formatter.getRememberedPosition());
    assertEquals("650-253-", formatter.inputDigit('-'));
    assertEquals("650-253-2", formatter.inputDigit('2'));
    assertEquals("650-253-22", formatter.inputDigit('2'));
    assertEquals("650-253-222", formatter.inputDigit('2'));
    assertEquals("650-253-2222", formatter.inputDigit('2'));

    formatter.clear();
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("01", formatter.inputDigit('1'));
    assertEquals("011", formatter.inputDigit('1'));
    assertEquals("0114", formatter.inputDigitAndRememberPosition('4'));
    assertEquals("01148", formatter.inputDigit('8'));
    assertEquals(4, formatter.getRememberedPosition());
    assertEquals("011 48 8", formatter.inputDigit('8'));
    assertEquals(5, formatter.getRememberedPosition());
    assertEquals("011 48 88", formatter.inputDigit('8'));
    assertEquals("011 48 881", formatter.inputDigit('1'));
    assertEquals("011 48 88 12", formatter.inputDigit('2'));
    assertEquals(5, formatter.getRememberedPosition());
    assertEquals("011 48 88 123", formatter.inputDigit('3'));
    assertEquals("011 48 88 123 1", formatter.inputDigit('1'));
    assertEquals("011 48 88 123 12", formatter.inputDigit('2'));
    assertEquals("011 48 88 123 12 1", formatter.inputDigit('1'));
    assertEquals("011 48 88 123 12 12", formatter.inputDigit('2'));

    formatter.clear();
    assertEquals("+", formatter.inputDigit('+'));
    assertEquals("+1", formatter.inputDigit('1'));
    assertEquals("+16", formatter.inputDigitAndRememberPosition('6'));
    assertEquals("+165", formatter.inputDigit('5'));
    assertEquals("+1650", formatter.inputDigit('0'));
    assertEquals(3, formatter.getRememberedPosition());
    assertEquals("+1 650 2", formatter.inputDigit('2'));
    assertEquals(4, formatter.getRememberedPosition());
    assertEquals("+1 650 25", formatter.inputDigit('5'));
    assertEquals("+1 650 253", formatter.inputDigitAndRememberPosition('3'));
    assertEquals("+1 650 253 2", formatter.inputDigit('2'));
    assertEquals("+1 650 253 22", formatter.inputDigit('2'));
    assertEquals("+1 650 253 222", formatter.inputDigit('2'));
    assertEquals(10, formatter.getRememberedPosition());

    formatter.clear();
    assertEquals("+", formatter.inputDigit('+'));
    assertEquals("+1", formatter.inputDigit('1'));
    assertEquals("+16", formatter.inputDigitAndRememberPosition('6'));
    assertEquals("+165", formatter.inputDigit('5'));
    assertEquals("+1650", formatter.inputDigit('0'));
    assertEquals(3, formatter.getRememberedPosition());
    assertEquals("+1 650 2", formatter.inputDigit('2'));
    assertEquals(4, formatter.getRememberedPosition());
    assertEquals("+1 650 25", formatter.inputDigit('5'));
    assertEquals("+1 650 253", formatter.inputDigit('3'));
    assertEquals("+1 650 253 2", formatter.inputDigit('2'));
    assertEquals("+1 650 253 22", formatter.inputDigit('2'));
    assertEquals("+1 650 253 222", formatter.inputDigit('2'));
    assertEquals("+1650253222;", formatter.inputDigit(';'));
    assertEquals(3, formatter.getRememberedPosition());
  }

  public void testAsYouTypeFormatterGBFixedLine() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("GB");
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("02", formatter.inputDigit('2'));
    assertEquals("020", formatter.inputDigit('0'));
    assertEquals("0207", formatter.inputDigitAndRememberPosition('7'));
    assertEquals(4, formatter.getRememberedPosition());
    assertEquals("02070", formatter.inputDigit('0'));
    assertEquals("020 703", formatter.inputDigit('3'));
    assertEquals(5, formatter.getRememberedPosition());
    assertEquals("020 7031", formatter.inputDigit('1'));
    assertEquals("020 7031 3", formatter.inputDigit('3'));
    assertEquals("020 7031 30", formatter.inputDigit('0'));
    assertEquals("020 7031 300", formatter.inputDigit('0'));
    assertEquals("020 7031 3000", formatter.inputDigit('0'));
  }

  public void testAsYouTypeFormatterGBTollFree() {
     AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("gb");
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("08", formatter.inputDigit('8'));
    assertEquals("080", formatter.inputDigit('0'));
    assertEquals("0807", formatter.inputDigit('7'));
    assertEquals("08070", formatter.inputDigit('0'));
    assertEquals("080 703", formatter.inputDigit('3'));
    assertEquals("080 7031", formatter.inputDigit('1'));
    assertEquals("080 7031 3", formatter.inputDigit('3'));
    assertEquals("080 7031 30", formatter.inputDigit('0'));
    assertEquals("080 7031 300", formatter.inputDigit('0'));
    assertEquals("080 7031 3000", formatter.inputDigit('0'));
  }

  public void testAsYouTypeFormatterGBPremiumRate() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("GB");
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("09", formatter.inputDigit('9'));
    assertEquals("090", formatter.inputDigit('0'));
    assertEquals("0907", formatter.inputDigit('7'));
    assertEquals("09070", formatter.inputDigit('0'));
    assertEquals("090 703", formatter.inputDigit('3'));
    assertEquals("090 7031", formatter.inputDigit('1'));
    assertEquals("090 7031 3", formatter.inputDigit('3'));
    assertEquals("090 7031 30", formatter.inputDigit('0'));
    assertEquals("090 7031 300", formatter.inputDigit('0'));
    assertEquals("090 7031 3000", formatter.inputDigit('0'));
  }

  public void testAsYouTypeFormatterNZMobile() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("NZ");
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("02", formatter.inputDigit('2'));
    assertEquals("021", formatter.inputDigit('1'));
    assertEquals("0211", formatter.inputDigit('1'));
    assertEquals("02112", formatter.inputDigit('2'));
    // Note the unittest is using fake metadata which might produce non-ideal results.
    assertEquals("02-112 3", formatter.inputDigit('3'));
    assertEquals("02-112 34", formatter.inputDigit('4'));
    assertEquals("02-112 345", formatter.inputDigit('5'));
    assertEquals("02-112 3456", formatter.inputDigit('6'));
  }

  public void testAsYouTypeFormatterDE() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("DE");
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("03", formatter.inputDigit('3'));
    assertEquals("030", formatter.inputDigit('0'));
    assertEquals("0301", formatter.inputDigit('1'));
    assertEquals("03012", formatter.inputDigit('2'));
    assertEquals("030 123", formatter.inputDigit('3'));
    assertEquals("030 1234", formatter.inputDigit('4'));
  }

  public void testAsYouTypeFormatterAR() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("AR");
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("01", formatter.inputDigit('1'));
    assertEquals("011", formatter.inputDigit('1'));
    assertEquals("0117", formatter.inputDigit('7'));
    assertEquals("01170", formatter.inputDigit('0'));
    assertEquals("011 703", formatter.inputDigit('3'));
    assertEquals("011 7031", formatter.inputDigit('1'));
    assertEquals("011 7031-3", formatter.inputDigit('3'));
    assertEquals("011 7031-30", formatter.inputDigit('0'));
    assertEquals("011 7031-300", formatter.inputDigit('0'));
    assertEquals("011 7031-3000", formatter.inputDigit('0'));
  }

  public void testAsYouTypeFormatterARMobile() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("AR");
    assertEquals("+", formatter.inputDigit('+'));
    assertEquals("+5", formatter.inputDigit('5'));
    assertEquals("+54", formatter.inputDigit('4'));
    assertEquals("+549", formatter.inputDigit('9'));
    assertEquals("+5491", formatter.inputDigit('1'));
    assertEquals("+54 911", formatter.inputDigit('1'));
    assertEquals("+54 9 11 2", formatter.inputDigit('2'));
    assertEquals("+54 9 11 23", formatter.inputDigit('3'));
    assertEquals("+54 9 11 231", formatter.inputDigit('1'));
    assertEquals("+54 9 11 2312", formatter.inputDigit('2'));
    assertEquals("+54 9 11 2312 1", formatter.inputDigit('1'));
    assertEquals("+54 9 11 2312 12", formatter.inputDigit('2'));
    assertEquals("+54 9 11 2312 123", formatter.inputDigit('3'));
    assertEquals("+54 9 11 2312 1234", formatter.inputDigit('4'));
  }

  public void testAsYouTypeFormatterKR() {
    // +82 51 234 5678
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("KR");
    assertEquals("+", formatter.inputDigit('+'));
    assertEquals("+8", formatter.inputDigit('8'));
    assertEquals("+82", formatter.inputDigit('2'));
    assertEquals("+825", formatter.inputDigit('5'));
    assertEquals("+8251", formatter.inputDigit('1'));
    assertEquals("+82 512", formatter.inputDigit('2'));
    assertEquals("+82 51-23", formatter.inputDigit('3'));
    assertEquals("+82 51-234", formatter.inputDigit('4'));
    assertEquals("+82 51-234-5", formatter.inputDigit('5'));
    assertEquals("+82 51-234-56", formatter.inputDigit('6'));
    assertEquals("+82 51-234-567", formatter.inputDigit('7'));
    assertEquals("+82 51-234-5678", formatter.inputDigit('8'));

    // +82 2 531 5678
    formatter.clear();
    assertEquals("+", formatter.inputDigit('+'));
    assertEquals("+8", formatter.inputDigit('8'));
    assertEquals("+82", formatter.inputDigit('2'));
    assertEquals("+822", formatter.inputDigit('2'));
    assertEquals("+8225", formatter.inputDigit('5'));
    assertEquals("+82 253", formatter.inputDigit('3'));
    assertEquals("+82 2-531", formatter.inputDigit('1'));
    assertEquals("+82 2-531-5", formatter.inputDigit('5'));
    assertEquals("+82 2-531-56", formatter.inputDigit('6'));
    assertEquals("+82 2-531-567", formatter.inputDigit('7'));
    assertEquals("+82 2-531-5678", formatter.inputDigit('8'));

    // +82 2 3665 5678
    formatter.clear();
    assertEquals("+", formatter.inputDigit('+'));
    assertEquals("+8", formatter.inputDigit('8'));
    assertEquals("+82", formatter.inputDigit('2'));
    assertEquals("+822", formatter.inputDigit('2'));
    assertEquals("+8223", formatter.inputDigit('3'));
    assertEquals("+82 236", formatter.inputDigit('6'));
    assertEquals("+82 2-366", formatter.inputDigit('6'));
    assertEquals("+82 2-3665", formatter.inputDigit('5'));
    assertEquals("+82 2-3665-5", formatter.inputDigit('5'));
    assertEquals("+82 2-3665-56", formatter.inputDigit('6'));
    assertEquals("+82 2-3665-567", formatter.inputDigit('7'));
    assertEquals("+82 2-3665-5678", formatter.inputDigit('8'));

    // 02-114 : This is too short to format. Checking that there are no side-effects.
    formatter.clear();
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("02", formatter.inputDigit('2'));
    assertEquals("021", formatter.inputDigit('1'));
    assertEquals("0211", formatter.inputDigit('1'));
    assertEquals("02114", formatter.inputDigit('4'));

    // 02-1300
    formatter.clear();
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("02", formatter.inputDigit('2'));
    assertEquals("021", formatter.inputDigit('1'));
    assertEquals("0213", formatter.inputDigit('3'));
    assertEquals("02130", formatter.inputDigit('0'));
    assertEquals("02-1300", formatter.inputDigit('0'));

    // 011-456-7890
    formatter.clear();
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("01", formatter.inputDigit('1'));
    assertEquals("011", formatter.inputDigit('1'));
    assertEquals("0114", formatter.inputDigit('4'));
    assertEquals("01145", formatter.inputDigit('5'));
    assertEquals("011-456", formatter.inputDigit('6'));
    assertEquals("011-456-7", formatter.inputDigit('7'));
    assertEquals("011-456-78", formatter.inputDigit('8'));
    assertEquals("011-456-789", formatter.inputDigit('9'));
    assertEquals("011-456-7890", formatter.inputDigit('0'));

    // 011-9876-7890
    formatter.clear();
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("01", formatter.inputDigit('1'));
    assertEquals("011", formatter.inputDigit('1'));
    assertEquals("0119", formatter.inputDigit('9'));
    assertEquals("01198", formatter.inputDigit('8'));
    assertEquals("011-987", formatter.inputDigit('7'));
    assertEquals("011-9876", formatter.inputDigit('6'));
    assertEquals("011-9876-7", formatter.inputDigit('7'));
    assertEquals("011-9876-78", formatter.inputDigit('8'));
    assertEquals("011-9876-789", formatter.inputDigit('9'));
    assertEquals("011-9876-7890", formatter.inputDigit('0'));
  }
}
