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

Reply via email to