1818#include < utility>
1919
2020#include " google/api/expr/v1alpha1/syntax.pb.h"
21+ #include " absl/status/status_matchers.h"
2122#include " absl/strings/cord.h"
2223#include " common/memory.h"
2324#include " common/value.h"
3637namespace cel ::extensions {
3738namespace {
3839
40+ using ::absl_testing::IsOk;
3941using ::google::api::expr::v1alpha1::ParsedExpr;
4042using ::google::api::expr::parser::Parse;
4143using ::google::api::expr::parser::ParserOptions;
@@ -46,7 +48,8 @@ TEST(Strings, SplitWithEmptyDelimiterCord) {
4648 ASSERT_OK_AND_ASSIGN (auto builder,
4749 CreateStandardRuntimeBuilder (
4850 internal::GetTestingDescriptorPool (), options));
49- EXPECT_OK (RegisterStringsFunctions (builder.function_registry (), options));
51+ EXPECT_THAT (RegisterStringsFunctions (builder.function_registry (), options),
52+ IsOk ());
5053
5154 ASSERT_OK_AND_ASSIGN (auto runtime, std::move (builder).Build ());
5255
@@ -71,5 +74,125 @@ TEST(Strings, SplitWithEmptyDelimiterCord) {
7174 EXPECT_TRUE (result.GetBool ().NativeValue ());
7275}
7376
77+ TEST (Strings, Replace) {
78+ MemoryManagerRef memory_manager = MemoryManagerRef::ReferenceCounting ();
79+ const auto options = RuntimeOptions{};
80+ ASSERT_OK_AND_ASSIGN (auto builder,
81+ CreateStandardRuntimeBuilder (
82+ internal::GetTestingDescriptorPool (), options));
83+ EXPECT_THAT (RegisterStringsFunctions (builder.function_registry (), options),
84+ IsOk ());
85+
86+ ASSERT_OK_AND_ASSIGN (auto runtime, std::move (builder).Build ());
87+
88+ ASSERT_OK_AND_ASSIGN (ParsedExpr expr,
89+ Parse (" foo.replace('he', 'we') == 'wello wello'" ,
90+ " <input>" , ParserOptions{}));
91+
92+ ASSERT_OK_AND_ASSIGN (std::unique_ptr<Program> program,
93+ ProtobufRuntimeAdapter::CreateProgram (*runtime, expr));
94+
95+ common_internal::LegacyValueManager value_factory (memory_manager,
96+ runtime->GetTypeProvider ());
97+
98+ Activation activation;
99+ activation.InsertOrAssignValue (" foo" , StringValue{absl::Cord (" hello hello" )});
100+
101+ ASSERT_OK_AND_ASSIGN (Value result,
102+ program->Evaluate (activation, value_factory));
103+ ASSERT_TRUE (result.Is <BoolValue>());
104+ EXPECT_TRUE (result.GetBool ().NativeValue ());
105+ }
106+
107+ TEST (Strings, ReplaceWithNegativeLimit) {
108+ MemoryManagerRef memory_manager = MemoryManagerRef::ReferenceCounting ();
109+ const auto options = RuntimeOptions{};
110+ ASSERT_OK_AND_ASSIGN (auto builder,
111+ CreateStandardRuntimeBuilder (
112+ internal::GetTestingDescriptorPool (), options));
113+ EXPECT_THAT (RegisterStringsFunctions (builder.function_registry (), options),
114+ IsOk ());
115+
116+ ASSERT_OK_AND_ASSIGN (auto runtime, std::move (builder).Build ());
117+
118+ ASSERT_OK_AND_ASSIGN (ParsedExpr expr,
119+ Parse (" foo.replace('he', 'we', -1) == 'wello wello'" ,
120+ " <input>" , ParserOptions{}));
121+
122+ ASSERT_OK_AND_ASSIGN (std::unique_ptr<Program> program,
123+ ProtobufRuntimeAdapter::CreateProgram (*runtime, expr));
124+
125+ common_internal::LegacyValueManager value_factory (memory_manager,
126+ runtime->GetTypeProvider ());
127+
128+ Activation activation;
129+ activation.InsertOrAssignValue (" foo" , StringValue{absl::Cord (" hello hello" )});
130+
131+ ASSERT_OK_AND_ASSIGN (Value result,
132+ program->Evaluate (activation, value_factory));
133+ ASSERT_TRUE (result.Is <BoolValue>());
134+ EXPECT_TRUE (result.GetBool ().NativeValue ());
135+ }
136+
137+ TEST (Strings, ReplaceWithLimit) {
138+ MemoryManagerRef memory_manager = MemoryManagerRef::ReferenceCounting ();
139+ const auto options = RuntimeOptions{};
140+ ASSERT_OK_AND_ASSIGN (auto builder,
141+ CreateStandardRuntimeBuilder (
142+ internal::GetTestingDescriptorPool (), options));
143+ EXPECT_THAT (RegisterStringsFunctions (builder.function_registry (), options),
144+ IsOk ());
145+
146+ ASSERT_OK_AND_ASSIGN (auto runtime, std::move (builder).Build ());
147+
148+ ASSERT_OK_AND_ASSIGN (ParsedExpr expr,
149+ Parse (" foo.replace('he', 'we', 1) == 'wello hello'" ,
150+ " <input>" , ParserOptions{}));
151+
152+ ASSERT_OK_AND_ASSIGN (std::unique_ptr<Program> program,
153+ ProtobufRuntimeAdapter::CreateProgram (*runtime, expr));
154+
155+ common_internal::LegacyValueManager value_factory (memory_manager,
156+ runtime->GetTypeProvider ());
157+
158+ Activation activation;
159+ activation.InsertOrAssignValue (" foo" , StringValue{absl::Cord (" hello hello" )});
160+
161+ ASSERT_OK_AND_ASSIGN (Value result,
162+ program->Evaluate (activation, value_factory));
163+ ASSERT_TRUE (result.Is <BoolValue>());
164+ EXPECT_TRUE (result.GetBool ().NativeValue ());
165+ }
166+
167+ TEST (Strings, ReplaceWithZeroLimit) {
168+ MemoryManagerRef memory_manager = MemoryManagerRef::ReferenceCounting ();
169+ const auto options = RuntimeOptions{};
170+ ASSERT_OK_AND_ASSIGN (auto builder,
171+ CreateStandardRuntimeBuilder (
172+ internal::GetTestingDescriptorPool (), options));
173+ EXPECT_THAT (RegisterStringsFunctions (builder.function_registry (), options),
174+ IsOk ());
175+
176+ ASSERT_OK_AND_ASSIGN (auto runtime, std::move (builder).Build ());
177+
178+ ASSERT_OK_AND_ASSIGN (ParsedExpr expr,
179+ Parse (" foo.replace('he', 'we', 0) == 'hello hello'" ,
180+ " <input>" , ParserOptions{}));
181+
182+ ASSERT_OK_AND_ASSIGN (std::unique_ptr<Program> program,
183+ ProtobufRuntimeAdapter::CreateProgram (*runtime, expr));
184+
185+ common_internal::LegacyValueManager value_factory (memory_manager,
186+ runtime->GetTypeProvider ());
187+
188+ Activation activation;
189+ activation.InsertOrAssignValue (" foo" , StringValue{absl::Cord (" hello hello" )});
190+
191+ ASSERT_OK_AND_ASSIGN (Value result,
192+ program->Evaluate (activation, value_factory));
193+ ASSERT_TRUE (result.Is <BoolValue>());
194+ EXPECT_TRUE (result.GetBool ().NativeValue ());
195+ }
196+
74197} // namespace
75198} // namespace cel::extensions
0 commit comments