|
|
@@ -10,10 +10,9 @@
|
|
|
#include "gtest/gtest.h"
|
|
|
#include "llvm/ADT/Sequence.h"
|
|
|
#include "llvm/Support/SourceMgr.h"
|
|
|
-#include "llvm/Support/YAMLParser.h"
|
|
|
+#include "toolchain/common/yaml_test_helpers.h"
|
|
|
#include "toolchain/diagnostics/diagnostic_emitter.h"
|
|
|
#include "toolchain/lexer/tokenized_buffer.h"
|
|
|
-#include "toolchain/lexer/tokenized_buffer_test_helpers.h"
|
|
|
#include "toolchain/parser/parse_node_kind.h"
|
|
|
#include "toolchain/parser/parse_test_helpers.h"
|
|
|
|
|
|
@@ -21,13 +20,14 @@ namespace Carbon {
|
|
|
namespace {
|
|
|
|
|
|
using Carbon::Testing::ExpectedNode;
|
|
|
-using Carbon::Testing::IsKeyValueScalars;
|
|
|
using Carbon::Testing::MatchParseTreeNodes;
|
|
|
using namespace Carbon::Testing::NodeMatchers;
|
|
|
+using ::testing::ElementsAre;
|
|
|
using ::testing::Eq;
|
|
|
using ::testing::Ne;
|
|
|
using ::testing::NotNull;
|
|
|
using ::testing::StrEq;
|
|
|
+namespace Yaml = Carbon::Testing::Yaml;
|
|
|
|
|
|
struct ParseTreeTest : ::testing::Test {
|
|
|
std::forward_list<SourceBuffer> source_storage;
|
|
|
@@ -884,129 +884,34 @@ TEST_F(ParseTreeTest, PrintingAsYAML) {
|
|
|
tree.Print(print_stream);
|
|
|
print_stream.flush();
|
|
|
|
|
|
- // Parse the output into a YAML stream. This will print errors to stderr.
|
|
|
- llvm::SourceMgr source_manager;
|
|
|
- llvm::yaml::Stream yaml_stream(print_output, source_manager);
|
|
|
- auto di = yaml_stream.begin();
|
|
|
- auto* root_node = llvm::dyn_cast<llvm::yaml::SequenceNode>(di->getRoot());
|
|
|
- ASSERT_THAT(root_node, NotNull());
|
|
|
-
|
|
|
- // The root node is just an array of top-level parse nodes.
|
|
|
- auto ni = root_node->begin();
|
|
|
- auto ne = root_node->end();
|
|
|
- auto* node = llvm::dyn_cast<llvm::yaml::MappingNode>(&*ni);
|
|
|
- ASSERT_THAT(node, NotNull());
|
|
|
- auto nkvi = node->begin();
|
|
|
- auto nkve = node->end();
|
|
|
- EXPECT_THAT(&*nkvi, IsKeyValueScalars("node_index", "4"));
|
|
|
- ++nkvi;
|
|
|
- EXPECT_THAT(&*nkvi, IsKeyValueScalars("kind", "FunctionDeclaration"));
|
|
|
- ++nkvi;
|
|
|
- EXPECT_THAT(&*nkvi, IsKeyValueScalars("text", "fn"));
|
|
|
- ++nkvi;
|
|
|
- EXPECT_THAT(&*nkvi, IsKeyValueScalars("subtree_size", "5"));
|
|
|
- ++nkvi;
|
|
|
- auto* children_node = llvm::dyn_cast<llvm::yaml::KeyValueNode>(&*nkvi);
|
|
|
- ASSERT_THAT(children_node, NotNull());
|
|
|
- auto* children_key_node =
|
|
|
- llvm::dyn_cast<llvm::yaml::ScalarNode>(children_node->getKey());
|
|
|
- ASSERT_THAT(children_key_node, NotNull());
|
|
|
- EXPECT_THAT(children_key_node->getRawValue(), StrEq("children"));
|
|
|
- auto* children_value_node =
|
|
|
- llvm::dyn_cast<llvm::yaml::SequenceNode>(children_node->getValue());
|
|
|
- ASSERT_THAT(children_value_node, NotNull());
|
|
|
-
|
|
|
- auto ci = children_value_node->begin();
|
|
|
- auto ce = children_value_node->end();
|
|
|
- ASSERT_THAT(ci, Ne(ce));
|
|
|
- node = llvm::dyn_cast<llvm::yaml::MappingNode>(&*ci);
|
|
|
- ASSERT_THAT(node, NotNull());
|
|
|
- auto ckvi = node->begin();
|
|
|
- EXPECT_THAT(&*ckvi, IsKeyValueScalars("node_index", "0"));
|
|
|
- ++ckvi;
|
|
|
- EXPECT_THAT(&*ckvi, IsKeyValueScalars("kind", "DeclaredName"));
|
|
|
- ++ckvi;
|
|
|
- EXPECT_THAT(&*ckvi, IsKeyValueScalars("text", "F"));
|
|
|
- ++ckvi;
|
|
|
- EXPECT_THAT(ckvi, Eq(node->end()));
|
|
|
-
|
|
|
- ++ci;
|
|
|
- ASSERT_THAT(ci, Ne(ce));
|
|
|
- node = llvm::dyn_cast<llvm::yaml::MappingNode>(&*ci);
|
|
|
- ASSERT_THAT(node, NotNull());
|
|
|
- ckvi = node->begin();
|
|
|
- auto ckve = node->end();
|
|
|
- EXPECT_THAT(&*ckvi, IsKeyValueScalars("node_index", "2"));
|
|
|
- ++ckvi;
|
|
|
- EXPECT_THAT(&*ckvi, IsKeyValueScalars("kind", "ParameterList"));
|
|
|
- ++ckvi;
|
|
|
- EXPECT_THAT(&*ckvi, IsKeyValueScalars("text", "("));
|
|
|
- ++ckvi;
|
|
|
- EXPECT_THAT(&*ckvi, IsKeyValueScalars("subtree_size", "2"));
|
|
|
- ++ckvi;
|
|
|
- children_node = llvm::dyn_cast<llvm::yaml::KeyValueNode>(&*ckvi);
|
|
|
- ASSERT_THAT(children_node, NotNull());
|
|
|
- children_key_node =
|
|
|
- llvm::dyn_cast<llvm::yaml::ScalarNode>(children_node->getKey());
|
|
|
- ASSERT_THAT(children_key_node, NotNull());
|
|
|
- EXPECT_THAT(children_key_node->getRawValue(), StrEq("children"));
|
|
|
- children_value_node =
|
|
|
- llvm::dyn_cast<llvm::yaml::SequenceNode>(children_node->getValue());
|
|
|
- ASSERT_THAT(children_value_node, NotNull());
|
|
|
-
|
|
|
- auto c2_i = children_value_node->begin();
|
|
|
- auto c2_e = children_value_node->end();
|
|
|
- ASSERT_THAT(c2_i, Ne(c2_e));
|
|
|
- node = llvm::dyn_cast<llvm::yaml::MappingNode>(&*c2_i);
|
|
|
- ASSERT_THAT(node, NotNull());
|
|
|
- auto c2_kvi = node->begin();
|
|
|
- EXPECT_THAT(&*c2_kvi, IsKeyValueScalars("node_index", "1"));
|
|
|
- ++c2_kvi;
|
|
|
- EXPECT_THAT(&*c2_kvi, IsKeyValueScalars("kind", "ParameterListEnd"));
|
|
|
- ++c2_kvi;
|
|
|
- EXPECT_THAT(&*c2_kvi, IsKeyValueScalars("text", ")"));
|
|
|
- ++c2_kvi;
|
|
|
- EXPECT_THAT(c2_kvi, Eq(node->end()));
|
|
|
- ++c2_i;
|
|
|
- EXPECT_THAT(c2_i, Eq(c2_e));
|
|
|
- ++ckvi;
|
|
|
- EXPECT_THAT(ckvi, Eq(ckve));
|
|
|
-
|
|
|
- ++ci;
|
|
|
- ASSERT_THAT(ci, Ne(ce));
|
|
|
- node = llvm::dyn_cast<llvm::yaml::MappingNode>(&*ci);
|
|
|
- ASSERT_THAT(node, NotNull());
|
|
|
- ckvi = node->begin();
|
|
|
- EXPECT_THAT(&*ckvi, IsKeyValueScalars("node_index", "3"));
|
|
|
- ++ckvi;
|
|
|
- EXPECT_THAT(&*ckvi, IsKeyValueScalars("kind", "DeclarationEnd"));
|
|
|
- ++ckvi;
|
|
|
- EXPECT_THAT(&*ckvi, IsKeyValueScalars("text", ";"));
|
|
|
- ++ckvi;
|
|
|
- EXPECT_THAT(ckvi, Eq(node->end()));
|
|
|
- ++ci;
|
|
|
- EXPECT_THAT(ci, Eq(ce));
|
|
|
-
|
|
|
- ++nkvi;
|
|
|
- EXPECT_THAT(nkvi, Eq(nkve));
|
|
|
-
|
|
|
- ++ni;
|
|
|
- ASSERT_THAT(ni, Ne(ne));
|
|
|
- node = llvm::dyn_cast<llvm::yaml::MappingNode>(&*ni);
|
|
|
- ASSERT_THAT(node, NotNull());
|
|
|
- nkvi = node->begin();
|
|
|
- EXPECT_THAT(&*nkvi, IsKeyValueScalars("node_index", "5"));
|
|
|
- ++nkvi;
|
|
|
- EXPECT_THAT(&*nkvi, IsKeyValueScalars("kind", "FileEnd"));
|
|
|
- ++nkvi;
|
|
|
- EXPECT_THAT(&*nkvi, IsKeyValueScalars("text", ""));
|
|
|
- ++nkvi;
|
|
|
- EXPECT_THAT(nkvi, Eq(node->end()));
|
|
|
-
|
|
|
- ++ni;
|
|
|
- EXPECT_THAT(ni, Eq(ne));
|
|
|
- ++di;
|
|
|
- EXPECT_THAT(di, Eq(yaml_stream.end()));
|
|
|
+ EXPECT_THAT(
|
|
|
+ Yaml::Value::FromText(print_output),
|
|
|
+ ElementsAre(Yaml::SequenceValue{
|
|
|
+ Yaml::MappingValue{
|
|
|
+ {"node_index", "4"},
|
|
|
+ {"kind", "FunctionDeclaration"},
|
|
|
+ {"text", "fn"},
|
|
|
+ {"subtree_size", "5"},
|
|
|
+ {"children",
|
|
|
+ Yaml::SequenceValue{
|
|
|
+ Yaml::MappingValue{{"node_index", "0"},
|
|
|
+ {"kind", "DeclaredName"},
|
|
|
+ {"text", "F"}},
|
|
|
+ Yaml::MappingValue{{"node_index", "2"},
|
|
|
+ {"kind", "ParameterList"},
|
|
|
+ {"text", "("},
|
|
|
+ {"subtree_size", "2"},
|
|
|
+ {"children", //
|
|
|
+ Yaml::SequenceValue{Yaml::MappingValue{
|
|
|
+ {"node_index", "1"},
|
|
|
+ {"kind", "ParameterListEnd"},
|
|
|
+ {"text", ")"}}}}},
|
|
|
+ Yaml::MappingValue{{"node_index", "3"},
|
|
|
+ {"kind", "DeclarationEnd"},
|
|
|
+ {"text", ";"}}}}},
|
|
|
+ Yaml::MappingValue{{"node_index", "5"}, //
|
|
|
+ {"kind", "FileEnd"},
|
|
|
+ {"text", ""}}}));
|
|
|
}
|
|
|
|
|
|
} // namespace
|