@serenity-js/jasmine 3.11.0 → 3.12.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.
Files changed (167) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/esm/SerenityReporterForJasmine.d.ts +80 -0
  3. package/esm/SerenityReporterForJasmine.d.ts.map +1 -0
  4. package/esm/SerenityReporterForJasmine.js +201 -0
  5. package/esm/SerenityReporterForJasmine.js.map +1 -0
  6. package/esm/adapter/JasmineAdapter.d.ts +46 -0
  7. package/esm/adapter/JasmineAdapter.d.ts.map +1 -0
  8. package/esm/adapter/JasmineAdapter.js +116 -0
  9. package/esm/adapter/JasmineAdapter.js.map +1 -0
  10. package/esm/adapter/JasmineConfig.d.ts +82 -0
  11. package/esm/adapter/JasmineConfig.d.ts.map +1 -0
  12. package/esm/adapter/JasmineConfig.js +2 -0
  13. package/esm/adapter/JasmineConfig.js.map +1 -0
  14. package/esm/adapter/filters/AcceptingSpecFilter.d.ts +8 -0
  15. package/esm/adapter/filters/AcceptingSpecFilter.d.ts.map +1 -0
  16. package/esm/adapter/filters/AcceptingSpecFilter.js +9 -0
  17. package/esm/adapter/filters/AcceptingSpecFilter.js.map +1 -0
  18. package/esm/adapter/filters/CustomFunctionSpecFilter.d.ts +10 -0
  19. package/esm/adapter/filters/CustomFunctionSpecFilter.d.ts.map +1 -0
  20. package/esm/adapter/filters/CustomFunctionSpecFilter.js +12 -0
  21. package/esm/adapter/filters/CustomFunctionSpecFilter.js.map +1 -0
  22. package/esm/adapter/filters/GrepSpecFilter.d.ts +13 -0
  23. package/esm/adapter/filters/GrepSpecFilter.d.ts.map +1 -0
  24. package/esm/adapter/filters/GrepSpecFilter.js +15 -0
  25. package/esm/adapter/filters/GrepSpecFilter.js.map +1 -0
  26. package/esm/adapter/filters/InvertedGrepSpecFilter.d.ts +10 -0
  27. package/esm/adapter/filters/InvertedGrepSpecFilter.d.ts.map +1 -0
  28. package/esm/adapter/filters/InvertedGrepSpecFilter.js +12 -0
  29. package/esm/adapter/filters/InvertedGrepSpecFilter.js.map +1 -0
  30. package/esm/adapter/filters/SpecFilter.d.ts +7 -0
  31. package/esm/adapter/filters/SpecFilter.d.ts.map +1 -0
  32. package/esm/adapter/filters/SpecFilter.js +2 -0
  33. package/esm/adapter/filters/SpecFilter.js.map +1 -0
  34. package/esm/adapter/filters/index.d.ts +6 -0
  35. package/esm/adapter/filters/index.d.ts.map +1 -0
  36. package/esm/adapter/filters/index.js +6 -0
  37. package/esm/adapter/filters/index.js.map +1 -0
  38. package/esm/adapter/index.d.ts +3 -0
  39. package/esm/adapter/index.d.ts.map +1 -0
  40. package/esm/adapter/index.js +3 -0
  41. package/esm/adapter/index.js.map +1 -0
  42. package/esm/bootstrap.d.ts +27 -0
  43. package/esm/bootstrap.d.ts.map +1 -0
  44. package/esm/bootstrap.js +42 -0
  45. package/esm/bootstrap.js.map +1 -0
  46. package/esm/index.d.ts +2 -0
  47. package/esm/index.d.ts.map +1 -0
  48. package/esm/index.js +2 -0
  49. package/esm/index.js.map +1 -0
  50. package/esm/jasmine/Expectation.d.ts +19 -0
  51. package/esm/jasmine/Expectation.d.ts.map +1 -0
  52. package/esm/jasmine/Expectation.js +2 -0
  53. package/esm/jasmine/Expectation.js.map +1 -0
  54. package/esm/jasmine/JasmineDoneInfo.d.ts +22 -0
  55. package/esm/jasmine/JasmineDoneInfo.d.ts.map +1 -0
  56. package/esm/jasmine/JasmineDoneInfo.js +2 -0
  57. package/esm/jasmine/JasmineDoneInfo.js.map +1 -0
  58. package/esm/jasmine/JasmineReporter.d.ts +80 -0
  59. package/esm/jasmine/JasmineReporter.d.ts.map +1 -0
  60. package/esm/jasmine/JasmineReporter.js +2 -0
  61. package/esm/jasmine/JasmineReporter.js.map +1 -0
  62. package/esm/jasmine/JasmineStartedInfo.d.ts +15 -0
  63. package/esm/jasmine/JasmineStartedInfo.d.ts.map +1 -0
  64. package/esm/jasmine/JasmineStartedInfo.js +2 -0
  65. package/esm/jasmine/JasmineStartedInfo.js.map +1 -0
  66. package/esm/jasmine/Location.d.ts +12 -0
  67. package/esm/jasmine/Location.d.ts.map +1 -0
  68. package/esm/jasmine/Location.js +2 -0
  69. package/esm/jasmine/Location.js.map +1 -0
  70. package/esm/jasmine/Order.d.ts +16 -0
  71. package/esm/jasmine/Order.d.ts.map +1 -0
  72. package/esm/jasmine/Order.js +2 -0
  73. package/esm/jasmine/Order.js.map +1 -0
  74. package/esm/jasmine/Result.d.ts +18 -0
  75. package/esm/jasmine/Result.d.ts.map +1 -0
  76. package/esm/jasmine/Result.js +2 -0
  77. package/esm/jasmine/Result.js.map +1 -0
  78. package/esm/jasmine/SpecResult.d.ts +24 -0
  79. package/esm/jasmine/SpecResult.d.ts.map +1 -0
  80. package/esm/jasmine/SpecResult.js +2 -0
  81. package/esm/jasmine/SpecResult.js.map +1 -0
  82. package/esm/jasmine/SuiteResult.d.ts +25 -0
  83. package/esm/jasmine/SuiteResult.d.ts.map +1 -0
  84. package/esm/jasmine/SuiteResult.js +2 -0
  85. package/esm/jasmine/SuiteResult.js.map +1 -0
  86. package/esm/jasmine/index.d.ts +8 -0
  87. package/esm/jasmine/index.d.ts.map +1 -0
  88. package/esm/jasmine/index.js +8 -0
  89. package/esm/jasmine/index.js.map +1 -0
  90. package/esm/monkeyPatched.d.ts +14 -0
  91. package/esm/monkeyPatched.d.ts.map +1 -0
  92. package/esm/monkeyPatched.js +60 -0
  93. package/esm/monkeyPatched.js.map +1 -0
  94. package/lib/SerenityReporterForJasmine.d.ts +3 -2
  95. package/lib/SerenityReporterForJasmine.d.ts.map +1 -1
  96. package/lib/SerenityReporterForJasmine.js +37 -27
  97. package/lib/SerenityReporterForJasmine.js.map +1 -1
  98. package/lib/adapter/JasmineAdapter.d.ts +4 -4
  99. package/lib/adapter/JasmineAdapter.d.ts.map +1 -1
  100. package/lib/adapter/JasmineAdapter.js +12 -9
  101. package/lib/adapter/JasmineAdapter.js.map +1 -1
  102. package/lib/adapter/JasmineConfig.d.ts +1 -1
  103. package/lib/adapter/JasmineConfig.d.ts.map +1 -1
  104. package/lib/adapter/filters/AcceptingSpecFilter.d.ts +1 -1
  105. package/lib/adapter/filters/AcceptingSpecFilter.d.ts.map +1 -1
  106. package/lib/adapter/filters/CustomFunctionSpecFilter.d.ts +1 -1
  107. package/lib/adapter/filters/CustomFunctionSpecFilter.d.ts.map +1 -1
  108. package/lib/adapter/filters/GrepSpecFilter.d.ts +1 -1
  109. package/lib/adapter/filters/GrepSpecFilter.d.ts.map +1 -1
  110. package/lib/adapter/filters/InvertedGrepSpecFilter.d.ts +1 -1
  111. package/lib/adapter/filters/InvertedGrepSpecFilter.d.ts.map +1 -1
  112. package/lib/adapter/filters/index.d.ts +5 -5
  113. package/lib/adapter/filters/index.d.ts.map +1 -1
  114. package/lib/adapter/filters/index.js +5 -5
  115. package/lib/adapter/filters/index.js.map +1 -1
  116. package/lib/adapter/index.d.ts +2 -2
  117. package/lib/adapter/index.d.ts.map +1 -1
  118. package/lib/adapter/index.js +2 -2
  119. package/lib/adapter/index.js.map +1 -1
  120. package/lib/bootstrap.d.ts +1 -1
  121. package/lib/bootstrap.d.ts.map +1 -1
  122. package/lib/bootstrap.js +5 -5
  123. package/lib/bootstrap.js.map +1 -1
  124. package/lib/index.d.ts +1 -2
  125. package/lib/index.d.ts.map +1 -1
  126. package/lib/index.js +4 -2
  127. package/lib/index.js.map +1 -1
  128. package/lib/jasmine/JasmineDoneInfo.d.ts +2 -2
  129. package/lib/jasmine/JasmineDoneInfo.d.ts.map +1 -1
  130. package/lib/jasmine/JasmineReporter.d.ts +4 -4
  131. package/lib/jasmine/JasmineReporter.d.ts.map +1 -1
  132. package/lib/jasmine/JasmineStartedInfo.d.ts +1 -1
  133. package/lib/jasmine/JasmineStartedInfo.d.ts.map +1 -1
  134. package/lib/jasmine/Result.d.ts +1 -1
  135. package/lib/jasmine/Result.d.ts.map +1 -1
  136. package/lib/jasmine/SpecResult.d.ts +2 -2
  137. package/lib/jasmine/SpecResult.d.ts.map +1 -1
  138. package/lib/jasmine/SuiteResult.d.ts +3 -3
  139. package/lib/jasmine/SuiteResult.d.ts.map +1 -1
  140. package/lib/jasmine/index.d.ts +7 -7
  141. package/lib/jasmine/index.d.ts.map +1 -1
  142. package/lib/jasmine/index.js +7 -7
  143. package/lib/jasmine/index.js.map +1 -1
  144. package/lib/monkeyPatched.js +5 -4
  145. package/lib/monkeyPatched.js.map +1 -1
  146. package/lib/package.json +1 -0
  147. package/package.json +33 -8
  148. package/src/SerenityReporterForJasmine.ts +30 -19
  149. package/src/adapter/JasmineAdapter.ts +9 -9
  150. package/src/adapter/JasmineConfig.ts +1 -1
  151. package/src/adapter/filters/AcceptingSpecFilter.ts +1 -1
  152. package/src/adapter/filters/CustomFunctionSpecFilter.ts +1 -1
  153. package/src/adapter/filters/GrepSpecFilter.ts +1 -1
  154. package/src/adapter/filters/InvertedGrepSpecFilter.ts +1 -1
  155. package/src/adapter/filters/index.ts +5 -5
  156. package/src/adapter/index.ts +2 -2
  157. package/src/bootstrap.ts +2 -2
  158. package/src/index.ts +1 -3
  159. package/src/jasmine/JasmineDoneInfo.ts +2 -2
  160. package/src/jasmine/JasmineReporter.ts +4 -4
  161. package/src/jasmine/JasmineStartedInfo.ts +1 -1
  162. package/src/jasmine/Result.ts +1 -1
  163. package/src/jasmine/SpecResult.ts +2 -2
  164. package/src/jasmine/SuiteResult.ts +3 -3
  165. package/src/jasmine/index.ts +7 -7
  166. package/src/monkeyPatched.ts +5 -3
  167. package/tsconfig.build.json +0 -10
