www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - ModuleInfo.unitTest cannot be called twice

reply Jacob Carlborg <doob me.com> writes:
It seems it's not possible to call ModuleInfo.unitTest more than once.

The following code will not run the unit tests:

foreach (m ; ModuleInfo)
     if (m && m.unitTest)
         m.unitTest();

But this code will:

foreach (m ; ModuleInfo)
     if (m)
         if (auto fp = m.unitTest)
             fp();

Not that I'm storing the result of "m.unitTest" in a variable in the 
second example.

Am I doing something wrong here or is this a bug?

-- 
/Jacob Carlborg
Dec 12 2012
next sibling parent Jacob Carlborg <doob me.com> writes:
On 2012-12-12 22:00, Jacob Carlborg wrote:
 It seems it's not possible to call ModuleInfo.unitTest more than once.

 The following code will not run the unit tests:

 foreach (m ; ModuleInfo)
      if (m && m.unitTest)
          m.unitTest();

 But this code will:

 foreach (m ; ModuleInfo)
      if (m)
          if (auto fp = m.unitTest)
              fp();

 Not that I'm storing the result of "m.unitTest" in a variable in the
 second example.

 Am I doing something wrong here or is this a bug?

I see what I did wrong. ModuleInfo.unitTest is a method these days, instead of a field like before. Due two how properties work in D it will only call the "unitTest" method and not the returned function pointer. -- /Jacob Carlborg
Dec 12 2012
prev sibling parent reply Johannes Pfau <nospam example.com> writes:
Am Wed, 12 Dec 2012 22:00:55 +0100
schrieb Jacob Carlborg <doob me.com>:

 It seems it's not possible to call ModuleInfo.unitTest more than once.
 
 The following code will not run the unit tests:
 
 foreach (m ; ModuleInfo)
      if (m && m.unitTest)
          m.unitTest();
 
 But this code will:
 
 foreach (m ; ModuleInfo)
      if (m)
          if (auto fp = m.unitTest)
              fp();
 
 Not that I'm storing the result of "m.unitTest" in a variable in the 
 second example.
 
 Am I doing something wrong here or is this a bug?
 

I don't remember a reason why calling that function more than once shouldn't work. But: unitTest is a property returning a function so it might be related to the optional parentheses / broken properties stuff. Does "m.unitTest()()" compile?
Dec 12 2012
parent Jacob Carlborg <doob me.com> writes:
On 2012-12-13 08:58, Johannes Pfau wrote:

 I don't remember a reason why calling that function more than
 once shouldn't work.

 But: unitTest is a property returning a function so it might be related
 to the optional parentheses / broken properties stuff. Does
 "m.unitTest()()" compile?

Yeah, that was the problem. I though unitTest was a field. -- /Jacob Carlborg
Dec 13 2012