| 225 | |
| 226 | TEST(NavigableProtoAst, ParentRelationCreateList) { |
| 227 | ASSERT_OK_AND_ASSIGN(auto parsed_expr, Parse("[123]")); |
| 228 | |
| 229 | NavigableProtoAst ast = NavigableProtoAst::Build(parsed_expr.expr()); |
| 230 | const NavigableProtoAstNode& root = ast.Root(); |
| 231 | |
| 232 | EXPECT_EQ(root.node_kind(), NodeKind::kList); |
| 233 | ASSERT_THAT(root.children(), SizeIs(1)); |
| 234 | const auto* child = root.children()[0]; |
| 235 | |
| 236 | EXPECT_EQ(child->parent_relation(), ChildKind::kListElem); |
| 237 | EXPECT_EQ(child->node_kind(), NodeKind::kConstant); |
| 238 | } |
| 239 | |
| 240 | TEST(NavigableProtoAst, ParentRelationComprehension) { |
| 241 | ASSERT_OK_AND_ASSIGN(auto parsed_expr, Parse("[1].all(x, x < 2)")); |
| 242 | |
| 243 | NavigableProtoAst ast = NavigableProtoAst::Build(parsed_expr.expr()); |
| 244 | const NavigableProtoAstNode& root = ast.Root(); |
| 245 | |
| 246 | EXPECT_EQ(root.node_kind(), NodeKind::kComprehension); |
| 247 | ASSERT_THAT(root.children(), SizeIs(5)); |
| 248 | const auto* range = root.children()[0]; |
| 249 | const auto* init = root.children()[1]; |
| 250 | const auto* condition = root.children()[2]; |
| 251 | const auto* step = root.children()[3]; |
| 252 | const auto* finish = root.children()[4]; |
| 253 | |
| 254 | EXPECT_EQ(range->parent_relation(), ChildKind::kComprehensionRange); |
| 255 | EXPECT_EQ(init->parent_relation(), ChildKind::kComprehensionInit); |
| 256 | EXPECT_EQ(condition->parent_relation(), ChildKind::kComprehensionCondition); |
| 257 | EXPECT_EQ(step->parent_relation(), ChildKind::kComprehensionLoopStep); |
| 258 | EXPECT_EQ(finish->parent_relation(), ChildKind::kComprensionResult); |
| 259 | } |
| 260 | |
| 261 | TEST(NavigableProtoAst, DescendantsPostorder) { |
| 262 | ASSERT_OK_AND_ASSIGN(auto parsed_expr, Parse("1 + (x * 3)")); |
| 263 | |
| 264 | NavigableProtoAst ast = NavigableProtoAst::Build(parsed_expr.expr()); |
| 265 | const NavigableProtoAstNode& root = ast.Root(); |
| 266 | |
| 267 | EXPECT_EQ(root.node_kind(), NodeKind::kCall); |
| 268 | |
| 269 | std::vector<int> constants; |
| 270 | std::vector<NodeKind> node_kinds; |
| 271 | |
| 272 | for (const NavigableProtoAstNode& node : root.DescendantsPostorder()) { |
| 273 | if (node.node_kind() == NodeKind::kConstant) { |
| 274 | constants.push_back(node.expr()->const_expr().int64_value()); |
| 275 | } |
| 276 | node_kinds.push_back(node.node_kind()); |
| 277 | } |
| 278 | |
| 279 | EXPECT_THAT(node_kinds, ElementsAre(NodeKind::kConstant, NodeKind::kIdent, |
| 280 | NodeKind::kConstant, NodeKind::kCall, |
| 281 | NodeKind::kCall)); |
| 282 | EXPECT_THAT(constants, ElementsAre(1, 3)); |
| 283 | } |
| 284 |
no test coverage detected