paren_contents_test.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. // Exceptions. See /LICENSE for license information.
  3. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. #include "executable_semantics/syntax/paren_contents.h"
  5. #include "gtest/gtest.h"
  6. namespace Carbon {
  7. namespace {
  8. TEST(ParenContentsTest, EmptyAsExpression) {
  9. ParenContents contents;
  10. const Expression* expression = contents.AsExpression(/*line_num=*/1);
  11. EXPECT_EQ(expression->line_num, 1);
  12. ASSERT_EQ(expression->tag, ExpressionKind::Tuple);
  13. EXPECT_EQ(expression->u.tuple.fields->size(), 0);
  14. }
  15. TEST(ParenContentsTest, EmptyAsTuple) {
  16. ParenContents contents;
  17. const Expression* tuple = contents.AsTuple(/*line_num=*/1);
  18. EXPECT_EQ(tuple->line_num, 1);
  19. ASSERT_EQ(tuple->tag, ExpressionKind::Tuple);
  20. EXPECT_EQ(tuple->u.tuple.fields->size(), 0);
  21. }
  22. TEST(ParenContentsTest, UnaryNoCommaAsExpression) {
  23. // Equivalent to a code fragment like
  24. // ```
  25. // (
  26. // 42
  27. // )
  28. // ```
  29. ParenContents contents({{.expression = MakeInt(/*line_num=*/2, 42)}},
  30. ParenContents::HasTrailingComma::No);
  31. const Expression* expression = contents.AsExpression(/*line_num=*/1);
  32. EXPECT_EQ(expression->line_num, 2);
  33. ASSERT_EQ(expression->tag, ExpressionKind::Integer);
  34. }
  35. TEST(ParenContentsTest, UnaryNoCommaAsTuple) {
  36. ParenContents contents({{.expression = MakeInt(/*line_num=*/2, 42)}},
  37. ParenContents::HasTrailingComma::No);
  38. const Expression* tuple = contents.AsTuple(/*line_num=*/1);
  39. EXPECT_EQ(tuple->line_num, 1);
  40. ASSERT_EQ(tuple->tag, ExpressionKind::Tuple);
  41. std::vector<std::pair<std::string, const Expression*>> fields =
  42. *tuple->u.tuple.fields;
  43. ASSERT_EQ(fields.size(), 1);
  44. EXPECT_EQ(fields[0].second->tag, ExpressionKind::Integer);
  45. }
  46. TEST(ParenContentsTest, UnaryWithCommaAsExpression) {
  47. ParenContents contents({{.expression = MakeInt(/*line_num=*/2, 42)}},
  48. ParenContents::HasTrailingComma::Yes);
  49. const Expression* expression = contents.AsExpression(/*line_num=*/1);
  50. EXPECT_EQ(expression->line_num, 1);
  51. ASSERT_EQ(expression->tag, ExpressionKind::Tuple);
  52. std::vector<std::pair<std::string, const Expression*>> fields =
  53. *expression->u.tuple.fields;
  54. ASSERT_EQ(fields.size(), 1);
  55. EXPECT_EQ(fields[0].second->tag, ExpressionKind::Integer);
  56. }
  57. TEST(ParenContentsTest, UnaryWithCommaAsTuple) {
  58. ParenContents contents({{.expression = MakeInt(/*line_num=*/2, 42)}},
  59. ParenContents::HasTrailingComma::Yes);
  60. const Expression* tuple = contents.AsTuple(/*line_num=*/1);
  61. EXPECT_EQ(tuple->line_num, 1);
  62. ASSERT_EQ(tuple->tag, ExpressionKind::Tuple);
  63. std::vector<std::pair<std::string, const Expression*>> fields =
  64. *tuple->u.tuple.fields;
  65. ASSERT_EQ(fields.size(), 1);
  66. EXPECT_EQ(fields[0].second->tag, ExpressionKind::Integer);
  67. }
  68. TEST(ParenContentsTest, BinaryAsExpression) {
  69. ParenContents contents({{.expression = MakeInt(/*line_num=*/2, 42)},
  70. {.expression = MakeInt(/*line_num=*/3, 42)}},
  71. ParenContents::HasTrailingComma::Yes);
  72. const Expression* expression = contents.AsExpression(/*line_num=*/1);
  73. EXPECT_EQ(expression->line_num, 1);
  74. ASSERT_EQ(expression->tag, ExpressionKind::Tuple);
  75. std::vector<std::pair<std::string, const Expression*>> fields =
  76. *expression->u.tuple.fields;
  77. ASSERT_EQ(fields.size(), 2);
  78. EXPECT_EQ(fields[0].second->tag, ExpressionKind::Integer);
  79. EXPECT_EQ(fields[1].second->tag, ExpressionKind::Integer);
  80. }
  81. TEST(ParenContentsTest, BinaryAsTuple) {
  82. ParenContents contents({{.expression = MakeInt(/*line_num=*/2, 42)},
  83. {.expression = MakeInt(/*line_num=*/3, 42)}},
  84. ParenContents::HasTrailingComma::Yes);
  85. const Expression* tuple = contents.AsTuple(/*line_num=*/1);
  86. EXPECT_EQ(tuple->line_num, 1);
  87. ASSERT_EQ(tuple->tag, ExpressionKind::Tuple);
  88. std::vector<std::pair<std::string, const Expression*>> fields =
  89. *tuple->u.tuple.fields;
  90. ASSERT_EQ(fields.size(), 2);
  91. EXPECT_EQ(fields[0].second->tag, ExpressionKind::Integer);
  92. EXPECT_EQ(fields[1].second->tag, ExpressionKind::Integer);
  93. }
  94. } // namespace
  95. } // namespace Carbon