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

/**
 * Unit tests for AsYouTypeFormatter.java
 *
 * Note that these tests use the test metadata, 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 TestMetadataTestCase {

  public void testInvalidRegion() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.ZZ);
    assertEquals("+", formatter.inputDigit('+'));
    assertEquals("+4", formatter.inputDigit('4'));
    assertEquals("+48 ", formatter.inputDigit('8'));
    assertEquals("+48 8", formatter.inputDigit('8'));
    assertEquals("+48 88", formatter.inputDigit('8'));
    assertEquals("+48 88 1", 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'));

    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.inputDigit('5'));
    assertEquals("650253", formatter.inputDigit('3'));
  }

  public void testInvalidPlusSign() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.ZZ);
    assertEquals("+", formatter.inputDigit('+'));
    assertEquals("+4", formatter.inputDigit('4'));
    assertEquals("+48 ", formatter.inputDigit('8'));
    assertEquals("+48 8", formatter.inputDigit('8'));
    assertEquals("+48 88", formatter.inputDigit('8'));
    assertEquals("+48 88 1", 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'));
    // A plus sign can only appear at the beginning of the number; otherwise, no formatting is
    // applied.
    assertEquals("+48881231+", formatter.inputDigit('+'));
    assertEquals("+48881231+2", formatter.inputDigit('2'));
  }

  public void testTooLongNumberMatchingMultipleLeadingDigits() {
    // See http://code.google.com/p/libphonenumber/issues/detail?id=36
    // The bug occurred last time for countries which have two formatting rules with exactly the
    // same leading digits pattern but differ in length.
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.ZZ);
    assertEquals("+", formatter.inputDigit('+'));
    assertEquals("+8", formatter.inputDigit('8'));
    assertEquals("+81 ", formatter.inputDigit('1'));
    assertEquals("+81 9", formatter.inputDigit('9'));
    assertEquals("+81 90", formatter.inputDigit('0'));
    assertEquals("+81 90 1", formatter.inputDigit('1'));
    assertEquals("+81 90 12", formatter.inputDigit('2'));
    assertEquals("+81 90 123", formatter.inputDigit('3'));
    assertEquals("+81 90 1234", formatter.inputDigit('4'));
    assertEquals("+81 90 1234 5", formatter.inputDigit('5'));
    assertEquals("+81 90 1234 56", formatter.inputDigit('6'));
    assertEquals("+81 90 1234 567", formatter.inputDigit('7'));
    assertEquals("+81 90 1234 5678", formatter.inputDigit('8'));
    assertEquals("+81 90 12 345 6789", formatter.inputDigit('9'));
    assertEquals("+81901234567890", formatter.inputDigit('0'));
    assertEquals("+819012345678901", formatter.inputDigit('1'));
  }

  public void testAYTFUS() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.US);
    assertEquals("6", formatter.inputDigit('6'));
    assertEquals("65", formatter.inputDigit('5'));
    assertEquals("650", formatter.inputDigit('0'));
    assertEquals("650 2", formatter.inputDigit('2'));
    assertEquals("650 25", formatter.inputDigit('5'));
    assertEquals("650 253", formatter.inputDigit('3'));
    // Note this is how a US local number (without area code) should be formatted.
    assertEquals("650 2532", 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("1 65", formatter.inputDigit('5'));
    assertEquals("1 650", formatter.inputDigit('0'));
    assertEquals("1 650 2", 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("011 4", formatter.inputDigit('4'));
    assertEquals("011 44 ", formatter.inputDigit('4'));
    assertEquals("011 44 6", formatter.inputDigit('6'));
    assertEquals("011 44 61", formatter.inputDigit('1'));
    assertEquals("011 44 6 12", 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("011 5", formatter.inputDigit('5'));
    assertEquals("011 54 ", formatter.inputDigit('4'));
    assertEquals("011 54 9", formatter.inputDigit('9'));
    assertEquals("011 54 91", formatter.inputDigit('1'));
    assertEquals("011 54 9 11", 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("0", formatter.inputDigit('0'));
    assertEquals("01", formatter.inputDigit('1'));
    assertEquals("011 ", formatter.inputDigit('1'));
    assertEquals("011 2", formatter.inputDigit('2'));
    assertEquals("011 24", formatter.inputDigit('4'));
    assertEquals("011 244 ", formatter.inputDigit('4'));
    assertEquals("011 244 2", formatter.inputDigit('2'));
    assertEquals("011 244 28", formatter.inputDigit('8'));
    assertEquals("011 244 280", formatter.inputDigit('0'));
    assertEquals("011 244 280 0", formatter.inputDigit('0'));
    assertEquals("011 244 280 00", formatter.inputDigit('0'));
    assertEquals("011 244 280 000", formatter.inputDigit('0'));
    assertEquals("011 244 280 000 0", formatter.inputDigit('0'));
    assertEquals("011 244 280 000 00", formatter.inputDigit('0'));
    assertEquals("011 244 280 000 000", formatter.inputDigit('0'));

    formatter.clear();
    assertEquals("+", formatter.inputDigit('+'));
    assertEquals("+4", formatter.inputDigit('4'));
    assertEquals("+48 ", formatter.inputDigit('8'));
    assertEquals("+48 8", formatter.inputDigit('8'));
    assertEquals("+48 88", formatter.inputDigit('8'));
    assertEquals("+48 88 1", 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 testAYTFUSFullWidthCharacters() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.US);
    assertEquals("\uFF16", formatter.inputDigit('\uFF16'));
    assertEquals("\uFF16\uFF15", formatter.inputDigit('\uFF15'));
    assertEquals("650", formatter.inputDigit('\uFF10'));
    assertEquals("650 2", formatter.inputDigit('\uFF12'));
    assertEquals("650 25", formatter.inputDigit('\uFF15'));
    assertEquals("650 253", formatter.inputDigit('\uFF13'));
    assertEquals("650 2532", 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 testAYTFUSMobileShortCode() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.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 testAYTFUSVanityNumber() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.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 testAYTFAndRememberPositionUS() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.US);
    assertEquals("1", formatter.inputDigitAndRememberPosition('1'));
    assertEquals(1, formatter.getRememberedPosition());
    assertEquals("16", formatter.inputDigit('6'));
    assertEquals("1 65", formatter.inputDigit('5'));
    assertEquals(1, formatter.getRememberedPosition());
    assertEquals("1 650", formatter.inputDigitAndRememberPosition('0'));
    assertEquals(5, formatter.getRememberedPosition());
    assertEquals("1 650 2", 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.inputDigitAndRememberPosition('6'));
    assertEquals(2, formatter.getRememberedPosition());
    assertEquals("1 65", formatter.inputDigit('5'));
    assertEquals("1 650", formatter.inputDigit('0'));
    assertEquals(3, formatter.getRememberedPosition());
    assertEquals("1 650 2", formatter.inputDigit('2'));
    assertEquals("1 650 25", formatter.inputDigit('5'));
    assertEquals(3, 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(3, formatter.getRememberedPosition());
    assertEquals("1 650 253 222", formatter.inputDigit('2'));
    assertEquals("1 650 253 2222", formatter.inputDigit('2'));
    assertEquals("165025322222", formatter.inputDigit('2'));
    assertEquals(2, formatter.getRememberedPosition());
    assertEquals("1650253222222", formatter.inputDigit('2'));
    assertEquals(2, formatter.getRememberedPosition());

    formatter.clear();
    assertEquals("6", formatter.inputDigit('6'));
    assertEquals("65", formatter.inputDigit('5'));
    assertEquals("650", formatter.inputDigit('0'));
    assertEquals("650 2", formatter.inputDigit('2'));
    assertEquals("650 25", formatter.inputDigit('5'));
    assertEquals("650 253", formatter.inputDigit('3'));
    assertEquals("650 2532", formatter.inputDigitAndRememberPosition('2'));
    assertEquals(8, formatter.getRememberedPosition());
    assertEquals("650 253 22", formatter.inputDigit('2'));
    assertEquals(9, formatter.getRememberedPosition());
    assertEquals("650 253 222", formatter.inputDigit('2'));
    // No more formatting when semicolon is entered.
    assertEquals("650253222;", formatter.inputDigit(';'));
    assertEquals(7, 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("011 4", formatter.inputDigitAndRememberPosition('4'));
    assertEquals("011 48 ", formatter.inputDigit('8'));
    assertEquals(5, formatter.getRememberedPosition());
    assertEquals("011 48 8", formatter.inputDigit('8'));
    assertEquals(5, formatter.getRememberedPosition());
    assertEquals("011 48 88", formatter.inputDigit('8'));
    assertEquals("011 48 88 1", 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("+1 6", formatter.inputDigitAndRememberPosition('6'));
    assertEquals("+1 65", formatter.inputDigit('5'));
    assertEquals("+1 650", formatter.inputDigit('0'));
    assertEquals(4, 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("+1 6", formatter.inputDigitAndRememberPosition('6'));
    assertEquals("+1 65", formatter.inputDigit('5'));
    assertEquals("+1 650", formatter.inputDigit('0'));
    assertEquals(4, 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 testAYTFGBFixedLine() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.GB);
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("02", formatter.inputDigit('2'));
    assertEquals("020", formatter.inputDigit('0'));
    assertEquals("020 7", formatter.inputDigitAndRememberPosition('7'));
    assertEquals(5, formatter.getRememberedPosition());
    assertEquals("020 70", 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 testAYTFGBTollFree() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.GB);
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("08", formatter.inputDigit('8'));
    assertEquals("080", formatter.inputDigit('0'));
    assertEquals("080 7", formatter.inputDigit('7'));
    assertEquals("080 70", 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 testAYTFGBPremiumRate() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.GB);
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("09", formatter.inputDigit('9'));
    assertEquals("090", formatter.inputDigit('0'));
    assertEquals("090 7", formatter.inputDigit('7'));
    assertEquals("090 70", 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 testAYTFNZMobile() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.NZ);
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("02", formatter.inputDigit('2'));
    assertEquals("021", formatter.inputDigit('1'));
    assertEquals("02-11", formatter.inputDigit('1'));
    assertEquals("02-112", 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 testAYTFDE() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.DE);
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("03", formatter.inputDigit('3'));
    assertEquals("030", formatter.inputDigit('0'));
    assertEquals("030/1", formatter.inputDigit('1'));
    assertEquals("030/12", formatter.inputDigit('2'));
    assertEquals("030/123", formatter.inputDigit('3'));
    assertEquals("030/1234", formatter.inputDigit('4'));

    // 04134 1234
    formatter.clear();
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("04", formatter.inputDigit('4'));
    assertEquals("041", formatter.inputDigit('1'));
    assertEquals("041 3", formatter.inputDigit('3'));
    assertEquals("041 34", formatter.inputDigit('4'));
    assertEquals("04134 1", formatter.inputDigit('1'));
    assertEquals("04134 12", formatter.inputDigit('2'));
    assertEquals("04134 123", formatter.inputDigit('3'));
    assertEquals("04134 1234", formatter.inputDigit('4'));

    // 08021 2345
    formatter.clear();
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("08", formatter.inputDigit('8'));
    assertEquals("080", formatter.inputDigit('0'));
    assertEquals("080 2", formatter.inputDigit('2'));
    assertEquals("080 21", formatter.inputDigit('1'));
    assertEquals("08021 2", formatter.inputDigit('2'));
    assertEquals("08021 23", formatter.inputDigit('3'));
    assertEquals("08021 234", formatter.inputDigit('4'));
    assertEquals("08021 2345", formatter.inputDigit('5'));

    // 00 1 650 253 2250
    formatter.clear();
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("00", formatter.inputDigit('0'));
    assertEquals("00 1 ", formatter.inputDigit('1'));
    assertEquals("00 1 6", formatter.inputDigit('6'));
    assertEquals("00 1 65", formatter.inputDigit('5'));
    assertEquals("00 1 650", formatter.inputDigit('0'));
    assertEquals("00 1 650 2", formatter.inputDigit('2'));
    assertEquals("00 1 650 25", formatter.inputDigit('5'));
    assertEquals("00 1 650 253", formatter.inputDigit('3'));
    assertEquals("00 1 650 253 2", formatter.inputDigit('2'));
    assertEquals("00 1 650 253 22", formatter.inputDigit('2'));
    assertEquals("00 1 650 253 222", formatter.inputDigit('2'));
    assertEquals("00 1 650 253 2222", formatter.inputDigit('2'));
  }

  public void testAYTFAR() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.AR);
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("01", formatter.inputDigit('1'));
    assertEquals("011", formatter.inputDigit('1'));
    assertEquals("011 7", formatter.inputDigit('7'));
    assertEquals("011 70", 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 testAYTFARMobile() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.AR);
    assertEquals("+", formatter.inputDigit('+'));
    assertEquals("+5", formatter.inputDigit('5'));
    assertEquals("+54 ", formatter.inputDigit('4'));
    assertEquals("+54 9", formatter.inputDigit('9'));
    assertEquals("+54 91", formatter.inputDigit('1'));
    assertEquals("+54 9 11", 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 testAYTFKR() {
    // +82 51 234 5678
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.KR);
    assertEquals("+", formatter.inputDigit('+'));
    assertEquals("+8", formatter.inputDigit('8'));
    assertEquals("+82 ", formatter.inputDigit('2'));
    assertEquals("+82 5", formatter.inputDigit('5'));
    assertEquals("+82 51", formatter.inputDigit('1'));
    assertEquals("+82 51-2", 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("+82 2", formatter.inputDigit('2'));
    assertEquals("+82 25", formatter.inputDigit('5'));
    assertEquals("+82 2-53", 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("+82 2", formatter.inputDigit('2'));
    assertEquals("+82 23", formatter.inputDigit('3'));
    assertEquals("+82 2-36", 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
    formatter.clear();
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("02", formatter.inputDigit('2'));
    assertEquals("021", formatter.inputDigit('1'));
    assertEquals("02-11", formatter.inputDigit('1'));
    assertEquals("02-114", formatter.inputDigit('4'));

    // 02-1300
    formatter.clear();
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("02", formatter.inputDigit('2'));
    assertEquals("021", formatter.inputDigit('1'));
    assertEquals("02-13", formatter.inputDigit('3'));
    assertEquals("02-130", 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("011-4", formatter.inputDigit('4'));
    assertEquals("011-45", 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("011-9", formatter.inputDigit('9'));
    assertEquals("011-98", 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'));
  }

  public void testAYTF_MX() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.MX);

    // +52 800 123 4567
    assertEquals("+", formatter.inputDigit('+'));
    assertEquals("+5", formatter.inputDigit('5'));
    assertEquals("+52 ", formatter.inputDigit('2'));
    assertEquals("+52 8", formatter.inputDigit('8'));
    assertEquals("+52 80", formatter.inputDigit('0'));
    assertEquals("+52 800", formatter.inputDigit('0'));
    assertEquals("+52 800 1", formatter.inputDigit('1'));
    assertEquals("+52 800 12", formatter.inputDigit('2'));
    assertEquals("+52 800 123", formatter.inputDigit('3'));
    assertEquals("+52 800 123 4", formatter.inputDigit('4'));
    assertEquals("+52 800 123 45", formatter.inputDigit('5'));
    assertEquals("+52 800 123 456", formatter.inputDigit('6'));
    assertEquals("+52 800 123 4567", formatter.inputDigit('7'));

    // +52 55 1234 5678
    formatter.clear();
    assertEquals("+", formatter.inputDigit('+'));
    assertEquals("+5", formatter.inputDigit('5'));
    assertEquals("+52 ", formatter.inputDigit('2'));
    assertEquals("+52 5", formatter.inputDigit('5'));
    assertEquals("+52 55", formatter.inputDigit('5'));
    assertEquals("+52 55 1", formatter.inputDigit('1'));
    assertEquals("+52 55 12", formatter.inputDigit('2'));
    assertEquals("+52 55 123", formatter.inputDigit('3'));
    assertEquals("+52 55 1234", formatter.inputDigit('4'));
    assertEquals("+52 55 1234 5", formatter.inputDigit('5'));
    assertEquals("+52 55 1234 56", formatter.inputDigit('6'));
    assertEquals("+52 55 1234 567", formatter.inputDigit('7'));
    assertEquals("+52 55 1234 5678", formatter.inputDigit('8'));

    // +52 212 345 6789
    formatter.clear();
    assertEquals("+", formatter.inputDigit('+'));
    assertEquals("+5", formatter.inputDigit('5'));
    assertEquals("+52 ", formatter.inputDigit('2'));
    assertEquals("+52 2", formatter.inputDigit('2'));
    assertEquals("+52 21", formatter.inputDigit('1'));
    assertEquals("+52 212", formatter.inputDigit('2'));
    assertEquals("+52 212 3", formatter.inputDigit('3'));
    assertEquals("+52 212 34", formatter.inputDigit('4'));
    assertEquals("+52 212 345", formatter.inputDigit('5'));
    assertEquals("+52 212 345 6", formatter.inputDigit('6'));
    assertEquals("+52 212 345 67", formatter.inputDigit('7'));
    assertEquals("+52 212 345 678", formatter.inputDigit('8'));
    assertEquals("+52 212 345 6789", formatter.inputDigit('9'));

    // +52 1 55 1234 5678
    formatter.clear();
    assertEquals("+", formatter.inputDigit('+'));
    assertEquals("+5", formatter.inputDigit('5'));
    assertEquals("+52 ", formatter.inputDigit('2'));
    assertEquals("+52 1", formatter.inputDigit('1'));
    assertEquals("+52 15", formatter.inputDigit('5'));
    assertEquals("+52 1 55", formatter.inputDigit('5'));
    assertEquals("+52 1 55 1", formatter.inputDigit('1'));
    assertEquals("+52 1 55 12", formatter.inputDigit('2'));
    assertEquals("+52 1 55 123", formatter.inputDigit('3'));
    assertEquals("+52 1 55 1234", formatter.inputDigit('4'));
    assertEquals("+52 1 55 1234 5", formatter.inputDigit('5'));
    assertEquals("+52 1 55 1234 56", formatter.inputDigit('6'));
    assertEquals("+52 1 55 1234 567", formatter.inputDigit('7'));
    assertEquals("+52 1 55 1234 5678", formatter.inputDigit('8'));

    // +52 1 541 234 5678
    formatter.clear();
    assertEquals("+", formatter.inputDigit('+'));
    assertEquals("+5", formatter.inputDigit('5'));
    assertEquals("+52 ", formatter.inputDigit('2'));
    assertEquals("+52 1", formatter.inputDigit('1'));
    assertEquals("+52 15", formatter.inputDigit('5'));
    assertEquals("+52 1 54", formatter.inputDigit('4'));
    assertEquals("+52 1 541", formatter.inputDigit('1'));
    assertEquals("+52 1 541 2", formatter.inputDigit('2'));
    assertEquals("+52 1 541 23", formatter.inputDigit('3'));
    assertEquals("+52 1 541 234", formatter.inputDigit('4'));
    assertEquals("+52 1 541 234 5", formatter.inputDigit('5'));
    assertEquals("+52 1 541 234 56", formatter.inputDigit('6'));
    assertEquals("+52 1 541 234 567", formatter.inputDigit('7'));
    assertEquals("+52 1 541 234 5678", formatter.inputDigit('8'));
  }

  public void testAYTF_International_Toll_Free() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.US);
    // +800 1234 5678
    assertEquals("+", formatter.inputDigit('+'));
    assertEquals("+8", formatter.inputDigit('8'));
    assertEquals("+80", formatter.inputDigit('0'));
    assertEquals("+800 ", formatter.inputDigit('0'));
    assertEquals("+800 1", formatter.inputDigit('1'));
    assertEquals("+800 12", formatter.inputDigit('2'));
    assertEquals("+800 123", formatter.inputDigit('3'));
    assertEquals("+800 1234", formatter.inputDigit('4'));
    assertEquals("+800 1234 5", formatter.inputDigit('5'));
    assertEquals("+800 1234 56", formatter.inputDigit('6'));
    assertEquals("+800 1234 567", formatter.inputDigit('7'));
    assertEquals("+800 1234 5678", formatter.inputDigit('8'));
    assertEquals("+800123456789", formatter.inputDigit('9'));
  }

  public void testAYTFMultipleLeadingDigitPatterns() {
    // +81 50 2345 6789
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.JP);
    assertEquals("+", formatter.inputDigit('+'));
    assertEquals("+8", formatter.inputDigit('8'));
    assertEquals("+81 ", formatter.inputDigit('1'));
    assertEquals("+81 5", formatter.inputDigit('5'));
    assertEquals("+81 50", formatter.inputDigit('0'));
    assertEquals("+81 50 2", formatter.inputDigit('2'));
    assertEquals("+81 50 23", formatter.inputDigit('3'));
    assertEquals("+81 50 234", formatter.inputDigit('4'));
    assertEquals("+81 50 2345", formatter.inputDigit('5'));
    assertEquals("+81 50 2345 6", formatter.inputDigit('6'));
    assertEquals("+81 50 2345 67", formatter.inputDigit('7'));
    assertEquals("+81 50 2345 678", formatter.inputDigit('8'));
    assertEquals("+81 50 2345 6789", formatter.inputDigit('9'));

    // +81 222 12 5678
    formatter.clear();
    assertEquals("+", formatter.inputDigit('+'));
    assertEquals("+8", formatter.inputDigit('8'));
    assertEquals("+81 ", formatter.inputDigit('1'));
    assertEquals("+81 2", formatter.inputDigit('2'));
    assertEquals("+81 22", formatter.inputDigit('2'));
    assertEquals("+81 22 2", formatter.inputDigit('2'));
    assertEquals("+81 22 21", formatter.inputDigit('1'));
    assertEquals("+81 2221 2", formatter.inputDigit('2'));
    assertEquals("+81 222 12 5", formatter.inputDigit('5'));
    assertEquals("+81 222 12 56", formatter.inputDigit('6'));
    assertEquals("+81 222 12 567", formatter.inputDigit('7'));
    assertEquals("+81 222 12 5678", formatter.inputDigit('8'));

    // 011113
    formatter.clear();
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("01", formatter.inputDigit('1'));
    assertEquals("011", formatter.inputDigit('1'));
    assertEquals("011 1", formatter.inputDigit('1'));
    assertEquals("011 11", formatter.inputDigit('1'));
    assertEquals("011113", formatter.inputDigit('3'));

    // +81 3332 2 5678
    formatter.clear();
    assertEquals("+", formatter.inputDigit('+'));
    assertEquals("+8", formatter.inputDigit('8'));
    assertEquals("+81 ", formatter.inputDigit('1'));
    assertEquals("+81 3", formatter.inputDigit('3'));
    assertEquals("+81 33", formatter.inputDigit('3'));
    assertEquals("+81 33 3", formatter.inputDigit('3'));
    assertEquals("+81 3332", formatter.inputDigit('2'));
    assertEquals("+81 3332 2", formatter.inputDigit('2'));
    assertEquals("+81 3332 2 5", formatter.inputDigit('5'));
    assertEquals("+81 3332 2 56", formatter.inputDigit('6'));
    assertEquals("+81 3332 2 567", formatter.inputDigit('7'));
    assertEquals("+81 3332 2 5678", formatter.inputDigit('8'));
  }

  public void testAYTFLongIDD_AU() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("AU");
    // 0011 1 650 253 2250
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("00", formatter.inputDigit('0'));
    assertEquals("001", formatter.inputDigit('1'));
    assertEquals("0011", formatter.inputDigit('1'));
    assertEquals("0011 1 ", formatter.inputDigit('1'));
    assertEquals("0011 1 6", formatter.inputDigit('6'));
    assertEquals("0011 1 65", formatter.inputDigit('5'));
    assertEquals("0011 1 650", formatter.inputDigit('0'));
    assertEquals("0011 1 650 2", formatter.inputDigit('2'));
    assertEquals("0011 1 650 25", formatter.inputDigit('5'));
    assertEquals("0011 1 650 253", formatter.inputDigit('3'));
    assertEquals("0011 1 650 253 2", formatter.inputDigit('2'));
    assertEquals("0011 1 650 253 22", formatter.inputDigit('2'));
    assertEquals("0011 1 650 253 222", formatter.inputDigit('2'));
    assertEquals("0011 1 650 253 2222", formatter.inputDigit('2'));

    // 0011 81 3332 2 5678
    formatter.clear();
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("00", formatter.inputDigit('0'));
    assertEquals("001", formatter.inputDigit('1'));
    assertEquals("0011", formatter.inputDigit('1'));
    assertEquals("00118", formatter.inputDigit('8'));
    assertEquals("0011 81 ", formatter.inputDigit('1'));
    assertEquals("0011 81 3", formatter.inputDigit('3'));
    assertEquals("0011 81 33", formatter.inputDigit('3'));
    assertEquals("0011 81 33 3", formatter.inputDigit('3'));
    assertEquals("0011 81 3332", formatter.inputDigit('2'));
    assertEquals("0011 81 3332 2", formatter.inputDigit('2'));
    assertEquals("0011 81 3332 2 5", formatter.inputDigit('5'));
    assertEquals("0011 81 3332 2 56", formatter.inputDigit('6'));
    assertEquals("0011 81 3332 2 567", formatter.inputDigit('7'));
    assertEquals("0011 81 3332 2 5678", formatter.inputDigit('8'));

    // 0011 244 250 253 222
    formatter.clear();
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("00", formatter.inputDigit('0'));
    assertEquals("001", formatter.inputDigit('1'));
    assertEquals("0011", formatter.inputDigit('1'));
    assertEquals("00112", formatter.inputDigit('2'));
    assertEquals("001124", formatter.inputDigit('4'));
    assertEquals("0011 244 ", formatter.inputDigit('4'));
    assertEquals("0011 244 2", formatter.inputDigit('2'));
    assertEquals("0011 244 25", formatter.inputDigit('5'));
    assertEquals("0011 244 250", formatter.inputDigit('0'));
    assertEquals("0011 244 250 2", formatter.inputDigit('2'));
    assertEquals("0011 244 250 25", formatter.inputDigit('5'));
    assertEquals("0011 244 250 253", formatter.inputDigit('3'));
    assertEquals("0011 244 250 253 2", formatter.inputDigit('2'));
    assertEquals("0011 244 250 253 22", formatter.inputDigit('2'));
    assertEquals("0011 244 250 253 222", formatter.inputDigit('2'));
  }

  public void testAYTFLongIDD_KR() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("KR");
    // 00300 1 650 253 2222
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("00", formatter.inputDigit('0'));
    assertEquals("003", formatter.inputDigit('3'));
    assertEquals("0030", formatter.inputDigit('0'));
    assertEquals("00300", formatter.inputDigit('0'));
    assertEquals("00300 1 ", formatter.inputDigit('1'));
    assertEquals("00300 1 6", formatter.inputDigit('6'));
    assertEquals("00300 1 65", formatter.inputDigit('5'));
    assertEquals("00300 1 650", formatter.inputDigit('0'));
    assertEquals("00300 1 650 2", formatter.inputDigit('2'));
    assertEquals("00300 1 650 25", formatter.inputDigit('5'));
    assertEquals("00300 1 650 253", formatter.inputDigit('3'));
    assertEquals("00300 1 650 253 2", formatter.inputDigit('2'));
    assertEquals("00300 1 650 253 22", formatter.inputDigit('2'));
    assertEquals("00300 1 650 253 222", formatter.inputDigit('2'));
    assertEquals("00300 1 650 253 2222", formatter.inputDigit('2'));
  }

  public void testAYTFLongNDD_KR() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("KR");
    // 08811-9876-7890
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("08", formatter.inputDigit('8'));
    assertEquals("088", formatter.inputDigit('8'));
    assertEquals("0881", formatter.inputDigit('1'));
    assertEquals("08811", formatter.inputDigit('1'));
    assertEquals("08811-9", formatter.inputDigit('9'));
    assertEquals("08811-98", formatter.inputDigit('8'));
    assertEquals("08811-987", formatter.inputDigit('7'));
    assertEquals("08811-9876", formatter.inputDigit('6'));
    assertEquals("08811-9876-7", formatter.inputDigit('7'));
    assertEquals("08811-9876-78", formatter.inputDigit('8'));
    assertEquals("08811-9876-789", formatter.inputDigit('9'));
    assertEquals("08811-9876-7890", formatter.inputDigit('0'));

    // 08500 11-9876-7890
    formatter.clear();
    assertEquals("0", formatter.inputDigit('0'));
    assertEquals("08", formatter.inputDigit('8'));
    assertEquals("085", formatter.inputDigit('5'));
    assertEquals("0850", formatter.inputDigit('0'));
    assertEquals("08500 ", formatter.inputDigit('0'));
    assertEquals("08500 1", formatter.inputDigit('1'));
    assertEquals("08500 11", formatter.inputDigit('1'));
    assertEquals("08500 11-9", formatter.inputDigit('9'));
    assertEquals("08500 11-98", formatter.inputDigit('8'));
    assertEquals("08500 11-987", formatter.inputDigit('7'));
    assertEquals("08500 11-9876", formatter.inputDigit('6'));
    assertEquals("08500 11-9876-7", formatter.inputDigit('7'));
    assertEquals("08500 11-9876-78", formatter.inputDigit('8'));
    assertEquals("08500 11-9876-789", formatter.inputDigit('9'));
    assertEquals("08500 11-9876-7890", formatter.inputDigit('0'));
  }

  public void testAYTFLongNDD_SG() {
    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("SG");
    // 777777 9876 7890
    assertEquals("7", formatter.inputDigit('7'));
    assertEquals("77", formatter.inputDigit('7'));
    assertEquals("777", formatter.inputDigit('7'));
    assertEquals("7777", formatter.inputDigit('7'));
    assertEquals("77777", formatter.inputDigit('7'));
    assertEquals("777777 ", formatter.inputDigit('7'));
    assertEquals("777777 9", formatter.inputDigit('9'));
    assertEquals("777777 98", formatter.inputDigit('8'));
    assertEquals("777777 987", formatter.inputDigit('7'));
    assertEquals("777777 9876", formatter.inputDigit('6'));
    assertEquals("777777 9876 7", formatter.inputDigit('7'));
    assertEquals("777777 9876 78", formatter.inputDigit('8'));
    assertEquals("777777 9876 789", formatter.inputDigit('9'));
    assertEquals("777777 9876 7890", formatter.inputDigit('0'));
  }
}
