@@ -1230,6 +1230,48 @@ TEST(TypeCheckerImplTest, TypeInferredFromStructCreation) {
12301230 std::make_unique<AstType>(ast_internal::DynamicType ())))))));
12311231}
12321232
1233+ TEST (TypeCheckerImplTest, ExpectedTypeMatches) {
1234+ google::protobuf::Arena arena;
1235+ TypeCheckEnv env (GetSharedTestingDescriptorPool ());
1236+
1237+ env.set_expected_type (MapType (&arena, StringType (), StringType ()));
1238+
1239+ TypeCheckerImpl impl (std::move (env));
1240+ ASSERT_OK_AND_ASSIGN (auto ast, MakeTestParsedAst (" {}" ));
1241+ ASSERT_OK_AND_ASSIGN (ValidationResult result, impl.Check (std::move (ast)));
1242+
1243+ ASSERT_OK_AND_ASSIGN (std::unique_ptr<Ast> checked_ast, result.ReleaseAst ());
1244+
1245+ const auto & ast_impl = AstImpl::CastFromPublicAst (*checked_ast);
1246+
1247+ EXPECT_THAT (
1248+ ast_impl.type_map (),
1249+ Contains (Pair (
1250+ ast_impl.root_expr ().id (),
1251+ Eq (AstType (ast_internal::MapType (
1252+ std::make_unique<AstType>(ast_internal::PrimitiveType::kString ),
1253+ std::make_unique<AstType>(
1254+ ast_internal::PrimitiveType::kString )))))));
1255+ }
1256+
1257+ TEST (TypeCheckerImplTest, ExpectedTypeDoesntMatch) {
1258+ google::protobuf::Arena arena;
1259+ TypeCheckEnv env (GetSharedTestingDescriptorPool ());
1260+
1261+ env.set_expected_type (MapType (&arena, StringType (), StringType ()));
1262+
1263+ TypeCheckerImpl impl (std::move (env));
1264+ ASSERT_OK_AND_ASSIGN (auto ast, MakeTestParsedAst (" {'abc': 123}" ));
1265+ ASSERT_OK_AND_ASSIGN (ValidationResult result, impl.Check (std::move (ast)));
1266+
1267+ EXPECT_FALSE (result.IsValid ());
1268+ EXPECT_THAT (
1269+ result.GetIssues (),
1270+ Contains (IsIssueWithSubstring (
1271+ Severity::kError ,
1272+ " expected type 'map<string, string>' but found 'map<string, int>'" )));
1273+ }
1274+
12331275TEST (TypeCheckerImplTest, ContainerLookupForMessageCreation) {
12341276 TypeCheckEnv env (GetSharedTestingDescriptorPool ());
12351277 env.set_container (" google.protobuf" );
0 commit comments