Index: tools/gn/parse_tree_unittest.cc |
diff --git a/tools/gn/parse_tree_unittest.cc b/tools/gn/parse_tree_unittest.cc |
index baae36a30644a5ce29e7151c3943279da253262d..6d21227208d41c1b2961bbb0fb6adffa202dbf0d 100644 |
--- a/tools/gn/parse_tree_unittest.cc |
+++ b/tools/gn/parse_tree_unittest.cc |
@@ -104,3 +104,106 @@ TEST(ParseTree, OriginForDereference) { |
EXPECT_EQ(2, err.location().line_number()); |
EXPECT_EQ(20, err.location().char_offset()); |
} |
+ |
+TEST(ParseTree, SortRangeExtraction) { |
+ TestWithScope setup; |
+ |
+ // Ranges are [begin, end). |
+ |
+ { |
+ TestParseInput input( |
+ "sources = [\n" |
+ " \"a\",\n" |
+ " \"b\",\n" |
+ " \n" |
+ " #\n" |
+ " # Block\n" |
+ " #\n" |
+ " \n" |
+ " \"c\"," |
+ " \"d\"," |
+ "]\n"); |
+ EXPECT_FALSE(input.has_error()); |
+ ASSERT_TRUE(input.parsed()->AsBlock()); |
+ ASSERT_TRUE(input.parsed()->AsBlock()->statements()[0]->AsBinaryOp()); |
+ const BinaryOpNode* binop = |
+ input.parsed()->AsBlock()->statements()[0]->AsBinaryOp(); |
+ ASSERT_TRUE(binop->right()->AsList()); |
+ const ListNode* list = binop->right()->AsList(); |
+ EXPECT_EQ(5u, list->contents().size()); |
+ auto ranges = list->GetSortRanges(); |
+ ASSERT_EQ(2u, ranges.size()); |
+ EXPECT_EQ(0u, ranges[0].begin); |
+ EXPECT_EQ(2u, ranges[0].end); |
+ EXPECT_EQ(3u, ranges[1].begin); |
+ EXPECT_EQ(5u, ranges[1].end); |
+ } |
+ |
+ { |
+ TestParseInput input( |
+ "sources = [\n" |
+ " \"a\",\n" |
+ " \"b\",\n" |
+ " \n" |
+ " # Attached comment.\n" |
+ " \"c\"," |
+ " \"d\"," |
+ "]\n"); |
+ EXPECT_FALSE(input.has_error()); |
+ ASSERT_TRUE(input.parsed()->AsBlock()); |
+ ASSERT_TRUE(input.parsed()->AsBlock()->statements()[0]->AsBinaryOp()); |
+ const BinaryOpNode* binop = |
+ input.parsed()->AsBlock()->statements()[0]->AsBinaryOp(); |
+ ASSERT_TRUE(binop->right()->AsList()); |
+ const ListNode* list = binop->right()->AsList(); |
+ EXPECT_EQ(4u, list->contents().size()); |
+ auto ranges = list->GetSortRanges(); |
+ ASSERT_EQ(2u, ranges.size()); |
+ EXPECT_EQ(0u, ranges[0].begin); |
+ EXPECT_EQ(2u, ranges[0].end); |
+ EXPECT_EQ(2u, ranges[1].begin); |
+ EXPECT_EQ(4u, ranges[1].end); |
+ } |
+ |
+ { |
+ TestParseInput input( |
+ "sources = [\n" |
+ " # At end of list.\n" |
+ " \"zzzzzzzzzzz.cc\"," |
+ "]\n"); |
+ EXPECT_FALSE(input.has_error()); |
+ ASSERT_TRUE(input.parsed()->AsBlock()); |
+ ASSERT_TRUE(input.parsed()->AsBlock()->statements()[0]->AsBinaryOp()); |
+ const BinaryOpNode* binop = |
+ input.parsed()->AsBlock()->statements()[0]->AsBinaryOp(); |
+ ASSERT_TRUE(binop->right()->AsList()); |
+ const ListNode* list = binop->right()->AsList(); |
+ EXPECT_EQ(1u, list->contents().size()); |
+ auto ranges = list->GetSortRanges(); |
+ ASSERT_EQ(1u, ranges.size()); |
+ EXPECT_EQ(0u, ranges[0].begin); |
+ EXPECT_EQ(1u, ranges[0].end); |
+ } |
+ |
+ { |
+ TestParseInput input( |
+ "sources = [\n" |
+ " # Block at start.\n" |
+ " \n" |
+ " \"z.cc\"," |
+ " \"y.cc\"," |
+ "]\n"); |
+ EXPECT_FALSE(input.has_error()); |
+ ASSERT_TRUE(input.parsed()->AsBlock()); |
+ ASSERT_TRUE(input.parsed()->AsBlock()->statements()[0]->AsBinaryOp()); |
+ const BinaryOpNode* binop = |
+ input.parsed()->AsBlock()->statements()[0]->AsBinaryOp(); |
+ ASSERT_TRUE(binop->right()->AsList()); |
+ const ListNode* list = binop->right()->AsList(); |
+ EXPECT_EQ(3u, list->contents().size()); |
+ auto ranges = list->GetSortRanges(); |
+ ASSERT_EQ(1u, ranges.size()); |
+ EXPECT_EQ(1u, ranges[0].begin); |
+ EXPECT_EQ(3u, ranges[0].end); |
+ } |
+} |