diff --git a/dist/spec/issues/15.test.js b/dist/spec/issues/15.test.js index 2931a07..cc9c7db 100644 --- a/dist/spec/issues/15.test.js +++ b/dist/spec/issues/15.test.js @@ -2,7 +2,6 @@ Object.defineProperty(exports, "__esModule", { value: true }); var ava_1 = require("ava"); var Index_1 = require("../../src/Index"); -var substitute = Index_1.Substitute.for(); ava_1.default('issue 15: can call properties twice', function (t) { var baz = "baz"; var foo = Index_1.Substitute.for(); diff --git a/dist/spec/issues/15.test.js.map b/dist/spec/issues/15.test.js.map index d9d8d6e..68389a2 100644 --- a/dist/spec/issues/15.test.js.map +++ b/dist/spec/issues/15.test.js.map @@ -1 +1 @@ -{"version":3,"file":"15.test.js","sourceRoot":"","sources":["../../../spec/issues/15.test.ts"],"names":[],"mappings":";;AAAA,2BAAuB;AAEvB,yCAA6C;AAO7C,IAAI,UAAU,GAAG,kBAAU,CAAC,GAAG,EAAW,CAAC;AAE3C,aAAI,CAAC,qCAAqC,EAAE,UAAA,CAAC;IACzC,IAAM,GAAG,GAAG,KAAK,CAAC;IAClB,IAAM,GAAG,GAAG,kBAAU,CAAC,GAAG,EAAW,CAAC;IAEtC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAErB,IAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC;IACtB,IAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC;IAEtB,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjB,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACrB,CAAC,CAAC,CAAC","sourcesContent":["import test from 'ava';\r\n\r\nimport { Substitute } from '../../src/Index';\r\nimport { ObjectSubstitute } from '../../src/Transformations';\r\n\r\nexport interface Example {\r\n bar: string;\r\n}\r\n\r\nlet substitute = Substitute.for();\r\n\r\ntest('issue 15: can call properties twice', t => {\r\n const baz = \"baz\";\r\n const foo = Substitute.for();\r\n\r\n foo.bar.returns(baz);\r\n\r\n const call1 = foo.bar;\r\n const call2 = foo.bar;\r\n\r\n t.is(call1, baz);\r\n t.is(call2, baz);\r\n});"]} \ No newline at end of file +{"version":3,"file":"15.test.js","sourceRoot":"","sources":["../../../spec/issues/15.test.ts"],"names":[],"mappings":";;AAAA,2BAAuB;AAEvB,yCAA6C;AAM7C,aAAI,CAAC,qCAAqC,EAAE,UAAA,CAAC;IACzC,IAAM,GAAG,GAAG,KAAK,CAAC;IAClB,IAAM,GAAG,GAAG,kBAAU,CAAC,GAAG,EAAW,CAAC;IAEtC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAErB,IAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC;IACtB,IAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC;IAEtB,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjB,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACrB,CAAC,CAAC,CAAC","sourcesContent":["import test from 'ava';\r\n\r\nimport { Substitute } from '../../src/Index';\r\n\r\nexport interface Example {\r\n bar: string;\r\n}\r\n\r\ntest('issue 15: can call properties twice', t => {\r\n const baz = \"baz\";\r\n const foo = Substitute.for();\r\n\r\n foo.bar.returns(baz);\r\n\r\n const call1 = foo.bar;\r\n const call2 = foo.bar;\r\n\r\n t.is(call1, baz);\r\n t.is(call2, baz);\r\n});"]} \ No newline at end of file diff --git a/dist/spec/issues/18.test.d.ts b/dist/spec/issues/18.test.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/dist/spec/issues/18.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/dist/spec/issues/18.test.js b/dist/spec/issues/18.test.js new file mode 100644 index 0000000..57fe68e --- /dev/null +++ b/dist/spec/issues/18.test.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var ava_1 = require("ava"); +var Index_1 = require("../../src/Index"); +ava_1.default('issue 18: receive with arg', function (t) { + var mockedCalculator = Index_1.Substitute.for(); + mockedCalculator.add(1, Index_1.Arg.is(function (input) { return input === 2; })).returns(4); + void mockedCalculator.add(1, 2); + mockedCalculator.received(1).add(1, Index_1.Arg.is(function (input) { return input === 2; })); + t.pass(); +}); +//# sourceMappingURL=18.test.js.map \ No newline at end of file diff --git a/dist/spec/issues/18.test.js.map b/dist/spec/issues/18.test.js.map new file mode 100644 index 0000000..e739f92 --- /dev/null +++ b/dist/spec/issues/18.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"18.test.js","sourceRoot":"","sources":["../../../spec/issues/18.test.ts"],"names":[],"mappings":";;AAAA,2BAAuB;AAEvB,yCAAkD;AASlD,aAAI,CAAC,4BAA4B,EAAE,UAAA,CAAC;IAChC,IAAM,gBAAgB,GAAG,kBAAU,CAAC,GAAG,EAAuB,CAAA;IAC9D,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,WAAG,CAAC,EAAE,CAAC,UAAA,KAAK,IAAI,OAAA,KAAK,KAAK,CAAC,EAAX,CAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAEjE,KAAK,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEhC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,WAAG,CAAC,EAAE,CAAC,UAAA,KAAK,IAAI,OAAA,KAAK,KAAK,CAAC,EAAX,CAAW,CAAC,CAAC,CAAC;IAElE,CAAC,CAAC,IAAI,EAAE,CAAC;AACb,CAAC,CAAC,CAAC","sourcesContent":["import test from 'ava';\r\n\r\nimport { Substitute, Arg } from '../../src/Index';\r\n\r\ninterface CalculatorInterface {\r\n add(a: number, b: number): number\r\n subtract(a: number, b: number): number\r\n divide(a: number, b: number): number\r\n isEnabled: boolean\r\n}\r\n\r\ntest('issue 18: receive with arg', t => {\r\n const mockedCalculator = Substitute.for()\r\n mockedCalculator.add(1, Arg.is(input => input === 2)).returns(4);\r\n\r\n void mockedCalculator.add(1, 2);\r\n\r\n mockedCalculator.received(1).add(1, Arg.is(input => input === 2));\r\n\r\n t.pass();\r\n});"]} \ No newline at end of file diff --git a/dist/src/Arguments.d.ts b/dist/src/Arguments.d.ts index be816c0..9f98d5e 100644 --- a/dist/src/Arguments.d.ts +++ b/dist/src/Arguments.d.ts @@ -1,6 +1,7 @@ export declare class Argument { private description; private matchingFunction; + encounteredValues: any[]; constructor(description: string, matchingFunction: (arg: T) => boolean); matches(arg: T): boolean; toString(): string; diff --git a/dist/src/Arguments.js b/dist/src/Arguments.js index ff96c22..a935012 100644 --- a/dist/src/Arguments.js +++ b/dist/src/Arguments.js @@ -17,6 +17,7 @@ var Argument = /** @class */ (function () { function Argument(description, matchingFunction) { this.description = description; this.matchingFunction = matchingFunction; + this.encounteredValues = []; } Argument.prototype.matches = function (arg) { return this.matchingFunction(arg); @@ -33,7 +34,7 @@ exports.Argument = Argument; var AllArguments = /** @class */ (function (_super) { __extends(AllArguments, _super); function AllArguments() { - return _super.call(this, '{all arguments}', function () { return true; }) || this; + return _super.call(this, '{all}', function () { return true; }) || this; } return AllArguments; }(Argument)); @@ -45,7 +46,7 @@ var Arg = /** @class */ (function () { return new AllArguments(); }; Arg.any = function (type) { - var description = !type ? '{any arg}' : '{arg matching ' + type + '}'; + var description = !type ? '{any arg}' : '{type ' + type + '}'; return new Argument(description, function (x) { if (!type) return true; @@ -57,7 +58,7 @@ var Arg = /** @class */ (function () { }); }; Arg.is = function (predicate) { - return new Argument('{arg matching predicate ' + this.toStringify(predicate) + '}', predicate); + return new Argument('{predicate ' + this.toStringify(predicate) + '}', predicate); }; Arg.toStringify = function (obj) { if (typeof obj.inspect === 'function') diff --git a/dist/src/Arguments.js.map b/dist/src/Arguments.js.map index f3e4368..05467f7 100644 --- a/dist/src/Arguments.js.map +++ b/dist/src/Arguments.js.map @@ -1 +1 @@ -{"version":3,"file":"Arguments.js","sourceRoot":"","sources":["../../src/Arguments.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA;IACI,kBACY,WAAmB,EACnB,gBAAqC;QADrC,gBAAW,GAAX,WAAW,CAAQ;QACnB,qBAAgB,GAAhB,gBAAgB,CAAqB;IAEjD,CAAC;IAED,0BAAO,GAAP,UAAQ,GAAM;QACV,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,2BAAQ,GAAR;QACI,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,0BAAO,GAAP;QACI,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IACL,eAAC;AAAD,CAAC,AAlBD,IAkBC;AAlBY,4BAAQ;AAoBrB;IAAkC,gCAAa;IAC3C;eACI,kBAAM,iBAAiB,EAAE,cAAM,OAAA,IAAI,EAAJ,CAAI,CAAC;IACxC,CAAC;IACL,mBAAC;AAAD,CAAC,AAJD,CAAkC,QAAQ,GAIzC;AAJY,oCAAY;AAMzB;IAAA;IAyCA,CAAC;IAxCU,OAAG,GAAV;QACI,OAAO,IAAI,YAAY,EAAE,CAAC;IAC9B,CAAC;IASM,OAAG,GAAV,UAAW,IAAa;QACpB,IAAM,WAAW,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,GAAG,IAAI,GAAG,GAAG,CAAC;QACxE,OAAO,IAAI,QAAQ,CAAM,WAAW,EAAE,UAAA,CAAC;YACnC,IAAG,CAAC,IAAI;gBACJ,OAAO,IAAI,CAAC;YAEhB,IAAG,OAAO,CAAC,KAAK,WAAW;gBACvB,OAAO,IAAI,CAAC;YAEhB,IAAG,IAAI,KAAK,OAAO;gBACf,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAEjC,OAAO,OAAO,CAAC,KAAK,IAAI,CAAC;QAC7B,CAAC,CAAC,CAAC;IACP,CAAC;IAEM,MAAE,GAAT,UAAa,SAAgC;QACzC,OAAO,IAAI,QAAQ,CAAI,0BAA0B,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE,SAAS,CAAQ,CAAC;IAC7G,CAAC;IAEc,eAAW,GAA1B,UAA2B,GAAQ;QAC/B,IAAG,OAAO,GAAG,CAAC,OAAO,KAAK,UAAU;YAChC,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC;QAEzB,IAAG,OAAO,GAAG,CAAC,QAAQ,KAAK,UAAU;YACjC,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;QAE1B,OAAO,GAAG,CAAC;IACf,CAAC;IACL,UAAC;AAAD,CAAC,AAzCD,IAyCC;AAzCY,kBAAG","sourcesContent":["export class Argument {\r\n constructor(\r\n private description: string,\r\n private matchingFunction: (arg: T) => boolean\r\n ) {\r\n }\r\n\r\n matches(arg: T) {\r\n return this.matchingFunction(arg);\r\n }\r\n\r\n toString() {\r\n return this.description;\r\n }\r\n\r\n inspect() {\r\n return this.description;\r\n }\r\n}\r\n\r\nexport class AllArguments extends Argument {\r\n constructor() {\r\n super('{all arguments}', () => true);\r\n }\r\n}\r\n\r\nexport class Arg {\r\n static all() {\r\n return new AllArguments();\r\n }\r\n\r\n static any()\r\n static any(type: T): Argument & string\r\n static any(type: T): Argument & number\r\n static any(type: T): Argument & boolean\r\n static any(type: T): Argument & any[]\r\n static any(type: T): Argument & Function\r\n static any(type: T)\r\n static any(type?: string): Argument & any {\r\n const description = !type ? '{any arg}' : '{arg matching ' + type + '}';\r\n return new Argument(description, x => {\r\n if(!type)\r\n return true;\r\n\r\n if(typeof x === 'undefined')\r\n return true;\r\n\r\n if(type === 'array')\r\n return x && Array.isArray(x);\r\n\r\n return typeof x === type;\r\n });\r\n }\r\n\r\n static is(predicate: (input: T) => boolean): Argument & T {\r\n return new Argument('{arg matching predicate ' + this.toStringify(predicate) + '}', predicate) as any;\r\n }\r\n\r\n private static toStringify(obj: any) {\r\n if(typeof obj.inspect === 'function')\r\n return obj.inspect();\r\n\r\n if(typeof obj.toString === 'function')\r\n return obj.toString();\r\n\r\n return obj;\r\n }\r\n}"]} \ No newline at end of file +{"version":3,"file":"Arguments.js","sourceRoot":"","sources":["../../src/Arguments.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA;IAGI,kBACY,WAAmB,EACnB,gBAAqC;QADrC,gBAAW,GAAX,WAAW,CAAQ;QACnB,qBAAgB,GAAhB,gBAAgB,CAAqB;QAE7C,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;IAChC,CAAC;IAED,0BAAO,GAAP,UAAQ,GAAM;QACV,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,2BAAQ,GAAR;QACI,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,0BAAO,GAAP;QACI,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IACL,eAAC;AAAD,CAAC,AArBD,IAqBC;AArBY,4BAAQ;AAuBrB;IAAkC,gCAAa;IAC3C;eACI,kBAAM,OAAO,EAAE,cAAM,OAAA,IAAI,EAAJ,CAAI,CAAC;IAC9B,CAAC;IACL,mBAAC;AAAD,CAAC,AAJD,CAAkC,QAAQ,GAIzC;AAJY,oCAAY;AAMzB;IAAA;IAyCA,CAAC;IAxCU,OAAG,GAAV;QACI,OAAO,IAAI,YAAY,EAAE,CAAC;IAC9B,CAAC;IASM,OAAG,GAAV,UAAW,IAAa;QACpB,IAAM,WAAW,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,GAAG,GAAG,CAAC;QAChE,OAAO,IAAI,QAAQ,CAAM,WAAW,EAAE,UAAA,CAAC;YACnC,IAAG,CAAC,IAAI;gBACJ,OAAO,IAAI,CAAC;YAEhB,IAAG,OAAO,CAAC,KAAK,WAAW;gBACvB,OAAO,IAAI,CAAC;YAEhB,IAAG,IAAI,KAAK,OAAO;gBACf,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAEjC,OAAO,OAAO,CAAC,KAAK,IAAI,CAAC;QAC7B,CAAC,CAAC,CAAC;IACP,CAAC;IAEM,MAAE,GAAT,UAAa,SAAgC;QACzC,OAAO,IAAI,QAAQ,CAAI,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE,SAAS,CAAQ,CAAC;IAChG,CAAC;IAEc,eAAW,GAA1B,UAA2B,GAAQ;QAC/B,IAAG,OAAO,GAAG,CAAC,OAAO,KAAK,UAAU;YAChC,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC;QAEzB,IAAG,OAAO,GAAG,CAAC,QAAQ,KAAK,UAAU;YACjC,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;QAE1B,OAAO,GAAG,CAAC;IACf,CAAC;IACL,UAAC;AAAD,CAAC,AAzCD,IAyCC;AAzCY,kBAAG","sourcesContent":["export class Argument {\r\n encounteredValues: any[];\r\n\r\n constructor(\r\n private description: string,\r\n private matchingFunction: (arg: T) => boolean\r\n ) {\r\n this.encounteredValues = [];\r\n }\r\n\r\n matches(arg: T) {\r\n return this.matchingFunction(arg);\r\n }\r\n\r\n toString() {\r\n return this.description;\r\n }\r\n\r\n inspect() {\r\n return this.description;\r\n }\r\n}\r\n\r\nexport class AllArguments extends Argument {\r\n constructor() {\r\n super('{all}', () => true);\r\n }\r\n}\r\n\r\nexport class Arg {\r\n static all() {\r\n return new AllArguments();\r\n }\r\n\r\n static any()\r\n static any(type: T): Argument & string\r\n static any(type: T): Argument & number\r\n static any(type: T): Argument & boolean\r\n static any(type: T): Argument & any[]\r\n static any(type: T): Argument & Function\r\n static any(type: T)\r\n static any(type?: string): Argument & any {\r\n const description = !type ? '{any arg}' : '{type ' + type + '}';\r\n return new Argument(description, x => {\r\n if(!type)\r\n return true;\r\n\r\n if(typeof x === 'undefined')\r\n return true;\r\n\r\n if(type === 'array')\r\n return x && Array.isArray(x);\r\n\r\n return typeof x === type;\r\n });\r\n }\r\n\r\n static is(predicate: (input: T) => boolean): Argument & T {\r\n return new Argument('{predicate ' + this.toStringify(predicate) + '}', predicate) as any;\r\n }\r\n\r\n private static toStringify(obj: any) {\r\n if(typeof obj.inspect === 'function')\r\n return obj.inspect();\r\n\r\n if(typeof obj.toString === 'function')\r\n return obj.toString();\r\n\r\n return obj;\r\n }\r\n}"]} \ No newline at end of file diff --git a/dist/src/Context.js b/dist/src/Context.js index baad4e7..2ba2490 100644 --- a/dist/src/Context.js +++ b/dist/src/Context.js @@ -33,24 +33,14 @@ var Context = /** @class */ (function () { }); } Context.prototype.apply = function (args) { - // console.log('apply', args); return this._state.apply(this, args); }; Context.prototype.set = function (property, value) { - // console.log('set', property, value); return this._state.set(this, property, value); }; Context.prototype.get = function (property) { if (property === Substitute_1.HandlerKey) return this; - // const uninterestingProperties = [ - // '$$typeof', - // 'constructor', - // 'name', - // 'call' - // ]; - // if(typeof property !== 'symbol' && uninterestingProperties.indexOf(property.toString()) === -1) - // console.log('get', property); return this._state.get(this, property); }; Object.defineProperty(Context.prototype, "proxy", { @@ -81,7 +71,6 @@ var Context = /** @class */ (function () { this._state = state; if (state.onSwitchedTo) state.onSwitchedTo(this); - // console.log('state', state); }, enumerable: true, configurable: true diff --git a/dist/src/Context.js.map b/dist/src/Context.js.map index 7f42755..54f79e5 100644 --- a/dist/src/Context.js.map +++ b/dist/src/Context.js.map @@ -1 +1 @@ -{"version":3,"file":"Context.js","sourceRoot":"","sources":["../../src/Context.ts"],"names":[],"mappings":";;AACA,sDAAqD;AACrD,2CAA0C;AAE1C;IAQI;QAAA,mBA6BC;QA5BG,IAAI,CAAC,aAAa,GAAG,IAAI,2BAAY,EAAE,CAAC;QACxC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;QAEjC,IAAI,CAAC,MAAM,GAAG,IAAI,KAAK,CAAC,cAAQ,CAAC,EAAE;YAC/B,KAAK,EAAE,UAAC,OAAO,EAAE,KAAK,EAAE,IAAI;gBACxB,OAAO,OAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YACD,GAAG,EAAE,UAAC,OAAO,EAAE,QAAQ,EAAE,KAAK;gBAC1B,OAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAC1B,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,GAAG,EAAE,UAAC,OAAO,EAAE,QAAQ;gBACnB,OAAO,OAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC9B,CAAC;SACJ,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,GAAG,IAAI,KAAK,CAAC,cAAQ,CAAC,EAAE;YACnC,KAAK,EAAE,UAAC,OAAO,EAAE,KAAK,EAAE,IAAI;gBACxB,OAAO,OAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAI,EAAE,IAAI,CAAC,CAAC;YAC/C,CAAC;YACD,GAAG,EAAE,UAAC,OAAO,EAAE,QAAQ,EAAE,KAAK;gBAC1B,OAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAC7C,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,GAAG,EAAE,UAAC,OAAO,EAAE,QAAQ;gBACnB,OAAO,OAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAI,EAAE,QAAQ,CAAC,CAAC;YACjD,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;IAED,uBAAK,GAAL,UAAM,IAAW;QACb,8BAA8B;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,qBAAG,GAAH,UAAI,QAAqB,EAAE,KAAU;QACjC,uCAAuC;QACvC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,qBAAG,GAAH,UAAI,QAAqB;QACrB,IAAG,QAAQ,KAAK,uBAAU;YACtB,OAAO,IAAI,CAAC;QAEhB,oCAAoC;QACpC,kBAAkB;QAClB,qBAAqB;QACrB,cAAc;QACd,aAAa;QACb,KAAK;QACL,kGAAkG;QAClG,oCAAoC;QAEpC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED,sBAAW,0BAAK;aAAhB;YACI,OAAO,IAAI,CAAC,MAAM,CAAC;QACvB,CAAC;;;OAAA;IAED,sBAAW,8BAAS;aAApB;YACI,OAAO,IAAI,CAAC,UAAU,CAAC;QAC3B,CAAC;;;OAAA;IAED,sBAAW,iCAAY;aAAvB;YACI,OAAO,IAAI,CAAC,aAAa,CAAC;QAC9B,CAAC;;;OAAA;IAED,sBAAW,0BAAK;aAAhB,UAAiB,KAAmB;YAChC,IAAG,IAAI,CAAC,MAAM,KAAK,KAAK;gBACpB,OAAO;YAEX,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACpB,IAAG,KAAK,CAAC,YAAY;gBACjB,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAE7B,+BAA+B;QACnC,CAAC;;;OAAA;IACL,cAAC;AAAD,CAAC,AAvFD,IAuFC;AAvFY,0BAAO","sourcesContent":["import { ContextState } from \"./states/ContextState\";\r\nimport { InitialState } from \"./states/InitialState\";\r\nimport { HandlerKey } from \"./Substitute\";\r\n\r\nexport class Context {\r\n private _initialState: InitialState;\r\n\r\n private _proxy: any;\r\n private _rootProxy: any;\r\n \r\n private _state: ContextState;\r\n\r\n constructor() {\r\n this._initialState = new InitialState();\r\n this._state = this._initialState;\r\n\r\n this._proxy = new Proxy(() => { }, {\r\n apply: (_target, _this, args) => {\r\n return this.apply(args);\r\n },\r\n set: (_target, property, value) => {\r\n this.set(property, value);\r\n return true;\r\n },\r\n get: (_target, property) => {\r\n return this.get(property);\r\n }\r\n });\r\n\r\n this._rootProxy = new Proxy(() => { }, {\r\n apply: (_target, _this, args) => {\r\n return this.initialState.apply(this, args);\r\n },\r\n set: (_target, property, value) => {\r\n this.initialState.set(this, property, value);\r\n return true;\r\n },\r\n get: (_target, property) => {\r\n return this.initialState.get(this, property);\r\n }\r\n });\r\n }\r\n\r\n apply(args: any[]) {\r\n // console.log('apply', args);\r\n return this._state.apply(this, args);\r\n }\r\n\r\n set(property: PropertyKey, value: any) {\r\n // console.log('set', property, value);\r\n return this._state.set(this, property, value);\r\n }\r\n\r\n get(property: PropertyKey) {\r\n if(property === HandlerKey)\r\n return this;\r\n\r\n // const uninterestingProperties = [\r\n // '$$typeof',\r\n // 'constructor',\r\n // 'name',\r\n // 'call'\r\n // ];\r\n // if(typeof property !== 'symbol' && uninterestingProperties.indexOf(property.toString()) === -1)\r\n // console.log('get', property);\r\n\r\n return this._state.get(this, property);\r\n }\r\n\r\n public get proxy() {\r\n return this._proxy;\r\n }\r\n\r\n public get rootProxy() {\r\n return this._rootProxy;\r\n }\r\n\r\n public get initialState() {\r\n return this._initialState;\r\n }\r\n\r\n public set state(state: ContextState) {\r\n if(this._state === state)\r\n return;\r\n\r\n this._state = state;\r\n if(state.onSwitchedTo)\r\n state.onSwitchedTo(this);\r\n\r\n // console.log('state', state);\r\n }\r\n}"]} \ No newline at end of file +{"version":3,"file":"Context.js","sourceRoot":"","sources":["../../src/Context.ts"],"names":[],"mappings":";;AACA,sDAAqD;AACrD,2CAA0C;AAE1C;IAQI;QAAA,mBA6BC;QA5BG,IAAI,CAAC,aAAa,GAAG,IAAI,2BAAY,EAAE,CAAC;QACxC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;QAEjC,IAAI,CAAC,MAAM,GAAG,IAAI,KAAK,CAAC,cAAQ,CAAC,EAAE;YAC/B,KAAK,EAAE,UAAC,OAAO,EAAE,KAAK,EAAE,IAAI;gBACxB,OAAO,OAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YACD,GAAG,EAAE,UAAC,OAAO,EAAE,QAAQ,EAAE,KAAK;gBAC1B,OAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAC1B,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,GAAG,EAAE,UAAC,OAAO,EAAE,QAAQ;gBACnB,OAAO,OAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC9B,CAAC;SACJ,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,GAAG,IAAI,KAAK,CAAC,cAAQ,CAAC,EAAE;YACnC,KAAK,EAAE,UAAC,OAAO,EAAE,KAAK,EAAE,IAAI;gBACxB,OAAO,OAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAI,EAAE,IAAI,CAAC,CAAC;YAC/C,CAAC;YACD,GAAG,EAAE,UAAC,OAAO,EAAE,QAAQ,EAAE,KAAK;gBAC1B,OAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAC7C,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,GAAG,EAAE,UAAC,OAAO,EAAE,QAAQ;gBACnB,OAAO,OAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAI,EAAE,QAAQ,CAAC,CAAC;YACjD,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;IAED,uBAAK,GAAL,UAAM,IAAW;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,qBAAG,GAAH,UAAI,QAAqB,EAAE,KAAU;QACjC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,qBAAG,GAAH,UAAI,QAAqB;QACrB,IAAG,QAAQ,KAAK,uBAAU;YACtB,OAAO,IAAI,CAAC;QAEhB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED,sBAAW,0BAAK;aAAhB;YACI,OAAO,IAAI,CAAC,MAAM,CAAC;QACvB,CAAC;;;OAAA;IAED,sBAAW,8BAAS;aAApB;YACI,OAAO,IAAI,CAAC,UAAU,CAAC;QAC3B,CAAC;;;OAAA;IAED,sBAAW,iCAAY;aAAvB;YACI,OAAO,IAAI,CAAC,aAAa,CAAC;QAC9B,CAAC;;;OAAA;IAED,sBAAW,0BAAK;aAAhB,UAAiB,KAAmB;YAChC,IAAG,IAAI,CAAC,MAAM,KAAK,KAAK;gBACpB,OAAO;YAEX,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACpB,IAAG,KAAK,CAAC,YAAY;gBACjB,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;;;OAAA;IACL,cAAC;AAAD,CAAC,AA1ED,IA0EC;AA1EY,0BAAO","sourcesContent":["import { ContextState } from \"./states/ContextState\";\r\nimport { InitialState } from \"./states/InitialState\";\r\nimport { HandlerKey } from \"./Substitute\";\r\n\r\nexport class Context {\r\n private _initialState: InitialState;\r\n\r\n private _proxy: any;\r\n private _rootProxy: any;\r\n \r\n private _state: ContextState;\r\n\r\n constructor() {\r\n this._initialState = new InitialState();\r\n this._state = this._initialState;\r\n\r\n this._proxy = new Proxy(() => { }, {\r\n apply: (_target, _this, args) => {\r\n return this.apply(args);\r\n },\r\n set: (_target, property, value) => {\r\n this.set(property, value);\r\n return true;\r\n },\r\n get: (_target, property) => {\r\n return this.get(property);\r\n }\r\n });\r\n\r\n this._rootProxy = new Proxy(() => { }, {\r\n apply: (_target, _this, args) => {\r\n return this.initialState.apply(this, args);\r\n },\r\n set: (_target, property, value) => {\r\n this.initialState.set(this, property, value);\r\n return true;\r\n },\r\n get: (_target, property) => {\r\n return this.initialState.get(this, property);\r\n }\r\n });\r\n }\r\n\r\n apply(args: any[]) {\r\n return this._state.apply(this, args);\r\n }\r\n\r\n set(property: PropertyKey, value: any) {\r\n return this._state.set(this, property, value);\r\n }\r\n\r\n get(property: PropertyKey) {\r\n if(property === HandlerKey)\r\n return this;\r\n\r\n return this._state.get(this, property);\r\n }\r\n\r\n public get proxy() {\r\n return this._proxy;\r\n }\r\n\r\n public get rootProxy() {\r\n return this._rootProxy;\r\n }\r\n\r\n public get initialState() {\r\n return this._initialState;\r\n }\r\n\r\n public set state(state: ContextState) {\r\n if(this._state === state)\r\n return;\r\n\r\n this._state = state;\r\n if(state.onSwitchedTo)\r\n state.onSwitchedTo(this);\r\n }\r\n}"]} \ No newline at end of file diff --git a/dist/src/Utilities.js b/dist/src/Utilities.js index 3a2433b..efded2b 100644 --- a/dist/src/Utilities.js +++ b/dist/src/Utilities.js @@ -53,10 +53,40 @@ function stringifyCalls(calls) { exports.stringifyCalls = stringifyCalls; ; function areArgumentsEqual(a, b) { + var e_2, _a, e_3, _b; if (a instanceof Arguments_1.AllArguments || b instanceof Arguments_1.AllArguments) return true; - if (a instanceof Arguments_1.Argument && b instanceof Arguments_1.Argument) - return a.matches(b) && b.matches(a); + if (a instanceof Arguments_1.Argument && b instanceof Arguments_1.Argument) { + try { + for (var _c = __values(a.encounteredValues), _d = _c.next(); !_d.done; _d = _c.next()) { + var encounteredValue = _d.value; + if (!b.matches(encounteredValue)) + return false; + } + } + catch (e_2_1) { e_2 = { error: e_2_1 }; } + finally { + try { + if (_d && !_d.done && (_a = _c.return)) _a.call(_c); + } + finally { if (e_2) throw e_2.error; } + } + try { + for (var _e = __values(b.encounteredValues), _f = _e.next(); !_f.done; _f = _e.next()) { + var encounteredValue = _f.value; + if (!a.matches(encounteredValue)) + return false; + } + } + catch (e_3_1) { e_3 = { error: e_3_1 }; } + finally { + try { + if (_f && !_f.done && (_b = _e.return)) _b.call(_e); + } + finally { if (e_3) throw e_3.error; } + } + return true; + } if (a instanceof Arguments_1.Argument) return a.matches(b); if (b instanceof Arguments_1.Argument) diff --git a/dist/src/Utilities.js.map b/dist/src/Utilities.js.map index 6d21777..85b5fb7 100644 --- a/dist/src/Utilities.js.map +++ b/dist/src/Utilities.js.map @@ -1 +1 @@ -{"version":3,"file":"Utilities.js","sourceRoot":"","sources":["../../src/Utilities.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yCAAqD;AACrD,2BAA6B;AAI7B,SAAgB,kBAAkB,CAAC,IAAW;IAC1C,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAf,CAAe,CAAC,CAAC;IACtC,OAAO,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC;AAC5F,CAAC;AAHD,gDAGC;AAAA,CAAC;AAEF,SAAgB,sBAAsB,CAAC,CAAQ,EAAE,CAAQ;IACrD,KAAI,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAC,CAAC,EAAE,EAAE;QAC5C,IAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,OAAO,KAAK,CAAC;KACpB;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAPD,wDAOC;AAED,SAAgB,cAAc,CAAC,KAAa;;IACxC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,SAAS,GAAG,CAAC,EAAf,CAAe,CAAC,CAAC;IAE3C,IAAG,KAAK,CAAC,MAAM,KAAK,CAAC;QACjB,OAAO,aAAa,CAAC;IAEzB,IAAI,MAAM,GAAG,EAAE,CAAC;;QAChB,KAAiB,IAAA,UAAA,SAAA,KAAK,CAAA,4BAAA,+CAAE;YAAnB,IAAI,IAAI,kBAAA;YACT,MAAM,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;YAC7C,MAAM,IAAI,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAE1C,IAAG,IAAI,CAAC,SAAS;gBACb,MAAM,IAAI,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAC/D;;;;;;;;;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAhBD,wCAgBC;AAAA,CAAC;AAEF,SAAgB,iBAAiB,CAAC,CAAM,EAAE,CAAM;IAC5C,IAAG,CAAC,YAAY,wBAAY,IAAI,CAAC,YAAY,wBAAY;QACrD,OAAO,IAAI,CAAC;IAEhB,IAAG,CAAC,YAAY,oBAAQ,IAAI,CAAC,YAAY,oBAAQ;QAC7C,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAExC,IAAG,CAAC,YAAY,oBAAQ;QACpB,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAExB,IAAG,CAAC,YAAY,oBAAQ;QACpB,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAExB,IAAI,CAAC,OAAO,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,IAAI,CAAC;QACpF,OAAO,IAAI,CAAC;IAEhB,OAAO,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC;AAjBD,8CAiBC;AAAA,CAAC","sourcesContent":["import { Argument, AllArguments } from \"./Arguments\";\r\nimport util = require('util')\r\n\r\nexport type Call = {callCount: number, arguments?: any[]};\r\n\r\nexport function stringifyArguments(args: any[]) {\r\n args = args.map(x => util.inspect(x));\r\n return args && args.length > 0 ? 'arguments [' + args.join(', ') + ']' : 'no arguments';\r\n};\r\n\r\nexport function areArgumentArraysEqual(a: any[], b: any[]) {\r\n for(var i=0;i x.callCount > 0);\r\n\r\n if(calls.length === 0)\r\n return ' (no calls)';\r\n\r\n let output = '';\r\n for (let call of calls) {\r\n output += '\\n-> ' + call.callCount + ' call';\r\n output += call.callCount !== 1 ? 's' : '';\r\n\r\n if(call.arguments) \r\n output += ' with ' + stringifyArguments(call.arguments);\r\n }\r\n\r\n return output;\r\n};\r\n\r\nexport function areArgumentsEqual(a: any, b: any) {\r\n if(a instanceof AllArguments || b instanceof AllArguments)\r\n return true;\r\n\r\n if(a instanceof Argument && b instanceof Argument)\r\n return a.matches(b) && b.matches(a);\r\n\r\n if(a instanceof Argument) \r\n return a.matches(b);\r\n\r\n if(b instanceof Argument)\r\n return b.matches(a);\r\n\r\n if ((typeof a === 'undefined' || a === null) && (typeof b === 'undefined' || b === null))\r\n return true;\r\n\r\n return a === b;\r\n};"]} \ No newline at end of file +{"version":3,"file":"Utilities.js","sourceRoot":"","sources":["../../src/Utilities.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yCAAqD;AACrD,2BAA6B;AAI7B,SAAgB,kBAAkB,CAAC,IAAW;IAC1C,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAf,CAAe,CAAC,CAAC;IACtC,OAAO,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC;AAC5F,CAAC;AAHD,gDAGC;AAAA,CAAC;AAEF,SAAgB,sBAAsB,CAAC,CAAQ,EAAE,CAAQ;IACrD,KAAI,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAC,CAAC,EAAE,EAAE;QAC5C,IAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,OAAO,KAAK,CAAC;KACpB;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAPD,wDAOC;AAED,SAAgB,cAAc,CAAC,KAAa;;IACxC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,SAAS,GAAG,CAAC,EAAf,CAAe,CAAC,CAAC;IAE3C,IAAG,KAAK,CAAC,MAAM,KAAK,CAAC;QACjB,OAAO,aAAa,CAAC;IAEzB,IAAI,MAAM,GAAG,EAAE,CAAC;;QAChB,KAAiB,IAAA,UAAA,SAAA,KAAK,CAAA,4BAAA,+CAAE;YAAnB,IAAI,IAAI,kBAAA;YACT,MAAM,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;YAC7C,MAAM,IAAI,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAE1C,IAAG,IAAI,CAAC,SAAS;gBACb,MAAM,IAAI,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAC/D;;;;;;;;;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAhBD,wCAgBC;AAAA,CAAC;AAEF,SAAgB,iBAAiB,CAAC,CAAM,EAAE,CAAM;;IAC5C,IAAG,CAAC,YAAY,wBAAY,IAAI,CAAC,YAAY,wBAAY;QACrD,OAAO,IAAI,CAAC;IAEhB,IAAG,CAAC,YAAY,oBAAQ,IAAI,CAAC,YAAY,oBAAQ,EAAE;;YAC/C,KAA4B,IAAA,KAAA,SAAA,CAAC,CAAC,iBAAiB,CAAA,gBAAA,4BAAE;gBAA7C,IAAI,gBAAgB,WAAA;gBACpB,IAAG,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;oBAC3B,OAAO,KAAK,CAAC;aACpB;;;;;;;;;;YAED,KAA4B,IAAA,KAAA,SAAA,CAAC,CAAC,iBAAiB,CAAA,gBAAA,4BAAE;gBAA7C,IAAI,gBAAgB,WAAA;gBACpB,IAAG,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;oBAC3B,OAAO,KAAK,CAAC;aACpB;;;;;;;;;QAED,OAAO,IAAI,CAAC;KACf;IAED,IAAG,CAAC,YAAY,oBAAQ;QACpB,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAExB,IAAG,CAAC,YAAY,oBAAQ;QACpB,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAExB,IAAI,CAAC,OAAO,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,IAAI,CAAC;QACpF,OAAO,IAAI,CAAC;IAEhB,OAAO,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC;AA5BD,8CA4BC;AAAA,CAAC","sourcesContent":["import { Argument, AllArguments } from \"./Arguments\";\r\nimport util = require('util')\r\n\r\nexport type Call = {callCount: number, arguments?: any[]};\r\n\r\nexport function stringifyArguments(args: any[]) {\r\n args = args.map(x => util.inspect(x));\r\n return args && args.length > 0 ? 'arguments [' + args.join(', ') + ']' : 'no arguments';\r\n};\r\n\r\nexport function areArgumentArraysEqual(a: any[], b: any[]) {\r\n for(var i=0;i x.callCount > 0);\r\n\r\n if(calls.length === 0)\r\n return ' (no calls)';\r\n\r\n let output = '';\r\n for (let call of calls) {\r\n output += '\\n-> ' + call.callCount + ' call';\r\n output += call.callCount !== 1 ? 's' : '';\r\n\r\n if(call.arguments) \r\n output += ' with ' + stringifyArguments(call.arguments);\r\n }\r\n\r\n return output;\r\n};\r\n\r\nexport function areArgumentsEqual(a: any, b: any) {\r\n if(a instanceof AllArguments || b instanceof AllArguments)\r\n return true;\r\n\r\n if(a instanceof Argument && b instanceof Argument) {\r\n for(let encounteredValue of a.encounteredValues) {\r\n if(!b.matches(encounteredValue))\r\n return false;\r\n }\r\n\r\n for(let encounteredValue of b.encounteredValues) {\r\n if(!a.matches(encounteredValue))\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n if(a instanceof Argument) \r\n return a.matches(b);\r\n\r\n if(b instanceof Argument)\r\n return b.matches(a);\r\n\r\n if ((typeof a === 'undefined' || a === null) && (typeof b === 'undefined' || b === null))\r\n return true;\r\n\r\n return a === b;\r\n};"]} \ No newline at end of file diff --git a/dist/src/states/FunctionState.js b/dist/src/states/FunctionState.js index 35f0208..0678ebe 100644 --- a/dist/src/states/FunctionState.js +++ b/dist/src/states/FunctionState.js @@ -1,6 +1,17 @@ "use strict"; +var __values = (this && this.__values) || function (o) { + var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0; + if (m) return m.call(o); + return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; +}; Object.defineProperty(exports, "__esModule", { value: true }); var Utilities_1 = require("../Utilities"); +var Arguments_1 = require("../Arguments"); var Nothing = Symbol(); var FunctionState = /** @class */ (function () { function FunctionState(_getPropertyState) { @@ -35,18 +46,54 @@ var FunctionState = /** @class */ (function () { configurable: true }); FunctionState.prototype.apply = function (context, args) { + var e_1, _a, e_2, _b; var callCount = this._callCount; var hasExpectations = context.initialState.hasExpectations; + var matchingFunctionStates = this._getPropertyState + .recordedFunctionStates + .filter(function (x) { return Utilities_1.areArgumentArraysEqual(x.arguments, args); }); if (hasExpectations) { - callCount = this._getPropertyState - .recordedFunctionStates - .filter(function (x) { return Utilities_1.areArgumentArraysEqual(x.arguments, args); }) + callCount = matchingFunctionStates .map(function (x) { return x.callCount; }) .reduce(function (a, b) { return a + b; }, 0); } context.initialState.assertCallCountMatchesExpectations(this._getPropertyState.recordedFunctionStates, callCount, 'method', this.property, args); - if (!hasExpectations) + if (!hasExpectations) { this._callCount++; + try { + for (var matchingFunctionStates_1 = __values(matchingFunctionStates), matchingFunctionStates_1_1 = matchingFunctionStates_1.next(); !matchingFunctionStates_1_1.done; matchingFunctionStates_1_1 = matchingFunctionStates_1.next()) { + var matchingFunctionState = matchingFunctionStates_1_1.value; + try { + for (var _c = __values(matchingFunctionState.arguments), _d = _c.next(); !_d.done; _d = _c.next()) { + var argument = _d.value; + if (!(argument instanceof Arguments_1.Argument)) + continue; + var indexOffset = matchingFunctionState + .arguments + .indexOf(argument); + var myArg = args[indexOffset]; + if (myArg instanceof Arguments_1.Argument) + continue; + argument.encounteredValues.push(myArg); + } + } + catch (e_2_1) { e_2 = { error: e_2_1 }; } + finally { + try { + if (_d && !_d.done && (_b = _c.return)) _b.call(_c); + } + finally { if (e_2) throw e_2.error; } + } + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (matchingFunctionStates_1_1 && !matchingFunctionStates_1_1.done && (_a = matchingFunctionStates_1.return)) _a.call(matchingFunctionStates_1); + } + finally { if (e_1) throw e_1.error; } + } + } if (this.mimicks) return this.mimicks.apply(this.mimicks, args); if (this.returns === Nothing) @@ -64,7 +111,6 @@ var FunctionState = /** @class */ (function () { return void 0; if (property === 'mimicks') { return function (input) { - // console.log('mimicks', input); _this.mimicks = input; _this._callCount--; context.state = context.initialState; @@ -74,7 +120,6 @@ var FunctionState = /** @class */ (function () { if (this.returns !== Nothing) throw new Error('The return value for the function ' + this._getPropertyState.toString() + ' with ' + Utilities_1.stringifyArguments(this._arguments) + ' has already been set to ' + this.returns); return function () { - // console.log('returns', returns); var returns = []; for (var _i = 0; _i < arguments.length; _i++) { returns[_i] = arguments[_i]; diff --git a/dist/src/states/FunctionState.js.map b/dist/src/states/FunctionState.js.map index 4eb3921..0265cd8 100644 --- a/dist/src/states/FunctionState.js.map +++ b/dist/src/states/FunctionState.js.map @@ -1 +1 @@ -{"version":3,"file":"FunctionState.js","sourceRoot":"","sources":["../../../src/states/FunctionState.ts"],"names":[],"mappings":"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","sourcesContent":["import { ContextState, PropertyKey } from \"./ContextState\";\r\nimport { Context } from \"src/Context\";\r\nimport { stringifyArguments, stringifyCalls, areArgumentsEqual, areArgumentArraysEqual } from \"../Utilities\";\r\nimport { GetPropertyState } from \"./GetPropertyState\";\r\n\r\nconst Nothing = Symbol();\r\n\r\nexport class FunctionState implements ContextState {\r\n private returns: any[]|Symbol;\r\n private mimicks: Function;\r\n\r\n private _callCount: number;\r\n private _arguments: any[];\r\n\r\n public get arguments() {\r\n return this._arguments;\r\n }\r\n\r\n public get callCount() {\r\n return this._callCount;\r\n }\r\n\r\n public get property() {\r\n return this._getPropertyState.property;\r\n }\r\n\r\n constructor(private _getPropertyState: GetPropertyState, ...args: any[]) {\r\n this._arguments = args;\r\n this.returns = Nothing;\r\n this._callCount = 0;\r\n }\r\n\r\n apply(context: Context, args: any[]) {\r\n let callCount = this._callCount;\r\n const hasExpectations = context.initialState.hasExpectations;\r\n if(hasExpectations) {\r\n callCount = this._getPropertyState\r\n .recordedFunctionStates\r\n .filter(x => areArgumentArraysEqual(x.arguments, args))\r\n .map(x => x.callCount)\r\n .reduce((a, b) => a + b, 0);\r\n }\r\n\r\n context.initialState.assertCallCountMatchesExpectations(\r\n this._getPropertyState.recordedFunctionStates,\r\n callCount,\r\n 'method',\r\n this.property,\r\n args);\r\n\r\n if(!hasExpectations)\r\n this._callCount++;\r\n\r\n if(this.mimicks)\r\n return this.mimicks.apply(this.mimicks, args);\r\n\r\n if(this.returns === Nothing)\r\n return context.proxy;\r\n\r\n var returnsArray = this.returns as any[];\r\n if(returnsArray.length === 1)\r\n return returnsArray[0];\r\n\r\n return returnsArray[this._callCount-1];\r\n }\r\n\r\n set(context: Context, property: PropertyKey, value: any) {\r\n }\r\n\r\n get(context: Context, property: PropertyKey) {\r\n if (property === 'then')\r\n return void 0;\r\n\r\n if(property === 'mimicks') {\r\n return (input: Function) => {\r\n // console.log('mimicks', input);\r\n\r\n this.mimicks = input;\r\n this._callCount--;\r\n\r\n context.state = context.initialState;\r\n }\r\n }\r\n\r\n if(property === 'returns') {\r\n if(this.returns !== Nothing)\r\n throw new Error('The return value for the function ' + this._getPropertyState.toString() + ' with ' + stringifyArguments(this._arguments) + ' has already been set to ' + this.returns);\r\n\r\n return (...returns: any[]) => {\r\n // console.log('returns', returns);\r\n\r\n this.returns = returns;\r\n this._callCount--;\r\n\r\n context.state = context.initialState;\r\n };\r\n }\r\n\r\n return context.proxy;\r\n }\r\n}"]} \ No newline at end of file +{"version":3,"file":"FunctionState.js","sourceRoot":"","sources":["../../../src/states/FunctionState.ts"],"names":[],"mappings":"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","sourcesContent":["import { ContextState, PropertyKey } from \"./ContextState\";\r\nimport { Context } from \"src/Context\";\r\nimport { stringifyArguments, stringifyCalls, areArgumentsEqual, areArgumentArraysEqual } from \"../Utilities\";\r\nimport { GetPropertyState } from \"./GetPropertyState\";\r\nimport { Argument } from \"../Arguments\";\r\n\r\nconst Nothing = Symbol();\r\n\r\nexport class FunctionState implements ContextState {\r\n private returns: any[]|Symbol;\r\n private mimicks: Function;\r\n\r\n private _callCount: number;\r\n private _arguments: any[];\r\n\r\n public get arguments() {\r\n return this._arguments;\r\n }\r\n\r\n public get callCount() {\r\n return this._callCount;\r\n }\r\n\r\n public get property() {\r\n return this._getPropertyState.property;\r\n }\r\n\r\n constructor(private _getPropertyState: GetPropertyState, ...args: any[]) {\r\n this._arguments = args;\r\n this.returns = Nothing;\r\n this._callCount = 0;\r\n }\r\n\r\n apply(context: Context, args: any[]) {\r\n let callCount = this._callCount;\r\n const hasExpectations = context.initialState.hasExpectations;\r\n const matchingFunctionStates = this._getPropertyState\r\n .recordedFunctionStates\r\n .filter(x => areArgumentArraysEqual(x.arguments, args));\r\n if(hasExpectations) {\r\n callCount = matchingFunctionStates\r\n .map(x => x.callCount)\r\n .reduce((a, b) => a + b, 0);\r\n }\r\n\r\n context.initialState.assertCallCountMatchesExpectations(\r\n this._getPropertyState.recordedFunctionStates,\r\n callCount,\r\n 'method',\r\n this.property,\r\n args);\r\n\r\n if(!hasExpectations) {\r\n this._callCount++;\r\n\r\n for(let matchingFunctionState of matchingFunctionStates)\r\n for(let argument of matchingFunctionState.arguments) {\r\n if(!(argument instanceof Argument))\r\n continue;\r\n\r\n const indexOffset = matchingFunctionState\r\n .arguments\r\n .indexOf(argument);\r\n const myArg = args[indexOffset];\r\n if(myArg instanceof Argument)\r\n continue;\r\n\r\n argument.encounteredValues.push(myArg);\r\n }\r\n }\r\n\r\n if(this.mimicks)\r\n return this.mimicks.apply(this.mimicks, args);\r\n\r\n if(this.returns === Nothing)\r\n return context.proxy;\r\n\r\n var returnsArray = this.returns as any[];\r\n if(returnsArray.length === 1)\r\n return returnsArray[0];\r\n\r\n return returnsArray[this._callCount-1];\r\n }\r\n\r\n set(context: Context, property: PropertyKey, value: any) {\r\n }\r\n\r\n get(context: Context, property: PropertyKey) {\r\n if (property === 'then')\r\n return void 0;\r\n\r\n if(property === 'mimicks') {\r\n return (input: Function) => {\r\n this.mimicks = input;\r\n this._callCount--;\r\n\r\n context.state = context.initialState;\r\n }\r\n }\r\n\r\n if(property === 'returns') {\r\n if(this.returns !== Nothing)\r\n throw new Error('The return value for the function ' + this._getPropertyState.toString() + ' with ' + stringifyArguments(this._arguments) + ' has already been set to ' + this.returns);\r\n\r\n return (...returns: any[]) => {\r\n this.returns = returns;\r\n this._callCount--;\r\n\r\n context.state = context.initialState;\r\n };\r\n }\r\n\r\n return context.proxy;\r\n }\r\n}"]} \ No newline at end of file diff --git a/dist/src/states/GetPropertyState.js b/dist/src/states/GetPropertyState.js index c49395a..3470ad1 100644 --- a/dist/src/states/GetPropertyState.js +++ b/dist/src/states/GetPropertyState.js @@ -62,13 +62,11 @@ var GetPropertyState = /** @class */ (function () { this._callCount = 0; var matchingFunctionState = this._recordedFunctionStates.find(function (x) { return Utilities_1.areArgumentArraysEqual(x.arguments, args); }); if (matchingFunctionState) { - // console.log('ex-func'); return matchingFunctionState.apply(context, args); } var functionState = new (FunctionState_1.FunctionState.bind.apply(FunctionState_1.FunctionState, __spread([void 0, this], args)))(); context.state = functionState; this._recordedFunctionStates.push(functionState); - // console.log('states', this._recordedFunctionStates); return context.apply(args); }; GetPropertyState.prototype.set = function (context, property, value) { @@ -82,7 +80,6 @@ var GetPropertyState = /** @class */ (function () { return context.proxy; if (property === 'mimicks') { return function (input) { - // console.log('mimicks', input); _this.mimicks = input; _this._callCount--; context.state = context.initialState; @@ -92,7 +89,6 @@ var GetPropertyState = /** @class */ (function () { if (this.returns !== Nothing) throw new Error('The return value for the property ' + this._property.toString() + ' has already been set to ' + this.returns); return function () { - // console.log('returns', returns); var returns = []; for (var _i = 0; _i < arguments.length; _i++) { returns[_i] = arguments[_i]; diff --git a/dist/src/states/GetPropertyState.js.map b/dist/src/states/GetPropertyState.js.map index 8ed75ad..5257491 100644 --- a/dist/src/states/GetPropertyState.js.map +++ b/dist/src/states/GetPropertyState.js.map @@ -1 +1 @@ -{"version":3,"file":"GetPropertyState.js","sourceRoot":"","sources":["../../../src/states/GetPropertyState.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAEA,iDAAgD;AAChD,0CAAyE;AAEzE,IAAM,OAAO,GAAG,MAAM,EAAE,CAAC;AAEzB;IAuBI,0BAAoB,SAAsB;QAAtB,cAAS,GAAT,SAAS,CAAa;QACtC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,uBAAuB,GAAG,EAAE,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;IACxB,CAAC;IApBD,sBAAY,wCAAU;aAAtB;YACI,OAAO,IAAI,CAAC,uBAAuB,CAAC,MAAM,GAAG,CAAC,CAAC;QACnD,CAAC;;;OAAA;IAED,sBAAW,sCAAQ;aAAnB;YACI,OAAO,IAAI,CAAC,SAAS,CAAC;QAC1B,CAAC;;;OAAA;IAED,sBAAW,uCAAS;aAApB;YACI,OAAO,IAAI,CAAC,UAAU,CAAC;QAC3B,CAAC;;;OAAA;IAED,sBAAW,oDAAsB;aAAjC;YACI,gBAAW,IAAI,CAAC,uBAAuB,EAAE;QAC7C,CAAC;;;OAAA;IAQD,gCAAK,GAAL,UAAM,OAAgB,EAAE,IAAW;QAC/B,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QAEpB,IAAM,qBAAqB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,UAAA,CAAC,IAAI,OAAA,kCAAsB,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,EAAzC,CAAyC,CAAC,CAAC;QAChH,IAAG,qBAAqB,EAAE;YACtB,0BAA0B;YAC1B,OAAO,qBAAqB,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;SACrD;QAED,IAAI,aAAa,QAAO,6BAAa,YAAb,6BAAa,oBAAC,IAAI,GAAK,IAAI,KAAC,CAAC;QACrD,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC;QAE9B,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAEjD,uDAAuD;QAEvD,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,8BAAG,GAAH,UAAI,OAAgB,EAAE,QAAqB,EAAE,KAAU;IACvD,CAAC;IAED,8BAAG,GAAH,UAAI,OAAgB,EAAE,QAAqB;QAA3C,iBA0DC;QAzDG,IAAM,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC;QAE7D,IAAI,QAAQ,KAAK,MAAM;YACnB,OAAO,KAAK,CAAC,CAAC;QAElB,IAAG,IAAI,CAAC,UAAU;YACd,OAAO,OAAO,CAAC,KAAK,CAAC;QAEzB,IAAG,QAAQ,KAAK,SAAS,EAAE;YACvB,OAAO,UAAC,KAAe;gBACnB,iCAAiC;gBAEjC,KAAI,CAAC,OAAO,GAAG,KAAK,CAAC;gBACrB,KAAI,CAAC,UAAU,EAAE,CAAC;gBAElB,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC;YACzC,CAAC,CAAA;SACJ;QAED,IAAG,QAAQ,KAAK,SAAS,EAAE;YACvB,IAAG,IAAI,CAAC,OAAO,KAAK,OAAO;gBACvB,MAAM,IAAI,KAAK,CAAC,oCAAoC,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,2BAA2B,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YAEnI,OAAO;gBACH,mCAAmC;gBAD/B,iBAAiB;qBAAjB,UAAiB,EAAjB,qBAAiB,EAAjB,IAAiB;oBAAjB,4BAAiB;;gBAGrB,KAAI,CAAC,OAAO,GAAG,OAAO,CAAC;gBACvB,KAAI,CAAC,UAAU,EAAE,CAAC;gBAElB,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC;YACzC,CAAC,CAAC;SACL;QAED,IAAG,CAAC,eAAe,EAAE;YACjB,IAAI,CAAC,UAAU,EAAE,CAAC;YAElB,IAAG,IAAI,CAAC,OAAO,EAAE;gBACb,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aAC3C;YAED,IAAG,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE;gBACzB,IAAI,YAAY,GAAG,IAAI,CAAC,OAAgB,CAAC;gBACzC,IAAG,YAAY,CAAC,MAAM,KAAK,CAAC;oBACxB,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;gBAE3B,OAAO,YAAY,CAAC,IAAI,CAAC,UAAU,GAAC,CAAC,CAAC,CAAC;aAC1C;SACJ;QAED,OAAO,CAAC,YAAY,CAAC,kCAAkC,CACnD,OAAO,CAAC,YAAY,CAAC,iBAAiB,EACtC,IAAI,CAAC,SAAS,EACd,UAAU,EACV,IAAI,CAAC,QAAQ,EACb,EAAE,CAAC,CAAC;QAER,OAAO,OAAO,CAAC,KAAK,CAAC;IACzB,CAAC;IACL,uBAAC;AAAD,CAAC,AA9GD,IA8GC;AA9GY,4CAAgB","sourcesContent":["import { ContextState, PropertyKey } from \"./ContextState\";\r\nimport { Context } from \"src/Context\";\r\nimport { FunctionState } from \"./FunctionState\";\r\nimport { areArgumentsEqual, areArgumentArraysEqual } from \"../Utilities\";\r\n\r\nconst Nothing = Symbol();\r\n\r\nexport class GetPropertyState implements ContextState {\r\n private returns: any[]|Symbol;\r\n private mimicks: Function;\r\n\r\n private _callCount: number;\r\n private _recordedFunctionStates: FunctionState[];\r\n\r\n private get isFunction() {\r\n return this._recordedFunctionStates.length > 0;\r\n }\r\n\r\n public get property() {\r\n return this._property;\r\n }\r\n\r\n public get callCount() {\r\n return this._callCount;\r\n }\r\n\r\n public get recordedFunctionStates() {\r\n return [...this._recordedFunctionStates];\r\n }\r\n\r\n constructor(private _property: PropertyKey) {\r\n this.returns = Nothing;\r\n this._recordedFunctionStates = [];\r\n this._callCount = 0;\r\n }\r\n\r\n apply(context: Context, args: any[]) {\r\n this._callCount = 0;\r\n\r\n const matchingFunctionState = this._recordedFunctionStates.find(x => areArgumentArraysEqual(x.arguments, args));\r\n if(matchingFunctionState) {\r\n // console.log('ex-func');\r\n return matchingFunctionState.apply(context, args);\r\n }\r\n\r\n var functionState = new FunctionState(this, ...args);\r\n context.state = functionState;\r\n\r\n this._recordedFunctionStates.push(functionState);\r\n\r\n // console.log('states', this._recordedFunctionStates);\r\n\r\n return context.apply(args);\r\n }\r\n\r\n set(context: Context, property: PropertyKey, value: any) {\r\n }\r\n\r\n get(context: Context, property: PropertyKey) {\r\n const hasExpectations = context.initialState.hasExpectations;\r\n\r\n if (property === 'then')\r\n return void 0;\r\n\r\n if(this.isFunction)\r\n return context.proxy;\r\n\r\n if(property === 'mimicks') {\r\n return (input: Function) => {\r\n // console.log('mimicks', input);\r\n\r\n this.mimicks = input;\r\n this._callCount--;\r\n\r\n context.state = context.initialState;\r\n }\r\n }\r\n\r\n if(property === 'returns') {\r\n if(this.returns !== Nothing)\r\n throw new Error('The return value for the property ' + this._property.toString() + ' has already been set to ' + this.returns);\r\n\r\n return (...returns: any[]) => {\r\n // console.log('returns', returns);\r\n\r\n this.returns = returns;\r\n this._callCount--;\r\n\r\n context.state = context.initialState;\r\n };\r\n }\r\n\r\n if(!hasExpectations) {\r\n this._callCount++;\r\n\r\n if(this.mimicks) {\r\n return this.mimicks.apply(this.mimicks);\r\n }\r\n\r\n if(this.returns !== Nothing) {\r\n var returnsArray = this.returns as any[];\r\n if(returnsArray.length === 1)\r\n return returnsArray[0];\r\n \r\n return returnsArray[this._callCount-1];\r\n }\r\n }\r\n\r\n context.initialState.assertCallCountMatchesExpectations(\r\n context.initialState.getPropertyStates,\r\n this.callCount,\r\n 'property',\r\n this.property,\r\n []);\r\n\r\n return context.proxy;\r\n }\r\n}"]} \ No newline at end of file +{"version":3,"file":"GetPropertyState.js","sourceRoot":"","sources":["../../../src/states/GetPropertyState.ts"],"names":[],"mappings":"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","sourcesContent":["import { ContextState, PropertyKey } from \"./ContextState\";\r\nimport { Context } from \"src/Context\";\r\nimport { FunctionState } from \"./FunctionState\";\r\nimport { areArgumentsEqual, areArgumentArraysEqual } from \"../Utilities\";\r\n\r\nconst Nothing = Symbol();\r\n\r\nexport class GetPropertyState implements ContextState {\r\n private returns: any[]|Symbol;\r\n private mimicks: Function;\r\n\r\n private _callCount: number;\r\n private _recordedFunctionStates: FunctionState[];\r\n\r\n private get isFunction() {\r\n return this._recordedFunctionStates.length > 0;\r\n }\r\n\r\n public get property() {\r\n return this._property;\r\n }\r\n\r\n public get callCount() {\r\n return this._callCount;\r\n }\r\n\r\n public get recordedFunctionStates() {\r\n return [...this._recordedFunctionStates];\r\n }\r\n\r\n constructor(private _property: PropertyKey) {\r\n this.returns = Nothing;\r\n this._recordedFunctionStates = [];\r\n this._callCount = 0;\r\n }\r\n\r\n apply(context: Context, args: any[]) {\r\n this._callCount = 0;\r\n\r\n const matchingFunctionState = this._recordedFunctionStates.find(x => areArgumentArraysEqual(x.arguments, args));\r\n if(matchingFunctionState) {\r\n return matchingFunctionState.apply(context, args);\r\n }\r\n\r\n var functionState = new FunctionState(this, ...args);\r\n context.state = functionState;\r\n\r\n this._recordedFunctionStates.push(functionState);\r\n\r\n return context.apply(args);\r\n }\r\n\r\n set(context: Context, property: PropertyKey, value: any) {\r\n }\r\n\r\n get(context: Context, property: PropertyKey) {\r\n const hasExpectations = context.initialState.hasExpectations;\r\n\r\n if (property === 'then')\r\n return void 0;\r\n\r\n if(this.isFunction)\r\n return context.proxy;\r\n\r\n if(property === 'mimicks') {\r\n return (input: Function) => {\r\n this.mimicks = input;\r\n this._callCount--;\r\n\r\n context.state = context.initialState;\r\n }\r\n }\r\n\r\n if(property === 'returns') {\r\n if(this.returns !== Nothing)\r\n throw new Error('The return value for the property ' + this._property.toString() + ' has already been set to ' + this.returns);\r\n\r\n return (...returns: any[]) => {\r\n this.returns = returns;\r\n this._callCount--;\r\n\r\n context.state = context.initialState;\r\n };\r\n }\r\n\r\n if(!hasExpectations) {\r\n this._callCount++;\r\n\r\n if(this.mimicks) {\r\n return this.mimicks.apply(this.mimicks);\r\n }\r\n\r\n if(this.returns !== Nothing) {\r\n var returnsArray = this.returns as any[];\r\n if(returnsArray.length === 1)\r\n return returnsArray[0];\r\n \r\n return returnsArray[this._callCount-1];\r\n }\r\n }\r\n\r\n context.initialState.assertCallCountMatchesExpectations(\r\n context.initialState.getPropertyStates,\r\n this.callCount,\r\n 'property',\r\n this.property,\r\n []);\r\n\r\n return context.proxy;\r\n }\r\n}"]} \ No newline at end of file diff --git a/dist/src/states/InitialState.js b/dist/src/states/InitialState.js index b18e142..aaa517b 100644 --- a/dist/src/states/InitialState.js +++ b/dist/src/states/InitialState.js @@ -60,7 +60,6 @@ var InitialState = /** @class */ (function () { }); InitialState.prototype.assertCallCountMatchesExpectations = function (calls, callCount, type, property, args) { var expectedCount = this._expectedCount; - // console.log('exp-match', expectedCount, callCount); this.clearExpectations(); if (this.doesCallCountMatchExpectations(expectedCount, callCount)) return; @@ -83,13 +82,11 @@ var InitialState = /** @class */ (function () { var existingSetState = this.recordedSetPropertyStates.find(function (x) { return x.arguments[0] === value; }); ; if (existingSetState) { - // console.log('ex-prop'); return existingSetState.set(context, property, value); } var setPropertyState = new SetPropertyState_1.SetPropertyState(property, value); context.state = setPropertyState; this.recordedSetPropertyStates.push(setPropertyState); - // console.log('states', this.recordedSetPropertyStates); setPropertyState.set(context, property, value); }; InitialState.prototype.get = function (context, property) { @@ -120,7 +117,6 @@ var InitialState = /** @class */ (function () { return function () { return context.rootProxy; }; if (property === 'received') { return function (count) { - // console.log('expectation', count); _this._expectedCount = count === void 0 ? null : count; return context.proxy; }; @@ -136,7 +132,6 @@ var InitialState = /** @class */ (function () { return context.get(property); }; InitialState.prototype.clearExpectations = function () { - // console.log('reset-exp'); this._expectedCount = void 0; }; InitialState.prototype.onSwitchedTo = function () { diff --git a/dist/src/states/InitialState.js.map b/dist/src/states/InitialState.js.map index 0b5ebdd..a65c914 100644 --- a/dist/src/states/InitialState.js.map +++ b/dist/src/states/InitialState.js.map @@ -1 +1 @@ -{"version":3,"file":"InitialState.js","sourceRoot":"","sources":["../../../src/states/InitialState.ts"],"names":[],"mappings":"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","sourcesContent":["import { ContextState, PropertyKey } from \"./ContextState\";\r\nimport { Context } from \"src/Context\";\r\nimport { GetPropertyState } from \"./GetPropertyState\";\r\nimport { SetPropertyState } from \"./SetPropertyState\";\r\nimport { stringifyArguments, stringifyCalls, Call } from \"../Utilities\";\r\nimport { AreProxiesDisabledKey } from \"../Substitute\";\r\n\r\nexport class InitialState implements ContextState {\r\n private recordedGetPropertyStates: Map;\r\n private recordedSetPropertyStates: SetPropertyState[];\r\n \r\n private _expectedCount: number;\r\n private _areProxiesDisabled: boolean;\r\n\r\n public get expectedCount() {\r\n return this._expectedCount;\r\n }\r\n\r\n public get hasExpectations() {\r\n return this._expectedCount !== void 0;\r\n }\r\n\r\n public get setPropertyStates() {\r\n return [...this.recordedSetPropertyStates];\r\n }\r\n\r\n public get getPropertyStates() {\r\n return [...this.recordedGetPropertyStates.values()];\r\n }\r\n\r\n constructor() {\r\n this.recordedGetPropertyStates = new Map();\r\n this.recordedSetPropertyStates = [];\r\n\r\n this._expectedCount = void 0;\r\n }\r\n\r\n assertCallCountMatchesExpectations(calls: Call[], callCount: number, type: string, property: PropertyKey, args: any[]) {\r\n const expectedCount = this._expectedCount;\r\n // console.log('exp-match', expectedCount, callCount);\r\n\r\n this.clearExpectations();\r\n\r\n if(this.doesCallCountMatchExpectations(expectedCount, callCount))\r\n return;\r\n\r\n throw new Error('Expected ' + expectedCount + ' call' + (expectedCount === 1 ? '' : 's') + ' to the ' + type + ' ' + property.toString() + ' with ' + stringifyArguments(args) + ', but received ' + (callCount === 0 ? 'none' : callCount) + ' of such call' + (callCount === 1 ? '' : 's') + '.\\nAll calls received to ' + type + ' ' + property.toString() + ':' + stringifyCalls(calls));\r\n }\r\n\r\n private doesCallCountMatchExpectations(expectedCount: number, actualCount: number) {\r\n if (expectedCount === void 0)\r\n return true;\r\n\r\n if (expectedCount === null && actualCount > 0)\r\n return true;\r\n\r\n return expectedCount === actualCount;\r\n }\r\n\r\n apply(context: Context, args: any[]) {\r\n }\r\n\r\n set(context: Context, property: PropertyKey, value: any) {\r\n if(property === AreProxiesDisabledKey) {\r\n this._areProxiesDisabled = value;\r\n return;\r\n }\r\n\r\n const existingSetState = this.recordedSetPropertyStates.find(x => x.arguments[0] === value);;\r\n if (existingSetState) {\r\n // console.log('ex-prop');\r\n return existingSetState.set(context, property, value);\r\n }\r\n\r\n const setPropertyState = new SetPropertyState(property, value);\r\n context.state = setPropertyState;\r\n\r\n this.recordedSetPropertyStates.push(setPropertyState);\r\n\r\n // console.log('states', this.recordedSetPropertyStates);\r\n\r\n setPropertyState.set(context, property, value);\r\n }\r\n\r\n get(context: Context, property: PropertyKey) {\r\n if (typeof property === 'symbol') {\r\n if(property === AreProxiesDisabledKey)\r\n return this._areProxiesDisabled;\r\n\r\n if (property === Symbol.toPrimitive)\r\n return () => '{SubstituteJS fake}';\r\n\r\n if (property === Symbol.iterator)\r\n return void 0;\r\n\r\n if (property === Symbol.toStringTag)\r\n return 'Substitute';\r\n\r\n if(property.toString() === 'Symbol(util.inspect.custom)')\r\n return void 0;\r\n }\r\n\r\n if (property === 'valueOf')\r\n return '{SubstituteJS fake}';\r\n\r\n if (property === '$$typeof')\r\n return '{SubstituteJS fake}';\r\n\r\n if (property === 'length')\r\n return '{SubstituteJS fake}';\r\n\r\n if (property === 'toString')\r\n return '{SubstituteJS fake}';\r\n\r\n if (property === 'inspect')\r\n return () => '{SubstituteJS fake}';\r\n\r\n if (property === 'constructor')\r\n return () => context.rootProxy;\r\n\r\n if (property === 'received') {\r\n return (count?: number) => {\r\n // console.log('expectation', count);\r\n\r\n this._expectedCount = count === void 0 ? null : count;\r\n return context.proxy;\r\n };\r\n }\r\n\r\n const existingGetState = this.recordedGetPropertyStates.get(property);\r\n if (existingGetState) {\r\n context.state = existingGetState;\r\n return context.get(property);\r\n }\r\n\r\n const getState = new GetPropertyState(property);\r\n context.state = getState;\r\n\r\n this.recordedGetPropertyStates.set(property, getState);\r\n\r\n return context.get(property);\r\n }\r\n\r\n private clearExpectations() {\r\n // console.log('reset-exp');\r\n this._expectedCount = void 0;\r\n }\r\n\r\n onSwitchedTo() {\r\n this.clearExpectations();\r\n }\r\n}"]} \ No newline at end of file +{"version":3,"file":"InitialState.js","sourceRoot":"","sources":["../../../src/states/InitialState.ts"],"names":[],"mappings":"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","sourcesContent":["import { ContextState, PropertyKey } from \"./ContextState\";\r\nimport { Context } from \"src/Context\";\r\nimport { GetPropertyState } from \"./GetPropertyState\";\r\nimport { SetPropertyState } from \"./SetPropertyState\";\r\nimport { stringifyArguments, stringifyCalls, Call } from \"../Utilities\";\r\nimport { AreProxiesDisabledKey } from \"../Substitute\";\r\n\r\nexport class InitialState implements ContextState {\r\n private recordedGetPropertyStates: Map;\r\n private recordedSetPropertyStates: SetPropertyState[];\r\n \r\n private _expectedCount: number;\r\n private _areProxiesDisabled: boolean;\r\n\r\n public get expectedCount() {\r\n return this._expectedCount;\r\n }\r\n\r\n public get hasExpectations() {\r\n return this._expectedCount !== void 0;\r\n }\r\n\r\n public get setPropertyStates() {\r\n return [...this.recordedSetPropertyStates];\r\n }\r\n\r\n public get getPropertyStates() {\r\n return [...this.recordedGetPropertyStates.values()];\r\n }\r\n\r\n constructor() {\r\n this.recordedGetPropertyStates = new Map();\r\n this.recordedSetPropertyStates = [];\r\n\r\n this._expectedCount = void 0;\r\n }\r\n\r\n assertCallCountMatchesExpectations(calls: Call[], callCount: number, type: string, property: PropertyKey, args: any[]) {\r\n const expectedCount = this._expectedCount;\r\n\r\n this.clearExpectations();\r\n\r\n if(this.doesCallCountMatchExpectations(expectedCount, callCount))\r\n return;\r\n\r\n throw new Error('Expected ' + expectedCount + ' call' + (expectedCount === 1 ? '' : 's') + ' to the ' + type + ' ' + property.toString() + ' with ' + stringifyArguments(args) + ', but received ' + (callCount === 0 ? 'none' : callCount) + ' of such call' + (callCount === 1 ? '' : 's') + '.\\nAll calls received to ' + type + ' ' + property.toString() + ':' + stringifyCalls(calls));\r\n }\r\n\r\n private doesCallCountMatchExpectations(expectedCount: number, actualCount: number) {\r\n if (expectedCount === void 0)\r\n return true;\r\n\r\n if (expectedCount === null && actualCount > 0)\r\n return true;\r\n\r\n return expectedCount === actualCount;\r\n }\r\n\r\n apply(context: Context, args: any[]) {\r\n }\r\n\r\n set(context: Context, property: PropertyKey, value: any) {\r\n if(property === AreProxiesDisabledKey) {\r\n this._areProxiesDisabled = value;\r\n return;\r\n }\r\n\r\n const existingSetState = this.recordedSetPropertyStates.find(x => x.arguments[0] === value);;\r\n if (existingSetState) {\r\n return existingSetState.set(context, property, value);\r\n }\r\n\r\n const setPropertyState = new SetPropertyState(property, value);\r\n context.state = setPropertyState;\r\n\r\n this.recordedSetPropertyStates.push(setPropertyState);\r\n\r\n setPropertyState.set(context, property, value);\r\n }\r\n\r\n get(context: Context, property: PropertyKey) {\r\n if (typeof property === 'symbol') {\r\n if(property === AreProxiesDisabledKey)\r\n return this._areProxiesDisabled;\r\n\r\n if (property === Symbol.toPrimitive)\r\n return () => '{SubstituteJS fake}';\r\n\r\n if (property === Symbol.iterator)\r\n return void 0;\r\n\r\n if (property === Symbol.toStringTag)\r\n return 'Substitute';\r\n\r\n if(property.toString() === 'Symbol(util.inspect.custom)')\r\n return void 0;\r\n }\r\n\r\n if (property === 'valueOf')\r\n return '{SubstituteJS fake}';\r\n\r\n if (property === '$$typeof')\r\n return '{SubstituteJS fake}';\r\n\r\n if (property === 'length')\r\n return '{SubstituteJS fake}';\r\n\r\n if (property === 'toString')\r\n return '{SubstituteJS fake}';\r\n\r\n if (property === 'inspect')\r\n return () => '{SubstituteJS fake}';\r\n\r\n if (property === 'constructor')\r\n return () => context.rootProxy;\r\n\r\n if (property === 'received') {\r\n return (count?: number) => {\r\n this._expectedCount = count === void 0 ? null : count;\r\n return context.proxy;\r\n };\r\n }\r\n\r\n const existingGetState = this.recordedGetPropertyStates.get(property);\r\n if (existingGetState) {\r\n context.state = existingGetState;\r\n return context.get(property);\r\n }\r\n\r\n const getState = new GetPropertyState(property);\r\n context.state = getState;\r\n\r\n this.recordedGetPropertyStates.set(property, getState);\r\n\r\n return context.get(property);\r\n }\r\n\r\n private clearExpectations() {\r\n this._expectedCount = void 0;\r\n }\r\n\r\n onSwitchedTo() {\r\n this.clearExpectations();\r\n }\r\n}"]} \ No newline at end of file diff --git a/dist/src/states/SetPropertyState.js b/dist/src/states/SetPropertyState.js index 7ebe57c..71636d6 100644 --- a/dist/src/states/SetPropertyState.js +++ b/dist/src/states/SetPropertyState.js @@ -46,10 +46,10 @@ var SetPropertyState = /** @class */ (function () { .map(function (x) { return x._callCount; }) .reduce(function (a, b) { return a + b; }, 0); } - // console.log('prop', property, value, callCount); context.initialState.assertCallCountMatchesExpectations(context.initialState.setPropertyStates, callCount, 'property', this.property, this.arguments); - if (!hasExpectations) + if (!hasExpectations) { this._callCount++; + } }; SetPropertyState.prototype.get = function (context, property) { return void 0; diff --git a/dist/src/states/SetPropertyState.js.map b/dist/src/states/SetPropertyState.js.map index 9b5cee5..2bd219c 100644 --- a/dist/src/states/SetPropertyState.js.map +++ b/dist/src/states/SetPropertyState.js.map @@ -1 +1 @@ -{"version":3,"file":"SetPropertyState.js","sourceRoot":"","sources":["../../../src/states/SetPropertyState.ts"],"names":[],"mappings":";;AAEA,0CAAqE;AAErE,IAAM,OAAO,GAAG,MAAM,EAAE,CAAC;AAEzB;IAgBI,0BAAoB,SAAsB;QAAE,cAAc;aAAd,UAAc,EAAd,qBAAc,EAAd,IAAc;YAAd,6BAAc;;QAAtC,cAAS,GAAT,SAAS,CAAa;QACtC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;IACxB,CAAC;IAhBD,sBAAW,uCAAS;aAApB;YACI,OAAO,IAAI,CAAC,UAAU,CAAC;QAC3B,CAAC;;;OAAA;IAED,sBAAW,sCAAQ;aAAnB;YACI,OAAO,IAAI,CAAC,SAAS,CAAC;QAC1B,CAAC;;;OAAA;IAED,sBAAW,uCAAS;aAApB;YACI,OAAO,IAAI,CAAC,UAAU,CAAC;QAC3B,CAAC;;;OAAA;IAQD,gCAAK,GAAL,UAAM,OAAgB;QAClB,OAAO,KAAK,CAAC,CAAC;IAClB,CAAC;IAED,8BAAG,GAAH,UAAI,OAAgB,EAAE,QAAqB,EAAE,KAAU;QACnD,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;QAChC,IAAM,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC;QAC7D,IAAG,eAAe,EAAE;YAChB,SAAS,GAAG,OAAO,CAAC,YAAY;iBAC3B,iBAAiB;iBACjB,MAAM,CAAC,UAAA,CAAC,IAAI,OAAA,6BAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAxC,CAAwC,CAAC;iBACrD,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,UAAU,EAAZ,CAAY,CAAC;iBACtB,MAAM,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAAC,GAAG,CAAC,EAAL,CAAK,EAAE,CAAC,CAAC,CAAC;SACnC;QAED,mDAAmD;QAEnD,OAAO,CAAC,YAAY,CAAC,kCAAkC,CACnD,OAAO,CAAC,YAAY,CAAC,iBAAiB,EACtC,SAAS,EACT,UAAU,EACV,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,SAAS,CAAC,CAAC;QAEpB,IAAG,CAAC,eAAe;YACf,IAAI,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;IAED,8BAAG,GAAH,UAAI,OAAgB,EAAE,QAAqB;QACvC,OAAO,KAAK,CAAC,CAAC;IAClB,CAAC;IACL,uBAAC;AAAD,CAAC,AArDD,IAqDC;AArDY,4CAAgB","sourcesContent":["import { ContextState, PropertyKey } from \"./ContextState\";\r\nimport { Context } from \"src/Context\";\r\nimport { stringifyArguments, areArgumentsEqual } from \"../Utilities\";\r\n\r\nconst Nothing = Symbol();\r\n\r\nexport class SetPropertyState implements ContextState {\r\n private _callCount: number;\r\n private _arguments: any[];\r\n\r\n public get arguments() {\r\n return this._arguments;\r\n }\r\n\r\n public get property() {\r\n return this._property;\r\n }\r\n\r\n public get callCount() {\r\n return this._callCount;\r\n }\r\n\r\n constructor(private _property: PropertyKey, ...args: any[]) {\r\n this._arguments = args;\r\n\r\n this._callCount = 0;\r\n }\r\n\r\n apply(context: Context) {\r\n return void 0;\r\n }\r\n\r\n set(context: Context, property: PropertyKey, value: any) {\r\n let callCount = this._callCount;\r\n const hasExpectations = context.initialState.hasExpectations;\r\n if(hasExpectations) {\r\n callCount = context.initialState\r\n .setPropertyStates\r\n .filter(x => areArgumentsEqual(x.arguments[0], value))\r\n .map(x => x._callCount)\r\n .reduce((a, b) => a + b, 0);\r\n }\r\n\r\n // console.log('prop', property, value, callCount);\r\n\r\n context.initialState.assertCallCountMatchesExpectations(\r\n context.initialState.setPropertyStates,\r\n callCount,\r\n 'property',\r\n this.property,\r\n this.arguments);\r\n\r\n if(!hasExpectations)\r\n this._callCount++;\r\n }\r\n\r\n get(context: Context, property: PropertyKey) {\r\n return void 0;\r\n }\r\n}"]} \ No newline at end of file +{"version":3,"file":"SetPropertyState.js","sourceRoot":"","sources":["../../../src/states/SetPropertyState.ts"],"names":[],"mappings":";;AAEA,0CAAqE;AAErE,IAAM,OAAO,GAAG,MAAM,EAAE,CAAC;AAEzB;IAgBI,0BAAoB,SAAsB;QAAE,cAAc;aAAd,UAAc,EAAd,qBAAc,EAAd,IAAc;YAAd,6BAAc;;QAAtC,cAAS,GAAT,SAAS,CAAa;QACtC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;IACxB,CAAC;IAhBD,sBAAW,uCAAS;aAApB;YACI,OAAO,IAAI,CAAC,UAAU,CAAC;QAC3B,CAAC;;;OAAA;IAED,sBAAW,sCAAQ;aAAnB;YACI,OAAO,IAAI,CAAC,SAAS,CAAC;QAC1B,CAAC;;;OAAA;IAED,sBAAW,uCAAS;aAApB;YACI,OAAO,IAAI,CAAC,UAAU,CAAC;QAC3B,CAAC;;;OAAA;IAQD,gCAAK,GAAL,UAAM,OAAgB;QAClB,OAAO,KAAK,CAAC,CAAC;IAClB,CAAC;IAED,8BAAG,GAAH,UAAI,OAAgB,EAAE,QAAqB,EAAE,KAAU;QACnD,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;QAChC,IAAM,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC;QAC7D,IAAG,eAAe,EAAE;YAChB,SAAS,GAAG,OAAO,CAAC,YAAY;iBAC3B,iBAAiB;iBACjB,MAAM,CAAC,UAAA,CAAC,IAAI,OAAA,6BAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAxC,CAAwC,CAAC;iBACrD,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,UAAU,EAAZ,CAAY,CAAC;iBACtB,MAAM,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAAC,GAAG,CAAC,EAAL,CAAK,EAAE,CAAC,CAAC,CAAC;SACnC;QAED,OAAO,CAAC,YAAY,CAAC,kCAAkC,CACnD,OAAO,CAAC,YAAY,CAAC,iBAAiB,EACtC,SAAS,EACT,UAAU,EACV,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,SAAS,CAAC,CAAC;QAEpB,IAAG,CAAC,eAAe,EAAE;YACjB,IAAI,CAAC,UAAU,EAAE,CAAC;SACrB;IACL,CAAC;IAED,8BAAG,GAAH,UAAI,OAAgB,EAAE,QAAqB;QACvC,OAAO,KAAK,CAAC,CAAC;IAClB,CAAC;IACL,uBAAC;AAAD,CAAC,AApDD,IAoDC;AApDY,4CAAgB","sourcesContent":["import { ContextState, PropertyKey } from \"./ContextState\";\r\nimport { Context } from \"src/Context\";\r\nimport { stringifyArguments, areArgumentsEqual } from \"../Utilities\";\r\n\r\nconst Nothing = Symbol();\r\n\r\nexport class SetPropertyState implements ContextState {\r\n private _callCount: number;\r\n private _arguments: any[];\r\n\r\n public get arguments() {\r\n return this._arguments;\r\n }\r\n\r\n public get property() {\r\n return this._property;\r\n }\r\n\r\n public get callCount() {\r\n return this._callCount;\r\n }\r\n\r\n constructor(private _property: PropertyKey, ...args: any[]) {\r\n this._arguments = args;\r\n\r\n this._callCount = 0;\r\n }\r\n\r\n apply(context: Context) {\r\n return void 0;\r\n }\r\n\r\n set(context: Context, property: PropertyKey, value: any) {\r\n let callCount = this._callCount;\r\n const hasExpectations = context.initialState.hasExpectations;\r\n if(hasExpectations) {\r\n callCount = context.initialState\r\n .setPropertyStates\r\n .filter(x => areArgumentsEqual(x.arguments[0], value))\r\n .map(x => x._callCount)\r\n .reduce((a, b) => a + b, 0);\r\n }\r\n\r\n context.initialState.assertCallCountMatchesExpectations(\r\n context.initialState.setPropertyStates,\r\n callCount,\r\n 'property',\r\n this.property,\r\n this.arguments);\r\n\r\n if(!hasExpectations) {\r\n this._callCount++;\r\n }\r\n }\r\n\r\n get(context: Context, property: PropertyKey) {\r\n return void 0;\r\n }\r\n}"]} \ No newline at end of file diff --git a/spec/issues/15.test.ts b/spec/issues/15.test.ts index b2083ad..ff83aa5 100644 --- a/spec/issues/15.test.ts +++ b/spec/issues/15.test.ts @@ -1,14 +1,11 @@ import test from 'ava'; import { Substitute } from '../../src/Index'; -import { ObjectSubstitute } from '../../src/Transformations'; export interface Example { bar: string; } -let substitute = Substitute.for(); - test('issue 15: can call properties twice', t => { const baz = "baz"; const foo = Substitute.for(); diff --git a/spec/issues/18.test.ts b/spec/issues/18.test.ts new file mode 100644 index 0000000..a498862 --- /dev/null +++ b/spec/issues/18.test.ts @@ -0,0 +1,21 @@ +import test from 'ava'; + +import { Substitute, Arg } from '../../src/Index'; + +interface CalculatorInterface { + add(a: number, b: number): number + subtract(a: number, b: number): number + divide(a: number, b: number): number + isEnabled: boolean +} + +test('issue 18: receive with arg', t => { + const mockedCalculator = Substitute.for() + mockedCalculator.add(1, Arg.is(input => input === 2)).returns(4); + + void mockedCalculator.add(1, 2); + + mockedCalculator.received(1).add(1, Arg.is(input => input === 2)); + + t.pass(); +}); \ No newline at end of file diff --git a/src/Arguments.ts b/src/Arguments.ts index 74dd413..faa8f5b 100644 --- a/src/Arguments.ts +++ b/src/Arguments.ts @@ -1,8 +1,11 @@ export class Argument { + encounteredValues: any[]; + constructor( private description: string, private matchingFunction: (arg: T) => boolean ) { + this.encounteredValues = []; } matches(arg: T) { @@ -20,7 +23,7 @@ export class Argument { export class AllArguments extends Argument { constructor() { - super('{all arguments}', () => true); + super('{all}', () => true); } } @@ -37,7 +40,7 @@ export class Arg { static any(type: T): Argument & Function static any(type: T) static any(type?: string): Argument & any { - const description = !type ? '{any arg}' : '{arg matching ' + type + '}'; + const description = !type ? '{any arg}' : '{type ' + type + '}'; return new Argument(description, x => { if(!type) return true; @@ -53,7 +56,7 @@ export class Arg { } static is(predicate: (input: T) => boolean): Argument & T { - return new Argument('{arg matching predicate ' + this.toStringify(predicate) + '}', predicate) as any; + return new Argument('{predicate ' + this.toStringify(predicate) + '}', predicate) as any; } private static toStringify(obj: any) { diff --git a/src/Context.ts b/src/Context.ts index 920776d..08b4062 100644 --- a/src/Context.ts +++ b/src/Context.ts @@ -42,12 +42,10 @@ export class Context { } apply(args: any[]) { - // console.log('apply', args); return this._state.apply(this, args); } set(property: PropertyKey, value: any) { - // console.log('set', property, value); return this._state.set(this, property, value); } @@ -55,15 +53,6 @@ export class Context { if(property === HandlerKey) return this; - // const uninterestingProperties = [ - // '$$typeof', - // 'constructor', - // 'name', - // 'call' - // ]; - // if(typeof property !== 'symbol' && uninterestingProperties.indexOf(property.toString()) === -1) - // console.log('get', property); - return this._state.get(this, property); } @@ -86,7 +75,5 @@ export class Context { this._state = state; if(state.onSwitchedTo) state.onSwitchedTo(this); - - // console.log('state', state); } } \ No newline at end of file diff --git a/src/Utilities.ts b/src/Utilities.ts index 82da1b1..9c78b65 100644 --- a/src/Utilities.ts +++ b/src/Utilities.ts @@ -39,8 +39,19 @@ export function areArgumentsEqual(a: any, b: any) { if(a instanceof AllArguments || b instanceof AllArguments) return true; - if(a instanceof Argument && b instanceof Argument) - return a.matches(b) && b.matches(a); + if(a instanceof Argument && b instanceof Argument) { + for(let encounteredValue of a.encounteredValues) { + if(!b.matches(encounteredValue)) + return false; + } + + for(let encounteredValue of b.encounteredValues) { + if(!a.matches(encounteredValue)) + return false; + } + + return true; + } if(a instanceof Argument) return a.matches(b); diff --git a/src/states/FunctionState.ts b/src/states/FunctionState.ts index 6c24fe3..08c3475 100644 --- a/src/states/FunctionState.ts +++ b/src/states/FunctionState.ts @@ -2,6 +2,7 @@ import { ContextState, PropertyKey } from "./ContextState"; import { Context } from "src/Context"; import { stringifyArguments, stringifyCalls, areArgumentsEqual, areArgumentArraysEqual } from "../Utilities"; import { GetPropertyState } from "./GetPropertyState"; +import { Argument } from "../Arguments"; const Nothing = Symbol(); @@ -33,10 +34,11 @@ export class FunctionState implements ContextState { apply(context: Context, args: any[]) { let callCount = this._callCount; const hasExpectations = context.initialState.hasExpectations; + const matchingFunctionStates = this._getPropertyState + .recordedFunctionStates + .filter(x => areArgumentArraysEqual(x.arguments, args)); if(hasExpectations) { - callCount = this._getPropertyState - .recordedFunctionStates - .filter(x => areArgumentArraysEqual(x.arguments, args)) + callCount = matchingFunctionStates .map(x => x.callCount) .reduce((a, b) => a + b, 0); } @@ -48,9 +50,25 @@ export class FunctionState implements ContextState { this.property, args); - if(!hasExpectations) + if(!hasExpectations) { this._callCount++; + for(let matchingFunctionState of matchingFunctionStates) + for(let argument of matchingFunctionState.arguments) { + if(!(argument instanceof Argument)) + continue; + + const indexOffset = matchingFunctionState + .arguments + .indexOf(argument); + const myArg = args[indexOffset]; + if(myArg instanceof Argument) + continue; + + argument.encounteredValues.push(myArg); + } + } + if(this.mimicks) return this.mimicks.apply(this.mimicks, args); @@ -73,8 +91,6 @@ export class FunctionState implements ContextState { if(property === 'mimicks') { return (input: Function) => { - // console.log('mimicks', input); - this.mimicks = input; this._callCount--; @@ -87,8 +103,6 @@ export class FunctionState implements ContextState { throw new Error('The return value for the function ' + this._getPropertyState.toString() + ' with ' + stringifyArguments(this._arguments) + ' has already been set to ' + this.returns); return (...returns: any[]) => { - // console.log('returns', returns); - this.returns = returns; this._callCount--; diff --git a/src/states/GetPropertyState.ts b/src/states/GetPropertyState.ts index 8a90726..ee4706b 100644 --- a/src/states/GetPropertyState.ts +++ b/src/states/GetPropertyState.ts @@ -39,7 +39,6 @@ export class GetPropertyState implements ContextState { const matchingFunctionState = this._recordedFunctionStates.find(x => areArgumentArraysEqual(x.arguments, args)); if(matchingFunctionState) { - // console.log('ex-func'); return matchingFunctionState.apply(context, args); } @@ -48,8 +47,6 @@ export class GetPropertyState implements ContextState { this._recordedFunctionStates.push(functionState); - // console.log('states', this._recordedFunctionStates); - return context.apply(args); } @@ -67,8 +64,6 @@ export class GetPropertyState implements ContextState { if(property === 'mimicks') { return (input: Function) => { - // console.log('mimicks', input); - this.mimicks = input; this._callCount--; @@ -81,8 +76,6 @@ export class GetPropertyState implements ContextState { throw new Error('The return value for the property ' + this._property.toString() + ' has already been set to ' + this.returns); return (...returns: any[]) => { - // console.log('returns', returns); - this.returns = returns; this._callCount--; diff --git a/src/states/InitialState.ts b/src/states/InitialState.ts index d39a777..8376357 100644 --- a/src/states/InitialState.ts +++ b/src/states/InitialState.ts @@ -37,7 +37,6 @@ export class InitialState implements ContextState { assertCallCountMatchesExpectations(calls: Call[], callCount: number, type: string, property: PropertyKey, args: any[]) { const expectedCount = this._expectedCount; - // console.log('exp-match', expectedCount, callCount); this.clearExpectations(); @@ -68,7 +67,6 @@ export class InitialState implements ContextState { const existingSetState = this.recordedSetPropertyStates.find(x => x.arguments[0] === value);; if (existingSetState) { - // console.log('ex-prop'); return existingSetState.set(context, property, value); } @@ -77,8 +75,6 @@ export class InitialState implements ContextState { this.recordedSetPropertyStates.push(setPropertyState); - // console.log('states', this.recordedSetPropertyStates); - setPropertyState.set(context, property, value); } @@ -120,8 +116,6 @@ export class InitialState implements ContextState { if (property === 'received') { return (count?: number) => { - // console.log('expectation', count); - this._expectedCount = count === void 0 ? null : count; return context.proxy; }; @@ -142,7 +136,6 @@ export class InitialState implements ContextState { } private clearExpectations() { - // console.log('reset-exp'); this._expectedCount = void 0; } diff --git a/src/states/SetPropertyState.ts b/src/states/SetPropertyState.ts index cf9a16d..7934850 100644 --- a/src/states/SetPropertyState.ts +++ b/src/states/SetPropertyState.ts @@ -41,8 +41,6 @@ export class SetPropertyState implements ContextState { .reduce((a, b) => a + b, 0); } - // console.log('prop', property, value, callCount); - context.initialState.assertCallCountMatchesExpectations( context.initialState.setPropertyStates, callCount, @@ -50,8 +48,9 @@ export class SetPropertyState implements ContextState { this.property, this.arguments); - if(!hasExpectations) + if(!hasExpectations) { this._callCount++; + } } get(context: Context, property: PropertyKey) {