// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/utf_string_conversions.h"
#include "chrome/browser/autofill/home_phone_number.h"
#include "chrome/browser/autofill/phone_number.h"
#include "testing/gtest/include/gtest/gtest.h"

class PhoneNumberTest : public testing::Test {
 public:
  PhoneNumberTest() {}

  void set_whole_number(PhoneNumber* phone_number,
                        const string16& whole_number) {
    phone_number->set_whole_number(whole_number);
  }

  bool IsNumber(PhoneNumber* phone_number, const string16& text) const {
    return phone_number->IsNumber(text);
  }

  bool IsCityCode(PhoneNumber* phone_number, const string16& text) const {
    return phone_number->IsCityCode(text);
  }

  bool IsCountryCode(PhoneNumber* phone_number, const string16& text) const {
    return phone_number->IsCountryCode(text);
  }

 private:
  DISALLOW_COPY_AND_ASSIGN(PhoneNumberTest);
};

// Tests the phone number parser.
TEST_F(PhoneNumberTest, Parser) {
  string16 number;
  string16 city_code;
  string16 country_code;

  // Test for empty string.  Should give back empty strings.
  string16 phone0;
  PhoneNumber::ParsePhoneNumber(phone0, &number, &city_code, &country_code);
  EXPECT_EQ(string16(), number);
  EXPECT_EQ(string16(), city_code);
  EXPECT_EQ(string16(), country_code);

  // Test for string with less than 7 digits.  Should give back empty strings.
  string16 phone1(ASCIIToUTF16("1234"));
  PhoneNumber::ParsePhoneNumber(phone1, &number, &city_code, &country_code);
  EXPECT_EQ(string16(), number);
  EXPECT_EQ(string16(), city_code);
  EXPECT_EQ(string16(), country_code);

  // Test for string with exactly 7 digits.  Should give back only phone number.
  string16 phone2(ASCIIToUTF16("1234567"));
  PhoneNumber::ParsePhoneNumber(phone2, &number, &city_code, &country_code);
  EXPECT_EQ(ASCIIToUTF16("1234567"), number);
  EXPECT_EQ(string16(), city_code);
  EXPECT_EQ(string16(), country_code);

  // Test for string with exactly 7 digits and separators.  Should give back
  // only phone number.
  string16 phone_separator2(ASCIIToUTF16("123-4567"));
  PhoneNumber::ParsePhoneNumber(phone_separator2,
      &number, &city_code, &country_code);
  EXPECT_EQ(ASCIIToUTF16("1234567"), number);
  EXPECT_EQ(string16(), city_code);
  EXPECT_EQ(string16(), country_code);

  // Test for string with greater than 7 digits but less than 10 digits.
  // Should give back only phone number.
  string16 phone3(ASCIIToUTF16("123456789"));
  PhoneNumber::ParsePhoneNumber(phone3, &number, &city_code, &country_code);
  EXPECT_EQ(ASCIIToUTF16("3456789"), number);
  EXPECT_EQ(string16(), city_code);
  EXPECT_EQ(string16(), country_code);

  // Test for string with greater than 7 digits but less than 10 digits and
  // separators.
  // Should give back only phone number.
  string16 phone_separator3(ASCIIToUTF16("12.345-6789"));
  PhoneNumber::ParsePhoneNumber(phone3, &number, &city_code, &country_code);
  EXPECT_EQ(ASCIIToUTF16("3456789"), number);
  EXPECT_EQ(string16(), city_code);
  EXPECT_EQ(string16(), country_code);

  // Test for string with exactly 10 digits.
  // Should give back phone number and city code.
  string16 phone4(ASCIIToUTF16("1234567890"));
  PhoneNumber::ParsePhoneNumber(phone4, &number, &city_code, &country_code);
  EXPECT_EQ(ASCIIToUTF16("4567890"), number);
  EXPECT_EQ(ASCIIToUTF16("123"), city_code);
  EXPECT_EQ(string16(), country_code);

  // Test for string with exactly 10 digits and separators.
  // Should give back phone number and city code.
  string16 phone_separator4(ASCIIToUTF16("(123) 456-7890"));
  PhoneNumber::ParsePhoneNumber(phone_separator4,
      &number, &city_code, &country_code);
  EXPECT_EQ(ASCIIToUTF16("4567890"), number);
  EXPECT_EQ(ASCIIToUTF16("123"), city_code);
  EXPECT_EQ(string16(), country_code);

  // Test for string with over 10 digits.
  // Should give back phone number, city code, and country code.
  string16 phone5(ASCIIToUTF16("011234567890"));
  PhoneNumber::ParsePhoneNumber(phone5, &number, &city_code, &country_code);
  EXPECT_EQ(ASCIIToUTF16("4567890"), number);
  EXPECT_EQ(ASCIIToUTF16("123"), city_code);
  EXPECT_EQ(ASCIIToUTF16("01"), country_code);

  // Test for string with over 10 digits with separator characters.
  // Should give back phone number, city code, and country code.
  string16 phone6(ASCIIToUTF16("(01) 123-456.7890"));
  PhoneNumber::ParsePhoneNumber(phone6, &number, &city_code, &country_code);
  EXPECT_EQ(ASCIIToUTF16("4567890"), number);
  EXPECT_EQ(ASCIIToUTF16("123"), city_code);
  EXPECT_EQ(ASCIIToUTF16("01"), country_code);
}

TEST_F(PhoneNumberTest, Matcher) {
  string16 phone(ASCIIToUTF16("121231234567"));
  HomePhoneNumber phone_number;
  set_whole_number(&phone_number, phone);
  // Phone number is now country_code == 12, city_code = 123, number = 1234567.
  char test_number[] = "1234567890";
  for (int i = arraysize(test_number) - 1; i >= 0; --i) {
    test_number[i] = 0;  // Cut the string.
    if (i > 7) {
      EXPECT_FALSE(IsNumber(&phone_number, ASCIIToUTF16(test_number)));
    } else {
      EXPECT_TRUE(IsNumber(&phone_number, ASCIIToUTF16(test_number)));
    }
    if (i > 3) {
      EXPECT_FALSE(IsCityCode(&phone_number, ASCIIToUTF16(test_number)));
    } else {
      EXPECT_TRUE(IsCityCode(&phone_number, ASCIIToUTF16(test_number)));
    }
    if (i > 2) {
      EXPECT_FALSE(IsCountryCode(&phone_number, ASCIIToUTF16(test_number)));
    } else {
      EXPECT_TRUE(IsCountryCode(&phone_number, ASCIIToUTF16(test_number)));
    }
  }
}