import * as _ from "lodash"; import * as all from "./_all"; import { MockBase } from "./MockBase"; import { MockBehavior } from "./_all"; import { InterceptorExecute } from "./InterceptorExecute"; import { MethodCall } from "./MethodCall"; import { MethodCallReturn } from "./MethodCallReturn"; export class StaticMock extends MockBase { private constructor( target: T, canOverrideTarget: boolean, behavior: all.MockBehavior) { super(target, canOverrideTarget, behavior); this._interceptor = new InterceptorExecute(this); this._proxy = all.ProxyFactory.createProxy(target, this._interceptor); } static ofInstance(targetInstance: U, behavior: all.MockBehavior, shouldOverrideTarget: boolean): all.IMock { targetInstance = StaticMock.cloneDeep(targetInstance); const mock: StaticMock = new StaticMock(targetInstance, shouldOverrideTarget, behavior); return mock; } static ofGlobalInstance(targetInstance: U, behavior: all.MockBehavior): all.IMock { const mock: StaticMock = new StaticMock(targetInstance, false, behavior); return mock; } static ofType(targetConstructor: all.CtorWithArgs, behavior: all.MockBehavior, shouldOverrideTarget: boolean, targetConstructorArgs: any[]): all.IMock { const targetInstance: U = all.Utils.conthunktor(targetConstructor, targetConstructorArgs); const mock: StaticMock = new StaticMock(targetInstance, shouldOverrideTarget, behavior); return mock; } private static cloneDeep(target: T): T { let copy = target; if (!_.isFunction(target)) { let func = (x: any): any => { var value: any; if (all.ProxyES5.isProxy(x)) return x; }; copy = _.cloneDeepWith(target, func); } return copy; } // setup setup(expression: all.IFunc2): MethodCallReturn { const call = MethodCallReturn.ofStaticMock(this, expression); this._interceptor.addExpectedCall(call); return call; } // verify verify(expression: all.IFunc2, times: all.Times): void { const call = MethodCall.ofStaticMock(this, expression); this._interceptor.addExpectedCall(call); try { this._interceptor.verifyCallCount(call, times); } catch (e) { throw e; } } }