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

外挂编程

开发平台:

Windows_Unix

  1. # A unit test for CallbackList.
  2. package CallbackListTest;
  3. use strict;
  4. use Test::More;
  5. use Utils::CallbackList;
  6. {
  7. # A class that does nothing. Only used to test
  8. # CallbackList.
  9. package CallbackListTest::Object;
  10. sub new {
  11. return bless {}, $_[0];
  12. }
  13. }
  14. my $self = new CallbackListTest::Object;
  15. my $list;
  16. sub start {
  17. print "### Starting CallbackListTestn";
  18. testAddAndCall();
  19. testParams();
  20. testRemove();
  21. testDeepCopy();
  22. testClassSupport();
  23. }
  24. sub init {
  25. $list = new CallbackList();
  26. is($list->size(), 0);
  27. ok($list->empty());
  28. }
  29. # Test whether add() and call() correctly work together
  30. sub testAddAndCall {
  31. my $sub;
  32. my $sub1CallCount = 0;
  33. my $sub2CallCount = 0;
  34. init();
  35. $sub = sub {
  36. $sub1CallCount++;
  37. };
  38. $list->add(undef, $sub);
  39. $list->checkValidity();
  40. is($list->size(), 1);
  41. ok(!$list->empty());
  42. $list->call($self);
  43. $list->checkValidity();
  44. is($sub1CallCount, 1);
  45. $list->call($self);
  46. $list->checkValidity();
  47. is($sub1CallCount, 2);
  48. $sub = sub {
  49. $sub2CallCount++;
  50. };
  51. $list->add(undef, $sub);
  52. is($list->size(), 2);
  53. ok(!$list->empty());
  54. $list->checkValidity();
  55. $list->call($self);
  56. $list->checkValidity();
  57. is($sub1CallCount, 3);
  58. is($sub2CallCount, 1);
  59. $list->call($self);
  60. $list->checkValidity();
  61. is($sub1CallCount, 4);
  62. is($sub2CallCount, 2);
  63. is($list->size(), 2);
  64. ok(!$list->empty());
  65. }
  66. # Test whether parameters given to add() and call() are correctly
  67. # passed to the callback function.
  68. sub testParams {
  69. my $sub;
  70. my $count = 0;
  71. my ($object, $source, $arg, $userData);
  72. init();
  73. $sub = sub {
  74. ($object, $source, $arg, $userData) = @_;
  75. $count++;
  76. };
  77. $list->add($self, $sub);
  78. $list->checkValidity();
  79. $list->call($self, 123);
  80. $list->checkValidity();
  81. is($count, 1);
  82. is($object, $self);
  83. is($source, $self);
  84. is($arg, 123);
  85. ok(!defined($userData));
  86. # We don't remove the last added callback because
  87. # this one is supposed to be called after the last one.
  88. $list->add($self, $sub, "my user data");
  89. $list->checkValidity();
  90. $list->call(undef, "abc");
  91. $list->checkValidity();
  92. is($count, 3);
  93. is($object, $self);
  94. ok(!defined $source);
  95. is($arg, "abc");
  96. is($userData, "my user data");
  97. $list->add(undef, $sub, 456);
  98. $list->checkValidity();
  99. $list->call($self);
  100. $list->checkValidity();
  101. is($count, 6);
  102. ok(!defined $object);
  103. ok($source == $self);
  104. ok(!defined($arg));
  105. is($userData, 456);
  106. }
  107. # Test remove()
  108. sub testRemove {
  109. my ($sub, $ID1, $ID2, $ID3, $ID4, $ID5);
  110. my $count = 0;
  111. init();
  112. $sub = sub {
  113. $count++;
  114. };
  115. $ID1 = $list->add(undef, $sub);
  116. $ID2 = $list->add(undef, $sub);
  117. is($list->size(), 2);
  118. ok(!$list->empty());
  119. $list->call($self);
  120. is($count, 2);
  121. $list->remove($ID1);
  122. is($list->size(), 1);
  123. ok(!$list->empty());
  124. $list->checkValidity();
  125. $list->call(undef, $self);
  126. is($count, 3);
  127. ok(!defined $$ID1);
  128. $list->remove($ID1);
  129. is($list->size(), 1);
  130. ok(!$list->empty());
  131. $list->checkValidity();
  132. ok(!defined $$ID1);
  133. $list->call(undef, $self);
  134. $list->checkValidity();
  135. is($count, 4);
  136. $list->remove($ID2);
  137. is($list->size(), 0);
  138. ok($list->empty());
  139. $list->checkValidity();
  140. $list->call(undef, $self);
  141. is($count, 4);
  142. $count = 0;
  143. $ID1 = $list->add(undef, $sub);
  144. $ID2 = $list->add(undef, $sub);
  145. $ID3 = $list->add(undef, $sub);
  146. $ID4 = $list->add(undef, $sub);
  147. $ID5 = $list->add(undef, $sub);
  148. is($list->size(), 5);
  149. ok(!$list->empty());
  150. $list->checkValidity();
  151. $list->call(undef, $self);
  152. is($count, 5);
  153. $list->remove($ID3);
  154. is($list->size(), 4);
  155. ok(!$list->empty());
  156. $list->checkValidity();
  157. is($$ID1, 0);
  158. is($$ID2, 1);
  159. ok(!defined $$ID3);
  160. is($$ID4, 2);
  161. is($$ID5, 3);
  162. $list->call(undef, $self);
  163. is($count, 9);
  164. $list->checkValidity();
  165. }
  166. sub testDeepCopy {
  167. init();
  168. my $called;
  169. my $ID = $list->add(undef, sub {});
  170. $list->add($self, sub { $called = 1; });
  171. my $ID2 = $list->add($self, sub {});
  172. $list->remove($ID);
  173. $list->remove($ID2);
  174. my $list2 = $list->deepCopy();
  175. $list->checkValidity();
  176. $list2->checkValidity();
  177. $list->call($self);
  178. ok($called);
  179. $called = 0;
  180. $list2->call($self);
  181. ok($called);
  182. }
  183. # Class method callbacks are supposed to be automatically removed when the
  184. # object is destroyed.
  185. sub testClassSupport {
  186. init();
  187. my ($called, $called2);
  188. my $source = new CallbackListTest::Object();
  189. my $this = new CallbackListTest::Object();
  190. $list->add($this, sub { $called = 1 });
  191. $list->add(undef, sub { $called2 = 1 });
  192. $list->add($this, sub { $called = 1 });
  193. undef $this;
  194. # Call should detect that $this is destroyed.
  195. $list->call($source);
  196. ok(!$called);
  197. ok($called2);
  198. ok(!$list->empty());
  199. is($list->size(), 1);
  200. $list->checkValidity();
  201. }
  202. 1;