UniquePointerTests.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. module Tests;
  2. import Core.Test;
  3. import Core.UniquePointer;
  4. import Core.Meta;
  5. struct B final {
  6. static int instances;
  7. bool b = false;
  8. B() {
  9. instances++;
  10. }
  11. ~B() {
  12. instances--;
  13. }
  14. void test() {
  15. b = true;
  16. }
  17. };
  18. int B::instances = 0;
  19. template class Core::UniquePointer<B>;
  20. using UniqueB = Core::UniquePointer<B>;
  21. static void testDestroy() {
  22. {
  23. UniqueB p(new B());
  24. Core::test(1, B::instances);
  25. }
  26. Core::test(0, B::instances);
  27. }
  28. static void testMoveConstructDestroys() {
  29. UniqueB p1(new B());
  30. Core::test(1, B::instances);
  31. UniqueB p2(Core::move(p1));
  32. Core::test(1, B::instances);
  33. p2 = nullptr;
  34. Core::test(0, B::instances);
  35. }
  36. static void testMoveDestroys() {
  37. {
  38. UniqueB p1(new B());
  39. UniqueB p2(new B());
  40. Core::test(2, B::instances);
  41. p1 = Core::move(p2);
  42. Core::test(1, B::instances);
  43. }
  44. Core::test(0, B::instances);
  45. }
  46. static void testEmpty() {
  47. UniqueB p;
  48. Core::testTrue(p == nullptr);
  49. Core::testTrue(static_cast<const UniqueB&>(p) == nullptr);
  50. }
  51. static void testCall() {
  52. UniqueB p(new B());
  53. Core::testFalse(p->b);
  54. p->test();
  55. Core::testTrue(p->b);
  56. Core::testTrue(static_cast<const UniqueB&>(p)->b);
  57. }
  58. void testUniquePointer() {
  59. testDestroy();
  60. testMoveConstructDestroys();
  61. testMoveDestroys();
  62. testEmpty();
  63. testCall();
  64. }