www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Better assert without changing built-in assert

reply Jens Mueller <jens.k.mueller gmx.de> writes:
Hi,

I'm trying to improve the assertions. I tried the following
auto foo(bool var) {
	return tuple(var, "MyMessage");
}

void bar(bool var, string text) {
}

unittest {
	bar(foo(true).expand);
	//assert(foo(true).expand); // won't compile
}

void main() {}

$ dmd -unittest -run file.d
Commenting in the assert it fails with
"Error: expression
tuple(foo(true)._field_field_0,foo(true)._field_field_1) of type (bool,
string) does not have a boolean value"

assert behaves different when expanding tuples. Any explanations?
If one could do the above without writing the expand then it would
suggest a nice way of enhancing the build-in assert, I think.
If one cannot make it work without the .expand another option may be
to overload the built-in assert to handle tuples. This may be related to
http://d.puremagic.com/issues/show_bug.cgi?id=5547
Then one writes e.g.
assert(throws!MyException(expression))
or
assert(pred!("==")(a, b))
What do you think?

Jens
Feb 16 2011
next sibling parent reply Jim <bitcirkel yahoo.com> writes:
Jens Mueller Wrote:

 Hi,
 
 I'm trying to improve the assertions. I tried the following
 auto foo(bool var) {
 	return tuple(var, "MyMessage");
 }
 
 void bar(bool var, string text) {
 }
 
 unittest {
 	bar(foo(true).expand);
 	//assert(foo(true).expand); // won't compile
 }
 
 void main() {}
 
 $ dmd -unittest -run file.d
 Commenting in the assert it fails with
 "Error: expression
 tuple(foo(true)._field_field_0,foo(true)._field_field_1) of type (bool,
 string) does not have a boolean value"
 
 assert behaves different when expanding tuples. Any explanations?
 If one could do the above without writing the expand then it would
 suggest a nice way of enhancing the build-in assert, I think.
 If one cannot make it work without the .expand another option may be
 to overload the built-in assert to handle tuples. This may be related to
 http://d.puremagic.com/issues/show_bug.cgi?id=5547
 Then one writes e.g.
 assert(throws!MyException(expression))
 or
 assert(pred!("==")(a, b))
 What do you think?
 
 Jens

Or like this: import std.conv; string cat(T...)(T ts) { string s; foreach(t; ts) s ~= to!string(t) ~ " "; return s; } unittest { ... assert(a==b, cat(a,b)); }
Feb 16 2011
parent Andrei Alexandrescu <SeeWebsiteForEmail erdani.org> writes:
On 2/16/11 5:04 AM, Jim wrote:
 Jens Mueller Wrote:

 Hi,

 I'm trying to improve the assertions. I tried the following
 auto foo(bool var) {
 	return tuple(var, "MyMessage");
 }

 void bar(bool var, string text) {
 }

 unittest {
 	bar(foo(true).expand);
 	//assert(foo(true).expand); // won't compile
 }

 void main() {}

 $ dmd -unittest -run file.d
 Commenting in the assert it fails with
 "Error: expression
 tuple(foo(true)._field_field_0,foo(true)._field_field_1) of type (bool,
 string) does not have a boolean value"

 assert behaves different when expanding tuples. Any explanations?
 If one could do the above without writing the expand then it would
 suggest a nice way of enhancing the build-in assert, I think.
 If one cannot make it work without the .expand another option may be
 to overload the built-in assert to handle tuples. This may be related to
 http://d.puremagic.com/issues/show_bug.cgi?id=5547
 Then one writes e.g.
 assert(throws!MyException(expression))
 or
 assert(pred!("==")(a, b))
 What do you think?

 Jens

Or like this: import std.conv; string cat(T...)(T ts) { string s; foreach(t; ts) s ~= to!string(t) ~ " "; return s; } unittest { ... assert(a==b, cat(a,b)); }

There's already text in std.conv with the same semantics. { assert(a==b, text(a,b)); } Andrei
Feb 16 2011
prev sibling parent Jim <bitcirkel yahoo.com> writes:
Jens Mueller Wrote:

 Hi,
 
 I'm trying to improve the assertions. I tried the following
 auto foo(bool var) {
 	return tuple(var, "MyMessage");
 }
 
 void bar(bool var, string text) {
 }
 
 unittest {
 	bar(foo(true).expand);
 	//assert(foo(true).expand); // won't compile
 }
 
 void main() {}
 
 $ dmd -unittest -run file.d
 Commenting in the assert it fails with
 "Error: expression
 tuple(foo(true)._field_field_0,foo(true)._field_field_1) of type (bool,
 string) does not have a boolean value"
 
 assert behaves different when expanding tuples. Any explanations?
 If one could do the above without writing the expand then it would
 suggest a nice way of enhancing the build-in assert, I think.
 If one cannot make it work without the .expand another option may be
 to overload the built-in assert to handle tuples. This may be related to
 http://d.puremagic.com/issues/show_bug.cgi?id=5547
 Then one writes e.g.
 assert(throws!MyException(expression))
 or
 assert(pred!("==")(a, b))
 What do you think?
 
 Jens

Or like this: import std.conv; string cat(T...)(T ts) { string s; foreach(t; ts) s ~= to!string(t) ~ " "; return s; } unittest { ... assert(a==b, cat(a,b)); }
Feb 16 2011