Advertisement
Pweebs

Untitled

Nov 16th, 2019
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.25 KB | None | 0 0
  1. #include <stdbool.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <stdint.h>
  6. #include <signal.h>
  7. #include <setjmp.h>
  8.  
  9. #include "BigInteger.h"
  10. #include "List.h"
  11.  
  12. #define FIRST_TEST Sign_test
  13. #define MAXSCORE 52
  14.  
  15. static uint8_t testsPassed;
  16. static volatile sig_atomic_t testStatus;
  17. static uint8_t disable_exit_handler;
  18. jmp_buf test_crash;
  19.  
  20. enum Test_e {
  21. Sign_test = 0,
  22. Negate_test,
  23. Makezero_test,
  24. Copy_test,
  25. Add_test,
  26. Sum_test,
  27. Subtract_test,
  28. Diff_test,
  29. Multiply_test,
  30. Prod_test,
  31. NUM_TESTS,
  32. };
  33.  
  34. char *testName(int test) {
  35. if (test == Sign_test) return "Sign_test";
  36. if (test == Negate_test) return "Negate_test";
  37. if (test == Makezero_test) return "Makezero_test";
  38. if (test == Copy_test) return "Copy_test";
  39. if (test == Add_test) return "Add_test";
  40. if (test == Sum_test) return "Sum_test";
  41. if (test == Subtract_test) return "Subtract_test";
  42. if (test == Diff_test) return "Diff_test";
  43. if (test == Multiply_test) return "Multiply_test";
  44. if (test == Prod_test) return "Prod_test";
  45. if (test == NUM_TESTS) return "NUM_TESTS";
  46.  
  47. return "";
  48. }
  49.  
  50. uint8_t runTest(BigInteger *pA, BigInteger *pB, BigInteger *pC, BigInteger *pD, int test) {
  51.  
  52. switch(test) {
  53. case Sign_test:
  54. {
  55. *pA = newBigInteger();
  56. if (sign(*pA) != 0) return 1;
  57.  
  58. *pC = stringToBigInteger("+13378008135");
  59. *pD = stringToBigInteger("-13378008135");
  60. if(sign(*pC) != 1 || sign(*pD) != -1) return 2;
  61.  
  62. freeBigInteger(pC);
  63. freeBigInteger(pD);
  64. return 0;
  65. }
  66. case Negate_test: {
  67. *pA = stringToBigInteger("+13378008135");
  68.  
  69. negate(*pA);
  70. if(sign(*pA) != -1) return 1;
  71.  
  72. negate(*pA);
  73. if(sign(*pA) != 1) return 2;
  74.  
  75. return 0;
  76. }
  77. case Makezero_test: {
  78. *pA = stringToBigInteger("+13378008135");
  79. makeZero(*pA);
  80. if(sign(*pA) != 0) return 1;
  81. return 0;
  82. }
  83. case Copy_test: {
  84. *pA = stringToBigInteger("+13378008135");
  85. *pB = copy(*pA);
  86. if(sign(*pB) != 1) return 2;
  87.  
  88. negate(*pA);
  89. if(sign(*pB) != 1) return 3;
  90.  
  91. *pC = copy(*pA);
  92. if(sign(*pC) != -1) return 4;
  93.  
  94. return 0;
  95. }
  96. case Add_test: {
  97. /*
  98. * Adding numbers fall into one of 4 cases, denote pos = positive number, neg = negative number
  99. *
  100. * pos + pos = pos
  101. *
  102. * pos + neg = 0
  103. * < 0
  104. * > 0
  105. *
  106. * neg + pos = 0
  107. * < 0
  108. * > 0
  109. *
  110. * neg + neg = neg
  111. *
  112. * */
  113. *pA = stringToBigInteger("+111122223333");
  114. *pB = stringToBigInteger("+222211110000");
  115. *pC = newBigInteger();
  116.  
  117. //pos + pos = pos
  118. *pD = stringToBigInteger("+333333333333");
  119. add(*pC, *pA, *pB);
  120.  
  121. if(!equals(*pC, *pD)) return 1;
  122. freeBigInteger(pB);
  123. freeBigInteger(pD);
  124.  
  125. //add a positive and a negative integer
  126. //-> pos + neg = 0
  127. *pB = stringToBigInteger("-111122223333");
  128. add(*pC, *pA, *pB);
  129. if(sign(*pC) != 0) return 2;
  130. freeBigInteger(pB);
  131.  
  132. //-> pos + neg > 0
  133. *pB = stringToBigInteger("-110122223333");
  134. add(*pC, *pA, *pB);
  135. if(sign(*pC) != 1) return 3;
  136. freeBigInteger(pB);
  137.  
  138. //-> pos + neg < 0
  139. *pB = stringToBigInteger("-112122223333");
  140. add(*pC, *pA, *pB);
  141. if(sign(*pC) != -1) return 4;
  142.  
  143. //-> neg + neg = neg
  144. freeBigInteger(pA);
  145. *pA = stringToBigInteger("-221211110000");
  146. *pD = stringToBigInteger("-333333333333");
  147. add(*pC, *pA,*pB);
  148. if(!equals(*pC, *pD)) return 5;
  149.  
  150. return 0;
  151. }
  152. case Sum_test: {
  153. *pA = stringToBigInteger("+111122223333");
  154. *pB = stringToBigInteger("+222211110000");
  155.  
  156. //pos + pos = pos
  157. *pD = stringToBigInteger("+333333333333");
  158. *pC = sum(*pA, *pB);
  159.  
  160. if(!equals(*pC, *pD)) return 1;
  161. freeBigInteger(pB);
  162. freeBigInteger(pC);
  163. freeBigInteger(pD);
  164.  
  165. //-> neg + pos == 0
  166. negate(*pA); //A-> -111122223333
  167. *pB = stringToBigInteger("+111122223333");
  168. *pC = sum(*pA, *pB);
  169. if(sign(*pC) != 0) return 2;
  170. freeBigInteger(pB);
  171. freeBigInteger(pC);
  172.  
  173. //-> neg + pos > 0
  174. *pB = stringToBigInteger("+112122223333");
  175. *pC = sum(*pA, *pB);
  176. if(sign(*pC) != -1) return 4;
  177.  
  178.  
  179. //-> neg + neg
  180. freeBigInteger(pB);
  181. freeBigInteger(pC);
  182. *pB = stringToBigInteger("-222211110000");
  183. *pD = stringToBigInteger("-333333333333");
  184. *pC = sum(*pA, *pB);
  185. if(!equals(*pC, *pD)) return 5;
  186.  
  187. return 0;
  188. }
  189. case Subtract_test: {
  190. /*
  191. * subtracting numbers fall into one of 4 cases, denote pos = positive number, neg = negative number
  192. *
  193. * pos - pos = 0
  194. * < 0
  195. * > 0
  196. *
  197. * pos - neg = pos
  198. *
  199. * neg - pos = neg
  200. *
  201. * neg - neg = 0
  202. * < 0
  203. * > 0
  204. *
  205. * */
  206.  
  207. // pos - pos = 0
  208. *pA = stringToBigInteger("+111122223333");
  209. *pB = stringToBigInteger("+111122223333");
  210. *pC = newBigInteger();
  211.  
  212. subtract(*pC, *pA, *pB);
  213. if(sign(*pC) != 0) return 1;
  214.  
  215. // pos - pos < 0
  216. freeBigInteger(pB);
  217. *pB = stringToBigInteger("121122223333");
  218. subtract(*pC, *pA, *pB);
  219. if(sign(*pC) != -1) return 2;
  220.  
  221. // pos - pos > 0
  222. freeBigInteger(pB);
  223. *pB = stringToBigInteger("101122223333");
  224. subtract(*pC, *pA, *pB);
  225. if(sign(*pC) != 1) return 3;
  226.  
  227. //pos - neg = pos
  228. negate(*pB);
  229. subtract(*pC, *pA, *pB);
  230. if(sign(*pC) != 1) return 4;
  231.  
  232. //neg - pos = neg
  233. subtract(*pC, *pB, *pA);
  234. if(sign(*pC) != -1) return 5;
  235.  
  236. return 0;
  237. }
  238. case Diff_test: {
  239. *pA = stringToBigInteger("-111122223333");
  240. *pB = stringToBigInteger("-111122223333");
  241.  
  242. //neg - neg = 0
  243. *pC = diff(*pA, *pB);
  244. if(sign(*pC) != 0) return 1;
  245.  
  246. //neg - neg > 0
  247. freeBigInteger(pB);
  248. freeBigInteger(pC);
  249. *pB = stringToBigInteger("-112122223333");
  250. *pC = diff(*pA, *pB);
  251. if(sign(*pC) != 1) return 2;
  252.  
  253. //neg - neg < 0
  254. freeBigInteger(pB);
  255. freeBigInteger(pC);
  256. *pB = stringToBigInteger("-110122223333");
  257. *pC = diff(*pA, *pB);
  258. if(sign(*pC) != -1) return 3;
  259.  
  260. //neg - pos = neg
  261. negate(*pB);
  262. freeBigInteger(pC);
  263. *pC = diff(*pA, *pB);
  264. if(sign(*pC) != -1) return 4;
  265.  
  266. return 0;
  267. }
  268. case Multiply_test: {
  269. *pA = stringToBigInteger("111122223333");
  270. *pB = stringToBigInteger("111122223333");
  271. *pC = newBigInteger();
  272.  
  273. // pos * pos = pos
  274. multiply(*pC, *pA, *pB);
  275. if(sign(*pC) != 1) return 1;
  276.  
  277. // pos * neg = neg
  278. negate(*pB);
  279. multiply(*pC, *pA, *pB);
  280. if(sign(*pC) != -1) return 2;
  281.  
  282. return 0;
  283. }
  284. case Prod_test: {
  285. *pA = stringToBigInteger("-111122223333");
  286. *pB = stringToBigInteger("111122223333");
  287.  
  288. //neg * pos = neg
  289. *pC = prod(*pA, *pB);
  290. if(sign(*pC) != -1) return 1;
  291.  
  292. //neg * neg = pos
  293. negate(*pB);
  294. *pC = prod(*pA, *pB);
  295. if(sign(*pC) != 1) return 2;
  296.  
  297. return 0;
  298. }
  299. }
  300. return 254;
  301. }
  302.  
  303. void segfault_handler(int signal) { // everyone knows what this is
  304. testStatus = 255;
  305. longjmp(test_crash, 1);
  306. }
  307.  
  308. void exit_attempt_handler(void) { // only I decide when you are done
  309. if (disable_exit_handler) return; // allow this to be disabled
  310. testStatus = 255;
  311. longjmp(test_crash, 2);
  312. }
  313.  
  314. void abrupt_termination_handler(int signal) { // program killed externally
  315. testStatus = 255;
  316. longjmp(test_crash, 3);
  317. }
  318.  
  319. int main (int argc, char **argv) {
  320. if (argc > 2 || (argc == 2 && strcmp(argv[1], "-v") != 0)) {
  321. printf("here\n");
  322. printf("Usage: %s [-v]", (argc > 0 ? argv[0] : "./MatrixTest"));
  323. exit(1);
  324. }
  325.  
  326. printf("\n"); // more spacing
  327. if (argc == 2) printf("\n"); // consistency in verbose mode
  328.  
  329. testsPassed = 0;
  330. disable_exit_handler = 0;
  331. atexit(exit_attempt_handler);
  332. signal(SIGSEGV, segfault_handler);
  333.  
  334. for (uint8_t i = FIRST_TEST; i < NUM_TESTS; i++) {
  335. BigInteger A = NULL;
  336. BigInteger B = NULL;
  337. BigInteger C = NULL;
  338. BigInteger D = NULL;
  339.  
  340. testStatus = runTest(&A, &B, &C, &D, i);
  341.  
  342. freeBigInteger(&A);
  343. freeBigInteger(&B);
  344. freeBigInteger(&C);
  345. freeBigInteger(&D);
  346.  
  347. uint8_t fail_type = setjmp(test_crash);
  348. if (argc == 2) { // it's verbose mode
  349. printf("Test %s: %s", testName(i), testStatus == 0 ? "PASSED" :
  350. "FAILED");
  351. if (testStatus == 255) {
  352. printf(": due to a %s\n", fail_type == 1 ? "segfault" : fail_type == 2 ?
  353. "program exit" : "program interruption");
  354. printf("\nWARNING: Program will now stop running tests\n\n");
  355. break;
  356. } else if (testStatus == 254) {
  357. printf(": undefined test\n");
  358. } else if (testStatus != 0) {
  359. printf(": test %d\n", testStatus);
  360. } else {
  361. printf("\n");
  362. }
  363. }
  364. if (testStatus == 0) {
  365. testsPassed++;
  366. }
  367. }
  368.  
  369. disable_exit_handler = 1;
  370.  
  371. uint8_t totalScore = (MAXSCORE - NUM_TESTS * 4) + testsPassed * 4;
  372. if (testsPassed == 0) totalScore = 0;
  373.  
  374. if (argc == 2 && testStatus != 255) printf("\nYou passed %d out of %d tests\n", testsPassed,
  375. NUM_TESTS);
  376. else if (testStatus == 255) {
  377. totalScore = 0; // charity points
  378. if (argc == 2) printf("Receiving charity points because your program crashes\n");
  379. }
  380. printf("\nYou will receive %d out of %d possible points on the MatrixTests\n\n",
  381. totalScore, MAXSCORE);
  382. exit(0);
  383. return 0;
  384. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement