@temperlang/std 0.5.0 → 0.6.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/index.js +1 -1
- package/json.js +1477 -1373
- package/json.js.map +1 -1
- package/net.js +27 -27
- package/net.js.map +1 -1
- package/package.json +4 -4
- package/regex.js +695 -695
- package/regex.js.map +1 -1
- package/temporal.js +63 -63
- package/temporal.js.map +1 -1
- package/testing.js +129 -129
- package/testing.js.map +1 -1
package/testing.js
CHANGED
|
@@ -1,225 +1,225 @@
|
|
|
1
1
|
import {
|
|
2
|
-
strict as
|
|
2
|
+
strict as strict__11
|
|
3
3
|
} from "assert";
|
|
4
4
|
import {
|
|
5
|
-
type as
|
|
5
|
+
type as type__25, listBuilderAdd as listBuilderAdd_5, listBuilderToList as listBuilderToList_15, listedJoin as listedJoin_23, pairConstructor as pairConstructor_40, listedMap as listedMap_41, listedReduceFrom as listedReduceFrom_52, stringSplit as stringSplit_57, listedGet as listedGet_62
|
|
6
6
|
} from "@temperlang/core";
|
|
7
|
-
export class Test extends
|
|
7
|
+
export class Test extends type__25() {
|
|
8
8
|
/**
|
|
9
|
-
* @param {boolean}
|
|
10
|
-
* @param {() => string}
|
|
9
|
+
* @param {boolean} success_1
|
|
10
|
+
* @param {() => string} message_2
|
|
11
11
|
*/
|
|
12
|
-
assert(
|
|
13
|
-
let
|
|
14
|
-
if (!
|
|
15
|
-
this.#
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
assert(success_1, message_2) {
|
|
13
|
+
let t_3;
|
|
14
|
+
if (! success_1) {
|
|
15
|
+
this.#_passing_4 = false;
|
|
16
|
+
t_3 = message_2();
|
|
17
|
+
listBuilderAdd_5(this.#_messages_6, t_3);
|
|
18
18
|
}
|
|
19
19
|
return;
|
|
20
20
|
}
|
|
21
21
|
/**
|
|
22
|
-
* @param {boolean}
|
|
23
|
-
* @param {() => string}
|
|
22
|
+
* @param {boolean} success_8
|
|
23
|
+
* @param {() => string} message_9
|
|
24
24
|
* @returns {void}
|
|
25
25
|
*/
|
|
26
|
-
assertHard(
|
|
27
|
-
this.assert(
|
|
28
|
-
if (!
|
|
29
|
-
this.#
|
|
30
|
-
|
|
26
|
+
assertHard(success_8, message_9) {
|
|
27
|
+
this.assert(success_8, message_9);
|
|
28
|
+
if (! success_8) {
|
|
29
|
+
this.#_failedOnAssert_10 = true;
|
|
30
|
+
strict__11.fail(this.messagesCombined());
|
|
31
31
|
}
|
|
32
32
|
return;
|
|
33
33
|
}
|
|
34
34
|
/** @returns {void} */
|
|
35
35
|
softFailToHard() {
|
|
36
36
|
if (this.hasUnhandledFail) {
|
|
37
|
-
this.#
|
|
38
|
-
|
|
37
|
+
this.#_failedOnAssert_10 = true;
|
|
38
|
+
strict__11.fail(this.messagesCombined());
|
|
39
39
|
}
|
|
40
40
|
return;
|
|
41
41
|
}
|
|
42
42
|
/** @returns {boolean} */
|
|
43
43
|
get passing() {
|
|
44
|
-
return this.#
|
|
44
|
+
return this.#_passing_4;
|
|
45
45
|
}
|
|
46
46
|
/** @returns {Array<string>} */
|
|
47
47
|
messages() {
|
|
48
|
-
return
|
|
48
|
+
return listBuilderToList_15(this.#_messages_6);
|
|
49
49
|
}
|
|
50
50
|
/** @returns {boolean} */
|
|
51
51
|
get failedOnAssert() {
|
|
52
|
-
return this.#
|
|
52
|
+
return this.#_failedOnAssert_10;
|
|
53
53
|
}
|
|
54
54
|
/** @returns {boolean} */
|
|
55
55
|
get hasUnhandledFail() {
|
|
56
|
-
let
|
|
57
|
-
if (this.#
|
|
58
|
-
|
|
56
|
+
let t_18;
|
|
57
|
+
if (this.#_failedOnAssert_10) {
|
|
58
|
+
t_18 = true;
|
|
59
59
|
} else {
|
|
60
|
-
|
|
60
|
+
t_18 = this.#_passing_4;
|
|
61
61
|
}
|
|
62
|
-
return !
|
|
62
|
+
return ! t_18;
|
|
63
63
|
}
|
|
64
64
|
/** @returns {string | null} */
|
|
65
65
|
messagesCombined() {
|
|
66
|
-
let
|
|
67
|
-
if (! this.#
|
|
68
|
-
|
|
66
|
+
let return_20;
|
|
67
|
+
if (! this.#_messages_6.length) {
|
|
68
|
+
return_20 = null;
|
|
69
69
|
} else {
|
|
70
|
-
function
|
|
71
|
-
return
|
|
70
|
+
function fn_21(it_22) {
|
|
71
|
+
return it_22;
|
|
72
72
|
}
|
|
73
|
-
|
|
73
|
+
return_20 = listedJoin_23(this.#_messages_6, ", ", fn_21);
|
|
74
74
|
}
|
|
75
|
-
return
|
|
75
|
+
return return_20;
|
|
76
76
|
}
|
|
77
77
|
/** @type {boolean} */
|
|
78
|
-
#
|
|
78
|
+
#_failedOnAssert_10;
|
|
79
79
|
/** @type {boolean} */
|
|
80
|
-
#
|
|
80
|
+
#_passing_4;
|
|
81
81
|
/** @type {Array<string>} */
|
|
82
|
-
#
|
|
82
|
+
#_messages_6;
|
|
83
83
|
constructor() {
|
|
84
84
|
super ();
|
|
85
|
-
this.#
|
|
86
|
-
this.#
|
|
87
|
-
let
|
|
88
|
-
this.#
|
|
85
|
+
this.#_failedOnAssert_10 = false;
|
|
86
|
+
this.#_passing_4 = true;
|
|
87
|
+
let t_24 = [];
|
|
88
|
+
this.#_messages_6 = t_24;
|
|
89
89
|
return;
|
|
90
90
|
}
|
|
91
91
|
};
|
|
92
92
|
/**
|
|
93
|
-
* @param {Array<
|
|
94
|
-
* @returns {Array<
|
|
93
|
+
* @param {Array<Pair_42<string, (arg0: Test) => void>>} testCases_26
|
|
94
|
+
* @returns {Array<Pair_42<string, Array<string>>>}
|
|
95
95
|
*/
|
|
96
|
-
export function processTestCases(
|
|
97
|
-
function
|
|
98
|
-
let
|
|
99
|
-
let
|
|
100
|
-
let
|
|
101
|
-
let
|
|
102
|
-
const
|
|
103
|
-
const
|
|
104
|
-
const
|
|
105
|
-
let
|
|
96
|
+
export function processTestCases(testCases_26) {
|
|
97
|
+
function fn_27(testCase_28) {
|
|
98
|
+
let t_29;
|
|
99
|
+
let t_30;
|
|
100
|
+
let t_31;
|
|
101
|
+
let t_32;
|
|
102
|
+
const key_33 = testCase_28.key;
|
|
103
|
+
const fun_34 = testCase_28.value;
|
|
104
|
+
const test_35 = new Test();
|
|
105
|
+
let hadBubble_36 = false;
|
|
106
106
|
try {
|
|
107
|
-
|
|
107
|
+
fun_34(test_35);
|
|
108
108
|
} catch {
|
|
109
|
-
|
|
109
|
+
hadBubble_36 = true;
|
|
110
110
|
}
|
|
111
|
-
const
|
|
112
|
-
let
|
|
113
|
-
if (
|
|
114
|
-
|
|
111
|
+
const messages_37 = test_35.messages();
|
|
112
|
+
let failures_38;
|
|
113
|
+
if (test_35.passing) {
|
|
114
|
+
t_31 = ! hadBubble_36;
|
|
115
115
|
} else {
|
|
116
|
-
|
|
116
|
+
t_31 = false;
|
|
117
117
|
}
|
|
118
|
-
if (
|
|
119
|
-
|
|
118
|
+
if (t_31) {
|
|
119
|
+
failures_38 = Object.freeze([]);
|
|
120
120
|
} else {
|
|
121
|
-
if (
|
|
122
|
-
|
|
123
|
-
|
|
121
|
+
if (hadBubble_36) {
|
|
122
|
+
t_29 = test_35.failedOnAssert;
|
|
123
|
+
t_32 = ! t_29;
|
|
124
124
|
} else {
|
|
125
|
-
|
|
125
|
+
t_32 = false;
|
|
126
126
|
}
|
|
127
|
-
if (
|
|
128
|
-
const
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
127
|
+
if (t_32) {
|
|
128
|
+
const allMessages_39 = messages_37.slice();
|
|
129
|
+
listBuilderAdd_5(allMessages_39, "Bubble");
|
|
130
|
+
t_30 = listBuilderToList_15(allMessages_39);
|
|
131
|
+
failures_38 = t_30;
|
|
132
132
|
} else {
|
|
133
|
-
|
|
133
|
+
failures_38 = messages_37;
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
|
-
return
|
|
136
|
+
return pairConstructor_40(key_33, failures_38);
|
|
137
137
|
}
|
|
138
|
-
return
|
|
138
|
+
return listedMap_41(testCases_26, fn_27);
|
|
139
139
|
};
|
|
140
140
|
/**
|
|
141
|
-
* @param {Array<
|
|
142
|
-
* @param {(arg0: string) => void}
|
|
141
|
+
* @param {Array<Pair_42<string, Array<string>>>} testResults_43
|
|
142
|
+
* @param {(arg0: string) => void} writeLine_44
|
|
143
143
|
*/
|
|
144
|
-
export function reportTestResults(
|
|
145
|
-
let
|
|
146
|
-
|
|
147
|
-
const
|
|
148
|
-
function
|
|
149
|
-
let
|
|
150
|
-
if (!
|
|
151
|
-
|
|
144
|
+
export function reportTestResults(testResults_43, writeLine_44) {
|
|
145
|
+
let t_45;
|
|
146
|
+
writeLine_44("\u003ctestsuites\u003e");
|
|
147
|
+
const total_46 = testResults_43.length.toString();
|
|
148
|
+
function fn_47(fails_48, testResult_49) {
|
|
149
|
+
let t_50;
|
|
150
|
+
if (! testResult_49.value.length) {
|
|
151
|
+
t_50 = 0;
|
|
152
152
|
} else {
|
|
153
|
-
|
|
153
|
+
t_50 = 1;
|
|
154
154
|
}
|
|
155
|
-
return
|
|
155
|
+
return fails_48 + t_50 | 0;
|
|
156
156
|
}
|
|
157
|
-
const
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
function
|
|
161
|
-
let
|
|
162
|
-
function
|
|
163
|
-
return
|
|
157
|
+
const fails_51 = listedReduceFrom_52(testResults_43, 0, fn_47).toString();
|
|
158
|
+
const totals_53 = "tests='" + total_46 + "' failures='" + fails_51 + "'";
|
|
159
|
+
writeLine_44(" \u003ctestsuite name='suite' " + totals_53 + " time='0.0'\u003e");
|
|
160
|
+
function escape_54(s_55) {
|
|
161
|
+
let t_56 = stringSplit_57(s_55, "'");
|
|
162
|
+
function fn_58(x_59) {
|
|
163
|
+
return x_59;
|
|
164
164
|
}
|
|
165
|
-
return
|
|
165
|
+
return listedJoin_23(t_56, "\u0026apos;", fn_58);
|
|
166
166
|
}
|
|
167
|
-
let
|
|
167
|
+
let i_60 = 0;
|
|
168
168
|
while (true) {
|
|
169
|
-
|
|
170
|
-
if (!(
|
|
169
|
+
t_45 = testResults_43.length;
|
|
170
|
+
if (!(i_60 < t_45)) {
|
|
171
171
|
break;
|
|
172
172
|
}
|
|
173
|
-
const
|
|
174
|
-
const
|
|
175
|
-
const
|
|
176
|
-
const
|
|
177
|
-
if (!
|
|
178
|
-
|
|
173
|
+
const testResult_61 = listedGet_62(testResults_43, i_60);
|
|
174
|
+
const failureMessages_63 = testResult_61.value;
|
|
175
|
+
const name_64 = escape_54(testResult_61.key);
|
|
176
|
+
const basics_65 = "name='" + name_64 + "' classname='" + name_64 + "' time='0.0'";
|
|
177
|
+
if (! failureMessages_63.length) {
|
|
178
|
+
writeLine_44(" \u003ctestcase " + basics_65 + " /\u003e");
|
|
179
179
|
} else {
|
|
180
|
-
|
|
181
|
-
function
|
|
182
|
-
return
|
|
180
|
+
writeLine_44(" \u003ctestcase " + basics_65 + "\u003e");
|
|
181
|
+
function fn_66(it_67) {
|
|
182
|
+
return it_67;
|
|
183
183
|
}
|
|
184
|
-
const
|
|
185
|
-
|
|
186
|
-
|
|
184
|
+
const message_68 = escape_54(listedJoin_23(failureMessages_63, ", ", fn_66));
|
|
185
|
+
writeLine_44(" \u003cfailure message='" + message_68 + "' /\u003e");
|
|
186
|
+
writeLine_44(" \u003c/testcase\u003e");
|
|
187
187
|
}
|
|
188
|
-
|
|
188
|
+
i_60 = i_60 + 1 | 0;
|
|
189
189
|
}
|
|
190
|
-
|
|
191
|
-
|
|
190
|
+
writeLine_44(" \u003c/testsuite\u003e");
|
|
191
|
+
writeLine_44("\u003c/testsuites\u003e");
|
|
192
192
|
return;
|
|
193
193
|
};
|
|
194
194
|
/**
|
|
195
|
-
* @param {Array<
|
|
195
|
+
* @param {Array<Pair_42<string, (arg0: Test) => void>>} testCases_69
|
|
196
196
|
* @returns {string}
|
|
197
197
|
*/
|
|
198
|
-
export function runTestCases(
|
|
199
|
-
const
|
|
200
|
-
let
|
|
201
|
-
function
|
|
202
|
-
|
|
203
|
-
|
|
198
|
+
export function runTestCases(testCases_69) {
|
|
199
|
+
const report_70 = [""];
|
|
200
|
+
let t_71 = processTestCases(testCases_69);
|
|
201
|
+
function fn_72(line_73) {
|
|
202
|
+
report_70[0] += line_73;
|
|
203
|
+
report_70[0] += "\n";
|
|
204
204
|
return;
|
|
205
205
|
}
|
|
206
|
-
reportTestResults(
|
|
207
|
-
return
|
|
206
|
+
reportTestResults(t_71, fn_72);
|
|
207
|
+
return report_70[0];
|
|
208
208
|
};
|
|
209
209
|
/**
|
|
210
|
-
* @param {(arg0: Test) => void}
|
|
210
|
+
* @param {(arg0: Test) => void} testFun_74
|
|
211
211
|
* @returns {void}
|
|
212
212
|
*/
|
|
213
|
-
export function runTest(
|
|
214
|
-
const
|
|
213
|
+
export function runTest(testFun_74) {
|
|
214
|
+
const test_75 = new Test();
|
|
215
215
|
try {
|
|
216
|
-
|
|
216
|
+
testFun_74(test_75);
|
|
217
217
|
} catch {
|
|
218
|
-
function
|
|
218
|
+
function fn_76() {
|
|
219
219
|
return "bubble during test running";
|
|
220
220
|
}
|
|
221
|
-
|
|
221
|
+
test_75.assert(false, fn_76);
|
|
222
222
|
}
|
|
223
|
-
|
|
223
|
+
test_75.softFailToHard();
|
|
224
224
|
return;
|
|
225
225
|
};
|
package/testing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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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" }
|
|
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 throws 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 throws 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(): Never\u003cVoid\u003e throws 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 successful.\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 =\u003e 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 throws 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 =\u003e\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 =\u003e\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 =\u003e 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 =\u003e 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 =\u003e\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 throws 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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" }
|