Thanks for the info, I didn't know about <presetdef> either. By the looks of it, seems that <presetdef> is the opposite of what I'm trying to achieve.
I'll try to explain myself again with a very narrowed and concrete example. As I mentioned, I'm trying to wrap <testng> because I want to teak some of its attributes, while leaving others "untouched" but still exposed through my wrapper macro. One of these "untouched" attributes would be "timeout", defined here: https://github.com/cbeust/testng/blob/master/src/main/java/org/testng/TestNGAntTask.java#L285-L287 So, without a wrapper, using <testng timeout="4"> is different from just <testng>. In this case, the default value of timeout is null, which cannot be represented in a build.xml file. Using the following: <macrodef name="mymacro"> <attribute name="timeout" default=""/> <testng timeout="@{timeout}">...</testng> </macrodef> Doesn't work with the default value because TestNGAntTask.setTimeout() accepts an Integer which Ant cannot parse. Then, using <augment> seems like the way to go. However, <testng> is a task which executes immediately. So none of the following options work: <macrodef name="mymacro"> <attribute name="timeout" default=""/> <sequential> <augment unless:blank="timeout" id="invocation" timeout="@{timeout}"/> <testng ref="invocation">...</testng> </sequential> </macrodef> <macrodef name="mymacro"> <attribute name="timeout" default=""/> <sequential> <testng ref="invocation">...</testng> <augment unless:blank="timeout" id="invocation" timeout="@{timeout}"/> </sequential> </macrodef> The first one fails because the reference is defined after <agument>, and the second one doesn't achieve the desired result because <testng> is executed before being augmented. I guess the only two solutions left are, as Al Le suggested, use Javascript or Java directly. Which is a pity because reproducing the functionality of <element optional="true" implicit="true"/> with Javascript (e.g. via <scriptdef>) seems very tedious. Fortunately, none of the problematic TestNG's attributes are essential right now, so I may end up implementing the wrapper in Java. Thank you all for your suggestions. On Mon, Feb 25, 2019 at 3:20 PM Jan Matèrne (jhm) <apa...@materne.de> wrote: > > Not sure why you want to wrap an existing Ant task ... > If you want to provide default settings, you could use <presetdef> > > Jan > > > -----Ursprüngliche Nachricht----- > > Von: Isaac Jurado [mailto:dipto...@gmail.com] > > Gesendet: Sonntag, 24. Februar 2019 18:27 > > An: Ant Users List; gudnabr...@gmail.com > > Betreff: Re: Creating task/macro wrappers > > > > Thanks! I didn't notice the <augment> task existed. > > > > However, I don't seem to wrap my head around it. In particular, it > > doesn't seem to support forward references. This is what I tried: > > > > <macrodef name="mywrapper"> > > <attribute name="timeOut" default=""/> > > <sequential> > > <augment unless:blank="timeOut" id="my-testng-invocation" > > timeOut="@{timeOut}"/> > > <testng id="my-testng-invocation">...</testng> > > </sequentail> > > </macrodef> > > > > The error I get is: > > > > java.lang.IllegalStateException: Unknown reference "my-testng- > > invocation" > > > > Best regards. > > > > On Sat, Feb 23, 2019 at 5:41 PM Matt Benson <gudnabr...@gmail.com> > > wrote: > > > > > > Look into the <augment> task with conditionally executed (using > > > if/unless namespaces, antcontrib <if>, or similar) <sequential> > > blocks. > > > > > > HTH, > > > Matt > > > > > > On Sat, Feb 23, 2019, 3:37 AM Isaac Jurado <dipto...@gmail.com> > > wrote: > > > > > > > Hello Ant users, > > > > > > > > I'm trying to create a <macrodef> wrapper over <testng>. The idea > > > > is to have my macro expose the same attributes that <testng> > > > > supports, with as close semantics as possible. > > > > > > > > Unfortunately, I have no idea how to reproduce the presence/absence > > > > behavior. For instance, <testng> accepts a "timeout" integer > > > > attribute. So in my macro I would do: > > > > > > > > <attribute name="timeout" default=""/> > > > > > > > > And then calling TestNG would be: > > > > > > > > <testng timeout="@{timeout}">...</testng> > > > > > > > > But this turns out not to be the same behavior as NOT specifying > > the > > > > timeout attribute. In this case, Ant fails because empty string > > > > does not parse to an integer. > > > > > > > > Is there a way to achieve my goal? I would like to avoid writing > > > > Java code. But I don't mind resorting to Javascript in the build > > > > file (<script> or <scriptdef>). > > > > > > > > Thanks in advance. > > > > > > > > -- > > > > Isaac Jurado > > > > > > > > "The noblest pleasure is the joy of understanding" > > > > Leonardo da Vinci > > > > > > > > ------------------------------------------------------------------- > > - > > > > - To unsubscribe, e-mail: user-unsubscr...@ant.apache.org For > > > > additional commands, e-mail: user-h...@ant.apache.org > > > > > > > > > > > > > > > > -- > > Isaac Jurado > > > > "The noblest pleasure is the joy of understanding" > > Leonardo da Vinci > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: user-unsubscr...@ant.apache.org For additional > > commands, e-mail: user-h...@ant.apache.org > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: user-unsubscr...@ant.apache.org > For additional commands, e-mail: user-h...@ant.apache.org > -- Isaac Jurado "The noblest pleasure is the joy of understanding" Leonardo da Vinci --------------------------------------------------------------------- To unsubscribe, e-mail: user-unsubscr...@ant.apache.org For additional commands, e-mail: user-h...@ant.apache.org