find_test.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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 "common/find.h"
  5. #include <gtest/gtest.h>
  6. #include <vector>
  7. namespace Carbon {
  8. namespace {
  9. struct NoneType {
  10. static const NoneType None;
  11. int i;
  12. friend auto operator==(NoneType, NoneType) -> bool = default;
  13. };
  14. const NoneType NoneType::None = {.i = -1};
  15. TEST(FindTest, ReturnType) {
  16. const std::vector<int> c;
  17. std::vector<int> m;
  18. auto pred = [](int) { return true; };
  19. static_assert(std::same_as<decltype(FindIfOrNull(c, pred)), const int*>);
  20. static_assert(std::same_as<decltype(FindIfOrNull(m, pred)), int*>);
  21. }
  22. TEST(FindTest, FindIfOrNull) {
  23. auto make_pred = [](int query) {
  24. return [=](int elem) { return query == elem; };
  25. };
  26. std::vector<int> empty;
  27. EXPECT_EQ(FindIfOrNull(empty, make_pred(0)), nullptr);
  28. std::vector<int> range = {1, 2};
  29. EXPECT_EQ(FindIfOrNull(range, make_pred(0)), nullptr);
  30. // NOLINTNEXTLINE(readability-container-data-pointer)
  31. EXPECT_EQ(FindIfOrNull(range, make_pred(1)), &range[0]);
  32. EXPECT_EQ(FindIfOrNull(range, make_pred(2)), &range[1]);
  33. EXPECT_EQ(FindIfOrNull(range, make_pred(3)), nullptr);
  34. }
  35. TEST(FindTest, FindIfOrNone) {
  36. auto make_pred = [](NoneType query) {
  37. return [=](NoneType elem) { return query == elem; };
  38. };
  39. std::vector<NoneType> empty;
  40. EXPECT_EQ(FindIfOrNone(empty, make_pred(NoneType{0})).i, -1);
  41. std::vector<NoneType> range = {NoneType{1}, NoneType{2}};
  42. EXPECT_EQ(FindIfOrNone(range, make_pred(NoneType{0})).i, -1);
  43. EXPECT_EQ(FindIfOrNone(range, make_pred(NoneType{1})).i, 1);
  44. EXPECT_EQ(FindIfOrNone(range, make_pred(NoneType{2})).i, 2);
  45. EXPECT_EQ(FindIfOrNone(range, make_pred(NoneType{3})).i, -1);
  46. }
  47. TEST(FindTest, Contains) {
  48. std::vector<int> empty;
  49. EXPECT_EQ(Contains(empty, 0), false);
  50. std::vector<int> range = {1, 2};
  51. EXPECT_EQ(Contains(range, 0), false);
  52. EXPECT_EQ(Contains(range, 1), true);
  53. EXPECT_EQ(Contains(range, 2), true);
  54. EXPECT_EQ(Contains(range, 3), false);
  55. }
  56. } // namespace
  57. } // namespace Carbon