| 202 | } |
| 203 | |
| 204 | void RunBenchmark(const TestCase& test_case, benchmark::State& state) { |
| 205 | bool lists_overlap = test_case.result.BoolOrDie(); |
| 206 | |
| 207 | std::string expr = test_case.expr; |
| 208 | if (test_case.list_impl == ListImpl::kRhsConstant) { |
| 209 | expr = absl::StrReplaceAll( |
| 210 | expr, {{"y", ConstantList(lists_overlap, test_case.size)}}); |
| 211 | } |
| 212 | ASSERT_OK_AND_ASSIGN(ParsedExpr parsed_expr, Parse(expr)); |
| 213 | |
| 214 | google::protobuf::Arena arena; |
| 215 | |
| 216 | InterpreterOptions options; |
| 217 | options.constant_folding = true; |
| 218 | options.constant_arena = &arena; |
| 219 | options.enable_qualified_identifier_rewrites = true; |
| 220 | auto builder = CreateCelExpressionBuilder(options); |
| 221 | ASSERT_OK(RegisterBuiltinFunctions(builder->GetRegistry(), options)); |
| 222 | ASSERT_OK(RegisterSetsFunctions(builder->GetRegistry()->InternalGetRegistry(), |
| 223 | cel::RuntimeOptions{})); |
| 224 | ASSERT_OK_AND_ASSIGN( |
| 225 | auto cel_expr, builder->CreateExpression(&(parsed_expr.expr()), nullptr)); |
| 226 | |
| 227 | Activation activation; |
| 228 | ASSERT_OK_AND_ASSIGN( |
| 229 | auto storage, |
| 230 | RegisterLists(test_case.result.BoolOrDie(), test_case.size, |
| 231 | test_case.list_impl == ListImpl::kWrappedModern, &arena, |
| 232 | activation)); |
| 233 | |
| 234 | state.SetLabel(test_case.MakeLabel(test_case.size)); |
| 235 | for (auto _ : state) { |
| 236 | ASSERT_OK_AND_ASSIGN(CelValue result, |
| 237 | cel_expr->Evaluate(activation, &arena)); |
| 238 | ASSERT_TRUE(result.IsBool()); |
| 239 | ASSERT_EQ(result.BoolOrDie(), test_case.result.BoolOrDie()) |
| 240 | << test_case.test_name; |
| 241 | } |
| 242 | } |
| 243 | |
| 244 | void BM_SetsIntersectsTrue(benchmark::State& state) { |
| 245 | ListImpl impl = FromNumber(state.range(0)); |
no test coverage detected