Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
August 30, 2007 Unittest helper module? | ||||
---|---|---|---|---|
| ||||
So I was wondering if anyone has written or is writing something that I could use like so: unittest { int foo = 42; int bar = 5; char[] baz = "moo"; UTester ut; // Unit Tester struct ut.verbose = true; ut.test("foo == bar"); ut.test("foo > bar"); ut.test("baz.length is 3"); assert( ut.allPassed ); // assertion exception } prints: "foo == bar": false. foo == 42 bar == 5 "foo > bar": true. foo == 42 bar == 5 "baz.length is 3": true. baz == "moo" baz.length == 3 Error: AssertError Failure ... At some point I realized I was writing all of my unittest code 2 times. Once in the form of using the tested code and dumping the output to the console, and then again in the form of using the tested code and comparing the output against expected values. I initially dump the output to console so that if it fails, I know how so, and sometimes I don't know precisely what the expected value is. Perhaps ut.show("..."); would be useful too. I also gave a short shot at writing this, and realized that it would need a D expression evaluator, which I don't feel like writing right now. I could have sworn I talked to someone at D con that was doing unittest stuff. Well, anyone have this sorta thing laying around? |
August 30, 2007 Re: Unittest helper module? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Chad J | Chad J wrote:
> I also gave a short shot at writing this, and realized that it would need a D expression evaluator, which I don't feel like writing right now.
Couldn't you just use string mixins for this?
Thanks,
Nathan Reed
|
August 30, 2007 Re: Unittest helper module? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Nathan Reed | Nathan Reed wrote:
> Chad J wrote:
>> I also gave a short shot at writing this, and realized that it would need a D expression evaluator, which I don't feel like writing right now.
>
> Couldn't you just use string mixins for this?
>
> Thanks,
> Nathan Reed
Maybe, but I wasn't able to figure out how. If I wasn't interested in the intermediate values, it'd be easy, but I am interested in the intermediate values.
This is the problem I run into:
consider
ut.test("foo( foo(a) & foo(b) ) == 0");
Now I'd like to know what foo(a) and foo(b) evaluate to, as well as what foo(a) & foo(b) evaluates to. So I can just mix that substring in and evaluate it and grab the value. Then I mixin and evaluate the entire contents of foo(foo(a)&foo(b)). This is where the problem starts: foo(a) and foo(b) were just evaluated 2 times, when they should have only been evaluated once. For pure functions this is fine, but functions with side effects could break the unittest if this is done.
Using mixins with no analysis causes this foo(...) to be called 10 times, when it should only be called 3 times.
|
August 31, 2007 Re: Unittest helper module? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Chad J | Chad J Wrote:
> So I was wondering if anyone has written or is writing something that I could use like so:
>
> unittest
> {
> int foo = 42;
> int bar = 5;
> char[] baz = "moo";
>
> UTester ut; // Unit Tester struct
> ut.verbose = true;
> ut.test("foo == bar");
> ut.test("foo > bar");
> ut.test("baz.length is 3");
>
> assert( ut.allPassed ); // assertion exception
> }
>
> prints:
> "foo == bar": false.
> foo == 42
> bar == 5
> "foo > bar": true.
> foo == 42
> bar == 5
> "baz.length is 3": true.
> baz == "moo"
> baz.length == 3
> Error: AssertError Failure ...
>
>
>
> At some point I realized I was writing all of my unittest code 2 times.
> Once in the form of using the tested code and dumping the output to
> the console, and then again in the form of using the tested code and
> comparing the output against expected values. I initially dump the
> output to console so that if it fails, I know how so, and sometimes I
> don't know precisely what the expected value is. Perhaps
> ut.show("..."); would be useful too.
>
> I also gave a short shot at writing this, and realized that it would need a D expression evaluator, which I don't feel like writing right now.
>
> I could have sworn I talked to someone at D con that was doing unittest stuff.
>
> Well, anyone have this sorta thing laying around?
Sounds like a great application of macros... Something like this:
macro test(e : A == B)
{
writefln("%s: %s", e.stringof, e ? "true", "false");
writefln(" %s = %s", A.stringof, A);
writefln(" %s = %s", B.stringof, B);
}
|
September 01, 2007 Re: Unittest helper module? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Robert Fraser | Robert Fraser wrote:
> Sounds like a great application of macros... Something like this:
>
> macro test(e : A == B)
> {
> writefln("%s: %s", e.stringof, e ? "true", "false");
> writefln(" %s = %s", A.stringof, A);
> writefln(" %s = %s", B.stringof, B);
> }
Yep. Just gotta wait for D 3.0 :)
(or whatever version it will be)
|
Copyright © 1999-2021 by the D Language Foundation