Re: [nant-dev] Expression Evaluator for NAnt - test1

2003-12-03 Thread Martin Aliger
Hi Jarek!

I tested your code. Good!

Only thing I found is type incompatibility in expressions e.g.
   
or
   

throws
INTERNAL ERROR

System.ArgumentException: Object must be of type Boolean.
   at System.Boolean.CompareTo(Object obj)
   at
NAnt.Core.ExpressionEval.ExpressionEvalBase.ParseRelationalExpression() in
 e:\src\extern\nant\src\NAnt.Core\ExpressionEval\ExpressionEvalBase.cs:line
195

All exceptions during function call or operator evaluation should be user
BuildExceptions.

Martin

- Original Message - 
From: "Jaroslaw Kowalski" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>;
<[EMAIL PROTECTED]>
Sent: Tuesday, December 02, 2003 11:09 PM
Subject: [nant-dev] Expression Evaluator for NAnt - test1


>
> Hi!
>
> Here's the first test release of the expression evaluator I'm developing
for
> NAnt.
> I encourage everyone to try it. I'd like to get as much feedback as
possible
> on it.
>
> Please report:
>
> 1. Does it work for you? Bug reports are welcome.
> 2. Is it useful?
> 3. Do you find the syntax simple enough? Are the build files more/less
> readable?
> 4. Does it break your existing build files? (it shouldn't!)
> 5. What functions/data types/conversions/operators/conversions should be
> added/removed?
> 6. What other features would you like to see?
>
> Pre-compiled binaries along with patches to current CVS code can be found
> at:
> http://jaak.sav.net/nant-ee/nant-ee-test1.zip
>
> Changes:
>
> * new attribute "test" for  and  which lets you write:
>
> =
> 
> ...
> 
> =
>
> * support for expressions in (hopefully) all places where ${propertyname}
> syntax could be used:
>
> =
>  
>  
> =
>
> Jarek
>
> Full list of features:
> ==
>
> Data types:
> integer, double, string, boolean and date
>
> Operators:
> and, or, not
> =, <>, <, >, <=, >= (because NAnt is XML I'm considering renaming them
> to lt, gt, le, ge)
> unary minus,
> +,-,*,/,%(modulo) with natural precedence, braces (), properties can
be
> accessed just by providing their name
>
> Functions:
> propertyexists(name) - returns true when the property exists, false
> otherwise
> propertyvalue(name) - returns the value of the named property, fails
> when it's not present
>
> Conversion operators:
> int(a) - converts a to integer (if possible) and returns the value
> double(a) - converts a to double (if possible) and returns the value
> string(a) - converts a to string and returns the value
> date(a) - converts a to date
> bool(a) - converts a to boolean
>
> String functions:
>
> length(a) - returns the length of the string
> substring(a,b,c) - equivalent to a.Substring(b,c) in .NET
> tolower(s) - returns s converted to lower-case
> toupper(s) - returns s converted to upper-case
> contains(str,subs) - returns true when subs is a substring of str
> indexof(a,b) - equivalent to a.IndexOf(b) in .NET
> padleft(a,b,c) - equivalent to a.PadStart(a,b,c) in .NET
> padright(a,b,c) - equivalent to a.PadEnd(a,b,c) in .NET
> trim(a) - equivalent to a.Trim() in .NET
> trimstart(a) - equivalent to a.TrimStart() in .NET
> trimend(a) - equivalent to a.TrimEnd() in .NET
> startswith(a,b) - equivalent to a.StartsWith(b) in .NET
> endswith(a,b) - equivalent to a.EndsWith(b) in .NET
>
> Math functions:
>
> round(v)
> floor(v)
> ceiling(v)
> abs(v)
>
> File functions:
>
> getcreationtime(filename)
> getlastwritetime(file)
> getlastaccesstime(file)
> fileexists(file)
> filesize(file)
>
> Date functions:
>
> now()
> datediff(d1,d2) - returns date difference in seconds
> dateadd(d1,seconds) - returns d1 + seconds
>
> Here are some examples of things that are known to work, taken from my
unit
> tests:
>
> Assert("1+2", 3);
> Assert("1+2+3", 6);
> Assert("1+2*3", 7);
> Assert("2*1*3", 6);
> Assert("1/2+3", 3);
> Assert("5.0/(2+8)", 0.5);
> Assert("double(5)/(2+8)", 0.5);
> Assert("double(1)/2+3", 3.5);
> Assert("1", 1);
> Assert("1+2", 3);
> Assert("1+2)+(2+1", 6);
> Assert("1+2)/(2+1", 1);
> Assert("length('')", 0);
> Assert("length('')=0", true)

[nant-dev] Expression Evaluator for NAnt - test1

2003-12-02 Thread Jaroslaw Kowalski

Hi!

Here's the first test release of the expression evaluator I'm developing for
NAnt.
I encourage everyone to try it. I'd like to get as much feedback as possible
on it.

Please report:

1. Does it work for you? Bug reports are welcome.
2. Is it useful?
3. Do you find the syntax simple enough? Are the build files more/less
readable?
4. Does it break your existing build files? (it shouldn't!)
5. What functions/data types/conversions/operators/conversions should be
added/removed?
6. What other features would you like to see?

Pre-compiled binaries along with patches to current CVS code can be found
at:
http://jaak.sav.net/nant-ee/nant-ee-test1.zip

Changes:

* new attribute "test" for  and  which lets you write:

=

...

=

* support for expressions in (hopefully) all places where ${propertyname}
syntax could be used:

=
 
 
=

Jarek

Full list of features:
==

Data types:
integer, double, string, boolean and date

Operators:
and, or, not
=, <>, <, >, <=, >= (because NAnt is XML I'm considering renaming them
to lt, gt, le, ge)
unary minus,
+,-,*,/,%(modulo) with natural precedence, braces (), properties can be
accessed just by providing their name

Functions:
propertyexists(name) - returns true when the property exists, false
otherwise
propertyvalue(name) - returns the value of the named property, fails
when it's not present

Conversion operators:
int(a) - converts a to integer (if possible) and returns the value
double(a) - converts a to double (if possible) and returns the value
string(a) - converts a to string and returns the value
date(a) - converts a to date
bool(a) - converts a to boolean

String functions:

length(a) - returns the length of the string
substring(a,b,c) - equivalent to a.Substring(b,c) in .NET
tolower(s) - returns s converted to lower-case
toupper(s) - returns s converted to upper-case
contains(str,subs) - returns true when subs is a substring of str
indexof(a,b) - equivalent to a.IndexOf(b) in .NET
padleft(a,b,c) - equivalent to a.PadStart(a,b,c) in .NET
padright(a,b,c) - equivalent to a.PadEnd(a,b,c) in .NET
trim(a) - equivalent to a.Trim() in .NET
trimstart(a) - equivalent to a.TrimStart() in .NET
trimend(a) - equivalent to a.TrimEnd() in .NET
startswith(a,b) - equivalent to a.StartsWith(b) in .NET
endswith(a,b) - equivalent to a.EndsWith(b) in .NET

Math functions:

round(v)
floor(v)
ceiling(v)
abs(v)

File functions:

getcreationtime(filename)
getlastwritetime(file)
getlastaccesstime(file)
fileexists(file)
filesize(file)

Date functions:

now()
datediff(d1,d2) - returns date difference in seconds
dateadd(d1,seconds) - returns d1 + seconds

Here are some examples of things that are known to work, taken from my unit
tests:

Assert("1+2", 3);
Assert("1+2+3", 6);
Assert("1+2*3", 7);
Assert("2*1*3", 6);
Assert("1/2+3", 3);
Assert("5.0/(2+8)", 0.5);
Assert("double(5)/(2+8)", 0.5);
Assert("double(1)/2+3", 3.5);
Assert("1", 1);
Assert("1+2", 3);
Assert("1+2)+(2+1", 6);
Assert("1+2)/(2+1", 1);
Assert("length('')", 0);
Assert("length('')=0", true);
Assert("length('')=1", false);
Assert("length('test')", 4);
Assert("length('test')=4", true);
Assert("length('test')=5", false);
Assert("length('d''Artagnan')", 10);
Assert("length('d''Artagnan')=10", true);
Assert("length('d''Artagnan')=11", false);
Assert("-1", -1);
Assert("--1", 1);
Assert("'a' = 'a'", true);
Assert("'a' = 'b'", false);
Assert("'a' <> 'a'", false);
Assert("'a' <> 'b'", true);
Assert("1 = 1", true);
Assert("1 <> 1", false);
Assert("1 = 2", false);
Assert("1 <> 2", true);
Assert("1.0 = 1.0", true);
Assert("1.0 <> 1.0", false);
Assert("1.0 = 2.0", false);
Assert("1.0 <> 2.0", true);
Assert("true", true);
Assert("false", false);
Assert("true==true", true);
Assert("true==false", false);
Assert("true<>false", true);
Assert("true<>true", false);
Assert("!true", false);
Assert("!false", true);
Assert("!(1=1)", false);
Assert("substring('abcde',1,2)='bc'", true);
Assert("trim('  ab  ')='ab'", true);
Assert("trimstart('  ab  ')='ab  '", true);
Assert("trimend('  ab  ')='  ab'", true);
Assert("padleft('ab',5,'.')='...ab'", true);
Assert("padright('ab',5,'.')='ab...'", true);
Assert("indexof('abc','c')=2", true);
Assert("indexof('abc','d')=-1", true);
Assert("indexof('abc','d')=-1", true);
Assert("round(0.1)", 0.0);
Assert("round(0.7)", 1.0);
Assert("floor(0.1)", 0.0);
Assert("floor(0.7)", 0.0);
Assert("ceiling(0.1)", 1.0);
Assert("ceiling(0.7)", 1.0);
Assert("if(true,1,2)", 1);
Assert("if(true,'a','b')", "a");
Assert("if(false,'a','b')", "b");
Assert("abs(1)", 1.0);
Assert("abs(-1)", 1.0);
Assert("fileexists('c:\\notthere.txt')", false