module dmocks.factory;

import dmocks.object_mock;
import dmocks.repository;
import std.typecons;

package:

/** Get a mock object of the given type. */
T mock(T, CONSTRUCTOR_ARGS...)(MockRepository rep, CONSTRUCTOR_ARGS cargs)
{
    Mocked!(T) ret = new Mocked!(T)(cargs);
    ret._owner = rep;
    return cast(T) ret;
}

MockedFinal!(T) mockFinal(T, CONSTRUCTOR_ARGS...)(MockRepository rep, CONSTRUCTOR_ARGS t)
{
    static if (__traits(isFinalClass, T))
        T obj = new T(t);
    else
        T obj = new WhiteHole!T(t);
    MockedFinal!(T) ret = new MockedFinal!(T)(obj);
    ret._owner = rep;
    return ret;
}

MockedFinal!(T) mockFinalPassTo(T, CONSTRUCTOR_ARGS...)(MockRepository rep, T obj)
{
    MockedFinal!(T) ret = new MockedFinal!(T)(obj);
    ret._owner = rep;
    return ret;
}

MockedStruct!(T) mockStruct(T, CONSTRUCTOR_ARGS...)(MockRepository rep, CONSTRUCTOR_ARGS t)
{
    MockedStruct!(T) ret = MockedStruct!(T)(T(t));
    ret._owner = rep;
    return ret;
}

MockedStruct!(T) mockStructPassTo(T, CONSTRUCTOR_ARGS...)(MockRepository rep, T obj)
{
    MockedStruct!(T) ret = MockedStruct!(T)(obj);
    ret._owner = rep;
    return ret;
}