// Part of the Carbon Language project, under the Apache License v2.0 with LLVM // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception #include "common/fuzzing/proto_to_carbon.h" #include #include #include "executable_semantics/fuzzing/ast_to_proto.h" #include "executable_semantics/syntax/parse.h" namespace Carbon::Testing { namespace { static std::vector* carbon_files = nullptr; // Returns a string representation of `ast`. auto AstToString(const AST& ast) -> std::string { std::string s; llvm::raw_string_ostream out(s); out << "package " << ast.package.package << (ast.is_api ? "api" : "impl") << ";\n"; for (auto* declaration : ast.declarations) { out << *declaration << "\n"; } return s; } TEST(ProtoToCarbonTest, Roundtrip) { int parsed_ok_count = 0; for (const llvm::StringRef f : *carbon_files) { Carbon::Arena arena; const ErrorOr ast = Carbon::Parse(&arena, f, /*trace=*/false); if (ast.ok()) { ++parsed_ok_count; const std::string source_from_proto = ProtoToCarbon(AstToProto(*ast)); SCOPED_TRACE(testing::Message() << "Carbon file: " << f << ", source from proto:\n" << source_from_proto); const ErrorOr ast_from_proto = Carbon::ParseFromString( &arena, f, source_from_proto, /*trace=*/false); if (ast_from_proto.ok()) { EXPECT_EQ(AstToString(*ast), AstToString(*ast_from_proto)); } else { ADD_FAILURE() << "Parse error " << ast_from_proto.error().message(); } } } // Makes sure files were actually processed. EXPECT_GT(parsed_ok_count, 0); } } // namespace } // namespace Carbon::Testing auto main(int argc, char** argv) -> int { ::testing::InitGoogleTest(&argc, argv); Carbon::Testing::carbon_files = new std::vector(&argv[1], &argv[argc]); return RUN_ALL_TESTS(); }