QAston/DMocks-revived

Variadic function cannot be mocked

linkrope opened this issue · 2 comments

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, )

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.

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.