@@ -357,5 +357,105 @@ TEST(OptionalTypesTest, ErrorShortCircuiting) {
357357 HasSubstr (" divide by zero" )));
358358}
359359
360+ TEST (OptionalTypesTest, CreateList_TypeConversionError) {
361+ RuntimeOptions opts{.enable_qualified_type_identifiers = true };
362+ google::protobuf::Arena arena;
363+
364+ ASSERT_OK_AND_ASSIGN (
365+ auto builder,
366+ CreateStandardRuntimeBuilder (internal::GetTestingDescriptorPool (), opts));
367+
368+ ASSERT_THAT (EnableOptionalTypes (builder), IsOk ());
369+ ASSERT_THAT (
370+ EnableReferenceResolver (builder, ReferenceResolverEnabled::kAlways ),
371+ IsOk ());
372+
373+ ASSERT_OK_AND_ASSIGN (auto runtime, std::move (builder).Build ());
374+
375+ ASSERT_OK_AND_ASSIGN (ParsedExpr expr,
376+ Parse (" [?foo]" , " <input>" ,
377+ ParserOptions{.enable_optional_syntax = true }));
378+
379+ ASSERT_OK_AND_ASSIGN (std::unique_ptr<Program> program,
380+ ProtobufRuntimeAdapter::CreateProgram (*runtime, expr));
381+
382+ Activation activation;
383+ activation.InsertOrAssignValue (" foo" , IntValue (1 ));
384+
385+ ASSERT_OK_AND_ASSIGN (Value result, program->Evaluate (&arena, activation));
386+
387+ ASSERT_TRUE (result.IsError ()) << result.DebugString ();
388+ EXPECT_THAT (result.GetError ().ToStatus (),
389+ StatusIs (absl::StatusCode::kInvalidArgument ,
390+ HasSubstr (" type conversion error" )));
391+ }
392+
393+ TEST (OptionalTypesTest, CreateMap_TypeConversionError) {
394+ RuntimeOptions opts{.enable_qualified_type_identifiers = true };
395+ google::protobuf::Arena arena;
396+
397+ ASSERT_OK_AND_ASSIGN (
398+ auto builder,
399+ CreateStandardRuntimeBuilder (internal::GetTestingDescriptorPool (), opts));
400+
401+ ASSERT_THAT (EnableOptionalTypes (builder), IsOk ());
402+ ASSERT_THAT (
403+ EnableReferenceResolver (builder, ReferenceResolverEnabled::kAlways ),
404+ IsOk ());
405+
406+ ASSERT_OK_AND_ASSIGN (auto runtime, std::move (builder).Build ());
407+
408+ ASSERT_OK_AND_ASSIGN (ParsedExpr expr,
409+ Parse (" {?1: bar}" , " <input>" ,
410+ ParserOptions{.enable_optional_syntax = true }));
411+
412+ ASSERT_OK_AND_ASSIGN (std::unique_ptr<Program> program,
413+ ProtobufRuntimeAdapter::CreateProgram (*runtime, expr));
414+
415+ Activation activation;
416+ activation.InsertOrAssignValue (" foo" , IntValue (1 ));
417+
418+ ASSERT_OK_AND_ASSIGN (Value result, program->Evaluate (&arena, activation));
419+
420+ ASSERT_TRUE (result.IsError ()) << result.DebugString ();
421+ EXPECT_THAT (result.GetError ().ToStatus (),
422+ StatusIs (absl::StatusCode::kInvalidArgument ,
423+ HasSubstr (" type conversion error" )));
424+ }
425+
426+ TEST (OptionalTypesTest, CreateStruct_KeyTypeConversionError) {
427+ RuntimeOptions opts{.enable_qualified_type_identifiers = true };
428+ google::protobuf::Arena arena;
429+
430+ ASSERT_OK_AND_ASSIGN (
431+ auto builder,
432+ CreateStandardRuntimeBuilder (internal::GetTestingDescriptorPool (), opts));
433+
434+ ASSERT_THAT (EnableOptionalTypes (builder), IsOk ());
435+ ASSERT_THAT (
436+ EnableReferenceResolver (builder, ReferenceResolverEnabled::kAlways ),
437+ IsOk ());
438+
439+ ASSERT_OK_AND_ASSIGN (auto runtime, std::move (builder).Build ());
440+
441+ ASSERT_OK_AND_ASSIGN (
442+ ParsedExpr expr,
443+ Parse (" cel.expr.conformance.proto2.TestAllTypes{?single_int32: foo}" ,
444+ " <input>" , ParserOptions{.enable_optional_syntax = true }));
445+
446+ ASSERT_OK_AND_ASSIGN (std::unique_ptr<Program> program,
447+ ProtobufRuntimeAdapter::CreateProgram (*runtime, expr));
448+
449+ Activation activation;
450+ activation.InsertOrAssignValue (" foo" , IntValue (1 ));
451+
452+ ASSERT_OK_AND_ASSIGN (Value result, program->Evaluate (&arena, activation));
453+
454+ ASSERT_TRUE (result.IsError ()) << result.DebugString ();
455+ EXPECT_THAT (result.GetError ().ToStatus (),
456+ StatusIs (absl::StatusCode::kInvalidArgument ,
457+ HasSubstr (" type conversion error" )));
458+ }
459+
360460} // namespace
361461} // namespace cel::extensions
0 commit comments