arena_test.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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 "explorer/base/arena.h"
  5. #include <gtest/gtest.h>
  6. #include <optional>
  7. #include <vector>
  8. namespace Carbon {
  9. class ReportDestruction {
  10. public:
  11. explicit ReportDestruction(bool* destroyed) : destroyed_(destroyed) {}
  12. ~ReportDestruction() { *destroyed_ = true; }
  13. private:
  14. bool* destroyed_;
  15. };
  16. TEST(ArenaTest, BasicAllocation) {
  17. bool destroyed = false;
  18. {
  19. Arena arena;
  20. (void)arena.New<ReportDestruction>(&destroyed);
  21. }
  22. EXPECT_TRUE(destroyed);
  23. }
  24. struct CanonicalizedDummy {
  25. explicit CanonicalizedDummy(int) {}
  26. explicit CanonicalizedDummy(int*) {}
  27. explicit CanonicalizedDummy(int, int*) {}
  28. explicit CanonicalizedDummy(std::vector<int>, std::nullopt_t) {}
  29. using EnableCanonicalizedAllocation = void;
  30. };
  31. TEST(ArenaTest, Canonicalize) {
  32. Arena arena;
  33. auto* dummy1 = arena.New<CanonicalizedDummy>(1);
  34. EXPECT_TRUE(std::is_const_v<std::remove_pointer_t<decltype(dummy1)>>);
  35. auto* dummy2 = arena.New<CanonicalizedDummy>(1);
  36. EXPECT_TRUE(dummy1 == dummy2);
  37. }
  38. TEST(ArenaTest, CanonicalizeArgMismatch) {
  39. Arena arena;
  40. auto* dummy1 = arena.New<CanonicalizedDummy>(1);
  41. auto* dummy2 = arena.New<CanonicalizedDummy>(2);
  42. EXPECT_TRUE(dummy1 != dummy2);
  43. }
  44. TEST(ArenaTest, CanonicalizeDifferentArenas) {
  45. Arena arena1;
  46. Arena arena2;
  47. auto* dummy1 = arena1.New<CanonicalizedDummy>(1);
  48. auto* dummy2 = arena2.New<CanonicalizedDummy>(1);
  49. EXPECT_TRUE(dummy1 != dummy2);
  50. }
  51. TEST(ArenaTest, CanonicalizeIsShallow) {
  52. Arena arena;
  53. int i1 = 1;
  54. int i2 = 1;
  55. auto* dummy1 = arena.New<CanonicalizedDummy>(&i1);
  56. auto* dummy2 = arena.New<CanonicalizedDummy>(&i2);
  57. EXPECT_TRUE(dummy1 != dummy2);
  58. }
  59. TEST(ArenaTest, CanonicalizeMultipleArgs) {
  60. Arena arena;
  61. int i;
  62. auto* dummy1 = arena.New<CanonicalizedDummy>(1, &i);
  63. auto* dummy2 = arena.New<CanonicalizedDummy>(1, &i);
  64. EXPECT_TRUE(dummy1 == dummy2);
  65. }
  66. TEST(ArenaTest, CanonicalizeStdTypes) {
  67. Arena arena;
  68. std::vector<int> v1 = {1, 2, 3};
  69. std::vector<int> v2 = {1, 2, 3};
  70. std::vector<int> v3 = {1, 2, 3, 4};
  71. auto* dummy1 = arena.New<CanonicalizedDummy>(v1, std::nullopt);
  72. auto* dummy2 = arena.New<CanonicalizedDummy>(v2, std::nullopt);
  73. EXPECT_TRUE(dummy1 == dummy2);
  74. auto* dummy3 = arena.New<CanonicalizedDummy>(v3, std::nullopt);
  75. EXPECT_TRUE(dummy1 != dummy3);
  76. }
  77. } // namespace Carbon