1*993b0882SAndroid Build Coastguard Worker /*
2*993b0882SAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project
3*993b0882SAndroid Build Coastguard Worker *
4*993b0882SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*993b0882SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*993b0882SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*993b0882SAndroid Build Coastguard Worker *
8*993b0882SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*993b0882SAndroid Build Coastguard Worker *
10*993b0882SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*993b0882SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*993b0882SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*993b0882SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*993b0882SAndroid Build Coastguard Worker * limitations under the License.
15*993b0882SAndroid Build Coastguard Worker */
16*993b0882SAndroid Build Coastguard Worker
17*993b0882SAndroid Build Coastguard Worker #include "utils/regex-match.h"
18*993b0882SAndroid Build Coastguard Worker
19*993b0882SAndroid Build Coastguard Worker #include <memory>
20*993b0882SAndroid Build Coastguard Worker
21*993b0882SAndroid Build Coastguard Worker #include "utils/jvm-test-utils.h"
22*993b0882SAndroid Build Coastguard Worker #include "utils/utf8/unicodetext.h"
23*993b0882SAndroid Build Coastguard Worker #include "utils/utf8/unilib.h"
24*993b0882SAndroid Build Coastguard Worker #include "gmock/gmock.h"
25*993b0882SAndroid Build Coastguard Worker #include "gtest/gtest.h"
26*993b0882SAndroid Build Coastguard Worker
27*993b0882SAndroid Build Coastguard Worker namespace libtextclassifier3 {
28*993b0882SAndroid Build Coastguard Worker namespace {
29*993b0882SAndroid Build Coastguard Worker
30*993b0882SAndroid Build Coastguard Worker class RegexMatchTest : public testing::Test {
31*993b0882SAndroid Build Coastguard Worker protected:
RegexMatchTest()32*993b0882SAndroid Build Coastguard Worker RegexMatchTest() : unilib_(libtextclassifier3::CreateUniLibForTesting()) {}
33*993b0882SAndroid Build Coastguard Worker std::unique_ptr<UniLib> unilib_;
34*993b0882SAndroid Build Coastguard Worker };
35*993b0882SAndroid Build Coastguard Worker
36*993b0882SAndroid Build Coastguard Worker #ifndef TC3_DISABLE_LUA
TEST_F(RegexMatchTest,HandlesSimpleVerification)37*993b0882SAndroid Build Coastguard Worker TEST_F(RegexMatchTest, HandlesSimpleVerification) {
38*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(VerifyMatch(/*context=*/"", /*matcher=*/nullptr, "return true;"));
39*993b0882SAndroid Build Coastguard Worker }
40*993b0882SAndroid Build Coastguard Worker #endif // TC3_DISABLE_LUA
41*993b0882SAndroid Build Coastguard Worker
42*993b0882SAndroid Build Coastguard Worker #ifndef TC3_DISABLE_LUA
TEST_F(RegexMatchTest,HandlesCustomVerification)43*993b0882SAndroid Build Coastguard Worker TEST_F(RegexMatchTest, HandlesCustomVerification) {
44*993b0882SAndroid Build Coastguard Worker UnicodeText pattern = UTF8ToUnicodeText("(\\d{16})",
45*993b0882SAndroid Build Coastguard Worker /*do_copy=*/true);
46*993b0882SAndroid Build Coastguard Worker UnicodeText message = UTF8ToUnicodeText("cc: 4012888888881881",
47*993b0882SAndroid Build Coastguard Worker /*do_copy=*/true);
48*993b0882SAndroid Build Coastguard Worker const std::string verifier = R"(
49*993b0882SAndroid Build Coastguard Worker function luhn(candidate)
50*993b0882SAndroid Build Coastguard Worker local sum = 0
51*993b0882SAndroid Build Coastguard Worker local num_digits = string.len(candidate)
52*993b0882SAndroid Build Coastguard Worker local parity = num_digits % 2
53*993b0882SAndroid Build Coastguard Worker for pos = 1,num_digits do
54*993b0882SAndroid Build Coastguard Worker d = tonumber(string.sub(candidate, pos, pos))
55*993b0882SAndroid Build Coastguard Worker if pos % 2 ~= parity then
56*993b0882SAndroid Build Coastguard Worker d = d * 2
57*993b0882SAndroid Build Coastguard Worker end
58*993b0882SAndroid Build Coastguard Worker if d > 9 then
59*993b0882SAndroid Build Coastguard Worker d = d - 9
60*993b0882SAndroid Build Coastguard Worker end
61*993b0882SAndroid Build Coastguard Worker sum = sum + d
62*993b0882SAndroid Build Coastguard Worker end
63*993b0882SAndroid Build Coastguard Worker return (sum % 10) == 0
64*993b0882SAndroid Build Coastguard Worker end
65*993b0882SAndroid Build Coastguard Worker return luhn(match[1].text);
66*993b0882SAndroid Build Coastguard Worker )";
67*993b0882SAndroid Build Coastguard Worker const std::unique_ptr<UniLib::RegexPattern> regex_pattern =
68*993b0882SAndroid Build Coastguard Worker unilib_->CreateRegexPattern(pattern);
69*993b0882SAndroid Build Coastguard Worker ASSERT_TRUE(regex_pattern != nullptr);
70*993b0882SAndroid Build Coastguard Worker const std::unique_ptr<UniLib::RegexMatcher> matcher =
71*993b0882SAndroid Build Coastguard Worker regex_pattern->Matcher(message);
72*993b0882SAndroid Build Coastguard Worker ASSERT_TRUE(matcher != nullptr);
73*993b0882SAndroid Build Coastguard Worker int status = UniLib::RegexMatcher::kNoError;
74*993b0882SAndroid Build Coastguard Worker ASSERT_TRUE(matcher->Find(&status) &&
75*993b0882SAndroid Build Coastguard Worker status == UniLib::RegexMatcher::kNoError);
76*993b0882SAndroid Build Coastguard Worker
77*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(VerifyMatch(message.ToUTF8String(), matcher.get(), verifier));
78*993b0882SAndroid Build Coastguard Worker }
79*993b0882SAndroid Build Coastguard Worker #endif // TC3_DISABLE_LUA
80*993b0882SAndroid Build Coastguard Worker
TEST_F(RegexMatchTest,RetrievesMatchGroupTest)81*993b0882SAndroid Build Coastguard Worker TEST_F(RegexMatchTest, RetrievesMatchGroupTest) {
82*993b0882SAndroid Build Coastguard Worker UnicodeText pattern =
83*993b0882SAndroid Build Coastguard Worker UTF8ToUnicodeText("never gonna (?:give (you) up|let (you) down)",
84*993b0882SAndroid Build Coastguard Worker /*do_copy=*/true);
85*993b0882SAndroid Build Coastguard Worker const std::unique_ptr<UniLib::RegexPattern> regex_pattern =
86*993b0882SAndroid Build Coastguard Worker unilib_->CreateRegexPattern(pattern);
87*993b0882SAndroid Build Coastguard Worker ASSERT_TRUE(regex_pattern != nullptr);
88*993b0882SAndroid Build Coastguard Worker UnicodeText message =
89*993b0882SAndroid Build Coastguard Worker UTF8ToUnicodeText("never gonna give you up - never gonna let you down");
90*993b0882SAndroid Build Coastguard Worker const std::unique_ptr<UniLib::RegexMatcher> matcher =
91*993b0882SAndroid Build Coastguard Worker regex_pattern->Matcher(message);
92*993b0882SAndroid Build Coastguard Worker ASSERT_TRUE(matcher != nullptr);
93*993b0882SAndroid Build Coastguard Worker int status = UniLib::RegexMatcher::kNoError;
94*993b0882SAndroid Build Coastguard Worker
95*993b0882SAndroid Build Coastguard Worker ASSERT_TRUE(matcher->Find(&status) &&
96*993b0882SAndroid Build Coastguard Worker status == UniLib::RegexMatcher::kNoError);
97*993b0882SAndroid Build Coastguard Worker EXPECT_THAT(GetCapturingGroupText(matcher.get(), 0).value(),
98*993b0882SAndroid Build Coastguard Worker testing::Eq("never gonna give you up"));
99*993b0882SAndroid Build Coastguard Worker EXPECT_THAT(GetCapturingGroupText(matcher.get(), 1).value(),
100*993b0882SAndroid Build Coastguard Worker testing::Eq("you"));
101*993b0882SAndroid Build Coastguard Worker EXPECT_FALSE(GetCapturingGroupText(matcher.get(), 2).has_value());
102*993b0882SAndroid Build Coastguard Worker
103*993b0882SAndroid Build Coastguard Worker ASSERT_TRUE(matcher->Find(&status) &&
104*993b0882SAndroid Build Coastguard Worker status == UniLib::RegexMatcher::kNoError);
105*993b0882SAndroid Build Coastguard Worker EXPECT_THAT(GetCapturingGroupText(matcher.get(), 0).value(),
106*993b0882SAndroid Build Coastguard Worker testing::Eq("never gonna let you down"));
107*993b0882SAndroid Build Coastguard Worker EXPECT_FALSE(GetCapturingGroupText(matcher.get(), 1).has_value());
108*993b0882SAndroid Build Coastguard Worker EXPECT_THAT(GetCapturingGroupText(matcher.get(), 2).value(),
109*993b0882SAndroid Build Coastguard Worker testing::Eq("you"));
110*993b0882SAndroid Build Coastguard Worker }
111*993b0882SAndroid Build Coastguard Worker
112*993b0882SAndroid Build Coastguard Worker } // namespace
113*993b0882SAndroid Build Coastguard Worker } // namespace libtextclassifier3
114