add Markdown lib
[couchdbimport.git] / CouchProjects / Fabric / FabricTests / coretests.fab
blob5ee05d99c142246b4e1b3e432788d87537dbda51
1 \r
2 This is the file that gets parsed and run by the Fabric\r
3 test executable.\r
4 \r
5 Basic tests\r
6 \r
7 empty formula returns nil\r
8 \r
9 #formula\r
12 #results\r
14 %ret \r
16 -----------------------------\r
18 Basic tests\r
20 #formula\r
22 nil\r
24 #results\r
26 %ret \r
28 -----------------------------\r
30 #formula\r
32 1\r
34 #results\r
36 %ret 1\r
38 -----------------------------\r
40 #formula\r
42 0\r
44 #results\r
46 %ret 0\r
48 -----------------------------\r
50 #formula\r
52 2;\r
54 #results\r
56 %ret 2\r
58 -----------------------------\r
60 #formula\r
62 -1;\r
64 #results\r
66 %ret -1\r
68 -----------------------------\r
70 #formula\r
72 "";\r
74 #results\r
76 %ret ""\r
78 -----------------------------\r
80 #formula\r
82 "foo";\r
84 #results\r
86 %ret "foo"\r
88 -----------------------------\r
90 #formula\r
92 "he said \"foo\"";\r
94 #results\r
96 %ret "he said \"foo\""\r
98 -----------------------------\r
100 #formula\r
102 'he said "foo"';\r
104 #results\r
106 %ret "he said \"foo\""\r
108 -----------------------------\r
110 #formula\r
113 0;\r
115 #results\r
117 %ret 0\r
119 -----------------------------\r
121 #formula\r
123 true;\r
125 #results\r
127 %ret 1\r
129 -----------------------------\r
131 #formula\r
133 false;\r
135 #results\r
137 %ret 0\r
139 -----------------------------\r
141 Test List concatenation\r
143 #formula\r
145 1 : 2 : 3 : 5;\r
147 #results\r
149 %ret 1 2 3 5\r
151 -----------------------------\r
153 #formula\r
155 1 : 2 : 3 : 5 : nil;\r
157 #results\r
159 %ret 1 2 3 5\r
161 -----------------------------\r
163 #formula\r
165 nil : 1 : 2 : nil : 3 : 5 : nil;\r
167 #results\r
169 %ret 1 2 3 5\r
171 ------------ variable assignment and reference -----------------\r
173 #formula\r
175 foo := "x";\r
176 foo;\r
178 #results\r
180 %ret "x"\r
182 -----------------------------\r
184 #formula\r
186 foo := "x" : 1 : 2 : 3\r
187 foo\r
189 #results\r
191 %ret "x" 1 2 3 \r
193 -----------------------------\r
195 #formula\r
197 foo := "x" : 1 : 2 : 3\r
198 bar := foo\r
199 bar\r
201 #results\r
203 %ret "x" 1 2 3 \r
205 -----------------------------\r
207 #formula\r
209 foo := "some value";\r
210 foo := "x" : 1 : 2 : 3;\r
211 foo;\r
213 #results\r
215 %ret "x" 1 2 3 \r
217 -----------------------------\r
219 test result of assignment expression\r
221 #formula\r
223 foo := "x" : 1 : 2 : 3;\r
225 #results\r
227 %ret "x" 1 2 3 \r
229 --------------- Branching --------------\r
231 #formula\r
233 if (true) {\r
234         "foo";\r
235 };\r
237 #results\r
239 %ret "foo"\r
241 -----------------------------\r
243 #formula\r
245 if (false) {\r
246         "foo";\r
247 };\r
249 #results\r
251 %ret \r
253 -----------------------------\r
255 #formula\r
257 if (true) {\r
258         "foo";\r
259 } else {\r
260         "bar";\r
261 };\r
264 #results\r
266 %ret "foo"\r
268 -----------------------------\r
270 #formula\r
272 if (false) {\r
273         "foo";\r
274 } else {\r
275         "bar";\r
276 };\r
278 #results\r
280 %ret "bar"\r
282 -----------------------------\r
284 #formula\r
286 if (false) {\r
287         "foo";\r
288 } else if (true) {\r
289         "bar";\r
290 };\r
292 #results\r
294 %ret "bar"\r
296 -----------------------------\r
298 #formula\r
300 if (false) {\r
301         "foo";\r
302 } else if (false) {\r
303         "bar";\r
304 };\r
306 #results\r
308 %ret \r
310 -----------------------------\r
312 #formula\r
314 if (false) {\r
315         "foo";\r
316 } else if (false) {\r
317         "bar";\r
318 } else {\r
319         "baz";\r
320 };\r
322 #results\r
324 %ret "baz"\r
326 -----------------------------\r
328 #formula\r
330 if (true) {\r
331         "foo";\r
332 } else if (false) {\r
333         "bar";\r
334 } else {\r
335         "baz";\r
336 };\r
338 #results\r
340 %ret "foo"\r
342 -----------------------------\r
344 #formula\r
346 if (false) {\r
347         "foo";\r
348 } else if (true) {\r
349         "bar";\r
350 } else {\r
351         "baz";\r
352 };\r
354 #results\r
356 %ret "bar"\r
358 -----------------------------\r
360 #formula\r
362 if (false) {\r
363         "foo"\r
364 } else if (false) {\r
365         "foo"\r
366 } else if (false) {\r
367         "foo"\r
368 } else if (true) {\r
369         "bar"\r
372 #results\r
374 %ret "bar"\r
376 -----------------------------\r
378 #formula\r
380 if (false) {\r
381         "foo";\r
382 } else if (false) {\r
383         "foo";\r
384 } else if (false) {\r
385         "foo";\r
386 } else if (true) {\r
387         "bar";\r
388 } else if (false) {\r
389         "foo";\r
390 };\r
392 #results\r
394 %ret "bar"\r
396 -----------------------------\r
398 Short if form\r
400 #formula\r
402 ASSERT(_\r
403         if(true, "foo", true, "bar", "baz") == "foo",_\r
404         if(0, "foo", true, "bar", "baz") == "bar"_\r
405 );\r
407 -------------comparision operators----------------\r
409 #formula\r
411 ASSERT(_\r
412         "foo" == "foo",_\r
413         "foo" : "bar" == "foo" : "bar",_\r
414         nil == nil _\r
415 );\r
418 ASSERTFALSE(_\r
419         "foo" == "bar", _\r
420         "Foo" == "foo", _\r
421         "Foo" == "FOo", _\r
422         "foo" == nil, _\r
423         "foo" == "foo" : "bar",_\r
424         "foo" == "foo" : "foo",_\r
425         "bar" : "foo" == "foo" : "bar"_\r
426 );\r
428 ASSERT(_\r
429         "foo" != "bar",_\r
430         "foo" != nil,_\r
431         "foo" != "foo" : "bar", _\r
432         "foo" : "foo" != "foo" : "bar", _\r
433         "foo" : "bar" != "foo", _\r
434         "foo" : "foo" != "foo"_\r
435 );\r
437 ASSERTFALSE(_\r
438         "foo" != "foo",_\r
439         nil != nil _\r
440 );\r
441 -------------comparision operators----------------\r
443 #formula\r
445 x := "foo";\r
446 y := "y" : "foo";\r
447 z := "y" : "foo" : "bar";\r
449 ASSERT("foo" in x)\r
450 ASSERT("foo" in y)\r
451 ASSERT("foo" in z)\r
452 ASSERT(nil in z)\r
453 ASSERT(nil in nil)\r
454 ASSERTFALSE("zsdf" in x)\r
455 ASSERTFALSE("zsdf" in y)\r
456 ASSERTFALSE("zsdf" in Z)\r
457 ASSERTFALSE("zsdf" in nil)\r
460 ASSERT("y" : "foo" in y)\r
461 ASSERT("y" : "foo" in z)\r
462 ASSERT("foo" : "bar" in z)\r
464 ASSERTFALSE("y" : "foo" in x)\r
465 ASSERTFALSE("foo" : "y" in y)\r
466 ASSERTFALSE("foo" : "y" in z)\r
467 ASSERTFALSE("y" : "bar" in z)\r
471 -----------------------------\r
473 Case insensitive list match.\r
475 Returns index of first element in left list that \r
476 matches a element on the right\r
478 #formula\r
481 ASSERTFALSE(_\r
482         1 =^ "2",_\r
483         1 =^ "3" : "2"_\r
484  );\r
485  \r
486 ASSERT(_\r
487         "foo" =^ "foo",_\r
488         "foo" =^ "FOO",_\r
489         "fOo" =^ "FoO",_\r
490         "foo" =^ "foo" : "foo",_\r
491         "foo" =^ "FOO" : "FOO",_\r
492         "FOO" : "FOO" =^ "foo",_\r
493         1 =^ "1",_\r
494         1 : "2" =^ "1" : 2_\r
495 );\r
498 -----------------------------\r
499 #formula\r
501 ASSERT(_\r
502         1 < 2,_\r
503         1 < 1.0000000001,_\r
504         "1" < "2",_\r
505         "a" < "b",_\r
506         nil < "b" _\r
507 );\r
509 ASSERTFALSE(_\r
510         2 < 1,_\r
511         1 < 1,_\r
512         1.0000000001 < 1,_\r
513         "2" < "1",_\r
514         "1" < "1",_\r
515         "b" < "a",_\r
516         "b" < nil, _\r
517         nil < nil _\r
518 );\r
520 ASSERT(_\r
521         2 > 1,_\r
522         1.0000000001 > 1,_\r
523         "2" > "1",_\r
524         "b" > "a",_\r
525         "2" > "1",_\r
526         "1" > nil _\r
527 );\r
529 ASSERTFALSE(_\r
530         1 > 2,_\r
531         2 > 2,_\r
532         1 > 1.0000000001,_\r
533         "2"     > "2",_\r
534         "1"     > "2",_\r
535         "a" > "b",_\r
536         "$" > "1", _\r
537         "1" > "a1", _\r
538         nil > "a", _\r
539         nil > nil _\r
540 );\r
542 ASSERT(_\r
543         2 >= 1,_\r
544         2 >= 2,_\r
545         1.0000000001 >= 1,_\r
546         "2" >= "1",_\r
547         "2" >= "2",_\r
548         "b" >= "a",_\r
549         "2" >= "1",_\r
550         "2" >= "2",_\r
551         "1" >= nil, _\r
552         nil >= nil _\r
553 );\r
555 ASSERTFALSE(_\r
556         1 >= 2,_\r
557         1 >= 1.0000000001,_\r
558         "1"     >= "2",_\r
559         "a" >= "b",_\r
560         nil >= "a" _\r
561 );\r
563 ASSERT(_\r
564         1 <= 2,_\r
565         2 <= 2,_\r
566         1 <= 1.0000000001,_\r
567         "1" <= "2",_\r
568         "2" <= "2",_\r
569         "a" <= "b",_\r
570         "1" <= "2",_\r
571         "2" <= "2", _\r
572         nil <= "2"_\r
573 );\r
575 ASSERTFALSE(_\r
576         2 <= 1,_\r
577         1.0000000001 <= 1,_\r
578         "2"     <= "1",_\r
579         "b" <= "a"_\r
580 );\r
582 -----------------------------\r
584 Boolean Logic Operators\r
586 #formula\r
588 ASSERT(_\r
589         !0,_\r
590         !nil,_\r
591         !!1,_\r
592         !!2_\r
593 );\r
595 ASSERTFALSE(_\r
596         !1,_\r
597         !2,_\r
598         !!0,_\r
599         !!nil _\r
600 );\r
602 ASSERT(_\r
603         1 && 1,_\r
604         2 && 2_\r
605 );\r
608 ASSERTFALSE(_\r
609         1 && 0,_\r
610         0 && 2,_\r
611         0 && 0_\r
612 );\r
614 ASSERT(_\r
615         1 || 1,_\r
616         2 || 2,_\r
617         1 || 0,_\r
618         2 || 0,_\r
619         0 || 1,_\r
620         0 || 2_\r
624 ASSERTFALSE(_\r
625         0 || 0  _\r
626 );\r
628 // now lets test shortcircuit boolean evaluation\r
630 x := 0;\r
632 1 && (x := 1); // (x := 1) should execute\r
634 ASSERT(x == 1);\r
636 0 || (x := 2); // (x := 2) should execute\r
638 ASSERT(x == 2);\r
642 x := 0;\r
644 0 && (x := 1); // (x := 1) shouldn't execute\r
646 ASSERT(x == 0);\r
648 1 || (x := 1); // (x := 1) shouldn't execute\r
650 ASSERT(x == 0);\r
651         \r
654 -----------------------------\r
656 Array Subscript\r
658 #formula\r
660 foo := "a" : "b" : "c" : "d";\r
662 ASSERT( _\r
663         foo[1] == "a",_\r
664         foo[2] == "b",_\r
665         foo[3] == "c",_\r
666         foo[4] == "d",_ \r
667         foo[-4] == "a",_\r
668         foo[-3] == "b",_\r
669         foo[-2] == "c",_\r
670         foo[-1] == "d", _       \r
671         foo[2,3] == "b" : "c",_\r
672         foo[2,-2] == nil,_\r
673         foo[-3,-2] == nil,_\r
674         foo[-3,3] == "a" : "b" : "c",_\r
675         foo[0,4] == "a" : "b" : "c" : "d",_\r
676         foo[1,4] == "a" : "b" : "c" : "d",_\r
677         foo[1,5] == "a" : "b" : "c" : "d",_\r
678         foo[4,5] == "d",_\r
679         foo[5,6] == nil,_\r
680         foo[-1000,4] ==  "a" : "b" : "c" : "d",_\r
681         foo[1,-1000] ==  nil _\r
682 );\r
685 -----------------------------\r
687 string concatenation\r
689 #formula\r
691 ASSERT(_\r
692         "foo" + "bar" == "foobar",_\r
693         "" + "bar" == "bar",_\r
694         "foo" + "" == "foo",_\r
695         "foo" + "bar" + "baz" == "foobarbaz"_\r
696 );\r
698 ASSERTFALSE(_\r
699         "foo" + "bar" == " foobar",_\r
700         "" + "bar" == " bar",_\r
701         "foo" + "" == " foo",_\r
702         "foo" + "bar" + "baz" == " foobarbaz"_\r
703 );\r
705 ASSERTFALSE(_\r
706         "foo" + "bar" != "foobar",_\r
707         "" + "bar" != "bar",_\r
708         "foo" + "" != "foo",_\r
709         "foo" + "bar" + "baz" != "foobarbaz"_\r
710 );\r
712 -----------------------------\r
714 // math operators\r
716 #formula\r
718 ASSERT(_\r
719         1 + 1 == 2,_\r
720         1 + 2 == 3,_\r
721         1 + 1.5 == 2.5,_\r
722         1.5 + 1.5 == 3,_\r
723         -1 + 2 == 1,_\r
724         -1 + -2 == -3,_\r
725         2 + nil == 2,_\r
726         nil + nil == nil _\r
727 );\r
729 ASSERT(_\r
730         1 - 1 == 0,_\r
731         1 - 2 == -1,_\r
732         1 - 1.5 == -0.5,_\r
733         1.5 - 1.5 == 0,_\r
734         -1 - 2 == -3,_\r
735         -1 - -2 == 1,_\r
736         2 - nil == 2,_\r
737         nil - nil == nil, _\r
738         nil - 2 == nil _\r
739 );\r
741 ASSERT(_\r
742         1 * 1 == 1,_\r
743         1 * 2 == 2,_\r
744         1 * 1.5 == 1.5,_\r
745         1.5 * 1.5 == 2.25,_\r
746         -1 * 2 == -2,_\r
747         -1 * -2 == 2,_\r
748         2 * nil == 2,_\r
749         nil * 2 == 2 _\r
750 );\r
752 ASSERT(_\r
753         1 / 1 == 1,_\r
754         1 / 2 == 0.5,_\r
755         1 / 4 == 0.25,_\r
756         4 / 2 == 2,_\r
757         1.5 /0.75 == 2,_\r
758         1.5 / 1.5 == 1,_\r
759         -1 / 2 == -0.5,_\r
760         2 / nil == 2,_\r
761         nil / nil == nil,_\r
762         nil / 2 == nil _\r
763 );\r
765 -----------------------------\r
767 Increment/decrement\r
769 #formula\r
771 x := 1;\r
772 ASSERT(x == 1);\r
773 x++;\r
774 ASSERT(x == 2);\r
775 x++;\r
776 ASSERT(x == 3);\r
777 ASSERT(x++ == 4); // acts like c's pre-increment operator\r
779 ASSERT(z++ == nil);\r
782 x--;\r
783 ASSERT(x == 3);\r
784 x--;\r
785 ASSERT(x == 2);\r
786 ASSERT(x-- == 1);\r
787 ASSERT(x-- == 0);\r
788 ASSERT(x-- == -1);\r
789 ASSERT(x-- == -2);\r
791 // non-integers behave the same\r
792 x := 0.5;\r
793 x++;\r
794 ASSERT(x == 1.5);\r
795 x--;\r
796 ASSERT(x == 0.5);\r
798 ASSERT(z-- == nil);\r
800 -----------------------------\r
802 Field assignments\r
804 #initialfields\r
806 x "a" "b" "c"\r
807 y "d" "e" "f"\r
808 z "g" "h" "i"\r
810 #formula\r
812 ASSERT(_\r
813         x == "a" : "b" : "c",_\r
814         y == "d" : "e" : "f",_\r
815         z == "g" : "h" : "i"_\r
816         );\r
818 #results\r
820 x "a" "b" "c"\r
821 y "d" "e" "f"\r
822 z "g" "h" "i"\r
824 -----------------------------\r
827 #initialfields\r
829 x "a" "b" "c"\r
830 y "a" "b" "c"\r
832 #formula\r
834 ASSERT( x == "a" : "b" : "c");\r
836 x := "1"; // local variables always have priority\r
838 ASSERT(x == "1");\r
840 x := nil; // delete local variable\r
842 ASSERT(x == "a" : "b" : "c");\r
844 FIELD x := nil; // delete document variable\r
845 FIELD z := y\r
846 FIELD y := foo // foo is nil (non-existant), and will cause y to be as well\r
848 #results\r
852 z "a" "b" "c"\r
855 -----------------------------\r
857 "initialize" operator\r
859 #initialfields\r
861 x 1\r
863 #formula\r
865 ASSERT(foo == nil)\r
866 foo ?= 2\r
867 ASSERT(foo == 2)\r
869 ASSERT(x == 1)\r
870 x ?= 2\r
871 ASSERT(x == 1)\r
873 -----------------------------\r
876 #initialfields\r
878 x1 "1"\r
879 x2 "2"\r
880 x3 "3"\r
881 x4 "4"\r
882 x5 "5"\r
885 #formula\r
888 ASSERT(_\r
889         x5 != nil,_\r
890         x6 == nil _\r
891         );\r
893 ASSERTFALSE(_\r
894         x5 == nil,_\r
895         x6 != nil _\r
896         );\r
897         \r
898         \r
899 -----------------------------\r
901 docfields() getfield()\r
903 #initialfields\r
905 x1 "1"\r
906 x2 "2"\r
907 x4 "4"\r
908 x5 "5" "6"\r
911 #formula\r
913 y := "blah"\r
915 ASSERT(count(docfields()) == 4)\r
916 ASSERT("x1" in docfields())\r
917 ASSERT("x2" in docfields())\r
918 ASSERT("x4" in docfields())\r
919 ASSERT("x5" in docfields())\r
920 ASSERTFALSE("x3" in docfields())\r
921 ASSERTFALSE("y" in docfields())\r
924 ASSERT(getfield("x1") == "1")\r
925 ASSERT(getfield("x2") == "2")\r
926 ASSERT(getfield("x4") == "4")\r
927 ASSERT(getfield("x5") == "5" : "6")\r
928 ASSERT(getfield("x1" : "x2") == "1" : "2")\r
929 ASSERT(getfield("x4" : "x5") == "4" : "5" : "6")\r
930 ASSERT(getfield("x1" : "x2" : "x4" : "x5") == "1" : "2" : "4" : "5" : "6")\r
931 ASSERT(getfield("x5" : "x4" : "x2" : "x1") == "5" : "6" : "4" : "2" : "1" )\r
932 ASSERT(getfield("x3") == nil )\r
933 ASSERT(getfield("y") == nil )\r
935 -----------------------------\r
938 #initialfields\r
940 x1 "1"\r
941 x2 "2"\r
942 x3 "3"\r
943 x4 "4"\r
944 x5 "5"\r
947 #formula\r
950 ASSERT(_\r
951         x0..5 == "1" : "2" : "3" : "4" : "5"_\r
952         );\r
954 ASSERT(_\r
955         x1..5 == "1" : "2" : "3" : "4" : "5",_\r
956         x1..1 == "1",_\r
957         x3..5 == "3" : "4" : "5",_\r
958         x3..* == "3" : "4" : "5",_\r
959         x1..* == "1" : "2" : "3" : "4" : "5",_\r
960         x1..22 == "1" : "2" : "3" : "4" : "5"_\r
961 );\r
963 ASSERT(_\r
964         x0..5 == "1" : "2" : "3" : "4" : "5",_\r
965         x0..1 == "1",_\r
966         x0..* == "1" : "2" : "3" : "4" : "5",_\r
967         x0..22 == "1" : "2" : "3" : "4" : "5"_\r
968 );\r
970 FIELD x7 := "7";\r
972 ASSERT(_\r
973         x3..* == "3" : "4" : "5" : "7",_\r
974         x1..* == "1" : "2" : "3" : "4" : "5" : "7",_\r
975         x1..22 == "1" : "2" : "3" : "4" : "5" : "7"_\r
976 );\r
978 y:=3;\r
980 ASSERT(x1..y == "1" : "2" : "3"); // second arg can be any kind of expression\r
983 ASSERT(x50..51 == nil); // out of range, nil\r
985 ASSERT(x50..40 == nil); // underflow, nil\r
987 ASSERT(z1..10 == nil); // no z, returns nil\r
989 -----------------------------\r
991 operator precedence\r
993 #formula\r
995 ASSERT(_\r
996         1 + 2 * 3 == 7,_\r
997         2 * 3 + 1 == 7,_\r
998         1 - 2 * 3 == -5,_\r
999         2 * 3 - 1 == 5,_\r
1000         1 + 2 / 4 == 1.5,_\r
1001         2 / 4 + 1 == 1.5,_\r
1002         1 - 2 / 4 == 0.5,_\r
1003         2 / 4 - 1 == -0.5,_     \r
1004         2 / 4 * 6 == 3,_\r
1005         6 * 2 / 4 == 3,_        \r
1006         2 * 3 + 1 == 7,_\r
1007         1 - 2 * 3 == -5,_\r
1008         2 * 3 - 1 == 5,_\r
1009         1 + 2 / 4 == 1.5,_\r
1010         2 / 4 + 1 == 1.5,_\r
1011         1 - 2 / 4 == 0.5,_\r
1012         2 / 4 - 1 == -0.5,_     \r
1013         2 / 4 * 6 == 3,_\r
1014         6 * 2 / 4 == 3_\r
1015 );\r
1018 -----------------------------\r
1020 early return\r
1022 #formula\r
1023 return("foo");\r
1024 "bar";\r
1026 #results\r
1027 %ret "foo"\r
1029 -----------------------------\r
1031 user functions\r
1033 #formula\r
1035 function Foo(a,b,c) {\r
1036         a + b + c\r
1039 ASSERT(%Foo("1", "2", "3") == "123")\r
1042 function Factorial(x) {\r
1043    if (x == 0, 1, %Factorial(x-1) * x);\r
1044 };\r
1046 function Factorial(x) {\r
1047         if (x <= 0) {\r
1048                 1;\r
1049         } else {\r
1050                 %Factorial(x-1) * x;\r
1051         };\r
1052 };\r
1055 ASSERT(%factorial(1) == 1);\r
1056 ASSERT(%factorial(5) == 120);\r
1057 ASSERT(%factorial(25) == 1.5511210043330986e+25);\r
1060 function DeepRecursion(n) {\r
1061         if (n != 0) {\r
1062                 %DeepRecursion(n-1);\r
1063         };\r
1064 };\r
1066 %DeepRecursion(1000);\r
1069 function ArgCountFunc() {\r
1070         $ArgCount;\r
1071 };\r
1073 ASSERT(%ArgCountFunc(1,1) == 2);\r
1074 ASSERT(%ArgCountFunc(1,1,1) == 3);\r
1075 ASSERT(%ArgCountFunc(1,1,1,1) == 4);\r
1076 ASSERT(%ArgCountFunc(1,1,1,1,1) == 5);\r
1077 ASSERT(%ArgCountFunc(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1) == 20);\r
1079 function EarlyReturn(arg) {\r
1080         if (arg == "1") {\r
1081                 return("foo");\r
1082         };\r
1083         x := "bar";\r
1084         x;\r
1085 };\r
1087 ASSERT( %EarlyReturn("1") == "foo");\r
1088 ASSERT( %EarlyReturn("0") == "bar");\r
1090 -----------------------------\r
1093 forall functions\r
1095 #formula\r
1097 xlist := 1 : 2 : 3;\r
1098 ylist := 10 : 20 : 30;\r
1099 zlist := 100;\r
1101 y := forall(x in xlist) {\r
1102         x + 1;\r
1103 };\r
1105 ASSERT(y == 2 : 3 : 4);\r
1107 foo := forall(x in xlist, y in ylist) {\r
1108         x + y;\r
1109 };\r
1111 ASSERT(foo == 11 : 22 : 33);\r
1115 foo := forall( x in xlist, y in ylist, z in zlist) {\r
1116         x + y + z;\r
1117 };\r
1119 ASSERT(foo == 111 : 22 : 33);\r
1122 nums := 1 : 2 : 3 : 4 : 5 : 6 : 7 : 8;\r
1124 foo := forall(twonums in nums by 2) {\r
1125         twonums[1] + twonums[2]\r
1128 ASSERT(foo == 3 : 7 : 11 : 15)\r
1130 nums := 1 : 2 : 3 : 4 : 5 : 6 : 7 : 8 : 9;\r
1132 foo := forall(twonums in nums by 2) {\r
1133         twonums[1] + twonums[2]\r
1136 ASSERT(foo == 3 : 7 : 11 : 15 : 9)\r
1139 -----------------------------\r
1142 iserror(lists) -> bool list\r
1144 #formula\r
1145 userError := error("Foo", "Bar")\r
1146 ASSERT(iserror("hi") == 0);\r
1147 ASSERT(iserror(userError) == 1);\r
1148 ASSERT(iserror(userError : "foo") == 1 : 0);\r
1149 ASSERT(iserror(nil) == nil);\r
1152 -----------------------------\r
1154 table formulas \r
1156 #initialfields\r
1158 x "a" "b" "c"\r
1159 y 1\r
1161 #tableformula\r
1163 SELECT X == "a" : "b" : "c"\r
1164 COLUMN foo := "q"\r
1165 COLUMN x\r
1166 COLUMN y ?= 2\r
1167 COLUMN Z ?= 2\r
1169 #results\r
1171 %ret 1\r
1172 %column "q"\r
1173 %column "a" "b" "c"\r
1174 %column 1\r
1175 %column 2\r
1177 -----------------------------\r
1179 #initialfields\r
1181 x "A" "b" "c"\r
1183 #tableformula\r
1185 SELECT Foo != nil\r
1186 COLUMN Foo\r
1187 COLUMN x := x\r
1189 #results\r
1191 %ret 0\r
1195 -----------------------------\r
1197 table formulas \r
1199 #initialfields\r
1201 x "A" "b" "c"\r
1203 #tableformula\r
1205 SELECT *;\r
1206 COLUMN Foo\r
1207 COLUMN x\r
1209 #results\r
1211 %ret 1\r
1214 -----------------------------\r
1216 #formula\r
1219 ASSERT( "Damien" =~ /Damien/)\r
1220 ASSERTFALSE( "damien" =~/Damien/)\r
1221 ASSERT( "damien" =~/Damien/i)\r
1222 ASSERT( "dam" : "damien" =~/Dam.*/i)\r
1223 ASSERT( "d" : "damien" =~/Dam.*/i) // only needs to match one element\r
1226 -----------------------------\r