15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/android/phone_number_detector.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PhoneNumberDetectorTest : public testing::Test {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string FindNumber(const std::string& content,
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const std::string& region) {
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 content_16 = base::UTF8ToUTF16(content);
17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 result_16;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t start, end;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PhoneNumberDetector detector(region);
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string content_text;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (detector.FindContent(content_16.begin(), content_16.end(),
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             &start, &end, &content_text))
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         result_16 = content_16.substr(start, end - start);
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return base::UTF16ToUTF8(result_16);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string FindAndFormatNumber(const std::string& content,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const std::string& region) {
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 content_16 = base::UTF8ToUTF16(content);
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 result_16;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t start, end;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PhoneNumberDetector detector(region);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string content_text;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    detector.FindContent(content_16.begin(), content_16.end(),
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         &start, &end, &content_text);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return content_text;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PhoneNumberDetectorTest, FindNumber) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tests cases with valid home numbers.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("617-426-3000", FindNumber("hello 617-426-3000 blah", "us"));
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", FindNumber("hello 617-426-3000 blah", "gb"));
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("020-7617-4426", FindNumber("<div>020-7617-4426</div>", "gb"));
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", FindNumber("<div>020-7617-4426</div>", "fr"));
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("02.38.96.68.88", FindNumber("Tel:02.38.96.68.88", "fr"));
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", FindNumber("Tel:02.38.96.68.88", "gb"));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("1-800-866-2453",
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            FindNumber("You can call this number:1-800-866-2453 for more "
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       "information", "us"));
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("+1 203-925-4602", FindNumber("+1 203-925-4602", "us"));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PhoneNumberDetectorTest, FindAndFormatNumber) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("+16174263000",
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            FindAndFormatNumber("hello 617-426-3000 blah", "us"));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", FindAndFormatNumber("hello 617-426-3000 blah", "gb"));
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("02076174426",
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            FindAndFormatNumber("<div>020-7617-4426</div>", "gb"));
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", FindAndFormatNumber("<div>020-7617-4426</div>", "fr"));
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("0238966888", FindAndFormatNumber("Tel:02.38.96.68.88", "fr"));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("+18008662453",
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            FindAndFormatNumber("You can call this number:1-800-866-2453 for"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                "more information", "us"));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("+12039254602", FindAndFormatNumber("+1 203-925-4602", "us"));
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "+1 (650) 333-6000" using fullwidth UTF-8 characters.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("+16503336000", FindAndFormatNumber(
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "\xEF\xBC\x8B\xEF\xBC\x91\xE3\x80\x80\xEF\xBC\x88"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "\xEF\xBC\x96\xEF\xBC\x95\xEF\xBC\x90\xEF\xBC\x89"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "\xE3\x80\x80\xEF\xBC\x93\xEF\xBC\x93\xEF\xBC\x93"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "\xE3\x83\xBC\xEF\xBC\x96\xEF\xBC\x90\xEF\xBC\x90"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "\xEF\xBC\x90", "us"));
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
77