This is an example of the current Fabric test suite file (current as of 6/15/2006). The following is parsed by the test suite code and the formulas are executed and results validated.
Basic tests
#formula
1
#results
%ret 1
-----------------------------
#formula
0
#results
%ret 0
-----------------------------
#formula
2;
#results
%ret 2
-----------------------------
#formula
-1;
#results
%ret -1
-----------------------------
#formula
"";
#results
%ret ""
-----------------------------
#formula
"foo";
#results
%ret "foo"
-----------------------------
#formula
"he said \"foo\"";
#results
%ret "he said \"foo\""
-----------------------------
#formula
'he said "foo"';
#results
%ret "he said \"foo\""
-----------------------------
#formula
0;
#results
%ret 0
-----------------------------
#formula
true;
#results
%ret 1
-----------------------------
#formula
false;
#results
%ret 0
-----------------------------
#formula
[SomeKeyword];
#results
%ret [SomeKeyword]
-----------------------------
Test List concatenation
#formula
1 : 2 : 3 : 5;
#results
%ret 1 2 3 5
-----------------------------
#formula
"a" : "b" : [keyword] : 1 : 2;
#results
%ret "a" "b" [keyword] 1 2
------------ variable assignment and reference -----------------
#formula
foo := "x";
foo;
#results
%ret "x"
-----------------------------
#formula
foo := "x" : 1 : 2 : 3
foo
#results
%ret "x" 1 2 3
-----------------------------
#formula
foo := "x" : 1 : 2 : 3
bar := foo
bar
#results
%ret "x" 1 2 3
-----------------------------
#formula
foo := "some value";
foo := "x" : 1 : 2 : 3;
foo;
#results
%ret "x" 1 2 3
-----------------------------
test result of assignment expression
#formula
foo := "x" : 1 : 2 : 3;
#results
%ret "x" 1 2 3
--------------- Branching --------------
#formula
if (true) {
"foo";
};
#results
%ret "foo"
-----------------------------
#formula
if (false) {
"foo";
};
#results
%ret ""
-----------------------------
#formula
if (true) {
"foo";
} else {
"bar";
};
#results
%ret "foo"
-----------------------------
#formula
if (false) {
"foo";
} else {
"bar";
};
#results
%ret "bar"
-----------------------------
#formula
if (false) {
"foo";
} else if (true) {
"bar";
};
#results
%ret "bar"
-----------------------------
#formula
if (false) {
"foo";
} else if (false) {
"bar";
};
#results
%ret ""
-----------------------------
#formula
if (false) {
"foo";
} else if (false) {
"bar";
} else {
"baz";
};
#results
%ret "baz"
-----------------------------
#formula
if (true) {
"foo";
} else if (false) {
"bar";
} else {
"baz";
};
#results
%ret "foo"
-----------------------------
#formula
if (false) {
"foo";
} else if (true) {
"bar";
} else {
"baz";
};
#results
%ret "bar"
-----------------------------
#formula
if (false) {
"foo"
} else if (false) {
"foo"
} else if (false) {
"foo"
} else if (true) {
"bar"
}
#results
%ret "bar"
-----------------------------
#formula
if (false) {
"foo";
} else if (false) {
"foo";
} else if (false) {
"foo";
} else if (true) {
"bar";
} else if (false) {
"foo";
};
#results
%ret "bar"
-----------------------------
Short if form
#formula
ASSERT(_
if(true, "foo", true, "bar", "baz") == "foo",_
if(0, "foo", true, "bar", "baz") == "bar"_
);
-------------comparision operators----------------
#formula
ASSERT(_
"foo" == "foo",_
"foo" : "bar" == "foo" : "bar"_
);
ASSERTFALSE(_
"foo" == "foo" : "bar",_
"foo" == "foo" : "foo",_
"bar" : "foo" == "foo" : "bar"_
);
ASSERT(_
"foo" != "bar",_
"foo" != "foo" : "bar", _
"foo" : "foo" != "foo" : "bar", _
"foo" : "bar" != "foo", _
"foo" : "foo" != "foo"_
);
ASSERTFALSE(_
"foo" != "foo"_
);
-----------------------------
#formula
ASSERT(_
"foo" ~= "foo",_
"foo" ~= "FOO",_
"fOo" ~= "FoO",_
"foo" ~= "foo" : "foo",_
"foo" ~= "FOO" : "FOO",_
"FOO" : "FOO" ~= "foo",_
1 ~= "1",_
1 : "2" ~= "1" : 2_
);
ASSERTFALSE(_
1 ~= "2",_
1 ~= "1" : "2"_
);
ASSERT(_
1 < 2,_
1 < 1.0000000001,_
"1" < "2",_
"a" < "b"_
);
ASSERTFALSE(_
2 < 1,_
1.0000000001 < 1,_
"2" < "1",_
"b" < "a"_
);
ASSERT(_
2 > 1,_
1.0000000001 > 1,_
"2" > "1",_
"b" > "a",_
"2" > "1"_
);
ASSERTFALSE(_
1 > 2,_
1 > 1.0000000001,_
"1" > "2",_
"a" > "b"_
);
ASSERT(_
2 >= 1,_
2 >= 2,_
1.0000000001 >= 1,_
"2" >= "1",_
"2" >= "2",_
"b" >= "a",_
"2" >= "1",_
"2" >= "2"_
);
ASSERTFALSE(_
1 >= 2,_
1 >= 1.0000000001,_
"1" >= "2",_
"a" >= "b"_
);
ASSERT(_
1 <= 2,_
2 <= 2,_
1 <= 1.0000000001,_
"1" <= "2",_
"2" <= "2",_
"a" <= "b",_
"1" <= "2",_
"2" <= "2"_
);
ASSERTFALSE(_
2 <= 1,_
1.0000000001 <= 1,_
"2" <= "1",_
"b" <= "a"_
);
-----------------------------
Boolean Logic Operators
#formula
ASSERT(_
!0,_
!!1,_
!!2_
);
ASSERTFALSE(_
!1,_
!2,_
!!0_
);
ASSERT(_
1 && 1,_
2 && 2_
);
ASSERTFALSE(_
1 && 0,_
0 && 2,_
0 && 0_
);
ASSERT(_
1 || 1,_
2 || 2,_
1 || 0,_
2 || 0,_
0 || 1,_
0 || 2_
)
ASSERTFALSE(_
0 || 0 _
);
// now lets test shortcircuit boolean evaluation
x := 0;
1 && (x := 1); // (x := 1) should execute
ASSERT(x == 1);
0 || (x := 2); // (x := 2) should execute
ASSERT(x == 2);
x := 0;
0 && (x := 1); // (x := 1) shouldn't execute
ASSERT(x == 0);
1 || (x := 1); // (x := 1) shouldn't execute
ASSERT(x == 0);
-----------------------------
Array Subscript
#formula
foo := "a" : "b" : "c" : "d";
ASSERT( _
foo[1] == "a",_
foo[2] == "b",_
foo[3] == "c",_
foo[4] == "d",_
foo[-4] == "a",_
foo[-3] == "b",_
foo[-2] == "c",_
foo[-1] == "d", _
foo[2,3] == "b" : "c",_
foo[2,-2] == "b" : "c",_
foo[-3,-2] == "b" : "c",_
foo[-3,3] == "b" : "c",_
foo[1,4] == "a" : "b" : "c" : "d",_
foo[1,5] == "a" : "b" : "c" : "d" : "d",_
foo[5,6] == "d" : "d",_
foo[-1000,4] == "a" : "b" : "c" : "d",_
foo[1,-1000] == "a"_
);
-----------------------------
string concatenation
#formula
ASSERT(_
"foo" + "bar" == "foobar",_
"" + "bar" == "bar",_
"foo" + "" == "foo",_
"foo" + "bar" + "baz" == "foobarbaz"_
);
ASSERTFALSE(_
"foo" + "bar" == " foobar",_
"" + "bar" == " bar",_
"foo" + "" == " foo",_
"foo" + "bar" + "baz" == " foobarbaz"_
);
ASSERTFALSE(_
"foo" + "bar" != "foobar",_
"" + "bar" != "bar",_
"foo" + "" != "foo",_
"foo" + "bar" + "baz" != "foobarbaz"_
);
-----------------------------
// math operators
#formula
ASSERT(_
1 + 1 == 2,_
1 + 2 == 3,_
1 + 1.5 == 2.5,_
1.5 + 1.5 == 3,_
-1 + 2 == 1,_
-1 + -2 == -3_
);
ASSERT(_
1 - 1 == 0,_
1 - 2 == -1,_
1 - 1.5 == -0.5,_
1.5 - 1.5 == 0,_
-1 - 2 == -3,_
-1 - -2 == 1_
);
ASSERT(_
1 * 1 == 1,_
1 * 2 == 2,_
1 * 1.5 == 1.5,_
1.5 * 1.5 == 2.25,_
-1 * 2 == -2,_
-1 * -2 == 2_
);
ASSERT(_
1 / 1 == 1,_
1 / 2 == 0.5,_
1 / 4 == 0.25,_
4 / 2 == 2,_
1.5 /0.75 == 2,_
1.5 / 1.5 == 1,_
-1 / 2 == -0.5,_
-1 / -2 == 0.5_
);
-----------------------------
Increment/decrement
#formula
x := 1;
ASSERT(x == 1);
x++;
ASSERT(x == 2);
x++;
ASSERT(x == 3);
ASSERT(x++ == 4); // acts like c's pre-increment operator
x--;
ASSERT(x == 3);
x--;
ASSERT(x == 2);
ASSERT(x-- == 1);
ASSERT(x-- == 0);
ASSERT(x-- == -1);
ASSERT(x-- == -2);
// non-integers behave the same
x := 0.5;
x++;
ASSERT(x == 1.5);
x--;
ASSERT(x == 0.5);
-----------------------------
Field assignments
#initialfields
x "a" "b" "c"
y "d" "e" "f"
z "g" "h" "i"
#formula
ASSERT(_
x == "a" : "b" : "c",_
y == "d" : "e" : "f",_
z == "g" : "h" : "i"_
);
#results
x "a" "b" "c"
y "d" "e" "f"
z "g" "h" "i"
-----------------------------
#initialfields
x "a" "b" "c"
#formula
ASSERT( x == "a" : "b" : "c");
x := "1"; // should now be visible
ASSERT(x == "1");
Delete(x); // delete local variable
ASSERT(x == "a" : "b" : "c");
Delete(x); // delete document variable
ASSERT(x == "");
#results
x
-----------------------------
#initialfields
x1 "1"
x2 "2"
x3 "3"
x4 "4"
x5 "5"
#formula
ASSERT(_
x0..5 == "1" : "2" : "3" : "4" : "5"_
);
ASSERT(_
x1..5 == "1" : "2" : "3" : "4" : "5",_
x1..1 == "1",_
x3..5 == "3" : "4" : "5",_
x3..* == "3" : "4" : "5",_
x1..* == "1" : "2" : "3" : "4" : "5",_
x1..22 == "1" : "2" : "3" : "4" : "5"_
);
ASSERT(_
x0..5 == "1" : "2" : "3" : "4" : "5",_
x0..1 == "1",_
x0..* == "1" : "2" : "3" : "4" : "5",_
x0..22 == "1" : "2" : "3" : "4" : "5"_
);
FIELD x7 := "7";
ASSERT(_
x3..* == "3" : "4" : "5" : "7",_
x1..* == "1" : "2" : "3" : "4" : "5" : "7",_
x1..22 == "1" : "2" : "3" : "4" : "5" : "7"_
);
y:=3;
ASSERT(x1..y == "1" : "2" : "3"); // second arg can be any kind of expression
-----------------------------
operator precedence
#formula
ASSERT(_
1 + 2 * 3 == 7,_
2 * 3 + 1 == 7,_
1 - 2 * 3 == -5,_
2 * 3 - 1 == 5,_
1 + 2 / 4 == 1.5,_
2 / 4 + 1 == 1.5,_
1 - 2 / 4 == 0.5,_
2 / 4 - 1 == -0.5,_
2 / 4 * 6 == 3,_
6 * 2 / 4 == 3,_
2 * 3 + 1 == 7,_
1 - 2 * 3 == -5,_
2 * 3 - 1 == 5,_
1 + 2 / 4 == 1.5,_
2 / 4 + 1 == 1.5,_
1 - 2 / 4 == 0.5,_
2 / 4 - 1 == -0.5,_
2 / 4 * 6 == 3,_
6 * 2 / 4 == 3_
);
-----------------------------
early return
#formula
return("foo");
"bar";
#results
%ret "foo"
-----------------------------
user functions
#formula
function Foo(a,b,c) {
a + b + c
}
ASSERT(%Foo("1", "2", "3") == "123")
function Factorial(x) {
if (x == 0, 1, %Factorial(x-1) * x);
};
function Factorial(x) {
if (x <= 0) {
1;
} else {
%Factorial(x-1) * x;
};
};
ASSERT(%factorial(1) == 1);
ASSERT(%factorial(5) == 120);
ASSERT(%factorial(25) == 1.5511210043330986e+25);
function DeepRecursion(n) {
if (n != 0) {
%DeepRecursion(n-1);
};
};
%DeepRecursion(1000);
function ArgCountFunc() {
$ArgCount;
};
ASSERT(%ArgCountFunc(1,1) == 2);
ASSERT(%ArgCountFunc(1,1,1) == 3);
ASSERT(%ArgCountFunc(1,1,1,1) == 4);
ASSERT(%ArgCountFunc(1,1,1,1,1) == 5);
ASSERT(%ArgCountFunc(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1) == 20);
function EarlyReturn(arg) {
if (arg == "1") {
return("foo");
};
x := "bar";
x;
};
ASSERT( %EarlyReturn("1") == "foo");
ASSERT( %EarlyReturn("0") == "bar");
-----------------------------
forall functions
#formula
xlist := 1 : 2 : 3;
ylist := 10 : 20 : 30;
zlist := 100;
y := forall(x in xlist) {
x + 1;
};
ASSERT(y == 2 : 3 : 4);
foo := forall(x in xlist, y in ylist) {
x + y;
};
ASSERT(foo == 11 : 22 : 33);
foo := forall( x in xlist, y in ylist, z in zlist) {
x + y + z;
};
ASSERT(foo == 111 : 122 : 133);
nums := 1 : 2 : 3 : 4 : 5 : 6 : 7 : 8;
foo := forall(num in nums by 2) {
num[1] + num[2]
}
ASSERT(foo == 3 : 7 : 11 : 15)
foo := forall( x in xlist by 2,_
y in ylist by 2,_
z in zlist by 2) {
(x[1] + x[2]) * (y[1] + y[2]) * (z[1] + z[2]);
};
ASSERT(foo == 18000 : 72000);
-----------------------------
conversion functions
#formula
x := Text(1);
ASSERT(x == "1");
x := Text(1 : 2);
ASSERT(x == "1" : "2");
last updated 3 years ago
#
lkhjgslkhclkhsf
1 year ago # reply