gdharness 1.3.59 → 1.3.61
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/README.md +20 -20
- package/build/cli.js +2264 -1706
- package/build/godot/addons/auto_reload/auto_reload.gd +3 -3
- package/build/godot/addons/gdharness_editor/bridge_client.gd +4 -4
- package/build/godot/addons/gdharness_editor/declared_values.gd +13 -13
- package/build/godot/addons/gdharness_editor/file_reads.gd +6 -6
- package/build/godot/addons/gdharness_editor/headless_check.gd +9 -6
- package/build/godot/addons/gdharness_editor/property_paths.gd +3 -3
- package/build/godot/addons/gdharness_editor/property_values.gd +18 -11
- package/build/godot/addons/gdharness_editor/reading.gd +22 -18
- package/build/godot/addons/gdharness_editor/scene_file.gd +5 -5
- package/build/godot/addons/gdharness_editor/serialisation.gd +4 -4
- package/build/godot/addons/gdharness_editor/tools/animation_states.gd +5 -5
- package/build/godot/addons/gdharness_editor/tools/animation_tools.gd +6 -6
- package/build/godot/addons/gdharness_editor/tools/animation_tracks.gd +9 -9
- package/build/godot/addons/gdharness_editor/tools/class_tools.gd +3 -3
- package/build/godot/addons/gdharness_editor/tools/filesystem_tools.gd +5 -5
- package/build/godot/addons/gdharness_editor/tools/navigation_bake.gd +5 -5
- package/build/godot/addons/gdharness_editor/tools/play_tools.gd +2 -2
- package/build/godot/addons/gdharness_editor/tools/profile_tools.gd +1 -1
- package/build/godot/addons/gdharness_editor/tools/resource_tools.gd +5 -5
- package/build/godot/addons/gdharness_editor/tools/scene_groups.gd +3 -3
- package/build/godot/addons/gdharness_editor/tools/scene_kin.gd +3 -3
- package/build/godot/addons/gdharness_editor/tools/scene_paths.gd +4 -4
- package/build/godot/addons/gdharness_editor/tools/scene_placing.gd +3 -3
- package/build/godot/addons/gdharness_editor/tools/scene_tools.gd +10 -10
- package/build/godot/addons/gdharness_editor/tools/signal_tools.gd +1 -1
- package/build/godot/addons/gdharness_editor/tools/tileset_tools.gd +5 -5
- package/build/godot/addons/gdharness_runtime/declared_values.gd +13 -13
- package/build/godot/addons/gdharness_runtime/reading.gd +22 -18
- package/build/godot/addons/gdharness_runtime/runtime_accessibility.gd +2 -2
- package/build/godot/addons/gdharness_runtime/runtime_autoload.gd +89 -18
- package/build/godot/addons/gdharness_runtime/runtime_capture.gd +6 -6
- package/build/godot/addons/gdharness_runtime/runtime_changes.gd +10 -10
- package/build/godot/addons/gdharness_runtime/runtime_frames.gd +5 -4
- package/build/godot/addons/gdharness_runtime/runtime_hover.gd +3 -4
- package/build/godot/addons/gdharness_runtime/runtime_input.gd +8 -8
- package/build/godot/addons/gdharness_runtime/runtime_items.gd +1 -1
- package/build/godot/addons/gdharness_runtime/runtime_menus.gd +3 -3
- package/build/godot/addons/gdharness_runtime/runtime_mouse.gd +5 -5
- package/build/godot/addons/gdharness_runtime/runtime_paths.gd +20 -20
- package/build/godot/addons/gdharness_runtime/runtime_queries.gd +13 -13
- package/build/godot/addons/gdharness_runtime/runtime_says.gd +5 -5
- package/build/godot/addons/gdharness_runtime/runtime_targets.gd +39 -39
- package/build/godot/addons/gdharness_runtime/runtime_typing.gd +3 -3
- package/build/godot/addons/gdharness_runtime/runtime_values.gd +7 -7
- package/build/godot/addons/gdharness_runtime/runtime_waits.gd +8 -8
- package/build/godot/addons/gdharness_runtime/runtime_words.gd +5 -5
- package/build/godot/addons/gdharness_runtime/serialisation.gd +4 -4
- package/build/godot/addons/gdharness_tests/bench.gd +1 -1
- package/build/godot/addons/gdharness_tests/share.gd +6 -6
- package/build/godot/addons/gdharness_tests/suites.gd +1 -1
- package/build/godot/operations/audio_buses.gd +4 -4
- package/build/godot/operations/class_cache.gd +3 -3
- package/build/godot/operations/classdb_queries.gd +1 -1
- package/build/godot/operations/declared_values.gd +13 -13
- package/build/godot/operations/dependencies.gd +6 -6
- package/build/godot/operations/export_presets.gd +7 -7
- package/build/godot/operations/file_reads.gd +6 -6
- package/build/godot/operations/gdscript_analysis.gd +6 -6
- package/build/godot/operations/gdscript_authoring.gd +11 -11
- package/build/godot/operations/godot_operations.gd +1 -1
- package/build/godot/operations/import_pipeline.gd +12 -12
- package/build/godot/operations/input_actions.gd +3 -3
- package/build/godot/operations/logger.gd +1 -1
- package/build/godot/operations/plugins.gd +2 -2
- package/build/godot/operations/project_config.gd +11 -11
- package/build/godot/operations/project_validation.gd +1 -1
- package/build/godot/operations/property_paths.gd +3 -3
- package/build/godot/operations/property_values.gd +18 -11
- package/build/godot/operations/reading.gd +22 -18
- package/build/godot/operations/resource_files.gd +1 -1
- package/build/godot/operations/script_check.gd +2 -2
- package/build/godot/operations/serialisation.gd +4 -4
- package/build/godot/tests/listed.gd +28 -10
- package/build/keeper.js +511 -161
- package/package.json +1 -1
|
@@ -139,7 +139,7 @@ static func from_the_root(said: String, node_path: String, root_name: String) ->
|
|
|
139
139
|
|
|
140
140
|
## [param said], the refusal for a path a scene does not have, with where the path leaves it: the
|
|
141
141
|
## last node of the path it has, [param reached] from the root, called [param root_name], when that
|
|
142
|
-
## is empty
|
|
142
|
+
## is empty, the name below it that is missing, and [param children], the names that node has, as
|
|
143
143
|
## after a node was moved or renamed. Names up to [constant NAMED_CHILDREN] of them.
|
|
144
144
|
static func missing_below(
|
|
145
145
|
said: String,
|
|
@@ -152,17 +152,21 @@ static func missing_below(
|
|
|
152
152
|
if children.size() > NAMED_CHILDREN:
|
|
153
153
|
shown += " and %d more" % (children.size() - NAMED_CHILDREN)
|
|
154
154
|
return (
|
|
155
|
-
"%s
|
|
155
|
+
"%s %s has no %s. %s."
|
|
156
156
|
% [
|
|
157
|
-
said,
|
|
158
|
-
"" if said.ends_with(".") else ".",
|
|
157
|
+
ended(said),
|
|
159
158
|
"The root, %s," % root_name if reached.is_empty() else "/".join(reached),
|
|
160
159
|
missing,
|
|
161
|
-
"
|
|
160
|
+
"Its children are " + shown if not children.is_empty() else "It has no children",
|
|
162
161
|
]
|
|
163
162
|
)
|
|
164
163
|
|
|
165
164
|
|
|
165
|
+
## [param said] with a full stop at its end, so another sentence can follow it.
|
|
166
|
+
static func ended(said: String) -> String:
|
|
167
|
+
return said if said.ends_with(".") else said + "."
|
|
168
|
+
|
|
169
|
+
|
|
166
170
|
## [param said], the refusal for a [param kind] the scene does not have at [param node_path], with
|
|
167
171
|
## what is there when the scene has a node there, [param found] its class, and [param holders], the
|
|
168
172
|
## paths of the nodes in the scene that are one, so the caller has the path to pass. Names up to
|
|
@@ -180,7 +184,7 @@ static func not_of_kind(
|
|
|
180
184
|
return (
|
|
181
185
|
told
|
|
182
186
|
+ (
|
|
183
|
-
" The scene holds no %s
|
|
187
|
+
" The scene holds no %s. scene_node add with nodeType %s puts one in it."
|
|
184
188
|
% [kind, kind]
|
|
185
189
|
)
|
|
186
190
|
)
|
|
@@ -222,17 +226,17 @@ static func offered(said: String, word: String, names: Array) -> String:
|
|
|
222
226
|
var every: PackedStringArray = PackedStringArray(names)
|
|
223
227
|
var close: PackedStringArray = nearest(word, every)
|
|
224
228
|
if close.is_empty():
|
|
225
|
-
return "%s
|
|
229
|
+
return "%s It has %s" % [ended(said), ", ".join(every)]
|
|
226
230
|
return (
|
|
227
|
-
"%s
|
|
228
|
-
% [said, "is" if close.size() == 1 else "are", ", ".join(close)]
|
|
231
|
+
"%s The nearest it has %s %s"
|
|
232
|
+
% [ended(said), "is" if close.size() == 1 else "are", ", ".join(close)]
|
|
229
233
|
)
|
|
230
234
|
|
|
231
235
|
|
|
232
236
|
## [param said], the refusal for [param property], which [param target] does not declare, with the
|
|
233
237
|
## names it declares nearest it when any are, as a misspelt one is usually one of them, or else the
|
|
234
238
|
## variables its script declares. The engine's own are not listed when none is near, since an object
|
|
235
|
-
## has a hundred, while a script's are the few a caller most likely meant
|
|
239
|
+
## has a hundred, while a script's are the few a caller most likely meant. An object with no script
|
|
236
240
|
## is told where they are listed instead, since the refusal alone left nothing to try.
|
|
237
241
|
static func near_property(said: String, target: Object, property: String) -> String:
|
|
238
242
|
var headings: int = PROPERTY_USAGE_CATEGORY | PROPERTY_USAGE_GROUP | PROPERTY_USAGE_SUBGROUP
|
|
@@ -243,7 +247,7 @@ static func near_property(said: String, target: Object, property: String) -> Str
|
|
|
243
247
|
if usage & PROPERTY_USAGE_ARRAY:
|
|
244
248
|
var listed: String = _list_called(target, declared, property)
|
|
245
249
|
if not listed.is_empty():
|
|
246
|
-
return "%s
|
|
250
|
+
return "%s %s" % [ended(said), listed]
|
|
247
251
|
if not usage & headings:
|
|
248
252
|
names.append(str(declared.get("name", "")))
|
|
249
253
|
if usage & PROPERTY_USAGE_SCRIPT_VARIABLE and not usage & headings:
|
|
@@ -251,8 +255,8 @@ static func near_property(said: String, target: Object, property: String) -> Str
|
|
|
251
255
|
var close: PackedStringArray = nearest(property, PackedStringArray(names))
|
|
252
256
|
if not close.is_empty():
|
|
253
257
|
return (
|
|
254
|
-
"%s
|
|
255
|
-
% [said, "is" if close.size() == 1 else "are", ", ".join(close)]
|
|
258
|
+
"%s The nearest it has %s %s"
|
|
259
|
+
% [ended(said), "is" if close.size() == 1 else "are", ", ".join(close)]
|
|
256
260
|
)
|
|
257
261
|
# With a script that declares nothing readable, as one that does not compile, the name is
|
|
258
262
|
# likelier the script's than the class's, so the class's list would point the wrong way.
|
|
@@ -261,17 +265,17 @@ static func near_property(said: String, target: Object, property: String) -> Str
|
|
|
261
265
|
if scripted.is_empty():
|
|
262
266
|
return (
|
|
263
267
|
(
|
|
264
|
-
"%s
|
|
268
|
+
"%s editor_classes info with className %s and includeInherited true lists the "
|
|
265
269
|
+ "ones it has"
|
|
266
270
|
)
|
|
267
|
-
% [said, target.get_class()]
|
|
271
|
+
% [ended(said), target.get_class()]
|
|
268
272
|
)
|
|
269
273
|
scripted.sort()
|
|
270
|
-
return "%s
|
|
274
|
+
return "%s Its script declares %s" % [ended(said), ", ".join(PackedStringArray(scripted))]
|
|
271
275
|
|
|
272
276
|
|
|
273
277
|
## How [param target] keeps the list [param property] names, when that is the label of one of the
|
|
274
|
-
## engine's numbered lists, such as an OptionButton's Items
|
|
278
|
+
## engine's numbered lists, such as an OptionButton's Items. Empty when it is not. The engine has no
|
|
275
279
|
## property by that name, only a count and each entry's fields under a numbered prefix, so "items"
|
|
276
280
|
## was refused with nothing near it to offer.
|
|
277
281
|
static func _list_called(target: Object, count: Dictionary, property: String) -> String:
|
|
@@ -292,7 +296,7 @@ static func _list_called(target: Object, count: Dictionary, property: String) ->
|
|
|
292
296
|
)
|
|
293
297
|
return (
|
|
294
298
|
(
|
|
295
|
-
"
|
|
299
|
+
"It keeps its %s as %s, how many there are, and %s under %s for the first, %s for the "
|
|
296
300
|
+ "second and so on: give %s before the fields of the entries it makes"
|
|
297
301
|
)
|
|
298
302
|
% [parts[0].to_lower(), counted, each, first, parts[1] + "1/", counted]
|
|
@@ -77,7 +77,7 @@ func _why_none(file_path: String) -> String:
|
|
|
77
77
|
return "No .uid file beside it. refresh_uids writes one for every script and shader."
|
|
78
78
|
if kind in TEXT_RESOURCE_KINDS:
|
|
79
79
|
return (
|
|
80
|
-
"Its header carries no uid. The editor writes one when it saves the file
|
|
80
|
+
"Its header carries no uid. The editor writes one when it saves the file. refresh_uids "
|
|
81
81
|
+ "does not, and a headless save does not either."
|
|
82
82
|
)
|
|
83
83
|
if ResourceLoader.exists(file_path):
|
|
@@ -97,7 +97,7 @@ func check_scripts(params: Dictionary) -> Dictionary:
|
|
|
97
97
|
## Raises every warning the project sets to warn so that the engine reports it as an error, which is
|
|
98
98
|
## the one way it reports a warning outside an editor or a debugger. Not saved. The analyser reads
|
|
99
99
|
## the levels again only once the settings change has been flushed, at the next frame, so this is
|
|
100
|
-
## called in `_init` and the scripts are loaded after it
|
|
100
|
+
## called in `_init` and the scripts are loaded after it. The project's autoloads, compiled before
|
|
101
101
|
## that frame, compile under the project's own levels. A warning set to ignore stays ignored, and
|
|
102
102
|
## @warning_ignore and the directory rules hold as they do in the editor, since the analyser applies
|
|
103
103
|
## them itself.
|
|
@@ -116,7 +116,7 @@ static func raise_warnings() -> void:
|
|
|
116
116
|
## The warnings of each script in [code]paths[/code], under the levels [method raise_warnings] left:
|
|
117
117
|
## [code]scripts[/code] holds each that has any, with its warnings' lines and the engine's messages
|
|
118
118
|
## as raised. The analyser runs before anything is compiled, so a script whose dependency failed on
|
|
119
|
-
## a warning still reports its own, and loading on past a failure loses nothing
|
|
119
|
+
## a warning still reports its own, and loading on past a failure loses nothing. Only what is raised
|
|
120
120
|
## at the script's own path is its, since a dependency is read on its own entry as well.
|
|
121
121
|
func check_warnings(params: Dictionary) -> Dictionary:
|
|
122
122
|
var asked: Array = params.get("paths", [])
|
|
@@ -15,7 +15,7 @@ const GdhShapes = preload("value_shapes.gd")
|
|
|
15
15
|
const NUMBERS: Array[int] = [TYPE_BOOL, TYPE_INT, TYPE_FLOAT]
|
|
16
16
|
const TEXTS: Array[int] = [TYPE_STRING, TYPE_STRING_NAME, TYPE_NODE_PATH]
|
|
17
17
|
# 2^53. A JSON number is a double, and every whole number below this one in size has a double of
|
|
18
|
-
# its own
|
|
18
|
+
# its own. From here on two or more share each double, so one arriving tells nobody which was sent.
|
|
19
19
|
const EXACT: int = 9_007_199_254_740_992
|
|
20
20
|
# The types that cross as a plain JSON list and have to be built back into themselves. A list is
|
|
21
21
|
# what a caller can write by hand and what the serialiser answers with, and the parameter or
|
|
@@ -136,7 +136,7 @@ func serialize_value(value: Variant) -> Variant:
|
|
|
136
136
|
return value
|
|
137
137
|
var carried: Variant = call(serialiser, value)
|
|
138
138
|
# The fixed shapes carry their components as bare floats, so an infinite one in a Vector2 is
|
|
139
|
-
# tagged here, and a 32-bit one shortened
|
|
139
|
+
# tagged here, and a 32-bit one shortened. Containers reach their members through this already.
|
|
140
140
|
var type: int = typeof(value)
|
|
141
141
|
return (
|
|
142
142
|
carried
|
|
@@ -345,7 +345,7 @@ static func comparable(one: Variant, other: Variant) -> bool:
|
|
|
345
345
|
##
|
|
346
346
|
## A list of what is accepted rather than of what is refused, which is the way round that errs
|
|
347
347
|
## safely. The engine's own conversion table is not readable from GDScript, so either list is a
|
|
348
|
-
## guess at it
|
|
348
|
+
## guess at it. Guessing narrow costs a caller a refusal naming both types, and guessing wide costs
|
|
349
349
|
## them the damage above. A refusal is the cheaper mistake, and it is the one they can act on.
|
|
350
350
|
static func acceptable(value: Variant, type: int) -> bool:
|
|
351
351
|
if type == TYPE_NIL:
|
|
@@ -560,7 +560,7 @@ func _serialize_rid(value: RID) -> Dictionary:
|
|
|
560
560
|
|
|
561
561
|
# A whole number from 2^53 on as its digits, because JSON numbers are doubles on the server's side
|
|
562
562
|
# and on the engine's, and from there on neighbouring whole numbers share a double. A RefCounted's
|
|
563
|
-
# instance id is one, with its top bit set, and a resource uid another
|
|
563
|
+
# instance id is one, with its top bit set, and a resource uid another. Read as numbers they came
|
|
564
564
|
# back as a neighbouring id, which named nothing or something else.
|
|
565
565
|
func _serialize_int(value: int) -> Variant:
|
|
566
566
|
if value > -EXACT and value < EXACT:
|
|
@@ -37,7 +37,7 @@ const ORPHANS_LEFT: String = "gdharness orphans:"
|
|
|
37
37
|
const ORPHANS_NAMED: int = 8
|
|
38
38
|
## The flags turning off a report, with the gdUnit4 hook that writes it. A gate reads what a run
|
|
39
39
|
## prints, and each report finds every case it hears of in the session to write them all out as the
|
|
40
|
-
## run ends
|
|
40
|
+
## run ends, and project_test reads the JUnit one and turns off only the HTML one.
|
|
41
41
|
const REPORTS_OFF: Dictionary[String, String] = {
|
|
42
42
|
"--html-report-off": "res://addons/gdUnit4/src/core/hooks/GdUnitHtmlReporterTestSessionHook.gd",
|
|
43
43
|
"--junit-report-off": "res://addons/gdUnit4/src/core/hooks/GdUnitXMLReporterTestSessionHook.gd",
|
|
@@ -72,7 +72,7 @@ const TOOL: String = "GdUnitCmdTool.gd"
|
|
|
72
72
|
const GDUNIT: String = "--gdh-gdunit"
|
|
73
73
|
## How long a windowless engine sleeps after each frame. The engine's own default is the
|
|
74
74
|
## low-processor pause, 6.8 ms measured, which a run of suites awaiting frames spends thousands of
|
|
75
|
-
## times
|
|
75
|
+
## times. Zero makes a frame's delta round to nothing, and a tween then never moves.
|
|
76
76
|
const FRAME_SLEEP_USEC: int = 1000
|
|
77
77
|
## What the engine's shutdown prints as it clears the newest script and the oldest, on an engine
|
|
78
78
|
## whose walk [GdhShutdownWalk] guards. Kept in step with the server's engine-leaks.ts, which reads
|
|
@@ -159,7 +159,7 @@ static func started(given: PackedStringArray) -> GdhRunner:
|
|
|
159
159
|
(
|
|
160
160
|
(
|
|
161
161
|
"gdharness test: gdUnit4 %s registers no session hook %s, so the report it "
|
|
162
|
-
+ "writes is not turned off
|
|
162
|
+
+ "writes is not turned off. Report it to gdharness with the version."
|
|
163
163
|
)
|
|
164
164
|
% [GdUnit4Version.current(), path]
|
|
165
165
|
)
|
|
@@ -549,7 +549,25 @@ class GdhRunner:
|
|
|
549
549
|
return
|
|
550
550
|
if Engine.is_embedded_in_editor():
|
|
551
551
|
return
|
|
552
|
-
|
|
552
|
+
var mode: DisplayServer.WindowMode = DisplayServer.window_get_mode()
|
|
553
|
+
if mode == DisplayServer.WINDOW_MODE_MAXIMIZED and not DisplayServer.window_can_draw():
|
|
554
|
+
# On macOS Godot reads a window whose frame fills the usable screen as maximised before
|
|
555
|
+
# asking whether it is minimised, and changing the mode from that reading unzooms it, so
|
|
556
|
+
# a minimised window that size, as a small screen makes the default one, stayed
|
|
557
|
+
# minimised. A point off it reads as what it is, and goes back once restored. Godot
|
|
558
|
+
# divides pixels by the scale into whole points, so a pixel moves nothing on a scaled
|
|
559
|
+
# screen.
|
|
560
|
+
var at: Vector2i = DisplayServer.window_get_position()
|
|
561
|
+
DisplayServer.window_set_position(
|
|
562
|
+
at + Vector2i(ceili(DisplayServer.screen_get_max_scale()), 0)
|
|
563
|
+
)
|
|
564
|
+
mode = DisplayServer.window_get_mode()
|
|
565
|
+
if mode == DisplayServer.WINDOW_MODE_MINIMIZED:
|
|
566
|
+
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)
|
|
567
|
+
minimise_pending = false
|
|
568
|
+
DisplayServer.window_set_position(at)
|
|
569
|
+
return
|
|
570
|
+
if mode == DisplayServer.WINDOW_MODE_MINIMIZED:
|
|
553
571
|
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)
|
|
554
572
|
minimise_pending = false
|
|
555
573
|
|
|
@@ -606,7 +624,7 @@ class GdhRunner:
|
|
|
606
624
|
|
|
607
625
|
## [param args] with everything up to the script at [param own] given as gdUnit4's tool name.
|
|
608
626
|
## The path is compared with its separators and, on Windows, its case folded, since the engine
|
|
609
|
-
## reports the script as `
|
|
627
|
+
## reports the script as `D:/a/listed.gd` when it was started as `D:\a\listed.gd`.
|
|
610
628
|
static func options_of(args: PackedStringArray, own: String) -> PackedStringArray:
|
|
611
629
|
var wanted: String = spelt(own)
|
|
612
630
|
var at: int = -1
|
|
@@ -660,7 +678,7 @@ class GdhIndexedSession:
|
|
|
660
678
|
var found: GdUnitTestCase = _by_id.get(str(id), null)
|
|
661
679
|
return found
|
|
662
680
|
|
|
663
|
-
## [param made] as an indexed session of its cases, reporting where it does
|
|
681
|
+
## [param made] as an indexed session of its cases, reporting where it does. One already indexed
|
|
664
682
|
## as it is.
|
|
665
683
|
static func of(made: GdUnitTestSession) -> GdUnitTestSession:
|
|
666
684
|
if made is GdhIndexedSession:
|
|
@@ -706,7 +724,7 @@ class GdhSessionCheck:
|
|
|
706
724
|
"gdharness test: gdUnit4 %s handed its session hooks the session before "
|
|
707
725
|
+ "announcing it, so the runner's indexed session is not the one they "
|
|
708
726
|
+ "read. This gdUnit4 starts a session differently from the ones gdharness "
|
|
709
|
-
+ "knows
|
|
727
|
+
+ "knows. Report it to gdharness with the version."
|
|
710
728
|
)
|
|
711
729
|
% GdUnit4Version.current()
|
|
712
730
|
)
|
|
@@ -724,8 +742,8 @@ class GdhSessionCheck:
|
|
|
724
742
|
(
|
|
725
743
|
"gdharness test: gdUnit4 %s ran %d cases without looking one up in the "
|
|
726
744
|
+ "runner's indexed session, so its console reads another session. This "
|
|
727
|
-
+ "gdUnit4 starts a session differently from the ones gdharness knows
|
|
728
|
-
+ "
|
|
745
|
+
+ "gdUnit4 starts a session differently from the ones gdharness knows. "
|
|
746
|
+
+ "Report it to gdharness with the version."
|
|
729
747
|
)
|
|
730
748
|
% [GdUnit4Version.current(), _runner.cases_ended]
|
|
731
749
|
)
|
|
@@ -773,7 +791,7 @@ class GdhShutdownWalk:
|
|
|
773
791
|
|
|
774
792
|
## Every script loaded from a file under res://, and [param also], held until the theme database
|
|
775
793
|
## goes, which is after the walk and before the GDScript language does. Freed in the walk, a
|
|
776
|
-
## script can take the next one with it and end the walk
|
|
794
|
+
## script can take the next one with it and end the walk. Held, none is freed there, so the walk
|
|
777
795
|
## reaches every script and what the engine reports at exit is only what was leaked. A script a
|
|
778
796
|
## run leaks is held by what leaked it as well, and is still reported.
|
|
779
797
|
static func hold(also: Array[GDScript]) -> void:
|