@serenity-js/assertions 3.0.0-rc.21 → 3.0.0-rc.22

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/CHANGELOG.md CHANGED
@@ -3,6 +3,17 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [3.0.0-rc.22](https://github.com/serenity-js/serenity-js/compare/v3.0.0-rc.21...v3.0.0-rc.22) (2022-07-15)
7
+
8
+
9
+ ### Features
10
+
11
+ * **assertions:** isCloseTo(expected, tolerance) ([bb0e935](https://github.com/serenity-js/serenity-js/commit/bb0e935e197b195da598ccbec6c6cf7704dd875b))
12
+
13
+
14
+
15
+
16
+
6
17
  # [3.0.0-rc.21](https://github.com/serenity-js/serenity-js/compare/v3.0.0-rc.20...v3.0.0-rc.21) (2022-07-11)
7
18
 
8
19
  **Note:** Version bump only for package @serenity-js/assertions
@@ -7,6 +7,7 @@ export * from './equals';
7
7
  export * from './includes';
8
8
  export * from './isAfter';
9
9
  export * from './isBefore';
10
+ export * from './isCloseTo';
10
11
  export * from './isFalse';
11
12
  export * from './isGreaterThan';
12
13
  export * from './isLessThan';
@@ -23,6 +23,7 @@ __exportStar(require("./equals"), exports);
23
23
  __exportStar(require("./includes"), exports);
24
24
  __exportStar(require("./isAfter"), exports);
25
25
  __exportStar(require("./isBefore"), exports);
26
+ __exportStar(require("./isCloseTo"), exports);
26
27
  __exportStar(require("./isFalse"), exports);
27
28
  __exportStar(require("./isGreaterThan"), exports);
28
29
  __exportStar(require("./isLessThan"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/expectations/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wCAAsB;AACtB,4CAA0B;AAC1B,8DAA4C;AAC5C,8DAA4C;AAC5C,6CAA2B;AAC3B,2CAAyB;AACzB,6CAA2B;AAC3B,4CAA0B;AAC1B,6CAA2B;AAC3B,4CAA0B;AAC1B,kDAAgC;AAChC,+CAA6B;AAC7B,8CAA4B;AAC5B,2CAAyB;AACzB,4CAA0B;AAC1B,wCAAsB;AACtB,uCAAqB;AACrB,+CAA6B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/expectations/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wCAAsB;AACtB,4CAA0B;AAC1B,8DAA4C;AAC5C,8DAA4C;AAC5C,6CAA2B;AAC3B,2CAAyB;AACzB,6CAA2B;AAC3B,4CAA0B;AAC1B,6CAA2B;AAC3B,8CAA4B;AAC5B,4CAA0B;AAC1B,kDAAgC;AAChC,+CAA6B;AAC7B,8CAA4B;AAC5B,2CAAyB;AACzB,4CAA0B;AAC1B,wCAAsB;AACtB,uCAAqB;AACrB,+CAA6B"}
@@ -0,0 +1,17 @@
1
+ import { Answerable, Expectation } from '@serenity-js/core';
2
+ /**
3
+ * @desc
4
+ * Expectation that the actual value is within a given ± absolute tolerance range of the expected value.
5
+ *
6
+ * @example
7
+ * import { actorCalled } from '@serenity-js/core'
8
+ * import { Ensure, isCloseTo } from '@serenity-js/assertions'
9
+ *
10
+ * await actorCalled('Iris').attemptsTo(
11
+ * Ensure.that(10.123, isCloseTo(10, 0.2))
12
+ * )
13
+ *
14
+ * @param {Answerable<number>} expected
15
+ * @param {Answerable<number>} [absoluteTolerance=1e-9]
16
+ */
17
+ export declare function isCloseTo(expected: Answerable<number>, absoluteTolerance?: Answerable<number>): Expectation<number>;
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isCloseTo = void 0;
4
+ const core_1 = require("@serenity-js/core");
5
+ /**
6
+ * @desc
7
+ * Expectation that the actual value is within a given ± absolute tolerance range of the expected value.
8
+ *
9
+ * @example
10
+ * import { actorCalled } from '@serenity-js/core'
11
+ * import { Ensure, isCloseTo } from '@serenity-js/assertions'
12
+ *
13
+ * await actorCalled('Iris').attemptsTo(
14
+ * Ensure.that(10.123, isCloseTo(10, 0.2))
15
+ * )
16
+ *
17
+ * @param {Answerable<number>} expected
18
+ * @param {Answerable<number>} [absoluteTolerance=1e-9]
19
+ */
20
+ function isCloseTo(expected, absoluteTolerance = 1e-9) {
21
+ return new IsCloseTo(expected, absoluteTolerance);
22
+ }
23
+ exports.isCloseTo = isCloseTo;
24
+ /**
25
+ * @package
26
+ */
27
+ class IsCloseTo extends core_1.Expectation {
28
+ constructor(expected, absoluteTolerance) {
29
+ super((0, core_1.d) `have value close to ${expected} ±${absoluteTolerance}`, async (actor, actual) => {
30
+ const actualValue = await actor.answer(actual);
31
+ const expectedValue = await actor.answer(this.expected);
32
+ const tolerance = await actor.answer(this.absoluteTolerance);
33
+ const description = `have value close to ${expectedValue} ±${tolerance}`;
34
+ // short-circuit exact equality
35
+ if (actualValue === expectedValue) {
36
+ return new core_1.ExpectationMet(description, expectedValue, actualValue);
37
+ }
38
+ if (!(Number.isFinite(actualValue) && Number.isFinite(expectedValue))) {
39
+ return new core_1.ExpectationNotMet(description, expectedValue, actualValue);
40
+ }
41
+ const difference = Math.abs(actualValue - expectedValue);
42
+ const isClose = difference <= tolerance;
43
+ return isClose
44
+ ? new core_1.ExpectationMet(description, expectedValue, actualValue)
45
+ : new core_1.ExpectationNotMet(description, expectedValue, actualValue);
46
+ });
47
+ this.expected = expected;
48
+ this.absoluteTolerance = absoluteTolerance;
49
+ }
50
+ }
51
+ //# sourceMappingURL=isCloseTo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isCloseTo.js","sourceRoot":"","sources":["../../src/expectations/isCloseTo.ts"],"names":[],"mappings":";;;AAAA,4CAAoH;AAEpH;;;;;;;;;;;;;;GAcG;AACH,SAAgB,SAAS,CAAC,QAA4B,EAAE,oBAAwC,IAAI;IAChG,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;AACtD,CAAC;AAFD,8BAEC;AAED;;GAEG;AACH,MAAM,SAAU,SAAQ,kBAAmB;IAEvC,YACqB,QAA4B,EAC5B,iBAAqC;QAEtD,KAAK,CACD,IAAA,QAAC,EAAA,uBAAwB,QAAS,KAAM,iBAAkB,EAAE,EAC5D,KAAK,EAAE,KAAuB,EAAE,MAA0B,EAAE,EAAE;YAE1D,MAAM,WAAW,GAAa,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACzD,MAAM,aAAa,GAAW,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChE,MAAM,SAAS,GAAe,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAEzE,MAAM,WAAW,GAAG,uBAAwB,aAAc,KAAM,SAAU,EAAE,CAAA;YAE5E,+BAA+B;YAC/B,IAAI,WAAW,KAAK,aAAa,EAAE;gBAC/B,OAAO,IAAI,qBAAc,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;aACtE;YAED,IAAI,CAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,EAAE;gBACpE,OAAO,IAAI,wBAAiB,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;aACzE;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,aAAa,CAAC,CAAA;YAExD,MAAM,OAAO,GAAG,UAAU,IAAI,SAAS,CAAC;YAExC,OAAO,OAAO;gBACV,CAAC,CAAC,IAAI,qBAAc,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC;gBAC7D,CAAC,CAAC,IAAI,wBAAiB,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;QACzE,CAAC,CACJ,CAAC;QA9Be,aAAQ,GAAR,QAAQ,CAAoB;QAC5B,sBAAiB,GAAjB,iBAAiB,CAAoB;IA8B1D,CAAC;CACJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@serenity-js/assertions",
3
- "version": "3.0.0-rc.21",
3
+ "version": "3.0.0-rc.22",
4
4
  "description": "Screenplay-style assertion library",
5
5
  "author": {
6
6
  "name": "Jan Molak",
@@ -46,7 +46,7 @@
46
46
  "npm": "^6 || ^7 || ^8"
47
47
  },
48
48
  "dependencies": {
49
- "@serenity-js/core": "3.0.0-rc.21",
49
+ "@serenity-js/core": "3.0.0-rc.22",
50
50
  "tiny-types": "^1.18.4"
51
51
  },
52
52
  "devDependencies": {
@@ -58,5 +58,5 @@
58
58
  "ts-node": "10.8.2",
59
59
  "typescript": "^4.7.4"
60
60
  },
61
- "gitHead": "ddf72178856dd97ee448029f5029236c3c8b8c8b"
61
+ "gitHead": "3eb059a552b02c3ef7ee3cf2d8dcaaba9fcb2059"
62
62
  }
@@ -7,6 +7,7 @@ export * from './equals';
7
7
  export * from './includes';
8
8
  export * from './isAfter';
9
9
  export * from './isBefore';
10
+ export * from './isCloseTo';
10
11
  export * from './isFalse';
11
12
  export * from './isGreaterThan';
12
13
  export * from './isLessThan';
@@ -0,0 +1,60 @@
1
+ import { Answerable, AnswersQuestions, d, Expectation, ExpectationMet, ExpectationNotMet } from '@serenity-js/core';
2
+
3
+ /**
4
+ * @desc
5
+ * Expectation that the actual value is within a given ± absolute tolerance range of the expected value.
6
+ *
7
+ * @example
8
+ * import { actorCalled } from '@serenity-js/core'
9
+ * import { Ensure, isCloseTo } from '@serenity-js/assertions'
10
+ *
11
+ * await actorCalled('Iris').attemptsTo(
12
+ * Ensure.that(10.123, isCloseTo(10, 0.2))
13
+ * )
14
+ *
15
+ * @param {Answerable<number>} expected
16
+ * @param {Answerable<number>} [absoluteTolerance=1e-9]
17
+ */
18
+ export function isCloseTo(expected: Answerable<number>, absoluteTolerance: Answerable<number> = 1e-9): Expectation<number> {
19
+ return new IsCloseTo(expected, absoluteTolerance);
20
+ }
21
+
22
+ /**
23
+ * @package
24
+ */
25
+ class IsCloseTo extends Expectation<number> {
26
+
27
+ constructor(
28
+ private readonly expected: Answerable<number>,
29
+ private readonly absoluteTolerance: Answerable<number>,
30
+ ) {
31
+ super(
32
+ d`have value close to ${ expected } ±${ absoluteTolerance }`,
33
+ async (actor: AnswersQuestions, actual: Answerable<number>) => {
34
+
35
+ const actualValue: number = await actor.answer(actual);
36
+ const expectedValue: number = await actor.answer(this.expected);
37
+ const tolerance: number = await actor.answer(this.absoluteTolerance);
38
+
39
+ const description = `have value close to ${ expectedValue } ±${ tolerance }`
40
+
41
+ // short-circuit exact equality
42
+ if (actualValue === expectedValue) {
43
+ return new ExpectationMet(description, expectedValue, actualValue);
44
+ }
45
+
46
+ if (! (Number.isFinite(actualValue) && Number.isFinite(expectedValue))) {
47
+ return new ExpectationNotMet(description, expectedValue, actualValue);
48
+ }
49
+
50
+ const difference = Math.abs(actualValue - expectedValue)
51
+
52
+ const isClose = difference <= tolerance;
53
+
54
+ return isClose
55
+ ? new ExpectationMet(description, expectedValue, actualValue)
56
+ : new ExpectationNotMet(description, expectedValue, actualValue);
57
+ }
58
+ );
59
+ }
60
+ }