kind_switch_test.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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 "toolchain/base/kind_switch.h"
  5. #include <gtest/gtest.h>
  6. #include <string>
  7. #include <variant>
  8. #include "common/raw_string_ostream.h"
  9. namespace Carbon {
  10. namespace {
  11. TEST(KindSwitch, Variant) {
  12. auto f = [](std::variant<int, float, char> v) -> std::string {
  13. RawStringOstream str;
  14. CARBON_KIND_SWITCH(v) {
  15. case CARBON_KIND(int n):
  16. str << "int = " << n;
  17. return str.TakeStr();
  18. case CARBON_KIND(float f):
  19. str << "float = " << f;
  20. return str.TakeStr();
  21. case CARBON_KIND(char c):
  22. str << "char = " << c;
  23. return str.TakeStr();
  24. }
  25. };
  26. EXPECT_EQ(f(int{1}), "int = 1");
  27. EXPECT_EQ(f(float{2}), "float = 2.000000e+00");
  28. EXPECT_EQ(f(char{'h'}), "char = h");
  29. }
  30. TEST(KindSwitch, VariantUnusedValue) {
  31. auto f = [](std::variant<int, float> v) -> std::string {
  32. RawStringOstream str;
  33. CARBON_KIND_SWITCH(v) {
  34. case CARBON_KIND(int n):
  35. str << "int = " << n;
  36. return str.TakeStr();
  37. case CARBON_KIND(float _):
  38. // The float value is not used, we see that using `_` works.
  39. str << "float";
  40. return str.TakeStr();
  41. }
  42. };
  43. EXPECT_EQ(f(int{1}), "int = 1");
  44. EXPECT_EQ(f(float{2}), "float");
  45. }
  46. } // namespace
  47. } // namespace Carbon