On Wednesday, 25 May 2016 at 21:38:23 UTC, Atila Neves wrote:
There was talk in the forum of making it easier to come up
instantiations of say, an input range for testing purposes.
That got me thinking of how mocking frameworks make it easy to
pass in dependencies without having to write a whole new "test
double" type oneself. How would one do that for what I've
started calling "static interfaces"? How would one mock an
input range?
There's no way to inspect the code inside the lambda used in
isInputRange or any other similar template constraint (.codeof
would be awesome, but alas it doesn't exist), but a regular OOP
interface you can reflect on... and there's even one called
InputRange in Phobos... hmmm.
The result is in the link below. The implementation is a bit
horrible because I cowboyed it. I should probably figure out
how to make it more template mixin and less of the string
variety, but I was on a roll. Anyway, take a look at the unit
test at the bottom first and complain about my crappy
implementation later:
https://gist.github.com/atilaneves/b40c4d030c70686ffa3b8543018f6a7e
If you have an interface already I guess you could just mock
that, but then you wouldn't be able to test templated code with
it. This technique would fix that problem.
Interesting? Crazy? Worth adding to unit-threaded? Phobos
(after much cleaning up)?
Atila
Have you looked at std.typecons.AutoImplement at all?
http://dlang.org/phobos/std_typecons.html#.AutoImplement
It seems to do something similar to what you're doing, though it
generates a subclass rather than a struct (for the purposes of
testing contracts and stuff, I don't think it matters too much).