/*
 * Copyright (C) 2011 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;

import junit.framework.TestCase;

import java.io.InputStream;

/**
 * Unit tests for ShortNumberUtil.java
 *
 * @author Shaopeng Jia
 */
public class ShortNumberUtilTest extends TestCase {
  private ShortNumberUtil shortUtil;
  static final String TEST_META_DATA_FILE_PREFIX =
      "/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting";

  public ShortNumberUtilTest() {
    PhoneNumberUtil.resetInstance();
    PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(
        TEST_META_DATA_FILE_PREFIX,
        CountryCodeToRegionCodeMapForTesting.getCountryCodeToRegionCodeMap());
    shortUtil = new ShortNumberUtil(phoneUtil);
  }

  public void testConnectsToEmergencyNumber_US() {
    assertTrue(shortUtil.connectsToEmergencyNumber("911", RegionCode.US));
    assertTrue(shortUtil.connectsToEmergencyNumber("119", RegionCode.US));
    assertFalse(shortUtil.connectsToEmergencyNumber("999", RegionCode.US));
  }

  public void testConnectsToEmergencyNumberLongNumber_US() {
    assertTrue(shortUtil.connectsToEmergencyNumber("9116666666", RegionCode.US));
    assertTrue(shortUtil.connectsToEmergencyNumber("1196666666", RegionCode.US));
    assertFalse(shortUtil.connectsToEmergencyNumber("9996666666", RegionCode.US));
  }

  public void testConnectsToEmergencyNumberWithFormatting_US() {
    assertTrue(shortUtil.connectsToEmergencyNumber("9-1-1", RegionCode.US));
    assertTrue(shortUtil.connectsToEmergencyNumber("1-1-9", RegionCode.US));
    assertFalse(shortUtil.connectsToEmergencyNumber("9-9-9", RegionCode.US));
  }

  public void testConnectsToEmergencyNumberWithPlusSign_US() {
    assertFalse(shortUtil.connectsToEmergencyNumber("+911", RegionCode.US));
    assertFalse(shortUtil.connectsToEmergencyNumber("\uFF0B911", RegionCode.US));
    assertFalse(shortUtil.connectsToEmergencyNumber(" +911", RegionCode.US));
    assertFalse(shortUtil.connectsToEmergencyNumber("+119", RegionCode.US));
    assertFalse(shortUtil.connectsToEmergencyNumber("+999", RegionCode.US));
  }

  public void testConnectsToEmergencyNumber_BR() {
    assertTrue(shortUtil.connectsToEmergencyNumber("911", RegionCode.BR));
    assertTrue(shortUtil.connectsToEmergencyNumber("190", RegionCode.BR));
    assertFalse(shortUtil.connectsToEmergencyNumber("999", RegionCode.BR));
  }

  public void testConnectsToEmergencyNumberLongNumber_BR() {
    // Brazilian emergency numbers don't work when additional digits are appended.
    assertFalse(shortUtil.connectsToEmergencyNumber("9111", RegionCode.BR));
    assertFalse(shortUtil.connectsToEmergencyNumber("1900", RegionCode.BR));
    assertFalse(shortUtil.connectsToEmergencyNumber("9996", RegionCode.BR));
  }

  public void testConnectsToEmergencyNumber_AO() {
    // Angola doesn't have any metadata for emergency numbers in the test metadata.
    assertFalse(shortUtil.connectsToEmergencyNumber("911", RegionCode.AO));
    assertFalse(shortUtil.connectsToEmergencyNumber("222123456", RegionCode.AO));
    assertFalse(shortUtil.connectsToEmergencyNumber("923123456", RegionCode.AO));
  }

  public void testConnectsToEmergencyNumber_ZW() {
    // Zimbabwe doesn't have any metadata in the test metadata.
    assertFalse(shortUtil.connectsToEmergencyNumber("911", RegionCode.ZW));
    assertFalse(shortUtil.connectsToEmergencyNumber("01312345", RegionCode.ZW));
    assertFalse(shortUtil.connectsToEmergencyNumber("0711234567", RegionCode.ZW));
  }

  public void testIsEmergencyNumber_US() {
    assertTrue(shortUtil.isEmergencyNumber("911", RegionCode.US));
    assertTrue(shortUtil.isEmergencyNumber("119", RegionCode.US));
    assertFalse(shortUtil.isEmergencyNumber("999", RegionCode.US));
  }

  public void testIsEmergencyNumberLongNumber_US() {
    assertFalse(shortUtil.isEmergencyNumber("9116666666", RegionCode.US));
    assertFalse(shortUtil.isEmergencyNumber("1196666666", RegionCode.US));
    assertFalse(shortUtil.isEmergencyNumber("9996666666", RegionCode.US));
  }

  public void testIsEmergencyNumberWithFormatting_US() {
    assertTrue(shortUtil.isEmergencyNumber("9-1-1", RegionCode.US));
    assertTrue(shortUtil.isEmergencyNumber("*911", RegionCode.US));
    assertTrue(shortUtil.isEmergencyNumber("1-1-9", RegionCode.US));
    assertTrue(shortUtil.isEmergencyNumber("*119", RegionCode.US));
    assertFalse(shortUtil.isEmergencyNumber("9-9-9", RegionCode.US));
    assertFalse(shortUtil.isEmergencyNumber("*999", RegionCode.US));
  }

  public void testIsEmergencyNumberWithPlusSign_US() {
    assertFalse(shortUtil.isEmergencyNumber("+911", RegionCode.US));
    assertFalse(shortUtil.isEmergencyNumber("\uFF0B911", RegionCode.US));
    assertFalse(shortUtil.isEmergencyNumber(" +911", RegionCode.US));
    assertFalse(shortUtil.isEmergencyNumber("+119", RegionCode.US));
    assertFalse(shortUtil.isEmergencyNumber("+999", RegionCode.US));
  }

  public void testIsEmergencyNumber_BR() {
    assertTrue(shortUtil.isEmergencyNumber("911", RegionCode.BR));
    assertTrue(shortUtil.isEmergencyNumber("190", RegionCode.BR));
    assertFalse(shortUtil.isEmergencyNumber("999", RegionCode.BR));
  }

  public void testIsEmergencyNumberLongNumber_BR() {
    assertFalse(shortUtil.isEmergencyNumber("9111", RegionCode.BR));
    assertFalse(shortUtil.isEmergencyNumber("1900", RegionCode.BR));
    assertFalse(shortUtil.isEmergencyNumber("9996", RegionCode.BR));
  }

  public void testIsEmergencyNumber_AO() {
    // Angola doesn't have any metadata for emergency numbers in the test metadata.
    assertFalse(shortUtil.isEmergencyNumber("911", RegionCode.AO));
    assertFalse(shortUtil.isEmergencyNumber("222123456", RegionCode.AO));
    assertFalse(shortUtil.isEmergencyNumber("923123456", RegionCode.AO));
  }

  public void testIsEmergencyNumber_ZW() {
    // Zimbabwe doesn't have any metadata in the test metadata.
    assertFalse(shortUtil.isEmergencyNumber("911", RegionCode.ZW));
    assertFalse(shortUtil.isEmergencyNumber("01312345", RegionCode.ZW));
    assertFalse(shortUtil.isEmergencyNumber("0711234567", RegionCode.ZW));
  }
}
