tests.inc 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. static
  2. YSI_g_sValue;
  3. forward Ony_hooksTest2(cmd[]);
  4. hook Ony_hooksTest2@000(cmd[])
  5. {
  6. ++YSI_g_sValue;
  7. return 1;
  8. }
  9. hook Ony_hooksTest2@001(cmd[])
  10. {
  11. // Called second due to forced orderings.
  12. ++YSI_g_sValue;
  13. return 1;
  14. }
  15. public Ony_hooksTest2(cmd[])
  16. {
  17. // Called second due to forced orderings.
  18. //if (YSI_g_sValue) return YSI_g_sValue - 7;
  19. return 1;
  20. }
  21. Test:y_hooks_Ony_hooksTest2()
  22. {
  23. // Check both hooks are called.
  24. YSI_g_sValue = 0;
  25. ASSERT(CallLocalFunction("Ony_hooksTest2", "s", "IGNORE_ME") != 0);
  26. ASSERT(YSI_g_sValue == 2);
  27. YSI_g_sValue = 0;
  28. }
  29. forward Ony_hooksTest3(cmd[]);
  30. hook Ony_hooksTest3@000(cmd[])
  31. {
  32. ++YSI_g_sValue;
  33. //printf("a");
  34. return 1;
  35. }
  36. hook Ony_hooksTest3@001(cmd[])
  37. {
  38. // Called second due to forced orderings.
  39. ++YSI_g_sValue;
  40. //printf("b");
  41. return 1;
  42. }
  43. Test:y_hooks_Ony_hooksTest3()
  44. {
  45. // Check both hooks are called.
  46. YSI_g_sValue = 0;
  47. ASSERT(CallLocalFunction("Ony_hooksTest3", "s", "IGNORE_ME") != 0);
  48. ASSERT(YSI_g_sValue == 2);
  49. YSI_g_sValue = 0;
  50. }
  51. forward Ony_hooksTest1(cmd[]);
  52. hook Ony_hooksTest1@000(cmd[])
  53. {
  54. ++YSI_g_sValue;
  55. return 1;
  56. }
  57. hook Ony_hooksTest1@001(cmd[])
  58. {
  59. // Called second due to forced orderings.
  60. ++YSI_g_sValue;
  61. return 0;
  62. }
  63. Test:y_hooks_Ony_hooksTest1()
  64. {
  65. // Check both hooks are called.
  66. YSI_g_sValue = 0;
  67. ASSERT(CallLocalFunction("Ony_hooksTest1", "s", "IGNORE_ME") == 0);
  68. ASSERT(YSI_g_sValue == 2);
  69. YSI_g_sValue = 0;
  70. }
  71. forward Ony_hooksTest4(cmd[]);
  72. hook Ony_hooksTest4@000(cmd[])
  73. {
  74. ++YSI_g_sValue;
  75. return -1;
  76. }
  77. hook Ony_hooksTest4@001(cmd[])
  78. {
  79. // Called second due to forced orderings.
  80. ++YSI_g_sValue;
  81. return 0;
  82. }
  83. Test:y_hooks_Ony_hooksTest4()
  84. {
  85. // Check only one hook is called.
  86. YSI_g_sValue = 0;
  87. ASSERT(CallLocalFunction("Ony_hooksTest4", "s", "IGNORE_ME") == 0);
  88. ASSERT(YSI_g_sValue == 1);
  89. YSI_g_sValue = 0;
  90. }
  91. forward Ony_hooksTest5(cmd[]);
  92. hook Ony_hooksTest5@000(cmd[])
  93. {
  94. ++YSI_g_sValue;
  95. return -2;
  96. }
  97. hook Ony_hooksTest5@001(cmd[])
  98. {
  99. // Called second due to forced orderings.
  100. ++YSI_g_sValue;
  101. return 0;
  102. }
  103. Test:y_hooks_Ony_hooksTest5()
  104. {
  105. // Check only one hook is called.
  106. YSI_g_sValue = 0;
  107. ASSERT(CallLocalFunction("Ony_hooksTest5", "s", "IGNORE_ME") == 1);
  108. ASSERT(YSI_g_sValue == 1);
  109. YSI_g_sValue = 0;
  110. }
  111. static stock y_hooks_funcidx2(str[])
  112. {
  113. new
  114. func[32],
  115. buf,
  116. idx;
  117. while ((idx = AMX_GetPublicName(idx, func, str)))
  118. {
  119. if (!strcmp(func, str))
  120. {
  121. AMX_GetPublicEntry(idx - 1, buf);
  122. return buf;
  123. }
  124. }
  125. return -1;
  126. }
  127. forward y_hooks_Invalidate1();
  128. public y_hooks_Invalidate1() {}
  129. Test:y_hooks_Invalidate1()
  130. {
  131. ASSERT(funcidx("y_hooks_Invalidate1") != -1);
  132. Hooks_InvalidateName(y_hooks_funcidx2("y_hooks_Invalidate1"));
  133. Hooks_SortPublics();
  134. ASSERT(funcidx("y_hooks_Invalidate1") == -1);
  135. }
  136. forward y_hooks_Invalidate2();
  137. public y_hooks_Invalidate2() {}
  138. forward y_hooks_Invalidate3();
  139. public y_hooks_Invalidate3() {}
  140. Test:y_hooks_Invalidate23()
  141. {
  142. new
  143. base0,
  144. count0;
  145. AMX_GetBaseCount(AMX_TABLE_PUBLICS, base0, count0);
  146. ASSERT(funcidx("y_hooks_Invalidate2") != -1);
  147. ASSERT(funcidx("y_hooks_Invalidate3") != -1);
  148. Hooks_InvalidateName(y_hooks_funcidx2("y_hooks_Invalidate2"));
  149. Hooks_InvalidateName(y_hooks_funcidx2("y_hooks_Invalidate3"));
  150. Hooks_SortPublics();
  151. ASSERT(funcidx("y_hooks_Invalidate2") == -1);
  152. ASSERT(funcidx("y_hooks_Invalidate3") == -1);
  153. new
  154. base1,
  155. count1;
  156. AMX_GetBaseCount(AMX_TABLE_PUBLICS, base1, count1);
  157. ASSERT(base1 > base0);
  158. ASSERT(count1 < count0);
  159. }
  160. Test:y_hooks_IsolateName1()
  161. {
  162. new
  163. name[32];
  164. name = "@yH_Hello@Other";
  165. Hooks_IsolateName(name);
  166. ASSERT_FALSE(strcmp(name, "Hello"));
  167. name = "@yH_Hi@@Other";
  168. Hooks_IsolateName(name);
  169. ASSERT_FALSE(strcmp(name, "Hi"));
  170. name = "@yH_No@Other@More";
  171. Hooks_IsolateName(name);
  172. ASSERT_FALSE(strcmp(name, "No"));
  173. name = "@yH_Yes_Other@N";
  174. Hooks_IsolateName(name);
  175. ASSERT_FALSE(strcmp(name, "Yes_Other"));
  176. }
  177. Test:y_hooks_IsolateName2()
  178. {
  179. new
  180. func[32];
  181. #define FUNC:%0; func = "_yH@"#%0"@";Hooks_IsolateName(func);ASSERT(!strcmp(#%0, func));
  182. FUNC:A;
  183. FUNC:AAA;
  184. FUNC:AAB;
  185. FUNC:ABA;
  186. FUNC:ABB;
  187. FUNC:aB;
  188. FUNC:ab;
  189. FUNC:Ab;
  190. #undef FUNC
  191. }
  192. static g_y_hooksVar;
  193. Test:y_hooks_Customs()
  194. {
  195. g_y_hooksVar = 0;
  196. CallLocalFunction("MyFunc1", "ii", 4, 5);
  197. ASSERT(g_y_hooksVar == (4 + 5) * 6);
  198. }
  199. forward MyFunc1(a, b);
  200. public MyFunc1(a, b)
  201. {
  202. //printf("Part 1 %d %d", a, b);
  203. g_y_hooksVar += a + b;
  204. }
  205. #tryinclude "..\YSI_Internal\y_unique"
  206. #tryinclude "..\..\YSI_Internal\y_unique"
  207. hook MyFunc1(a, b)
  208. {
  209. //printf("Part 2 %d", a);
  210. g_y_hooksVar += a + b;
  211. }
  212. #tryinclude "..\YSI_Internal\y_unique"
  213. #tryinclude "..\..\YSI_Internal\y_unique"
  214. hook MyFunc1(a, b)
  215. {
  216. //printf("Part 3 %d", b);
  217. g_y_hooksVar += a + b;
  218. }
  219. #tryinclude "..\YSI_Internal\y_unique"
  220. #tryinclude "..\..\YSI_Internal\y_unique"
  221. hook MyFunc1(a, b)
  222. {
  223. //printf("Part 3 %d", b);
  224. g_y_hooksVar += a + b;
  225. }
  226. #tryinclude "..\YSI_Internal\y_unique"
  227. #tryinclude "..\..\YSI_Internal\y_unique"
  228. hook MyFunc1(a, b)
  229. {
  230. //printf("Part 3 %d", b);
  231. g_y_hooksVar += a + b;
  232. }
  233. #tryinclude "..\YSI_Internal\y_unique"
  234. #tryinclude "..\..\YSI_Internal\y_unique"
  235. hook MyFunc1(a, b)
  236. {
  237. //printf("Part 3 %d", b);
  238. g_y_hooksVar += a + b;
  239. }
  240. forward OnPlayerEnterDynamicArea(p, a);
  241. public OnPlayerEnterDynamicArea(p, a) { g_y_hooksVar += 100; }
  242. hook OnPlayerEnterDynArea(p, a) { g_y_hooksVar += 10; }
  243. Test:y_hooks_SpecialCases()
  244. {
  245. g_y_hooksVar = 0;
  246. CallLocalFunction("OnPlayerEnterDynamicArea", "ii", 0, 0);
  247. ASSERT(g_y_hooksVar == 110);
  248. }
  249. Test:Hooks_MakeLongName0()
  250. {
  251. new
  252. name[64];
  253. name = "OnUpd";
  254. ASSERT(Hooks_MakeLongName(name) == 8);
  255. ASSERT(!strcmp(name, "OnUpdate"));
  256. name = "OnUpdD";
  257. ASSERT(Hooks_MakeLongName(name) == 9);
  258. ASSERT(!strcmp(name, "OnUpdateD"));
  259. name = "OnUpda";
  260. ASSERT(Hooks_MakeLongName(name) == 6);
  261. ASSERT(!strcmp(name, "OnUpda"));
  262. }
  263. Test:Hooks_MakeLongName1()
  264. {
  265. new
  266. name[64];
  267. name = "CP";
  268. ASSERT(Hooks_MakeLongName(name) == 10);
  269. ASSERT(!strcmp(name, "Checkpoint"));
  270. name = "TD";
  271. ASSERT(Hooks_MakeLongName(name) == 8);
  272. ASSERT(!strcmp(name, "TextDraw"));
  273. name = "Upd";
  274. ASSERT(Hooks_MakeLongName(name) == 6);
  275. ASSERT(!strcmp(name, "Update"));
  276. name = "Dyn";
  277. ASSERT(Hooks_MakeLongName(name) == 7);
  278. ASSERT(!strcmp(name, "Dynamic"));
  279. name = "Obj";
  280. ASSERT(Hooks_MakeLongName(name) == 6);
  281. ASSERT(!strcmp(name, "Object"));
  282. name = "Cmd";
  283. ASSERT(Hooks_MakeLongName(name) == 7);
  284. ASSERT(!strcmp(name, "Command"));
  285. name = "DynamicCP";
  286. ASSERT(Hooks_MakeLongName(name) == 9);
  287. ASSERT(!strcmp(name, "DynamicCP"));
  288. }
  289. Test:Hooks_MakeLongName2()
  290. {
  291. new
  292. name[64];
  293. name = "OnUpdTDCP";
  294. ASSERT(Hooks_MakeLongName(name) == 26);
  295. ASSERT(!strcmp(name, "OnUpdateTextDrawCheckpoint"));
  296. name = "OnUpdTDObjCmd";
  297. ASSERT(Hooks_MakeLongName(name) == 29);
  298. ASSERT(!strcmp(name, "OnUpdateTextDrawObjectCommand"));
  299. name = "OnUpdTDCPObjCmd";
  300. ASSERT(Hooks_MakeLongName(name) == 31);
  301. ASSERT(!strcmp(name, "OnUpdateTextDrawCPObjectCommand"));
  302. }
  303. Test:Hooks_MakeShortName1()
  304. {
  305. new
  306. name[64];
  307. name = "OnPlayerEnterRaceCP";
  308. ASSERT(Hooks_MakeShortName(name) == 19);
  309. ASSERT(!strcmp(name, "OnPlayerEnterRaceCP"));
  310. name = "OnPlayerEnterRaceCheckpoint";
  311. ASSERT(Hooks_MakeShortName(name) == 27);
  312. ASSERT(!strcmp(name, "OnPlayerEnterRaceCheckpoint"));
  313. name = "OnPlayerEnterDynamicCP";
  314. ASSERT(Hooks_MakeShortName(name) == 22);
  315. ASSERT(!strcmp(name, "OnPlayerEnterDynamicCP"));
  316. name = "OnPlayerEnterDynamicRaceCheckpoint";
  317. ASSERT(Hooks_MakeShortName(name) == 26);
  318. ASSERT(!strcmp(name, "OnPlayerEnterDynamicRaceCP"));
  319. name = "AAAAAAAAAAAAAAAAAAAUpdateTextDraw";
  320. Hooks_MakeShortName(name);
  321. ASSERT(!strcmp(name, "AAAAAAAAAAAAAAAAAAAUpdateTD"));
  322. name = "BBBBBAAAAAAAAAAAAAAAAAAAUpdateTextDraw";
  323. Hooks_MakeShortName(name);
  324. ASSERT(!strcmp(name, "BBBBBAAAAAAAAAAAAAAAAAAAUpdTD"));
  325. }
  326. Test:Hooks_MakeShortName2()
  327. {
  328. new
  329. name[64];
  330. name = "AAAAAAAAAAAAAABBBBBBBBBBBBBBBBCCCCCCCCCCCCC";
  331. ASSERT(Hooks_MakeShortName(name) == 43);
  332. ASSERT(!strcmp(name, "AAAAAAAAAAAAAABBBBBBBBBBBBBBBBCCCCCCCCCCCCC"));
  333. name = "AAAAAAAAAAAAAABBBBBBBBBBBBBBBBCCCCCCCCCommandCCCC";
  334. ASSERT(Hooks_MakeShortName(name) == 45);
  335. ASSERT(!strcmp(name, "AAAAAAAAAAAAAABBBBBBBBBBBBBBBBCCCCCCCCCmdCCCC"));
  336. }
  337. Test:Hooks_GetDefaultReturn()
  338. {
  339. ASSERT(Hooks_GetDefaultReturn("OnHookRet\0\0\0\0\0\0\0\0") == 1);
  340. ASSERT(Hooks_GetDefaultReturn("OnPlayerCommandText\0\0\0\0\0\0\0\0") == 0);
  341. ASSERT(Hooks_GetDefaultReturn("OnHookRet2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") == 0);
  342. ASSERT(Hooks_GetDefaultReturn("OnPlayerConnect\0\0\0\0\0\0\0\0") == 1);
  343. }
  344. HOOK_RET:OnHookRet2() return 0;
  345. DEFINE_HOOK_REPLACEMENT(Replacement, Rpl);
  346. forward OnPlayerCustomReplacement();
  347. public OnPlayerCustomReplacement() { g_y_hooksVar += 500; }
  348. hook OnPlayerCustomRpl() { g_y_hooksVar += 55; }
  349. Test:y_hooks_CustomReplacement()
  350. {
  351. g_y_hooksVar = 0;
  352. CallLocalFunction("OnPlayerCustomReplacement", "");
  353. ASSERT(g_y_hooksVar == 555);
  354. }