[toolchain] Add simpler mechanism for matching YAML output in tests. (#583)

This commit is contained in:
Richard Smith
2021-06-17 18:42:19 -07:00
committed by GitHub
parent 70071f9ede
commit 6a4c8a5186
10 changed files with 370 additions and 371 deletions
+31 -126
View File
@@ -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