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 <if> and <ifnot> which lets you write:

=====================================================
<if test="property1 = property2 + '.txt'">
...
</if>
=====================================================

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

=====================================================
 <property name="prop1" value="${'aaa' + 'bbb'}" />
 <echo message="length of prop1 is: ${length(prop1)}" if="${1+2=3}" />
=====================================================

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);
Assert("dateadd(somedate,3600) = someotherdate", true);
Assert("'a' + 'b' = 'ab'", true);



-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
Does SourceForge.net help you be more productive?  Does it
help you create better code?  SHARE THE LOVE, and help us help
YOU!  Click Here: http://sourceforge.net/donate/
_______________________________________________
nant-developers mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/nant-developers

Reply via email to