package/CHANGELOG.md CHANGED
@@ -3,6 +3,26 @@
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.12.0](https://github.com/serenity-js/serenity-js/compare/v3.11.1...v3.12.0) (2023-10-09)
7
+
8
+
9
+ ### Features
10
+
11
+ * **jasmine:** support for Jasmine 5 ([ee80215](https://github.com/serenity-js/serenity-js/commit/ee802152d1af7a50665def985fd946fc04e6399d)), closes [#1088](https://github.com/serenity-js/serenity-js/issues/1088) [#913](https://github.com/serenity-js/serenity-js/issues/913)
12
+ * **jasmine:** support for Jasmine 5 ([9b34e1e](https://github.com/serenity-js/serenity-js/commit/9b34e1eb9bfe1a1ad507fff569083da429b10f30))
13
+
14
+
15
+
16
+
17
+
18
+ ## [3.11.1](https://github.com/serenity-js/serenity-js/compare/v3.11.0...v3.11.1) (2023-10-04)
19
+
20
+ **Note:** Version bump only for package @serenity-js/jasmine
21
+
22
+
23
+
24
+
25
+
6
26
  # [3.11.0](https://github.com/serenity-js/serenity-js/compare/v3.10.4...v3.11.0) (2023-10-03)
7
27
 
8
28
  **Note:** Version bump only for package @serenity-js/jasmine
@@ -0,0 +1,80 @@
1
+ import { type Serenity } from '@serenity-js/core';
2
+ import type { JasmineDoneInfo, JasmineReporter, JasmineStartedInfo, SpecResult, SuiteResult } from './jasmine/index.js';
3
+ /**
4
+ * [Jasmine reporter](https://jasmine.github.io/tutorials/custom_reporter) that translates Jasmine-specific test events
5
+ * to Serenity/JS events.
6
+ */
7
+ export declare class SerenityReporterForJasmine implements JasmineReporter {
8
+ private readonly serenity;
9
+ private static readonly errorMessagePattern;
10
+ private describes;
11
+ private currentSceneId;
12
+ /**
13
+ * @param {Serenity} serenity
14
+ */
15
+ constructor(serenity: Serenity);
16
+ jasmineStarted(info: JasmineStartedInfo): void;
17
+ suiteStarted(result: SuiteResult): void;
18
+ suiteDone(result: SuiteResult): void;
19
+ specStarted(result: SpecResult): void;
20
+ specDone(result: SpecResult): Promise<void>;
21
+ jasmineDone(suiteInfo: JasmineDoneInfo): Promise<void>;
22
+ /**
23
+ * @private
24
+ * @param {DomainEvent[]} events
25
+ */
26
+ private emit;
27
+ /**
28
+ * @private
29
+ * @param {SpecResult} spec
30
+ * @returns {ScenarioDetails}
31
+ */
32
+ private scenarioDetailsOf;
33
+ /**
34
+ * @private
35
+ * @param {SuiteResult} result
36
+ * @returns {TestSuiteDetails}
37
+ */
38
+ private testSuiteDetailsOf;
39
+ /**
40
+ * @private
41
+ * @returns {string}
42
+ */
43
+ private currentFeatureNameFor;
44
+ /**
45
+ * @private
46
+ * @param {string} itBlockDescription
47
+ * @returns {string}
48
+ */
49
+ private currentScenarioNameFor;
50
+ /**
51
+ * @private
52
+ * @param {SpecResult | SuiteResult} result
53
+ * @returns {Outcome}
54
+ */
55
+ private outcomeFrom;
56
+ /**
57
+ * @private
58
+ * @param {Expectation} failure
59
+ * @returns {ProblemIndication}
60
+ */
61
+ private failureOutcomeFrom;
62
+ private errorFrom;
63
+ private containsCorrectlySerialisedError;
64
+ private containsIncorrectlySerialisedErrorWithErrorPropertiesInStack;
65
+ private containsIncorrectlySerialisedError;
66
+ /**
67
+ * It seems like Jasmine mixes up serialisation and display logic,
68
+ * which means that its "failure.stack" is not really an Error stacktrace,
69
+ * but rather something along the lines of:
70
+ * "error properties: AssertionError: undefined"
71
+ * where the error message is lost, and there's an "error properties:" prefix present.
72
+ *
73
+ * Probably caused by this:
74
+ * https://github.com/jasmine/jasmine/blob/b4cbe9850fbe192eaffeae450669f96e79a574ed/src/core/ExceptionFormatter.js#L93
75
+ *
76
+ * @param {Expectation} failure
77
+ */
78
+ private repairedStackTraceOf;
79
+ }
80
+ //# sourceMappingURL=SerenityReporterForJasmine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SerenityReporterForJasmine.d.ts","sourceRoot":"","sources":["../src/SerenityReporterForJasmine.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+D,KAAK,QAAQ,EAAwB,MAAM,mBAAmB,CAAC;AAmCrI,OAAO,KAAK,EAER,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,UAAU,EACV,WAAW,EACd,MAAM,oBAAoB,CAAC;AAE5B;;;GAGG;AACH,qBAAa,0BAA2B,YAAW,eAAe;IAUlD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IARrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAA8B;IACzE,OAAO,CAAC,SAAS,CAAqB;IAEtC,OAAO,CAAC,cAAc,CAA4B;IAElD;;OAEG;gBAC0B,QAAQ,EAAE,QAAQ;IAG/C,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI;IAI9C,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAMvC,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAMpC,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAYrC,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAwD3C,WAAW,CAAC,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAatD;;;OAGG;IACH,OAAO,CAAC,IAAI;IAIZ;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAQ1B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAQ7B;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IAO9B;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAcnB;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IA6B1B,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,gCAAgC;IAIxC,OAAO,CAAC,4DAA4D;IAMpE,OAAO,CAAC,kCAAkC;IAI1C;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,oBAAoB;CAS/B"}
@@ -0,0 +1,201 @@
1
+ import { AssertionError, ErrorSerialiser, ImplementationPendingError, TestCompromisedError } from '@serenity-js/core';
2
+ import { SceneFinished, SceneFinishes, SceneStarts, SceneTagged, TaskFinished, TaskStarts, TestRunFinished, TestRunFinishes, TestRunnerDetected, TestRunStarts, TestSuiteFinished, TestSuiteStarts, } from '@serenity-js/core/lib/events/index.js';
3
+ import { FileSystemLocation, Path } from '@serenity-js/core/lib/io/index.js';
4
+ import { ActivityDetails, Category, CorrelationId, ExecutionCompromised, ExecutionFailedWithAssertionError, ExecutionFailedWithError, ExecutionSkipped, ExecutionSuccessful, FeatureTag, ImplementationPending, Name, ScenarioDetails, TestSuiteDetails, } from '@serenity-js/core/lib/model/index.js';
5
+ /**
6
+ * [Jasmine reporter](https://jasmine.github.io/tutorials/custom_reporter) that translates Jasmine-specific test events
7
+ * to Serenity/JS events.
8
+ */
9
+ export class SerenityReporterForJasmine {
10
+ /**
11
+ * @param {Serenity} serenity
12
+ */
13
+ constructor(serenity) {
14
+ this.serenity = serenity;
15
+ this.describes = [];
16
+ this.currentSceneId = undefined;
17
+ }
18
+ jasmineStarted(info) {
19
+ this.emit(new TestRunStarts(this.serenity.currentTime()));
20
+ }
21
+ suiteStarted(result) {
22
+ this.describes.push(result);
23
+ this.emit(new TestSuiteStarts(this.testSuiteDetailsOf(result), this.serenity.currentTime()));
24
+ }
25
+ suiteDone(result) {
26
+ this.describes = this.describes.filter(suite => suite.id !== result.id);
27
+ this.emit(new TestSuiteFinished(this.testSuiteDetailsOf(result), this.outcomeFrom(result), this.serenity.currentTime()));
28
+ }
29
+ specStarted(result) {
30
+ this.currentSceneId = this.serenity.assignNewSceneId();
31
+ const details = this.scenarioDetailsOf(result);
32
+ this.emit(new SceneStarts(this.currentSceneId, details, this.serenity.currentTime()), new SceneTagged(this.currentSceneId, new FeatureTag(this.currentFeatureNameFor(result)), this.serenity.currentTime()), new TestRunnerDetected(this.currentSceneId, new Name('Jasmine'), this.serenity.currentTime()));
33
+ }
34
+ specDone(result) {
35
+ /**
36
+ * Serenity doesn't allow for more than one failure per activity, but Jasmine does.
37
+ * If there are multiple failures we wrap them up in fake activities so that they're all reported correctly.
38
+ */
39
+ if (result.failedExpectations.length > 1) {
40
+ result.failedExpectations.forEach(failedExpectation => {
41
+ const sceneId = this.serenity.currentSceneId();
42
+ const activityDetails = new ActivityDetails(new Name('Expectation'), new FileSystemLocation(Path.from(result.location.path), result.location.line, result.location.column));
43
+ const activityId = this.serenity.assignNewActivityId(activityDetails);
44
+ this.emit(new TaskStarts(sceneId, activityId, activityDetails, this.serenity.currentTime()), new TaskFinished(sceneId, activityId, activityDetails, this.failureOutcomeFrom(failedExpectation), this.serenity.currentTime()));
45
+ });
46
+ }
47
+ const scenarioDetails = this.scenarioDetailsOf(result), outcome = this.outcomeFrom(result);
48
+ this.emit(new SceneFinishes(this.currentSceneId, this.serenity.currentTime()));
49
+ return this.serenity.waitForNextCue()
50
+ .then(() => {
51
+ this.emit(new SceneFinished(this.currentSceneId, scenarioDetails, outcome, this.serenity.currentTime()));
52
+ }, error => {
53
+ this.emit(new SceneFinished(this.currentSceneId, scenarioDetails, new ExecutionFailedWithError(error), this.serenity.currentTime()));
54
+ throw error;
55
+ });
56
+ }
57
+ jasmineDone(suiteInfo) {
58
+ this.emit(new TestRunFinishes(this.serenity.currentTime()));
59
+ return this.serenity.waitForNextCue()
60
+ .then(() => {
61
+ this.emit(new TestRunFinished(new ExecutionSuccessful(), this.serenity.currentTime()));
62
+ })
63
+ .catch(error => {
64
+ this.emit(new TestRunFinished(new ExecutionFailedWithError(error), this.serenity.currentTime()));
65
+ throw error;
66
+ });
67
+ }
68
+ /**
69
+ * @private
70
+ * @param {DomainEvent[]} events
71
+ */
72
+ emit(...events) {
73
+ events.forEach(event => this.serenity.announce(event));
74
+ }
75
+ /**
76
+ * @private
77
+ * @param {SpecResult} spec
78
+ * @returns {ScenarioDetails}
79
+ */
80
+ scenarioDetailsOf(spec) {
81
+ return new ScenarioDetails(new Name(this.currentScenarioNameFor(spec.description)), new Category(this.currentFeatureNameFor(spec)), FileSystemLocation.fromJSON(spec.location));
82
+ }
83
+ /**
84
+ * @private
85
+ * @param {SuiteResult} result
86
+ * @returns {TestSuiteDetails}
87
+ */
88
+ testSuiteDetailsOf(result) {
89
+ return new TestSuiteDetails(new Name(result.description), FileSystemLocation.fromJSON(result.location), new CorrelationId(result.id));
90
+ }
91
+ /**
92
+ * @private
93
+ * @returns {string}
94
+ */
95
+ currentFeatureNameFor(spec) {
96
+ const path = new Path(spec.location.path);
97
+ return this.describes[0]
98
+ ? this.describes[0].description
99
+ : this.serenity.cwd().relative(path).value;
100
+ }
101
+ /**
102
+ * @private
103
+ * @param {string} itBlockDescription
104
+ * @returns {string}
105
+ */
106
+ currentScenarioNameFor(itBlockDescription) {
107
+ const [topSuite_, ...rest] = this.describes;
108
+ return rest.reverse()
109
+ .reduce((name, current) => `${current.description} ${name}`, itBlockDescription);
110
+ }
111
+ /**
112
+ * @private
113
+ * @param {SpecResult | SuiteResult} result
114
+ * @returns {Outcome}
115
+ */
116
+ outcomeFrom(result) {
117
+ switch (result.status) {
118
+ case 'failed':
119
+ return this.failureOutcomeFrom(result.failedExpectations[0]);
120
+ case 'pending':
121
+ return new ImplementationPending(new ImplementationPendingError(result.pendingReason || ''));
122
+ case 'excluded':
123
+ return new ExecutionSkipped();
124
+ case 'passed': // eslint-disable-line unicorn/no-useless-switch-case
125
+ default:
126
+ return new ExecutionSuccessful();
127
+ }
128
+ }
129
+ /**
130
+ * @private
131
+ * @param {Expectation} failure
132
+ * @returns {ProblemIndication}
133
+ */
134
+ failureOutcomeFrom(failure) {
135
+ const error = this.errorFrom(failure);
136
+ if (error instanceof AssertionError) {
137
+ // sadly, Jasmine error propagation mechanism is rather basic
138
+ // and unable to serialise the expected/actual properties of the AssertionError object
139
+ return new ExecutionFailedWithAssertionError(error);
140
+ }
141
+ if (error instanceof TestCompromisedError) {
142
+ return new ExecutionCompromised(error);
143
+ }
144
+ if (failure.matcherName) { // the presence of a non-empty matcherName property indicates a Jasmine-specific assertion error
145
+ return new ExecutionFailedWithAssertionError(this.serenity.createError(AssertionError, {
146
+ message: failure.message,
147
+ diff: {
148
+ expected: failure.expected,
149
+ actual: failure.actual,
150
+ },
151
+ cause: error,
152
+ }));
153
+ }
154
+ return new ExecutionFailedWithError(error);
155
+ }
156
+ errorFrom(failure) {
157
+ if (this.containsCorrectlySerialisedError(failure)) {
158
+ return ErrorSerialiser.deserialiseFromStackTrace(failure.stack);
159
+ }
160
+ if (this.containsIncorrectlySerialisedErrorWithErrorPropertiesInStack(failure)) {
161
+ return ErrorSerialiser.deserialiseFromStackTrace(this.repairedStackTraceOf(failure));
162
+ }
163
+ if (this.containsIncorrectlySerialisedError(failure)) {
164
+ return ErrorSerialiser.deserialiseFromStackTrace(this.repairedStackTraceOf(failure));
165
+ }
166
+ return new Error(failure.message);
167
+ }
168
+ containsCorrectlySerialisedError(failure) {
169
+ return !!failure.stack && SerenityReporterForJasmine.errorMessagePattern.test(failure.stack.split('\n')[0]);
170
+ }
171
+ containsIncorrectlySerialisedErrorWithErrorPropertiesInStack(failure) {
172
+ return !!failure.stack
173
+ && failure.stack.startsWith('error properties: ')
174
+ && SerenityReporterForJasmine.errorMessagePattern.test(failure.message);
175
+ }
176
+ containsIncorrectlySerialisedError(failure) {
177
+ return !!failure.stack && SerenityReporterForJasmine.errorMessagePattern.test(failure.message);
178
+ }
179
+ /**
180
+ * It seems like Jasmine mixes up serialisation and display logic,
181
+ * which means that its "failure.stack" is not really an Error stacktrace,
182
+ * but rather something along the lines of:
183
+ * "error properties: AssertionError: undefined"
184
+ * where the error message is lost, and there's an "error properties:" prefix present.
185
+ *
186
+ * Probably caused by this:
187
+ * https://github.com/jasmine/jasmine/blob/b4cbe9850fbe192eaffeae450669f96e79a574ed/src/core/ExceptionFormatter.js#L93
188
+ *
189
+ * @param {Expectation} failure
190
+ */
191
+ repairedStackTraceOf(failure) {
192
+ const lastLine = failure.message.split('\n').pop();
193
+ const frames = failure.stack.split('\n').filter(line => !line.startsWith('error properties:'));
194
+ return [
195
+ failure.message,
196
+ ...frames.slice(frames.indexOf(lastLine) + 1),
197
+ ].join('\n');
198
+ }
199
+ }
200
+ SerenityReporterForJasmine.errorMessagePattern = /^([^\s:]*Error):\s(.*)$/m;
201
+ //# sourceMappingURL=SerenityReporterForJasmine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SerenityReporterForJasmine.js","sourceRoot":"","sources":["../src/SerenityReporterForJasmine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { TestRunnerAdapter } from '@serenity-js/core/lib/adapter/index.js';
2
+ import type { ModuleLoader } from '@serenity-js/core/lib/io/index.js';
3
+ import type { Outcome } from '@serenity-js/core/lib/model/index.js';
4
+ import type { JasmineConfig } from './JasmineConfig.js';
5
+ /**
6
+ * Allows for programmatic execution of Jasmine test scenarios,
7
+ * using {@apilink SerenityReporterForJasmine} to report progress.
8
+ *
9
+ * ## Learn more
10
+ * - {@apilink TestRunnerAdapter}
11
+ *
12
+ * @group Integration
13
+ */
14
+ export declare class JasmineAdapter implements TestRunnerAdapter {
15
+ private readonly config;
16
+ private readonly loader;
17
+ private runner;
18
+ private totalScenarios;
19
+ private static readonly defaultConfig;
20
+ constructor(config: JasmineConfig, loader: ModuleLoader);
21
+ /**
22
+ * Scenario success threshold for this test runner.
23
+ */
24
+ successThreshold(): Outcome | {
25
+ Code: number;
26
+ };
27
+ /**
28
+ * Loads test scenarios.
29
+ *
30
+ * @param pathsToScenarios
31
+ */
32
+ load(pathsToScenarios: string[]): Promise<void>;
33
+ private configureSpecFilter;
34
+ private loadSpecs;
35
+ private specFilter;
36
+ /**
37
+ * Returns the number of loaded scenarios
38
+ */
39
+ scenarioCount(): number;
40
+ private countScenarios;
41
+ /**
42
+ * Runs loaded test scenarios.
43
+ */
44
+ run(): Promise<void>;
45
+ }
46
+ //# sourceMappingURL=JasmineAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JasmineAdapter.d.ts","sourceRoot":"","sources":["../../src/adapter/JasmineAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAMpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;;;;;;;GAQG;AACH,qBAAa,cAAe,YAAW,iBAAiB;IAyBhD,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAxB3B,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,cAAc,CAAK;IAE3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAiBnC;gBAGmB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,YAAY;IAIzC;;OAEG;IACH,gBAAgB,IAAI,OAAO,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE;IAI9C;;;;OAIG;IACG,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCrD,OAAO,CAAC,mBAAmB;YASb,SAAS;IAQvB,OAAO,CAAC,UAAU;IAclB;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB,OAAO,CAAC,cAAc;IAWtB;;OAEG;IACG,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B"}
@@ -0,0 +1,116 @@
1
+ import { ExecutionIgnored } from '@serenity-js/core/lib/model/index.js';
2
+ import reporter from '../index.js';
3
+ import { AcceptingSpecFilter, CustomFunctionSpecFilter, GrepSpecFilter, InvertedGrepSpecFilter } from './filters/index.js';
4
+ /**
5
+ * Allows for programmatic execution of Jasmine test scenarios,
6
+ * using {@apilink SerenityReporterForJasmine} to report progress.
7
+ *
8
+ * ## Learn more
9
+ * - {@apilink TestRunnerAdapter}
10
+ *
11
+ * @group Integration
12
+ */
13
+ export class JasmineAdapter {
14
+ constructor(config, loader) {
15
+ this.config = config;
16
+ this.loader = loader;
17
+ this.totalScenarios = 0;
18
+ }
19
+ /**
20
+ * Scenario success threshold for this test runner.
21
+ */
22
+ successThreshold() {
23
+ return ExecutionIgnored;
24
+ }
25
+ /**
26
+ * Loads test scenarios.
27
+ *
28
+ * @param pathsToScenarios
29
+ */
30
+ async load(pathsToScenarios) {
31
+ const JasmineRunner = this.loader.require('jasmine');
32
+ this.runner = new JasmineRunner({ projectBaseDir: '' });
33
+ if (this.config.defaultTimeoutInterval) {
34
+ this.runner.jasmine.DEFAULT_TIMEOUT_INTERVAL = this.config.defaultTimeoutInterval;
35
+ }
36
+ this.runner.clearReporters();
37
+ this.runner.loadConfig(Object.assign(JasmineAdapter.defaultConfig, this.config));
38
+ this.runner.addReporter(reporter(this.runner.jasmine));
39
+ if (this.config.reporters) {
40
+ this.config.reporters.forEach(reporter => {
41
+ this.runner.addReporter(reporter);
42
+ });
43
+ }
44
+ this.runner.configureDefaultReporter(this.config);
45
+ this.runner.loadRequires();
46
+ this.runner.loadHelpers();
47
+ this.configureSpecFilter();
48
+ await this.loadSpecs(pathsToScenarios);
49
+ this.countScenarios(this.runner.env.topSuite());
50
+ }
51
+ configureSpecFilter() {
52
+ /*
53
+ * Configure spec filter
54
+ */
55
+ this.runner.env.configure({
56
+ specFilter: spec => this.specFilter().matches(spec.getFullName()),
57
+ });
58
+ }
59
+ async loadSpecs(pathsToScenarios) {
60
+ this.runner.specDir = '';
61
+ this.runner.specFiles = [];
62
+ this.runner.addMatchingSpecFiles(pathsToScenarios);
63
+ await this.runner.loadSpecs();
64
+ }
65
+ specFilter() {
66
+ if (this.config.specFilter) {
67
+ return new CustomFunctionSpecFilter(this.config.specFilter);
68
+ }
69
+ if (this.config.grep) {
70
+ return this.config.invertGrep
71
+ ? new InvertedGrepSpecFilter(this.config.grep)
72
+ : new GrepSpecFilter(this.config.grep);
73
+ }
74
+ return new AcceptingSpecFilter();
75
+ }
76
+ /**
77
+ * Returns the number of loaded scenarios
78
+ */
79
+ scenarioCount() {
80
+ return this.totalScenarios;
81
+ }
82
+ countScenarios(suite) {
83
+ suite.children?.forEach((child) => {
84
+ if (Array.isArray(child.children)) {
85
+ return this.countScenarios(child);
86
+ }
87
+ if (this.specFilter().matches(child.getFullName())) {
88
+ this.totalScenarios++;
89
+ }
90
+ });
91
+ }
92
+ /**
93
+ * Runs loaded test scenarios.
94
+ */
95
+ async run() {
96
+ this.runner.exitOnCompletion = false;
97
+ await this.runner.execute();
98
+ }
99
+ }
100
+ JasmineAdapter.defaultConfig = {
101
+ /*
102
+ * Serenity/JS doesn't use Jasmine's assertions, so this mechanism can be disabled
103
+ */
104
+ oneFailurePerSpec: true,
105
+ /*
106
+ * A spec should stop execution as soon as there's a hook or spec failure
107
+ * See https://github.com/angular/protractor/issues/3234
108
+ */
109
+ stopSpecOnExpectationFailure: true,
110
+ /*
111
+ * Default to not executing tests at random.
112
+ * See https://github.com/angular/protractor/blob/4f74a4ec753c97adfe955fe468a39286a0a55837/lib/frameworks/jasmine.js#L76
113
+ */
114
+ random: false,
115
+ };
116
+ //# sourceMappingURL=JasmineAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JasmineAdapter.js","sourceRoot":"","sources":["../../src/adapter/JasmineAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import type { JasmineReporter } from '../jasmine/index.js';
2
+ /**
3
+ * Configuration object that will be passed to the JasmineRunner.
4
+ *
5
+ * ## Learn more
6
+ * - [Jasmine configuration](https://jasmine.github.io/setup/nodejs.html)
7
+ *
8
+ * @group Configuration
9
+ */
10
+ export interface JasmineConfig {
11
+ /**
12
+ * A list of paths to helper files that should be loaded and executed before the `requires` and the `specs`.
13
+ * Accepts relative and absolute paths as well as glob expressions.
14
+ *
15
+ * #### Learn more
16
+ * - [Jasmine tutorial](https://jasmine.github.io/tutorials/react_with_npm)
17
+ */
18
+ helpers?: string[];
19
+ /**
20
+ * A list of paths to files that should be required after the `helpers`, but before the `specs`.
21
+ * The paths need to be compatible with Node `require`.
22
+ */
23
+ requires?: string[];
24
+ /**
25
+ * Whether or not the tests should be executed in a pseudo-random order.
26
+ */
27
+ random?: boolean;
28
+ /**
29
+ * Used to exclude any test scenarios which name doesn't match the pattern from the run.
30
+ */
31
+ grep?: string | RegExp;
32
+ /**
33
+ * Inverts 'grep' matches, defaults to `false`
34
+ */
35
+ invertGrep?: boolean;
36
+ /**
37
+ * Receives the full name of a test scenario and returns `true`
38
+ * for those that should be executed.
39
+ *
40
+ * Takes precedence over `grep`.
41
+ */
42
+ specFilter?: (specName: string) => boolean;
43
+ /**
44
+ * The randomisation seed that will be used to determine the pseudo-random order of execution,
45
+ * if `random` is set to `true`
46
+ */
47
+ seed?: string;
48
+ /**
49
+ * Sets the global `jasmine.DEFAULT_TIMEOUT_INTERVAL`,
50
+ * which defines the default number of milliseconds Jasmine will wait for an asynchronous spec to complete.
51
+ *
52
+ * #### Learn more
53
+ * - [Jasmine default timeout interval](https://jasmine.github.io/api/edge/jasmine#.DEFAULT_TIMEOUT_INTERVAL)
54
+ */
55
+ defaultTimeoutInterval?: number;
56
+ /**
57
+ * A list of Jasmine reporters to be added to the test runner.
58
+ *
59
+ * Useful for situations like configuring ReportPortal, because you cannot use `jasmine.addReporter()` in the Protractor config.
60
+ *
61
+ * **Note:** reporters must be instantiated before adding them to the configuration.
62
+ *
63
+ * #### Using ReportPortal with Protractor and Jasmine
64
+ *
65
+ * ```js
66
+ * // protractor.conf.js
67
+ * const AgentJasmine = require('@reportportal/agent-js-jasmine')
68
+ * const agent = new AgentJasmine(require('./reportportalConf'))
69
+ * // ...
70
+ * jasmineNodeOpts: {
71
+ * // ...
72
+ * reporters: [ agent.getJasmineReporter() ],
73
+ * }
74
+ *
75
+ * afterLaunch:() => {
76
+ * return agent.getExitPromise();
77
+ * },
78
+ * ```
79
+ */
80
+ reporters?: JasmineReporter[];
81
+ }
82
+ //# sourceMappingURL=JasmineConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JasmineConfig.d.ts","sourceRoot":"","sources":["../../src/adapter/JasmineConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAE1B;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAEpB;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAEvB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAE1C;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;;;;OAMG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAEhC;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;CACjC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=JasmineConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JasmineConfig.js","sourceRoot":"","sources":["../../src/adapter/JasmineConfig.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import type { SpecFilter } from './SpecFilter.js';
2
+ /**
3
+ * @package
4
+ */
5
+ export declare class AcceptingSpecFilter implements SpecFilter {
6
+ matches(specName: string): boolean;
7
+ }
8
+ //# sourceMappingURL=AcceptingSpecFilter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AcceptingSpecFilter.d.ts","sourceRoot":"","sources":["../../../src/adapter/filters/AcceptingSpecFilter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;GAEG;AACH,qBAAa,mBAAoB,YAAW,UAAU;IAClD,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAGrC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @package
3
+ */
4
+ export class AcceptingSpecFilter {
5
+ matches(specName) {
6
+ return true;
7
+ }
8
+ }
9
+ //# sourceMappingURL=AcceptingSpecFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AcceptingSpecFilter.js","sourceRoot":"","sources":["../../../src/adapter/filters/AcceptingSpecFilter.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,mBAAmB;IAC5B,OAAO,CAAC,QAAgB;QACpB,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ"}
@@ -0,0 +1,10 @@
1
+ import type { SpecFilter } from './SpecFilter.js';
2
+ /**
3
+ * @package
4
+ */
5
+ export declare class CustomFunctionSpecFilter implements SpecFilter {
6
+ private readonly fn;
7
+ constructor(fn: (specName: string) => boolean);
8
+ matches(specName: string): boolean;
9
+ }
10
+ //# sourceMappingURL=CustomFunctionSpecFilter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomFunctionSpecFilter.d.ts","sourceRoot":"","sources":["../../../src/adapter/filters/CustomFunctionSpecFilter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;GAEG;AACH,qBAAa,wBAAyB,YAAW,UAAU;IAC3C,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO;IAG9D,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAGrC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @package
3
+ */
4
+ export class CustomFunctionSpecFilter {
5
+ constructor(fn) {
6
+ this.fn = fn;
7
+ }
8
+ matches(specName) {
9
+ return this.fn(specName);
10
+ }
11
+ }
12
+ //# sourceMappingURL=CustomFunctionSpecFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomFunctionSpecFilter.js","sourceRoot":"","sources":["../../../src/adapter/filters/CustomFunctionSpecFilter.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,wBAAwB;IACjC,YAA6B,EAAiC;QAAjC,OAAE,GAAF,EAAE,CAA+B;IAC9D,CAAC;IAED,OAAO,CAAC,QAAgB;QACpB,OAAO,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;CACJ"}