@temperlang/std 0.3.0 → 0.5.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/testing.js CHANGED
@@ -1,223 +1,225 @@
1
1
  import {
2
- globalConsole as globalConsole__232, listBuilderToList as listBuilderToList_247, pairConstructor as pairConstructor_275, listedMap as listedMap_276, listBuilderAdd as listBuilderAdd_120, listedJoin as listedJoin_99, listify as listify_69, listedGet as listedGet_159, strCat as strCat_129
3
- } from "@temperlang/core";
4
- import {
5
- strict as strict__243
2
+ strict as strict__324
6
3
  } from "assert";
7
- /** @type {Console_233} */
8
- const console_231 = globalConsole__232;
9
- export class Test {
4
+ import {
5
+ type as type__338, listBuilderAdd as listBuilderAdd_318, listBuilderToList as listBuilderToList_328, listedJoin as listedJoin_336, pairConstructor as pairConstructor_353, listedMap as listedMap_354, listedReduceFrom as listedReduceFrom_365, stringSplit as stringSplit_370, listedGet as listedGet_375
6
+ } from "@temperlang/core";
7
+ export class Test extends type__338() {
10
8
  /**
11
- * @param {boolean} success_235
12
- * @param {() => string} message_236
9
+ * @param {boolean} success_314
10
+ * @param {() => string} message_315
13
11
  */
14
- assert(success_235, message_236) {
15
- if (! success_235) {
16
- this.#_passing_237 = false;
17
- listBuilderAdd_120(this.#_messages_238, message_236());
18
- } else {
19
- void 0;
12
+ assert(success_314, message_315) {
13
+ let t_316;
14
+ if (! success_314) {
15
+ this.#_passing_317 = false;
16
+ t_316 = message_315();
17
+ listBuilderAdd_318(this.#_messages_319, t_316);
20
18
  }
21
19
  return;
22
20
  }
23
21
  /**
24
- * @param {boolean} success_240
25
- * @param {() => string} message_241
22
+ * @param {boolean} success_321
23
+ * @param {() => string} message_322
26
24
  * @returns {void}
27
25
  */
28
- assertHard(success_240, message_241) {
29
- this.assert(success_240, message_241);
30
- if (! success_240) {
31
- this.#_failedOnAssert_242 = true;
32
- strict__243.fail(this.messagesCombined());
33
- } else {
34
- void 0;
26
+ assertHard(success_321, message_322) {
27
+ this.assert(success_321, message_322);
28
+ if (! success_321) {
29
+ this.#_failedOnAssert_323 = true;
30
+ strict__324.fail(this.messagesCombined());
35
31
  }
36
32
  return;
37
33
  }
38
34
  /** @returns {void} */
39
35
  softFailToHard() {
40
36
  if (this.hasUnhandledFail) {
41
- this.#_failedOnAssert_242 = true;
42
- strict__243.fail(this.messagesCombined());
43
- } else {
44
- void 0;
37
+ this.#_failedOnAssert_323 = true;
38
+ strict__324.fail(this.messagesCombined());
45
39
  }
46
40
  return;
47
41
  }
48
42
  /** @returns {boolean} */
49
43
  get passing() {
50
- return this.#_passing_237;
44
+ return this.#_passing_317;
51
45
  }
52
46
  /** @returns {Array<string>} */
53
47
  messages() {
54
- return listBuilderToList_247(this.#_messages_238);
48
+ return listBuilderToList_328(this.#_messages_319);
55
49
  }
56
50
  /** @returns {boolean} */
57
51
  get failedOnAssert() {
58
- return this.#_failedOnAssert_242;
52
+ return this.#_failedOnAssert_323;
59
53
  }
60
54
  /** @returns {boolean} */
61
55
  get hasUnhandledFail() {
62
- let t_250;
63
- if (this.#_failedOnAssert_242) {
64
- t_250 = true;
56
+ let t_331;
57
+ if (this.#_failedOnAssert_323) {
58
+ t_331 = true;
65
59
  } else {
66
- t_250 = this.#_passing_237;
60
+ t_331 = this.#_passing_317;
67
61
  }
68
- return ! t_250;
62
+ return ! t_331;
69
63
  }
70
64
  /** @returns {string | null} */
71
65
  messagesCombined() {
72
- let return_252;
73
- let t_253;
74
- let t_254;
75
- if (! this.#_messages_238.length) {
76
- return_252 = null;
66
+ let return_333;
67
+ if (! this.#_messages_319.length) {
68
+ return_333 = null;
77
69
  } else {
78
- t_253 = this.#_messages_238;
79
- function fn_255(it_256) {
80
- return it_256;
70
+ function fn_334(it_335) {
71
+ return it_335;
81
72
  }
82
- t_254 = listedJoin_99(t_253, ", ", fn_255);
83
- return_252 = t_254;
73
+ return_333 = listedJoin_336(this.#_messages_319, ", ", fn_334);
84
74
  }
85
- return return_252;
75
+ return return_333;
86
76
  }
87
77
  /** @type {boolean} */
88
- #_failedOnAssert_242;
78
+ #_failedOnAssert_323;
89
79
  /** @type {boolean} */
90
- #_passing_237;
80
+ #_passing_317;
91
81
  /** @type {Array<string>} */
92
- #_messages_238;
93
- /**
94
- * @param {boolean} _failedOnAssert_257
95
- * @param {boolean} _passing_258
96
- * @param {Array<string>} _messages_259
97
- */
98
- constructor(_failedOnAssert_257, _passing_258, _messages_259) {
99
- let t_260;
100
- if (!(_failedOnAssert_257 !== void 0)) {
101
- _failedOnAssert_257 = false;
102
- }
103
- if (!(_passing_258 !== void 0)) {
104
- _passing_258 = true;
105
- }
106
- if (!(_messages_259 !== void 0)) {
107
- t_260 = [];
108
- _messages_259 = t_260;
109
- }
110
- this.#_failedOnAssert_242 = _failedOnAssert_257;
111
- this.#_passing_237 = _passing_258;
112
- this.#_messages_238 = _messages_259;
82
+ #_messages_319;
83
+ constructor() {
84
+ super ();
85
+ this.#_failedOnAssert_323 = false;
86
+ this.#_passing_317 = true;
87
+ let t_337 = [];
88
+ this.#_messages_319 = t_337;
113
89
  return;
114
90
  }
115
91
  };
116
- /** @type {Type_261} */
117
- export const TestName = "String: Type";
118
- /** @type {Type_261} */
119
- export const TestFun = "fn (Test): (Void | Bubble): Type";
120
- /** @type {Type_261} */
121
- export const TestCase = "Pair\u003cString, fn (Test): (Void | Bubble)\u003e: Type";
122
- /** @type {Type_261} */
123
- export const TestFailureMessage = "String: Type";
124
- /** @type {Type_261} */
125
- export const TestResult = "Pair\u003cString, List\u003cString\u003e\u003e: Type";
126
92
  /**
127
- * @param {Array<Pair_277<string, (arg0: Test) => void>>} testCases_262
128
- * @returns {Array<Pair_277<string, Array<string>>>}
93
+ * @param {Array<Pair_355<string, (arg0: Test) => void>>} testCases_339
94
+ * @returns {Array<Pair_355<string, Array<string>>>}
129
95
  */
130
- export function processTestCases(testCases_262) {
131
- function fn_263(testCase_264) {
132
- let t_265;
133
- let t_266;
134
- let t_267;
135
- const key_268 = testCase_264.key;
136
- const fun_269 = testCase_264.value;
137
- const test_270 = new Test();
138
- let hadBubble_271;
96
+ export function processTestCases(testCases_339) {
97
+ function fn_340(testCase_341) {
98
+ let t_342;
99
+ let t_343;
100
+ let t_344;
101
+ let t_345;
102
+ const key_346 = testCase_341.key;
103
+ const fun_347 = testCase_341.value;
104
+ const test_348 = new Test();
105
+ let hadBubble_349 = false;
139
106
  try {
140
- fun_269(test_270);
141
- hadBubble_271 = false;
107
+ fun_347(test_348);
142
108
  } catch {
143
- hadBubble_271 = true;
109
+ hadBubble_349 = true;
144
110
  }
145
- const messages_272 = test_270.messages();
146
- let failures_273;
147
- if (test_270.passing) {
148
- failures_273 = listify_69();
111
+ const messages_350 = test_348.messages();
112
+ let failures_351;
113
+ if (test_348.passing) {
114
+ t_344 = ! hadBubble_349;
149
115
  } else {
150
- if (hadBubble_271) {
151
- t_265 = test_270.failedOnAssert;
152
- t_267 = ! t_265;
116
+ t_344 = false;
117
+ }
118
+ if (t_344) {
119
+ failures_351 = Object.freeze([]);
120
+ } else {
121
+ if (hadBubble_349) {
122
+ t_342 = test_348.failedOnAssert;
123
+ t_345 = ! t_342;
153
124
  } else {
154
- t_267 = false;
125
+ t_345 = false;
155
126
  }
156
- if (t_267) {
157
- const allMessages_274 = messages_272.slice();
158
- listBuilderAdd_120(allMessages_274, "Bubble");
159
- t_266 = listBuilderToList_247(allMessages_274);
160
- failures_273 = t_266;
127
+ if (t_345) {
128
+ const allMessages_352 = messages_350.slice();
129
+ listBuilderAdd_318(allMessages_352, "Bubble");
130
+ t_343 = listBuilderToList_328(allMessages_352);
131
+ failures_351 = t_343;
161
132
  } else {
162
- failures_273 = messages_272;
133
+ failures_351 = messages_350;
163
134
  }
164
135
  }
165
- return pairConstructor_275(key_268, failures_273);
136
+ return pairConstructor_353(key_346, failures_351);
166
137
  }
167
- return listedMap_276(testCases_262, fn_263);
138
+ return listedMap_354(testCases_339, fn_340);
168
139
  };
169
- /** @param {Array<Pair_277<string, Array<string>>>} testResults_278 */
170
- export function reportTestResults(testResults_278) {
171
- let return_279;
172
- let t_280;
173
- let t_281;
174
- let t_282;
175
- let t_283;
176
- let i_284 = 0;
177
- s__1288_285: {
178
- while (true) {
179
- t_280 = testResults_278.length;
180
- if (i_284 < t_280) {
181
- try {
182
- t_283 = listedGet_159(testResults_278, i_284);
183
- } catch {
184
- break;
185
- }
186
- const testResult_286 = t_283;
187
- const failureMessages_287 = testResult_286.value;
188
- if (! failureMessages_287.length) {
189
- t_282 = testResult_286.key;
190
- console_231.log(strCat_129(t_282, ": Passed"));
191
- } else {
192
- function fn_288(it_289) {
193
- return it_289;
194
- }
195
- const message_290 = listedJoin_99(failureMessages_287, ", ", fn_288);
196
- t_281 = testResult_286.key;
197
- console_231.log(strCat_129(t_281, ": Failed ", message_290));
198
- }
199
- i_284 = i_284 + 1;
200
- } else {
201
- return_279 = void 0;
202
- break s__1288_285;
140
+ /**
141
+ * @param {Array<Pair_355<string, Array<string>>>} testResults_356
142
+ * @param {(arg0: string) => void} writeLine_357
143
+ */
144
+ export function reportTestResults(testResults_356, writeLine_357) {
145
+ let t_358;
146
+ writeLine_357("\u003ctestsuites\u003e");
147
+ const total_359 = testResults_356.length.toString();
148
+ function fn_360(fails_361, testResult_362) {
149
+ let t_363;
150
+ if (! testResult_362.value.length) {
151
+ t_363 = 0;
152
+ } else {
153
+ t_363 = 1;
154
+ }
155
+ return fails_361 + t_363;
156
+ }
157
+ const fails_364 = listedReduceFrom_365(testResults_356, 0, fn_360).toString();
158
+ const totals_366 = "tests='" + total_359 + "' failures='" + fails_364 + "'";
159
+ writeLine_357(" \u003ctestsuite name='suite' " + totals_366 + " time='0.0'\u003e");
160
+ function escape_367(s_368) {
161
+ let t_369 = stringSplit_370(s_368, "'");
162
+ function fn_371(x_372) {
163
+ return x_372;
164
+ }
165
+ return listedJoin_336(t_369, "\u0026apos;", fn_371);
166
+ }
167
+ let i_373 = 0;
168
+ while (true) {
169
+ t_358 = testResults_356.length;
170
+ if (!(i_373 < t_358)) {
171
+ break;
172
+ }
173
+ const testResult_374 = listedGet_375(testResults_356, i_373);
174
+ const failureMessages_376 = testResult_374.value;
175
+ const name_377 = escape_367(testResult_374.key);
176
+ const basics_378 = "name='" + name_377 + "' classname='" + name_377 + "' time='0.0'";
177
+ if (! failureMessages_376.length) {
178
+ writeLine_357(" \u003ctestcase " + basics_378 + " /\u003e");
179
+ } else {
180
+ writeLine_357(" \u003ctestcase " + basics_378 + "\u003e");
181
+ function fn_379(it_380) {
182
+ return it_380;
203
183
  }
184
+ const message_381 = escape_367(listedJoin_336(failureMessages_376, ", ", fn_379));
185
+ writeLine_357(" \u003cfailure message='" + message_381 + "' /\u003e");
186
+ writeLine_357(" \u003c/testcase\u003e");
204
187
  }
205
- throw Error();
188
+ i_373 = i_373 + 1;
206
189
  }
207
- return return_279;
208
- };
209
- /** @param {Array<Pair_277<string, (arg0: Test) => void>>} testCases_291 */
210
- export function runTestCases(testCases_291) {
211
- reportTestResults(processTestCases(testCases_291));
190
+ writeLine_357(" \u003c/testsuite\u003e");
191
+ writeLine_357("\u003c/testsuites\u003e");
212
192
  return;
213
193
  };
214
194
  /**
215
- * @param {(arg0: Test) => void} testFun_292
195
+ * @param {Array<Pair_355<string, (arg0: Test) => void>>} testCases_382
196
+ * @returns {string}
197
+ */
198
+ export function runTestCases(testCases_382) {
199
+ const report_383 = [""];
200
+ let t_384 = processTestCases(testCases_382);
201
+ function fn_385(line_386) {
202
+ report_383[0] += line_386;
203
+ report_383[0] += "\n";
204
+ return;
205
+ }
206
+ reportTestResults(t_384, fn_385);
207
+ return report_383[0];
208
+ };
209
+ /**
210
+ * @param {(arg0: Test) => void} testFun_387
216
211
  * @returns {void}
217
212
  */
218
- export function runTest(testFun_292) {
219
- const test_293 = new Test();
220
- testFun_292(test_293);
221
- test_293.softFailToHard();
213
+ export function runTest(testFun_387) {
214
+ const test_388 = new Test();
215
+ try {
216
+ testFun_387(test_388);
217
+ } catch {
218
+ function fn_389() {
219
+ return "bubble during test running";
220
+ }
221
+ test_388.assert(false, fn_389);
222
+ }
223
+ test_388.softFailToHard();
222
224
  return;
223
225
  };
package/testing.js.map CHANGED
@@ -1 +1 @@
1
- { "version": 3, "file": "js/std/testing.js", "sources": [ "std/testing.temper.md" ], "sourcesContent": [ "# Temper test framework\n\n## Test instance\n\nWe currently convert assert and check macro calls into method calls on a `Test`\ninstance.\n\n export class Test {\n\nRecommended default Temper assert is soft, meaning that it records failures for\nreporting but doesn't immediately end test execution on a false value. This lets\nyou check multiple conditions more easily.\n\n @connected(\u0022Test::assert\u0022)\n public assert(success: Boolean, message: fn (): String): Void {\n if (!success) {\n _passing = false;\n _messages.add(message());\n }\n }\n\nTypical hard asserts that end the test on false condition also are available.\n\n @connected(\u0022Test::assertHard\u0022)\n public assertHard(\n success: Boolean,\n message: fn (): String,\n ): Void | Bubble {\n assert(success, message);\n if (!success) {\n // Attempt to distinguish assert fails from others.\n // Sadly, they can still orelse an assert failure, so this isn't\n // flawless.\n _failedOnAssert = true;\n bail();\n }\n }\n\nHarden and end current test on any pending failure if not previously hardened.\nBackends typically insert calls to this if needed, but you can also call it\nmanually at any desired point in your test.\n\n public softFailToHard(): Void | Bubble {\n if (hasUnhandledFail) {\n _failedOnAssert = true;\n bail();\n }\n }\n\nProvide a bailing `Bubble` method here that enables backends to customize\nmessage delivery on failure.\n\n @connected(\u0022Test::bail\u0022)\n bail(): Bubble {\n bubble()\n }\n\nYou can check the current passing state of the test at any time. A test is\ncurrently passing if all soft checks and hard asserts have been succesful.\n\nTODO Does this need to be function call syntax for macro purposes?\n\n @connected(\u0022Test::passing\u0022)\n public get passing(): Boolean { _passing }\n\nMessages access is presented as a function because it likely allocates. Also,\nmessages might be automatically constructed in some cases, so it's possibly\nunwise to depend on their exact formatting.\n\n @connected(\u0022Test::messages\u0022)\n public messages(): List\u003cString\u003e { _messages.toList() }\n\n### Backend helper methods\n\nAvoid using backend helper methods in user code. Their behavior might be\nunreliable on some backends and/or have high risk of changing in future releases\nof Temper.\n\n @connected(\u0022Test::failedOnAssert\u0022)\n public get failedOnAssert(): Boolean { _failedOnAssert }\n\nAdditional helper methods to simplify backend code generation in some contexts.\n\n public get hasUnhandledFail(): Boolean { !(_failedOnAssert || _passing) }\n\nSimple helper to get multiple messages combined for now. We probably want to do\nfancier things in the future, but this can simplify backends for now.\n\n public messagesCombined(): String | Null {\n if (_messages.isEmpty) {\n // Unexpected, but most backends can do something with null.\n null\n } else {\n _messages.join(\u0022, \u0022) { (it);; it }\n }\n }\n\n private var _failedOnAssert: Boolean = false;\n private var _passing: Boolean = true;\n private _messages: ListBuilder\u003cString\u003e = new ListBuilder\u003cString\u003e();\n }\n\n## Interpreter testing support\n\nNOTICE: Don't directly anything in this section. It just exists for the\nimplementation of testing within the interpreter.\n\n export let TestCase = Pair\u003cTestName, TestFun\u003e;\n export let TestFailureMessage = String;\n export let TestFun = fn (Test): Void | Bubble;\n export let TestName = String;\n export let TestResult = Pair\u003cTestName, List\u003cTestFailureMessage\u003e\u003e;\n\n @connected(\u0022::processTestCases\u0022)\n export let processTestCases(testCases: List\u003cTestCase\u003e): List\u003cTestResult\u003e {\n testCases.map { (testCase): TestResult;;\n let { key, value as fun } = testCase;\n let test = new Test();\n // Actually call the test.\n let hadBubble = do {\n fun(test);\n false\n } orelse true;\n // Now get the messages.\n let messages = test.messages();\n let failures: List\u003cTestFailureMessage\u003e = if (test.passing) {\n []\n } else if (hadBubble \u0026\u0026 !test.failedOnAssert) {\n // Despite having 1+ failure messages, we seem to have failed on some\n // Bubble separate from asserts, so add that on.\n let allMessages = messages.toListBuilder();\n allMessages.add(\u0022Bubble\u0022);\n allMessages.toList()\n } else {\n messages\n };\n // Package up with test name.\n new Pair(key, failures)\n }\n }\n\n @connected(\u0022::reportTestResults\u0022)\n export let reportTestResults(testResults: List\u003cTestResult\u003e): Void {\n // TODO Write as junit xml (or tap if we switch to that).\n for (var i = 0; i \u003c testResults.length; i += 1) {\n let testResult = testResults[i];\n let failureMessages = testResult.value;\n if (failureMessages.isEmpty) {\n console.log(\u0022\u0024{testResult.key}: Passed\u0022);\n } else {\n let message = failureMessages.join(\u0022, \u0022) { (it);; it };\n console.log(\u0022\u0024{testResult.key}: Failed \u0024{message}\u0022);\n }\n }\n }\n\n @connected(\u0022::runTestCases\u0022)\n export let runTestCases(testCases: List\u003cTestCase\u003e): Void {\n reportTestResults(processTestCases(testCases));\n }\n\nTODO Is this a better idea than inlining each case? We'd need to generate\n`fun testFunction() { runTest(originalFunctionAsCallback) }` or some such.\n\n export let runTest(testFun: TestFun): Void | Bubble {\n let test = new Test();\n testFun(test);\n test.softFailToHard();\n }\n" ], "names": [ "Test", "success", "message", "_passing", "_messages", "_failedOnAssert", "return", "fn", "it", "TestName", "TestFun", "TestCase", "TestFailureMessage", "TestResult", "processTestCases", "testCases", "testCase", "key", "fun", "test", "hadBubble", "messages", "failures", "allMessages", "reportTestResults", "testResults", "i", "testResult", "failureMessages", "runTestCases", "runTest", "testFun" ], "mappings": "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" }
1
+ { "version": 3, "file": "js/std/testing.js", "sources": [ "std/testing/testing.temper.md" ], "sourcesContent": [ "# Temper test framework\n\n## Test instance\n\nWe currently convert assert and check macro calls into method calls on a `Test`\ninstance.\n\n export class Test {\n\nRecommended default Temper assert is soft, meaning that it records failures for\nreporting but doesn't immediately end test execution on a false value. This lets\nyou check multiple conditions more easily.\n\n @connected(\u0022Test::assert\u0022)\n public assert(success: Boolean, message: fn (): String): Void {\n if (!success) {\n _passing = false;\n _messages.add(message());\n }\n }\n\nTypical hard asserts that end the test on false condition also are available.\n\n @connected(\u0022Test::assertHard\u0022)\n public assertHard(\n success: Boolean,\n message: fn (): String,\n ): Void | Bubble {\n assert(success, message);\n if (!success) {\n // Attempt to distinguish assert fails from others.\n // Sadly, they can still orelse an assert failure, so this isn't\n // flawless.\n _failedOnAssert = true;\n bail();\n }\n }\n\nHarden and end current test on any pending failure if not previously hardened.\nBackends typically insert calls to this if needed, but you can also call it\nmanually at any desired point in your test.\n\n public softFailToHard(): Void | Bubble {\n if (hasUnhandledFail) {\n _failedOnAssert = true;\n bail();\n }\n }\n\nProvide a bailing `Bubble` method here that enables backends to customize\nmessage delivery on failure.\n\n @connected(\u0022Test::bail\u0022)\n private bail(): Bubble {\n bubble()\n }\n\nYou can check the current passing state of the test at any time. A test is\ncurrently passing if all soft checks and hard asserts have been succesful.\n\nTODO Does this need to be function call syntax for macro purposes?\n\n @connected(\u0022Test::passing\u0022)\n public get passing(): Boolean { _passing }\n\nMessages access is presented as a function because it likely allocates. Also,\nmessages might be automatically constructed in some cases, so it's possibly\nunwise to depend on their exact formatting.\n\n @connected(\u0022Test::messages\u0022)\n public messages(): List\u003cString\u003e { _messages.toList() }\n\n### Backend helper methods\n\nAvoid using backend helper methods in user code. Their behavior might be\nunreliable on some backends and/or have high risk of changing in future releases\nof Temper.\n\n @connected(\u0022Test::failedOnAssert\u0022)\n public get failedOnAssert(): Boolean { _failedOnAssert }\n\nAdditional helper methods to simplify backend code generation in some contexts.\n\n public get hasUnhandledFail(): Boolean { !(_failedOnAssert || _passing) }\n\nSimple helper to get multiple messages combined for now. We probably want to do\nfancier things in the future, but this can simplify backends for now.\n\n public messagesCombined(): String? {\n if (_messages.isEmpty) {\n // Unexpected, but most backends can do something with null.\n null\n } else {\n _messages.join(\u0022, \u0022) { (it);; it }\n }\n }\n\n private var _failedOnAssert: Boolean = false;\n private var _passing: Boolean = true;\n private _messages: ListBuilder\u003cString\u003e = new ListBuilder\u003cString\u003e();\n }\n\n## Interpreter testing support\n\nNOTICE: Don't directly use anything in this section. It just exists for the\nimplementation of testing within the interpreter.\n\n export let TestCase = Pair\u003cTestName, TestFun\u003e;\n export let TestFailureMessage = String;\n export let TestFun = fn (Test): Void | Bubble;\n export let TestName = String;\n export let TestResult = Pair\u003cTestName, List\u003cTestFailureMessage\u003e\u003e;\n\n @connected(\u0022::processTestCases\u0022)\n export let processTestCases(testCases: List\u003cTestCase\u003e): List\u003cTestResult\u003e {\n testCases.map { (testCase): TestResult;;\n let { key, value as fun } = testCase;\n let test = new Test();\n // Actually call the test.\n var hadBubble = false;\n fun(test) orelse do { hadBubble = true };\n // Now get the messages.\n let messages = test.messages();\n let failures: List\u003cTestFailureMessage\u003e = if (test.passing \u0026\u0026 !hadBubble) {\n []\n } else if (hadBubble \u0026\u0026 !test.failedOnAssert) {\n // Despite having 1+ failure messages, we seem to have failed on some\n // Bubble separate from asserts, so add that on.\n let allMessages = messages.toListBuilder();\n allMessages.add(\u0022Bubble\u0022);\n allMessages.toList()\n } else {\n messages\n };\n // Package up with test name.\n new Pair(key, failures)\n }\n }\n\n @connected(\u0022::reportTestResults\u0022)\n export let reportTestResults(\n testResults: List\u003cTestResult\u003e,\n writeLine: fn (String): Void,\n ): Void {\n // Write as junit xml for consistency with our other backends.\n // TODO Inject some call to gather this info in structured form?\n writeLine(\u0022\u003ctestsuites\u003e\u0022);\n let total = testResults.length.toString();\n let fails = testResults.reduceFrom(0) { (fails: Int, testResult): Int;;\n fails + (if (testResult.value.isEmpty) { 0 } else { 1 })\n }.toString();\n let totals = \u0022tests='\u0024{total}' failures='\u0024{fails}'\u0022;\n // Just lie about time for now since it's required.\n writeLine(\u0022 \u003ctestsuite name='suite' \u0024{totals} time='0.0'\u003e\u0022);\n let escape(s: String): String { s.split(\u0022'\u0022).join(\u0022\u0026apos;\u0022) { (x);; x } }\n for (var i = 0; i \u003c testResults.length; i += 1) {\n let testResult = testResults[i];\n let failureMessages = testResult.value;\n let name = escape(testResult.key);\n let basics = \u0022name='\u0024{name}' classname='\u0024{name}' time='0.0'\u0022;\n if (failureMessages.isEmpty) {\n writeLine(\u0022 \u003ctestcase \u0024{basics} /\u003e\u0022);\n } else {\n writeLine(\u0022 \u003ctestcase \u0024{basics}\u003e\u0022);\n let message = escape(failureMessages.join(\u0022, \u0022) { (it);; it });\n writeLine(\u0022 \u003cfailure message='\u0024{message}' /\u003e\u0022)\n writeLine(\u0022 \u003c/testcase\u003e\u0022);\n }\n }\n writeLine(\u0022 \u003c/testsuite\u003e\u0022);\n writeLine(\u0022\u003c/testsuites\u003e\u0022);\n }\n\n @connected(\u0022::runTestCases\u0022)\n export let runTestCases(testCases: List\u003cTestCase\u003e): String {\n let report = new StringBuilder();\n reportTestResults(processTestCases(testCases)) { (line);;\n report.append(line);\n report.append(\u0022\\n\u0022);\n }\n report.toString()\n }\n\nTODO Is this a better idea than inlining each case? We'd need to generate\n`fn testFunction() { runTest(originalFunctionAsCallback) }` or some such.\n\n export let runTest(testFun: TestFun): Void | Bubble {\n let test = new Test();\n testFun(test) orelse test.assert(false) { \u0022bubble during test running\u0022 };\n test.softFailToHard();\n }\n" ], "names": [ "Test", "success", "message", "_passing", "_messages", "_failedOnAssert", "return", "fn", "it", "processTestCases", "testCases", "testCase", "key", "fun", "test", "hadBubble", "messages", "failures", "allMessages", "reportTestResults", "testResults", "writeLine", "total", "fails", "testResult", "totals", "escape", "s", "x", "i", "failureMessages", "name", "basics", "runTestCases", "report", "line", "runTest", "testFun" ], "mappings": "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" }