3 MPDM - Minimum Profit Data Manager
4 Copyright (C) 2003/2007 Angel Ortega <angel@triptico.com>
6 stress.c - Stress tests for MPDM.
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License
10 as published by the Free Software Foundation; either version 2
11 of the License, or (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 http://www.triptico.com
34 /* total number of tests and oks */
38 /* failed tests messages */
39 char * failed_msgs
[5000];
40 int i_failed_msgs
= 0;
42 int do_benchmarks
= 0;
43 int do_multibyte_sregex_tests
= 0;
49 void do_test(char * str
, int ok
)
53 sprintf(tmp
, "%s: %s\n", str
, ok
? "OK!" : "*** Failed ***");
61 failed_msgs
[i_failed_msgs
++] = strdup(tmp
);
78 do_test("i == 65536", (i
== 65536));
79 do_test("v has MPDM_IVAL", (v
->flags
& MPDM_IVAL
));
82 do_test("r == 65536", (r
== 65536.0));
83 do_test("v has MPDM_RVAL", (v
->flags
& MPDM_RVAL
));
85 printf("mpdm_string: %ls\n", mpdm_string(MPDM_H(0)));
86 printf("mpdm_string: %ls\n", mpdm_string(MPDM_H(0)));
88 /* partial copies of strings */
89 v
= MPDM_LS(L
"this is not America");
90 v
= MPDM_NS((wchar_t *)v
->data
+ 4, 4);
92 do_test("Partial string values", mpdm_cmp(v
, MPDM_LS(L
" is ")) == 0);
94 v
= MPDM_S(L
"MUAHAHAHA!");
95 do_test("Testing mpdm_clone semantics 1", mpdm_clone(v
) == v
);
98 mpdm_aset(v
, MPDM_S(L
"evil"), 0);
99 mpdm_aset(v
, MPDM_S(L
"dead"), 1);
102 do_test("Testing mpdm_clone semantics 2.1", w
!= v
);
105 do_test("Testing mpdm_clone semantics 2.2", v
->ref
> 1);
106 do_test("Testing mpdm_clone semantics 2.3", mpdm_aget(w
, 0) == v
);
108 /* mbs / wcs tests */
109 v
= MPDM_MBS("This is (was) a multibyte string");
112 /* greek omega is 03a9 */
113 v
= MPDM_MBS("?Espa?a! (non-ASCII string, as ISO-8859-1 char *)");
115 printf("(Previous value will be NULL if locale doesn't match stress.c encoding)\n");
117 v
= MPDM_LS(L
"A capital greek omega between brackets [\x03a9]");
119 printf("(Previous value will only show on an Unicode terminal)\n");
123 do_test("rval 1", mpdm_rval(v
) == 3.1416);
124 do_test("ival 1", mpdm_ival(v
) == 3);
126 v
= MPDM_R(777777.0 / 2.0);
128 do_test("mpdm_rnew 1", mpdm_cmp(v
, MPDM_LS(L
"388888.5")) == 0);
130 v
= MPDM_R(388888.500);
132 do_test("mpdm_rnew 2", mpdm_cmp(v
, MPDM_LS(L
"388888.5")) == 0);
134 v
= MPDM_R(388888.412);
136 do_test("mpdm_rnew 3", mpdm_cmp(v
, MPDM_LS(L
"388888.412")) == 0);
138 v
= MPDM_R(388888.6543);
140 do_test("mpdm_rnew 4", mpdm_cmp(v
, MPDM_LS(L
"388888.6543")) == 0);
142 v
= MPDM_R(388888.0);
144 do_test("mpdm_rnew 5", mpdm_cmp(v
, MPDM_LS(L
"388888")) == 0);
146 v
= MPDM_R(0.050000);
148 do_test("mpdm_rnew 6", mpdm_cmp(v
, MPDM_LS(L
"0.05")) == 0);
152 do_test("mpdm_rnew 7", mpdm_cmp(v
, MPDM_LS(L
"0")) == 0);
154 v
= MPDM_LS(L
"0177");
155 do_test("mpdm_ival() for octal numbers", mpdm_ival(v
) == 0x7f);
157 v
= MPDM_LS(L
"0xFF");
158 do_test("mpdm_ival() for hexadecimal numbers", mpdm_ival(v
) == 255);
161 do_test("mpdm_rval() for octal numbers", mpdm_rval(v
) == 1.0);
163 v
= MPDM_LS(L
"0x7f");
164 do_test("mpdm_rval() for hexadecimal numbers", mpdm_ival(v
) == 127.0);
166 do_test("Two NULLs are equal", mpdm_cmp(NULL
, NULL
) == 0);
169 mpdm_t
sort_cb(mpdm_t args
)
173 /* sorts reversely */
174 d
= mpdm_cmp(mpdm_aget(args
, 1), mpdm_aget(args
, 0));
179 void test_array(void)
186 do_test("a->size == 0", (a
->size
== 0));
188 mpdm_push(a
, MPDM_LS(L
"sunday"));
189 mpdm_push(a
, MPDM_LS(L
"monday"));
190 mpdm_push(a
, MPDM_LS(L
"tuesday"));
191 mpdm_push(a
, MPDM_LS(L
"wednesday"));
192 mpdm_push(a
, MPDM_LS(L
"thursday"));
193 mpdm_push(a
, MPDM_LS(L
"friday"));
194 mpdm_push(a
, MPDM_LS(L
"saturday"));
196 do_test("a->size == 7", (a
->size
== 7));
198 v
= mpdm_aset(a
, NULL
, 3);
199 do_test("v->ref == 0", (v
->ref
== 0));
203 do_test("NULLs are sorted on top", (mpdm_aget(a
, 0) == NULL
));
207 do_test("v is referenced again", (v
!= NULL
&& v
->ref
> 0));
210 do_test("mpdm_asort() works (1)",
211 mpdm_cmp(mpdm_aget(a
,0), MPDM_LS(L
"friday")) == 0);
212 do_test("mpdm_asort() works (2)",
213 mpdm_cmp(mpdm_aget(a
,6), MPDM_LS(L
"wednesday")) == 0);
215 /* asort_cb sorts reversely */
216 a
= mpdm_sort_cb(a
, 1, MPDM_X(sort_cb
));
218 do_test("mpdm_asort_cb() works (1)",
219 mpdm_cmp(mpdm_aget(a
,6), MPDM_LS(L
"friday")) == 0);
220 do_test("mpdm_asort_cb() works (2)",
221 mpdm_cmp(mpdm_aget(a
,0), MPDM_LS(L
"wednesday")) == 0);
225 mpdm_collapse(a
, 3, 1);
226 do_test("acollapse unrefs values", (v
->ref
< n
));
231 /* add several values */
232 for(n
= 0;n
< 10;n
++)
233 v
= mpdm_queue(a
, MPDM_I(n
), 10);
235 do_test("queue should still output NULL", (v
== NULL
));
237 v
= mpdm_queue(a
, MPDM_I(11), 10);
238 do_test("queue should no longer output NULL", (v
!= NULL
));
240 v
= mpdm_queue(a
, MPDM_I(12), 10);
241 do_test("queue should return 1", mpdm_ival(v
) == 1);
242 v
= mpdm_queue(a
, MPDM_I(13), 10);
243 do_test("queue should return 2", mpdm_ival(v
) == 2);
244 do_test("queue size should be 10", a
->size
== 10);
247 v
= mpdm_queue(a
, MPDM_I(14), 5);
250 do_test("queue size should be 5", a
->size
== 5);
251 do_test("last taken value should be 8", mpdm_ival(v
) == 8);
254 mpdm_aset(a
, MPDM_I(666), 6000);
256 do_test("array should have been automatically expanded",
257 mpdm_size(a
) == 6001);
259 v
= mpdm_aget(a
, -1);
260 do_test("negative offsets in arrays 1", mpdm_ival(v
) == 666);
262 mpdm_aset(a
, MPDM_I(777), -2);
263 v
= mpdm_aget(a
, 5999);
264 do_test("negative offsets in arrays 2", mpdm_ival(v
) == 777);
266 mpdm_push(a
, MPDM_I(888));
267 v
= mpdm_aget(a
, -1);
268 do_test("negative offsets in arrays 3", mpdm_ival(v
) == 888);
271 mpdm_push(v
, MPDM_I(100));
274 /* array comparisons with mpdm_cmp() */
276 mpdm_aset(a
, MPDM_I(10), 0);
277 mpdm_aset(a
, MPDM_I(60), 1);
280 do_test("mpdm_cmp: array clones are equal", mpdm_cmp(a
, v
) == 0);
283 do_test("mpdm_cmp: shorter arrays are lesser", mpdm_cmp(a
, v
) > 0);
285 mpdm_push(v
, MPDM_I(80));
286 do_test("mpdm_cmp: 2# element is bigger, so array is bigger", mpdm_cmp(a
, v
) < 0);
298 do_test("hsize 1", mpdm_hsize(h
) == 0);
300 mpdm_hset(h
, MPDM_S(L
"mp"), MPDM_I(6));
301 v
= mpdm_hget(h
, MPDM_S(L
"mp"));
303 do_test("hsize 2", mpdm_hsize(h
) == 1);
305 do_test("hash: v != NULL", (v
!= NULL
));
307 do_test("hash: v == 6", (i
== 6));
309 mpdm_hset(h
, MPDM_S(L
"mp2"), MPDM_I(66));
310 v
= mpdm_hget(h
, MPDM_S(L
"mp2"));
312 do_test("hsize 3", mpdm_hsize(h
) == 2);
314 do_test("hash: v != NULL", (v
!= NULL
));
316 do_test("hash: v == 66", (i
== 66));
318 /* fills 100 values */
319 for(n
= 0;n
< 50;n
++)
320 mpdm_hset(h
, MPDM_I(n
), MPDM_I(n
* 10));
321 for(n
= 100;n
>= 50;n
--)
322 mpdm_hset(h
, MPDM_I(n
), MPDM_I(n
* 10));
324 do_test("hsize 4", mpdm_hsize(h
) == 103);
326 /* tests 100 values */
327 for(n
= 0;n
< 100;n
++)
329 v
= mpdm_hget(h
, MPDM_I(n
));
335 do_test("hash: ival", (i
== n
* 10));
338 do_test("hash: hget", (v
!= NULL
));
341 printf("h's size: %d\n", mpdm_hsize(h
));
343 v
= mpdm_hdel(h
, MPDM_LS(L
"mp"));
344 do_test("hdel", mpdm_ival(v
) == 6);
345 do_test("hsize 5", mpdm_hsize(h
) == 102);
353 /* use of non-strings as hashes */
357 mpdm_hset(h
, v
, MPDM_I(1234));
359 mpdm_hset(h
, v
, MPDM_I(12345));
361 mpdm_hset(h
, v
, MPDM_I(9876));
363 mpdm_hset(h
, v
, MPDM_I(6543));
364 i
= mpdm_ival(mpdm_hget(h
, v
));
367 do_test("hash: using non-strings as hash keys", (i
== 6543));
369 mpdm_hset(h
, MPDM_LS(L
"ok"), MPDM_I(666));
371 do_test("exists 1", mpdm_exists(h
, MPDM_LS(L
"ok")));
372 do_test("exists 2", ! mpdm_exists(h
, MPDM_LS(L
"notok")));
374 v
= mpdm_hget_s(h
, L
"ok");
375 do_test("hget_s 1", mpdm_ival(v
) == 666);
377 mpdm_hset_s(h
, L
"ok", MPDM_I(777));
379 v
= mpdm_hget_s(h
, L
"ok");
380 do_test("hget_s + hset_s", mpdm_ival(v
) == 777);
384 void test_splice(void)
389 w
= mpdm_splice(MPDM_LS(L
"I'm agent Johnson"),
390 MPDM_LS(L
"special "), 4, 0);
391 do_test("splice insertion",
392 mpdm_cmp(mpdm_aget(w
, 0),
393 MPDM_LS(L
"I'm special agent Johnson")) == 0);
396 w
= mpdm_splice(MPDM_LS(L
"Life is a shit"), MPDM_LS(L
"cheat"), 10, 4);
397 do_test("splice insertion and deletion (1)",
398 mpdm_cmp(mpdm_aget(w
, 0), MPDM_LS(L
"Life is a cheat")) == 0);
399 do_test("splice insertion and deletion (2)",
400 mpdm_cmp(mpdm_aget(w
, 1), MPDM_LS(L
"shit")) == 0);
403 w
= mpdm_splice(MPDM_LS(L
"I'm with dumb"), NULL
, 4, 4);
404 do_test("splice deletion (1)",
405 mpdm_cmp(mpdm_aget(w
, 0), MPDM_LS(L
"I'm dumb")) == 0);
406 do_test("splice deletion (2)",
407 mpdm_cmp(mpdm_aget(w
, 1), MPDM_LS(L
"with")) == 0);
410 v
= MPDM_LS(L
"It doesn't matter");
411 w
= mpdm_splice(v
, MPDM_LS(L
" two"), v
->size
, 0);
412 do_test("splice insertion at the end",
413 mpdm_cmp(mpdm_aget(w
, 0),
414 MPDM_LS(L
"It doesn't matter two")) == 0);
417 w
= mpdm_splice(NULL
, NULL
, 0, 0);
418 do_test("splice with two NULLS", (mpdm_aget(w
, 0) == NULL
));
420 w
= mpdm_splice(NULL
, MPDM_LS(L
"foo"), 0, 0);
421 do_test("splice with first value NULL",
422 (mpdm_cmp(mpdm_aget(w
, 0), MPDM_LS(L
"foo")) == 0));
424 w
= mpdm_splice(MPDM_LS(L
"foo"), NULL
, 0, 0);
425 do_test("splice with second value NULL",
426 (mpdm_cmp(mpdm_aget(w
, 0), MPDM_LS(L
"foo")) == 0));
428 v
= MPDM_LS(L
"I'm testing");
430 w
= mpdm_splice(v
, NULL
, 0, -1);
431 do_test("splice with negative del (1)",
432 (mpdm_cmp(mpdm_aget(w
, 0), MPDM_LS(L
"")) == 0));
434 w
= mpdm_splice(v
, NULL
, 4, -1);
435 do_test("splice with negative del (2)",
436 (mpdm_cmp(mpdm_aget(w
, 0), MPDM_LS(L
"I'm ")) == 0));
438 w
= mpdm_splice(v
, NULL
, 4, -2);
439 do_test("splice with negative del (3)",
440 (mpdm_cmp(mpdm_aget(w
, 0), MPDM_LS(L
"I'm g")) == 0));
442 w
= mpdm_splice(v
, NULL
, 0, -4);
443 do_test("splice with negative del (4)",
444 (mpdm_cmp(mpdm_aget(w
, 0), MPDM_LS(L
"ing")) == 0));
445 mpdm_dump(mpdm_aget(w
, 0));
447 w
= mpdm_splice(v
, NULL
, 4, -20);
448 do_test("splice with out-of-bounds negative del",
449 (mpdm_cmp(mpdm_aget(w
, 0), MPDM_LS(L
"I'm testing")) == 0));
453 void test_strcat(void)
458 w
= MPDM_LS(L
"something");
460 v
= mpdm_strcat(NULL
, NULL
);
461 do_test("mpdm_strcat(NULL, NULL) returns NULL", v
== NULL
);
463 v
= mpdm_strcat(NULL
, w
);
464 do_test("mpdm_strcat(NULL, w) returns w", mpdm_cmp(v
, w
) == 0);
466 v
= mpdm_strcat(w
, NULL
);
467 do_test("mpdm_strcat(w, NULL) returns w", mpdm_cmp(v
, w
) == 0);
470 v
= mpdm_strcat(NULL
, w
);
471 do_test("mpdm_strcat(NULL, \"\") returns \"\"", mpdm_cmp(v
, w
) == 0);
473 v
= mpdm_strcat(w
, NULL
);
474 do_test("mpdm_strcat(\"\", NULL) returns \"\"", mpdm_cmp(v
, w
) == 0);
476 v
= mpdm_strcat(w
, w
);
477 do_test("mpdm_strcat(\"\", \"\") returns \"\"", mpdm_cmp(v
, w
) == 0);
482 void test_split(void)
486 printf("mpdm_split test\n\n");
488 w
= mpdm_split(MPDM_S(L
"."), MPDM_S(L
"four.elems.in.string"));
490 do_test("4 elems: ", (w
->size
== 4));
492 w
= mpdm_split(MPDM_S(L
"."), MPDM_S(L
"unseparated string"));
494 do_test("1 elem: ", (w
->size
== 1));
496 w
= mpdm_split(MPDM_S(L
"."), MPDM_S(L
".dot.at start"));
498 do_test("3 elems: ", (w
->size
== 3));
500 w
= mpdm_split(MPDM_S(L
"."), MPDM_S(L
"dot.at end."));
502 do_test("3 elems: ", (w
->size
== 3));
504 w
= mpdm_split(MPDM_S(L
"."), MPDM_S(L
"three...dots (two empty elements)"));
506 do_test("4 elems: ", (w
->size
== 4));
508 w
= mpdm_split(MPDM_S(L
"."), MPDM_S(L
"."));
510 do_test("2 elems: ", (w
->size
== 2));
512 w
= mpdm_split(NULL
, MPDM_S(L
"I am the man"));
513 do_test("NULL split 1: ", mpdm_size(w
) == 12);
514 do_test("NULL split 2: ", mpdm_cmp(mpdm_aget(w
, 0), MPDM_LS(L
"I")) == 0);
524 printf("mpdm_join test\n\n");
530 mpdm_aset(w
, MPDM_S(L
"ce"), 0);
532 v
= mpdm_join(NULL
, w
);
533 do_test("1 elem, no separator", (mpdm_cmp(v
, MPDM_LS(L
"ce")) == 0));
536 do_test("1 elem, '--' separator", (mpdm_cmp(v
, MPDM_LS(L
"ce")) == 0));
538 mpdm_push(w
, MPDM_LS(L
"n'est"));
540 do_test("2 elems, '--' separator", (mpdm_cmp(v
, MPDM_LS(L
"ce--n'est")) == 0));
542 mpdm_push(w
, MPDM_LS(L
"pas"));
544 do_test("3 elems, '--' separator", (mpdm_cmp(v
, MPDM_LS(L
"ce--n'est--pas")) == 0));
546 v
= mpdm_join(NULL
, w
);
547 do_test("3 elems, no separator", (mpdm_cmp(v
, MPDM_LS(L
"cen'estpas")) == 0));
556 printf("mpdm_sset / mpdm_sget tests\n\n");
558 mpdm_sset(NULL
, MPDM_LS(L
"mp"), MPDM_H(7));
559 mpdm_sset(NULL
, MPDM_LS(L
"mp.config"), MPDM_H(7));
560 mpdm_sset(NULL
, MPDM_LS(L
"mp.config.auto_indent"), MPDM_I(16384));
561 mpdm_sset(NULL
, MPDM_LS(L
"mp.config.use_regex"), MPDM_I(1357));
562 mpdm_sset(NULL
, MPDM_LS(L
"mp.config.gtk_font_face"), MPDM_LS(L
"profontwindows"));
563 mpdm_sset(NULL
, MPDM_LS(L
"mp.lines"), MPDM_A(2));
564 mpdm_sset(NULL
, MPDM_LS(L
"mp.lines.0"), MPDM_LS(L
"First post!"));
565 mpdm_sset(NULL
, MPDM_LS(L
"mp.lines.1"), MPDM_LS(L
"Second post!"));
566 mpdm_dump(mpdm_root());
568 v
= mpdm_sget(NULL
, MPDM_LS(L
"mp.config.auto_indent"));
571 do_test("auto_indent == 16384", (i
== 16384));
581 mpdm_t eol
= MPDM_LS(L
"\n");
583 f
= mpdm_open(MPDM_LS(L
"test.txt"), MPDM_LS(L
"w"));
587 printf("Can't create test.txt; no further file tests possible.\n");
591 do_test("Create test.txt", f
!= NULL
);
593 mpdm_write(f
, MPDM_LS(L
"0"));
595 mpdm_write(f
, MPDM_LS(L
"1"));
598 /* write WITHOUT eol */
599 mpdm_write(f
, MPDM_LS(L
"2"));
603 f
= mpdm_open(MPDM_LS(L
"test.txt"), MPDM_LS(L
"r"));
605 do_test("test written file 0", mpdm_cmp(mpdm_read(f
), MPDM_LS(L
"0\n")) == 0);
606 do_test("test written file 1", mpdm_cmp(mpdm_read(f
), MPDM_LS(L
"1\n")) == 0);
607 do_test("test written file 2", mpdm_cmp(mpdm_read(f
), MPDM_LS(L
"2")) == 0);
608 do_test("test written file 3", mpdm_read(f
) == NULL
);
612 mpdm_unlink(MPDM_LS(L
"test.txt"));
613 do_test("unlink", mpdm_open(MPDM_LS(L
"test.txt"), MPDM_LS(L
"r")) == NULL
);
615 v
= mpdm_stat(MPDM_LS(L
"stress.c"));
616 printf("Stat from stress.c:\n");
619 /* v=mpdm_glob(MPDM_LS(L"*"));*/
626 void test_regex(void)
631 v
= mpdm_regex(MPDM_LS(L
"/[0-9]+/"), MPDM_LS(L
"123456"), 0);
632 do_test("regex 0", v
!= NULL
);
634 v
= mpdm_regex(MPDM_LS(L
"/[0-9]+/"), MPDM_I(65536), 0);
635 do_test("regex 1", v
!= NULL
);
637 v
= mpdm_regex(MPDM_LS(L
"/^[0-9]+$/"), MPDM_LS(L
"12345678"), 0);
638 do_test("regex 2", v
!= NULL
);
640 v
= mpdm_regex(MPDM_LS(L
"/^[0-9]+$/"), MPDM_I(1), 0);
641 do_test("regex 3", v
!= NULL
);
643 v
= mpdm_regex(MPDM_LS(L
"/^[0-9]+$/"), MPDM_LS(L
"A12345-678"), 0);
644 do_test("regex 4", v
== NULL
);
646 w
= MPDM_LS(L
"Hell street, 666");
647 v
= mpdm_regex(MPDM_LS(L
"/[0-9]+/"), w
, 0);
648 do_test("regex 5", mpdm_cmp(v
, MPDM_I(666)) == 0);
652 v
= mpdm_regex(MPDM_LS(L
"/regex/"), MPDM_LS(L
"CASE-INSENSITIVE REGEX"), 0);
653 do_test("regex 6.1 (case sensitive)", v
== NULL
);
655 v
= mpdm_regex(MPDM_LS(L
"/regex/i"), MPDM_LS(L
"CASE-INSENSITIVE REGEX"), 0);
656 do_test("regex 6.2 (case insensitive)", v
!= NULL
);
658 v=mpdm_regex(MPDM_LS(L"/[A-Z]+/"), MPDM_LS(L"case SENSITIVE regex"), 0);
659 do_test("regex 6.3 (case sensitive)", mpdm_cmp(v, MPDM_LS(L"SENSITIVE")) == 0);
661 v
= mpdm_regex(MPDM_LS(L
"/^\\s*/"), MPDM_LS(L
"123456"), 0);
662 do_test("regex 7", v
!= NULL
);
664 v
= mpdm_regex(MPDM_LS(L
"/^\\s+/"), MPDM_LS(L
"123456"), 0);
665 do_test("regex 8", v
== NULL
);
667 v
= mpdm_regex(MPDM_LS(L
"/^\\s+/"), NULL
, 0);
668 do_test("regex 9 (NULL string to match)", v
== NULL
);
672 v
= mpdm_sregex(MPDM_LS(L
"/A/"),MPDM_LS(L
"change all A to A"),
674 do_test("sregex 0", mpdm_cmp(v
, MPDM_LS(L
"change all E to A")) == 0);
676 v
= mpdm_sregex(MPDM_LS(L
"/A/g"),MPDM_LS(L
"change all A to A"),
678 do_test("sregex 1", mpdm_cmp(v
, MPDM_LS(L
"change all E to E")) == 0);
680 v
= mpdm_sregex(MPDM_LS(L
"/A+/g"),MPDM_LS(L
"change all AAAAAA to E"),
682 do_test("sregex 2", mpdm_cmp(v
, MPDM_LS(L
"change all E to E")) == 0);
684 v
= mpdm_sregex(MPDM_LS(L
"/A+/g"),MPDM_LS(L
"change all A A A A A A to E"),
686 do_test("sregex 3", mpdm_cmp(v
, MPDM_LS(L
"change all E E E E E E to E")) == 0);
688 v
= mpdm_sregex(MPDM_LS(L
"/A+/g"),MPDM_LS(L
"change all AAA A AA AAAAA A AAA to E"),
690 do_test("sregex 3.2", mpdm_cmp(v
, MPDM_LS(L
"change all E E E E E E to E")) == 0);
692 v
= mpdm_sregex(MPDM_LS(L
"/[0-9]+/g"),MPDM_LS(L
"1, 20, 333, 40 all are numbers"),
693 MPDM_LS(L
"numbers"),0);
694 do_test("sregex 4", mpdm_cmp(v
, MPDM_LS(L
"numbers, numbers, numbers, numbers all are numbers")) == 0);
696 v
= mpdm_sregex(MPDM_LS(L
"/[a-zA-Z_]+/g"),MPDM_LS(L
"regex, mpdm_regex, TexMex"),
698 do_test("sregex 5", mpdm_cmp(v
, MPDM_LS(L
"sex, sex, sex")) == 0);
700 v
= mpdm_sregex(MPDM_LS(L
"/[a-zA-Z]+/g"),MPDM_LS(L
"regex, mpdm_regex, TexMex"),
702 do_test("sregex 6", mpdm_cmp(v
, MPDM_LS(L
", _, ")) == 0);
704 v
= mpdm_sregex(MPDM_LS(L
"/\\\\/g"),MPDM_LS(L
"\\MSDOS\\style\\path"),
706 do_test("sregex 7", mpdm_cmp(v
, MPDM_LS(L
"/MSDOS/style/path")) == 0);
708 v
= mpdm_sregex(MPDM_LS(L
"/regex/gi"),MPDM_LS(L
"regex, Regex, REGEX"),
710 do_test("sregex 8", mpdm_cmp(v
, MPDM_LS(L
"sex, sex, sex")) == 0);
712 v
= mpdm_sregex(NULL
, NULL
, NULL
, 0);
713 do_test("Previous sregex substitutions must be 3", mpdm_ival(v
) == 3);
715 /* & in substitution tests */
716 v
= MPDM_LS(L
"this string has many words");
717 v
= mpdm_sregex(MPDM_LS(L
"/[a-z]+/g"), v
, MPDM_LS(L
"[&]"), 0);
718 do_test("& in sregex target", mpdm_cmp(v
, MPDM_LS(L
"[this] [string] [has] [many] [words]")) == 0);
720 v
= MPDM_LS(L
"this string has many words");
721 v
= mpdm_sregex(MPDM_LS(L
"/[a-z]+/g"), v
, MPDM_LS(L
"[\\&]"), 0);
722 do_test("escaped & in sregex target", mpdm_cmp(v
, MPDM_LS(L
"[&] [&] [&] [&] [&]")) == 0);
724 /* multiple regex tests */
727 mpdm_push(w
, MPDM_LS(L
"/^[ \t]*/"));
728 mpdm_push(w
, MPDM_LS(L
"/[^ \t=]+/"));
729 mpdm_push(w
, MPDM_LS(L
"/[ \t]*=[ \t]*/"));
730 mpdm_push(w
, MPDM_LS(L
"/[^ \t]+/"));
731 mpdm_push(w
, MPDM_LS(L
"/[ \t]*$/"));
733 v
= mpdm_regex(w
, MPDM_LS(L
"key=value"), 0);
734 do_test("multi-regex 1.1", mpdm_cmp(mpdm_aget(v
, 1),MPDM_LS(L
"key")) == 0);
735 do_test("multi-regex 1.2", mpdm_cmp(mpdm_aget(v
, 3),MPDM_LS(L
"value")) == 0);
737 v
= mpdm_regex(w
, MPDM_LS(L
" key = value"), 0);
738 do_test("multi-regex 2.1", mpdm_cmp(mpdm_aget(v
, 1),MPDM_LS(L
"key")) == 0);
739 do_test("multi-regex 2.2", mpdm_cmp(mpdm_aget(v
, 3),MPDM_LS(L
"value")) == 0);
741 v
= mpdm_regex(w
, MPDM_LS(L
"\t\tkey\t=\tvalue "), 0);
742 do_test("multi-regex 3.1", mpdm_cmp(mpdm_aget(v
, 1),MPDM_LS(L
"key")) == 0);
743 do_test("multi-regex 3.2", mpdm_cmp(mpdm_aget(v
, 3),MPDM_LS(L
"value")) == 0);
745 v
= mpdm_regex(w
, MPDM_LS(L
"key= "), 0);
746 do_test("multi-regex 4", v
== NULL
);
748 printf("Multiple line regexes\n");
749 w
= MPDM_LS(L
"/* this is\na C-like comment */");
750 v
= mpdm_regex(MPDM_LS(L
"|/\\*.+\\*/|"), w
, 0);
751 do_test("Multiline regex 1", mpdm_cmp(v
, w
) == 0);
753 v
= mpdm_regex(MPDM_LS(L
"/is$/"), w
, 0);
754 do_test("Multiline regex 2", v
== NULL
);
756 v
= mpdm_regex(MPDM_LS(L
"/is$/m"), w
, 0);
757 do_test("Multiline regex 3", mpdm_cmp(v
, MPDM_LS(L
"is")) == 0);
759 printf("Pitfalls on multibyte locales (f.e. utf-8)\n");
761 w
= MPDM_LS(L
"-\x03a9-");
763 v
= mpdm_regex(MPDM_LS(L
"/-$/"), w
, 0);
764 do_test("Multibyte environment regex 1",
765 mpdm_cmp(v
, MPDM_LS(L
"-")) == 0);
767 if(do_multibyte_sregex_tests
)
769 v
= mpdm_sregex(MPDM_LS(L
"/-$/"), w
, MPDM_LS(L
"~"), 0);
770 do_test("Multibyte environment sregex 1",
771 mpdm_cmp(v
, MPDM_LS(L
"-\x03a9~")) == 0);
773 v
= mpdm_sregex(MPDM_LS(L
"/-/g"), w
, MPDM_LS(L
"~"), 0);
774 do_test("Multibyte environment sregex 2",
775 mpdm_cmp(v
, MPDM_LS(L
"~\x03a9~")) == 0);
778 printf("Multibyte sregex test omitted; activate with -m\n");
780 /* 'last' flag tests */
781 v
= MPDM_LS(L
"this string has many words");
782 v
= mpdm_regex(MPDM_LS(L
"/[a-z]+/l"), v
, 0);
783 do_test("Flag l in mpdm_regex", mpdm_cmp(v
, MPDM_LS(L
"words")) == 0);
787 static mpdm_t
dumper(mpdm_t args
)
788 /* executable value */
795 static mpdm_t
sum(mpdm_t args
)
796 /* executable value: sum all args */
802 for(n
= t
= 0;n
< args
->size
;n
++)
803 t
+= mpdm_ival(mpdm_aget(args
, n
));
810 static mpdm_t
calculator(mpdm_t c
, mpdm_t args
)
811 /* 2 argument version: calculator. c contains a 'script' to
812 do things with the arguments */
819 /* to avoid destroying args */
820 a
= mpdm_clone(args
);
822 /* unshift first argument */
826 for(n
= 0;n
< mpdm_size(c
);n
++)
831 /* gets next value */
834 switch(*(wchar_t *)o
->data
)
836 case '+': t
+= mpdm_ival(v
); break;
837 case '-': t
-= mpdm_ival(v
); break;
838 case '*': t
*= mpdm_ival(v
); break;
839 case '/': t
/= mpdm_ival(v
); break;
853 printf("test_exec\n");
863 mpdm_aset(w
, MPDM_I(100), 0);
864 mpdm_aset(w
, MPDM_I(220), 1);
865 mpdm_aset(w
, MPDM_I(333), 2);
867 do_test("exec 0", mpdm_ival(mpdm_exec(x
, w
)) == 653);
869 mpdm_push(w
, MPDM_I(1));
871 /* multiple executable value: vm and compiler support */
873 /* calculator 'script' */
875 mpdm_push(p
, MPDM_LS(L
"+"));
876 mpdm_push(p
, MPDM_LS(L
"-"));
877 mpdm_push(p
, MPDM_LS(L
"+"));
881 x
->flags
|= MPDM_EXEC
;
883 mpdm_aset(x
, MPDM_X(calculator
), 0);
886 do_test("exec 1", mpdm_ival(mpdm_exec(x
, w
)) == -12);
888 /* another 'script', different operations with the same values */
890 mpdm_push(p
, MPDM_LS(L
"*"));
891 mpdm_push(p
, MPDM_LS(L
"/"));
892 mpdm_push(p
, MPDM_LS(L
"+"));
896 do_test("exec 2", mpdm_ival(mpdm_exec(x
, w
)) == 67);
900 void test_encoding(void)
907 v
= MPDM_MBS("?Espa?a!\n");
909 printf("\nLocale encoding tests (will look bad if terminal is not ISO-8859-1)\n\n");
911 if((f
= mpdm_open(MPDM_LS(L
"test.txt"), MPDM_LS(L
"w"))) == NULL
)
913 printf("Can't write test.txt; no further file test possible.\n");
920 f
= mpdm_open(MPDM_LS(L
"test.txt"), MPDM_LS(L
"r"));
923 do_test("Locale encoding", mpdm_cmp(w
, v
) == 0);
926 printf("\nutf8.txt loading (should look good only in UTF-8 terminals with good fonts)\n");
928 f
= mpdm_open(MPDM_LS(L
"utf8.txt"), MPDM_LS(L
"r"));
933 for(ptr
= w
->data
;*ptr
!= L
'\0';ptr
++)
934 printf("%d", mpdm_wcwidth(*ptr
));
937 if(mpdm_encoding(MPDM_LS(L
"UTF-8")) < 0)
939 printf("No multiple encoding (iconv) support; no more tests possible.\n");
943 printf("\nForced utf8.txt loading (should look good only in UTF-8 terminals with good fonts)\n");
945 f
= mpdm_open(MPDM_LS(L
"utf8.txt"), MPDM_LS(L
"r"));
950 /* new open file will use the specified encoding */
951 f
= mpdm_open(MPDM_LS(L
"test.txt"), MPDM_LS(L
"w"));
955 f
= mpdm_open(MPDM_LS(L
"test.txt"), MPDM_LS(L
"r"));
958 do_test("iconv encoding", mpdm_cmp(w
, v
) == 0);
965 void test_gettext(void)
970 printf("\nTesting gettext...\n");
972 mpdm_gettext_domain(MPDM_LS(L
"stress"), MPDM_LS(L
"./po"));
974 printf("Should follow a translated string of 'This is a test string':\n");
975 v
= mpdm_gettext(MPDM_LS(L
"This is a test string"));
978 printf("The same, but cached:\n");
979 v
= mpdm_gettext(MPDM_LS(L
"This is a test string"));
982 v
= mpdm_gettext(MPDM_LS(L
"This string is not translated"));
985 printf("Ad-hoc translation hash:\n");
987 mpdm_hset(h
, MPDM_LS(L
"test string"), MPDM_LS(L
"cadena de prueba"));
989 mpdm_gettext_domain(MPDM_LS(L
"stress"), h
);
990 v
= mpdm_gettext(MPDM_LS(L
"test string"));
997 static clock_t clks
= 0;
1006 printf("%.2f seconds\n",
1007 (float)(clock() - clks
)/(float)CLOCKS_PER_SEC
);
1013 void bench_hash(int i
, mpdm_t l
, int buckets
)
1019 printf("Hash of %d buckets: \n", buckets
);
1020 h
= MPDM_H(buckets
);
1023 for(n
= 0;n
< i
;n
++)
1025 v
= mpdm_aget(l
, n
);
1030 printf("Bucket usage:\n");
1031 for(n=0;n < mpdm_size(h);n++)
1032 printf("\t%d: %d\n", n, mpdm_size(mpdm_aget(h, n)));
1038 void benchmark(void)
1048 printf("Skipping benchmarks\nRun them with 'stress -b'\n");
1052 printf("BENCHMARKS\n");
1056 printf("Creating %d values...\n", i
);
1058 l
= mpdm_ref(MPDM_A(i
));
1059 for(n
= 0;n
< i
;n
++)
1061 sprintf(tmp
,"%08x",n
);
1062 /* mpdm_aset(l, MPDM_MBS(tmp), n);*/
1063 mpdm_aset(l
, MPDM_I(n
), n
);
1068 bench_hash(i
, l
, 0);
1069 bench_hash(i
, l
, 61);
1070 bench_hash(i
, l
, 89);
1071 bench_hash(i
, l
, 127);
1077 void test_conversion(void)
1079 wchar_t * wptr
= NULL
;
1083 ptr
= mpdm_wcstombs(L
"", &size
);
1084 do_test("mpdm_wcstombs converts an empty string", ptr
!= NULL
);
1086 wptr
= mpdm_mbstowcs("", &size
, 0);
1087 do_test("mpdm_mbstowcs converts an empty string", wptr
!= NULL
);
1091 void test_pipes(void)
1097 if((f
= mpdm_popen(MPDM_LS(L
"date"), MPDM_LS(L
"r"))) != NULL
)
1104 printf("Pipe from 'date':\n");
1108 printf("Can't pipe to 'date'\n");
1112 void test_misc(void)
1114 printf("Home dir:\n");
1115 mpdm_dump(mpdm_home_dir());
1116 printf("App dir:\n");
1117 mpdm_dump(mpdm_app_dir());
1121 void test_sprintf(void)
1126 printf("sprintf tests\n");
1129 mpdm_push(v
, MPDM_I(100));
1130 mpdm_push(v
, MPDM_LS(L
"beers"));
1132 w
= mpdm_sprintf(MPDM_LS(L
"%d %s for me"), v
);
1133 do_test("sprintf 1", mpdm_cmp(w
, MPDM_LS(L
"100 beers for me")) == 0);
1135 w
= mpdm_sprintf(MPDM_LS(L
"%d %s for me %d"), v
);
1136 do_test("sprintf 2", mpdm_cmp(w
, MPDM_LS(L
"100 beers for me %d")) == 0);
1138 w
= mpdm_sprintf(MPDM_LS(L
"%10d %s for me"), v
);
1139 do_test("sprintf 3", mpdm_cmp(w
, MPDM_LS(L
" 100 beers for me")) == 0);
1141 w
= mpdm_sprintf(MPDM_LS(L
"%010d %s for me"), v
);
1142 do_test("sprintf 4", mpdm_cmp(w
, MPDM_LS(L
"0000000100 beers for me")) == 0);
1145 mpdm_push(v
, MPDM_R(3.1416));
1147 w
= mpdm_sprintf(MPDM_LS(L
"Value for PI is %6.4f"), v
);
1148 do_test("sprintf 2.1", mpdm_cmp(w
, MPDM_LS(L
"Value for PI is 3.1416")) == 0);
1150 w
= mpdm_sprintf(MPDM_LS(L
"Value for PI is %08.2f"), v
);
1151 do_test("sprintf 2.1", mpdm_cmp(w
, MPDM_LS(L
"Value for PI is 00003.14")) == 0);
1154 mpdm_push(v
, MPDM_LS(L
"stress"));
1156 w
= mpdm_sprintf(MPDM_LS(L
"This is a |%10s| test"), v
);
1157 do_test("sprintf 3.1", mpdm_cmp(w
, MPDM_LS(L
"This is a | stress| test")) == 0);
1159 w
= mpdm_sprintf(MPDM_LS(L
"This is a |%-10s| test"), v
);
1160 do_test("sprintf 3.2", mpdm_cmp(w
, MPDM_LS(L
"This is a |stress | test")) == 0);
1163 mpdm_push(v
, MPDM_I(0x263a));
1165 w
= mpdm_sprintf(MPDM_LS(L
"%c"), v
);
1166 do_test("sprintf 3.3", mpdm_cmp(w
, MPDM_LS(L
"\x263a")) == 0);
1172 mpdm_t v
= MPDM_S(L
"string");
1173 mpdm_t w
= mpdm_ulc(v
, 1);
1175 do_test("mpdm_ulc 1", mpdm_cmp(mpdm_ulc(v
, 1), w
) == 0);
1176 do_test("mpdm_ulc 2", mpdm_cmp(mpdm_ulc(w
, 0), v
) == 0);
1180 int main(int argc
, char * argv
[])
1184 if(strcmp(argv
[1], "-b") == 0)
1186 if(strcmp(argv
[1], "-m") == 0)
1187 do_multibyte_sregex_tests
= 1;
1213 /* mpdm_dump_unref();*/
1215 printf("memory: %d\n", mpdm
->memory_usage
);
1225 printf("memory: %d\n", mpdm
->memory_usage
);
1227 /* mpdm_dump_unref();*/
1231 printf("\n*** Total tests passed: %d/%d\n", oks
, tests
);
1234 printf("*** ALL TESTS PASSED\n");
1239 printf("*** %d %s\n", tests
- oks
, "TESTS ---FAILED---");
1241 printf("\nFailed tests:\n\n");
1242 for(n
= 0;n
< i_failed_msgs
;n
++)
1243 printf("%s", failed_msgs
[n
]);