tsmockit 1.1.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/Mock/Any.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare const ANY_VALUE = "ANYTHING";
2
+ export declare function Any<T>(): T;
package/Mock/Any.js ADDED
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Any = exports.ANY_VALUE = void 0;
4
+ exports.ANY_VALUE = 'ANYTHING';
5
+ function Any() {
6
+ return exports.ANY_VALUE;
7
+ }
8
+ exports.Any = Any;
9
+ //# sourceMappingURL=Any.js.map
@@ -2,4 +2,5 @@ export declare const Regex: {
2
2
  Operation: RegExp;
3
3
  Property: RegExp;
4
4
  Params: RegExp;
5
+ AnyValue: RegExp;
5
6
  };
package/Mock/Constants.js CHANGED
@@ -4,6 +4,7 @@ exports.Regex = void 0;
4
4
  exports.Regex = {
5
5
  Operation: /\s[\w\d_]*\.([\w\d$_]*)\(([\w\W\d$_]*)\)/,
6
6
  Property: /\s[\w\d_]*\.([\w\d$_]*)/,
7
- Params: /({.*?}|[^,]+)/g
7
+ Params: /({.*?}|[^,]+)/g,
8
+ AnyValue: /\((0, (.*?).Any)\)\(\)/g
8
9
  };
9
10
  //# sourceMappingURL=Constants.js.map
@@ -0,0 +1,7 @@
1
+ export declare type FunctionMap = {
2
+ state: string | string[];
3
+ returns: Function;
4
+ timesCalled: number;
5
+ singleUse: boolean;
6
+ originalSignature: string | undefined;
7
+ };
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=TypeLiterals.js.map
3
+ //# sourceMappingURL=FunctionMap.js.map
package/Mock/Mock.d.ts CHANGED
@@ -4,11 +4,14 @@ export declare class Mock<T> {
4
4
  private object;
5
5
  get Object(): T;
6
6
  Setup(member: (func: T) => any, returns?: any): void;
7
+ SetupOnce(member: (func: T) => any, returns?: any): void;
8
+ SetupSequence(setups: [(func: T) => any, any][]): void;
7
9
  TimesMemberCalled(member: (func: T) => any): number;
8
10
  Verify(member: (func: T) => any, times: Times | number): void;
9
- private getReturnsValueForProperty;
10
- private getReturnsForFunction;
11
+ private setup;
12
+ private getReturnValueForProperty;
13
+ private getReturnForFunction;
14
+ private getFunctionMapsFromSignature;
11
15
  private updateMemberSignatureMaps;
12
16
  private updateSignatureMapFunctions;
13
- private getFunctionMapFromSignatureMap;
14
17
  }
package/Mock/Mock.js CHANGED
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Mock = void 0;
4
4
  var SignatureService_1 = require("./SignatureService");
