1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/renderer/android/phone_number_detector.h"
6
7#include "base/strings/utf_string_conversions.h"
8#include "testing/gtest/include/gtest/gtest.h"
9
10namespace content {
11
12class PhoneNumberDetectorTest : public testing::Test {
13 public:
14  static std::string FindNumber(const std::string& content,
15                                const std::string& region) {
16    base::string16 content_16 = base::UTF8ToUTF16(content);
17    base::string16 result_16;
18    size_t start, end;
19    PhoneNumberDetector detector(region);
20    std::string content_text;
21    if (detector.FindContent(content_16.begin(), content_16.end(),
22                             &start, &end, &content_text))
23         result_16 = content_16.substr(start, end - start);
24    return base::UTF16ToUTF8(result_16);
25  }
26
27  static std::string FindAndFormatNumber(const std::string& content,
28                                         const std::string& region) {
29    base::string16 content_16 = base::UTF8ToUTF16(content);
30    base::string16 result_16;
31    size_t start, end;
32    PhoneNumberDetector detector(region);
33    std::string content_text;
34    detector.FindContent(content_16.begin(), content_16.end(),
35                         &start, &end, &content_text);
36    return content_text;
37  }
38};
39
40TEST_F(PhoneNumberDetectorTest, FindNumber) {
41  // Tests cases with valid home numbers.
42  EXPECT_EQ("617-426-3000", FindNumber("hello 617-426-3000 blah", "us"));
43  EXPECT_EQ("", FindNumber("hello 617-426-3000 blah", "gb"));
44  EXPECT_EQ("020-7617-4426", FindNumber("<div>020-7617-4426</div>", "gb"));
45  EXPECT_EQ("", FindNumber("<div>020-7617-4426</div>", "fr"));
46  EXPECT_EQ("02.38.96.68.88", FindNumber("Tel:02.38.96.68.88", "fr"));
47  EXPECT_EQ("", FindNumber("Tel:02.38.96.68.88", "gb"));
48  EXPECT_EQ("1-800-866-2453",
49            FindNumber("You can call this number:1-800-866-2453 for more "
50                       "information", "us"));
51  EXPECT_EQ("+1 203-925-4602", FindNumber("+1 203-925-4602", "us"));
52}
53
54TEST_F(PhoneNumberDetectorTest, FindAndFormatNumber) {
55  EXPECT_EQ("+16174263000",
56            FindAndFormatNumber("hello 617-426-3000 blah", "us"));
57  EXPECT_EQ("", FindAndFormatNumber("hello 617-426-3000 blah", "gb"));
58  EXPECT_EQ("02076174426",
59            FindAndFormatNumber("<div>020-7617-4426</div>", "gb"));
60  EXPECT_EQ("", FindAndFormatNumber("<div>020-7617-4426</div>", "fr"));
61  EXPECT_EQ("0238966888", FindAndFormatNumber("Tel:02.38.96.68.88", "fr"));
62  EXPECT_EQ("+18008662453",
63            FindAndFormatNumber("You can call this number:1-800-866-2453 for"
64                                "more information", "us"));
65  EXPECT_EQ("+12039254602", FindAndFormatNumber("+1 203-925-4602", "us"));
66
67  // "+1 (650) 333-6000" using fullwidth UTF-8 characters.
68  EXPECT_EQ("+16503336000", FindAndFormatNumber(
69            "\xEF\xBC\x8B\xEF\xBC\x91\xE3\x80\x80\xEF\xBC\x88"
70            "\xEF\xBC\x96\xEF\xBC\x95\xEF\xBC\x90\xEF\xBC\x89"
71            "\xE3\x80\x80\xEF\xBC\x93\xEF\xBC\x93\xEF\xBC\x93"
72            "\xE3\x83\xBC\xEF\xBC\x96\xEF\xBC\x90\xEF\xBC\x90"
73            "\xEF\xBC\x90", "us"));
74}
75
76}  // namespace content
77