Click here to Skip to main content
15,892,199 members
Articles / Programming Languages / Visual Basic

Flee - Fast Lightweight Expression Evaluator

Rate me:
Please Sign up or sign in to vote.
4.91/5 (47 votes)
11 Oct 2007LGPL310 min read 196.1K   3.7K   108  
A .NET expression evaluator that compiles to IL and is designed for speed.
' Test various expressions
' Format: Type of expression;expression;expected result
' Constant loads
' Int32
Int32;0;0
Int32;1;1
Int32;2;2
Int32;3;3
Int32;4;4
Int32;5;5
Int32;6;6
Int32;7;7
Int32;8;8
Int32;9;9
Int32;-1;-1
Int32;-2;-2
Int32;-128;-128
Int32;-129;-129
Int32;127;127
Int32;128;128
Int32;123456;123456
Int32;-1000;-1000
Int32;1000;1000
'	...min/max values
Int32;2147483647;2147483647
Int32;-2147483648;-2147483648
' Single
Single;0.0f;0.0
Single;-100.24f;-100.24
Single;1.0f;1.0
Single;45.50e+4f;45.50e+4
'	...min/max values
Single;3.40282347E+38f;3.40282347E+38
Single;-3.40282347E+38f;-3.40282347E+38
' Double
Double;0.0;0.0
Double;123.0;123.0
Double;1.25;1.25
Double;-1.25;-1.25
Double;-123.456;-123.456
Double;123.456;123.456
Double;0.123456;0.123456
Double;1.0e+10;1.0e+10
'	...min/max values
Double;-1.7976931348623157E+308;-1.7976931348623157E+308
Double;1.7976931348623157E+308;1.7976931348623157E+308
' Uint32
uint32;0U;0
uint32;100U;100
uint32;5000U;5000
uint32;4294967295U;4294967295
uint32;3000000000U;3000000000
uint32;2147483647U;2147483647
' Int64
int64;0L;0
int64;-1L;-1
int64;-12000L;-12000
int64;123000L;123000
int64;9223372036854775807L;9223372036854775807
int64;-9223372036854775808L;-9223372036854775808
int64;-5000000000;-5000000000
' Uint64
uint64;0ul;0
uint64;100lu;100
uint64;123456ul;123456
uint64;18446744073709551615UL;18446744073709551615
uint64;18446744073709551615LU;18446744073709551615
uint64;9223372036854775807LU;9223372036854775807
' String
String;"abc";abc
string;"abcdefghijklmnopqrstuvwxyz1234567890[]_+<>!@#$%^&*()=";abcdefghijklmnopqrstuvwxyz1234567890[]_+<>!@#$%^&*()=
String;"";
String;"1+1";1+1
String;"quoted \"word\" is quoted";quoted "word" is quoted
string;"\"\\";"\
string;"a\u0064";ad
string;"A\ttab";A	tab
string;"a\Ttab";a	tab
string;"A \u0042 \U0024";A B $
string;"a\\n\\t";a\n\t
' Hex literals
int32;0xA;10
int32;-0xa;-10
int32;0xDeaD;57005
int32;-0xDeaD;-57005
int32;0x7fFFFFFF;2147483647
int32;0x00000000;0
int32;-0x7fFFFFFF;-2147483647
uint32;0x0000U;0
uint32;0xDeaDU;57005
uint32;0xFFFFFFFFU;4294967295
uint32;0x7fFFFFFFU;2147483647
int64;0xDeaDL;57005
int64;0xFFFFFFFFL;4294967295
int64;-0xFFFFFFFFL;-4294967295
int64;0x7fffffffffffffff;9223372036854775807
int64;-0x7fffffffffffffff;-9223372036854775807
uint64;0x0LU;0
uint64;0xDeaDLU;57005
uint64;0x7fffffffffffffffLU;9223372036854775807
uint64;0xFfffffffffffffffLU;18446744073709551615
'	uint64 using int32 with sign bit set
uint64;0xB2D05E00UL;3000000000
uint64;0xFFFFFFFFUL;4294967295
' Boolean
Boolean;True;True
Boolean;False;False
' Addition - Integer
Int32;1+1;2
Int32;1+-1;0
Int32;100+200;300
Int32;12 + -2;10
Int32;-10+-10;-20
Int32;100000+123456;223456
Int32;0 + 0;0
Int32;8 + 0;8
Int32;8 + -1;7
' Addition - Double
Double;1.0 + 2.0;3.0
Double;2.0 + 1.0;3.0
Double;0.0 + 0.0;0.0
Double;1.45 + 2.45;3.9
Double;-1.0 + 0.75;-0.25
Double;0.75+-1.0;-0.25
Double;1.3e+3 + 1.923;1301.923
Double;-1000.0 + -99.33;-1099.33
' Addition - Double and Int32
Double;1 + 0.75;1.75
Double;0.75 + 1;1.75
Double;-1 + 0.75;-0.25
Double;0.75 + -1;-0.25
Double;1 + -0.75;0.25
Double;-0.75 + 1;0.25
Double;-0.75 + -100;-100.75
Double;1000 + 23.45;1023.45
Double;23.45+1000;1023.45
Double;1+9+2.0-5;7
' Addition - Single
single;1.0f + 2.0f;3.0
single;2.0f + 1.0f;3.0
single;0.0f + 0.0f;0.0
single;1.45f + 2.45f;3.9
single;-1.0f + 0.75f;-0.25
single;0.75f + -1.0f;-0.25
single;1.3e+3f + 1.923f;1301.923
single;-1000.0f + -99.33f;-1099.33
' Addition - Single and Int32
single;1 + 0.75f;1.75
single;0.75f + 1;1.75
single;-1 + 0.75f;-0.25
single;0.75f + -1;-0.25
single;1 + -0.75f;0.25
single;-0.75f + 1;0.25
single;-0.75f + -100;-100.75
single;1000 + 23.45f;1023.45
single;23.45f + 1000;1023.45
single;1234.56f + 1000;2234.56
single;1+9+2.0f-5;7.0
' Addition - Double and single
Double;1.0f + 2.0;3.0
Double;2.0 + 1.0f;3.0
Double;0.0f + 0.0;0.0
Double;1.45 + 2.45f;3.9
Double;-1.0f + 0.75;-0.25
Double;0.75+-1.0f;-0.25
Double;1.3e+3f + 1.923;1301.923
Double;-1000.0 + -99.33f;-1099.33
' Addition - String
String;"a" + "b";ab
String;"this" + "string";thisstring
String;"a" + "";a
String;100 + "string";100string
String;"def" + true;defTrue
String;-12.34 + "string";-12.34string
String;"string" + -200;string-200
'	non valueType arg
string;"string" + gettype();stringTests.ExpressionOwner
' ...chained
String;"string" + ": " + "more";string: more
String;"string" + " and " + "more";string and more
String;"string " + 100 + " number";string 100 number
String;"string" + " and " + 1;string and 1
String;"string" + (100 + 2.34);string102.34
' Subtraction - Int32
Int32;1 - 2;-1
Int32;1 - 200;-199
Int32;-1 - 200;-201
Int32;200-1;199
Int32;200- -1;201
Int32;1 - -200;201
Int32;-1 - -200;199
Int32;123456 - 123456;0
Int32;123456 - 456;123000
Int32;0 - 123456;-123456
Int32;123456 - 0;123456
Int32;-123 - 20;-143
' Subtraction - Double
Double;2.0 - 0.75;1.25
Double;-3.75 - 0.75;-4.5
Double;3.75 - -0.75;4.5
Double;-3.75 - -0.75;-3.0
Double;3.75 - 0.0;3.75
Double;12.0 - 12.0;0.0
Double;114.56 - 34.22;80.34
' Subtraction - Double and Int32
Double;2 - 0.75;1.25
Double;2.75 - 1;1.75
Double;-2 - 0.75;-2.75
Double;-0.75 - 100;-100.75
Double;-0.75 - -100;99.25
Double;100.75 - 100;0.75
' Multiplication - Int32
Int32;1*2;2
Int32;1*222;222
Int32;1*-2;-2
Int32;-1*2;-2
Int32;123*456;56088
Int32;123*-456;-56088
Int32;-123*-456;56088
Int32;123*0;0
Int32;4*4;16
' Multiplication - Double
Double;0.75 * 2.0;1.5
Double;2.0 * 4.0;8.0
Double;123.45 * -2.0;-246.9
Double;-123.45 * -2.0;246.9
Double;123.45 * 2.0;246.9
Double;1.2e+2 * 0.0;0
Double;1.2e+2 * 1.0;1.2e+2
Double;1.2e+2 * 10.0;1.2e+3
Double;45.6 * 2.2;100.32
' Multiplication - Double and Int32
Double;0.75 * 2;1.5
Double;0.5 * 16;8
Double;0.5 * -16;-8
Double;445.89 * 16;7134.24
' Division - Integer
Int32;8 / 2;4
Int32;8 / 3;2
Int32;100 / -2;-50
Int32;-100 / -2;50
Int32;-100 / 2;-50
int32;int32.minvalue / int32.minvalue;1
int32;int32.minvalue / 2;-1073741824
int32;int32.maxvalue / 2;1073741823
int64;int64.minvalue / 2;-4611686018427387904
int64;int64.maxvalue / 2;4611686018427387903
int64;int64.minvalue / int64.minvalue;1
'	Unsigned
uint32;2147483648U / 2u;1073741824
uint32;uint32.maxvalue / uint32.maxvalue;1
uint64;9223372036854775808LU / 2LU;4611686018427387904
uint64;uint64.maxvalue / uint64.maxvalue;1
' Division - Double
Double;16.0 / 2.0;8.0
Double;1.0 / 0.5;2.0
Double;33.0 / 33.0;1.0
Double;66.75 / 2.4;27.8125
Double;66.75 / -2.4;-27.8125
Double;-66.75 / -2.4;27.8125
Double;-66.75 / 2.4;-27.8125
' Power
Double;4 ^ 2;16.0
Double;4.2 ^ 2;17.64
Double;4.2 ^ 2.4;31.3183
Double;100 ^ 3;1000000
Double;2 ^ -3;0.125
Double;-3.5 ^ 3;-42.875
Double;64 ^ 0.5;8
Double;64 ^ -0.5;0.125
Double;0.5 ^ 0.5;0.7071
'	...with single
Double;4.0 ^ 2.0f;16.0
Double;4.0f ^ 2.0f;16.0
'	test precedence of negate
double;-2 ^ 4;16.0
' Mod
Int32;12 % 10;2
Int32;12 % 22;12
Int32;12 % 8;4
Int32;4557 % 123;6
Int32;-10 % 6;-4
Double;44.2 % 6;2.2
Double;123.45 % 9.8;5.85
'	unsigned
uint32;2147483648U % 5U;3
uint64;9223372036854775808LU % 5LU;3
' Negate
int32;-int32.maxvalue;-2147483647
double;-double.maxvalue;-1.7976931348623157E+308
single;-single.minvalue;3.40282347E+38
int64;-int64.maxvalue;-9223372036854775807
int32;10 - -5;15
int32;-10 + -5;-15
int32;-10 - -5;-5
'	negate uint32
int64;-uint32.maxvalue;-4294967295
' Brackets
Int32;1 + (4*4);17
Int32;1 + 4*4;17
Int32;(1 + 4)*4;20
Int32;1 + (4*4-2);15
Int32;1 + (4*(4-2));9
Int32;(1+2) + (4*(4-2));11
Int32;(1+2)*4;12
Int32;(100+100)/(2+2);50
Double;(2+2)*1.1;4.4
Double;(2 + 2) * (1 + 0.2);4.8
Double;(2+(2*1.1))*(123.45/(2*(1.1+4)));50.83235
' Arithmetic - Chained
Int32;1+2+3+4+5+6;21
Int32;11+22-3+44+5-6;73
Int32;1*2*3*4*5*6;720
Double;11*22/3.0*44/5.0*6;4259.2
' Arithmetic - General
int32;1 + -(2 + 3);-4
int32;1 + -(2 + -3);2
int32;1 + -(-2 + -3);6
int32;-1 + -(-2 + -3);4
int32;-1 + -(2 + 3);-6
int32;-(1);-1
int32;-(-1);1
int32;-(6 + 2) - -(-2+3);-7
int32;-(100 + 3);-103
int32;10+2*3;16
int32;10+2*3/2;13
double;100 - 2 + 3*2^4;146.0
double;(-100*2^4) + (100 * -(40/2-123));8700.0
int32;(-100*(2-4)) + (100 * -(40/2-123));10500
' Comparison
'	Chained
Boolean;10 > 2 = true;true
Boolean;10 > 2 = true <> false;true
Boolean;100 = 20 = false <> false;true
'	Int32
Boolean;1=1;True
Boolean;1=100;False
Boolean;1<>2;True
Boolean;1<>-1;True
Boolean;123<>123;False
Boolean;1>100;False
Boolean;1>0;True
Boolean;100<200;True
Boolean;100<10;False
Boolean;100>=1;true
Boolean;100>=550;false
Boolean;50>=1;True
Boolean;50 >= 50;True
Boolean;50<=50;True
Boolean;50<=100;True
Boolean;-50 < 0;True
Boolean;-50 > 10;false
Boolean;-50 > -100;True
'	Double
Boolean;1.24=1.24;True
Boolean;1.24>1.24;False
Boolean;1.24<1.24;false
Boolean;1.24<>1.24;false
Boolean;1.24<>0.99;true
Boolean;1.24<>-1.24;true
Boolean;1.24 <> 1.24;false
Boolean;1.24 < 100.345;True
Boolean;0.01 > -12.34;True
Boolean;0.01 >= -12.34;true
Boolean;0.01 >= 12.34;false
Boolean;0.01 >= 0.01;True
Boolean;100.25 <= 100.25;True
Boolean;100.25 <= 4000.34;True
'	Single
Boolean;1.24f=1.24f;True
Boolean;1.24f>1.24f;False
Boolean;1.24f<1.24f;false
Boolean;1.24f<>1.24f;false
Boolean;1.24f<>0.99f;true
Boolean;1.24f<>-1.24f;true
Boolean;1.24f <> 1.24f;false
Boolean;1.24f < 100.345f;True
Boolean;0.01f > -12.34f;True
Boolean;0.01f >= -12.34f;true
Boolean;0.01f >= 12.34f;false
Boolean;0.01f >= 0.01f;True
Boolean;100.25f <= 100.25f;True
Boolean;100.25f <= 4000.34f;True
'	Double and single
' Be careful to use single values that will convert to the exact double value
Boolean;1.0=1.0f;True
Boolean;2.25f>2.25;False
Boolean;1.25<1.25f;false
Boolean;1.25f<>1.25;false
Boolean;1.24<>0.99f;true
Boolean;1.24f<>-1.24;true
Boolean;0.25 <> 0.25f;false
Boolean;1.24f < 100.345;True
Boolean;0.01 > -12.34f;True
Boolean;0.01f >= -12.34;true
Boolean;0.01 >= 12.34f;false
Boolean;0.25f >= 0.25;True
Boolean;0.25 >= 0.001f;True
Boolean;100.25 <= 100.25f;True
Boolean;100.25f <= 4000.34;True
'	Double and int32
Boolean;1.24 > 1;true
Boolean;1.00 = 1;true
Boolean;45 < 134.45;true
Boolean;100 > 12.4;true
Boolean;100 < 12.4;false
Boolean;12.4 > 100;false
Boolean;12.4 < 100;true
Boolean;10 <> 10.0;false
Boolean;10 <> 10.1;true
Boolean;10 = 10.0;true
Boolean;10 = 10.1;false
Boolean;10 >= 10.0;true
Boolean;10 >= 8.45;true
Boolean;99.0 <= 99;true
Boolean;99.0 <= 2000;true
'	Single and int32
Boolean;1.24f > 1;true
Boolean;1.00f = 1;true
Boolean;45 < 134.45f;true
Boolean;100 > 12.4f;true
Boolean;100 < 12.4f;false
Boolean;12.4f > 100;false
Boolean;12.4f < 100;true
Boolean;10 <> 10.0f;false
Boolean;10 <> 10.1f;true
Boolean;10 = 10.0f;true
Boolean;10 = 10.1f;false
Boolean;10 >= 10.0f;true
Boolean;10 >= 8.45f;true
Boolean;99.0f <= 99;true
Boolean;99.0f <= 2000;true
' Compare with all integers
'	uint32
boolean;100U <= 100U;true
boolean;uint32.minvalue < uint32.maxvalue;true
boolean;0U = 0U;true
boolean;1U <> 1U;false
boolean;1U <> 0U;true
boolean;uint32.maxvalue = uint32.maxvalue;true
'	make sure that we use unsigned gt/lt compare
boolean;-1 > 0;false
boolean;-1 < 0;true
boolean;0xFFFFFFFFU > 0U;true
boolean;0xFFFFFFFFU < 0U;false
'	uint64
boolean;100UL <= 100UL;true
boolean;uint64.minvalue < uint64.maxvalue;true
boolean;0Ul = 0lU;true
boolean;1lU <> 1lU;false
boolean;1lU <> 0lU;true
boolean;uint64.maxvalue = uint64.maxvalue;true
'	signed and unsigned
boolean;-100 > 100U;false
boolean;100U > int32.minvalue;true
boolean;uint32.maxvalue >= uint32.maxvalue;true
boolean;uint32.maxvalue > 0U;true
boolean;uint32.maxvalue = int32.minvalue;false
boolean;int32.maxvalue <> uint32.maxvalue;true
'	int64
boolean;100L > 0L;true
boolean;100L >= 0L;true
boolean;100L >= 100L;true
boolean;100L < 0L;false
boolean;-1L = -1L;true
boolean;-1L > int64.minvalue;true
'	mix integers and floats
boolean;0.0 = 0;true
boolean;0.0f = 0;true
boolean;0.0 > 0;false
boolean;0.0 <> 0;false
boolean;0.0 = 0U;true
boolean;0.0 = 0L;true
boolean;0.0 = 0LU;true
' Logical - Boolean
Boolean;True = True;true
Boolean;True = False;false
Boolean;False = True;false
Boolean;True <> True;false
Boolean;False=False;true
Boolean;False <> True;true
' Logical - String
Boolean;"abc" = "abc";true
Boolean;"abc" <> "abc";false
Boolean;"" = "";true
Boolean;"" <> "";false
Boolean;"def" = "abc";false
Boolean;"def" <> "abc";true
' And/Or/Xor - Bitwise
Int32;1 and 1;1
Int32;123 and 0;0
Int32;12345 and 12;8
Int32;1 or 1;1
Int32;123 or 0;123
Int32;12345 or 1;12345
Int32;800 or 12;812
Int32;1 xor 1;0
Int32;1 xor 0;1
Int32;456 xor 100;428
'	...chained
Int32;1 and 1 and 0;0
Int32;123 and 100 and 1245 and 80;64
Int32;123 or 100 or 1245 or 80;1279
Int32;123 xor 100 xor 1245 xor 80;1170
'	...combined
Int32;123 and 100 or 1245 xor 80;1197
' with other integer types
uint32;100U and 100U;100
uint32;uint32.maxvalue and uint32.minvalue;0
uint32;uint32.maxvalue xor uint32.maxvalue;0
uint32;uint32.maxvalue or 1U;4294967295
int64;1000l or 0L;1000
int64;int64.minvalue or int64.maxvalue;-1
int64;100L xor 200L;172
int64;int64.maxvalue and 1;1
uint64;1000UL and 1000UL;1000
uint64;uint64.maxvalue and uint64.minvalue;0
uint64;uint64.maxvalue or uint64.minvalue;18446744073709551615
' And/Or/Xor - Logical
Boolean;true and true;true
Boolean;true and false;false
Boolean;false and false;false
Boolean;false and true;false
Boolean;true or true;true
Boolean;true or false;true
Boolean;false or false;false
Boolean;false or true;true
boolean;true xor false;true
boolean;true xor true;false
boolean;false xor false;false
boolean;false xor true;true
'	...chained
Boolean;false or false or false;false
Boolean;true or true or true;true
Boolean;false and false and false;false
Boolean;true and true and true;true
Boolean;false or true or false;true
Boolean;false or false or false;false
Boolean;false and true and false;false
Boolean;true and true and true;true
boolean;true xor false xor true;false
boolean;true xor false xor false;true
'	...combined
Boolean;true and true or false;true
Boolean;false or true and false;false
Boolean;true and true and true or false;true
Boolean;true and true and (true or false);true
boolean;true and (true xor false);true
boolean;(true xor false) or (true xor false);true
boolean;(true xor true) or false;false
boolean;true xor (true or false);false
boolean;true xor (false or false);true
boolean;(true and true) xor (false or false);true
' Not - Bitwise
Int32;not 0;-1
Int32;not -1;0
Int32;not 123456;-123457
uint32;not uint32.maxvalue;0
uint64;not uint64.maxvalue;0
int64;not int64.minvalue;9223372036854775807
' Not - Logical
Boolean;not false;true
Boolean;not true;false
Boolean;not 1 > 100;true
Boolean;not 1 < 100;false
' Full logical with boolean constants
boolean;true and false or true;true
boolean;(true and false) or true;true
Boolean;not false and true;true
Boolean;not true and true;false
Boolean;not false or false;true
Boolean;not true or false;false
Boolean;(true and false) or (true and true);true
Boolean;(true and false) or (true and false);false
Boolean;(true and true) or (false and true);true
Boolean;(false and false) or (true and true);true
Boolean;true and ((false and true) or (false and true));false
Boolean;true and ((true and true) or (false and true));true
Boolean;false and ((true and true) or (false and true));false
Boolean;true and ((true and false) or (false and true));false
Boolean;true and ((true and false) or (true and true));true
Boolean;((false and true) and true) and false;false
Boolean;((true and true) and false) and false;false
Boolean;((true and true) and true) and false;false
Boolean;((true and true) and true) and true;true
Boolean;((false and true) and true) and false;false
Boolean;false and (true and (true and false));false
Boolean;true and (false and (true and false));false
Boolean;true and (true and (true and false));false
Boolean;true and (true and (true and true));true
Boolean;((false or false) or false) or false;false
Boolean;((true or false) or false) or false;true
Boolean;((false or true) or false) or false;true
Boolean;((false or false) or true) or false;true
Boolean;((false or false) or false) or true;true
boolean;true and not false and true;true
Boolean;((true or false) and (true or false)) and false;false
Boolean;true and (((false or true) and (false or true)) and false);false
Boolean;false and (((false or true) and (false or true)) and false);false
Boolean;true and (((false or true) and (false or true)) and true);true
Boolean;true and (((false or true) and (false or false)) and true);false
Boolean;(true or (false and true)) or false;true
Boolean;(true or (false and false)) or false;true
Boolean;(false or (false and false)) or false;false
Boolean;(false or (false and false)) or true;true
Boolean;(true or (false and true)) and false;false
Boolean;(true or (false and false)) and false;false
Boolean;(false or (false and false)) and false;false
Boolean;(false or (false and false)) and true;false
Boolean;(true or (false and false)) and true;true
Boolean;(false or (true and true)) and true;true
Boolean;(true or (false and true)) and (((false or true) and (false or true)) and false);false
Boolean;(true or (false and true)) and (((false or true) and (false or true)) and true);true
Boolean;(false or (false and true)) and (((false or true) and (false or true)) and false);false
'	with xor
boolean;(true xor true) or ((true xor false) and (true xor true));false
boolean;(true xor true) or ((true xor false) and (true xor false));true
boolean;(true xor false) and ((true xor true) or (true xor false));true
boolean;(true xor false) and ((true xor true) or (false xor false));false
' Full logical
Boolean;(not (1 > 10)) and (100 > 0);true
Boolean;(100 < 0) or (not ("a" = "a"));false
Boolean;(100 > 0) and (123.45 > 1.2) and ("a" <> "b");true
Boolean;(100 > 0) and (123.45 > 1.2) and ("a" = "b");false
Boolean;(100 > 0) and (123.45 > 1.2) or ("a" = "b");true
Boolean;(100 > 0) or (123.45 > 1.2) or ("a" = "b") or (true=false);true
Boolean;not (100 > 0) or not (123.45 > 1.2) or ("a" = "b");false
Boolean;not (100 < 0) and not (123.45 = 1.2) and ("a" = "b");false
Boolean;not (100 < 0) and not (123.45 = 1.2) and not ("a" = "b");true
Boolean;((not 0) = -1) and ((1 or 100) > 1);true
'	with xor
boolean;(1 < -10 xor 100=100) and ("a" = "b" xor "a"="a");true
boolean;(1=0 xor 100=0) or ("a" = "b" xor "a"="a");true
' Test short-circuiting; we should not execute the ThrowException method
Boolean;true or (ThrowException() > 100);true
Boolean;false or (false and (ThrowException() > 100));false
Boolean;false and (ThrowException() > 100);false
boolean;true and (true or (ThrowException() > 100));true
'	with xor
boolean;(true xor true) and (ThrowException() > 100);false
boolean;(true xor false) or (ThrowException() > 100);true
'	with long branches
boolean;true or (1.0+2.0+3.0+4.0+5.0+6.0+7.0+8.0+9.0+10.0+11.0+12.0+13.0+14.0+15.0 > 10.0);true
boolean;false or (1.0+2.0+3.0+4.0+5.0+6.0+7.0+8.0+9.0+10.0+11.0+12.0+13.0+14.0+15.0 > 10.0);true
boolean;false or (1.0+2.0+3.0+4.0+5.0+6.0+7.0+8.0+9.0+10.0+11.0+12.0+13.0+14.0+15.0 = 10.0);false
boolean;true and (false or (1.0+2.0+3.0+4.0+5.0+6.0+7.0+8.0+9.0+10.0+11.0+12.0+13.0+14.0+15.0 > 10.0));true
boolean;true and (false or (1.0+2.0+3.0+4.0+5.0+6.0+7.0+8.0+9.0+10.0+11.0+12.0+13.0+14.0+15.0 = 10.0));false
boolean;false or ((1.0+2.0+3.0+4.0+5.0+6.0+7.0+8.0+9.0+10.0+11.0+12.0+13.0+14.0+15.0 > 10.0) and (1.0+2.0+3.0+4.0+5.0+6.0+7.0+8.0+9.0+10.0+11.0+12.0+13.0+14.0+15.0 > 10.0));true
' Implicit conversions
int16;byte.maxvalue;255
uint16;byte.maxvalue;255
int32;byte.maxvalue;255
uint32;byte.maxvalue;255
int64;byte.maxvalue;255
uint64;byte.maxvalue;255
single;byte.maxvalue;255.0
double;byte.maxvalue;255.0
int16;sbyte.minvalue;-128
int32;sbyte.minvalue;-128
int64;sbyte.minvalue;-128
int32;int16.minvalue;-32768
int64;int16.minvalue;-32768
single;int16.minvalue;-32768
double;int16.minvalue;-32768
int32;uint16.maxvalue;65535
uint32;uint16.maxvalue;65535
int64;uint16.maxvalue;65535
uint64;uint16.maxvalue;65535
single;uint16.maxvalue;65535
double;uint16.maxvalue;65535
Double;100;100.0
Double;-1;-1.0
double;120.5f;120.5
'	using overloaded operators
decimal;100;100
decimal;'a';97
' To reference types
object;"abc";System.String
object;100;System.int32
object;true;System.boolean
' Variables
' Int32
Int32;Int32A + 1;100001
Int32;Int32A + Int32A;200000
Int32;Int32A - Int32A;0
Int32;2 * Int32A;200000
Int32;((Int32A * 2) / 2) - 100000;0
Int32;-Int32A + Int32a;0
boolean;(2 * Int32A) = 200000;true
boolean;(2 * Int32A) = (int32a + int32a);true
boolean;(2 * Int32A) >= 200000;true
boolean;Int32A > 200000;false
boolean;Int32A = int32a;true
boolean;Int32A <> int32a;false
boolean;Int32A <> int32a * 3;true
' String
String;Stringa;string
String;Stringa + "abc";stringabc
String;"a" + stringa + "c";astringc
' Boolean
boolean;BoolA = BoolA;true
boolean;BoolA <> BoolA;false
boolean;BoolA and true;true
boolean;not BoolA or false;false
boolean;(1 = 1) = Boola;true
' Full arithmetic
Single;SingleA + SingleA;200.5
Single;SingleA * 2;200.5
Single;SingleA * 2.0f;200.5
Single;(SingleA * 2.0f) + 200;400.5
Single;-SingleA + SingleA;0
Double;DoubleA ^ 2;10050.0625
Double;(Doublea ^ 2) / 2 + (Doublea - 100 + 2.25) * 2.0;5030.0312
Double;(singlea * 2) / 2 + (singlea - 100 + 2.25);102.75
Double;DoubleA + SingleA;200.5
Double;((DoubleA - 0.25) ^ (singlea - 99.25)) * 2;200.0
Double;singlea * int32a * doublea;1005006250.0
Double;singlea ^ 2.0f;10050.0625
' Properties
Double;DoubleAProp + Int32aprop;100100.25
String;100 + SharedPropA;100sharedprop
' Member tests
'	static fields from type
string;string.empty;
double;Math.pi;3.1416
String;Uri.UriSchemeFtp;ftp
'	static field, instance member
Int32;SharedPropA.length;10
'	instance field, instance member
int32;StringA.length;6
'	various tests
string;String.empty;
int32;int32.maxvalue;2147483647
int32;int32.minvalue + int32.maxvalue;-1
single;single.MaxValue + single.MinValue;0.0
double;double.MaxValue + double.MinValue;0.0
String;Boolean.trueString;True
double;Math.pi * 2;6.2832
boolean;math.pi = math.pi;true
String;uri.UriSchemeFtp + boolean.truestring;ftpTrue
'	nested (and virtual)
String;TypeA.Basetype.name;Object
Int32;TypeA.BaseType.name.length;6
string;typea.basetype.name + TypeA.name;ObjectString
int32;String.empty.length;0
' Function calls
'	basic owner methods
String;FuncString();abc
String;fuNcstrInG();abc
string;privatefuncstring();abc
int32;SharedFuncInt();100
int32;PrivateSharedFuncInt();100
'	static type methods
string;String.concat("a","b");ab
int32;Math.max(-1,10);10
int32;Math.abs(-100);100
int32;int32.parse("100");100
boolean;boolean.parse("true");true
'	convert args
double;math.cos(0);1.0
double;math.cos(0U);1.0
double;math.cos(0UL);1.0
'	make sure we push arguments in right order
double;Math.pow(3,5);243
double;Math.pow(5,3);125
' Loading fields of value/reference type
int32;KeyboardA.StructA.I;123
string;KeyboardA.StructA.S;mouse
int32;keyboardA.ClassA.I;900
string;keyboardA.ClassA.S;monitor
'	static fields
int32;Tests.Mouse.shareddt.year;1
int32;KeyboardA.StructA.GetYear(Tests.Mouse.sharedDT);1
int32;DateTime.MinValue.Year;1
string;Tests.Monitor.SharedString;string
int32;Tests.Monitor.SharedString.length;6
' Methods on value types
'	virtual method
string;DoubleA.tostring();100.25
'	regular method
int64;datetimea.tobinary();633188448000000000
'	method on value type returned from previous method
string;KeyboardA.Structa.GetI().tostring();123
string;KeyboardA.Classa.GetI().tostring();900
int64;GEtDateTime().tobinary();633188448000000000
'	mix fields and methods
string;KeyboardA.StructA.I.tostring();123
string;KeyboardA.StructA.S.tostring();mouse
string;keyboardA.ClassA.I.tostring();900
string;keyboardA.ClassA.S.tostring();monitor
'	properties
int32;KeyboardA.StructA.S.length;5
int32;KeyboardA.classA.S.length;7
int32;KeyboardA.StructA.Dt.Year;2007
int32;KeyboardA.ClassA.Dt.Year;2007
'		and methods
string;KeyboardA.StructA.Dt.Year.ToString();2007
string;KeyboardA.ClassA.Dt.Year.ToString();2007
int32;KeyboardA.ClassA.Dt.Year.ToString().length;4
int32;KeyboardA.ClassA.Dt.Year.CompareTo(100);1
int32;KeyboardA.StructA.GetYear(KeyboardA.StructA.DT);2007
int32;KeyboardA.StructA.GetYear(KeyboardA.ClassA.DT);2007
'	with arrays
string;DoubleArr[1].tostring();2.2
int32;doublearr[0].compareto(0.0);1
string;stringarr[2].tostring();c
int32;datetimearr[0].Year;2007
int32;datetimearr[0].Year.CompareTo(3000);-1
int64;datetimearr[0].ToBinary();633188448000000000
'	with indexer
int32;KeyboardA.ClassA[0].year;2007
int32;KeyboardA.structA[0].year;2007
string;KeyboardA.ClassA[0].year.tostring();2007
string;KeyboardA.structA[0].year.tostring();2007
'	more than one expression
int32;KeyboardA.ClassA.Dt.Year + KeyboardA.structA.Dt.Year;4014
int32;KeyboardA.ClassA.Dt.Year + datetimearr[0].Year;4014
int32;(KeyboardA.ClassA.Dt.Year.CompareTo(100) + KeyboardA.structA.Dt.Year.CompareTo(4000)) * datetimearr[0].year;0
'	non-member instance
int32;"string".length;6
string;"a.b.c".replace(".", string.empty);abc
string;"a.b.c".replace(".", "1");a1b1c
char;"string"[1];t
'		with value types
string;100.tostring();100
string;222.25.tostring();222.25
int32;(1+100).compareto(100);1
string;true.tostring();True
boolean;(math.abs(-100) + math.max(1, 100)).equals(200);true
' Members and methods
String;GetType().Name;ExpressionOwner
double;Math.cos(math.pi);-1.0
' Miscellaneous
' Implicit convert to Object
object;"abc";System.string
object;TypeA;System.type
' Conditional operator
boolean;IF(true,true,false);true
boolean;IF(false,true,false);false
string;iF(true,"a", "b");a
string;iF(false,"a", "b");b
int32;if(true,100,200);100
int32;if(false,100,200);200
double;if(true,2.25,10.0);2.25
double;if(false,2.25,10.0);10.0
'	more complex cases
int32;if(1 > -1,100,200);100
string;if((2+2) > (45 * 2), "greater", "less");less
double;if("a" + "b" = "ab", 64.0, 2.25);64.0
double;if((true and false) = true,8.55,-9.0 / 3);-3.0
int32;if(math.sign(-1) < 0, 1+2*3*2/2, 5 - 5);7
double;if(math.sign(4.4) < 0, math.cos(math.pi), 5.0^5/2);1562.5
int32;if(int32a <> 0,int32a*2,int32a - 1000);200000
int32;if((int32a-100000) > 0,int32a*2,int32a - 1000);99000
string;if(doubleit(100) = 200,"a"+"b"+"c", "zz");abc
int32;if(true,100,0) + if(false,0,100);200
'	conversions
single;if(true,100.25f,100);100.25
single;if(false,100.25f,100);100.0
double;if(true,100.25,100);100.25
double;if(false,100.25,100);100.0
double;if(true, 222, 1.0);222.0
double;if(false, 222, 1.0);1.0
double;if(true,1.0, 100);1.0
double;if(false,1.0,100);100.0
'	with variables
string;if(true, stringa, "abc");string
double;if(true, doublea, 0.0);100.25
int32;if(true, convert.toint32("100"), 222);100
'	test that only one target gets evaluated
int32;if(true, 100, ThrowException());100
int32;if(false, ThrowException(), 100);100
' Ops with uint32
uint32;100U + 100000U;100100
uint32;100U * 2U;200
uint32;512U / 2U;256
uint32;4000000000U + 2U;4000000002
double;8u ^ 2U;64.0
double;100U * 2.0;200.0
single;100U * 2.0f;200.0
uint32;uint32.maxvalue - uint32.maxvalue;0
uint32;uint32.maxvalue - uint32.minvalue;4294967295
' Ops with int64
int64;100L + 100000L;100100
int64;4294967299L + 100000l;4295067299
int64;5000000000L + 5000000000L;10000000000
int64;5000000000L * 2L;10000000000
int64;5000000000L / 2L;2500000000
int64;100L * 2L;200
int64;512L / 2L;256
double;8L ^ 2L;64.0
double;100L * 2.0;200.0
single;100L * 2.0f;200.0
int64;int64.maxvalue - int64.maxvalue;0
int64;int64.maxvalue - int64.minvalue;-1
int64;int64.minvalue - int64.maxvalue;1
' Ops with uint64
uint64;100UL + 200UL;300
uint64;100UL / 2u;50
uint64;100UL / 2ul;50
single;100UL + 100.0f;200.0
double;100UL + 100.0;200.0
uint64;uint64.maxvalue - uint64.maxvalue;0
' Ops with int32 and uint32;
int64;4294967295U + 1000;4294968295
int64;4294967295U * 2;8589934590
int64;1000+4294967295U;4294968295
int64;2*4294967295U;8589934590
int64;uint32.MaxValue- int32.MinValue;6442450943
int64;uint32.MaxValue- int32.MaxValue;2147483648
' Ops with mixed integers
int64;100L + 100;200
int64;100L + 100U;200
int64;100 * 200l;20000
uint64;100U + 200LU;300
' Power with different type args
double;400U ^ 2;160000.0
' Test unsigned convert to floating point
single;uint32.maxvalue;4.2949673E+9
double;uint32.maxvalue;4294967295.0
single;uint64.maxvalue;1.84467441E+19
double;uint64.maxvalue;1.8446744073709552E+19
' Test signed convert to floating point
single;int32.minvalue;-2.14748365E+9
single;int32.maxvalue;2.14748365E+9
double;int32.minvalue;-2147483648.0
double;int32.maxvalue;2147483647.0
single;int64.minvalue;-9.223372E+18
single;int64.maxvalue;9.223372E+18
double;int64.minvalue;-9.2233720368547758E+18
double;int64.maxvalue;9.2233720368547758E+18
'	Test that we handle small integers properly
'	byte
int32;bytea + bytea;100
int32;bytea + sbytea;40
int32;bytea + int16a;40
int32;bytea + uint16a;150
'	sbyte
int32;sbytea + bytea;40
int32;sbytea + sbytea;-20
int32;sbytea + int16a;-20
int32;sbytea + uint16a;90
'	int16
int32;int16a + bytea;40
int32;int16a + sbytea;-20
int32;int16a + int16a;-20
int32;int16a + uint16a;90
'	uint16
int32;uint16a + bytea;150
int32;uint16a + sbytea;90
int32;uint16a + int16a;90
int32;uint16a + uint16a;200
'	int32
int32;100 + bytea;150
int32;100 + sbytea;90
int32;100 + int16a;90
int32;100 + uint16a;200
'	int64
int64;100L + bytea;150
int64;100l + sbytea;90
int64;100L + int16a;90
int64;100l + uint16a;200
'	uint32
uint32;100U + bytea;150
uint32;100U + uint16a;200
'	uint64
uint64;100LU + bytea;150
uint64;100LU + uint16a;200
'	single and double
single;10.2f + bytea;60.2
single;10.2f + sbytea;0.2
single;10.2f + int16a;0.2
single;10.2f + uint16a;110.2
double;10.2 + bytea;60.2
double;10.2 + sbytea;0.2
double;10.2 + int16a;0.2
double;10.2 + uint16a;110.2
'	signed + unsigned
int64;int16a + 100U;90
int64;sbytea + 100U;90
' Arrays
'	basic
int32;intarr[0];100
int32;intarr[1];200
int32;intarr[2];300
double;doublearr[0];1.1
double;doublearr[1];2.2
double;doublearr[2];3.3
string;stringarr[0];a
string;stringarr[1];b
string;stringarr[2];c
boolean;boolarr[0];true
boolean;boolarr[1];false
boolean;boolarr[2];true
'	non-primitive value type
object;dateTimeArr[0];System.datetime
'	expression in indexer
int32;intarr[1-1];100
int32;intarr[2-1];200
int32;intarr[1*1-1];100
int32;intarr[byte.minvalue];100
int32;intarr[int32a-100000+1];200
int32;intarr[int16a+11];200
int32;intarr[bytea-50];100
'	Indexer on non-array
object;list[0];system.string
object;list[1];system.int32
object;list[1*0];system.string
object;stringa[0];system.char
'	non-integer index
string;stringdict["key"];value
string;stringdict["k" + "e" + "y"];value
'	in expressions
int32;intarr[0] * 2;200
int32;intarr[0] + intarr[1];300
boolean;(intarr[0] + intarr[1]) = intarr[2];true
'	chained
string;gettype().fullname.split(chararr)[1];ExpressionOwner
' Char
char;'a';a
char;' '; 
char;'"';"
char;'\'';'
char;'\\';\
char;'\u005E';^
char;'\u005e';^
char;'\t';	
char;'\T';	
'	implicit conversions
uint16;'^';94
int32;'^';94
uint32;'^';94
int64;'^';94
uint64;'^';94
single;'^';94.0
double;'^';94.0
'	explicit conversions
sbyte;cast('^',sbyte);94
byte;cast('^',byte);94
int16;cast('^',short);94
'	arithmetic
int32;100 + '^';194
double;'^' - 90.0;4.0
uint64;100LU * '^';9400
uint32;94U / '^';1
double;'^' ^ 1;94.0
'	compare
boolean;'^' = '^';true
boolean;'^' > '{';false
boolean;100 > '^';true
boolean;1.24 <= '^';true
boolean;'^' <> '^';false
boolean;'^' <> 123.4f;true
'	function
string;'^'.tostring();^
boolean;Char.isletter('a');true
string;"abc".replace('a', '.');.bc
string;stringa.replace('s','.');.tring
'	fields
int32;cast(char.maxvalue,int);65535
' Implicit unbox
int32;cast(objectIntA, int);100
' Test how we pick the type of an integer literal
'	No suffix
int32;100;100
int32;-2147483648;-2147483648
uint32;2147483648;2147483648
uint32;4294967295;4294967295
int64;9223372036854775807;9223372036854775807
int64;-9223372036854775808;-9223372036854775808
uint64;18446744073709551615;18446744073709551615
'	U suffix
uint32;100U;100
uint32;4294967295U;4294967295
uint64;4294967296U;4294967296
uint64;9223372036854775807U;9223372036854775807
'	L suffix
int64;100L;100
int64;4294967296L;4294967296
int64;9223372036854775807L;9223372036854775807
int64;-9223372036854775808L;-9223372036854775808
uint64;9223372036854775808L;9223372036854775808
uint64;18446744073709551615L;18446744073709551615
'	UL suffix
uint64;100UL;100
uint64;9223372036854775807UL;9223372036854775807
uint64;9223372036854775808LU;9223372036854775808
uint64;18446744073709551615ul;18446744073709551615
'	with hex literals
int32;0xFF;255
int32;0x7FFFFFFF;2147483647
uint32;0xFFFFFFFF;4294967295
int64;0x100000000;4294967296
int64;0x7fffffffffffffff;9223372036854775807
uint64;0x8000000000000000;9223372036854775808
uint64;0xFFFFFFFFFFFFFFFF;18446744073709551615
' Shifts
'	simple cases
int32;100 >> 2;25
int32;100 << 2;400
int32;-1 >> 2;-1
int32;-200 >> 2;-50
int32;int32.maxvalue >> 2;536870911
int32;int32.minvalue >> 2;-536870912
int32;int32.maxvalue << 2;-4
int32;int32.minvalue << 2;0
uint32;100U >> 2;25
uint32;100U << 2;400
uint32;Uint32.maxvalue >> 2;1073741823
uint32;Uint32.maxvalue << 2;4294967292
uint32;uint32.minvalue >> 2;0
uint32;uint32.minvalue << 2;0
int64;100L << 2;400
int64;100L >> 2;25
int64;-200L >> 2;-50
int64;int64.minvalue << 2;0
int64;int64.minvalue >> 2;-2305843009213693952
int64;int64.maxvalue << 2;-4
int64;int64.maxvalue >> 2;2305843009213693951
'	test that we truncate the shift count
int32;100 << 100;1600
int32;100 >> 100;6
int32;int32.minvalue >> 33;-1073741824
uint32;100U << 100;1600
uint32;100U >> 100;6
int64;100L << 100;6871947673600
int64;100L >> 100;0
uint64;100UL << 100;6871947673600
uint64;100UL >> 100;0
int32;1000 >> 32;1000
uint32;1000U >> 32;1000
int64;1000L >> 64;1000
int64;int64.minvalue >> 65;-4611686018427387904
uint64;1000LU >> 64;1000
'	Negative count
int32;800 << -1;0
int32;800 >> -1;0
uint32;0x80000000 >> -1;1
int32;0x00000001 << -1;-2147483648
'	precedence
int32;800 >> 1+1;200
int32;800 >> 2* 2;50
int32;800 >> 2*2 -1;100
int32;100 * 2 << 1+1;800
'	with fields as count
int32;1000 >> byteb;250
uint32;1000U << byteb;4000
int32;1000 << DateTimeA.Day;2000
' If with long branches
double;if(1 > 0, 1.0+1.0+1.0+1.0+1.0+1.0+1.0+1.0+1.0+1.0+1.0+1.0+1.0+1.0+1.0+1.0, 20.0);16.0
double;if(1 > 0, 10.0, 1.0+1.0+1.0+1.0+1.0+1.0+1.0+1.0+1.0+1.0+1.0+1.0+1.0+1.0+1.0+1.0);10.0
' Overloaded arithmetic operators
decimal;decimala + decimalb;100.25
decimal;decimala - decimalb;99.75
decimal;decimalb - decimala;-99.75
decimal;decimala * decimalb;25
decimal;decimala / decimalb;400
decimal;decimalb / decimala;0.0025
decimal;decimala % decimalb;0
decimal;-decimala;-100
decimal;decimala - -decimalb;100.25
int32;(datetimea - datetimea).Days;0
'	with implicit convert
decimal;decimala + 100;200
decimal;decimala + 100L;200
' Overloaded compare operators
boolean;decimala = decimala;true
boolean;decimala > decimala;false
boolean;decimala > decimalb;true
boolean;decimala < decimalb;false
boolean;decimalb < decimala;true
boolean;decimalb <= decimalb;true
boolean;decimala >= decimala;true
boolean;decimala <> decimalb;true
'	with implicit convert
boolean;decimala = 100;true
boolean;decimala > -1;true
boolean;decimala < 1000U;true

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The GNU Lesser General Public License (LGPLv3)


Written By
Web Developer
Canada Canada
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions