tests.inc 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. new
  2. g_sRaceID;
  3. Test:y_races_Create()
  4. {
  5. g_sRaceID = Race_Create();
  6. ASSERT(g_sRaceID == 0);
  7. Race_Destroy(g_sRaceID);
  8. }
  9. Test:y_races_Destroy()
  10. {
  11. g_sRaceID = Race_Create();
  12. ASSERT(g_sRaceID == 0);
  13. Race_Destroy(g_sRaceID);
  14. g_sRaceID = Race_Create();
  15. ASSERT(g_sRaceID == 0);
  16. Race_Destroy(g_sRaceID);
  17. }
  18. Test:y_races_ArrayAdd0()
  19. {
  20. for (new i = 0; i != 10; ++i)
  21. {
  22. YSI_g_sRaceCheckpoints[i][0] = i + 1;
  23. YSI_g_sRaceCheckpoints[i][1] = i + 1;
  24. YSI_g_sRaceCheckpoints[i][2] = i + 1;
  25. }
  26. YSI_g_sCPIndex = 10;
  27. RaceArray_Add(10, 11.0, 11.0, 11.0);
  28. for (new i = 0; i != 11; ++i)
  29. {
  30. ASSERT(YSI_g_sRaceCheckpoints[i][0] == i + 1);
  31. ASSERT(YSI_g_sRaceCheckpoints[i][1] == i + 1);
  32. ASSERT(YSI_g_sRaceCheckpoints[i][2] == i + 1);
  33. }
  34. YSI_g_sCPIndex = 0;
  35. }
  36. Test:y_races_ArrayAdd1()
  37. {
  38. for (new i = 0; i != 10; ++i)
  39. {
  40. YSI_g_sRaceCheckpoints[i][0] = i + 1;
  41. YSI_g_sRaceCheckpoints[i][1] = i + 1;
  42. YSI_g_sRaceCheckpoints[i][2] = i + 1;
  43. }
  44. YSI_g_sCPIndex = 10;
  45. RaceArray_Add(6, 22.0, 22.0, 22.0);
  46. for (new i = 0; i != 6; ++i)
  47. {
  48. ASSERT(YSI_g_sRaceCheckpoints[i][0] == i + 1);
  49. ASSERT(YSI_g_sRaceCheckpoints[i][1] == i + 1);
  50. ASSERT(YSI_g_sRaceCheckpoints[i][2] == i + 1);
  51. }
  52. ASSERT(YSI_g_sRaceCheckpoints[6][0] == 22.0);
  53. ASSERT(YSI_g_sRaceCheckpoints[6][1] == 22.0);
  54. ASSERT(YSI_g_sRaceCheckpoints[6][2] == 22.0);
  55. for (new i = 7; i != 11; ++i)
  56. {
  57. ASSERT(YSI_g_sRaceCheckpoints[i][0] == i);
  58. ASSERT(YSI_g_sRaceCheckpoints[i][1] == i);
  59. ASSERT(YSI_g_sRaceCheckpoints[i][2] == i);
  60. }
  61. YSI_g_sCPIndex = 0;
  62. }
  63. Test:y_races_ArrayShift()
  64. {
  65. new
  66. to = 10;
  67. for (new i = 0; i != 10; ++i)
  68. {
  69. YSI_g_sRaceCheckpoints[i][0] = i + 1;
  70. YSI_g_sRaceCheckpoints[i][1] = i + 1;
  71. YSI_g_sRaceCheckpoints[i][2] = i + 1;
  72. }
  73. RaceArray_Shift(5, to, 6);
  74. YSI_g_sRaceCheckpoints[5][0] = 66.5;
  75. YSI_g_sRaceCheckpoints[5][1] = 66.5;
  76. YSI_g_sRaceCheckpoints[5][2] = 66.5;
  77. ASSERT(to == 11);
  78. for (new i = 0; i != 5; ++i)
  79. {
  80. ASSERT(YSI_g_sRaceCheckpoints[i][0] == i + 1);
  81. ASSERT(YSI_g_sRaceCheckpoints[i][1] == i + 1);
  82. ASSERT(YSI_g_sRaceCheckpoints[i][2] == i + 1);
  83. }
  84. ASSERT(YSI_g_sRaceCheckpoints[5][0] == 66.5);
  85. ASSERT(YSI_g_sRaceCheckpoints[5][1] == 66.5);
  86. ASSERT(YSI_g_sRaceCheckpoints[5][2] == 66.5);
  87. for (new i = 6; i != 11; ++i)
  88. {
  89. ASSERT(YSI_g_sRaceCheckpoints[i][0] == i);
  90. ASSERT(YSI_g_sRaceCheckpoints[i][1] == i);
  91. ASSERT(YSI_g_sRaceCheckpoints[i][2] == i);
  92. //printf("%.2f %.2f %.2f", YSI_g_sRaceCheckpoints[0][i][0], YSI_g_sRaceCheckpoints[0][i][1], YSI_g_sRaceCheckpoints[0][i][2]);
  93. }
  94. }
  95. static
  96. gracePos[MAX_PLAYERS][E_RACE_POS],
  97. YSI_g_sPlayerRace2[MAX_PLAYERS][E_RACE_PLAYER],
  98. Iterator:YSI_g_sRacePeople2<MAX_PLAYERS>;
  99. static y_races_Position0(lap, cp, Float:togo, playerid)
  100. {
  101. new
  102. pos = 1,
  103. opl,
  104. opc;
  105. for (new i = Iter_Begin(YSI_g_sRacePeople2); (i = Iter_Next(YSI_g_sRacePeople2, i)) != playerid; )
  106. {
  107. opl = YSI_g_sPlayerRace2[i][E_RACE_PLAYER_LAP];
  108. opc = gracePos[i][E_RACE_POS_CP];
  109. // This checks "checkpoint + start", but both players have that
  110. // offset so it is fine.
  111. if (opl > lap ||
  112. (opl == lap &&
  113. (opc > cp ||
  114. (opc == cp && gracePos[i][E_RACE_POS_TOGO] < togo)))) ++pos;
  115. else ++YSI_g_sPlayerRace2[i][E_RACE_PLAYER_POSITION];
  116. }
  117. return pos;
  118. }
  119. static y_races_Position1(lap, cp, Float:togo, playerid)
  120. {
  121. new
  122. pos = 1;
  123. for (new i = Iter_Begin(YSI_g_sRacePeople2); (i = Iter_Next(YSI_g_sRacePeople2, i)) != playerid; )
  124. {
  125. if (YSI_g_sPlayerRace2[i][E_RACE_PLAYER_LAP] > lap ||
  126. (YSI_g_sPlayerRace2[i][E_RACE_PLAYER_LAP] == lap &&
  127. (gracePos[i][E_RACE_POS_CP] > cp ||
  128. (gracePos[i][E_RACE_POS_CP] == cp && gracePos[i][E_RACE_POS_TOGO] < togo)))) ++pos;
  129. else ++YSI_g_sPlayerRace2[i][E_RACE_PLAYER_POSITION];
  130. }
  131. return pos;
  132. }
  133. static y_races_Position2(lap, cp, Float:togo, playerid)
  134. {
  135. new
  136. pos = 1;
  137. for (new i = Iter_Begin(YSI_g_sRacePeople2); (i = Iter_Next(YSI_g_sRacePeople2, i)) != playerid; )
  138. {
  139. switch (floatcmp(YSI_g_sPlayerRace2[i][E_RACE_PLAYER_LAP], lap))
  140. {
  141. case -1: ++YSI_g_sPlayerRace2[i][E_RACE_PLAYER_POSITION];
  142. case 1: ++pos; // This player better.
  143. default:
  144. {
  145. switch (floatcmp(gracePos[i][E_RACE_POS_CP], cp))
  146. {
  147. case -1: ++YSI_g_sPlayerRace2[i][E_RACE_PLAYER_POSITION];
  148. case 1: ++pos;
  149. default:
  150. {
  151. // Backwards as bigger is now worse.
  152. switch (floatcmp(togo, gracePos[i][E_RACE_POS_TOGO]))
  153. {
  154. case -1: ++YSI_g_sPlayerRace2[i][E_RACE_PLAYER_POSITION];
  155. case 1: ++pos;
  156. // Default do nothing (leave them in the same position).
  157. }
  158. }
  159. }
  160. }
  161. }
  162. }
  163. return pos;
  164. }
  165. static y_races_Position3(lap, cp, Float:togo, playerid)
  166. {
  167. new
  168. pos = 1;
  169. for (new i = Iter_Begin(YSI_g_sRacePeople2); (i = Iter_Next(YSI_g_sRacePeople2, i)) != playerid; )
  170. {
  171. switch (floatcmp(YSI_g_sPlayerRace2[i][E_RACE_PLAYER_LAP], lap) * 3 + floatcmp(gracePos[i][E_RACE_POS_CP], cp))
  172. {
  173. case 4, 3, 2, 1: ++pos; // This player better.
  174. case 0: if (gracePos[i][E_RACE_POS_TOGO] < togo) ++pos; else ++YSI_g_sPlayerRace2[i][E_RACE_PLAYER_POSITION];
  175. default: ++YSI_g_sPlayerRace2[i][E_RACE_PLAYER_POSITION]; // Other player better.
  176. }
  177. }
  178. return pos;
  179. }
  180. static y_races_SFD0(p, l, c, Float:t, x)
  181. {
  182. Iter_Add(YSI_g_sRacePeople2, p);
  183. gracePos[p][E_RACE_POS_CP] = c;
  184. gracePos[p][E_RACE_POS_TOGO] = t;
  185. YSI_g_sPlayerRace2[p][E_RACE_PLAYER_LAP] = l;
  186. YSI_g_sPlayerRace2[p][E_RACE_PLAYER_POSITION] = x;
  187. }
  188. static y_races_SFD()
  189. {
  190. Iter_Clear(YSI_g_sRacePeople2);
  191. y_races_SFD0( 0, 3, 6, 10.0, 1);
  192. y_races_SFD0( 1, 3, 6, 20.0, 2);
  193. y_races_SFD0( 2, 3, 6, 30.0, 3);
  194. y_races_SFD0( 3, 3, 5, 10.0, 4);
  195. y_races_SFD0( 4, 3, 5, 20.0, 5);
  196. y_races_SFD0( 5, 3, 5, 30.0, 6);
  197. y_races_SFD0( 6, 3, 4, 10.0, 7);
  198. y_races_SFD0( 7, 3, 4, 20.0, 8);
  199. y_races_SFD0( 8, 3, 4, 30.0, 9);
  200. // Lap 2.
  201. y_races_SFD0(10, 2, 6, 10.0, 10);
  202. y_races_SFD0(11, 2, 6, 20.0, 11);
  203. y_races_SFD0(12, 2, 6, 30.0, 12);
  204. y_races_SFD0(13, 2, 5, 10.0, 13);
  205. y_races_SFD0(14, 2, 5, 20.0, 14);
  206. y_races_SFD0(15, 2, 5, 30.0, 15);
  207. y_races_SFD0(16, 2, 4, 10.0, 16);
  208. y_races_SFD0(17, 2, 4, 20.0, 17);
  209. y_races_SFD0(18, 2, 4, 30.0, 18);
  210. // Lap 1.
  211. y_races_SFD0(20, 1, 6, 10.0, 19);
  212. y_races_SFD0(21, 1, 6, 20.0, 20);
  213. y_races_SFD0(22, 1, 6, 30.0, 21);
  214. y_races_SFD0(23, 1, 5, 10.0, 22);
  215. y_races_SFD0(24, 1, 5, 20.0, 23);
  216. y_races_SFD0(25, 1, 5, 30.0, 24);
  217. y_races_SFD0(26, 1, 4, 10.0, 25);
  218. y_races_SFD0(27, 1, 4, 20.0, 26);
  219. y_races_SFD0(28, 1, 4, 30.0, 27);
  220. // Reference.
  221. y_races_SFD0(30, 2, 5, 20.0, 0);
  222. // Other.
  223. y_races_SFD0(31, 3, 6, 20.0, 0);
  224. y_races_SFD0(32, 3, 4, 10.0, 0);
  225. y_races_SFD0(33, 2, 6, 10.0, 0);
  226. y_races_SFD0(34, 3, 5, 30.0, 0);
  227. y_races_SFD0(35, 2, 4, 30.0, 0);
  228. y_races_SFD0(36, 1, 6, 30.0, 0);
  229. y_races_SFD0(37, 1, 5, 10.0, 0);
  230. y_races_SFD0(38, 1, 4, 20.0, 0);
  231. }
  232. #define Y_RACES_ASSERT(%0,%1) ASSERT(YSI_g_sPlayerRace2[%0][E_RACE_PLAYER_POSITION] == %1)
  233. static y_races_ASSERT(pos)
  234. {
  235. Iter_Clear(YSI_g_sRacePeople2);
  236. Y_RACES_ASSERT( 0, 1);
  237. Y_RACES_ASSERT( 1, 2);
  238. Y_RACES_ASSERT( 2, 3);
  239. Y_RACES_ASSERT( 3, 4);
  240. Y_RACES_ASSERT( 4, 5);
  241. Y_RACES_ASSERT( 5, 6);
  242. Y_RACES_ASSERT( 6, 7);
  243. Y_RACES_ASSERT( 7, 8);
  244. Y_RACES_ASSERT( 8, 9);
  245. //Y_RACES_ASSERT
  246. Y_RACES_ASSERT(10, 10);
  247. Y_RACES_ASSERT(11, 11);
  248. Y_RACES_ASSERT(12, 12);
  249. Y_RACES_ASSERT(13, 13);
  250. ASSERT(YSI_g_sPlayerRace2[14][E_RACE_PLAYER_POSITION] == 14 || YSI_g_sPlayerRace2[14][E_RACE_PLAYER_POSITION] == 15);
  251. Y_RACES_ASSERT(15, 16);
  252. Y_RACES_ASSERT(16, 17);
  253. Y_RACES_ASSERT(17, 18);
  254. Y_RACES_ASSERT(18, 19);
  255. //Y_RACES_ASSERT
  256. Y_RACES_ASSERT(20, 20);
  257. Y_RACES_ASSERT(21, 21);
  258. Y_RACES_ASSERT(22, 22);
  259. Y_RACES_ASSERT(23, 23);
  260. Y_RACES_ASSERT(24, 24);
  261. Y_RACES_ASSERT(25, 25);
  262. Y_RACES_ASSERT(26, 26);
  263. Y_RACES_ASSERT(27, 27);
  264. Y_RACES_ASSERT(28, 28);
  265. //Y_RACES_ASSERT
  266. ASSERT(pos == 14 || pos == 15);
  267. //Y_RACES_ASSERT(30, 0);
  268. //Y_RACES_ASSERT
  269. Y_RACES_ASSERT(31, 0);
  270. Y_RACES_ASSERT(32, 0);
  271. Y_RACES_ASSERT(33, 0);
  272. Y_RACES_ASSERT(34, 0);
  273. Y_RACES_ASSERT(35, 0);
  274. Y_RACES_ASSERT(36, 0);
  275. Y_RACES_ASSERT(37, 0);
  276. Y_RACES_ASSERT(38, 0);
  277. }
  278. Test:y_races_Position0()
  279. {
  280. y_races_SFD();
  281. y_races_ASSERT(y_races_Position0(2, 5, 20.0, 30));
  282. }
  283. Test:y_races_Position1()
  284. {
  285. y_races_SFD();
  286. y_races_ASSERT(y_races_Position1(2, 5, 20.0, 30));
  287. }
  288. Test:y_races_Position2()
  289. {
  290. y_races_SFD();
  291. y_races_ASSERT(y_races_Position2(2, 5, 20.0, 30));
  292. }
  293. Test:y_races_Position3()
  294. {
  295. y_races_SFD();
  296. y_races_ASSERT(y_races_Position3(2, 5, 20.0, 30));
  297. }
  298. //#define Profile: Test:
  299. #define Profile: static stock _ // Can't have trailing space.
  300. Profile:y_races_Position()
  301. {
  302. new
  303. t0,
  304. t1,
  305. t2,
  306. t3,
  307. t4;
  308. t0 = GetTickCount();
  309. for (new i = 0; i != 10000000; ++i)
  310. {
  311. y_races_SFD();
  312. y_races_Position0(2, 5, 20.0, 30);
  313. }
  314. t1 = GetTickCount();
  315. for (new i = 0; i != 10000000; ++i)
  316. {
  317. y_races_SFD();
  318. y_races_Position1(2, 5, 20.0, 30);
  319. }
  320. t2 = GetTickCount();
  321. for (new i = 0; i != 10000000; ++i)
  322. {
  323. y_races_SFD();
  324. y_races_Position2(2, 5, 20.0, 30);
  325. }
  326. t3 = GetTickCount();
  327. for (new i = 0; i != 10000000; ++i)
  328. {
  329. y_races_SFD();
  330. y_races_Position3(2, 5, 20.0, 30);
  331. }
  332. t4 = GetTickCount();
  333. printf("Times: %d %d %d %d", t1 - t0, t2 - t1, t3 - t2, t4 - t3);
  334. }