5
+ var Any_1 = require("./Any");
5
6
  var Mock = /** @class */ (function () {
6
7
  function Mock() {
7
8
  this.memberSignatureMaps = new Array();
@@ -15,57 +16,86 @@ var Mock = /** @class */ (function () {
15
16
  configurable: true
16
17
  });
17
18
  Mock.prototype.Setup = function (member, returns) {
19
+ if (returns === void 0) { returns = null; }
20
+ this.setup(member, returns);
21
+ };
22
+ Mock.prototype.SetupOnce = function (member, returns) {
23
+ if (returns === void 0) { returns = null; }
24
+ this.setup(member, returns, true);
25
+ };
26
+ Mock.prototype.SetupSequence = function (setups) {
27
+ var _this = this;
28
+ setups.forEach(function (setup) {
29
+ _this.SetupOnce(setup[0], setup[1]);
30
+ });
31
+ };
32
+ Mock.prototype.TimesMemberCalled = function (member) {
33
+ var _a;
34
+ var memberSignatureMap = SignatureService_1.SignatureService.GetMemberSignatureMap(member);
35
+ var functionMap = this.getFunctionMapsFromSignature(memberSignatureMap, (_a = memberSignatureMap.functionMaps[0]) === null || _a === void 0 ? void 0 : _a.state).functionMapForArgs;
36
+ return (functionMap === null || functionMap === void 0 ? void 0 : functionMap.timesCalled) || 0;
37
+ };
38
+ Mock.prototype.Verify = function (member, times) {
39
+ var timesCalled = this.TimesMemberCalled(member);
40
+ var signature = SignatureService_1.SignatureService.GetMemberSignatureMap(member).signature;
41
+ var memberSignatureMap = this.memberSignatureMaps.find(function (m) { return m.signature === signature; });
42
+ if (timesCalled !== times) {
43
+ // eslint-disable-next-line no-console
44
+ console.log("Actual calls made for, \"" + signature + ":", memberSignatureMap === null || memberSignatureMap === void 0 ? void 0 : memberSignatureMap.functionMaps.map(function (m) { return m.originalSignature + " x " + m.timesCalled; }));
45
+ }
46
+ expect(timesCalled).toEqual(times, timesCalled !== times ? '' : undefined);
47
+ };
48
+ Mock.prototype.setup = function (member, returns, singleUse) {
18
49
  var _this = this;
19
50
  if (returns === void 0) { returns = null; }
20
- var memberSignatureMap = SignatureService_1.SignatureService.GetMemberSignatureMap(member, returns);
51
+ if (singleUse === void 0) { singleUse = false; }
52
+ var memberSignatureMap = SignatureService_1.SignatureService.GetMemberSignatureMap(member, returns, singleUse);
21
53
  this.updateMemberSignatureMaps(memberSignatureMap);
22
54
  var memberName = SignatureService_1.SignatureService.GetMemberNameFromSignature(memberSignatureMap.signature);
23
55
  if (SignatureService_1.SignatureService.MemberSignatureIsProperty(memberSignatureMap.signature)) {
24
- this.object[memberName] = this.getReturnsValueForProperty(memberSignatureMap);
56
+ this.object[memberName] = this.getReturnValueForProperty(memberSignatureMap);
25
57
  }
26
58
  else {
27
59
  this.object[memberName] = (function () {
60
+ var _a;
28
61
  var args = [];
29
62
  for (var _i = 0; _i < arguments.length; _i++) {
30
63
  args[_i] = arguments[_i];
31
64
  }
32
- var returnFunction = _this.getReturnsForFunction(memberSignatureMap, args);
33
- return returnFunction ? returnFunction() :
34
- (function () { return console.error('Unable to resolve setup function'); })();
65
+ return (_a = _this.getReturnForFunction(memberSignatureMap, args)) === null || _a === void 0 ? void 0 : _a();
35
66
  });
36
67
  }
37
68
  };
38
- Mock.prototype.TimesMemberCalled = function (member) {
39
- var memberSignature = SignatureService_1.SignatureService.GetMemberSignatureMap(member);
40
- var functionMap = this.getFunctionMapFromSignatureMap(memberSignature);
41
- var timesCalled = functionMap ? functionMap.timesCalled : 0;
42
- return timesCalled;
43
- };
44
- Mock.prototype.Verify = function (member, times) {
45
- var timesCalled = this.TimesMemberCalled(member);
46
- expect(timesCalled).toEqual(times);
69
+ Mock.prototype.getReturnValueForProperty = function (memberSignatureMap) {
70
+ var _a, _b;
71
+ return ((_b = (_a = this.memberSignatureMaps.find(function (s) { return s.signature === memberSignatureMap.signature; })) === null || _a === void 0 ? void 0 : _a.functionMaps[0]) === null || _b === void 0 ? void 0 : _b.returns) || null;
47
72
  };
48
- Mock.prototype.getReturnsValueForProperty = function (memberSignatureMap) {
49
- var value = null;
50
- var existingMemberSignatureMap = this.memberSignatureMaps.find(function (s) { return s.signature === memberSignatureMap.signature; });
51
- if (existingMemberSignatureMap) {
52
- value = existingMemberSignatureMap.functionMaps[0] ? existingMemberSignatureMap.functionMaps[0].returns : null;
53
- }
54
- return value;
73
+ Mock.prototype.getReturnForFunction = function (memberSignatureMap, args) {
74
+ var _a = this.getFunctionMapsFromSignature(memberSignatureMap, args), functionMapForArgs = _a.functionMapForArgs, signatureFunctionMaps = _a.signatureFunctionMaps;
75
+ return functionMapForArgs ? (function () {
76
+ functionMapForArgs.timesCalled++;
77
+ if (signatureFunctionMaps && functionMapForArgs.singleUse) {
78
+ var indexToDelete = signatureFunctionMaps.indexOf(functionMapForArgs);
79
+ signatureFunctionMaps.splice(indexToDelete, 1);
80
+ }
81
+ return functionMapForArgs.returns;
82
+ }) : undefined;
55
83
  };
56
- Mock.prototype.getReturnsForFunction = function (memberSignatureMap, args) {
57
- var returnFunction;
84
+ Mock.prototype.getFunctionMapsFromSignature = function (memberSignatureMap, args) {
58
85
  var existingMemberSignatureMap = this.memberSignatureMaps.find(function (s) { return s.signature === memberSignatureMap.signature; });
59
- var defaultFunctionMap = memberSignatureMap.functionMaps[0];
60
- if (existingMemberSignatureMap && defaultFunctionMap) {
61
- var exactFunctionMap = existingMemberSignatureMap.functionMaps.find(function (m) { return JSON.stringify(m.state) === JSON.stringify(args); });
62
- var functionMap_1 = exactFunctionMap ? exactFunctionMap : defaultFunctionMap;
63
- returnFunction = (function () {
64
- functionMap_1.timesCalled++;
65
- return functionMap_1.returns;
86
+ var signatureFunctionMaps = existingMemberSignatureMap === null || existingMemberSignatureMap === void 0 ? void 0 : existingMemberSignatureMap.functionMaps;
87
+ var functionMapForArgs = signatureFunctionMaps === null || signatureFunctionMaps === void 0 ? void 0 : signatureFunctionMaps.find(function (m) { return JSON.stringify(m.state) === JSON.stringify(args); });
88
+ var functionMapsUsingAny = signatureFunctionMaps === null || signatureFunctionMaps === void 0 ? void 0 : signatureFunctionMaps.filter(function (m) { return m.state.includes(Any_1.ANY_VALUE); });
89
+ if (!functionMapForArgs && (functionMapsUsingAny === null || functionMapsUsingAny === void 0 ? void 0 : functionMapsUsingAny.length)) {
90
+ functionMapsUsingAny.forEach(function (element) {
91
+ if (!functionMapForArgs) {
92
+ var anyTransposedState_1 = new Array();
93
+ args.forEach(function (a, i) { return anyTransposedState_1[i] = element.state[i] === Any_1.ANY_VALUE ? Any_1.ANY_VALUE : a; });
94
+ functionMapForArgs = signatureFunctionMaps === null || signatureFunctionMaps === void 0 ? void 0 : signatureFunctionMaps.find(function (m) { return JSON.stringify(m.state) === JSON.stringify(anyTransposedState_1); });
95
+ }
66
96
  });
67
97
  }
68
- return returnFunction;
98
+ return { functionMapForArgs: functionMapForArgs, signatureFunctionMaps: signatureFunctionMaps };
69
99
  };
70
100
  Mock.prototype.updateMemberSignatureMaps = function (memberSignatureMap) {
71
101
  var existingSignatureMap = this.memberSignatureMaps.find(function (m) { return m.signature === memberSignatureMap.signature; });
@@ -79,7 +109,7 @@ var Mock = /** @class */ (function () {
79
109
  };
80
110
  Mock.prototype.updateSignatureMapFunctions = function (existingSignatureMap, newFunctionMap) {
81
111
  var existingFunctionMap = existingSignatureMap.functionMaps.find(function (fm) { return JSON.stringify(fm.state) === JSON.stringify(newFunctionMap.state); });
82
- if (existingFunctionMap) {
112
+ if (existingFunctionMap && !newFunctionMap.singleUse) {
83
113
  var functionMaps = existingSignatureMap.functionMaps;
84
114
  functionMaps.splice(functionMaps.indexOf(existingFunctionMap), 1, newFunctionMap);
85
115
  }
@@ -87,21 +117,6 @@ var Mock = /** @class */ (function () {
87
117
  existingSignatureMap.functionMaps.push(newFunctionMap);
88
118
  }
89
119
  };
90
- Mock.prototype.getFunctionMapFromSignatureMap = function (memberSignature) {
91
- var functionMap;
92
- var existingMember = this.memberSignatureMaps.find(function (m) { return m.signature === memberSignature.signature; });
93
- var functionMapToFind = memberSignature.functionMaps[0];
94
- if (existingMember && functionMapToFind) {
95
- var functionMapCount = existingMember.functionMaps ? existingMember.functionMaps.length : 0;
96
- if (functionMapCount === 1) {
97
- functionMap = existingMember.functionMaps[0];
98
- }
99
- else {
100
- functionMap = existingMember.functionMaps.find(function (m) { return JSON.stringify(m.state) === JSON.stringify(functionMapToFind.state); });
101
- }
102
- }
103
- return functionMap;
104
- };
105
120
  return Mock;
106
121
  }());
107
122
  exports.Mock = Mock;
@@ -0,0 +1,5 @@
1
+ import { FunctionMap } from './FunctionMap';
2
+ export declare type SignatureMap = {
3
+ signature: string;
4
+ functionMaps: Array<FunctionMap>;
5
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=SignatureMap.js.map
@@ -1,8 +1,9 @@
1
- import { SignatureMap } from './TypeLiterals';
1
+ import { SignatureMap } from './SignatureMap';
2
2
  export declare class SignatureService {
3
- static GetMemberSignatureMap(value: (obj: any) => any, returns?: any): SignatureMap;
3
+ static GetMemberSignatureMap(value: (obj: any) => any, returns?: any, singleUse?: boolean): SignatureMap;
4
4
  static MemberSignatureIsProperty(memberSignatureString: string): boolean;
5
5
  static GetMemberNameFromSignature(memberSignatureString: string): string;
6
+ private static getOriginalSignature;
6
7
  private static getPropertyMemberSignature;
7
8
  private static getOperationMemberSignature;
8
9
  private static getStateForMemberSignature;
@@ -1,11 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SignatureService = void 0;
4
+ var Any_1 = require("./Any");
4
5
  var Constants_1 = require("./Constants");
5
6
  var SignatureService = /** @class */ (function () {
6
7
  function SignatureService() {
7
8
  }
8
- SignatureService.GetMemberSignatureMap = function (value, returns) {
9
+ SignatureService.GetMemberSignatureMap = function (value, returns, singleUse) {
10
+ if (singleUse === void 0) { singleUse = false; }
9
11
  var memberSignature = '';
10
12
  memberSignature =
11
13
  this.getOperationMemberSignature(value, memberSignature) ||
@@ -14,7 +16,13 @@ var SignatureService = /** @class */ (function () {
14
16
  SignatureService.getStateForMemberSignature(memberSignature, value);
15
17
  return {
16
18
  signature: memberSignature,
17
- functionMaps: [{ state: state, returns: returns ? returns : null, timesCalled: 0 }]
19
+ functionMaps: [{
20
+ state: state,
21
+ returns: returns,
22
+ timesCalled: 0,
23
+ singleUse: singleUse,
24
+ originalSignature: this.getOriginalSignature(value)
25
+ }]
18
26
  };
19
27
  };
20
28
  SignatureService.MemberSignatureIsProperty = function (memberSignatureString) {
@@ -24,6 +32,13 @@ var SignatureService = /** @class */ (function () {
24
32
  return SignatureService.MemberSignatureIsProperty(memberSignatureString) ?
25
33
  memberSignatureString : memberSignatureString.split('(')[0];
26
34
  };
35
+ SignatureService.getOriginalSignature = function (value) {
36
+ var originalSignature = value.toString();
37
+ originalSignature = (originalSignature === null || originalSignature === void 0 ? void 0 : originalSignature.indexOf('i.')) ? originalSignature.split('i.')[1] : originalSignature;
38
+ originalSignature = (originalSignature === null || originalSignature === void 0 ? void 0 : originalSignature.indexOf(';')) ? originalSignature.split(';')[0] : originalSignature;
39
+ return originalSignature === null || originalSignature === void 0 ? void 0 : originalSignature.trim();
40
+ };
41
+ ;
27
42
  SignatureService.getPropertyMemberSignature = function (value, memberSignature) {
28
43
  var propertyMemberMatches = SignatureService.getMatchesForRegex(value, Constants_1.Regex.Property);
29
44
  if (propertyMemberMatches && propertyMemberMatches[1]) {
@@ -64,7 +79,9 @@ var SignatureService = /** @class */ (function () {
64
79
  return matches;
65
80
  };
66
81
  SignatureService.getParamString = function (operationNameMatches) {
67
- var paramStrings = operationNameMatches[2].match(Constants_1.Regex.Params);
82
+ var paramStrings = operationNameMatches[2]
83
+ .replace(Constants_1.Regex.AnyValue, Any_1.ANY_VALUE)
84
+ .match(Constants_1.Regex.Params);
68
85
  var params = '';
69
86
  for (var index = 0; index < (paramStrings ? paramStrings.length : 0); index++) {
70
87
  params += ((index > 0 ? ', ' : '') + "p" + index);
@@ -0,0 +1,3 @@
1
+ export * from './Mock';
2
+ export * from './Times';
3
+ export { Any } from './Any';
package/Mock/module.js ADDED
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Any = void 0;
4
+ var tslib_1 = require("tslib");
5
+ (0, tslib_1.__exportStar)(require("./Mock"), exports);
6
+ (0, tslib_1.__exportStar)(require("./Times"), exports);
7
+ var Any_1 = require("./Any");
8
+ Object.defineProperty(exports, "Any", { enumerable: true, get: function () { return Any_1.Any; } });
9
+ //# sourceMappingURL=module.js.map
package/README.md CHANGED
@@ -4,59 +4,18 @@ Generic mocking library for TypeScript
4
4
  [![CI](https://github.com/bayes343/tsmockit/actions/workflows/ci.yml/badge.svg)](https://github.com/bayes343/tsmockit/actions/workflows/ci.yml)
5
5
  ![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/bayes343/tsmockit.svg?logo=lgtm&logoWidth=18)
6
6
 
7
-
8
7
  Helpful links:
9
8
  - [GitHub](https://github.com/bayes343/tsmockit)
10
9
  - [npm](https://www.npmjs.com/package/tsmockit)
10
+ - [Docs](https://bayes343.github.io/tsmockit/modules.html)
11
11
 
12
- This library exposes a generic class, `Mock<T>`, which allows you to mock dependencies and verify usage in an intuitive and type safe manner.
12
+ This library exposes a generic class, `Mock<T>`, which allows you to mock dependencies and verify usage in an intuitive and type safe manner. Its API is based on the C# "moq" library.
13
13
 
14
- Public interface:
14
+ The below example demonstrates some of the features of this library. Please explore the "docs" linked above for further details.
15
15
 
16
16
  ```typescript
17
- class Mock<T>
18
- ```
19
- ```typescript
20
- Setup(
21
- member: (func: T) => any,
22
- returns: any = null
23
- ): void
24
- ```
25
- ```typescript
26
- TimesMemberCalled(
27
- member: (func: T) => any
28
- ): number
29
- ```
30
- ```typescript
31
- Verify(
32
- member: (func: T) => any,
33
- times: Times | number
34
- ): void
35
- ```
17
+ // https://github.com/bayes343/tsmockit/blob/master/src/Mock/tests/Mock-Car-Example.spec.ts
36
18
 
37
- ```typescript
38
- class TestHelpers
39
- ```
40
- ```typescript
41
- static EmitEventAtElement(element: HTMLElement, eventType: string): void
42
- ```
43
- ```typescript
44
- static EmitKeyEventAtElement(
45
- element: HTMLInputElement,
46
- key: string,
47
- keyEvent: 'keydown' | 'keypress' | 'keyup' | 'input'
48
- ): void
49
- ```
50
- ```typescript
51
- static async TimeLapsedCondition(condition: () => boolean, interval = 10): Promise<boolean>
52
- ```
53
-
54
- ## Usage
55
-
56
- ### Scenario
57
- Consider this dependency injection scenario.
58
-
59
- ```ts
60
19
  interface IEngine {
61
20
  Start(): void;
62
21
  Stop(): void;
@@ -108,37 +67,62 @@ class Car {
108
67
  return this.stereo.SetStation(frequency);
109
68
  }
110
69
  }
111
- ```
112
-
113
- The `Car` class above uses dependency injection for its engine, odometer, and stereo dependencies.
114
-
115
- It's a best practice to use dependency injection over 'newing' up concretions inside a class instance. This allows true unit testing as well as widely opening the door to future extendability.
116
-
117
- ### Example
118
- Here's how you would use `tsmockit` to mock the above dependencies and test the `Car` class.
119
-
120
- ```ts
121
- // Instantiate mocks
122
- const mockIEngine = new Mock<IEngine>();
123
- const mockIOdometer = new Mock<IOdometer>();
124
- const mockIStereo = new Mock<IStereo>();
125
-
126
- // Instantiate car, passing mock 'Objects' as its dependencies
127
- const car = new Car(mockIEngine.Object, mockIOdometer.Object, mockIStereo.Object);
128
-
129
- // 'Setup' the mock odometer to return 100
130
- mockIOdometer.Setup(o => o.GetMileage(), 100);
131
-
132
- // Assert that the Car's mileage property returns 100 and that our mock GetMileage method is called exactly once
133
- expect(car.Mileage).toEqual(100);
134
- mockIOdometer.Verify(o => o.GetMileage(), 1);
135
70
 
136
- // Setup mock stereo to return different strings for different arguments
137
- mockIStereo.Setup(s => s.SetStation(1), 'Station set to 1');
138
- mockIStereo.Setup(s => s.SetStation(2), 'Station set to 2');
71
+ describe('Car', () => {
72
+ let car: Car;
73
+ const mockIEngine = new Mock<IEngine>();
74
+ const mockIOdometer = new Mock<IOdometer>();
75
+ const mockIStereo = new Mock<IStereo>();
76
+
77
+ beforeEach(() => {
78
+ car = new Car(mockIEngine.Object, mockIOdometer.Object, mockIStereo.Object);
79
+ });
80
+
81
+ it('should call Engine.Start when StartEngine is called', () => {
82
+ mockIEngine.Setup(e => e.Start());
83
+ car.StartEngine();
84
+ mockIEngine.Verify(e => e.Start(), Times.Once);
85
+ });
86
+
87
+ it('should call Engine.Stop when StopEngine is called', () => {
88
+ mockIEngine.Setup(e => e.Stop());
89
+ car.StopEngine();
90
+ mockIEngine.Verify(e => e.Stop(), Times.Once);
91
+ });
92
+
93
+ it('should return the result of Odometer.GetMileage on referencing the Mileage property', () => {
94
+ mockIOdometer.Setup(o => o.GetMileage(), 100);
95
+
96
+ const mileage = car.Mileage;
97
+
98
+ expect(mileage).toEqual(100);
99
+ mockIOdometer.Verify(o => o.GetMileage(), Times.Once);
100
+ });
101
+
102
+ it('should call Stereo.SetStation on calling ChangeRadioStation returning the string from Stereo', () => {
103
+ mockIStereo.Setup(s => s.SetStation(Any<number>()), 'Station set'); // default fallback setup when a more specific setup isn't available
104
+ mockIStereo.Setup(s => s.SetStation(3), 'Station 3');
105
+
106
+ expect(car.ChangeRadioStation(3)).toEqual('Station 3');
107
+ expect(car.ChangeRadioStation(0)).toEqual('Station set');
108
+ expect(car.ChangeRadioStation(2)).toEqual('Station set');
109
+
110
+ mockIStereo.Verify(s => s.SetStation(3), Times.Once);
111
+ mockIStereo.Verify(s => s.SetStation(Any<number>()), 2);
112
+ });
113
+ });
139
114
  ```
140
115
 
141
- ## Conventions
142
- You'll often want a mock to return the same response regardless of input parameters. This library accommodates this through these conventions:
143
- - If only one 'Setup' is made for a given method, the return value will be used for any combination of parameters (i.e. parameter values other than those specified in the setup).
144
- - If a method is called and no exact setup is available, the first 'Setup' will be returned. In other words, if you have multiple setups for a method and this method is called using parameters that none of those setups accounted for, the return value will be the one specified in the first setup.
116
+ ## Version 2 notes
117
+
118
+ - Any\<T\>
119
+ - A helper function which allows clients to create "Setups" on methods to be used disregarding all, or some, of the exact values the method is called with.
120
+ ```typescript
121
+ mockIStereo.Setup(s => s.SetStation(Any<number>()), 'Station set');
122
+ ```
123
+ - SetupOnce
124
+ - Creates a setup the same as the regular `Setup` method except for once the setup is used, it will de-register itself.
125
+ - One use could be an inferred guarantee that a given method on a dependency is not being called more than you expect. Using `SetupOnce` for a setup that should only be used once, will have the inherent effect of leading to a runtime error at test time on the second execution.
126
+ - SetupSequence
127
+ - Creates several, "one time" setups for a given method.
128
+ - You'll occasionally want the first execution of a given method on a dependency to return "x" but then "y" on the following execution. Use `SetupSequence` to achieve this.
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Emit an event at a given element
3
+ * @param element
4
+ * @param eventType
5
+ */
6
+ export declare function EmitEventAtElement(element: HTMLElement, eventType: string): void;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EmitEventAtElement = void 0;
4
+ /**
5
+ * Emit an event at a given element
6
+ * @param element
7
+ * @param eventType
8
+ */
9
+ function EmitEventAtElement(element, eventType) {
10
+ var event = document.createEvent('Event');
11
+ event.initEvent(eventType);
12
+ element.dispatchEvent(event);
13
+ }
14
+ exports.EmitEventAtElement = EmitEventAtElement;
15
+ //# sourceMappingURL=EmitEventAtElement.js.map
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Emit a key event at a given element
3
+ * @param element
4
+ * @param key
5
+ * @param keyEvent
6
+ */
7
+ export declare function EmitKeyEventAtElement(element: HTMLInputElement, key: string, keyEvent: 'keydown' | 'keypress' | 'keyup' | 'input'): void;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EmitKeyEventAtElement = void 0;
4
+ /**
5
+ * Emit a key event at a given element
6
+ * @param element
7
+ * @param key
8
+ * @param keyEvent
9
+ */
10
+ function EmitKeyEventAtElement(element, key, keyEvent) {
11
+ var event = document.createEvent('Event');
12
+ event['keyCode'] = key;
13
+ event['key'] = key;
14
+ event.initEvent(keyEvent);
15
+ element.dispatchEvent(event);
16
+ }
17
+ exports.EmitKeyEventAtElement = EmitKeyEventAtElement;
18
+ //# sourceMappingURL=EmitKeyEventAtElement.js.map
@@ -0,0 +1,7 @@
1
+ /// <reference types="jasmine" />
2
+ /**
3
+ * Performs an asynchronous assertion, allowing up to one second to pass before failing
4
+ * @param selector A function that returns the subject of the assertion once it is expected to pass.
5
+ * @param assertion A function that is given the result of the selector function for normal jasmine assertions.
6
+ */
7
+ export declare function Expect<T>(selector: () => T, assertion: (m: jasmine.Matchers<T>) => void, interval?: number, getTimeFunc?: () => number): Promise<void>;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Expect = void 0;
4
+ /**
5
+ * Performs an asynchronous assertion, allowing up to one second to pass before failing
6
+ * @param selector A function that returns the subject of the assertion once it is expected to pass.
7
+ * @param assertion A function that is given the result of the selector function for normal jasmine assertions.
8
+ */
9
+ function Expect(selector, assertion, interval, getTimeFunc) {
10
+ if (interval === void 0) { interval = 0; }
11
+ if (getTimeFunc === void 0) { getTimeFunc = function () { return Date.now(); }; }
12
+ return new Promise(function (resolve) {
13
+ var startTime = getTimeFunc();
14
+ var timedOut = function () { return getTimeFunc() - startTime > 1000; };
15
+ var execute = function () {
16
+ var selection = selector();
17
+ if (selection || timedOut()) {
18
+ assertion(expect(selection));
19
+ resolve();
20
+ }
21
+ else {
22
+ setTimeout(function () { return execute(); }, interval);
23
+ }
24
+ };
25
+ execute();
26
+ });
27
+ }
28
+ exports.Expect = Expect;
29
+ //# sourceMappingURL=Expect.js.map
@@ -0,0 +1,3 @@
1
+ export * from './EmitEventAtElement';
2
+ export * from './EmitKeyEventAtElement';
3
+ export * from './Expect';
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var tslib_1 = require("tslib");
4
+ (0, tslib_1.__exportStar)(require("./EmitEventAtElement"), exports);
5
+ (0, tslib_1.__exportStar)(require("./EmitKeyEventAtElement"), exports);
6
+ (0, tslib_1.__exportStar)(require("./Expect"), exports);
7
+ //# sourceMappingURL=module.js.map
package/package.json CHANGED
@@ -14,7 +14,7 @@
14
14
  "dependency injection"
15
15
  ],
16
16
  "license": "MIT",
17
- "version": "1.1.3",
17
+ "version": "2.0.0",
18
18
  "description": "Generic mocking library for TypeScript",
19
19
  "private": false,
20
20
  "main": "./public_api.js",
package/public_api.d.ts CHANGED
@@ -1,3 +1,2 @@
1
- export * from './Mock/Mock';
2
- export * from './Mock/Times';
3
- export * from './Utility/TestHelpers';
1
+ export * from './Mock/module';
2
+ export * from './Utility/module';
package/public_api.js CHANGED
@@ -1,10 +1,6 @@
1
1
  "use strict";
2
- /*
3
- * Public API Surface of tsmockit
4
- */
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  var tslib_1 = require("tslib");
7
- (0, tslib_1.__exportStar)(require("./Mock/Mock"), exports);
8
- (0, tslib_1.__exportStar)(require("./Mock/Times"), exports);
9
- (0, tslib_1.__exportStar)(require("./Utility/TestHelpers"), exports);
4
+ (0, tslib_1.__exportStar)(require("./Mock/module"), exports);
5
+ (0, tslib_1.__exportStar)(require("./Utility/module"), exports);
10
6
  //# sourceMappingURL=public_api.js.map
@@ -1,9 +0,0 @@
1
- export declare type FunctionMap = {
2
- state: string;
3
- returns: Function;
4
- timesCalled: number;
5
- };
6
- export declare type SignatureMap = {
7
- signature: string;
8
- functionMaps: Array<FunctionMap>;
9
- };
@@ -1,5 +0,0 @@
1
- export declare class TestHelpers {
2
- static EmitEventAtElement(element: HTMLElement, eventType: string): void;
3
- static EmitKeyEventAtElement(element: HTMLInputElement, key: string, keyEvent: 'keydown' | 'keypress' | 'keyup' | 'input'): void;
4
- static TimeLapsedCondition(condition: () => boolean, interval?: number): Promise<boolean>;
5
- }
@@ -1,51 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TestHelpers = void 0;
4
- var tslib_1 = require("tslib");
5
- var TestHelpers = /** @class */ (function () {
6
- function TestHelpers() {
7
- }
8
- TestHelpers.EmitEventAtElement = function (element, eventType) {
9
- var event = document.createEvent('Event');
10
- event.initEvent(eventType);
11
- element.dispatchEvent(event);
12
- };
13
- TestHelpers.EmitKeyEventAtElement = function (element, key, keyEvent) {
14
- var event = document.createEvent('Event');
15
- event['keyCode'] = key;
16
- event['key'] = key;
17
- event.initEvent(keyEvent);
18
- element.dispatchEvent(event);
19
- };
20
- TestHelpers.TimeLapsedCondition = function (condition, interval) {
21
- if (interval === void 0) { interval = 10; }
22
- return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
23
- var _this = this;
24
- return (0, tslib_1.__generator)(this, function (_a) {
25
- return [2 /*return*/, new Promise(function (resolve) {
26
- var assertionPassed = false;
27
- var elapsedTime = 0;
28
- var enabled = (function () {
29
- return !assertionPassed && elapsedTime < 1000;
30
- });
31
- var executer = setInterval(function () { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () {
32
- return (0, tslib_1.__generator)(this, function (_a) {
33
- elapsedTime += interval;
34
- if (enabled()) {
35
- assertionPassed = condition();
36
- }
37
- else {
38
- clearInterval(executer);
39
- resolve(assertionPassed);
40
- }
41
- return [2 /*return*/];
42
- });
43
- }); }, interval);
44
- })];
45
- });
46
- });
47
- };
48
- return TestHelpers;
49
- }());
50
- exports.TestHelpers = TestHelpers;
51
- //# sourceMappingURL=TestHelpers.js.map