xref: /aosp_15_r20/external/libtextclassifier/native/utils/regex-match_test.cc (revision 993b0882672172b81d12fad7a7ac0c3e5c824a12)
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