paren_contents_test.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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->GetTuple().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->GetTuple().fields->size(), 0);
  21. }
  22. TEST(ParenContentsTest, UnaryNoCommaAsExpression) {
  23. // Equivalent to a code fragment like
  24. // ```
  25. // (
  26. // 42
  27. // )
  28. // ```
  29. ParenContents contents(
  30. {{.expression = Expression::MakeInt(/*line_num=*/2, 42)}},
  31. ParenContents::HasTrailingComma::No);
  32. const Expression* expression = contents.AsExpression(/*line_num=*/1);
  33. EXPECT_EQ(expression->line_num, 2);
  34. ASSERT_EQ(expression->tag, ExpressionKind::Integer);
  35. }
  36. TEST(ParenContentsTest, UnaryNoCommaAsTuple) {
  37. ParenContents contents(
  38. {{.expression = Expression::MakeInt(/*line_num=*/2, 42)}},
  39. ParenContents::HasTrailingComma::No);
  40. const Expression* tuple = contents.AsTuple(/*line_num=*/1);
  41. EXPECT_EQ(tuple->line_num, 1);
  42. ASSERT_EQ(tuple->tag, ExpressionKind::Tuple);
  43. std::vector<FieldInitializer> fields = *tuple->GetTuple().fields;
  44. ASSERT_EQ(fields.size(), 1);
  45. EXPECT_EQ(fields[0].expression->tag, ExpressionKind::Integer);
  46. }
  47. TEST(ParenContentsTest, UnaryWithCommaAsExpression) {
  48. ParenContents contents(
  49. {{.expression = Expression::MakeInt(/*line_num=*/2, 42)}},
  50. ParenContents::HasTrailingComma::Yes);
  51. const Expression* expression = contents.AsExpression(/*line_num=*/1);
  52. EXPECT_EQ(expression->line_num, 1);
  53. ASSERT_EQ(expression->tag, ExpressionKind::Tuple);
  54. std::vector<FieldInitializer> fields = *expression->GetTuple().fields;
  55. ASSERT_EQ(fields.size(), 1);
  56. EXPECT_EQ(fields[0].expression->tag, ExpressionKind::Integer);
  57. }
  58. TEST(ParenContentsTest, UnaryWithCommaAsTuple) {
  59. ParenContents contents(
  60. {{.expression = Expression::MakeInt(/*line_num=*/2, 42)}},
  61. ParenContents::HasTrailingComma::Yes);
  62. const Expression* tuple = contents.AsTuple(/*line_num=*/1);
  63. EXPECT_EQ(tuple->line_num, 1);
  64. ASSERT_EQ(tuple->tag, ExpressionKind::Tuple);
  65. std::vector<FieldInitializer> fields = *tuple->GetTuple().fields;
  66. ASSERT_EQ(fields.size(), 1);
  67. EXPECT_EQ(fields[0].expression->tag, ExpressionKind::Integer);
  68. }
  69. TEST(ParenContentsTest, BinaryAsExpression) {
  70. ParenContents contents(
  71. {{.expression = Expression::MakeInt(/*line_num=*/2, 42)},
  72. {.expression = Expression::MakeInt(/*line_num=*/3, 42)}},
  73. ParenContents::HasTrailingComma::Yes);
  74. const Expression* expression = contents.AsExpression(/*line_num=*/1);
  75. EXPECT_EQ(expression->line_num, 1);
  76. ASSERT_EQ(expression->tag, ExpressionKind::Tuple);
  77. std::vector<FieldInitializer> fields = *expression->GetTuple().fields;
  78. ASSERT_EQ(fields.size(), 2);
  79. EXPECT_EQ(fields[0].expression->tag, ExpressionKind::Integer);
  80. EXPECT_EQ(fields[1].expression->tag, ExpressionKind::Integer);
  81. }
  82. TEST(ParenContentsTest, BinaryAsTuple) {
  83. ParenContents contents(
  84. {{.expression = Expression::MakeInt(/*line_num=*/2, 42)},
  85. {.expression = Expression::MakeInt(/*line_num=*/3, 42)}},
  86. ParenContents::HasTrailingComma::Yes);
  87. const Expression* tuple = contents.AsTuple(/*line_num=*/1);
  88. EXPECT_EQ(tuple->line_num, 1);
  89. ASSERT_EQ(tuple->tag, ExpressionKind::Tuple);
  90. std::vector<FieldInitializer> fields = *tuple->GetTuple().fields;
  91. ASSERT_EQ(fields.size(), 2);
  92. EXPECT_EQ(fields[0].expression->tag, ExpressionKind::Integer);
  93. EXPECT_EQ(fields[1].expression->tag, ExpressionKind::Integer);
  94. }
  95. } // namespace
  96. } // namespace Carbon