sokol_args_test.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. //------------------------------------------------------------------------------
  2. // sokol-args-test.c
  3. //------------------------------------------------------------------------------
  4. #define SOKOL_IMPL
  5. #include "sokol_args.h"
  6. #include "utest.h"
  7. #define T(b) EXPECT_TRUE(b)
  8. #define TSTR(s0, s1) EXPECT_TRUE(0 == strcmp(s0,s1))
  9. #define NUM_ARGS(x) (sizeof(x)/sizeof(void*))
  10. static char* argv_0[] = { "exe_name " };
  11. UTEST(sokol_args, init_shutdown) {
  12. sargs_setup(&(sargs_desc){0});
  13. T(sargs_isvalid());
  14. T(_sargs.max_args == _SARGS_MAX_ARGS_DEF);
  15. T(_sargs.args);
  16. T(_sargs.buf_size == _SARGS_BUF_SIZE_DEF);
  17. T(_sargs.buf_pos == 1);
  18. T(_sargs.buf);
  19. T(sargs_num_args() == 0);
  20. TSTR(sargs_key_at(0), "");
  21. TSTR(sargs_value_at(0), "");
  22. sargs_shutdown();
  23. T(!sargs_isvalid());
  24. T(0 == _sargs.args);
  25. T(0 == _sargs.buf);
  26. }
  27. UTEST(sokol_args, no_args) {
  28. sargs_setup(&(sargs_desc){
  29. .argc = NUM_ARGS(argv_0),
  30. .argv = argv_0
  31. });
  32. T(sargs_isvalid());
  33. T(sargs_num_args() == 0);
  34. TSTR(sargs_key_at(0), "");
  35. TSTR(sargs_value_at(0), "");
  36. T(-1 == sargs_find("bla"));
  37. T(!sargs_exists("bla"));
  38. TSTR(sargs_value("bla"), "");
  39. TSTR(sargs_value_def("bla", "blub"), "blub");
  40. sargs_shutdown();
  41. }
  42. static char* argv_1[] = { "exe_name", "kvp0=val0", "kvp1=val1", "kvp2=val2" };
  43. UTEST(sokol_args, simple_args) {
  44. sargs_setup(&(sargs_desc){
  45. .argc = NUM_ARGS(argv_1),
  46. .argv = argv_1,
  47. });
  48. T(sargs_isvalid());
  49. T(sargs_num_args() == 3);
  50. T(0 == sargs_find("kvp0"));
  51. TSTR(sargs_value("kvp0"), "val0");
  52. TSTR(sargs_key_at(0), "kvp0");
  53. TSTR(sargs_value_at(0), "val0");
  54. T(1 == sargs_find("kvp1"));
  55. TSTR(sargs_value("kvp1"), "val1");
  56. TSTR(sargs_key_at(1), "kvp1");
  57. TSTR(sargs_value_at(1), "val1");
  58. T(2 == sargs_find("kvp2"));
  59. TSTR(sargs_value("kvp2"), "val2");
  60. TSTR(sargs_key_at(2), "kvp2");
  61. TSTR(sargs_value_at(2), "val2");
  62. T(_sargs.buf_pos == 31);
  63. sargs_shutdown();
  64. }
  65. static char* argv_2[] = { "exe_name", "kvp0 = val0 ", " \tkvp1= val1", "kvp2 = val2 "};
  66. UTEST(sokol_args, simple_whitespace) {
  67. sargs_setup(&(sargs_desc){
  68. .argc = NUM_ARGS(argv_2),
  69. .argv = argv_2
  70. });
  71. T(sargs_isvalid());
  72. T(sargs_num_args() == 3);
  73. T(0 == sargs_find("kvp0"));
  74. TSTR(sargs_value("kvp0"), "val0");
  75. TSTR(sargs_key_at(0), "kvp0");
  76. TSTR(sargs_value_at(0), "val0");
  77. T(1 == sargs_find("kvp1"));
  78. TSTR(sargs_value("kvp1"), "val1");
  79. TSTR(sargs_key_at(1), "kvp1");
  80. TSTR(sargs_value_at(1), "val1");
  81. T(2 == sargs_find("kvp2"));
  82. TSTR(sargs_value("kvp2"), "val2");
  83. TSTR(sargs_key_at(2), "kvp2");
  84. TSTR(sargs_value_at(2), "val2");
  85. T(_sargs.buf_pos == 31);
  86. sargs_shutdown();
  87. }
  88. static char* argv_4[] = { "exe_name", "kvp0 ", "=val0 ", " kvp1", "=", "val1", "kvp2 \t", "= val2 "};
  89. UTEST(sokol_args, standalone_separator) {
  90. sargs_setup(&(sargs_desc){
  91. .argc = NUM_ARGS(argv_4),
  92. .argv = argv_4
  93. });
  94. T(sargs_isvalid());
  95. T(sargs_num_args() == 3);
  96. T(0 == sargs_find("kvp0"));
  97. TSTR(sargs_value("kvp0"), "val0");
  98. TSTR(sargs_key_at(0), "kvp0");
  99. TSTR(sargs_value_at(0), "val0");
  100. T(1 == sargs_find("kvp1"));
  101. TSTR(sargs_value("kvp1"), "val1");
  102. TSTR(sargs_key_at(1), "kvp1");
  103. TSTR(sargs_value_at(1), "val1");
  104. T(2 == sargs_find("kvp2"));
  105. TSTR(sargs_value("kvp2"), "val2");
  106. TSTR(sargs_key_at(2), "kvp2");
  107. TSTR(sargs_value_at(2), "val2");
  108. T(_sargs.buf_pos == 31);
  109. sargs_shutdown();
  110. }
  111. static char* argv_5[] = { "exe_name", "kvp0='bla bla'", "kvp1=' blub blub'", "kvp2='blob blob '"};
  112. UTEST(sokol_args, single_quotes) {
  113. sargs_setup(&(sargs_desc){
  114. .argc = NUM_ARGS(argv_5),
  115. .argv = argv_5
  116. });
  117. T(sargs_isvalid());
  118. T(sargs_num_args() == 3);
  119. T(0 == sargs_find("kvp0"));
  120. TSTR(sargs_value("kvp0"), "bla bla");
  121. TSTR(sargs_key_at(0), "kvp0");
  122. TSTR(sargs_value_at(0), "bla bla");
  123. T(1 == sargs_find("kvp1"));
  124. TSTR(sargs_value("kvp1"), " blub blub");
  125. TSTR(sargs_key_at(1), "kvp1");
  126. TSTR(sargs_value_at(1), " blub blub");
  127. T(2 == sargs_find("kvp2"));
  128. TSTR(sargs_value("kvp2"), "blob blob ");
  129. TSTR(sargs_key_at(2), "kvp2");
  130. TSTR(sargs_value_at(2), "blob blob ");
  131. sargs_shutdown();
  132. }
  133. static char* argv_6[] = { "exe_name", "kvp0=\"bla bla\"", "kvp1=\" blub blub\"", "kvp2=\"blob blob \""};
  134. UTEST(sokol_args, double_quotes) {
  135. sargs_setup(&(sargs_desc){
  136. .argc = NUM_ARGS(argv_6),
  137. .argv = argv_6
  138. });
  139. T(sargs_isvalid());
  140. T(sargs_num_args() == 3);
  141. T(0 == sargs_find("kvp0"));
  142. TSTR(sargs_value("kvp0"), "bla bla");
  143. TSTR(sargs_key_at(0), "kvp0");
  144. TSTR(sargs_value_at(0), "bla bla");
  145. T(1 == sargs_find("kvp1"));
  146. TSTR(sargs_value("kvp1"), " blub blub");
  147. TSTR(sargs_key_at(1), "kvp1");
  148. TSTR(sargs_value_at(1), " blub blub");
  149. T(2 == sargs_find("kvp2"));
  150. TSTR(sargs_value("kvp2"), "blob blob ");
  151. TSTR(sargs_key_at(2), "kvp2");
  152. TSTR(sargs_value_at(2), "blob blob ");
  153. sargs_shutdown();
  154. }
  155. static char* argv_7[] = { "exe_name", "kvp0='bla \"bla\"'", "kvp1=' \"blub blub\"'", "kvp2='blob \"blob\" '"};
  156. UTEST(sokol_args, double_in_single_quotes) {
  157. sargs_setup(&(sargs_desc){
  158. .argc = NUM_ARGS(argv_7),
  159. .argv = argv_7
  160. });
  161. T(sargs_isvalid());
  162. T(sargs_num_args() == 3);
  163. T(0 == sargs_find("kvp0"));
  164. TSTR(sargs_value("kvp0"), "bla \"bla\"");
  165. TSTR(sargs_key_at(0), "kvp0");
  166. TSTR(sargs_value_at(0), "bla \"bla\"");
  167. T(1 == sargs_find("kvp1"));
  168. TSTR(sargs_value("kvp1"), " \"blub blub\"");
  169. TSTR(sargs_key_at(1), "kvp1");
  170. TSTR(sargs_value_at(1), " \"blub blub\"");
  171. T(2 == sargs_find("kvp2"));
  172. TSTR(sargs_value("kvp2"), "blob \"blob\" ");
  173. TSTR(sargs_key_at(2), "kvp2");
  174. TSTR(sargs_value_at(2), "blob \"blob\" ");
  175. sargs_shutdown();
  176. }
  177. static char* argv_8[] = { "exe_name", "kvp0=\"bla 'bla'\"", "kvp1=\" 'blub blub'\"", "kvp2=\"blob 'blob' \""};
  178. UTEST(sokol_args, single_in_double_quotes) {
  179. sargs_setup(&(sargs_desc){
  180. .argc = NUM_ARGS(argv_8),
  181. .argv = argv_8
  182. });
  183. T(sargs_isvalid());
  184. T(sargs_num_args() == 3);
  185. T(0 == sargs_find("kvp0"));
  186. TSTR(sargs_value("kvp0"), "bla 'bla'");
  187. TSTR(sargs_key_at(0), "kvp0");
  188. TSTR(sargs_value_at(0), "bla 'bla'");
  189. T(1 == sargs_find("kvp1"));
  190. TSTR(sargs_value("kvp1"), " 'blub blub'");
  191. TSTR(sargs_key_at(1), "kvp1");
  192. TSTR(sargs_value_at(1), " 'blub blub'");
  193. T(2 == sargs_find("kvp2"));
  194. TSTR(sargs_value("kvp2"), "blob 'blob' ");
  195. TSTR(sargs_key_at(2), "kvp2");
  196. TSTR(sargs_value_at(2), "blob 'blob' ");
  197. sargs_shutdown();
  198. }
  199. static char* argv_9[] = { "exe_name", "kvp0='bla ", "bla'", "kvp1= ' blub", " blub'", "kvp2='blob blob '"};
  200. UTEST(sokol_args, test_split_quotes) {
  201. sargs_setup(&(sargs_desc){
  202. .argc = NUM_ARGS(argv_9),
  203. .argv = argv_9
  204. });
  205. T(sargs_isvalid());
  206. T(sargs_num_args() == 3);
  207. T(0 == sargs_find("kvp0"));
  208. TSTR(sargs_value("kvp0"), "bla bla");
  209. TSTR(sargs_key_at(0), "kvp0");
  210. TSTR(sargs_value_at(0), "bla bla");
  211. T(1 == sargs_find("kvp1"));
  212. TSTR(sargs_value("kvp1"), " blub blub");
  213. TSTR(sargs_key_at(1), "kvp1");
  214. TSTR(sargs_value_at(1), " blub blub");
  215. T(2 == sargs_find("kvp2"));
  216. TSTR(sargs_value("kvp2"), "blob blob ");
  217. TSTR(sargs_key_at(2), "kvp2");
  218. TSTR(sargs_value_at(2), "blob blob ");
  219. sargs_shutdown();
  220. }
  221. static char* argv_10[] = { "exe_name", "kvp0=\\\\val0\\nval1", "kvp1=val1\\rval2", "kvp2='val2\\tval3'" };
  222. UTEST(sokol_args, escape_sequence) {
  223. sargs_setup(&(sargs_desc){
  224. .argc = NUM_ARGS(argv_10),
  225. .argv = argv_10,
  226. });
  227. T(sargs_isvalid());
  228. T(sargs_num_args() == 3);
  229. T(0 == sargs_find("kvp0"));
  230. TSTR(sargs_value("kvp0"), "\\val0\nval1");
  231. TSTR(sargs_key_at(0), "kvp0");
  232. TSTR(sargs_value_at(0), "\\val0\nval1");
  233. T(1 == sargs_find("kvp1"));
  234. TSTR(sargs_value("kvp1"), "val1\rval2");
  235. TSTR(sargs_key_at(1), "kvp1");
  236. TSTR(sargs_value_at(1), "val1\rval2");
  237. T(2 == sargs_find("kvp2"));
  238. TSTR(sargs_value("kvp2"), "val2\tval3");
  239. TSTR(sargs_key_at(2), "kvp2");
  240. TSTR(sargs_value_at(2), "val2\tval3");
  241. sargs_shutdown();
  242. }
  243. static char* argv_11[] = { "exe_name", "kvp0 kvp1", "kvp2 = val2", "kvp3", "kvp4=val4" };
  244. UTEST(sokol_args, key_only_args) {
  245. sargs_setup(&(sargs_desc){
  246. .argc = NUM_ARGS(argv_11),
  247. .argv = argv_11,
  248. });
  249. T(sargs_isvalid());
  250. T(sargs_num_args() == 5);
  251. T(0 == sargs_find("kvp0"));
  252. T(1 == sargs_find("kvp1"));
  253. T(2 == sargs_find("kvp2"));
  254. T(3 == sargs_find("kvp3"));
  255. T(4 == sargs_find("kvp4"))
  256. T(-1 == sargs_find("kvp5"));
  257. T(-1 == sargs_find("val2"));
  258. T(-1 == sargs_find("val4"));
  259. T(sargs_exists("kvp0"));
  260. T(sargs_exists("kvp1"));
  261. T(sargs_exists("kvp2"));
  262. T(sargs_exists("kvp3"));
  263. T(sargs_exists("kvp4"));
  264. T(!sargs_exists("kvp5"));
  265. TSTR(sargs_value("kvp0"), "");
  266. TSTR(sargs_value("kvp1"), "");
  267. TSTR(sargs_value("kvp2"), "val2");
  268. TSTR(sargs_value("kvp3"), "");
  269. TSTR(sargs_value("kvp4"), "val4");
  270. TSTR(sargs_value("kvp5"), "");
  271. TSTR(sargs_value_def("kvp0", "bla0"), "bla0");
  272. TSTR(sargs_value_def("kvp1", "bla1"), "bla1");
  273. TSTR(sargs_value_def("kvp2", "bla2"), "val2");
  274. TSTR(sargs_value_def("kvp3", "bla3"), "bla3");
  275. TSTR(sargs_value_def("kvp4", "bla4"), "val4");
  276. TSTR(sargs_value_def("kvp5", "bla5"), "bla5");
  277. TSTR(sargs_key_at(0), "kvp0");
  278. TSTR(sargs_key_at(1), "kvp1");
  279. TSTR(sargs_key_at(2), "kvp2");
  280. TSTR(sargs_key_at(3), "kvp3");
  281. TSTR(sargs_key_at(4), "kvp4");
  282. TSTR(sargs_key_at(5), "");
  283. TSTR(sargs_value_at(0), "");
  284. TSTR(sargs_value_at(1), "");
  285. TSTR(sargs_value_at(2), "val2");
  286. TSTR(sargs_value_at(3), "");
  287. TSTR(sargs_value_at(4), "val4");
  288. TSTR(sargs_value_at(5), "");
  289. }