PointerTest.cpp.svn-base
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:5k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. /*
  2.  *  OpenKore C++ Standard Library
  3.  *  Copyright (C) 2006  VCL
  4.  *
  5.  *  Unit tests
  6.  *
  7.  *  This library is free software; you can redistribute it and/or
  8.  *  modify it under the terms of the GNU Lesser General Public
  9.  *  License as published by the Free Software Foundation; either
  10.  *  version 2.1 of the License, or (at your option) any later version.
  11.  *
  12.  *  This library is distributed in the hope that it will be useful,
  13.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  *  Lesser General Public License for more details.
  16.  *
  17.  *  You should have received a copy of the GNU Lesser General Public
  18.  *  License along with this library; if not, write to the Free Software
  19.  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  20.  *  MA  02110-1301  USA
  21.  */
  22. #include "tut.h"
  23. #include "../../Pointer.h"
  24. /*
  25.  * Test case for OSL::Pointer
  26.  */
  27. namespace tut {
  28. using namespace OSL;
  29. namespace {
  30. static int deleteCount;
  31. class Foo {
  32. public:
  33. ~Foo() {
  34. deleteCount++;
  35. }
  36. void test() {
  37. }
  38. };
  39. class Bar: public Object, public Foo {
  40. };
  41. }
  42. struct PointerTest {
  43. PointerTest() {
  44. deleteCount = 0;
  45. }
  46. Pointer<Foo> createFoo() {
  47. return new Foo();
  48. }
  49. };
  50. DEFINE_TEST_GROUP(PointerTest);
  51. // Test whether smart pointer deletes referee.
  52. TEST_METHOD(1) {
  53. do {
  54. Pointer<Foo> p1(new Foo());
  55. ensure_equals(deleteCount, 0);
  56. } while (0);
  57. ensure_equals("Referee is deleted.", deleteCount, 1);
  58. }
  59. // Test whether only last smart pointer deletes referee.
  60. TEST_METHOD(2) {
  61. do {
  62. Pointer<Foo> p2;
  63. do {
  64. Pointer<Foo> p1(new Foo());
  65. ensure_equals("Referee is not deleted.", deleteCount, 0);
  66. p2 = p1;
  67. } while (0);
  68. ensure_equals("Referee is not deleted.", deleteCount, 0);
  69. } while (0);
  70. ensure_equals("Referee is deleted.", deleteCount, 1);
  71. }
  72. // Test setting smart pointer to NULL.
  73. TEST_METHOD(3) {
  74. Pointer<Foo> p1(new Foo());
  75. p1 = NULL;
  76. ensure_equals("Referee is deleted.", deleteCount, 1);
  77. ensure("Empty smart pointer refers to NULL (1).", p1.operator->() == NULL);
  78. ensure("Empty smart pointer refers to NULL (2).", (Foo *) p1 == NULL);
  79. ensure("Empty smart pointer refers to NULL (3).", (void *) p1 == NULL);
  80. }
  81. // Test setting smart pointer to NULL when there are multiple smart pointers.
  82. TEST_METHOD(4) {
  83. Pointer<Foo> p1(new Foo());
  84. Pointer<Foo> p2 = p1;
  85. p1 = NULL;
  86. ensure("Empty smart pointer 1 refers to NULL.", p1.operator->() == NULL);
  87. ensure("Empty smart pointer 1 refers to NULL (2).", (Foo *) p1 == NULL);
  88. ensure_equals("Referee is not deleted.", deleteCount, 0);
  89. p2 = NULL;
  90. ensure("Empty smart pointer 2 refers to NULL.", p2.operator->() == NULL);
  91. ensure("Empty smart pointer 2 refers to NULL (2).", (Foo *) p2 == NULL);
  92. ensure_equals("Referee is deleted.", deleteCount, 1);
  93. p2 = NULL;
  94. }
  95. // Test dereferencing non-empty smart pointers.
  96. TEST_METHOD(5) {
  97. Foo *foo = new Foo();
  98. Pointer<Foo> p1(foo);
  99. p1->test();           // Should not crash if it works.
  100. (*p1).test();         // Ditto.
  101. ((Foo *) p1)->test();  // Ditto.
  102. ((Foo &) p1).test();  // Ditto.
  103. ensure("Referee is correct.", p1 == foo);
  104. }
  105. // Test dereferencing empty smart pointers.
  106. TEST_METHOD(6) {
  107. Pointer<Foo> p1;
  108. bool caught;
  109. ensure("Newly created smart pointer refers to NULL.", p1.operator->() == NULL);
  110. try {
  111. *p1;
  112. caught = false;
  113. } catch(PointerException &) {
  114. caught = true;
  115. }
  116. ensure("Dereferencing NULL smart pointer raises exception.", caught);
  117. p1 = NULL;
  118. ensure("Empty smart pointer refers to NULL.", (void *) p1 == NULL);
  119. try {
  120. Foo &foo = (Foo &) p1;
  121. foo.test();
  122. caught = false;
  123. } catch(PointerException &) {
  124. caught = true;
  125. }
  126. ensure("Dereferencing NULL smart pointer raises exception.", caught);
  127. }
  128. // Test setting empty smart pointer to NULL.
  129. TEST_METHOD(7) {
  130. Pointer<Foo> p1;
  131. p1 = NULL;
  132. ensure("Newly created smart pointer refers to NULL.", p1.operator->() == NULL);
  133. }
  134. // Test reassigning existing pointer.
  135. TEST_METHOD(8) {
  136. Pointer<Foo> p1 = createFoo();
  137. Pointer<Foo> p2(createFoo());
  138. ensure_equals("Referee 2 is not deleted.", deleteCount, 0);
  139. p2 = p1;
  140. ensure_equals("Referee 2 is deleted.", deleteCount, 1);
  141. p1 = NULL;
  142. ensure_equals("Referee 1 is not deleted.", deleteCount, 1);
  143. p2 = NULL;
  144. ensure_equals("Referee 1 is deleted.", deleteCount, 2);
  145. }
  146. // Test other operators.
  147. TEST_METHOD(9) {
  148. Pointer<Foo> p1;
  149. ensure("Evaluate as boolean.", !p1);
  150. ensure("Compare with NULL.", p1 == NULL);
  151. ensure("Negative compare with NULL.", !(p1 != NULL));
  152. }
  153. // Test createForObject()
  154. TEST_METHOD(10) {
  155. Bar *o = new Bar();
  156. do {
  157. Pointer<Bar> p1 = Pointer<Bar>::createForObject(o);
  158. } while (0);
  159. ensure_equals(deleteCount, 0);
  160. o->unref();
  161. ensure_equals(deleteCount, 1);
  162. }
  163. // Test assignment in combination with Object smart pointers.
  164. TEST_METHOD(11) {
  165. Object *o = new Bar();
  166. Pointer<Object> p1 = Pointer<Object>::createForObject(o);
  167. Pointer<Object> p2 = p1;
  168. // o now has reference count of 3
  169. p1 = NULL;
  170. p2 = NULL;
  171. // o now has reference count of 1
  172. ensure_equals(deleteCount, 0);
  173. Pointer<Object> p3;
  174. p3 = o;
  175. p3 = NULL;
  176. // p3 doesn't know it's assigned an Object,
  177. // so it will delete o.
  178. ensure_equals(deleteCount, 1);
  179. }
  180. }