tests.inc 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983
  1. /*
  2. Legal:
  3. Version: MPL 1.1
  4. The contents of this file are subject to the Mozilla Public License Version
  5. 1.1 the "License"; you may not use this file except in compliance with
  6. the License. You may obtain a copy of the License at
  7. http://www.mozilla.org/MPL/
  8. Software distributed under the License is distributed on an "AS IS" basis,
  9. WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  10. for the specific language governing rights and limitations under the
  11. License.
  12. The Original Code is the YSI framework.
  13. The Initial Developer of the Original Code is Alex "Y_Less" Cole.
  14. Portions created by the Initial Developer are Copyright C 2011
  15. the Initial Developer. All Rights Reserved.
  16. Contributors:
  17. Y_Less
  18. koolk
  19. JoeBullet/Google63
  20. g_aSlice/Slice
  21. Misiur
  22. samphunter
  23. tianmeta
  24. maddinat0r
  25. spacemud
  26. Crayder
  27. Dayvison
  28. Ahmad45123
  29. Zeex
  30. irinel1996
  31. Yiin-
  32. Chaprnks
  33. Konstantinos
  34. Masterchen09
  35. Southclaws
  36. PatchwerkQWER
  37. m0k1
  38. paulommu
  39. udan111
  40. Thanks:
  41. JoeBullet/Google63 - Handy arbitrary ASM jump code using SCTRL.
  42. ZeeX - Very productive conversations.
  43. koolk - IsPlayerinAreaEx code.
  44. TheAlpha - Danish translation.
  45. breadfish - German translation.
  46. Fireburn - Dutch translation.
  47. yom - French translation.
  48. 50p - Polish translation.
  49. Zamaroht - Spanish translation.
  50. Los - Portuguese translation.
  51. Dracoblue, sintax, mabako, Xtreme, other coders - Producing other modes for
  52. me to strive to better.
  53. Pixels^ - Running XScripters where the idea was born.
  54. Matite - Pestering me to release it and using it.
  55. Very special thanks to:
  56. Thiadmer - PAWN, whose limits continue to amaze me!
  57. Kye/Kalcor - SA:MP.
  58. SA:MP Team past, present and future - SA:MP.
  59. Optional plugins:
  60. Gamer_Z - GPS.
  61. Incognito - Streamer.
  62. Me - sscanf2, fixes2, Whirlpool.
  63. */
  64. static stock bool:y_inline_Get(callback:c, ret[E_CALLBACK_DATA], f[] = "")
  65. {
  66. return Callback_Get(c, ret, f);
  67. }
  68. static stock bool:y_inline_Restore(ret[E_CALLBACK_DATA])
  69. {
  70. Callback_Restore(ret);
  71. }
  72. Test:y_inline1()
  73. {
  74. new
  75. cc[E_CALLBACK_DATA];
  76. inline func()
  77. {
  78. @return 42;
  79. }
  80. //printf("%d %d %d %d %d", func[0], func[1], func[2], func[3], func[4]);
  81. y_inline_Get(using inline func, cc);
  82. ASSERT(Callback_Call(cc) == 42);
  83. Callback_Release(cc);
  84. }
  85. Test:y_inline2()
  86. {
  87. new
  88. cc[E_CALLBACK_DATA];
  89. inline func(a)
  90. {
  91. @return a;
  92. }
  93. y_inline_Get(using inline func, cc);
  94. ASSERT(Callback_Call(cc, 50) == 50);
  95. Callback_Release(cc);
  96. }
  97. Test:y_inline3()
  98. {
  99. new
  100. cc[E_CALLBACK_DATA],
  101. r = 100;
  102. inline func(&r2)
  103. {
  104. #pragma unused r2
  105. r2 = 99;
  106. }
  107. y_inline_Get(using inline func, cc);
  108. Callback_Call(cc, r);
  109. ASSERT(r == 99);
  110. Callback_Release(cc);
  111. }
  112. Test:y_inline4()
  113. {
  114. new
  115. cc[E_CALLBACK_DATA],
  116. r = 100;
  117. inline func(&r2)
  118. {
  119. #pragma unused r2
  120. r = 99;
  121. }
  122. y_inline_Get(using inline func, cc);
  123. Callback_Call(cc, r);
  124. ASSERT(r == 100);
  125. Callback_Release(cc);
  126. }
  127. Test:y_inline5()
  128. {
  129. new
  130. cc[E_CALLBACK_DATA];
  131. inline func(a, b, c, d)
  132. {
  133. ASSERT(a == 1);
  134. ASSERT(b == 11);
  135. ASSERT(c == 111);
  136. ASSERT(d == 1111);
  137. }
  138. y_inline_Get(using inline func, cc);
  139. Callback_Call(cc, 1, 11, 111, 1111);
  140. Callback_Release(cc);
  141. }
  142. Test:y_inline6()
  143. {
  144. new
  145. cc[E_CALLBACK_DATA];
  146. inline func(string:g[])
  147. {
  148. #if !(sizeof (g) == YSI_MAX_STRING))
  149. #error sizeof (g) != YSI_MAX_STRING
  150. #endif
  151. ASSERT(!strcmp(g, "hello"));
  152. }
  153. y_inline_Get(using inline func, cc);
  154. Callback_Call(cc, "hello");
  155. Callback_Release(cc);
  156. }
  157. forward y_inline7a();
  158. public y_inline7a()
  159. {
  160. inline func7a()
  161. {
  162. }
  163. }
  164. Test:y_inline7b()
  165. {
  166. new
  167. cc[E_CALLBACK_DATA];
  168. inline func7b()
  169. {
  170. }
  171. ASSERT(y_inline_Get(using func7a, cc) == false);
  172. ASSERT(y_inline_Get(using func7b, cc));
  173. Callback_Release(cc);
  174. ASSERT(y_inline_Get(using public y_inline7a, cc));
  175. Callback_Release(cc);
  176. ASSERT(y_inline_Get(callback_tag:"func7b", cc));
  177. Callback_Release(cc);
  178. ASSERT(y_inline_Get(callback_tag:"y_inline7a", cc));
  179. Callback_Release(cc);
  180. }
  181. Test:y_inline8()
  182. {
  183. for (new i = 2; i--; )
  184. {
  185. new
  186. cc[E_CALLBACK_DATA];
  187. if (i)
  188. {
  189. inline func8b()
  190. {
  191. }
  192. }
  193. if (!i)
  194. {
  195. ASSERT(y_inline_Get(using func8a, cc) == false);
  196. ASSERT(y_inline_Get(using func8b, cc));
  197. Callback_Release(cc);
  198. ASSERT(y_inline_Get(using public y_inline8, cc) == false);
  199. Callback_Release(cc);
  200. }
  201. if (i)
  202. {
  203. inline func8a()
  204. {
  205. }
  206. }
  207. }
  208. }
  209. forward y_inline9(a);
  210. public y_inline9(a)
  211. {
  212. return 12345 + a;
  213. }
  214. Test:y_inline9()
  215. {
  216. new
  217. cc[E_CALLBACK_DATA];
  218. ASSERT(y_inline_Get(using public y_inline9, cc, _F<i>));
  219. ASSERT(Callback_Call(cc, 67) == 12345 + 67);
  220. Callback_Release(cc);
  221. }
  222. forward y_inline10(a, b[]);
  223. public y_inline10(a, b[])
  224. {
  225. return 12345 + a + b[0];
  226. }
  227. Test:y_inline10()
  228. {
  229. new
  230. cc[E_CALLBACK_DATA];
  231. ASSERT(y_inline_Get(using callback y_inline10, cc, _F<is>));
  232. ASSERT(Callback_Call(cc, 67, "50") == 12345 + 67 + '5');
  233. Callback_Release(cc);
  234. }
  235. Test:y_inline11()
  236. {
  237. new
  238. g = 5,
  239. cc[E_CALLBACK_DATA];
  240. inline func()
  241. {
  242. g = 11;
  243. }
  244. y_inline_Get(using inline func, cc);
  245. ASSERT(g == 5);
  246. Callback_Call(cc);
  247. ASSERT(g == 5);
  248. y_inline_Restore(cc);
  249. ASSERT(g == 11);
  250. Callback_Release(cc);
  251. }
  252. Test:y_inline12()
  253. {
  254. new
  255. g = 5,
  256. cc[E_CALLBACK_DATA];
  257. inline func()
  258. {
  259. ++g;
  260. }
  261. y_inline_Get(using inline func, cc);
  262. Callback_Call(cc);
  263. Callback_Call(cc);
  264. Callback_Call(cc);
  265. Callback_Call(cc);
  266. y_inline_Restore(cc);
  267. ASSERT(g == 9);
  268. Callback_Release(cc);
  269. }
  270. Test:y_inline13()
  271. {
  272. new
  273. g = 5,
  274. cc[E_CALLBACK_DATA];
  275. inline const func()
  276. {
  277. ASSERT(g == 5);
  278. ++g;
  279. }
  280. y_inline_Get(using inline func, cc);
  281. Callback_Call(cc);
  282. Callback_Call(cc);
  283. Callback_Call(cc);
  284. Callback_Call(cc);
  285. y_inline_Restore(cc);
  286. ASSERT(g == 5);
  287. Callback_Release(cc);
  288. }
  289. Test:Callback_AA()
  290. {
  291. new
  292. cc[E_CALLBACK_DATA];
  293. inline func(&a)
  294. {
  295. // printf("a2 = %d", a);
  296. a = 7;
  297. // printf("a3 = %d", a);
  298. #pragma unused a
  299. }
  300. y_inline_Get(using inline func, cc);
  301. new
  302. a = 0;
  303. // printf("%x", cc[E_CALLBACK_DATA_POINTER]);
  304. // printf("a1 = %d", a);
  305. Callback_Call(cc, a);
  306. // printf("a4 = %d", a);
  307. ASSERT(a == 7);
  308. }
  309. Test:Callback_Arr1()
  310. {
  311. new
  312. cc[E_CALLBACK_DATA];
  313. inline const func(&a)
  314. {
  315. // printf("a2 = %d", a);
  316. ASSERT(a == 0);
  317. a = 7;
  318. ASSERT(a == 7);
  319. // printf("a3 = %d", a);
  320. //#pragma unused a
  321. }
  322. y_inline_Get(using inline func, cc);
  323. new
  324. a = 0;
  325. // printf("%x", cc[E_CALLBACK_DATA_POINTER]);
  326. // printf("a1 = %d", a);
  327. ASSERT(a == 0);
  328. Callback_Call(cc, a);
  329. // printf("a4 = %d", a);
  330. ASSERT(a == 7);
  331. }
  332. Test:Callback_Arr2()
  333. {
  334. new
  335. cc[E_CALLBACK_DATA];
  336. inline const func(string:str[])
  337. {
  338. ASSERT(!strcmp(str, "hello"));
  339. }
  340. y_inline_Get(using inline func, cc);
  341. new
  342. str[YSI_MAX_STRING] = "hello";
  343. Callback_Call(cc, str);
  344. ASSERT(!strcmp(str, "hello"));
  345. Callback_Call(cc, "hello");
  346. }
  347. Test:Callback_Arr3()
  348. {
  349. new
  350. cc[E_CALLBACK_DATA];
  351. inline const func(a)
  352. {
  353. ASSERT(a == 0);
  354. a = 7;
  355. ASSERT(a == 7);
  356. }
  357. y_inline_Get(using inline func, cc);
  358. new
  359. a = 0;
  360. ASSERT(a == 0);
  361. Callback_Call(cc, a);
  362. ASSERT(a == 0);
  363. }
  364. Test:Callback_Array0()
  365. {
  366. new
  367. g = 5,
  368. cc[E_CALLBACK_DATA];
  369. inline const func()
  370. {
  371. ASSERT(g == 5);
  372. ++g;
  373. }
  374. y_inline_Get(using inline func, cc);
  375. // Test zero parameter calls.
  376. Callback_Array(cc, "", 0);
  377. Callback_Array(cc, "", 0);
  378. Callback_Array(cc, "", 0);
  379. }
  380. Test:Callback_Array1()
  381. {
  382. #emit LCTRL 6
  383. #emit LCTRL 6
  384. #emit LCTRL 6
  385. #emit LCTRL 6
  386. new
  387. cc[E_CALLBACK_DATA];
  388. inline const func(&a, string:b[], c)
  389. {
  390. //printf("%d %s", c, b);
  391. ASSERT(c == 6);
  392. ASSERT(!strcmp(b, "hey"));
  393. a = 7;
  394. #pragma unused a
  395. }
  396. //DisasmDump("inline6.asm");
  397. y_inline_Get(using inline func, cc);
  398. new
  399. a = 0,
  400. str[4] = "hey",
  401. c = 6,
  402. pars[3];
  403. Callback_Call(cc, a, str, c);
  404. ASSERT(a == 7);
  405. pars[0] = ref(a);
  406. pars[1] = ref(str);
  407. pars[2] = ref(c);
  408. // Test more parameters.
  409. a = 2;
  410. Callback_Array(cc, pars, 3);
  411. ASSERT(a == 7);
  412. a = 11;
  413. Callback_Array(cc, pars, 3);
  414. ASSERT(a == 7);
  415. a = 32;
  416. Callback_Array(cc, pars, 3);
  417. ASSERT(a == 7);
  418. }
  419. Test:y_inline_Remote0()
  420. {
  421. //printf("%08x %08x", 42, 43);
  422. new
  423. Function:f0 = GetRemoteFunction("MyTesterFunc", "m"),
  424. Function:f1 = GetRemoteFunction("MyTesterFunc", "m");
  425. ASSERT(f0 == f1);
  426. //printf("%08x %08x", f0, f1);
  427. ASSERT(GetRemoteFunction("MyTesterFunc", "m") != GetRemoteFunction("MyTesterFunc", "n"));
  428. }
  429. static stock
  430. YSI_g_sRemoteTestVar;
  431. forward y_inline_Remote1(v);
  432. public y_inline_Remote1(v)
  433. {
  434. YSI_g_sRemoteTestVar = v;
  435. return v - 10;
  436. }
  437. Test:y_inline_Remote1()
  438. {
  439. new
  440. ret;
  441. ret = strcmp("hello", "hello");
  442. ASSERT(!ret);
  443. ret = strcmp("hello", !"hello");
  444. ASSERT(!ret);
  445. ret = strcmp(!"hello", "hello");
  446. ASSERT(!ret);
  447. ret = strcmp(!"hello", !"hello");
  448. ASSERT(!ret);
  449. ret = strcmp("m", "n");
  450. ASSERT(!!ret);
  451. ret = strcmp("m", !"n");
  452. ASSERT(!!ret);
  453. ret = strcmp(!"m", "n");
  454. ASSERT(!!ret);
  455. ret = strcmp(!"m", !"n");
  456. ASSERT(!!ret);
  457. // Clearly "CallRemoteFunction" works with packed strings. Good.
  458. YSI_g_sRemoteTestVar = 5;
  459. ret = CallRemoteFunction(!"y_inline_Remote1", !"i", 74);
  460. ASSERT(ret == 64);
  461. ASSERT(YSI_g_sRemoteTestVar == 74);
  462. ret = CallRemoteFunction(!"y_inline_Remote1", "i", 75);
  463. ASSERT(ret == 65);
  464. ASSERT(YSI_g_sRemoteTestVar == 75);
  465. ret = CallRemoteFunction("y_inline_Remote1", !"i", 76);
  466. ASSERT(ret == 66);
  467. ASSERT(YSI_g_sRemoteTestVar == 76);
  468. ret = CallRemoteFunction("y_inline_Remote1", "i", 77);
  469. ASSERT(ret == 67);
  470. ASSERT(YSI_g_sRemoteTestVar == 77);
  471. }
  472. Test:y_inline_Remote2()
  473. {
  474. YSI_g_sRemoteTestVar = 5;
  475. new
  476. Function:f = GetRemoteFunction("y_inline_Remote1", "i");
  477. YSI_g_sRemoteTestVar = 5;
  478. ASSERT(CallStoredFunction(f, 99) == 89);
  479. ASSERT(YSI_g_sRemoteTestVar == 99);
  480. ASSERT(CallStoredFunction(f, 111) == 101);
  481. ASSERT(YSI_g_sRemoteTestVar == 111);
  482. ASSERT(CallStoredFunction(f, 9739) == 9729);
  483. ASSERT(YSI_g_sRemoteTestVar == 9739);
  484. ASSERT(CallStoredFunction(f, 11) == 1);
  485. ASSERT(YSI_g_sRemoteTestVar == 11);
  486. ASSERT(CallStoredFunction(f, 9) == -1);
  487. ASSERT(YSI_g_sRemoteTestVar == 9);
  488. }
  489. Test:CallStoredFunction0()
  490. {
  491. ASSERT(CallStoredFunction(Function:0) == 0);
  492. }
  493. // Test inline functions inside hooks, in which the parameter counts are mangled
  494. // so can't be used to allocate memory.
  495. static
  496. YSI_g_sInlineTestVar0;
  497. hook y_inline_InHook0@0()
  498. {
  499. new
  500. cc[E_CALLBACK_DATA],
  501. r = 100;
  502. inline func(&r2)
  503. {
  504. //printf("2");
  505. #pragma unused r2
  506. YSI_g_sInlineTestVar0 += 1;
  507. r2 = 94;
  508. /*new
  509. x;
  510. #emit LOAD.S.pri 0xFFFFFFE8
  511. #emit STOR.S.pri x
  512. printf("-24 = %d", x);
  513. #emit LOAD.S.pri 0xFFFFFFEC
  514. #emit STOR.S.pri x
  515. printf("-20 = %d", x);
  516. #emit LOAD.S.pri 0xFFFFFFF0
  517. #emit STOR.S.pri x
  518. printf("-16 = %d", x);
  519. #emit LOAD.S.pri 0xFFFFFFF4
  520. #emit STOR.S.pri x
  521. printf("-12 = %d", x);
  522. #emit LOAD.S.pri 0xFFFFFFF8
  523. #emit STOR.S.pri x
  524. printf("-8 = %d", x);
  525. #emit LOAD.S.pri 0xFFFFFFFC
  526. #emit STOR.S.pri x
  527. printf("-4 = %d", x);
  528. #emit LOAD.S.pri 0
  529. #emit STOR.S.pri x
  530. printf("0 = %d", x);
  531. #emit LOAD.S.pri 4
  532. #emit STOR.S.pri x
  533. printf("4 = %d", x);
  534. #emit LOAD.S.pri 8
  535. #emit STOR.S.pri x
  536. printf("8 = %d", x);
  537. printf("3 %d %d %x", GetCurrentFrameParameterCount(), GetCurrentFrameLocalCount(), GetCurrentFrameReturn());*/
  538. }
  539. //printf("0");
  540. y_inline_Get(using inline func, cc);
  541. //printf("1");
  542. //DisasmDump("YSI_TEST_inline.asm");
  543. Callback_Call(cc, r);
  544. //printf("4");
  545. ASSERT(r == 94);
  546. Callback_Release(cc);
  547. }
  548. hook y_inline_InHook1@0(a)
  549. {
  550. new
  551. cc[E_CALLBACK_DATA],
  552. r = 100;
  553. inline func(&r2)
  554. {
  555. #pragma unused r2
  556. YSI_g_sInlineTestVar0 += a;
  557. r2 = 95;
  558. }
  559. y_inline_Get(using inline func, cc);
  560. Callback_Call(cc, r);
  561. ASSERT(r == 95);
  562. Callback_Release(cc);
  563. }
  564. hook y_inline_InHook2@0(a, b)
  565. {
  566. new
  567. cc[E_CALLBACK_DATA],
  568. r = 100;
  569. inline func(&r2)
  570. {
  571. #pragma unused r2
  572. YSI_g_sInlineTestVar0 += a * b;
  573. r2 = 96;
  574. }
  575. y_inline_Get(using inline func, cc);
  576. Callback_Call(cc, r);
  577. ASSERT(r == 96);
  578. Callback_Release(cc);
  579. }
  580. hook y_inline_InHook0@1()
  581. {
  582. new
  583. cc[E_CALLBACK_DATA],
  584. r = 100;
  585. inline func(&r2)
  586. {
  587. #pragma unused r2
  588. YSI_g_sInlineTestVar0 += 1 * 2;
  589. r2 = 98;
  590. }
  591. y_inline_Get(using inline func, cc);
  592. Callback_Call(cc, r);
  593. ASSERT(r == 98);
  594. Callback_Release(cc);
  595. }
  596. hook y_inline_InHook1@1(a)
  597. {
  598. new
  599. cc[E_CALLBACK_DATA],
  600. r = 100;
  601. inline func(&r2)
  602. {
  603. #pragma unused r2
  604. YSI_g_sInlineTestVar0 += a * 2;
  605. r2 = 97;
  606. }
  607. y_inline_Get(using inline func, cc);
  608. Callback_Call(cc, r);
  609. ASSERT(r == 97);
  610. Callback_Release(cc);
  611. }
  612. hook y_inline_InHook2@1(a, b)
  613. {
  614. new
  615. cc[E_CALLBACK_DATA],
  616. r = 100;
  617. inline func(&r2)
  618. {
  619. #pragma unused r2
  620. YSI_g_sInlineTestVar0 += a * b * 2;
  621. r2 = 90;
  622. }
  623. y_inline_Get(using inline func, cc);
  624. Callback_Call(cc, r);
  625. ASSERT(r == 90);
  626. Callback_Release(cc);
  627. }
  628. Test:y_inline_InHook0()
  629. {
  630. // DebugLevel(7);
  631. YSI_g_sInlineTestVar0 = 0;
  632. CallLocalFunction("y_inline_InHook0", "");
  633. ASSERT(YSI_g_sInlineTestVar0 == 3);
  634. // DebugLevel(0);
  635. }
  636. Test:y_inline_InHook1()
  637. {
  638. YSI_g_sInlineTestVar0 = 0;
  639. CallLocalFunction("y_inline_InHook1", "i", 4);
  640. ASSERT(YSI_g_sInlineTestVar0 == 12);
  641. YSI_g_sInlineTestVar0 = 0;
  642. CallLocalFunction("y_inline_InHook1", "i", 5);
  643. ASSERT(YSI_g_sInlineTestVar0 == 15);
  644. YSI_g_sInlineTestVar0 = 0;
  645. CallLocalFunction("y_inline_InHook1", "i", 100);
  646. ASSERT(YSI_g_sInlineTestVar0 == 300);
  647. }
  648. Test:y_inline_InHook2()
  649. {
  650. YSI_g_sInlineTestVar0 = 0;
  651. CallLocalFunction("y_inline_InHook2", "ii", 4, 5);
  652. ASSERT(YSI_g_sInlineTestVar0 == 12 * 5);
  653. YSI_g_sInlineTestVar0 = 0;
  654. CallLocalFunction("y_inline_InHook2", "ii", 5, 6);
  655. ASSERT(YSI_g_sInlineTestVar0 == 15 * 6);
  656. YSI_g_sInlineTestVar0 = 0;
  657. CallLocalFunction("y_inline_InHook2", "ii", 100, 100);
  658. ASSERT(YSI_g_sInlineTestVar0 == 300 * 100);
  659. }
  660. static stock
  661. YSI_g_sInlineTestVar2,
  662. YSI_g_sInlineTestVar3,
  663. YSI_g_sInlineTestCB[E_CALLBACK_DATA];
  664. static stock y_inline_Getter(callback:cb)
  665. {
  666. Callback_Get(cb, YSI_g_sInlineTestCB);
  667. }
  668. static stock y_inline_TestFunc_0()
  669. {
  670. inline TestCallback1()
  671. {
  672. ++YSI_g_sInlineTestVar3;
  673. }
  674. y_inline_Getter(using inline TestCallback1);
  675. }
  676. static stock y_inline_TestFunc_1()
  677. {
  678. inline TestCallback1()
  679. {
  680. ++YSI_g_sInlineTestVar3;
  681. return;
  682. }
  683. y_inline_Getter(using inline TestCallback1);
  684. }
  685. static stock y_inline_TestFunc_2()
  686. {
  687. inline TestCallback1()
  688. {
  689. ++YSI_g_sInlineTestVar3;
  690. return 1;
  691. }
  692. y_inline_Getter(using inline TestCallback1);
  693. return 0;
  694. }
  695. static stock y_inline_TestFunc_3()
  696. {
  697. inline TestCallback1()
  698. {
  699. ++YSI_g_sInlineTestVar3;
  700. return 3;
  701. }
  702. y_inline_Getter(using inline TestCallback1);
  703. return 2;
  704. }
  705. static stock y_inline_TestFunc_4(lvar)
  706. {
  707. inline TestCallback1()
  708. {
  709. YSI_g_sInlineTestVar2 = lvar;
  710. ++YSI_g_sInlineTestVar3;
  711. return 4;
  712. }
  713. y_inline_Getter(using inline TestCallback1);
  714. return 9;
  715. }
  716. static stock y_inline_TestFunc_5()
  717. {
  718. inline TestCallback1(ivar)
  719. {
  720. YSI_g_sInlineTestVar2 = ivar;
  721. ++YSI_g_sInlineTestVar3;
  722. return 5;
  723. }
  724. y_inline_Getter(using inline TestCallback1);
  725. return 8;
  726. }
  727. static stock y_inline_TestFunc_6(lvar)
  728. {
  729. inline TestCallback1(ivar)
  730. {
  731. YSI_g_sInlineTestVar2 = ivar + lvar;
  732. ++YSI_g_sInlineTestVar3;
  733. return 6;
  734. }
  735. y_inline_Getter(using inline TestCallback1);
  736. return 7;
  737. }
  738. Test:y_inline_ParameterTypes_0()
  739. {
  740. YSI_g_sInlineTestVar2 = 0;
  741. YSI_g_sInlineTestVar3 = 0;
  742. y_inline_TestFunc_0();
  743. ASSERT(Callback_Call(YSI_g_sInlineTestCB) == 0);
  744. ASSERT(YSI_g_sInlineTestVar2 == 0);
  745. ASSERT(YSI_g_sInlineTestVar3 == 1);
  746. Callback_Release(YSI_g_sInlineTestCB);
  747. }
  748. Test:y_inline_ParameterTypes_1()
  749. {
  750. YSI_g_sInlineTestVar2 = 0;
  751. YSI_g_sInlineTestVar3 = 0;
  752. y_inline_TestFunc_1();
  753. ASSERT(Callback_Call(YSI_g_sInlineTestCB) == 0);
  754. ASSERT(YSI_g_sInlineTestVar2 == 0);
  755. ASSERT(YSI_g_sInlineTestVar3 == 1);
  756. Callback_Release(YSI_g_sInlineTestCB);
  757. }
  758. Test:y_inline_ParameterTypes_2()
  759. {
  760. YSI_g_sInlineTestVar2 = 0;
  761. YSI_g_sInlineTestVar3 = 0;
  762. ASSERT(y_inline_TestFunc_2() == 0);
  763. ASSERT(Callback_Call(YSI_g_sInlineTestCB) == 1);
  764. ASSERT(YSI_g_sInlineTestVar2 == 0);
  765. ASSERT(YSI_g_sInlineTestVar3 == 1);
  766. Callback_Release(YSI_g_sInlineTestCB);
  767. }
  768. Test:y_inline_ParameterTypes_3()
  769. {
  770. YSI_g_sInlineTestVar2 = 0;
  771. YSI_g_sInlineTestVar3 = 0;
  772. ASSERT(y_inline_TestFunc_3() == 2);
  773. ASSERT(Callback_Call(YSI_g_sInlineTestCB) == 3);
  774. ASSERT(YSI_g_sInlineTestVar2 == 0);
  775. ASSERT(YSI_g_sInlineTestVar3 == 1);
  776. Callback_Release(YSI_g_sInlineTestCB);
  777. }
  778. Test:y_inline_ParameterTypes_4()
  779. {
  780. YSI_g_sInlineTestVar2 = 0;
  781. YSI_g_sInlineTestVar3 = 0;
  782. ASSERT(y_inline_TestFunc_4(11) == 9);
  783. ASSERT(Callback_Call(YSI_g_sInlineTestCB) == 4);
  784. ASSERT(YSI_g_sInlineTestVar2 == 11);
  785. ASSERT(YSI_g_sInlineTestVar3 == 1);
  786. Callback_Release(YSI_g_sInlineTestCB);
  787. }
  788. Test:y_inline_ParameterTypes_5()
  789. {
  790. YSI_g_sInlineTestVar2 = 0;
  791. YSI_g_sInlineTestVar3 = 0;
  792. ASSERT(y_inline_TestFunc_5() == 8);
  793. ASSERT(Callback_Call(YSI_g_sInlineTestCB, 22) == 5);
  794. ASSERT(YSI_g_sInlineTestVar2 == 22);
  795. ASSERT(YSI_g_sInlineTestVar3 == 1);
  796. Callback_Release(YSI_g_sInlineTestCB);
  797. }
  798. Test:y_inline_ParameterTypes_6()
  799. {
  800. YSI_g_sInlineTestVar2 = 0;
  801. YSI_g_sInlineTestVar3 = 0;
  802. ASSERT(y_inline_TestFunc_6(33) == 7);
  803. ASSERT(Callback_Call(YSI_g_sInlineTestCB, 44) == 6);
  804. ASSERT(YSI_g_sInlineTestVar2 == 33 + 44);
  805. ASSERT(YSI_g_sInlineTestVar3 == 1);
  806. Callback_Release(YSI_g_sInlineTestCB);
  807. }
  808. static stock y_inline_TestFunc_7(lvar)
  809. {
  810. new
  811. cvar = 101;
  812. inline TestCallback1(ivar)
  813. {
  814. YSI_g_sInlineTestVar2 = cvar + ivar + lvar;
  815. ++YSI_g_sInlineTestVar3;
  816. return ivar;
  817. }
  818. y_inline_Getter(using inline TestCallback1);
  819. return lvar;
  820. }
  821. static stock y_inline_TestFunc_8(string:svar0[])
  822. {
  823. new
  824. svar0b[20];
  825. strcpy(svar0b, svar0);
  826. inline TestCallback1()
  827. {
  828. YSI_g_sInlineTestVar2 = strval(svar0b);
  829. ++YSI_g_sInlineTestVar3;
  830. return strval(svar0b[12]);
  831. }
  832. y_inline_Getter(using inline TestCallback1);
  833. return strval(svar0b[6]);
  834. }
  835. static stock y_inline_TestFunc_9()
  836. {
  837. inline TestCallback1(string:svar1[])
  838. {
  839. YSI_g_sInlineTestVar2 = strval(svar1);
  840. ++YSI_g_sInlineTestVar3;
  841. return strval(svar1[6]);
  842. }
  843. y_inline_Getter(using inline TestCallback1);
  844. return 99;
  845. }
  846. static stock y_inline_TestFunc_10(string:svar0[])
  847. {
  848. new
  849. svar0b[20];
  850. strcpy(svar0b, svar0);
  851. inline TestCallback1(string:svar1[])
  852. {
  853. YSI_g_sInlineTestVar2 = strval(svar0b) * strval(svar1);
  854. ++YSI_g_sInlineTestVar3;
  855. return strval(svar1[6]);
  856. }
  857. y_inline_Getter(using inline TestCallback1);
  858. return strval(svar0b[6]);
  859. }
  860. Test:y_inline_ParameterTypes_7()
  861. {
  862. YSI_g_sInlineTestVar2 = 0;
  863. YSI_g_sInlineTestVar3 = 0;
  864. ASSERT(y_inline_TestFunc_7(202) == 202);
  865. ASSERT(Callback_Call(YSI_g_sInlineTestCB, 303) == 303);
  866. ASSERT(YSI_g_sInlineTestVar2 == 101 + 202 + 303);
  867. ASSERT(YSI_g_sInlineTestVar3 == 1);
  868. Callback_Release(YSI_g_sInlineTestCB);
  869. }
  870. Test:y_inline_ParameterTypes_8()
  871. {
  872. YSI_g_sInlineTestVar2 = 0;
  873. YSI_g_sInlineTestVar3 = 0;
  874. ASSERT(y_inline_TestFunc_8("123 456 999") == 456);
  875. ASSERT(Callback_Call(YSI_g_sInlineTestCB) == 999);
  876. ASSERT(YSI_g_sInlineTestVar2 == 123);
  877. ASSERT(YSI_g_sInlineTestVar3 == 1);
  878. Callback_Release(YSI_g_sInlineTestCB);
  879. }
  880. Test:y_inline_ParameterTypes_9()
  881. {
  882. YSI_g_sInlineTestVar2 = 0;
  883. YSI_g_sInlineTestVar3 = 0;
  884. ASSERT(y_inline_TestFunc_9() == 99);
  885. ASSERT(Callback_Call(YSI_g_sInlineTestCB, "4242 2424") == 2424);
  886. ASSERT(YSI_g_sInlineTestVar2 == 4242);
  887. ASSERT(YSI_g_sInlineTestVar3 == 1);
  888. Callback_Release(YSI_g_sInlineTestCB);
  889. }
  890. Test:y_inline_ParameterTypes_10()
  891. {
  892. YSI_g_sInlineTestVar2 = 0;
  893. YSI_g_sInlineTestVar3 = 0;
  894. ASSERT(y_inline_TestFunc_10("9999 1111") == 1111);
  895. ASSERT(Callback_Call(YSI_g_sInlineTestCB, "6543 2109") == 2109);
  896. ASSERT(YSI_g_sInlineTestVar2 == 9999 * 6543);
  897. ASSERT(YSI_g_sInlineTestVar3 == 1);
  898. Callback_Release(YSI_g_sInlineTestCB);
  899. }