Variadic function cannot be mocked
linkrope opened this issue · 2 comments
linkrope commented
I am still trying to mock InputStream
and OutputStream
from std.stream
:
interface Dependency
{
void foo(...);
}
unittest
{
auto mocker = new Mocker;
auto dependency = mocker.mock!Dependency;
}
does not compile:
dmocks/object_mock.d(30): Error: function dmocks.object_mock.Mocked!(Dependency).Mocked.foo does not override any function, did you mean to override 'test.Dependency.foo'?
dmocks/factory.d(15): Error: template instance dmocks.object_mock.Mocked!(Dependency) error instantiating
dmocks/mocks.d(106): instantiated from here: mock!(Dependency, )
QAston commented
This can be only partially fixed as you can't currently pass _arguments and argptr to variadic function transparently. There're workarounds for that like vreadf accompaning readf in InputStream but this relies on naming convention:(. A fix will be made but with the limitation that passThrough will not work when v_func(Args, Typeinfo[], void*) is not provided. Also, there're issues with comparing core.vararg for equality, etc so only limited support for those can be provided.
linkrope commented
Strange: on Linux, the example compiles for 32 Bit but not for 64 Bit.
dmocks/object_mock.d-mixin-30(30): Error: '__va_argsave_t' is not defined, perhaps you need to import core.vararg; ?
dmocks/object_mock.d-mixin-30(30): Error: function dmocks.object_mock.Mocked!(Dependency).Mocked.foo must import core.vararg to use variadic functions
The proposed import, however, fixes the problem.