diff --git a/coverage/amber.png b/coverage/amber.png deleted file mode 100644 index 2cab170..0000000 Binary files a/coverage/amber.png and /dev/null differ diff --git a/coverage/ansi.luau.html b/coverage/ansi.luau.html new file mode 100644 index 0000000..87c5c73 --- /dev/null +++ b/coverage/ansi.luau.html @@ -0,0 +1,65 @@ + + + + +

ansi.luau Coverage

+

Total Execution Hits: 1

+

Function Coverage Overview: 11.11%

+ +
+

Function Coverage:

+ + + + + + + + + +
FunctionHits
1
white_underline:20
white:60
green:100
red:140
yellow:180
red_highlight:220
green_highlight:260
gray:300
+

Source Code:

+ + + +> +> + + +> +> + + +> +> + + +> +> + + +> +> + + +> +> + + +> +> + + +> + +
LineHitsCode
11return {
21white_underline = function(s: any)
30return `\27[1;4m{s}\27[0m`
4N/Aend,
5N/A
61white = function(s: any)
70return `\27[37;1m{s}\27[0m`
8N/Aend,
9N/A
101green = function(s: any)
110return `\27[32;1m{s}\27[0m`
12N/Aend,
13N/A
141red = function(s: any)
150return `\27[31;1m{s}\27[0m`
16N/Aend,
17N/A
181yellow = function(s: any)
190return `\27[33;1m{s}\27[0m`
20N/Aend,
21N/A
221red_highlight = function(s: any)
230return `\27[41;1;30m{s}\27[0m`
24N/Aend,
25N/A
261green_highlight = function(s: any)
270return `\27[42;1;30m{s}\27[0m`
28N/Aend,
29N/A
301gray = function(s: any)
310return `\27[30;1m{s}\27[0m`
32N/Aend,
330}
\ No newline at end of file diff --git a/coverage/cmd_line b/coverage/cmd_line deleted file mode 100644 index 7919d74..0000000 --- a/coverage/cmd_line +++ /dev/null @@ -1 +0,0 @@ -genhtml coverage.out --output-directory=coverage --synthesize-missing --ignore-errors source diff --git a/coverage/emerald.png b/coverage/emerald.png deleted file mode 100644 index 38ad4f4..0000000 Binary files a/coverage/emerald.png and /dev/null differ diff --git a/coverage/entity_visualiser.luau.html b/coverage/entity_visualiser.luau.html new file mode 100644 index 0000000..b85e39c --- /dev/null +++ b/coverage/entity_visualiser.luau.html @@ -0,0 +1,70 @@ + + + + +

entity_visualiser.luau Coverage

+

Total Execution Hits: 1

+

Function Coverage Overview: 25.00%

+ +
+

Function Coverage:

+ + + + +
FunctionHits
1
pe:60
name:110
components:150
+

Source Code:

+ + + + +> + + + +> +> + + +> +> + + + + +> +> + + + + + + + + + + + +> + + +> + + +> +> + + + + +
LineHitsCode
11local jecs = require("@jecs")
21local ECS_GENERATION = jecs.ECS_GENERATION
31local ECS_ID = jecs.ECS_ID
41local ansi = require("@tools/ansi")
5N/A
61local function pe(e: any)
70local gen = ECS_GENERATION(e)
80return ansi.green(`e{ECS_ID(e)}`) .. ansi.yellow(`v{gen}`)
9N/Aend
10N/A
111local function name(world: jecs.World, id: any)
120return world:get(id, jecs.Name) or `${id}`
13N/Aend
14N/A
151local function components(world: jecs.World, entity: any)
160local r = jecs.entity_index_try_get(world.entity_index, entity)
170if not r then
180return false
19N/Aend
20N/A
210local archetype = r.archetype
220local row = r.row
230print(`Entity {pe(entity)}`)
240print("-----------------------------------------------------")
250for i, column in archetype.columns do
260local component = archetype.types[i]
270local n
280if jecs.IS_PAIR(component) then
290n = `({name(world, jecs.pair_first(world, component))}, {name(world, jecs.pair_second(world, component))})`
300else
310n = name(world, component)
32N/Aend
330local data = column[row] or "TAG"
340print(`| {n} | {data} |`)
35N/Aend
360print("-----------------------------------------------------")
370return true
38N/Aend
39N/A
401return {
411components = components,
421prettify = pe,
430}
\ No newline at end of file diff --git a/coverage/gcov.css b/coverage/gcov.css deleted file mode 100644 index f329042..0000000 --- a/coverage/gcov.css +++ /dev/null @@ -1,1073 +0,0 @@ -/* All views: initial background and text color */ -body -{ - color: #000000; - background-color: #ffffff; -} - -/* All views: standard link format*/ -a:link -{ - color: #284fa8; - text-decoration: underline; -} - -/* All views: standard link - visited format */ -a:visited -{ - color: #00cb40; - text-decoration: underline; -} - -/* All views: standard link - activated format */ -a:active -{ - color: #ff0040; - text-decoration: underline; -} - -/* All views: main title format */ -td.title -{ - text-align: center; - padding-bottom: 10px; - font-family: sans-serif; - font-size: 20pt; - font-style: italic; - font-weight: bold; -} -/* "Line coverage date bins" leader */ -td.subTableHeader -{ - text-align: center; - padding-bottom: 6px; - font-family: sans-serif; - font-weight: bold; - vertical-align: center; -} - -/* All views: header item format */ -td.headerItem -{ - text-align: right; - padding-right: 6px; - font-family: sans-serif; - font-weight: bold; - vertical-align: top; - white-space: nowrap; -} - -/* All views: header item value format */ -td.headerValue -{ - text-align: left; - color: #284fa8; - font-family: sans-serif; - font-weight: bold; - white-space: nowrap; -} - -/* All views: header item coverage table heading */ -td.headerCovTableHead -{ - text-align: center; - padding-right: 6px; - padding-left: 6px; - padding-bottom: 0px; - font-family: sans-serif; - white-space: nowrap; -} - -/* All views: header item coverage table entry */ -td.headerCovTableEntry -{ - text-align: right; - color: #284fa8; - font-family: sans-serif; - font-weight: bold; - white-space: nowrap; - padding-left: 12px; - padding-right: 4px; - background-color: #dae7fe; -} - -/* All views: header item coverage table entry for high coverage rate */ -td.headerCovTableEntryHi -{ - text-align: right; - color: #000000; - font-family: sans-serif; - font-weight: bold; - white-space: nowrap; - padding-left: 12px; - padding-right: 4px; - background-color: #a7fc9d; -} - -/* All views: header item coverage table entry for medium coverage rate */ -td.headerCovTableEntryMed -{ - text-align: right; - color: #000000; - font-family: sans-serif; - font-weight: bold; - white-space: nowrap; - padding-left: 12px; - padding-right: 4px; - background-color: #ffea20; -} - -/* All views: header item coverage table entry for ow coverage rate */ -td.headerCovTableEntryLo -{ - text-align: right; - color: #000000; - font-family: sans-serif; - font-weight: bold; - white-space: nowrap; - padding-left: 12px; - padding-right: 4px; - background-color: #ff0000; -} - -/* All views: header legend value for legend entry */ -td.headerValueLeg -{ - text-align: left; - color: #000000; - font-family: sans-serif; - font-size: 80%; - white-space: nowrap; - padding-top: 4px; -} - -/* All views: color of horizontal ruler */ -td.ruler -{ - background-color: #6688d4; -} - -/* All views: version string format */ -td.versionInfo -{ - text-align: center; - padding-top: 2px; - font-family: sans-serif; - font-style: italic; -} - -/* Directory view/File view (all)/Test case descriptions: - table headline format */ -td.tableHead -{ - text-align: center; - color: #ffffff; - background-color: #6688d4; - font-family: sans-serif; - font-size: 120%; - font-weight: bold; - white-space: nowrap; - padding-left: 4px; - padding-right: 4px; -} - -span.tableHeadSort -{ - padding-right: 4px; -} - -/* Directory view/File view (all): filename entry format */ -td.coverFile -{ - text-align: left; - padding-left: 10px; - padding-right: 20px; - color: #284fa8; - background-color: #dae7fe; - font-family: monospace; -} - -/* Directory view/File view (all): filename entry format */ -td.overallOwner -{ - text-align: center; - font-weight: bold; - font-family: sans-serif; - background-color: #dae7fe; - padding-right: 10px; - padding-left: 10px; -} - -/* Directory view/File view (all): filename entry format */ -td.ownerName -{ - text-align: right; - font-style: italic; - font-family: sans-serif; - background-color: #E5DBDB; - padding-right: 10px; - padding-left: 20px; -} - -/* Directory view/File view (all): bar-graph entry format*/ -td.coverBar -{ - padding-left: 10px; - padding-right: 10px; - background-color: #dae7fe; -} - -/* Directory view/File view (all): bar-graph entry format*/ -td.owner_coverBar -{ - padding-left: 10px; - padding-right: 10px; - background-color: #E5DBDB; -} - -/* Directory view/File view (all): bar-graph outline color */ -td.coverBarOutline -{ - background-color: #000000; -} - -/* Directory view/File view (all): percentage entry for files with - high coverage rate */ -td.coverPerHi -{ - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #a7fc9d; - font-weight: bold; - font-family: sans-serif; -} - -/* 'owner' entry: slightly lighter color than 'coverPerHi' */ -td.owner_coverPerHi -{ - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #82E0AA; - font-weight: bold; - font-family: sans-serif; -} - -/* Directory view/File view (all): line count entry */ -td.coverNumDflt -{ - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #dae7fe; - white-space: nowrap; - font-family: sans-serif; -} - -/* td background color and font for the 'owner' section of the table */ -td.ownerTla -{ - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #E5DBDB; - white-space: nowrap; - font-family: sans-serif; - font-style: italic; -} - -/* Directory view/File view (all): line count entry for files with - high coverage rate */ -td.coverNumHi -{ - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #a7fc9d; - white-space: nowrap; - font-family: sans-serif; -} - -td.owner_coverNumHi -{ - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #82E0AA; - white-space: nowrap; - font-family: sans-serif; -} - -/* Directory view/File view (all): percentage entry for files with - medium coverage rate */ -td.coverPerMed -{ - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #ffea20; - font-weight: bold; - font-family: sans-serif; -} - -td.owner_coverPerMed -{ - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #F9E79F; - font-weight: bold; - font-family: sans-serif; -} - -/* Directory view/File view (all): line count entry for files with - medium coverage rate */ -td.coverNumMed -{ - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #ffea20; - white-space: nowrap; - font-family: sans-serif; -} - -td.owner_coverNumMed -{ - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #F9E79F; - white-space: nowrap; - font-family: sans-serif; -} - -/* Directory view/File view (all): percentage entry for files with - low coverage rate */ -td.coverPerLo -{ - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #ff0000; - font-weight: bold; - font-family: sans-serif; -} - -td.owner_coverPerLo -{ - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #EC7063; - font-weight: bold; - font-family: sans-serif; -} - -/* Directory view/File view (all): line count entry for files with - low coverage rate */ -td.coverNumLo -{ - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #ff0000; - white-space: nowrap; - font-family: sans-serif; -} - -td.owner_coverNumLo -{ - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #EC7063; - white-space: nowrap; - font-family: sans-serif; -} - -/* File view (all): "show/hide details" link format */ -a.detail:link -{ - color: #b8d0ff; - font-size:80%; -} - -/* File view (all): "show/hide details" link - visited format */ -a.detail:visited -{ - color: #b8d0ff; - font-size:80%; -} - -/* File view (all): "show/hide details" link - activated format */ -a.detail:active -{ - color: #ffffff; - font-size:80%; -} - -/* File view (detail): test name entry */ -td.testName -{ - text-align: right; - padding-right: 10px; - background-color: #dae7fe; - font-family: sans-serif; -} - -/* File view (detail): test percentage entry */ -td.testPer -{ - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #dae7fe; - font-family: sans-serif; -} - -/* File view (detail): test lines count entry */ -td.testNum -{ - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #dae7fe; - font-family: sans-serif; -} - -/* Test case descriptions: test name format*/ -dt -{ - font-family: sans-serif; - font-weight: bold; -} - -/* Test case descriptions: description table body */ -td.testDescription -{ - padding-top: 10px; - padding-left: 30px; - padding-bottom: 10px; - padding-right: 30px; - background-color: #dae7fe; -} - -/* Source code view: function entry */ -td.coverFn -{ - text-align: left; - padding-left: 10px; - padding-right: 20px; - color: #284fa8; - background-color: #dae7fe; - font-family: monospace; -} - -/* Source code view: function entry zero count*/ -td.coverFnLo -{ - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #ff0000; - font-weight: bold; - font-family: sans-serif; -} - -/* Source code view: function entry nonzero count*/ -td.coverFnHi -{ - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #dae7fe; - font-weight: bold; - font-family: sans-serif; -} - -td.coverFnAlias -{ - text-align: right; - padding-left: 10px; - padding-right: 20px; - color: #284fa8; - /* make this a slightly different color than the leader - otherwise, - otherwise the alias is hard to distinguish in the table */ - background-color: #E5DBDB; /* very light pale grey/blue */ - font-family: monospace; -} - -/* Source code view: function entry zero count*/ -td.coverFnAliasLo -{ - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #EC7063; /* lighter red */ - font-family: sans-serif; -} - -/* Source code view: function entry nonzero count*/ -td.coverFnAliasHi -{ - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #dae7fe; - font-weight: bold; - font-family: sans-serif; -} - -/* Source code view: source code format */ -pre.source -{ - font-family: monospace; - white-space: pre; - margin-top: 2px; -} - -/* Source code view: line number format */ -span.lineNum -{ - background-color: #efe383; -} - -/* Source code view: format for Cov legend */ -span.coverLegendCov -{ - padding-left: 10px; - padding-right: 10px; - padding-bottom: 2px; - background-color: #cad7fe; -} - -/* Source code view: format for NoCov legend */ -span.coverLegendNoCov -{ - padding-left: 10px; - padding-right: 10px; - padding-bottom: 2px; - background-color: #ff6230; -} - -/* Source code view: format for the source code heading line */ -pre.sourceHeading -{ - white-space: pre; - font-family: monospace; - font-weight: bold; - margin: 0px; -} - -/* All views: header legend value for low rate */ -td.headerValueLegL -{ - font-family: sans-serif; - text-align: center; - white-space: nowrap; - padding-left: 4px; - padding-right: 2px; - background-color: #ff0000; - font-size: 80%; -} - -/* All views: header legend value for med rate */ -td.headerValueLegM -{ - font-family: sans-serif; - text-align: center; - white-space: nowrap; - padding-left: 2px; - padding-right: 2px; - background-color: #ffea20; - font-size: 80%; -} - -/* All views: header legend value for hi rate */ -td.headerValueLegH -{ - font-family: sans-serif; - text-align: center; - white-space: nowrap; - padding-left: 2px; - padding-right: 4px; - background-color: #a7fc9d; - font-size: 80%; -} - -/* All views except source code view: legend format for low coverage */ -span.coverLegendCovLo -{ - padding-left: 10px; - padding-right: 10px; - padding-top: 2px; - background-color: #ff0000; -} - -/* All views except source code view: legend format for med coverage */ -span.coverLegendCovMed -{ - padding-left: 10px; - padding-right: 10px; - padding-top: 2px; - background-color: #ffea20; -} - -/* All views except source code view: legend format for hi coverage */ -span.coverLegendCovHi -{ - padding-left: 10px; - padding-right: 10px; - padding-top: 2px; - background-color: #a7fc9d; -} - -a.branchTla:link -{ - color: #000000; -} - -a.branchTla:visited -{ - color: #000000; -} - -/* Source code view/table entry backround: format for lines classified as "Uncovered New Code (+ => 0): -Newly added code is not tested" */ -td.tlaUNC -{ - text-align: right; - background-color: #FF6230; -} -td.tlaBgUNC { - background-color: #FF6230; -} - -/* Source code view/table entry backround: format for lines classified as "Uncovered New Code (+ => 0): -Newly added code is not tested" */ -span.tlaUNC -{ - text-align: left; - background-color: #FF6230; -} -span.tlaBgUNC { - background-color: #FF6230; -} -a.tlaBgUNC { - background-color: #FF6230; - color: #000000; -} - -td.headerCovTableHeadUNC { - text-align: center; - padding-right: 6px; - padding-left: 6px; - padding-bottom: 0px; - font-family: sans-serif; - white-space: nowrap; - background-color: #FF6230; -} - -/* Source code view/table entry backround: format for lines classified as "Lost Baseline Coverage (1 => 0): -Unchanged code is no longer tested" */ -td.tlaLBC -{ - text-align: right; - background-color: #FF6230; -} -td.tlaBgLBC { - background-color: #FF6230; -} - -/* Source code view/table entry backround: format for lines classified as "Lost Baseline Coverage (1 => 0): -Unchanged code is no longer tested" */ -span.tlaLBC -{ - text-align: left; - background-color: #FF6230; -} -span.tlaBgLBC { - background-color: #FF6230; -} -a.tlaBgLBC { - background-color: #FF6230; - color: #000000; -} - -td.headerCovTableHeadLBC { - text-align: center; - padding-right: 6px; - padding-left: 6px; - padding-bottom: 0px; - font-family: sans-serif; - white-space: nowrap; - background-color: #FF6230; -} - -/* Source code view/table entry backround: format for lines classified as "Uncovered Included Code (# => 0): -Previously unused code is untested" */ -td.tlaUIC -{ - text-align: right; - background-color: #FF6230; -} -td.tlaBgUIC { - background-color: #FF6230; -} - -/* Source code view/table entry backround: format for lines classified as "Uncovered Included Code (# => 0): -Previously unused code is untested" */ -span.tlaUIC -{ - text-align: left; - background-color: #FF6230; -} -span.tlaBgUIC { - background-color: #FF6230; -} -a.tlaBgUIC { - background-color: #FF6230; - color: #000000; -} - -td.headerCovTableHeadUIC { - text-align: center; - padding-right: 6px; - padding-left: 6px; - padding-bottom: 0px; - font-family: sans-serif; - white-space: nowrap; - background-color: #FF6230; -} - -/* Source code view/table entry backround: format for lines classified as "Uncovered Baseline Code (0 => 0): -Unchanged code was untested before, is untested now" */ -td.tlaUBC -{ - text-align: right; - background-color: #FF6230; -} -td.tlaBgUBC { - background-color: #FF6230; -} - -/* Source code view/table entry backround: format for lines classified as "Uncovered Baseline Code (0 => 0): -Unchanged code was untested before, is untested now" */ -span.tlaUBC -{ - text-align: left; - background-color: #FF6230; -} -span.tlaBgUBC { - background-color: #FF6230; -} -a.tlaBgUBC { - background-color: #FF6230; - color: #000000; -} - -td.headerCovTableHeadUBC { - text-align: center; - padding-right: 6px; - padding-left: 6px; - padding-bottom: 0px; - font-family: sans-serif; - white-space: nowrap; - background-color: #FF6230; -} - -/* Source code view/table entry backround: format for lines classified as "Gained Baseline Coverage (0 => 1): -Unchanged code is tested now" */ -td.tlaGBC -{ - text-align: right; - background-color: #CAD7FE; -} -td.tlaBgGBC { - background-color: #CAD7FE; -} - -/* Source code view/table entry backround: format for lines classified as "Gained Baseline Coverage (0 => 1): -Unchanged code is tested now" */ -span.tlaGBC -{ - text-align: left; - background-color: #CAD7FE; -} -span.tlaBgGBC { - background-color: #CAD7FE; -} -a.tlaBgGBC { - background-color: #CAD7FE; - color: #000000; -} - -td.headerCovTableHeadGBC { - text-align: center; - padding-right: 6px; - padding-left: 6px; - padding-bottom: 0px; - font-family: sans-serif; - white-space: nowrap; - background-color: #CAD7FE; -} - -/* Source code view/table entry backround: format for lines classified as "Gained Included Coverage (# => 1): -Previously unused code is tested now" */ -td.tlaGIC -{ - text-align: right; - background-color: #CAD7FE; -} -td.tlaBgGIC { - background-color: #CAD7FE; -} - -/* Source code view/table entry backround: format for lines classified as "Gained Included Coverage (# => 1): -Previously unused code is tested now" */ -span.tlaGIC -{ - text-align: left; - background-color: #CAD7FE; -} -span.tlaBgGIC { - background-color: #CAD7FE; -} -a.tlaBgGIC { - background-color: #CAD7FE; - color: #000000; -} - -td.headerCovTableHeadGIC { - text-align: center; - padding-right: 6px; - padding-left: 6px; - padding-bottom: 0px; - font-family: sans-serif; - white-space: nowrap; - background-color: #CAD7FE; -} - -/* Source code view/table entry backround: format for lines classified as "Gained New Coverage (+ => 1): -Newly added code is tested" */ -td.tlaGNC -{ - text-align: right; - background-color: #CAD7FE; -} -td.tlaBgGNC { - background-color: #CAD7FE; -} - -/* Source code view/table entry backround: format for lines classified as "Gained New Coverage (+ => 1): -Newly added code is tested" */ -span.tlaGNC -{ - text-align: left; - background-color: #CAD7FE; -} -span.tlaBgGNC { - background-color: #CAD7FE; -} -a.tlaBgGNC { - background-color: #CAD7FE; - color: #000000; -} - -td.headerCovTableHeadGNC { - text-align: center; - padding-right: 6px; - padding-left: 6px; - padding-bottom: 0px; - font-family: sans-serif; - white-space: nowrap; - background-color: #CAD7FE; -} - -/* Source code view/table entry backround: format for lines classified as "Covered Baseline Code (1 => 1): -Unchanged code was tested before and is still tested" */ -td.tlaCBC -{ - text-align: right; - background-color: #CAD7FE; -} -td.tlaBgCBC { - background-color: #CAD7FE; -} - -/* Source code view/table entry backround: format for lines classified as "Covered Baseline Code (1 => 1): -Unchanged code was tested before and is still tested" */ -span.tlaCBC -{ - text-align: left; - background-color: #CAD7FE; -} -span.tlaBgCBC { - background-color: #CAD7FE; -} -a.tlaBgCBC { - background-color: #CAD7FE; - color: #000000; -} - -td.headerCovTableHeadCBC { - text-align: center; - padding-right: 6px; - padding-left: 6px; - padding-bottom: 0px; - font-family: sans-serif; - white-space: nowrap; - background-color: #CAD7FE; -} - -/* Source code view/table entry backround: format for lines classified as "Excluded Uncovered Baseline (0 => #): -Previously untested code is unused now" */ -td.tlaEUB -{ - text-align: right; - background-color: #FFFFFF; -} -td.tlaBgEUB { - background-color: #FFFFFF; -} - -/* Source code view/table entry backround: format for lines classified as "Excluded Uncovered Baseline (0 => #): -Previously untested code is unused now" */ -span.tlaEUB -{ - text-align: left; - background-color: #FFFFFF; -} -span.tlaBgEUB { - background-color: #FFFFFF; -} -a.tlaBgEUB { - background-color: #FFFFFF; - color: #000000; -} - -td.headerCovTableHeadEUB { - text-align: center; - padding-right: 6px; - padding-left: 6px; - padding-bottom: 0px; - font-family: sans-serif; - white-space: nowrap; - background-color: #FFFFFF; -} - -/* Source code view/table entry backround: format for lines classified as "Excluded Covered Baseline (1 => #): -Previously tested code is unused now" */ -td.tlaECB -{ - text-align: right; - background-color: #FFFFFF; -} -td.tlaBgECB { - background-color: #FFFFFF; -} - -/* Source code view/table entry backround: format for lines classified as "Excluded Covered Baseline (1 => #): -Previously tested code is unused now" */ -span.tlaECB -{ - text-align: left; - background-color: #FFFFFF; -} -span.tlaBgECB { - background-color: #FFFFFF; -} -a.tlaBgECB { - background-color: #FFFFFF; - color: #000000; -} - -td.headerCovTableHeadECB { - text-align: center; - padding-right: 6px; - padding-left: 6px; - padding-bottom: 0px; - font-family: sans-serif; - white-space: nowrap; - background-color: #FFFFFF; -} - -/* Source code view/table entry backround: format for lines classified as "Deleted Uncovered Baseline (0 => -): -Previously untested code has been deleted" */ -td.tlaDUB -{ - text-align: right; - background-color: #FFFFFF; -} -td.tlaBgDUB { - background-color: #FFFFFF; -} - -/* Source code view/table entry backround: format for lines classified as "Deleted Uncovered Baseline (0 => -): -Previously untested code has been deleted" */ -span.tlaDUB -{ - text-align: left; - background-color: #FFFFFF; -} -span.tlaBgDUB { - background-color: #FFFFFF; -} -a.tlaBgDUB { - background-color: #FFFFFF; - color: #000000; -} - -td.headerCovTableHeadDUB { - text-align: center; - padding-right: 6px; - padding-left: 6px; - padding-bottom: 0px; - font-family: sans-serif; - white-space: nowrap; - background-color: #FFFFFF; -} - -/* Source code view/table entry backround: format for lines classified as "Deleted Covered Baseline (1 => -): -Previously tested code has been deleted" */ -td.tlaDCB -{ - text-align: right; - background-color: #FFFFFF; -} -td.tlaBgDCB { - background-color: #FFFFFF; -} - -/* Source code view/table entry backround: format for lines classified as "Deleted Covered Baseline (1 => -): -Previously tested code has been deleted" */ -span.tlaDCB -{ - text-align: left; - background-color: #FFFFFF; -} -span.tlaBgDCB { - background-color: #FFFFFF; -} -a.tlaBgDCB { - background-color: #FFFFFF; - color: #000000; -} - -td.headerCovTableHeadDCB { - text-align: center; - padding-right: 6px; - padding-left: 6px; - padding-bottom: 0px; - font-family: sans-serif; - white-space: nowrap; - background-color: #FFFFFF; -} - -/* Source code view: format for date/owner bin that is not hit */ -span.missBins -{ - background-color: #ff0000 /* red */ -} diff --git a/coverage/glass.png b/coverage/glass.png deleted file mode 100644 index e1abc00..0000000 Binary files a/coverage/glass.png and /dev/null differ diff --git a/coverage/index-sort-f.html b/coverage/index-sort-f.html deleted file mode 100644 index 3366a6d..0000000 --- a/coverage/index-sort-f.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - LCOV - coverage.out - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top levelCoverageTotalHit
Test:coverage.outLines:80.3 %32222587
Test Date:2025-03-27 03:52:25Functions:65.3 %219143
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Directory Sort by file nameLine Coverage Sort by line coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit
jecs -
71.7%71.7%
-
71.7 %1487106653.6 %9752
jecs/tools -
63.0%63.0%
-
63.0 %50832063.6 %5535
jecs/test/test -
97.9%97.9%
-
97.9 %1227120183.6 %6756
-
-
- - - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/index-sort-l.html b/coverage/index-sort-l.html deleted file mode 100644 index 03dbedb..0000000 --- a/coverage/index-sort-l.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - LCOV - coverage.out - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top levelCoverageTotalHit
Test:coverage.outLines:80.3 %32222587
Test Date:2025-03-27 03:52:25Functions:65.3 %219143
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Directory Sort by file nameLine Coverage Sort by line coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit
jecs/tools -
63.0%63.0%
-
63.0 %50832063.6 %5535
jecs -
71.7%71.7%
-
71.7 %1487106653.6 %9752
jecs/test/test -
97.9%97.9%
-
97.9 %1227120183.6 %6756
-
-
- - - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/index.html b/coverage/index.html index 11bc7c4..4cc58e2 100644 --- a/coverage/index.html +++ b/coverage/index.html @@ -1,129 +1,12 @@ - - - - - - - LCOV - coverage.out - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top levelCoverageTotalHit
Test:coverage.outLines:80.3 %32222587
Test Date:2025-03-27 03:52:25Functions:65.3 %219143
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Directory Sort by file nameLine Coverage Sort by line coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit
jecs -
71.7%71.7%
-
71.7 %1487106653.6 %9752
jecs/test/test -
97.9%97.9%
-
97.9 %1227120183.6 %6756
jecs/tools -
63.0%63.0%
-
63.0 %50832063.6 %5535
-
-
- - - - -
Generated by: LCOV version 2.0-1
-
- - - + + + +

Coverage Report

+ + + + + + + +
FileTotal HitsFunctions
tests.luau7267
jecs.luau16193798
testkit.luau61531
lifetime_tracker.luau111
entity_visualiser.luau14
ansi.luau19
\ No newline at end of file diff --git a/coverage/jecs.luau.html b/coverage/jecs.luau.html new file mode 100644 index 0000000..db3a515 --- /dev/null +++ b/coverage/jecs.luau.html @@ -0,0 +1,2795 @@ + + + + +

jecs.luau Coverage

+

Total Execution Hits: 161937

+

Function Coverage Overview: 52.04%

+ +
+

Function Coverage:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FunctionHits
1
ECS_COMBINE:1440
ECS_IS_PAIR:1494
ECS_GENERATION_INC:1531
ECS_ENTITY_T_LO:1684
ECS_GENERATION:1725
ECS_ENTITY_T_HI:1760
ECS_PAIR:180186
ECS_PAIR_FIRST:1870
ECS_PAIR_SECOND:1910
entity_index_try_get_any:19517
entity_index_try_get:2081
entity_index_try_get_fast:2220
entity_index_is_alive:2320
entity_index_get_alive:2360
ecs_get_alive:2440
entity_index_new_id:2670
ecs_pair_first:2884
ecs_pair_second:2935
query_match:2980
find_observers:3210
archetype_move:3301822
archetype_append:3900
new_entity:4000
entity_move:4110
hash:4250
fetch:4290
world_get:440734
world_has_one_inline:4710
world_has:48780
world_target:5091440
ECS_ID_IS_WILDCARD:5410
id_record_ensure:547704
archetype_append_to_records:6100
archetype_create:635987
world_entity:70066852
world_parent:7041
archetype_ensure:7080
find_insert:7220
find_archetype_with:7340
find_archetype_without:75222
archetype_init_edge:7690
archetype_ensure_edge:7800
init_edge_for_add:7940
init_edge_for_remove:8110
create_edge_for_add:8340
create_edge_for_remove:8450
archetype_traverse_add:8561
archetype_traverse_remove:8721
world_add:88919316
world_set:9212775
world_component:973121
world_remove:985298
archetype_fast_delete_last:10100
archetype_fast_delete:10180
archetype_delete:102758
world_clear:10660
archetype_disconnect_edge:11660
archetype_remove_edge:11770
archetype_clear_edges:118222
archetype_destroy:12152
world_cleanup:12511
world_delete:127265539
world_contains:1448145
NOOP:14520
query_iter_init:146326
world_query_iter_next:1529556
world_query_iter_next:15557
world_query_iter_next:15820
world_query_iter_next:16102
world_query_iter_next:16390
world_query_iter_next:16690
world_query_iter_next:17000
world_query_iter_next:17320
world_query_iter_next:17662
query_iter:180020
query_without:18086
query_with:18381
query_archetypes:18725
query_cached:18766
on_create_callback:19264
on_delete_callback:19301
cached_query_iter:194311
world_query_iter_next:200311
world_query_iter_next:20298
world_query_iter_next:20560
world_query_iter_next:20840
world_query_iter_next:21130
world_query_iter_next:21430
world_query_iter_next:21740
world_query_iter_next:22060
world_query_iter_next:22400
world_query:229733
world_each:23572
:237412
world_children:23912
:23740
world_new:244173
+

Source Code:

+> +> +> +> +> + + +> + + +> + +> + +> + + + + + + + +> + +> + + + + + +> + + + + + + + + + +> + + + + + + + + + +> + + + + + +> + + + + + + + + + + + +> + +> + +> + +> + + + + + + +> + + + + + + + + +> + + + + +> + +> + + + + + + + + + + +> + +> + + + + + + + + + + + + + + +> + + + + + + +> + + +> + + + +> + + +> + + +> + +> + + +> +> + + + + +> + + + +> +> + +> + +> +> + + +> +> + + +> +> + + +> +> + + + +> + +> +> + + +> +> + + +> +> + + + + + +> + + +> +> + +> +> + + + + + + +> + + +> +> + +> +> + + + + + +> +> + +> +> + + +> +> + + + + +> + +> +> + + + +> +> + +> + + +> +> + + +> +> + + + +> +> + +> +> + + + + + + + + + +> +> + + + + + + +> + +> +> + + + +> +> + + + +> +> + + + + +> + + + +> +> +> + + + + + +> +> +> +> + +> +> + + + + + +> + +> +> + + + + + + + + + + + +> + + + +> + + + +> +> +> + +> +> + + +> +> +> + +> + +> + +> +> + +> +> +> +> + + +> + + +> +> + + +> + +> + + + + +> +> + + + + + + + + +> +> + + + + + + + + + +> +> + + + + + + + + + + + + +> +> + + +> +> + + + +> + + +> +> + +> +> + + + + + +> +> + + + +> +> + + + +> + +> + + + + + + + + + + +> +> +> + + + + +> +> + + + +> +> + +> + +> +> + + + + +> +> + + + +> +> + +> + + + +> +> +> + +> +> + + + + + +> +> + + + +> +> + +> + + + +> +> + + +> +> + + + +> +> + + +> +> + + + + +> +> + + + + +> + + + + + + + + + + + + +> +> + + +> + +> + + +> +> + +> + +> + + +> +> + + + + + + + + +> + + + + + + + + + + + +> + +> +> + +> +> + + + + + + + + + + + + + + + +> + + + + + + +> +> +> + + + +> + + +> + + +> + + + + + + + + +> + + + + +> + + + +> + + + + + + +> + + + +> +> + + + + +> +> +> + + + + +> + + + +> +> +> +> + + +> + +> +> + + +> +> + + +> +> + + + +> +> + + + + +> +> + +> +> + + + + +> + + +> +> + +> +> + + +> +> +> +> + + + +> +> + +> + +> + +> +> + + + + + + + + + +> +> + + +> + +> +> + + + + + + + + + +> +> + + + + + + + + + +> +> + +> +> + + + + + + +> + + + +> + + +> +> +> +> + + + + + + + + + + + + +> + + + +> + + +> +> +> +> + + + + + + + + + +> +> + + + + + + + + + +> +> + + + + + + + +> + + + +> +> + +> +> + + + + + + +> + +> + + + +> +> + +> +> + + + + + + + + + +> +> + + + + +> + + + + + +> +> +> + + +> + + +> +> +> + + + + + +> +> + + + + +> + +> +> + + + + + + +> +> + +> +> + +> + + + +> + +> +> +> + + +> + +> + + + +> +> + + + +> +> +> + + + +> +> + +> + +> + +> +> + + + + + +> + +> + + +> +> + + + + + +> +> + +> + +> +> +> + + + + +> +> +> +> + + + + + +> +> +> +> + + + + + + + + + +> + +> + + + + +> +> + + +> +> + + + + + +> +> +> + +> + + + + +> +> +> + + + + + + + + + +> + + + + + + + + + +> + + +> +> +> + + + +> + + + + + + + +> + + + +> + + + + +> + + +> + + +> +> + + +> +> + + +> +> + + + +> +> + + + +> +> +> +> + + + + + + + + + + + + + +> + + + +> +> + + + +> +> +> +> +> + + + + + +> + + +> +> +> + + + +> +> + + + + + + + +> + + + +> +> + + + + + + +> +> + + + + + + +> +> + + +> +> + + + +> +> + + + + + + +> + + + + +> + + + +> +> +> +> + + + + + + + + +> +> +> +> + + +> + + + +> +> +> + + +> + + + +> +> + + +> +> + + + + + +> +> + + +> + +> +> + +> +> + + + + + +> + + + +> + + + + + +> + + + + +> +> + +> + + + + + + + +> +> + +> +> +> +> + + + +> + + + + + + + +> + + + +> + + + + +> + + + + + + + +> + + + + +> + + +> +> +> + + +> + + +> + + + +> +> + + + + +> +> +> +> + + +> +> +> + + + + + + + + + + +> + +> + + + + + + + + + + + + +> + + + +> +> + + + +> +> +> + + +> +> +> +> + + + + +> + + + + + + +> + + +> +> + + +> +> + +> + + + + + + + + +> + + +> + + + + + +> + + + + +> + + + + +> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +> +> + + + + + + + + +> +> + + + + +> + + + + +> +> + + +> + +> + + + + + + + + +> +> + + + + +> + + + + + +> +> + + +> + +> + + + + + + + + +> +> + + + + +> + + + + + + +> +> + + +> + +> + + + + + + + + +> +> + + + + +> + + + + + + + +> +> + + +> + +> + + + + + + + + +> +> + + + + +> + + + + + + + + +> +> + + +> + +> + + + + + + + + +> +> + + + + +> + + + + + + + + + +> +> + + +> + +> + + + + + + + + +> +> + + + + +> + + + + + + + + + + +> +> + + +> + +> + + + + + + + + +> +> + + + + +> + + + + + + + + + + + +> +> + + +> + +> + + + + + + + + + +> +> + + + + +> + + + +> +> + + +> + + +> +> + +> +> +> + + +> +> + + + + +> + +> +> + + + + + + + + +> + + + + +> +> +> + + +> +> + + + +> + +> +> + +> +> + + + + +> + + + + +> + + + + +> +> +> + + +> +> + + + +> + +> +> + +> +> +> +> +> + + +> +> + + + + + + + +> +> + + +> + + + +> + + + + + + + +> + +> +> + + + + + +> + + + + +> +> + + + + +> + + + + +> +> + + +> +> + + + + + +> +> + + +> + + +> + + + + + +> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +> +> + +> +> + + + + + + + + +> +> + + + + +> + + + + +> +> + + +> + +> + + + + + + + + +> +> + + + + +> + + + + + +> +> + + +> + +> + + + + + + + + +> +> + + + + +> + + + + + + +> +> + + +> + +> + + + + + + + + +> +> + + + + +> + + + + + + + +> +> + + +> + +> + + + + + + + + +> +> + + + + +> + + + + + + + + +> +> + + +> + +> + + + + + + + + +> +> + + + + +> + + + + + + + + + +> +> + + +> + +> + + + + + + + + +> +> + + + + +> + + + + + + + + + + +> +> + + +> + +> + + + + + + + + +> +> + + + + +> + + + + + + + + + + + +> +> + + +> + +> + + + + + + + + + +> +> + + + + +> + + + +> +> + + +> + + + + + + + + +> +> + + +> +> + +> +> +> + + + + + + +> +> + + + + + + + + +> + + + +> + +> + +> + + +> + + + + + +> + + + + +> +> + + +> +> +> + + +> +> + + + + +> + +> + +> + + + + + +> +> +> + + +> +> + + +> +> + +> +> + + + + +> +> + + + + + + +> +> + + +> + + + + + + +> + + + + +> + + +> +> +> + + +> +> + + + + + + + + + + + + + + + + + + +> + + + + + + +> + + +> + + + + + + + + + + + + + + + + +> + + + + + + + + + + + + + +> + + +> + + +> + +> + + + +> +> + +> + +> +> + + + + + + +> + + + + + + + + + + + + +> + +> + +> +> + +> + + + + + + +> + + + + + + + + + +> + + + + +> + + + + + + + +> + + + + + + +> + + +> + +> +> + +> +> + +> +> + +> + +> +> + +> + +> + +> + +> + +> + + + + +> +> + +> +> + +> +> + +> + +> + +> +> + + + + + + + + + +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> + + + +> + + + + + + + + + + + + + +> + +> +> + + + + +> + +> + + + + +> + + + + + + + + + + + + + + + +> + +> + + + + + +> + + + + + + +> + + +
LineHitsCode
1N/A--!optimize 2
2N/A--!native
3N/A--!strict
4N/A--draft 4
5N/A
60type i53 = number
70type i24 = number
8N/A
90type Ty = { i53 }
100type ArchetypeId = number
11N/A
120type Column = { any }
13N/A
140type Map = { [K]: V }
15N/A
160type ecs_graph_edge_t = {
170from: ecs_archetype_t,
180to: ecs_archetype_t?,
190id: number,
200prev: ecs_graph_edge_t?,
210next: ecs_graph_edge_t?,
220}
23N/A
240type ecs_graph_edges_t = Map
25N/A
260type ecs_graph_node_t = {
270add: ecs_graph_edges_t,
280remove: ecs_graph_edges_t,
290refs: ecs_graph_edge_t,
300}
31N/A
320type ecs_archetype_t = {
330id: number,
340types: Ty,
350type: string,
360entities: { number },
370columns: { Column },
380records: { [i53]: number },
390counts: { [i53]: number },
400} & ecs_graph_node_t
41N/A
420export type Archetype = {
430id: number,
440types: Ty,
450type: string,
460entities: { number },
470columns: { Column },
480records: { [Id]: number },
490counts: { [Id]: number },
500}
51N/A
520type ecs_record_t = {
530archetype: ecs_archetype_t,
540row: number,
550dense: i24,
560}
57N/A
580type ecs_id_record_t = {
590cache: { number },
600counts: { number },
610flags: number,
620size: number,
630hooks: {
640on_add: ((entity: i53) -> ())?,
650on_set: ((entity: i53, data: any) -> ())?,
660on_remove: ((entity: i53) -> ())?,
670},
680}
69N/A
700type ecs_id_index_t = Map
71N/A
720type ecs_archetypes_map_t = { [string]: ecs_archetype_t }
73N/A
740type ecs_archetypes_t = { ecs_archetype_t }
75N/A
760type ecs_entity_index_t = {
770dense_array: Map,
780sparse_array: Map,
790alive_count: number,
800max_id: number,
810}
82N/A
830type ecs_query_data_t = {
840compatible_archetypes: { ecs_archetype_t },
850ids: { i53 },
860filter_with: { i53 },
870filter_without: { i53 },
880next: () -> (number, ...any),
890world: ecs_world_t,
900}
91N/A
920type ecs_observer_t = {
930callback: (archetype: ecs_archetype_t) -> (),
940query: ecs_query_data_t,
950}
96N/A
970type ecs_observable_t = Map>
98N/A
990type ecs_world_t = {
1000entity_index: ecs_entity_index_t,
1010component_index: ecs_id_index_t,
1020archetypes: ecs_archetypes_t,
1030archetype_index: ecs_archetypes_map_t,
1040max_archetype_id: number,
1050max_component_id: number,
1060ROOT_ARCHETYPE: ecs_archetype_t,
1070observable: Map>,
1080}
109N/A
1101local HI_COMPONENT_ID = _G.__JECS_HI_COMPONENT_ID or 256
111N/A-- stylua: ignore start
1121local EcsOnAdd = HI_COMPONENT_ID + 1
1131local EcsOnRemove = HI_COMPONENT_ID + 2
1141local EcsOnSet = HI_COMPONENT_ID + 3
1151local EcsWildcard = HI_COMPONENT_ID + 4
1161local EcsChildOf = HI_COMPONENT_ID + 5
1171local EcsComponent = HI_COMPONENT_ID + 6
1181local EcsOnDelete = HI_COMPONENT_ID + 7
1191local EcsOnDeleteTarget = HI_COMPONENT_ID + 8
1201local EcsDelete = HI_COMPONENT_ID + 9
1211local EcsRemove = HI_COMPONENT_ID + 10
1221local EcsName = HI_COMPONENT_ID + 11
1231local EcsOnArchetypeCreate = HI_COMPONENT_ID + 12
1241local EcsOnArchetypeDelete = HI_COMPONENT_ID + 13
1251local EcsRest = HI_COMPONENT_ID + 14
126N/A
1271local ECS_ID_DELETE = 0b0000_0001
1281local ECS_ID_IS_TAG = 0b0000_0010
1291local ECS_ID_HAS_ON_ADD = 0b0000_0100
1301local ECS_ID_HAS_ON_SET = 0b0000_1000
1311local ECS_ID_HAS_ON_REMOVE = 0b0001_0000
1321local ECS_ID_MASK = 0b0000_0000
133N/A
1341local ECS_ENTITY_MASK = bit32.lshift(1, 24)
1351local ECS_GENERATION_MASK = bit32.lshift(1, 16)
136N/A
1371local NULL_ARRAY = table.freeze({})
1381local ECS_INTERNAL_ERROR = [[
1390This is an internal error, please file a bug report via the following link:
140N/A
1410https://github.com/Ukendio/jecs/issues/new?template=BUG-REPORT.md
1420]]
143N/A
1441local function ECS_COMBINE(id: number, generation: number): i53
14565539return id + (generation * ECS_ENTITY_MASK)
146N/Aend
1471local ECS_PAIR_OFFSET = 2^48
148N/A
1491local function ECS_IS_PAIR(e: number): boolean
15034return e > ECS_PAIR_OFFSET
151N/Aend
152N/A
1531local function ECS_GENERATION_INC(e: i53): i53
15465683if e > ECS_ENTITY_MASK then
15565540local id = e % ECS_ENTITY_MASK
15665540local generation = e // ECS_ENTITY_MASK
157N/A
15865540local next_gen = generation + 1
15965540if next_gen >= ECS_GENERATION_MASK then
1601return id
161N/Aend
162N/A
16365539return ECS_COMBINE(id, next_gen)
164N/Aend
165143return ECS_COMBINE(e, 1)
166N/Aend
167N/A
1681local function ECS_ENTITY_T_LO(e: i53): i24
169145return e % ECS_ENTITY_MASK
170N/Aend
171N/A
1721local function ECS_GENERATION(e: i53)
1735return e // ECS_ENTITY_MASK
174N/Aend
175N/A
1761local function ECS_ENTITY_T_HI(e: i53): i24
1770return e // ECS_ENTITY_MASK
178N/Aend
179N/A
1801local function ECS_PAIR(pred: i53, obj: i53): i53
18173pred %= ECS_ENTITY_MASK
18273obj %= ECS_ENTITY_MASK
183N/A
18473return obj + (pred * ECS_ENTITY_MASK) + ECS_PAIR_OFFSET
185N/Aend
186N/A
1871local function ECS_PAIR_FIRST(e: i53): i24
188260return (e - ECS_PAIR_OFFSET) // ECS_ENTITY_MASK
189N/Aend
190N/A
1911local function ECS_PAIR_SECOND(e: i53): i24
19224return (e - ECS_PAIR_OFFSET) % ECS_ENTITY_MASK
193N/Aend
194N/A
1951local function entity_index_try_get_any(
1960entity_index: ecs_entity_index_t,
1970entity: number
1980): ecs_record_t?
199145local r = entity_index.sparse_array[ECS_ENTITY_T_LO(entity)]
200N/A
201145if not r or r.dense == 0 then
2020return nil
203N/Aend
204N/A
205145return r
206N/Aend
207N/A
2081local function entity_index_try_get(entity_index: ecs_entity_index_t, entity: number): ecs_record_t?
209145local r = entity_index_try_get_any(entity_index, entity)
210145if r then
211145local r_dense = r.dense
212145if r_dense > entity_index.alive_count then
213125return nil
214N/Aend
21520if entity_index.dense_array[r_dense] ~= entity then
2162return nil
217N/Aend
218N/Aend
21918return r
220N/Aend
221N/A
2221local function entity_index_try_get_fast(entity_index: ecs_entity_index_t, entity: number): ecs_record_t?
223298local r = entity_index.sparse_array[ECS_ENTITY_T_LO(entity)]
224298if r then
225298if entity_index.dense_array[r.dense] ~= entity then
2260return nil
227N/Aend
228N/Aend
229298return r
230N/Aend
231N/A
2321local function entity_index_is_alive(entity_index: ecs_entity_index_t, entity: i53)
233145return entity_index_try_get(entity_index, entity) ~= nil
234N/Aend
235N/A
2361local function entity_index_get_alive(index: ecs_entity_index_t, entity: i53): i53?
23724local r = entity_index_try_get_any(index, entity)
23824if r then
23924return index.dense_array[r.dense]
240N/Aend
2410return nil
242N/Aend
243N/A
2441local function ecs_get_alive(world, entity)
2455if entity == 0 then
2460return 0
247N/Aend
248N/A
2495local eindex = world.entity_index
250N/A
2515if entity_index_is_alive(eindex, entity) then
2525return entity
253N/Aend
254N/A
2550if entity > ECS_ENTITY_MASK then
2560return 0
257N/Aend
258N/A
2590local current = entity_index_get_alive(eindex, entity)
2600if not current or not entity_index_is_alive(eindex, current) then
2610return 0
262N/Aend
263N/A
2640return current
265N/Aend
266N/A
2671local function entity_index_new_id(entity_index: ecs_entity_index_t): i53
26818688local dense_array = entity_index.dense_array
26918688local alive_count = entity_index.alive_count
27018688local max_id = entity_index.max_id
27118688if alive_count ~= max_id then
2720alive_count += 1
2730entity_index.alive_count = alive_count
2740local id = dense_array[alive_count]
2750return id
276N/Aend
277N/A
27818688local id = max_id + 1
27918688entity_index.max_id = id
28018688alive_count += 1
28118688entity_index.alive_count = alive_count
28218688dense_array[alive_count] = id
28318688entity_index.sparse_array[id] = { dense = alive_count } :: ecs_record_t
284N/A
28518688return id
286N/Aend
287N/A
2881local function ecs_pair_first(world: ecs_world_t, e: i53)
2894local pred = ECS_PAIR_FIRST(e)
2904return ecs_get_alive(world, pred)
291N/Aend
292N/A
2931local function ecs_pair_second(world: ecs_world_t, e: i53)
2945local obj = ECS_PAIR_SECOND(e)
2955return ecs_get_alive(world, obj)
296N/Aend
297N/A
2981local function query_match(query: ecs_query_data_t,
2990archetype: ecs_archetype_t)
3002local records = archetype.records
3012local with = query.filter_with
302N/A
3032for _, id in with do
3044if not records[id] then
3051return false
306N/Aend
307N/Aend
308N/A
3091local without = query.filter_without
3101if without then
3111for _, id in without do
3121if records[id] then
3130return false
314N/Aend
315N/Aend
316N/Aend
317N/A
3181return true
319N/Aend
320N/A
3211local function find_observers(world: ecs_world_t, event: i53,
3220component: i53): { ecs_observer_t }?
323113local cache = world.observable[event]
324113if not cache then
325110return nil
326N/Aend
3273return cache[component] :: any
328N/Aend
329N/A
3301local function archetype_move(
3310entity_index: ecs_entity_index_t,
3320to: ecs_archetype_t,
3330dst_row: i24,
3340from: ecs_archetype_t,
3350src_row: i24
3360)
3371822local src_columns = from.columns
3381822local dst_columns = to.columns
3391822local dst_entities = to.entities
3401822local src_entities = from.entities
341N/A
3421822local last = #src_entities
3431822local id_types = from.types
3441822local records = to.records
345N/A
3461822for i, column in src_columns do
3472251if column == NULL_ARRAY then
3480continue
349N/Aend
350N/A-- Retrieves the new column index from the source archetype's record from each component
351N/A-- We have to do this because the columns are tightly packed and indexes may not correspond to each other.
3521739local tr = records[id_types[i]]
353N/A
354N/A-- Sometimes target column may not exist, e.g. when you remove a component.
3551739if tr then
3561446dst_columns[tr][dst_row] = column[src_row]
357N/Aend
358N/A
359N/A-- If the entity is the last row in the archetype then swapping it would be meaningless.
3601739if src_row ~= last then
361N/A-- Swap rempves columns to ensure there are no holes in the archetype.
36295column[src_row] = column[last]
363N/Aend
3641739column[last] = nil
365N/Aend
366N/A
3671822local moved = #src_entities
368N/A
369N/A-- Move the entity from the source to the destination archetype.
370N/A-- Because we have swapped columns we now have to update the records
371N/A-- corresponding to the entities' rows that were swapped.
3721822local e1 = src_entities[src_row]
3731822local e2 = src_entities[moved]
374N/A
3751822if src_row ~= moved then
376461src_entities[src_row] = e2
377N/Aend
378N/A
3791822src_entities[moved] = nil :: any
3801822dst_entities[dst_row] = e1
381N/A
3821822local sparse_array = entity_index.sparse_array
383N/A
3841822local record1 = sparse_array[ECS_ENTITY_T_LO(e1)]
3851822local record2 = sparse_array[ECS_ENTITY_T_LO(e2)]
3861822record1.row = dst_row
3871822record2.row = src_row
388N/Aend
389N/A
3901local function archetype_append(
3910entity: i53,
3920archetype: ecs_archetype_t
3930): number
394296local entities = archetype.entities
395296local length = #entities + 1
396296entities[length] = entity
397296return length
398N/Aend
399N/A
4001local function new_entity(
4010entity: i53,
4020record: ecs_record_t,
4030archetype: ecs_archetype_t
4040): ecs_record_t
4051388local row = archetype_append(entity, archetype)
4061388record.archetype = archetype
4071388record.row = row
4080return record
409N/Aend
410N/A
4111local function entity_move(
4120entity_index: ecs_entity_index_t,
4130entity: i53,
4140record: ecs_record_t,
4150to: ecs_archetype_t
4160)
417296local sourceRow = record.row
418296local from = record.archetype
419296local dst_row = archetype_append(entity, to)
420296archetype_move(entity_index, to, dst_row, from, sourceRow)
421296record.archetype = to
422296record.row = dst_row
423N/Aend
424N/A
4251local function hash(arr: { number }): string
426324return table.concat(arr, "_")
427N/Aend
428N/A
4291local function fetch(id: i53, records: { number },
4300columns: { Column }, row: number): any
431623local tr = records[id]
432N/A
433623if not tr then
434598return nil
435N/Aend
436N/A
43725return columns[tr][row]
438N/Aend
439N/A
4401local function world_get(world: ecs_world_t, entity: i53,
4410a: i53, b: i53?, c: i53?, d: i53?, e: i53?): ...any
442734local record = entity_index_try_get_fast(world.entity_index, entity)
443734if not record then
44475return nil
445N/Aend
446N/A
447659local archetype = record.archetype
448659if not archetype then
44936return nil
450N/Aend
451N/A
452623local records = archetype.records
453623local columns = archetype.columns
454623local row = record.row
455N/A
456623local va = fetch(a, records, columns, row)
457N/A
458623if not b then
45930return va
460593elseif not c then
4610return va, fetch(b, records, columns, row)
462593elseif not d then
463593return va, fetch(b, records, columns, row), fetch(c, records, columns, row)
4640elseif not e then
4650return va, fetch(b, records, columns, row), fetch(c, records, columns, row), fetch(d, records, columns, row)
4660else
4670error("args exceeded")
468N/Aend
469N/Aend
470N/A
4711local function world_has_one_inline(world: ecs_world_t, entity: i53, id: i53): boolean
472702local record = entity_index_try_get_fast(world.entity_index, entity)
473702if not record then
47473return false
475N/Aend
476N/A
477629local archetype = record.archetype
478629if not archetype then
47936return false
480N/Aend
481N/A
482593local records = archetype.records
483N/A
484593return records[id] ~= nil
485N/Aend
486N/A
4871local function world_has(world: ecs_world_t, entity: i53, ...: i53): boolean
48880local record = entity_index_try_get_fast(world.entity_index, entity)
48980if not record then
49022return false
491N/Aend
492N/A
49358local archetype = record.archetype
49458if not archetype then
4951return false
496N/Aend
497N/A
49857local records = archetype.records
499N/A
50057for i = 1, select("#", ...) do
50166if not records[select(i, ...)] then
50225return false
503N/Aend
504N/Aend
505N/A
50632return true
507N/Aend
508N/A
5091local function world_target(world: ecs_world_t, entity: i53, relation: i24, index: number?): i24?
5101440local nth = index or 0
5111440local record = entity_index_try_get_fast(world.entity_index, entity)
5121440if not record then
513146return nil
514N/Aend
515N/A
5161294local archetype = record.archetype
5171294if not archetype then
51872return nil
519N/Aend
520N/A
5211222local r = ECS_PAIR(relation, EcsWildcard)
522N/A
5231222local count = archetype.counts[r]
5241222if not count then
5251167return nil
526N/Aend
527N/A
52855if nth >= count then
5295nth = nth + count + 1
530N/Aend
531N/A
53255nth = archetype.types[nth + archetype.records[r]]
53355if not nth then
5345return nil
535N/Aend
536N/A
53750return entity_index_get_alive(world.entity_index,
53850ECS_PAIR_SECOND(nth))
539N/Aend
540N/A
5411local function ECS_ID_IS_WILDCARD(e: i53): boolean
5420local first = ECS_ENTITY_T_HI(e)
5430local second = ECS_ENTITY_T_LO(e)
5440return first == EcsWildcard or second == EcsWildcard
545N/Aend
546N/A
5471local function id_record_ensure(world: ecs_world_t, id: number): ecs_id_record_t
5481509local component_index = world.component_index
5491509local entity_index = world.entity_index
5501509local idr: ecs_id_record_t = component_index[id]
551N/A
5521509if not idr then
553704local flags = ECS_ID_MASK
554704local relation = id
555704local target = 0
556704local is_pair = ECS_IS_PAIR(id)
557704if is_pair then
558384relation = entity_index_get_alive(entity_index, ECS_PAIR_FIRST(id)) :: i53
559384assert(relation and entity_index_is_alive(
560384entity_index, relation), ECS_INTERNAL_ERROR)
561383target = entity_index_get_alive(entity_index, ECS_PAIR_SECOND(id)) :: i53
562383assert(target and entity_index_is_alive(
563383entity_index, target), ECS_INTERNAL_ERROR)
564N/Aend
565N/A
566702local cleanup_policy = world_target(world, relation, EcsOnDelete, 0)
567702local cleanup_policy_target = world_target(world, relation, EcsOnDeleteTarget, 0)
568N/A
569702local has_delete = false
570N/A
571702if cleanup_policy == EcsDelete or cleanup_policy_target == EcsDelete then
57221has_delete = true
573N/Aend
574N/A
575702local on_add, on_set, on_remove = world_get(world, relation, EcsOnAdd, EcsOnSet, EcsOnRemove)
576N/A
577702local is_tag = not world_has_one_inline(world, relation, EcsComponent)
578N/A
579702if is_tag and is_pair then
580190is_tag = not world_has_one_inline(world, target, EcsComponent)
581N/Aend
582N/A
583702flags = bit32.bor(
584702flags,
585702if on_add then ECS_ID_HAS_ON_ADD else 0,
586702if on_remove then ECS_ID_HAS_ON_REMOVE else 0,
587702if on_set then ECS_ID_HAS_ON_SET else 0,
588702if has_delete then ECS_ID_DELETE else 0,
589702if is_tag then ECS_ID_IS_TAG else 0
5900)
591N/A
592702idr = {
593702size = 0,
594702cache = {},
595702counts = {},
596702flags = flags,
597702hooks = {
598702on_add = on_add,
599702on_set = on_set,
600702on_remove = on_remove,
6010},
6020}
603N/A
604702component_index[id] = idr
605N/Aend
606N/A
6071507return idr
608N/Aend
609N/A
6101local function archetype_append_to_records(
6110idr: ecs_id_record_t,
6120archetype: ecs_archetype_t,
6130id: i53,
6140index: number
6150)
616987local archetype_id = archetype.id
617987local archetype_records = archetype.records
618987local archetype_counts = archetype.counts
619987local idr_columns = idr.cache
620987local idr_counts = idr.counts
621987local tr = idr_columns[archetype_id]
622987if not tr then
623987idr_columns[archetype_id] = index
624987idr_counts[archetype_id] = 1
625N/A
626987archetype_records[id] = index
627987archetype_counts[id] = 1
6280else
62982local max_count = idr_counts[archetype_id] + 1
63082idr_counts[archetype_id] = max_count
63182archetype_counts[id] = max_count
632N/Aend
633N/Aend
634N/A
6351local function archetype_create(world: ecs_world_t, id_types: { i24 }, ty, prev: i53?): ecs_archetype_t
636635local archetype_id = (world.max_archetype_id :: number) + 1
637635world.max_archetype_id = archetype_id
638N/A
639635local length = #id_types
640635local columns = (table.create(length) :: any) :: { Column }
641N/A
642635local records: { number } = {}
643635local counts: {number} = {}
644N/A
645635local archetype: ecs_archetype_t = {
646635columns = columns,
647635entities = {},
648635id = archetype_id,
649635records = records,
650635counts = counts,
651635type = ty,
652635types = id_types,
653N/A
654635add = {},
655635remove = {},
656635refs = {} :: ecs_graph_edge_t,
6570}
658N/A
659635for i, component_id in id_types do
660989local idr = id_record_ensure(world, component_id)
661987archetype_append_to_records(idr, archetype, component_id, i)
662N/A
663987if ECS_IS_PAIR(component_id) then
664260local relation = ECS_PAIR_FIRST(component_id)
665260local object = ECS_PAIR_SECOND(component_id)
666260local r = ECS_PAIR(relation, EcsWildcard)
667260local idr_r = id_record_ensure(world, r)
668260archetype_append_to_records(idr_r, archetype, r, i)
669N/A
670260local t = ECS_PAIR(EcsWildcard, object)
671260local idr_t = id_record_ensure(world, t)
672260archetype_append_to_records(idr_t, archetype, t, i)
673N/Aend
674N/A
675987if bit32.band(idr.flags, ECS_ID_IS_TAG) == 0 then
676594columns[i] = {}
6770else
678393columns[i] = NULL_ARRAY
679N/Aend
680N/Aend
681N/A
682633for id in records do
6831405local observer_list = find_observers(world, EcsOnArchetypeCreate, id)
6841405if not observer_list then
6850continue
686N/Aend
6878for _, observer in observer_list do
6888if query_match(observer.query, archetype) then
6894observer.callback(archetype)
690N/Aend
691N/Aend
692N/Aend
693N/A
694633world.archetype_index[ty] = archetype
695633world.archetypes[archetype_id] = archetype
696N/A
697633return archetype
698N/Aend
699N/A
7001local function world_entity(world: ecs_world_t): i53
70166852return entity_index_new_id(world.entity_index)
702N/Aend
703N/A
7041local function world_parent(world: ecs_world_t, entity: i53)
7051return world_target(world, entity, EcsChildOf, 0)
706N/Aend
707N/A
7081local function archetype_ensure(world: ecs_world_t, id_types): ecs_archetype_t
709324if #id_types < 1 then
7100return world.ROOT_ARCHETYPE
711N/Aend
712N/A
713324local ty = hash(id_types)
714324local archetype = world.archetype_index[ty]
715324if archetype then
7160return archetype
717N/Aend
718N/A
719324return archetype_create(world, id_types, ty)
720N/Aend
721N/A
7221local function find_insert(id_types: { i53 }, toAdd: i53): number
723326for i, id in id_types do
724244if id == toAdd then
7252return -1
726N/Aend
727242if id > toAdd then
72813return i
729N/Aend
730N/Aend
731311return #id_types + 1
732N/Aend
733N/A
7341local function find_archetype_with(world: ecs_world_t, node: ecs_archetype_t, id: i53): ecs_archetype_t
735326local id_types = node.types
736N/A-- Component IDs are added incrementally, so inserting and sorting
737N/A-- them each time would be expensive. Instead this insertion sort can find the insertion
738N/A-- point in the types array.
739N/A
740326local dst = table.clone(node.types) :: { i53 }
741326local at = find_insert(id_types, id)
742326if at == -1 then
743N/A-- If it finds a duplicate, it just means it is the same archetype so it can return it
744N/A-- directly instead of needing to hash types for a lookup to the archetype.
7452return node
746N/Aend
747324table.insert(dst, at, id)
748N/A
749324return archetype_ensure(world, dst)
750N/Aend
751N/A
7521local function find_archetype_without(
7530world: ecs_world_t,
7540node: ecs_archetype_t,
7550id: i53
7560): ecs_archetype_t
75733local id_types = node.types
75833local at = table.find(id_types, id)
75933if at == nil then
7600return node
761N/Aend
762N/A
76333local dst = table.clone(id_types)
76433table.remove(dst, at)
765N/A
76633return archetype_ensure(world, dst)
767N/Aend
768N/A
7691local function archetype_init_edge(
7700archetype: ecs_archetype_t,
7710edge: ecs_graph_edge_t,
7720id: i53,
7730to: ecs_archetype_t
7740)
77532edge.from = archetype
77632edge.to = to
77732edge.id = id
778N/Aend
779N/A
7801local function archetype_ensure_edge(
7810world: ecs_world_t,
7820edges: ecs_graph_edges_t,
7830id: i53
7840): ecs_graph_edge_t
785296local edge = edges[id]
786296if not edge then
78732edge = {} :: ecs_graph_edge_t
78832edges[id] = edge
789N/Aend
790N/A
791296return edge
792N/Aend
793N/A
7941local function init_edge_for_add(world, archetype: ecs_archetype_t, edge: ecs_graph_edge_t, id, to: ecs_archetype_t)
795325archetype_init_edge(archetype, edge, id, to)
796325archetype_ensure_edge(world, archetype.add, id)
797325if archetype ~= to then
798323local to_refs = to.refs
799323local next_edge = to_refs.next
800N/A
801323to_refs.next = edge
802323edge.prev = to_refs
803323edge.next = next_edge
804N/A
805323if next_edge then
8060next_edge.prev = edge
807N/Aend
808N/Aend
809N/Aend
810N/A
8111local function init_edge_for_remove(
8120world: ecs_world_t,
8130archetype: ecs_archetype_t,
8140edge: ecs_graph_edge_t,
8150id: number,
8160to: ecs_archetype_t
8170)
81832archetype_init_edge(archetype, edge, id, to)
81932archetype_ensure_edge(world, archetype.remove, id)
82032if archetype ~= to then
82132local to_refs = to.refs
82232local prev_edge = to_refs.prev
823N/A
82432to_refs.prev = edge
82532edge.next = to_refs
82632edge.prev = prev_edge
827N/A
82832if prev_edge then
8292prev_edge.next = edge
830N/Aend
831N/Aend
832N/Aend
833N/A
8341local function create_edge_for_add(
8350world: ecs_world_t,
8360node: ecs_archetype_t,
8370edge: ecs_graph_edge_t,
8380id: i53
8390): ecs_archetype_t
840326local to = find_archetype_with(world, node, id)
841325init_edge_for_add(world, node, edge, id, to)
842325return to
843N/Aend
844N/A
8451local function create_edge_for_remove(
8460world: ecs_world_t,
8470node: ecs_archetype_t,
8480edge: ecs_graph_edge_t,
8490id: i53
8500): ecs_archetype_t
85132local to = find_archetype_without(world, node, id)
85232init_edge_for_remove(world, node, edge, id, to)
85332return to
854N/Aend
855N/A
8561local function archetype_traverse_add(
8570world: ecs_world_t,
8580id: i53,
8590from: ecs_archetype_t
8600): ecs_archetype_t
8612775from = from or world.ROOT_ARCHETYPE
8622775local edge = archetype_ensure_edge(world, from.add, id)
863N/A
8642775local to = edge.to
8652775if not to then
866326to = create_edge_for_add(world, from, edge, id)
867N/Aend
868N/A
8692774return to :: ecs_archetype_t
870N/Aend
871N/A
8721local function archetype_traverse_remove(
8730world: ecs_world_t,
8740id: i53,
8750from: ecs_archetype_t
8760): ecs_archetype_t
877296from = from or world.ROOT_ARCHETYPE
878N/A
879296local edge = archetype_ensure_edge(world, from.remove, id)
880N/A
881296local to = edge.to
882296if not to then
88332to = create_edge_for_remove(world, from, edge, id)
884N/Aend
885N/A
886296return to :: ecs_archetype_t
887N/Aend
888N/A
8891local function world_add(
8900world: ecs_world_t,
8910entity: i53,
8920id: i53
8930): ()
89419316local entity_index = world.entity_index
89519316local record = entity_index_try_get_fast(entity_index, entity)
89619316if not record then
8970return
898N/Aend
899N/A
90019316local from = record.archetype
90119316local to = archetype_traverse_add(world, id, from)
90219315if from == to then
9033return
904N/Aend
90519312if from then
906142entity_move(entity_index, entity, record, to)
9070else
90819170if #to.types > 0 then
90919170new_entity(entity, record, to)
910N/Aend
911N/Aend
912N/A
91319312local idr = world.component_index[id]
91419312local on_add = idr.hooks.on_add
915N/A
91619312if on_add then
9171on_add(entity)
918N/Aend
919N/Aend
920N/A
9211local function world_set(world: ecs_world_t, entity: i53, id: i53, data: unknown): ()
9222775local entity_index = world.entity_index
9232775local record = entity_index_try_get_fast(entity_index, entity)
9242775if not record then
9250return
926N/Aend
927N/A
9282775local from: ecs_archetype_t = record.archetype
9292775local to: ecs_archetype_t = archetype_traverse_add(world, id, from)
9302774local idr = world.component_index[id]
9312774local idr_hooks = idr.hooks
932N/A
9332774if from == to then
934N/A-- If the archetypes are the same it can avoid moving the entity
935N/A-- and just set the data directly.
9362local tr = to.records[id]
9372local column = from.columns[tr]
9382column[record.row] = data
9392local on_set = idr_hooks.on_set
9402if on_set then
9410on_set(entity, data)
942N/Aend
943N/A
9442return
945N/Aend
946N/A
9472772if from then
948N/A-- If there was a previous archetype, then the entity needs to move the archetype
9491384entity_move(entity_index, entity, record, to)
9500else
9511388if #to.types > 0 then
952N/A-- When there is no previous archetype it should create the archetype
9531388new_entity(entity, record, to)
954N/Aend
955N/Aend
956N/A
9572772local tr = to.records[id]
9582772local column = to.columns[tr]
959N/A
9602772column[record.row] = data
961N/A
9622765local on_add = idr_hooks.on_add
9632765if on_add then
9640on_add(entity)
965N/Aend
966N/A
9672765local on_set = idr_hooks.on_set
9682765if on_set then
9691on_set(entity, data)
970N/Aend
971N/Aend
972N/A
9731local function world_component(world: World): i53
974121local id = (world.max_component_id :: number) + 1
975121if id > HI_COMPONENT_ID then
976N/A-- IDs are partitioned into ranges because component IDs are not nominal,
977N/A-- so it needs to error when IDs intersect into the entity range.
9780error("Too many components, consider using world:entity() instead to create components.")
979N/Aend
980121world.max_component_id = id
981N/A
982121return id
983N/Aend
984N/A
9851local function world_remove(world: ecs_world_t, entity: i53, id: i53)
986298local entity_index = world.entity_index
987298local record = entity_index_try_get_fast(entity_index, entity)
988298if not record then
9890return
990N/Aend
991298local from = record.archetype
992N/A
993298if not from then
9941return
995N/Aend
996N/A
997297if from.records[id] then
998296local idr = world.component_index[id]
999296local on_remove = idr.hooks.on_remove
1000296if on_remove then
10013on_remove(entity)
1002N/Aend
1003N/A
1004296local to = archetype_traverse_remove(world, id, record.archetype)
1005N/A
1006296entity_move(entity_index, entity, record, to)
1007N/Aend
1008N/Aend
1009N/A
10101local function archetype_fast_delete_last(columns: { Column }, column_count: number, types: { i53 }, entity: i53)
101176for i, column in columns do
1012153if column ~= NULL_ARRAY then
1013135column[column_count] = nil
1014N/Aend
1015N/Aend
1016N/Aend
1017N/A
10181local function archetype_fast_delete(columns: { Column }, column_count: number, row, types, entity)
101958for i, column in columns do
1020109if column ~= NULL_ARRAY then
1021103column[row] = column[column_count]
1022103column[column_count] = nil
1023N/Aend
1024N/Aend
1025N/Aend
1026N/A
10271local function archetype_delete(world: ecs_world_t, archetype: ecs_archetype_t, row: number)
1028134local entity_index = world.entity_index
1029134local component_index = world.component_index
1030134local columns = archetype.columns
1031134local id_types = archetype.types
1032134local entities = archetype.entities
1033134local column_count = #entities
1034134local last = #entities
1035134local move = entities[last]
1036N/A-- We assume first that the entity is the last in the archetype
1037134local delete = move
1038N/A
1039134if row ~= last then
104058local record_to_move = entity_index_try_get_any(entity_index, move)
104158if record_to_move then
104258record_to_move.row = row
1043N/Aend
1044N/A
104558delete = entities[row]
104658entities[row] = move
1047N/Aend
1048N/A
1049134for _, id in id_types do
1050262local idr = component_index[id]
1051262local on_remove = idr.hooks.on_remove
1052262if on_remove then
10533on_remove(delete)
1054N/Aend
1055N/Aend
1056N/A
1057134entities[last] = nil :: any
1058N/A
1059134if row == last then
106076archetype_fast_delete_last(columns, column_count, id_types, delete)
10610else
106258archetype_fast_delete(columns, column_count, row, id_types, delete)
1063N/Aend
1064N/Aend
1065N/A
10661local function world_clear(world: ecs_world_t, entity: i53)
10676local entity_index = world.entity_index
10686local component_index = world.component_index
10696local archetypes = world.archetypes
10706local tgt = ECS_PAIR(EcsWildcard, entity)
10716local idr_t = component_index[tgt]
10726local idr = component_index[entity]
10736local rel = ECS_PAIR(entity, EcsWildcard)
10746local idr_r = component_index[rel]
1075N/A
10766if idr then
10774local count = 0
10784local queue = {}
10794for archetype_id in idr.cache do
108011local idr_archetype = archetypes[archetype_id]
108111local entities = idr_archetype.entities
108211local n = #entities
108311count += n
108411table.move(entities, 1, n, #queue + 1, queue)
1085N/Aend
10864for _, e in queue do
10878world_remove(world, e, entity)
1088N/Aend
1089N/Aend
1090N/A
10916if idr_t then
10920local queue
10930local ids
1094N/A
10950local count = 0
10960local archetype_ids = idr_t.cache
10970for archetype_id in archetype_ids do
10980local idr_t_archetype = archetypes[archetype_id]
10990local idr_t_types = idr_t_archetype.types
11000local entities = idr_t_archetype.entities
11010local removal_queued = false
1102N/A
11030for _, id in idr_t_types do
11040if not ECS_IS_PAIR(id) then
11050continue
1106N/Aend
11070local object = entity_index_get_alive(
11080entity_index, ECS_PAIR_SECOND(id))
11090if object ~= entity then
11100continue
1111N/Aend
11120if not ids then
11130ids = {}
1114N/Aend
11150ids[id] = true
11160removal_queued = true
1117N/Aend
1118N/A
11190if not removal_queued then
11200continue
1121N/Aend
1122N/A
11230if not queue then
11240queue = {}
1125N/Aend
1126N/A
11270local n = #entities
11280table.move(entities, 1, n, count + 1, queue)
11290count += n
1130N/Aend
1131N/A
11320for id in ids do
11330for _, child in queue do
11340world_remove(world, child, id)
1135N/Aend
1136N/Aend
1137N/Aend
1138N/A
11396if idr_r then
11401local count = 0
11411local archetype_ids = idr_r.cache
11421local ids = {}
11431local queue = {}
11441for archetype_id in archetype_ids do
11452local idr_r_archetype = archetypes[archetype_id]
11462local entities = idr_r_archetype.entities
11472local tr = idr_r_archetype.records[rel]
11482local tr_count = idr_r_archetype.counts[rel]
11492local types = idr_r_archetype.types
11502for i = tr, tr + tr_count - 1 do
11512ids[types[i]] = true
1152N/Aend
11532local n = #entities
11542table.move(entities, 1, n, count + 1, queue)
11552count += n
1156N/Aend
1157N/A
11581for _, e in queue do
11593for id in ids do
11603world_remove(world, e, id)
1161N/Aend
1162N/Aend
1163N/Aend
1164N/Aend
1165N/A
11661local function archetype_disconnect_edge(edge: ecs_graph_edge_t)
116722local edge_next = edge.next
116822local edge_prev = edge.prev
116922if edge_next then
117018edge_next.prev = edge_prev
1171N/Aend
117222if edge_prev then
117322edge_prev.next = edge_next
1174N/Aend
1175N/Aend
1176N/A
11771local function archetype_remove_edge(edges: ecs_graph_edges_t, id: i53, edge: ecs_graph_edge_t)
117822archetype_disconnect_edge(edge)
117922edges[id] = nil :: any
1180N/Aend
1181N/A
11821local function archetype_clear_edges(archetype: ecs_archetype_t)
118336local add: ecs_graph_edges_t = archetype.add
118436local remove: ecs_graph_edges_t = archetype.remove
118536local node_refs = archetype.refs
118636for id, edge in add do
11879archetype_disconnect_edge(edge)
11889add[id] = nil :: any
1189N/Aend
119036for id, edge in remove do
119118archetype_disconnect_edge(edge)
119218remove[id] = nil :: any
1193N/Aend
1194N/A
119536local cur = node_refs.next
119636while cur do
119722local edge = cur :: ecs_graph_edge_t
119822local next_edge = edge.next
119922archetype_remove_edge(edge.from.add, edge.id, edge)
120022cur = next_edge
1201N/Aend
1202N/A
120336cur = node_refs.prev
120436while cur do
12051local edge: ecs_graph_edge_t = cur
12061local next_edge = edge.prev
12071archetype_remove_edge(edge.from.remove, edge.id, edge)
12081cur = next_edge
1209N/Aend
1210N/A
121136node_refs.next = nil
121236node_refs.prev = nil
1213N/Aend
1214N/A
12151local function archetype_destroy(world: ecs_world_t, archetype: ecs_archetype_t)
121637if archetype == world.ROOT_ARCHETYPE then
12171return
1218N/Aend
1219N/A
122036local component_index = world.component_index
122136archetype_clear_edges(archetype)
122236local archetype_id = archetype.id
122336world.archetypes[archetype_id] = nil :: any
122436world.archetype_index[archetype.type] = nil :: any
122536local records = archetype.records
1226N/A
122736for id in records do
1228113local observer_list = find_observers(world, EcsOnArchetypeDelete, id)
1229113if not observer_list then
12300continue
1231N/Aend
12322for _, observer in observer_list do
12332if query_match(observer.query, archetype) then
12341observer.callback(archetype)
1235N/Aend
1236N/Aend
1237N/Aend
1238N/A
123936for id in records do
1240113local idr = component_index[id]
1241113idr.cache[archetype_id] = nil :: any
1242113idr.counts[archetype_id] = nil
1243113idr.size -= 1
1244113records[id] = nil :: any
1245113if idr.size == 0 then
12460component_index[id] = nil :: any
1247N/Aend
1248N/Aend
1249N/Aend
1250N/A
12511local function world_cleanup(world: ecs_world_t)
12521local archetypes = world.archetypes
1253N/A
12541for _, archetype in archetypes do
12559if #archetype.entities == 0 then
12564archetype_destroy(world, archetype)
1257N/Aend
1258N/Aend
1259N/A
12601local new_archetypes = table.create(#archetypes) :: { ecs_archetype_t }
12611local new_archetype_map = {}
1262N/A
12631for index, archetype in archetypes do
12646new_archetypes[index] = archetype
12656new_archetype_map[archetype.type] = archetype
1266N/Aend
1267N/A
12681world.archetypes = new_archetypes
12691world.archetype_index = new_archetype_map
1270N/Aend
1271N/A
12721local function world_delete(world: ecs_world_t, entity: i53)
127365684local entity_index = world.entity_index
127465684local record = entity_index_try_get(entity_index, entity)
127565684if not record then
12761return
1277N/Aend
1278N/A
127965683local archetype = record.archetype
128065683local row = record.row
1281N/A
128265683if archetype then
1283N/A-- In the future should have a destruct mode for
1284N/A-- deleting archetypes themselves. Maybe requires recycling
1285134archetype_delete(world, archetype, row)
1286N/Aend
1287N/A
128865683local delete = entity
128965683local component_index = world.component_index
129065683local archetypes = world.archetypes
129165683local tgt = ECS_PAIR(EcsWildcard, delete)
129265683local rel = ECS_PAIR(delete, EcsWildcard)
1293N/A
129465683local idr_t = component_index[tgt]
129565683local idr = component_index[delete]
129665683local idr_r = component_index[rel]
1297N/A
129865683if idr then
12998local flags = idr.flags
13008if bit32.band(flags, ECS_ID_DELETE) ~= 0 then
13011for archetype_id in idr.cache do
13021local idr_archetype = archetypes[archetype_id]
1303N/A
13041local entities = idr_archetype.entities
13051local n = #entities
13061for i = n, 1, -1 do
13072world_delete(world, entities[i])
1308N/Aend
1309N/A
13101archetype_destroy(world, idr_archetype)
1311N/Aend
13120else
13137for archetype_id in idr.cache do
131412local idr_archetype = archetypes[archetype_id]
131512local entities = idr_archetype.entities
131612local n = #entities
131712for i = n, 1, -1 do
131810world_remove(world, entities[i], delete)
1319N/Aend
1320N/A
132112archetype_destroy(world, idr_archetype)
1322N/Aend
1323N/Aend
1324N/Aend
1325N/A
132665683if idr_t then
132713local children
132813local ids
1329N/A
133013local count = 0
133113local archetype_ids = idr_t.cache
133213for archetype_id in archetype_ids do
133318local idr_t_archetype = archetypes[archetype_id]
133418local idr_t_types = idr_t_archetype.types
133518local entities = idr_t_archetype.entities
133618local removal_queued = false
1337N/A
133818for _, id in idr_t_types do
133934if not ECS_IS_PAIR(id) then
13400continue
1341N/Aend
134224local object = entity_index_get_alive(
134324entity_index, ECS_PAIR_SECOND(id))
134424if object ~= delete then
13450continue
1346N/Aend
134720local id_record = component_index[id]
134820local flags = id_record.flags
134920local flags_delete_mask: number = bit32.band(flags, ECS_ID_DELETE)
135020if flags_delete_mask ~= 0 then
13518for i = #entities, 1, -1 do
135215local child = entities[i]
135315world_delete(world, child)
1354N/Aend
13558break
13560else
135712if not ids then
13586ids = {}
1359N/Aend
136012ids[id] = true
136112removal_queued = true
1362N/Aend
1363N/Aend
1364N/A
136518if not removal_queued then
13660continue
1367N/Aend
136810if not children then
13696children = {}
1370N/Aend
137110local n = #entities
137210table.move(entities, 1, n, count + 1, children)
137310count += n
1374N/Aend
1375N/A
137613if ids then
13776for _, child in children do
137817for id in ids do
137919world_remove(world, child, id)
1380N/Aend
1381N/Aend
1382N/Aend
1383N/A
138413for archetype_id in archetype_ids do
138520archetype_destroy(world, archetypes[archetype_id])
1386N/Aend
1387N/Aend
1388N/A
138965683if idr_r then
13900local archetype_ids = idr_r.cache
13910local flags = idr_r.flags
13920if bit32.band(flags, ECS_ID_DELETE) ~= 0 then
13930for archetype_id in archetype_ids do
13940local idr_r_archetype = archetypes[archetype_id]
13950local entities = idr_r_archetype.entities
13960local n = #entities
13970for i = n, 1, -1 do
13980world_delete(world, entities[i])
1399N/Aend
14000archetype_destroy(world, idr_r_archetype)
1401N/Aend
14020else
14030local children = {}
14040local count = 0
14050local ids = {}
14060for archetype_id in archetype_ids do
14070local idr_r_archetype = archetypes[archetype_id]
14080local entities = idr_r_archetype.entities
14090local tr = idr_r_archetype.records[rel]
14100local tr_count = idr_r_archetype.counts[rel]
14110local types = idr_r_archetype.types
14120for i = tr, tr_count - 1 do
14130ids[types[tr]] = true
1414N/Aend
14150local n = #entities
14160table.move(entities, 1, n, count + 1, children)
14170count += n
1418N/Aend
1419N/A
14200for _, child in children do
14210for id in ids do
14220world_remove(world, child, id)
1423N/Aend
1424N/Aend
1425N/A
14260for archetype_id in archetype_ids do
14270archetype_destroy(world, archetypes[archetype_id])
1428N/Aend
1429N/Aend
1430N/Aend
1431N/A
143265683local dense_array = entity_index.dense_array
143365683local index_of_deleted_entity = record.dense
143465683local index_of_last_alive_entity = entity_index.alive_count
143565683entity_index.alive_count = index_of_last_alive_entity - 1
1436N/A
143765683local last_alive_entity = dense_array[index_of_last_alive_entity]
143865683local r_swap = entity_index_try_get_any(entity_index, last_alive_entity) :: ecs_record_t
143965683r_swap.dense = index_of_deleted_entity
144065683record.archetype = nil :: any
144165683record.row = nil :: any
144265683record.dense = index_of_last_alive_entity
1443N/A
144465683dense_array[index_of_deleted_entity] = last_alive_entity
144565683dense_array[index_of_last_alive_entity] = ECS_GENERATION_INC(entity)
1446N/Aend
1447N/A
14481local function world_contains(world: ecs_world_t, entity): boolean
1449145return entity_index_is_alive(world.entity_index, entity)
1450N/Aend
1451N/A
14521local function NOOP() end
1453N/A
14540export type QueryInner = {
14550compatible_archetypes: { Archetype },
14560ids: { i53 },
14570filter_with: { i53 },
14580filter_without: { i53 },
14590next: () -> (number, ...any),
14600world: World,
14610}
1462N/A
14631local function query_iter_init(query: ecs_query_data_t): () -> (number, ...any)
146426local world_query_iter_next
1465N/A
146626local compatible_archetypes = query.compatible_archetypes
146726local lastArchetype = 1
146826local archetype = compatible_archetypes[1]
146926if not archetype then
14704return NOOP :: () -> (number, ...any)
1471N/Aend
147222local columns = archetype.columns
147322local entities = archetype.entities
147422local i = #entities
147522local records = archetype.records
1476N/A
147722local ids = query.ids
147822local A, B, C, D, E, F, G, H, I = unpack(ids)
147922local a: Column, b: Column, c: Column, d: Column
148022local e: Column, f: Column, g: Column, h: Column
1481N/A
148222if not B then
148317a = columns[records[A]]
14845elseif not C then
14853a = columns[records[A]]
14863b = columns[records[B]]
14872elseif not D then
14880a = columns[records[A]]
14890b = columns[records[B]]
14900c = columns[records[C]]
14912elseif not E then
14921a = columns[records[A]]
14931b = columns[records[B]]
14941c = columns[records[C]]
14951d = columns[records[D]]
14961elseif not F then
14970a = columns[records[A]]
14980b = columns[records[B]]
14990c = columns[records[C]]
15000d = columns[records[D]]
15010e = columns[records[E]]
15021elseif not G then
15030a = columns[records[A]]
15040b = columns[records[B]]
15050c = columns[records[C]]
15060d = columns[records[D]]
15070e = columns[records[E]]
15080f = columns[records[F]]
15091elseif not H then
15100a = columns[records[A]]
15110b = columns[records[B]]
15120c = columns[records[C]]
15130d = columns[records[D]]
15140e = columns[records[E]]
15150f = columns[records[F]]
15160g = columns[records[G]]
15171elseif not I then
15180a = columns[records[A]]
15190b = columns[records[B]]
15200c = columns[records[C]]
15210d = columns[records[D]]
15220e = columns[records[E]]
15230f = columns[records[F]]
15240g = columns[records[G]]
15250h = columns[records[H]]
1526N/Aend
1527N/A
152822if not B then
152917function world_query_iter_next(): any
1530556local entity = entities[i]
1531556while entity == nil do
153226lastArchetype += 1
153326archetype = compatible_archetypes[lastArchetype]
153426if not archetype then
153518return nil
1536N/Aend
1537N/A
15388entities = archetype.entities
15398i = #entities
15408if i == 0 then
15410continue
1542N/Aend
15438entity = entities[i]
15448columns = archetype.columns
15458records = archetype.records
15468a = columns[records[A]]
1547N/Aend
1548N/A
1549538local row = i
1550538i -= 1
1551N/A
1552538return entity, a[row]
1553N/Aend
15545elseif not C then
15553function world_query_iter_next(): any
15567local entity = entities[i]
15577while entity == nil do
15583lastArchetype += 1
15593archetype = compatible_archetypes[lastArchetype]
15603if not archetype then
15613return nil
1562N/Aend
1563N/A
15640entities = archetype.entities
15650i = #entities
15660if i == 0 then
15670continue
1568N/Aend
15690entity = entities[i]
15700columns = archetype.columns
15710records = archetype.records
15720a = columns[records[A]]
15730b = columns[records[B]]
1574N/Aend
1575N/A
15764local row = i
15774i -= 1
1578N/A
15794return entity, a[row], b[row]
1580N/Aend
15812elseif not D then
15820function world_query_iter_next(): any
15830local entity = entities[i]
15840while entity == nil do
15850lastArchetype += 1
15860archetype = compatible_archetypes[lastArchetype]
15870if not archetype then
15880return nil
1589N/Aend
1590N/A
15910entities = archetype.entities
15920i = #entities
15930if i == 0 then
15940continue
1595N/Aend
15960entity = entities[i]
15970columns = archetype.columns
15980records = archetype.records
15990a = columns[records[A]]
16000b = columns[records[B]]
16010c = columns[records[C]]
1602N/Aend
1603N/A
16040local row = i
16050i -= 1
1606N/A
16070return entity, a[row], b[row], c[row]
1608N/Aend
16092elseif not E then
16101function world_query_iter_next(): any
16112local entity = entities[i]
16122while entity == nil do
16131lastArchetype += 1
16141archetype = compatible_archetypes[lastArchetype]
16151if not archetype then
16161return nil
1617N/Aend
1618N/A
16190entities = archetype.entities
16200i = #entities
16210if i == 0 then
16220continue
1623N/Aend
16240entity = entities[i]
16250columns = archetype.columns
16260records = archetype.records
16270a = columns[records[A]]
16280b = columns[records[B]]
16290c = columns[records[C]]
16300d = columns[records[D]]
1631N/Aend
1632N/A
16331local row = i
16341i -= 1
1635N/A
16361return entity, a[row], b[row], c[row], d[row]
1637N/Aend
16381elseif not F then
16390function world_query_iter_next(): any
16400local entity = entities[i]
16410while entity == nil do
16420lastArchetype += 1
16430archetype = compatible_archetypes[lastArchetype]
16440if not archetype then
16450return nil
1646N/Aend
1647N/A
16480entities = archetype.entities
16490i = #entities
16500if i == 0 then
16510continue
1652N/Aend
16530entity = entities[i]
16540columns = archetype.columns
16550records = archetype.records
16560a = columns[records[A]]
16570b = columns[records[B]]
16580c = columns[records[C]]
16590d = columns[records[D]]
16600e = columns[records[E]]
1661N/Aend
1662N/A
16630local row = i
16640i -= 1
1665N/A
16660return entity, a[row], b[row], c[row], d[row], e[row]
1667N/Aend
16681elseif not G then
16690function world_query_iter_next(): any
16700local entity = entities[i]
16710while entity == nil do
16720lastArchetype += 1
16730archetype = compatible_archetypes[lastArchetype]
16740if not archetype then
16750return nil
1676N/Aend
1677N/A
16780entities = archetype.entities
16790i = #entities
16800if i == 0 then
16810continue
1682N/Aend
16830entity = entities[i]
16840columns = archetype.columns
16850records = archetype.records
16860a = columns[records[A]]
16870b = columns[records[B]]
16880c = columns[records[C]]
16890d = columns[records[D]]
16900e = columns[records[E]]
16910f = columns[records[F]]
1692N/Aend
1693N/A
16940local row = i
16950i -= 1
1696N/A
16970return entity, a[row], b[row], c[row], d[row], e[row], f[row]
1698N/Aend
16991elseif not H then
17000function world_query_iter_next(): any
17010local entity = entities[i]
17020while entity == nil do
17030lastArchetype += 1
17040archetype = compatible_archetypes[lastArchetype]
17050if not archetype then
17060return nil
1707N/Aend
1708N/A
17090entities = archetype.entities
17100i = #entities
17110if i == 0 then
17120continue
1713N/Aend
17140entity = entities[i]
17150columns = archetype.columns
17160records = archetype.records
17170a = columns[records[A]]
17180b = columns[records[B]]
17190c = columns[records[C]]
17200d = columns[records[D]]
17210e = columns[records[E]]
17220f = columns[records[F]]
17230g = columns[records[G]]
1724N/Aend
1725N/A
17260local row = i
17270i -= 1
1728N/A
17290return entity, a[row], b[row], c[row], d[row], e[row], f[row], g[row]
1730N/Aend
17311elseif not I then
17320function world_query_iter_next(): any
17330local entity = entities[i]
17340while entity == nil do
17350lastArchetype += 1
17360archetype = compatible_archetypes[lastArchetype]
17370if not archetype then
17380return nil
1739N/Aend
1740N/A
17410entities = archetype.entities
17420i = #entities
17430if i == 0 then
17440continue
1745N/Aend
17460entity = entities[i]
17470columns = archetype.columns
17480records = archetype.records
17490a = columns[records[A]]
17500b = columns[records[B]]
17510c = columns[records[C]]
17520d = columns[records[D]]
17530e = columns[records[E]]
17540f = columns[records[F]]
17550g = columns[records[G]]
17560h = columns[records[H]]
1757N/Aend
1758N/A
17590local row = i
17600i -= 1
1761N/A
17620return entity, a[row], b[row], c[row], d[row], e[row], f[row], g[row], h[row]
1763N/Aend
17640else
17651local output = {}
17661function world_query_iter_next(): any
17672local entity = entities[i]
17682while entity == nil do
17691lastArchetype += 1
17701archetype = compatible_archetypes[lastArchetype]
17711if not archetype then
17721return nil
1773N/Aend
1774N/A
17750entities = archetype.entities
17760i = #entities
17770if i == 0 then
17780continue
1779N/Aend
17800entity = entities[i]
17810columns = archetype.columns
17820records = archetype.records
1783N/Aend
1784N/A
17851local row = i
17861i -= 1
1787N/A
17881for j, id in ids do
17899output[j] = columns[records[id]][row]
1790N/Aend
1791N/A
17921return entity, unpack(output)
1793N/Aend
1794N/Aend
1795N/A
179622query.next = world_query_iter_next
179722return world_query_iter_next
1798N/Aend
1799N/A
18001local function query_iter(query): () -> (number, ...any)
180120local query_next = query.next
180220if not query_next then
180319query_next = query_iter_init(query)
1804N/Aend
180520return query_next
1806N/Aend
1807N/A
18081local function query_without(query: ecs_query_data_t, ...: i53)
18096local without = { ... }
18106query.filter_without = without
18116local compatible_archetypes = query.compatible_archetypes
18126for i = #compatible_archetypes, 1, -1 do
18133local archetype = compatible_archetypes[i]
18143local records = archetype.records
18153local matches = true
1816N/A
18173for _, id in without do
18183if records[id] then
18192matches = false
18202break
1821N/Aend
1822N/Aend
1823N/A
18243if matches then
18250continue
1826N/Aend
1827N/A
18282local last = #compatible_archetypes
18292if last ~= i then
18300compatible_archetypes[i] = compatible_archetypes[last]
1831N/Aend
18322compatible_archetypes[last] = nil :: any
1833N/Aend
1834N/A
18356return query :: any
1836N/Aend
1837N/A
18381local function query_with(query: ecs_query_data_t, ...: i53)
18391local compatible_archetypes = query.compatible_archetypes
18401local with = { ... }
18411query.filter_with = with
1842N/A
18431for i = #compatible_archetypes, 1, -1 do
18440local archetype = compatible_archetypes[i]
18450local records = archetype.records
18460local matches = true
1847N/A
18480for _, id in with do
18490if not records[id] then
18500matches = false
18510break
1852N/Aend
1853N/Aend
1854N/A
18550if matches then
18560continue
1857N/Aend
1858N/A
18590local last = #compatible_archetypes
18600if last ~= i then
18610compatible_archetypes[i] = compatible_archetypes[last]
1862N/Aend
18630compatible_archetypes[last] = nil :: any
1864N/Aend
1865N/A
18661return query :: any
1867N/Aend
1868N/A
1869N/A-- Meant for directly iterating over archetypes to minimize
1870N/A-- function call overhead. Should not be used unless iterating over
1871N/A-- hundreds of thousands of entities in bulk.
18721local function query_archetypes(query)
18735return query.compatible_archetypes
1874N/Aend
1875N/A
18761local function query_cached(query: ecs_query_data_t)
18776local with = query.filter_with
18786local ids = query.ids
18796if with then
18801table.move(ids, 1, #ids, #with + 1, with)
18810else
18825query.filter_with = ids
1883N/Aend
1884N/A
18856local compatible_archetypes = query.compatible_archetypes
18866local lastArchetype = 1
1887N/A
18886local A, B, C, D, E, F, G, H, I = unpack(ids)
18896local a: Column, b: Column, c: Column, d: Column
18906local e: Column, f: Column, g: Column, h: Column
1891N/A
18926local world_query_iter_next
18936local columns: { Column }
18946local entities: { number }
18956local i: number
18966local archetype: ecs_archetype_t
18976local records: { number }
18986local archetypes = query.compatible_archetypes
1899N/A
19006local world = query.world :: { observable: ecs_observable_t }
1901N/A-- Only need one observer for EcsArchetypeCreate and EcsArchetypeDelete respectively
1902N/A-- because the event will be emitted for all components of that Archetype.
19036local observable = world.observable :: ecs_observable_t
19046local on_create_action = observable[EcsOnArchetypeCreate]
19056if not on_create_action then
19066on_create_action = {}
19076observable[EcsOnArchetypeCreate] = on_create_action
1908N/Aend
19096local query_cache_on_create = on_create_action[A]
19106if not query_cache_on_create then
19116query_cache_on_create = {}
19126on_create_action[A] = query_cache_on_create
1913N/Aend
1914N/A
19156local on_delete_action = observable[EcsOnArchetypeDelete]
19166if not on_delete_action then
19176on_delete_action = {}
19186observable[EcsOnArchetypeDelete] = on_delete_action
1919N/Aend
19206local query_cache_on_delete = on_delete_action[A]
19216if not query_cache_on_delete then
19226query_cache_on_delete = {}
19236on_delete_action[A] = query_cache_on_delete
1924N/Aend
1925N/A
19266local function on_create_callback(archetype)
19274table.insert(archetypes, archetype)
1928N/Aend
1929N/A
19306local function on_delete_callback(archetype)
19311local i = table.find(archetypes, archetype) :: number
19321local n = #archetypes
19331archetypes[i] = archetypes[n]
19341archetypes[n] = nil
1935N/Aend
1936N/A
19376local observer_for_create = { query = query, callback = on_create_callback }
19386local observer_for_delete = { query = query, callback = on_delete_callback }
1939N/A
19406table.insert(query_cache_on_create, observer_for_create)
19416table.insert(query_cache_on_delete, observer_for_delete)
1942N/A
19436local function cached_query_iter()
194411lastArchetype = 1
194511archetype = compatible_archetypes[lastArchetype]
194611if not archetype then
19471return NOOP
1948N/Aend
194910entities = archetype.entities
195010i = #entities
195110records = archetype.records
195210columns = archetype.columns
195310if not B then
19546a = columns[records[A]]
19554elseif not C then
19564a = columns[records[A]]
19574b = columns[records[B]]
19580elseif not D then
19590a = columns[records[A]]
19600b = columns[records[B]]
19610c = columns[records[C]]
19620elseif not E then
19630a = columns[records[A]]
19640b = columns[records[B]]
19650c = columns[records[C]]
19660d = columns[records[D]]
19670elseif not F then
19680a = columns[records[A]]
19690b = columns[records[B]]
19700c = columns[records[C]]
19710d = columns[records[D]]
19720e = columns[records[E]]
19730elseif not G then
19740a = columns[records[A]]
19750b = columns[records[B]]
19760c = columns[records[C]]
19770d = columns[records[D]]
19780e = columns[records[E]]
19790f = columns[records[F]]
19800elseif not H then
19810a = columns[records[A]]
19820b = columns[records[B]]
19830c = columns[records[C]]
19840d = columns[records[D]]
19850e = columns[records[E]]
19860f = columns[records[F]]
19870g = columns[records[G]]
19880elseif not I then
19890a = columns[records[A]]
19900b = columns[records[B]]
19910c = columns[records[C]]
19920d = columns[records[D]]
19930e = columns[records[E]]
19940f = columns[records[F]]
19950g = columns[records[G]]
19960h = columns[records[H]]
1997N/Aend
1998N/A
199910return world_query_iter_next
2000N/Aend
2001N/A
20026if not B then
20035function world_query_iter_next(): any
200411local entity = entities[i]
200511while entity == nil do
20066lastArchetype += 1
20076archetype = compatible_archetypes[lastArchetype]
20086if not archetype then
20096return nil
2010N/Aend
2011N/A
20120entities = archetype.entities
20130i = #entities
20140if i == 0 then
20150continue
2016N/Aend
20170entity = entities[i]
20180columns = archetype.columns
20190records = archetype.records
20200a = columns[records[A]]
2021N/Aend
2022N/A
20235local row = i
20245i -= 1
2025N/A
20265return entity, a[row]
2027N/Aend
20281elseif not C then
20291function world_query_iter_next(): any
20308local entity = entities[i]
20318while entity == nil do
20324lastArchetype += 1
20334archetype = compatible_archetypes[lastArchetype]
20344if not archetype then
20354return nil
2036N/Aend
2037N/A
20380entities = archetype.entities
20390i = #entities
20400if i == 0 then
20410continue
2042N/Aend
20430entity = entities[i]
20440columns = archetype.columns
20450records = archetype.records
20460a = columns[records[A]]
20470b = columns[records[B]]
2048N/Aend
2049N/A
20504local row = i
20514i -= 1
2052N/A
20534return entity, a[row], b[row]
2054N/Aend
20550elseif not D then
20560function world_query_iter_next(): any
20570local entity = entities[i]
20580while entity == nil do
20590lastArchetype += 1
20600archetype = compatible_archetypes[lastArchetype]
20610if not archetype then
20620return nil
2063N/Aend
2064N/A
20650entities = archetype.entities
20660i = #entities
20670if i == 0 then
20680continue
2069N/Aend
20700entity = entities[i]
20710columns = archetype.columns
20720records = archetype.records
20730a = columns[records[A]]
20740b = columns[records[B]]
20750c = columns[records[C]]
2076N/Aend
2077N/A
20780local row = i
20790i -= 1
2080N/A
20810return entity, a[row], b[row], c[row]
2082N/Aend
20830elseif not E then
20840function world_query_iter_next(): any
20850local entity = entities[i]
20860while entity == nil do
20870lastArchetype += 1
20880archetype = compatible_archetypes[lastArchetype]
20890if not archetype then
20900return nil
2091N/Aend
2092N/A
20930entities = archetype.entities
20940i = #entities
20950if i == 0 then
20960continue
2097N/Aend
20980entity = entities[i]
20990columns = archetype.columns
21000records = archetype.records
21010a = columns[records[A]]
21020b = columns[records[B]]
21030c = columns[records[C]]
21040d = columns[records[D]]
2105N/Aend
2106N/A
21070local row = i
21080i -= 1
2109N/A
21100return entity, a[row], b[row], c[row], d[row]
2111N/Aend
21120elseif not F then
21130function world_query_iter_next(): any
21140local entity = entities[i]
21150while entity == nil do
21160lastArchetype += 1
21170archetype = compatible_archetypes[lastArchetype]
21180if not archetype then
21190return nil
2120N/Aend
2121N/A
21220entities = archetype.entities
21230i = #entities
21240if i == 0 then
21250continue
2126N/Aend
21270entity = entities[i]
21280columns = archetype.columns
21290records = archetype.records
21300a = columns[records[A]]
21310b = columns[records[B]]
21320c = columns[records[C]]
21330d = columns[records[D]]
21340e = columns[records[E]]
2135N/Aend
2136N/A
21370local row = i
21380i -= 1
2139N/A
21400return entity, a[row], b[row], c[row], d[row], e[row]
2141N/Aend
21420elseif not G then
21430function world_query_iter_next(): any
21440local entity = entities[i]
21450while entity == nil do
21460lastArchetype += 1
21470archetype = compatible_archetypes[lastArchetype]
21480if not archetype then
21490return nil
2150N/Aend
2151N/A
21520entities = archetype.entities
21530i = #entities
21540if i == 0 then
21550continue
2156N/Aend
21570entity = entities[i]
21580columns = archetype.columns
21590records = archetype.records
21600a = columns[records[A]]
21610b = columns[records[B]]
21620c = columns[records[C]]
21630d = columns[records[D]]
21640e = columns[records[E]]
21650f = columns[records[F]]
2166N/Aend
2167N/A
21680local row = i
21690i -= 1
2170N/A
21710return entity, a[row], b[row], c[row], d[row], e[row], f[row]
2172N/Aend
21730elseif not H then
21740function world_query_iter_next(): any
21750local entity = entities[i]
21760while entity == nil do
21770lastArchetype += 1
21780archetype = compatible_archetypes[lastArchetype]
21790if not archetype then
21800return nil
2181N/Aend
2182N/A
21830entities = archetype.entities
21840i = #entities
21850if i == 0 then
21860continue
2187N/Aend
21880entity = entities[i]
21890columns = archetype.columns
21900records = archetype.records
21910a = columns[records[A]]
21920b = columns[records[B]]
21930c = columns[records[C]]
21940d = columns[records[D]]
21950e = columns[records[E]]
21960f = columns[records[F]]
21970g = columns[records[G]]
2198N/Aend
2199N/A
22000local row = i
22010i -= 1
2202N/A
22030return entity, a[row], b[row], c[row], d[row], e[row], f[row], g[row]
2204N/Aend
22050elseif not I then
22060function world_query_iter_next(): any
22070local entity = entities[i]
22080while entity == nil do
22090lastArchetype += 1
22100archetype = compatible_archetypes[lastArchetype]
22110if not archetype then
22120return nil
2213N/Aend
2214N/A
22150entities = archetype.entities
22160i = #entities
22170if i == 0 then
22180continue
2219N/Aend
22200entity = entities[i]
22210columns = archetype.columns
22220records = archetype.records
22230a = columns[records[A]]
22240b = columns[records[B]]
22250c = columns[records[C]]
22260d = columns[records[D]]
22270e = columns[records[E]]
22280f = columns[records[F]]
22290g = columns[records[G]]
22300h = columns[records[H]]
2231N/Aend
2232N/A
22330local row = i
22340i -= 1
2235N/A
22360return entity, a[row], b[row], c[row], d[row], e[row], f[row], g[row], h[row]
2237N/Aend
22380else
22390local queryOutput = {}
22400function world_query_iter_next(): any
22410local entity = entities[i]
22420while entity == nil do
22430lastArchetype += 1
22440archetype = compatible_archetypes[lastArchetype]
22450if not archetype then
22460return nil
2247N/Aend
2248N/A
22490entities = archetype.entities
22500i = #entities
22510if i == 0 then
22520continue
2253N/Aend
22540entity = entities[i]
22550columns = archetype.columns
22560records = archetype.records
2257N/Aend
2258N/A
22590local row = i
22600i -= 1
2261N/A
22620if not F then
22630return entity, a[row], b[row], c[row], d[row], e[row]
22640elseif not G then
22650return entity, a[row], b[row], c[row], d[row], e[row], f[row]
22660elseif not H then
22670return entity, a[row], b[row], c[row], d[row], e[row], f[row], g[row]
22680elseif not I then
22690return entity, a[row], b[row], c[row], d[row], e[row], f[row], g[row], h[row]
2270N/Aend
2271N/A
22720for j, id in ids do
22730queryOutput[j] = columns[records[id]][row]
2274N/Aend
2275N/A
22760return entity, unpack(queryOutput)
2277N/Aend
2278N/Aend
2279N/A
22806local cached_query = query :: any
22816cached_query.archetypes = query_archetypes
22826cached_query.__iter = cached_query_iter
22836cached_query.iter = cached_query_iter
22846setmetatable(cached_query, cached_query)
22856return cached_query
2286N/Aend
2287N/A
22881local Query = {}
22891Query.__index = Query
22901Query.__iter = query_iter
22911Query.iter = query_iter_init
22921Query.without = query_without
22931Query.with = query_with
22941Query.archetypes = query_archetypes
22951Query.cached = query_cached
2296N/A
22971local function world_query(world: ecs_world_t, ...)
229833local compatible_archetypes = {}
229933local length = 0
2300N/A
230133local ids = { ... }
2302N/A
230333local archetypes = world.archetypes
2304N/A
230533local idr: ecs_id_record_t?
230633local component_index = world.component_index
2307N/A
230833local q = setmetatable({
230933ids = ids,
231033compatible_archetypes = compatible_archetypes,
231133world = world,
231233}, Query)
2313N/A
231433for _, id in ids do
231547local map = component_index[id]
231647if not map then
23177return q
2318N/Aend
2319N/A
232040if idr == nil or map.size < idr.size then
232127idr = map
2322N/Aend
2323N/Aend
2324N/A
232526if not idr then
23260return q
2327N/Aend
2328N/A
232926for archetype_id in idr.cache do
233048local compatibleArchetype = archetypes[archetype_id]
233148if #compatibleArchetype.entities == 0 then
23320continue
2333N/Aend
233434local records = compatibleArchetype.records
2335N/A
233634local skip = false
2337N/A
233834for i, id in ids do
233947local tr = records[id]
234047if not tr then
23410skip = true
23420break
2343N/Aend
2344N/Aend
2345N/A
234634if skip then
23470continue
2348N/Aend
2349N/A
235034length += 1
235134compatible_archetypes[length] = compatibleArchetype
2352N/Aend
2353N/A
235426return q
2355N/Aend
2356N/A
23571local function world_each(world: ecs_world_t, id: i53): () -> ()
23582local idr = world.component_index[id]
23592if not idr then
23600return NOOP
2361N/Aend
2362N/A
23632local idr_cache = idr.cache
23642local archetypes = world.archetypes
23652local archetype_id = next(idr_cache, nil) :: number
23662local archetype = archetypes[archetype_id]
23672if not archetype then
23680return NOOP
2369N/Aend
2370N/A
23712local entities = archetype.entities
23722local row = #entities
2373N/A
23742return function(): any
237512local entity = entities[row]
237612while not entity do
237711archetype_id = next(idr_cache, archetype_id) :: number
237811if not archetype_id then
23794return
2380N/Aend
23817archetype = archetypes[archetype_id]
23827entities = archetype.entities
23837row = #entities
23847entity = entities[row]
2385N/Aend
23868row -= 1
23878return entity
2388N/Aend
2389N/Aend
2390N/A
23911local function world_children(world: ecs_world_t, parent: i53)
23922return world_each(world, ECS_PAIR(EcsChildOf, parent))
2393N/Aend
2394N/A
23950export type Record = {
23960archetype: Archetype,
23970row: number,
23980dense: i24,
23990}
24000export type ComponentRecord = {
24010cache: { [Id]: number },
24020counts: { [Id]: number },
24030flags: number,
24040size: number,
24050hooks: {
24060on_add: ((entity: Entity) -> ())?,
24070on_set: ((entity: Entity, data: any) -> ())?,
24080on_remove: ((entity: Entity) -> ())?,
24090},
24100}
24110export type ComponentIndex = Map
24120export type Archetypes = { [Id]: Archetype }
2413N/A
24140export type EntityIndex = {
24150dense_array: Map,
24160sparse_array: Map,
24170alive_count: number,
24180max_id: number,
24190}
2420N/A
24211local World = {}
24221World.__index = World
2423N/A
24241World.entity = world_entity
24251World.query = world_query
24261World.remove = world_remove
24271World.clear = world_clear
24281World.delete = world_delete
24291World.component = world_component
24301World.add = world_add
24311World.set = world_set
24321World.get = world_get
24331World.has = world_has
24341World.target = world_target
24351World.parent = world_parent
24361World.contains = world_contains
24371World.cleanup = world_cleanup
24381World.each = world_each
24391World.children = world_children
2440N/A
24411local function world_new()
244273local entity_index = {
244373dense_array = {},
244473sparse_array = {},
244573alive_count = 0,
244673max_id = 0,
24470} :: ecs_entity_index_t
244873local self = setmetatable({
244973archetype_index = {} :: { [string]: Archetype },
245073archetypes = {} :: Archetypes,
245173component_index = {} :: ComponentIndex,
245273entity_index = entity_index,
245373ROOT_ARCHETYPE = (nil :: any) :: Archetype,
2454N/A
245573max_archetype_id = 0,
245673max_component_id = 0,
2457N/A
245873observable = {} :: Observable,
245973}, World) :: any
2460N/A
246173self.ROOT_ARCHETYPE = archetype_create(self, {}, "")
2462N/A
246373for i = 1, HI_COMPONENT_ID do
246418688local e = entity_index_new_id(entity_index)
246518688world_add(self, e, EcsComponent)
2466N/Aend
2467N/A
246873for i = HI_COMPONENT_ID + 1, EcsRest do
2469N/A-- Initialize built-in components
24701022entity_index_new_id(entity_index)
2471N/Aend
2472N/A
247373world_add(self, EcsName, EcsComponent)
247473world_add(self, EcsOnSet, EcsComponent)
247573world_add(self, EcsOnAdd, EcsComponent)
247673world_add(self, EcsOnRemove, EcsComponent)
247773world_add(self, EcsWildcard, EcsComponent)
247873world_add(self, EcsRest, EcsComponent)
2479N/A
248073world_set(self, EcsOnAdd, EcsName, "jecs.OnAdd")
248173world_set(self, EcsOnRemove, EcsName, "jecs.OnRemove")
248273world_set(self, EcsOnSet, EcsName, "jecs.OnSet")
248373world_set(self, EcsWildcard, EcsName, "jecs.Wildcard")
248473world_set(self, EcsChildOf, EcsName, "jecs.ChildOf")
248573world_set(self, EcsComponent, EcsName, "jecs.Component")
248673world_set(self, EcsOnDelete, EcsName, "jecs.OnDelete")
248773world_set(self, EcsOnDeleteTarget, EcsName, "jecs.OnDeleteTarget")
248873world_set(self, EcsDelete, EcsName, "jecs.Delete")
248973world_set(self, EcsRemove, EcsName, "jecs.Remove")
249073world_set(self, EcsName, EcsName, "jecs.Name")
249173world_set(self, EcsRest, EcsRest, "jecs.Rest")
2492N/A
249373world_add(self, EcsChildOf, ECS_PAIR(EcsOnDeleteTarget, EcsDelete))
2494N/A
249573return self
2496N/Aend
2497N/A
24981World.new = world_new
2499N/A
25000export type Entity = { __T: T }
25010export type Id = { __T: T }
25020export type Pair = Id

25030type ecs_id_t = Id | Pair | Pair<"Tag", T>
25040export type Item = (self: Query) -> (Entity, T...)
25050export type Iter = (query: Query) -> () -> (Entity, T...)
2506N/A
25070export type Query = typeof(setmetatable({}, {
25080__iter = (nil :: any) :: Iter,
25090})) & {
25100iter: Iter,
25110with: (self: Query, ...Id) -> Query,
25120without: (self: Query, ...Id) -> Query,
25130archetypes: (self: Query) -> { Archetype },
25140cached: (self: Query) -> Query,
25150}
2516N/A
25170export type Observer = {
25180callback: (archetype: Archetype) -> (),
25190query: QueryInner,
25200}
2521N/A
25220export type Observable = {
25230[Id]: {
25240[Id]: {
25250{ Observer }
25260}
25270}
25280}
2529N/A
25300export type World = {
25310archetype_index: { [string]: Archetype },
25320archetypes: Archetypes,
25330component_index: ComponentIndex,
25340entity_index: EntityIndex,
25350ROOT_ARCHETYPE: Archetype,
2536N/A
25370max_component_id: number,
25380max_archetype_id: number,
2539N/A
25400observable: any,
2541N/A
2542N/A--- Creates a new entity
25430entity: (self: World, id: Entity?) -> Entity,
2544N/A--- Creates a new entity located in the first 256 ids.
2545N/A--- These should be used for static components for fast access.
25460component: (self: World) -> Entity,
2547N/A--- Gets the target of an relationship. For example, when a user calls
2548N/A--- `world:target(id, ChildOf(parent), 0)`, you will obtain the parent entity.
25490target: (self: World, id: Entity, relation: Id, index: number?) -> Entity?,
2550N/A--- Deletes an entity and all it's related components and relationships.
25510delete: (self: World, id: Entity) -> (),
2552N/A
2553N/A--- Adds a component to the entity with no value
25540add: (self: World, id: Entity, component: Id) -> (),
2555N/A--- Assigns a value to a component on the given entity
25560set: (self: World, id: Entity, component: Id, data: T) -> (),
2557N/A
25580cleanup: (self: World) -> (),
2559N/A-- Clears an entity from the world
25600clear: (self: World, id: Entity) -> (),
2561N/A--- Removes a component from the given entity
25620remove: (self: World, id: Entity, component: Id) -> (),
2563N/A--- Retrieves the value of up to 4 components. These values may be nil.
25640get: ((self: World, id: Entity, Id) -> A?)
25650& ((self: World, id: Entity, Id, Id) -> (A?, B?))
25660& ((self: World, id: Entity, Id, Id, Id) -> (A?, B?, C?))
25670& (self: World, id: Entity, Id, Id, Id, Id) -> (A?, B?, C?, D?),
2568N/A
2569N/A--- Returns whether the entity has the ID.
25700has: (self: World, entity: Entity, ...Id) -> boolean,
2571N/A
2572N/A--- Get parent (target of ChildOf relationship) for entity. If there is no ChildOf relationship pair, it will return nil.
25730parent:(self: World, entity: Entity) -> Entity,
2574N/A
2575N/A--- Checks if the world contains the given entity
25760contains:(self: World, entity: Entity) -> boolean,
2577N/A
25780each: (self: World, id: Id) -> () -> Entity,
2579N/A
25800children: (self: World, id: Id) -> () -> Entity,
2581N/A
2582N/A--- Searches the world for entities that match a given query
25830query: ((World, Id) -> Query)
25840& ((World, Id, Id) -> Query)
25850& ((World, Id, Id, Id) -> Query)
25860& ((World, Id, Id, Id, Id) -> Query)
25870& ((World, Id, Id, Id, Id, Id) -> Query)
25880& ((World, Id, Id, Id, Id, Id, Id) -> Query)
25890& ((World, Id, Id, Id, Id, Id, Id, Id) -> Query)
25900& ((World, Id, Id, Id, Id, Id, Id, Id, Id, ...Id) -> Query)
25910}
2592N/A-- type function ecs_id_t(entity)
2593N/A-- local ty = entity:components()[2]
2594N/A-- local __T = ty:readproperty(types.singleton("__T"))
2595N/A-- if not __T then
2596N/A-- return ty:readproperty(types.singleton("__jecs_pair_value"))
2597N/A-- end
2598N/A-- return __T
2599N/A-- end
2600N/A
2601N/A-- type function ecs_pair_t(first, second)
2602N/A-- if ecs_id_t(first):is("nil") then
2603N/A-- return second
2604N/A-- else
2605N/A-- return first
2606N/A-- end
2607N/A-- end
2608N/A
26091return {
26101World = World :: { new: () -> World },
26111world = World.new :: () -> World,
2612N/A
26131OnAdd = EcsOnAdd :: Entity<(entity: Entity) -> ()>,
26141OnRemove = EcsOnRemove :: Entity<(entity: Entity) -> ()>,
26151OnSet = EcsOnSet :: Entity<(entity: Entity, data: any) -> ()>,
26161ChildOf = EcsChildOf :: Entity,
26171Component = EcsComponent :: Entity,
26181Wildcard = EcsWildcard :: Entity,
26191w = EcsWildcard :: Entity,
26201OnDelete = EcsOnDelete :: Entity,
26211OnDeleteTarget = EcsOnDeleteTarget :: Entity,
26221Delete = EcsDelete :: Entity,
26231Remove = EcsRemove :: Entity,
26241Name = EcsName :: Entity,
26251Rest = EcsRest :: Entity,
2626N/A
26271pair = (ECS_PAIR :: any) :: (first: Id

, second: Id) -> Pair,

2628N/A
2629N/A-- Inwards facing API for testing
26301ECS_ID = ECS_ENTITY_T_LO,
26311ECS_GENERATION_INC = ECS_GENERATION_INC,
26321ECS_GENERATION = ECS_GENERATION,
26331ECS_ID_IS_WILDCARD = ECS_ID_IS_WILDCARD,
2634N/A
26351ECS_ID_DELETE = ECS_ID_DELETE,
2636N/A
26371IS_PAIR = ECS_IS_PAIR,
26381pair_first = ecs_pair_first,
26391pair_second = ecs_pair_second,
26401entity_index_get_alive = entity_index_get_alive,
2641N/A
26421archetype_append_to_records = archetype_append_to_records,
26431id_record_ensure = id_record_ensure,
26441archetype_create = archetype_create,
26451archetype_ensure = archetype_ensure,
26461find_insert = find_insert,
26471find_archetype_with = find_archetype_with,
26481find_archetype_without = find_archetype_without,
26491archetype_init_edge = archetype_init_edge,
26501archetype_ensure_edge = archetype_ensure_edge,
26511init_edge_for_add = init_edge_for_add,
26521init_edge_for_remove = init_edge_for_remove,
26531create_edge_for_add = create_edge_for_add,
26541create_edge_for_remove = create_edge_for_remove,
26551archetype_traverse_add = archetype_traverse_add,
26561archetype_traverse_remove = archetype_traverse_remove,
2657N/A
26581entity_move = entity_move,
2659N/A
26601entity_index_try_get = entity_index_try_get,
26611entity_index_try_get_any = entity_index_try_get_any,
26621entity_index_try_get_fast = entity_index_try_get_fast,
26631entity_index_is_alive = entity_index_is_alive,
26641entity_index_new_id = entity_index_new_id,
2665N/A
26661query_iter = query_iter,
26671query_iter_init = query_iter_init,
26681query_with = query_with,
26691query_without = query_without,
26701query_archetypes = query_archetypes,
26711query_match = query_match,
2672N/A
26731find_observers = find_observers,
26740}
\ No newline at end of file diff --git a/coverage/jecs/index-sort-f.html b/coverage/jecs/index-sort-f.html deleted file mode 100644 index 2defb16..0000000 --- a/coverage/jecs/index-sort-f.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecsCoverageTotalHit
Test:coverage.outLines:71.7 %14871066
Test Date:2025-03-27 03:52:25Functions:53.6 %9752
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Filename Sort by file nameLine Coverage Sort by line coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit
jecs.luau -
71.7%71.7%
-
71.7 %1487106653.6 %9752
-
-
- - - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/index-sort-l.html b/coverage/jecs/index-sort-l.html deleted file mode 100644 index 6cd5e18..0000000 --- a/coverage/jecs/index-sort-l.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecsCoverageTotalHit
Test:coverage.outLines:71.7 %14871066
Test Date:2025-03-27 03:52:25Functions:53.6 %9752
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Filename Sort by file nameLine Coverage Sort by line coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit
jecs.luau -
71.7%71.7%
-
71.7 %1487106653.6 %9752
-
-
- - - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/index.html b/coverage/jecs/index.html deleted file mode 100644 index 27e128f..0000000 --- a/coverage/jecs/index.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecsCoverageTotalHit
Test:coverage.outLines:71.7 %14871066
Test Date:2025-03-27 03:52:25Functions:53.6 %9752
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Filename Sort by file nameLine Coverage Sort by line coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit
jecs.luau -
71.7%71.7%
-
71.7 %1487106653.6 %9752
-
-
- - - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/jecs.luau.func-c.html b/coverage/jecs/jecs.luau.func-c.html deleted file mode 100644 index 2579973..0000000 --- a/coverage/jecs/jecs.luau.func-c.html +++ /dev/null @@ -1,754 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/jecs.luau - functions - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs - jecs.luau (source / functions)CoverageTotalHit
Test:coverage.outLines:71.7 %14871066
Test Date:2025-03-27 03:52:25Functions:53.6 %9752
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Function Name Sort by function nameHit count Sort by function hit count
ECS_COMBINE:144 0
ECS_ENTITY_T_HI:176 0
ECS_ID_IS_WILDCARD:541 0
ECS_PAIR_FIRST:187 0
ECS_PAIR_SECOND:191 0
NOOP:1326 0
archetype_append:390 0
archetype_append_to_records:610 0
archetype_disconnect_edge:1086 0
archetype_ensure:708 0
archetype_ensure_edge:780 0
archetype_fast_delete:1018 0
archetype_fast_delete_last:1010 0
archetype_init_edge:769 0
archetype_remove_edge:1097 0
create_edge_for_add:834 0
create_edge_for_remove:845 0
ecs_get_alive:244 0
entity_index_get_alive:236 0
entity_index_is_alive:232 0
entity_index_new_id:267 0
entity_index_try_get_fast:222 0
entity_move:411 0
fetch:429 0
find_archetype_with:734 0
find_insert:722 0
find_observers:321 0
hash:425 0
init_edge_for_add:794 0
init_edge_for_remove:811 0
new_entity:400 0
query_match:298 0
world_has_one_inline:471 0
world_query_iter_next:1458 0
world_query_iter_next:1515 0
world_query_iter_next:1545 0
world_query_iter_next:1576 0
world_query_iter_next:1608 0
world_query_iter_next:1932 0
world_query_iter_next:1960 0
world_query_iter_next:1989 0
world_query_iter_next:2019 0
world_query_iter_next:2050 0
world_query_iter_next:2082 0
world_query_iter_next:2116 0
<main> 1
ECS_GENERATION_INC:153 1
archetype_traverse_add:856 1
archetype_traverse_remove:872 1
on_delete_callback:1806 1
query_with:1714 1
world_cleanup:1171 1
world_parent:704 1
archetype_destroy:1135 2
world_children:2267 2
world_each:2233 2
world_query_iter_next:1486 2
world_query_iter_next:1642 2
entity_index_try_get:208 4
on_create_callback:1802 4
world_clear:1066 4
query_archetypes:1748 5
query_cached:1752 6
query_without:1684 6
world_query_iter_next:1431 7
world_query_iter_next:1905 8
cached_query_iter:1819 11
world_query_iter_next:1879 11
ECS_IS_PAIR:149 12
ecs_pair_first:288 12
find_archetype_without:752 12
ecs_pair_second:293 13
ECS_ENTITY_T_LO:168 14
ECS_GENERATION:172 15
archetype_clear_edges:1102 17
entity_index_try_get_any:195 19
query_iter:1676 20
<anonymous>:2250 24
query_iter_init:1339 26
world_query:2173 33
archetype_delete:1027 57
world_has:487 59
world_new:2317 72
world_component:973 108
world_contains:1322 137
ECS_PAIR:180 166
world_remove:985 281
world_query_iter_next:1405 556
id_record_ensure:547 674
world_get:440 718
archetype_create:635 936
world_target:509 1378
archetype_move:330 1778
world_set:921 2739
world_add:889 19044
world_delete:1192 65536
world_entity:700 66836
-
-
- - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/jecs.luau.func.html b/coverage/jecs/jecs.luau.func.html deleted file mode 100644 index 4ac54cd..0000000 --- a/coverage/jecs/jecs.luau.func.html +++ /dev/null @@ -1,754 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/jecs.luau - functions - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs - jecs.luau (source / functions)CoverageTotalHit
Test:coverage.outLines:71.7 %14871066
Test Date:2025-03-27 03:52:25Functions:53.6 %9752
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Function Name Sort by function nameHit count Sort by function hit count
<anonymous>:2250 24
<main> 1
ECS_COMBINE:144 0
ECS_ENTITY_T_HI:176 0
ECS_ENTITY_T_LO:168 14
ECS_GENERATION:172 15
ECS_GENERATION_INC:153 1
ECS_ID_IS_WILDCARD:541 0
ECS_IS_PAIR:149 12
ECS_PAIR:180 166
ECS_PAIR_FIRST:187 0
ECS_PAIR_SECOND:191 0
NOOP:1326 0
archetype_append:390 0
archetype_append_to_records:610 0
archetype_clear_edges:1102 17
archetype_create:635 936
archetype_delete:1027 57
archetype_destroy:1135 2
archetype_disconnect_edge:1086 0
archetype_ensure:708 0
archetype_ensure_edge:780 0
archetype_fast_delete:1018 0
archetype_fast_delete_last:1010 0
archetype_init_edge:769 0
archetype_move:330 1778
archetype_remove_edge:1097 0
archetype_traverse_add:856 1
archetype_traverse_remove:872 1
cached_query_iter:1819 11
create_edge_for_add:834 0
create_edge_for_remove:845 0
ecs_get_alive:244 0
ecs_pair_first:288 12
ecs_pair_second:293 13
entity_index_get_alive:236 0
entity_index_is_alive:232 0
entity_index_new_id:267 0
entity_index_try_get:208 4
entity_index_try_get_any:195 19
entity_index_try_get_fast:222 0
entity_move:411 0
fetch:429 0
find_archetype_with:734 0
find_archetype_without:752 12
find_insert:722 0
find_observers:321 0
hash:425 0
id_record_ensure:547 674
init_edge_for_add:794 0
init_edge_for_remove:811 0
new_entity:400 0
on_create_callback:1802 4
on_delete_callback:1806 1
query_archetypes:1748 5
query_cached:1752 6
query_iter:1676 20
query_iter_init:1339 26
query_match:298 0
query_with:1714 1
query_without:1684 6
world_add:889 19044
world_children:2267 2
world_cleanup:1171 1
world_clear:1066 4
world_component:973 108
world_contains:1322 137
world_delete:1192 65536
world_each:2233 2
world_entity:700 66836
world_get:440 718
world_has:487 59
world_has_one_inline:471 0
world_new:2317 72
world_parent:704 1
world_query:2173 33
world_query_iter_next:1405 556
world_query_iter_next:1431 7
world_query_iter_next:1458 0
world_query_iter_next:1486 2
world_query_iter_next:1515 0
world_query_iter_next:1545 0
world_query_iter_next:1576 0
world_query_iter_next:1608 0
world_query_iter_next:1642 2
world_query_iter_next:1879 11
world_query_iter_next:1905 8
world_query_iter_next:1932 0
world_query_iter_next:1960 0
world_query_iter_next:1989 0
world_query_iter_next:2019 0
world_query_iter_next:2050 0
world_query_iter_next:2082 0
world_query_iter_next:2116 0
world_remove:985 281
world_set:921 2739
world_target:509 1378
-
-
- - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/jecs.luau.gcov.html b/coverage/jecs/jecs.luau.gcov.html deleted file mode 100644 index fa00096..0000000 --- a/coverage/jecs/jecs.luau.gcov.html +++ /dev/null @@ -1,2625 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/jecs.luau - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs - jecs.luau (source / functions)CoverageTotalHit
Test:coverage.outLines:71.7 %14871066
Test Date:2025-03-27 03:52:25Functions:53.6 %9752
-
- - - - - - - - -

-
            Line data    Source code
-
-       1            1 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-       2              : /* (content generated from line coverage data) */
-       3              : /* ... */
-       4              : /* ... */
-       5              : /* ... */
-       6              : /* ... */
-       7              : /* ... */
-       8              : /* ... */
-       9              : /* ... */
-      10              : /* ... */
-      11              : /* ... */
-      12              : /* ... */
-      13              : /* ... */
-      14              : /* ... */
-      15              : /* ... */
-      16              : /* ... */
-      17              : /* ... */
-      18              : /* ... */
-      19              : /* ... */
-      20              : /* ... */
-      21              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-      22              : /* (content generated from line coverage data) */
-      23              : /* ... */
-      24              : /* ... */
-      25              : /* ... */
-      26              : /* ... */
-      27              : /* ... */
-      28              : /* ... */
-      29              : /* ... */
-      30              : /* ... */
-      31              : /* ... */
-      32              : /* ... */
-      33              : /* ... */
-      34              : /* ... */
-      35              : /* ... */
-      36              : /* ... */
-      37              : /* ... */
-      38              : /* ... */
-      39              : /* ... */
-      40              : /* ... */
-      41              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-      42              : /* (content generated from line coverage data) */
-      43              : /* ... */
-      44              : /* ... */
-      45              : /* ... */
-      46              : /* ... */
-      47              : /* ... */
-      48              : /* ... */
-      49              : /* ... */
-      50              : /* ... */
-      51              : /* ... */
-      52              : /* ... */
-      53              : /* ... */
-      54              : /* ... */
-      55              : /* ... */
-      56              : /* ... */
-      57              : /* ... */
-      58              : /* ... */
-      59              : /* ... */
-      60              : /* ... */
-      61              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-      62              : /* (content generated from line coverage data) */
-      63              : /* ... */
-      64              : /* ... */
-      65              : /* ... */
-      66              : /* ... */
-      67              : /* ... */
-      68              : /* ... */
-      69              : /* ... */
-      70              : /* ... */
-      71              : /* ... */
-      72              : /* ... */
-      73              : /* ... */
-      74              : /* ... */
-      75              : /* ... */
-      76              : /* ... */
-      77              : /* ... */
-      78              : /* ... */
-      79              : /* ... */
-      80              : /* ... */
-      81              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-      82              : /* (content generated from line coverage data) */
-      83              : /* ... */
-      84              : /* ... */
-      85              : /* ... */
-      86              : /* ... */
-      87              : /* ... */
-      88              : /* ... */
-      89              : /* ... */
-      90              : /* ... */
-      91              : /* ... */
-      92              : /* ... */
-      93              : /* ... */
-      94              : /* ... */
-      95              : /* ... */
-      96              : /* ... */
-      97              : /* ... */
-      98              : /* ... */
-      99              : /* ... */
-     100              : /* ... */
-     101              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     102              : /* (content generated from line coverage data) */
-     103              : /* ... */
-     104              : /* ... */
-     105              : /* ... */
-     106              : /* ... */
-     107              : /* ... */
-     108              : /* ... */
-     109              : /* ... */
-     110            1 : /* ... */
-     111              : /* ... */
-     112            1 : /* ... */
-     113            1 : /* ... */
-     114            1 : /* ... */
-     115            1 : /* ... */
-     116            1 : /* ... */
-     117            1 : /* ... */
-     118            1 : /* ... */
-     119            1 : /* ... */
-     120            1 : /* ... */
-     121            1 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     122            1 : /* (content generated from line coverage data) */
-     123            1 : /* ... */
-     124            1 : /* ... */
-     125            1 : /* ... */
-     126              : /* ... */
-     127            1 : /* ... */
-     128            1 : /* ... */
-     129            1 : /* ... */
-     130            1 : /* ... */
-     131            1 : /* ... */
-     132            1 : /* ... */
-     133              : /* ... */
-     134            1 : /* ... */
-     135            1 : /* ... */
-     136              : /* ... */
-     137            1 : /* ... */
-     138            1 : /* ... */
-     139              : /* ... */
-     140              : /* ... */
-     141              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     142              : /* (content generated from line coverage data) */
-     143              : /* ... */
-     144            1 : /* ... */
-     145        65537 : /* ... */
-     146              : /* ... */
-     147            1 : /* ... */
-     148              : /* ... */
-     149            1 : /* ... */
-     150         1646 : /* ... */
-     151              : /* ... */
-     152              : /* ... */
-     153            1 : /* ... */
-     154        65678 : /* ... */
-     155        65537 : /* ... */
-     156        65537 : /* ... */
-     157              : /* ... */
-     158        65537 : /* ... */
-     159        65537 : /* ... */
-     160            1 : /* ... */
-     161              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     162              : /* (content generated from line coverage data) */
-     163        65536 : /* ... */
-     164              : /* ... */
-     165          141 : /* ... */
-     166              : /* ... */
-     167              : /* ... */
-     168            1 : /* ... */
-     169        92607 : /* ... */
-     170              : /* ... */
-     171              : /* ... */
-     172            1 : /* ... */
-     173           15 : /* ... */
-     174              : /* ... */
-     175              : /* ... */
-     176            1 : /* ... */
-     177            0 : /* ... */
-     178              : /* ... */
-     179              : /* ... */
-     180            1 : /* ... */
-     181        67324 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     182        67324 : /* (content generated from line coverage data) */
-     183              : /* ... */
-     184        67324 : /* ... */
-     185              : /* ... */
-     186              : /* ... */
-     187            1 : /* ... */
-     188          623 : /* ... */
-     189              : /* ... */
-     190              : /* ... */
-     191            1 : /* ... */
-     192          687 : /* ... */
-     193              : /* ... */
-     194              : /* ... */
-     195            1 : /* ... */
-     196              : /* ... */
-     197              : /* ... */
-     198              : /* ... */
-     199        66335 : /* ... */
-     200              : /* ... */
-     201        66335 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     202            0 : /* (content generated from line coverage data) */
-     203              : /* ... */
-     204              : /* ... */
-     205        66335 : /* ... */
-     206              : /* ... */
-     207              : /* ... */
-     208            1 : /* ... */
-     209        66214 : /* ... */
-     210        66214 : /* ... */
-     211        66214 : /* ... */
-     212        66214 : /* ... */
-     213          122 : /* ... */
-     214              : /* ... */
-     215        66092 : /* ... */
-     216            2 : /* ... */
-     217              : /* ... */
-     218              : /* ... */
-     219        66090 : /* ... */
-     220              : /* ... */
-     221              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     222            1 : /* (content generated from line coverage data) */
-     223        24891 : /* ... */
-     224        24891 : /* ... */
-     225        24603 : /* ... */
-     226           24 : /* ... */
-     227              : /* ... */
-     228              : /* ... */
-     229        24867 : /* ... */
-     230              : /* ... */
-     231              : /* ... */
-     232            1 : /* ... */
-     233          528 : /* ... */
-     234              : /* ... */
-     235              : /* ... */
-     236            1 : /* ... */
-     237          431 : /* ... */
-     238          431 : /* ... */
-     239          431 : /* ... */
-     240              : /* ... */
-     241            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     242              : /* (content generated from line coverage data) */
-     243              : /* ... */
-     244            1 : /* ... */
-     245           25 : /* ... */
-     246            0 : /* ... */
-     247              : /* ... */
-     248              : /* ... */
-     249           25 : /* ... */
-     250              : /* ... */
-     251           25 : /* ... */
-     252           24 : /* ... */
-     253              : /* ... */
-     254              : /* ... */
-     255            1 : /* ... */
-     256            0 : /* ... */
-     257              : /* ... */
-     258              : /* ... */
-     259            1 : /* ... */
-     260            1 : /* ... */
-     261            1 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     262              : /* (content generated from line coverage data) */
-     263              : /* ... */
-     264            0 : /* ... */
-     265              : /* ... */
-     266              : /* ... */
-     267            1 : /* ... */
-     268        85268 : /* ... */
-     269        85268 : /* ... */
-     270        85268 : /* ... */
-     271        85268 : /* ... */
-     272        65554 : /* ... */
-     273        65554 : /* ... */
-     274        65554 : /* ... */
-     275        65554 : /* ... */
-     276              : /* ... */
-     277              : /* ... */
-     278        19714 : /* ... */
-     279        19714 : /* ... */
-     280        19714 : /* ... */
-     281        19714 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     282        19714 : /* (content generated from line coverage data) */
-     283        19714 : /* ... */
-     284              : /* ... */
-     285        19714 : /* ... */
-     286              : /* ... */
-     287              : /* ... */
-     288            1 : /* ... */
-     289           12 : /* ... */
-     290           12 : /* ... */
-     291              : /* ... */
-     292              : /* ... */
-     293            1 : /* ... */
-     294           13 : /* ... */
-     295           13 : /* ... */
-     296              : /* ... */
-     297              : /* ... */
-     298            1 : /* ... */
-     299              : /* ... */
-     300           10 : /* ... */
-     301           10 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     302              : /* (content generated from line coverage data) */
-     303           10 : /* ... */
-     304           14 : /* ... */
-     305            3 : /* ... */
-     306              : /* ... */
-     307              : /* ... */
-     308              : /* ... */
-     309            7 : /* ... */
-     310            7 : /* ... */
-     311            6 : /* ... */
-     312            8 : /* ... */
-     313            2 : /* ... */
-     314              : /* ... */
-     315              : /* ... */
-     316              : /* ... */
-     317              : /* ... */
-     318            5 : /* ... */
-     319              : /* ... */
-     320              : /* ... */
-     321            1 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     322              : /* (content generated from line coverage data) */
-     323         1413 : /* ... */
-     324         1413 : /* ... */
-     325         1394 : /* ... */
-     326              : /* ... */
-     327           19 : /* ... */
-     328              : /* ... */
-     329              : /* ... */
-     330            1 : /* ... */
-     331              : /* ... */
-     332              : /* ... */
-     333              : /* ... */
-     334              : /* ... */
-     335              : /* ... */
-     336              : /* ... */
-     337         1778 : /* ... */
-     338         1778 : /* ... */
-     339         1778 : /* ... */
-     340         1778 : /* ... */
-     341              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     342         1778 : /* (content generated from line coverage data) */
-     343         1778 : /* ... */
-     344         1778 : /* ... */
-     345              : /* ... */
-     346         1778 : /* ... */
-     347         2182 : /* ... */
-     348              : /* ... */
-     349              : /* ... */
-     350              : /* ... */
-     351              : /* ... */
-     352         1678 : /* ... */
-     353              : /* ... */
-     354              : /* ... */
-     355         1678 : /* ... */
-     356         1402 : /* ... */
-     357              : /* ... */
-     358              : /* ... */
-     359              : /* ... */
-     360         1678 : /* ... */
-     361              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     362           88 : /* (content generated from line coverage data) */
-     363              : /* ... */
-     364         1678 : /* ... */
-     365              : /* ... */
-     366              : /* ... */
-     367         1778 : /* ... */
-     368              : /* ... */
-     369              : /* ... */
-     370              : /* ... */
-     371              : /* ... */
-     372         1778 : /* ... */
-     373         1778 : /* ... */
-     374              : /* ... */
-     375         1778 : /* ... */
-     376          450 : /* ... */
-     377              : /* ... */
-     378              : /* ... */
-     379         1778 : /* ... */
-     380         1778 : /* ... */
-     381              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     382         1778 : /* (content generated from line coverage data) */
-     383              : /* ... */
-     384         1778 : /* ... */
-     385         1778 : /* ... */
-     386         1778 : /* ... */
-     387         1778 : /* ... */
-     388              : /* ... */
-     389              : /* ... */
-     390            1 : /* ... */
-     391              : /* ... */
-     392              : /* ... */
-     393              : /* ... */
-     394        20556 : /* ... */
-     395        20556 : /* ... */
-     396        20556 : /* ... */
-     397        20556 : /* ... */
-     398              : /* ... */
-     399              : /* ... */
-     400            1 : /* ... */
-     401              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     402              : /* (content generated from line coverage data) */
-     403              : /* ... */
-     404              : /* ... */
-     405        20277 : /* ... */
-     406        20277 : /* ... */
-     407        20277 : /* ... */
-     408            0 : /* ... */
-     409              : /* ... */
-     410              : /* ... */
-     411            1 : /* ... */
-     412              : /* ... */
-     413              : /* ... */
-     414              : /* ... */
-     415              : /* ... */
-     416              : /* ... */
-     417         1778 : /* ... */
-     418         1778 : /* ... */
-     419         1778 : /* ... */
-     420         1778 : /* ... */
-     421         1778 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     422         1778 : /* (content generated from line coverage data) */
-     423              : /* ... */
-     424              : /* ... */
-     425            1 : /* ... */
-     426          537 : /* ... */
-     427              : /* ... */
-     428              : /* ... */
-     429            1 : /* ... */
-     430              : /* ... */
-     431          601 : /* ... */
-     432              : /* ... */
-     433          601 : /* ... */
-     434          578 : /* ... */
-     435              : /* ... */
-     436              : /* ... */
-     437           23 : /* ... */
-     438              : /* ... */
-     439              : /* ... */
-     440            1 : /* ... */
-     441              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     442          718 : /* (content generated from line coverage data) */
-     443          718 : /* ... */
-     444           74 : /* ... */
-     445              : /* ... */
-     446              : /* ... */
-     447          644 : /* ... */
-     448          644 : /* ... */
-     449           43 : /* ... */
-     450              : /* ... */
-     451              : /* ... */
-     452          601 : /* ... */
-     453          601 : /* ... */
-     454          601 : /* ... */
-     455              : /* ... */
-     456          601 : /* ... */
-     457              : /* ... */
-     458          601 : /* ... */
-     459           37 : /* ... */
-     460          564 : /* ... */
-     461            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     462          564 : /* (content generated from line coverage data) */
-     463          564 : /* ... */
-     464            0 : /* ... */
-     465            0 : /* ... */
-     466              : /* ... */
-     467            0 : /* ... */
-     468              : /* ... */
-     469              : /* ... */
-     470              : /* ... */
-     471            1 : /* ... */
-     472          672 : /* ... */
-     473          672 : /* ... */
-     474           72 : /* ... */
-     475              : /* ... */
-     476              : /* ... */
-     477          600 : /* ... */
-     478          600 : /* ... */
-     479           36 : /* ... */
-     480              : /* ... */
-     481              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     482          564 : /* (content generated from line coverage data) */
-     483              : /* ... */
-     484          564 : /* ... */
-     485              : /* ... */
-     486              : /* ... */
-     487            1 : /* ... */
-     488           59 : /* ... */
-     489           59 : /* ... */
-     490           22 : /* ... */
-     491              : /* ... */
-     492              : /* ... */
-     493           37 : /* ... */
-     494           37 : /* ... */
-     495            2 : /* ... */
-     496              : /* ... */
-     497              : /* ... */
-     498           35 : /* ... */
-     499              : /* ... */
-     500           35 : /* ... */
-     501           38 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     502           17 : /* (content generated from line coverage data) */
-     503              : /* ... */
-     504              : /* ... */
-     505              : /* ... */
-     506           18 : /* ... */
-     507              : /* ... */
-     508              : /* ... */
-     509            1 : /* ... */
-     510         1378 : /* ... */
-     511         1378 : /* ... */
-     512         1378 : /* ... */
-     513          144 : /* ... */
-     514              : /* ... */
-     515              : /* ... */
-     516         1234 : /* ... */
-     517         1234 : /* ... */
-     518           72 : /* ... */
-     519              : /* ... */
-     520              : /* ... */
-     521         1162 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     522              : /* (content generated from line coverage data) */
-     523         1162 : /* ... */
-     524         1162 : /* ... */
-     525         1112 : /* ... */
-     526              : /* ... */
-     527              : /* ... */
-     528           50 : /* ... */
-     529            5 : /* ... */
-     530              : /* ... */
-     531              : /* ... */
-     532           50 : /* ... */
-     533           50 : /* ... */
-     534            5 : /* ... */
-     535              : /* ... */
-     536              : /* ... */
-     537           45 : /* ... */
-     538           45 : /* ... */
-     539              : /* ... */
-     540              : /* ... */
-     541            1 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     542            0 : /* (content generated from line coverage data) */
-     543            0 : /* ... */
-     544            0 : /* ... */
-     545              : /* ... */
-     546              : /* ... */
-     547            1 : /* ... */
-     548         1428 : /* ... */
-     549         1428 : /* ... */
-     550         1428 : /* ... */
-     551              : /* ... */
-     552         1428 : /* ... */
-     553          674 : /* ... */
-     554          674 : /* ... */
-     555          674 : /* ... */
-     556          674 : /* ... */
-     557          674 : /* ... */
-     558          366 : /* ... */
-     559          366 : /* ... */
-     560          366 : /* ... */
-     561          365 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     562          365 : /* (content generated from line coverage data) */
-     563          365 : /* ... */
-     564              : /* ... */
-     565              : /* ... */
-     566          672 : /* ... */
-     567          672 : /* ... */
-     568              : /* ... */
-     569          672 : /* ... */
-     570              : /* ... */
-     571          672 : /* ... */
-     572           16 : /* ... */
-     573              : /* ... */
-     574              : /* ... */
-     575          672 : /* ... */
-     576              : /* ... */
-     577          672 : /* ... */
-     578              : /* ... */
-     579          672 : /* ... */
-     580          188 : /* ... */
-     581              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     582              : /* (content generated from line coverage data) */
-     583          672 : /* ... */
-     584          672 : /* ... */
-     585          672 : /* ... */
-     586          672 : /* ... */
-     587          672 : /* ... */
-     588          672 : /* ... */
-     589          672 : /* ... */
-     590              : /* ... */
-     591              : /* ... */
-     592          672 : /* ... */
-     593          672 : /* ... */
-     594          672 : /* ... */
-     595          672 : /* ... */
-     596          672 : /* ... */
-     597          672 : /* ... */
-     598          672 : /* ... */
-     599          672 : /* ... */
-     600          672 : /* ... */
-     601              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     602              : /* (content generated from line coverage data) */
-     603              : /* ... */
-     604          672 : /* ... */
-     605              : /* ... */
-     606              : /* ... */
-     607         1426 : /* ... */
-     608              : /* ... */
-     609              : /* ... */
-     610            1 : /* ... */
-     611              : /* ... */
-     612              : /* ... */
-     613              : /* ... */
-     614              : /* ... */
-     615              : /* ... */
-     616          936 : /* ... */
-     617          936 : /* ... */
-     618          936 : /* ... */
-     619          936 : /* ... */
-     620          936 : /* ... */
-     621          936 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     622          936 : /* (content generated from line coverage data) */
-     623          936 : /* ... */
-     624          936 : /* ... */
-     625              : /* ... */
-     626          936 : /* ... */
-     627          936 : /* ... */
-     628              : /* ... */
-     629           82 : /* ... */
-     630           82 : /* ... */
-     631           82 : /* ... */
-     632              : /* ... */
-     633              : /* ... */
-     634              : /* ... */
-     635            1 : /* ... */
-     636          605 : /* ... */
-     637          605 : /* ... */
-     638              : /* ... */
-     639          605 : /* ... */
-     640          605 : /* ... */
-     641              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     642          605 : /* (content generated from line coverage data) */
-     643          605 : /* ... */
-     644              : /* ... */
-     645          605 : /* ... */
-     646          605 : /* ... */
-     647          605 : /* ... */
-     648          605 : /* ... */
-     649          605 : /* ... */
-     650          605 : /* ... */
-     651          605 : /* ... */
-     652          605 : /* ... */
-     653              : /* ... */
-     654          605 : /* ... */
-     655          605 : /* ... */
-     656          605 : /* ... */
-     657              : /* ... */
-     658              : /* ... */
-     659          605 : /* ... */
-     660          938 : /* ... */
-     661          936 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     662              : /* (content generated from line coverage data) */
-     663          936 : /* ... */
-     664          245 : /* ... */
-     665          245 : /* ... */
-     666          245 : /* ... */
-     667          245 : /* ... */
-     668          245 : /* ... */
-     669              : /* ... */
-     670          245 : /* ... */
-     671          245 : /* ... */
-     672          245 : /* ... */
-     673              : /* ... */
-     674              : /* ... */
-     675          936 : /* ... */
-     676          549 : /* ... */
-     677              : /* ... */
-     678          387 : /* ... */
-     679              : /* ... */
-     680              : /* ... */
-     681              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     682          603 : /* (content generated from line coverage data) */
-     683         1328 : /* ... */
-     684         1328 : /* ... */
-     685              : /* ... */
-     686              : /* ... */
-     687            8 : /* ... */
-     688            8 : /* ... */
-     689            4 : /* ... */
-     690              : /* ... */
-     691              : /* ... */
-     692              : /* ... */
-     693              : /* ... */
-     694          603 : /* ... */
-     695          603 : /* ... */
-     696              : /* ... */
-     697          603 : /* ... */
-     698              : /* ... */
-     699              : /* ... */
-     700            1 : /* ... */
-     701        66836 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     702              : /* (content generated from line coverage data) */
-     703              : /* ... */
-     704            1 : /* ... */
-     705            1 : /* ... */
-     706              : /* ... */
-     707              : /* ... */
-     708            1 : /* ... */
-     709          545 : /* ... */
-     710            8 : /* ... */
-     711              : /* ... */
-     712              : /* ... */
-     713          537 : /* ... */
-     714          537 : /* ... */
-     715          537 : /* ... */
-     716            4 : /* ... */
-     717              : /* ... */
-     718              : /* ... */
-     719          533 : /* ... */
-     720              : /* ... */
-     721              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     722            1 : /* (content generated from line coverage data) */
-     723          529 : /* ... */
-     724          408 : /* ... */
-     725            4 : /* ... */
-     726              : /* ... */
-     727          404 : /* ... */
-     728           13 : /* ... */
-     729              : /* ... */
-     730              : /* ... */
-     731          512 : /* ... */
-     732              : /* ... */
-     733              : /* ... */
-     734            1 : /* ... */
-     735          529 : /* ... */
-     736              : /* ... */
-     737              : /* ... */
-     738              : /* ... */
-     739              : /* ... */
-     740          529 : /* ... */
-     741          529 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     742          529 : /* (content generated from line coverage data) */
-     743              : /* ... */
-     744              : /* ... */
-     745            4 : /* ... */
-     746              : /* ... */
-     747          525 : /* ... */
-     748              : /* ... */
-     749          525 : /* ... */
-     750              : /* ... */
-     751              : /* ... */
-     752            1 : /* ... */
-     753              : /* ... */
-     754              : /* ... */
-     755              : /* ... */
-     756              : /* ... */
-     757           20 : /* ... */
-     758           20 : /* ... */
-     759           20 : /* ... */
-     760            0 : /* ... */
-     761              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     762              : /* (content generated from line coverage data) */
-     763           20 : /* ... */
-     764           20 : /* ... */
-     765              : /* ... */
-     766           20 : /* ... */
-     767              : /* ... */
-     768              : /* ... */
-     769            1 : /* ... */
-     770              : /* ... */
-     771              : /* ... */
-     772              : /* ... */
-     773              : /* ... */
-     774              : /* ... */
-     775          547 : /* ... */
-     776          547 : /* ... */
-     777          547 : /* ... */
-     778              : /* ... */
-     779              : /* ... */
-     780            1 : /* ... */
-     781              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     782              : /* (content generated from line coverage data) */
-     783              : /* ... */
-     784              : /* ... */
-     785        22064 : /* ... */
-     786        22064 : /* ... */
-     787          549 : /* ... */
-     788          549 : /* ... */
-     789              : /* ... */
-     790              : /* ... */
-     791        22064 : /* ... */
-     792              : /* ... */
-     793              : /* ... */
-     794            1 : /* ... */
-     795          527 : /* ... */
-     796          527 : /* ... */
-     797          527 : /* ... */
-     798          523 : /* ... */
-     799          523 : /* ... */
-     800              : /* ... */
-     801          523 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     802          523 : /* (content generated from line coverage data) */
-     803          523 : /* ... */
-     804              : /* ... */
-     805          523 : /* ... */
-     806            0 : /* ... */
-     807              : /* ... */
-     808              : /* ... */
-     809              : /* ... */
-     810              : /* ... */
-     811            1 : /* ... */
-     812              : /* ... */
-     813              : /* ... */
-     814              : /* ... */
-     815              : /* ... */
-     816              : /* ... */
-     817              : /* ... */
-     818           20 : /* ... */
-     819           20 : /* ... */
-     820           20 : /* ... */
-     821           20 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     822           20 : /* (content generated from line coverage data) */
-     823              : /* ... */
-     824           20 : /* ... */
-     825           20 : /* ... */
-     826           20 : /* ... */
-     827              : /* ... */
-     828           20 : /* ... */
-     829            0 : /* ... */
-     830              : /* ... */
-     831              : /* ... */
-     832              : /* ... */
-     833              : /* ... */
-     834            1 : /* ... */
-     835              : /* ... */
-     836              : /* ... */
-     837              : /* ... */
-     838              : /* ... */
-     839              : /* ... */
-     840          529 : /* ... */
-     841          527 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     842          527 : /* (content generated from line coverage data) */
-     843              : /* ... */
-     844              : /* ... */
-     845            1 : /* ... */
-     846              : /* ... */
-     847              : /* ... */
-     848              : /* ... */
-     849              : /* ... */
-     850              : /* ... */
-     851           20 : /* ... */
-     852           20 : /* ... */
-     853           20 : /* ... */
-     854              : /* ... */
-     855              : /* ... */
-     856            1 : /* ... */
-     857              : /* ... */
-     858              : /* ... */
-     859              : /* ... */
-     860              : /* ... */
-     861        21784 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     862        21784 : /* (content generated from line coverage data) */
-     863              : /* ... */
-     864        21784 : /* ... */
-     865        21784 : /* ... */
-     866          529 : /* ... */
-     867              : /* ... */
-     868              : /* ... */
-     869        21782 : /* ... */
-     870              : /* ... */
-     871              : /* ... */
-     872            1 : /* ... */
-     873              : /* ... */
-     874              : /* ... */
-     875              : /* ... */
-     876              : /* ... */
-     877          280 : /* ... */
-     878              : /* ... */
-     879          280 : /* ... */
-     880              : /* ... */
-     881          280 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     882          280 : /* (content generated from line coverage data) */
-     883           20 : /* ... */
-     884              : /* ... */
-     885              : /* ... */
-     886          280 : /* ... */
-     887              : /* ... */
-     888              : /* ... */
-     889            1 : /* ... */
-     890              : /* ... */
-     891              : /* ... */
-     892              : /* ... */
-     893              : /* ... */
-     894        19044 : /* ... */
-     895        19044 : /* ... */
-     896        19044 : /* ... */
-     897            0 : /* ... */
-     898              : /* ... */
-     899              : /* ... */
-     900        19044 : /* ... */
-     901        19044 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     902        19043 : /* (content generated from line coverage data) */
-     903            3 : /* ... */
-     904              : /* ... */
-     905        19040 : /* ... */
-     906          133 : /* ... */
-     907              : /* ... */
-     908        18907 : /* ... */
-     909        18907 : /* ... */
-     910              : /* ... */
-     911              : /* ... */
-     912              : /* ... */
-     913        19040 : /* ... */
-     914        19040 : /* ... */
-     915              : /* ... */
-     916        19040 : /* ... */
-     917            1 : /* ... */
-     918              : /* ... */
-     919              : /* ... */
-     920              : /* ... */
-     921            1 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     922         2739 : /* (content generated from line coverage data) */
-     923         2739 : /* ... */
-     924         2739 : /* ... */
-     925            0 : /* ... */
-     926              : /* ... */
-     927              : /* ... */
-     928         2739 : /* ... */
-     929         2739 : /* ... */
-     930         2738 : /* ... */
-     931         2738 : /* ... */
-     932              : /* ... */
-     933         2738 : /* ... */
-     934              : /* ... */
-     935              : /* ... */
-     936            2 : /* ... */
-     937            2 : /* ... */
-     938            2 : /* ... */
-     939            2 : /* ... */
-     940            2 : /* ... */
-     941            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     942              : /* (content generated from line coverage data) */
-     943              : /* ... */
-     944            2 : /* ... */
-     945              : /* ... */
-     946              : /* ... */
-     947         2736 : /* ... */
-     948              : /* ... */
-     949         1366 : /* ... */
-     950              : /* ... */
-     951         1370 : /* ... */
-     952              : /* ... */
-     953         1370 : /* ... */
-     954              : /* ... */
-     955              : /* ... */
-     956              : /* ... */
-     957         2736 : /* ... */
-     958         2736 : /* ... */
-     959              : /* ... */
-     960         2736 : /* ... */
-     961              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     962         2729 : /* (content generated from line coverage data) */
-     963         2729 : /* ... */
-     964            0 : /* ... */
-     965              : /* ... */
-     966              : /* ... */
-     967         2729 : /* ... */
-     968         2729 : /* ... */
-     969            1 : /* ... */
-     970              : /* ... */
-     971              : /* ... */
-     972              : /* ... */
-     973            1 : /* ... */
-     974          108 : /* ... */
-     975          108 : /* ... */
-     976              : /* ... */
-     977              : /* ... */
-     978            0 : /* ... */
-     979              : /* ... */
-     980          108 : /* ... */
-     981              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-     982          108 : /* (content generated from line coverage data) */
-     983              : /* ... */
-     984              : /* ... */
-     985            1 : /* ... */
-     986          281 : /* ... */
-     987          281 : /* ... */
-     988          281 : /* ... */
-     989            0 : /* ... */
-     990              : /* ... */
-     991          281 : /* ... */
-     992              : /* ... */
-     993          281 : /* ... */
-     994            1 : /* ... */
-     995              : /* ... */
-     996              : /* ... */
-     997          280 : /* ... */
-     998          279 : /* ... */
-     999          279 : /* ... */
-    1000          279 : /* ... */
-    1001            3 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1002              : /* (content generated from line coverage data) */
-    1003              : /* ... */
-    1004          279 : /* ... */
-    1005              : /* ... */
-    1006          279 : /* ... */
-    1007              : /* ... */
-    1008              : /* ... */
-    1009              : /* ... */
-    1010            1 : /* ... */
-    1011           76 : /* ... */
-    1012          153 : /* ... */
-    1013          135 : /* ... */
-    1014              : /* ... */
-    1015              : /* ... */
-    1016              : /* ... */
-    1017              : /* ... */
-    1018            1 : /* ... */
-    1019           57 : /* ... */
-    1020          108 : /* ... */
-    1021          104 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1022          104 : /* (content generated from line coverage data) */
-    1023              : /* ... */
-    1024              : /* ... */
-    1025              : /* ... */
-    1026              : /* ... */
-    1027            1 : /* ... */
-    1028          133 : /* ... */
-    1029          133 : /* ... */
-    1030          133 : /* ... */
-    1031          133 : /* ... */
-    1032          133 : /* ... */
-    1033          133 : /* ... */
-    1034          133 : /* ... */
-    1035          133 : /* ... */
-    1036              : /* ... */
-    1037          133 : /* ... */
-    1038              : /* ... */
-    1039          133 : /* ... */
-    1040           57 : /* ... */
-    1041           57 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1042           57 : /* (content generated from line coverage data) */
-    1043              : /* ... */
-    1044              : /* ... */
-    1045           57 : /* ... */
-    1046           57 : /* ... */
-    1047              : /* ... */
-    1048              : /* ... */
-    1049          133 : /* ... */
-    1050          261 : /* ... */
-    1051          261 : /* ... */
-    1052          261 : /* ... */
-    1053            3 : /* ... */
-    1054              : /* ... */
-    1055              : /* ... */
-    1056              : /* ... */
-    1057          133 : /* ... */
-    1058              : /* ... */
-    1059          133 : /* ... */
-    1060           76 : /* ... */
-    1061              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1062           57 : /* (content generated from line coverage data) */
-    1063              : /* ... */
-    1064              : /* ... */
-    1065              : /* ... */
-    1066            1 : /* ... */
-    1067              : /* ... */
-    1068            4 : /* ... */
-    1069            4 : /* ... */
-    1070            0 : /* ... */
-    1071              : /* ... */
-    1072              : /* ... */
-    1073            4 : /* ... */
-    1074            4 : /* ... */
-    1075              : /* ... */
-    1076            4 : /* ... */
-    1077              : /* ... */
-    1078              : /* ... */
-    1079            4 : /* ... */
-    1080              : /* ... */
-    1081              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1082            4 : /* (content generated from line coverage data) */
-    1083            4 : /* ... */
-    1084              : /* ... */
-    1085              : /* ... */
-    1086            1 : /* ... */
-    1087           17 : /* ... */
-    1088           17 : /* ... */
-    1089           17 : /* ... */
-    1090           12 : /* ... */
-    1091              : /* ... */
-    1092           17 : /* ... */
-    1093           17 : /* ... */
-    1094              : /* ... */
-    1095              : /* ... */
-    1096              : /* ... */
-    1097            1 : /* ... */
-    1098           17 : /* ... */
-    1099           17 : /* ... */
-    1100              : /* ... */
-    1101              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1102            1 : /* (content generated from line coverage data) */
-    1103           27 : /* ... */
-    1104           27 : /* ... */
-    1105           27 : /* ... */
-    1106           27 : /* ... */
-    1107            6 : /* ... */
-    1108            6 : /* ... */
-    1109              : /* ... */
-    1110           27 : /* ... */
-    1111           12 : /* ... */
-    1112           12 : /* ... */
-    1113              : /* ... */
-    1114              : /* ... */
-    1115           27 : /* ... */
-    1116           27 : /* ... */
-    1117           17 : /* ... */
-    1118           17 : /* ... */
-    1119           17 : /* ... */
-    1120           17 : /* ... */
-    1121              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1122              : /* (content generated from line coverage data) */
-    1123           27 : /* ... */
-    1124           27 : /* ... */
-    1125            1 : /* ... */
-    1126            1 : /* ... */
-    1127            1 : /* ... */
-    1128            1 : /* ... */
-    1129              : /* ... */
-    1130              : /* ... */
-    1131           27 : /* ... */
-    1132           27 : /* ... */
-    1133              : /* ... */
-    1134              : /* ... */
-    1135            1 : /* ... */
-    1136           28 : /* ... */
-    1137            1 : /* ... */
-    1138              : /* ... */
-    1139              : /* ... */
-    1140           27 : /* ... */
-    1141           27 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1142           27 : /* (content generated from line coverage data) */
-    1143           27 : /* ... */
-    1144           27 : /* ... */
-    1145           27 : /* ... */
-    1146              : /* ... */
-    1147           27 : /* ... */
-    1148           85 : /* ... */
-    1149           85 : /* ... */
-    1150              : /* ... */
-    1151              : /* ... */
-    1152            2 : /* ... */
-    1153            2 : /* ... */
-    1154            1 : /* ... */
-    1155              : /* ... */
-    1156              : /* ... */
-    1157              : /* ... */
-    1158              : /* ... */
-    1159           27 : /* ... */
-    1160           85 : /* ... */
-    1161           85 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1162           85 : /* (content generated from line coverage data) */
-    1163           85 : /* ... */
-    1164           85 : /* ... */
-    1165           85 : /* ... */
-    1166            0 : /* ... */
-    1167              : /* ... */
-    1168              : /* ... */
-    1169              : /* ... */
-    1170              : /* ... */
-    1171            1 : /* ... */
-    1172            1 : /* ... */
-    1173              : /* ... */
-    1174            1 : /* ... */
-    1175            9 : /* ... */
-    1176            4 : /* ... */
-    1177              : /* ... */
-    1178              : /* ... */
-    1179              : /* ... */
-    1180            1 : /* ... */
-    1181            1 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1182              : /* (content generated from line coverage data) */
-    1183            1 : /* ... */
-    1184            6 : /* ... */
-    1185            6 : /* ... */
-    1186              : /* ... */
-    1187              : /* ... */
-    1188            1 : /* ... */
-    1189            1 : /* ... */
-    1190              : /* ... */
-    1191              : /* ... */
-    1192            1 : /* ... */
-    1193        65678 : /* ... */
-    1194        65678 : /* ... */
-    1195        65678 : /* ... */
-    1196            1 : /* ... */
-    1197              : /* ... */
-    1198              : /* ... */
-    1199        65677 : /* ... */
-    1200        65677 : /* ... */
-    1201              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1202        65677 : /* (content generated from line coverage data) */
-    1203              : /* ... */
-    1204              : /* ... */
-    1205          129 : /* ... */
-    1206              : /* ... */
-    1207              : /* ... */
-    1208        65677 : /* ... */
-    1209        65677 : /* ... */
-    1210        65677 : /* ... */
-    1211        65677 : /* ... */
-    1212        65677 : /* ... */
-    1213        65677 : /* ... */
-    1214              : /* ... */
-    1215        65677 : /* ... */
-    1216            6 : /* ... */
-    1217            6 : /* ... */
-    1218            1 : /* ... */
-    1219            1 : /* ... */
-    1220              : /* ... */
-    1221            1 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1222            1 : /* (content generated from line coverage data) */
-    1223            1 : /* ... */
-    1224            2 : /* ... */
-    1225              : /* ... */
-    1226              : /* ... */
-    1227            1 : /* ... */
-    1228              : /* ... */
-    1229              : /* ... */
-    1230            5 : /* ... */
-    1231            8 : /* ... */
-    1232            8 : /* ... */
-    1233            8 : /* ... */
-    1234            8 : /* ... */
-    1235            6 : /* ... */
-    1236              : /* ... */
-    1237              : /* ... */
-    1238            8 : /* ... */
-    1239              : /* ... */
-    1240              : /* ... */
-    1241              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1242              : /* (content generated from line coverage data) */
-    1243        65677 : /* ... */
-    1244              : /* ... */
-    1245        65677 : /* ... */
-    1246           10 : /* ... */
-    1247           10 : /* ... */
-    1248           10 : /* ... */
-    1249           10 : /* ... */
-    1250           10 : /* ... */
-    1251           13 : /* ... */
-    1252           13 : /* ... */
-    1253           13 : /* ... */
-    1254           13 : /* ... */
-    1255              : /* ... */
-    1256           13 : /* ... */
-    1257           24 : /* ... */
-    1258              : /* ... */
-    1259              : /* ... */
-    1260           19 : /* ... */
-    1261           19 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1262           19 : /* (content generated from line coverage data) */
-    1263              : /* ... */
-    1264              : /* ... */
-    1265           15 : /* ... */
-    1266           15 : /* ... */
-    1267           15 : /* ... */
-    1268           15 : /* ... */
-    1269            5 : /* ... */
-    1270           13 : /* ... */
-    1271           13 : /* ... */
-    1272              : /* ... */
-    1273            5 : /* ... */
-    1274              : /* ... */
-    1275           10 : /* ... */
-    1276            5 : /* ... */
-    1277              : /* ... */
-    1278           10 : /* ... */
-    1279           10 : /* ... */
-    1280              : /* ... */
-    1281              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1282              : /* (content generated from line coverage data) */
-    1283           13 : /* ... */
-    1284              : /* ... */
-    1285              : /* ... */
-    1286            8 : /* ... */
-    1287            5 : /* ... */
-    1288              : /* ... */
-    1289            8 : /* ... */
-    1290            8 : /* ... */
-    1291            8 : /* ... */
-    1292              : /* ... */
-    1293              : /* ... */
-    1294           10 : /* ... */
-    1295            5 : /* ... */
-    1296            6 : /* ... */
-    1297           17 : /* ... */
-    1298              : /* ... */
-    1299              : /* ... */
-    1300              : /* ... */
-    1301              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1302           10 : /* (content generated from line coverage data) */
-    1303           15 : /* ... */
-    1304              : /* ... */
-    1305              : /* ... */
-    1306              : /* ... */
-    1307        65677 : /* ... */
-    1308        65677 : /* ... */
-    1309        65677 : /* ... */
-    1310              : /* ... */
-    1311        65677 : /* ... */
-    1312        65677 : /* ... */
-    1313        65677 : /* ... */
-    1314        65677 : /* ... */
-    1315        65677 : /* ... */
-    1316        65677 : /* ... */
-    1317              : /* ... */
-    1318        65677 : /* ... */
-    1319        65677 : /* ... */
-    1320              : /* ... */
-    1321              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1322            1 : /* (content generated from line coverage data) */
-    1323          137 : /* ... */
-    1324              : /* ... */
-    1325              : /* ... */
-    1326            1 : /* ... */
-    1327              : /* ... */
-    1328              : /* ... */
-    1329              : /* ... */
-    1330              : /* ... */
-    1331              : /* ... */
-    1332              : /* ... */
-    1333              : /* ... */
-    1334              : /* ... */
-    1335              : /* ... */
-    1336              : /* ... */
-    1337              : /* ... */
-    1338              : /* ... */
-    1339            1 : /* ... */
-    1340           26 : /* ... */
-    1341              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1342           26 : /* (content generated from line coverage data) */
-    1343           26 : /* ... */
-    1344           26 : /* ... */
-    1345           26 : /* ... */
-    1346            4 : /* ... */
-    1347              : /* ... */
-    1348           22 : /* ... */
-    1349           22 : /* ... */
-    1350           22 : /* ... */
-    1351           22 : /* ... */
-    1352              : /* ... */
-    1353           22 : /* ... */
-    1354           22 : /* ... */
-    1355           22 : /* ... */
-    1356           22 : /* ... */
-    1357              : /* ... */
-    1358           22 : /* ... */
-    1359           17 : /* ... */
-    1360            5 : /* ... */
-    1361            3 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1362            3 : /* (content generated from line coverage data) */
-    1363            2 : /* ... */
-    1364            0 : /* ... */
-    1365            0 : /* ... */
-    1366            0 : /* ... */
-    1367            2 : /* ... */
-    1368            1 : /* ... */
-    1369            1 : /* ... */
-    1370            1 : /* ... */
-    1371            1 : /* ... */
-    1372            1 : /* ... */
-    1373            0 : /* ... */
-    1374            0 : /* ... */
-    1375            0 : /* ... */
-    1376            0 : /* ... */
-    1377            0 : /* ... */
-    1378            1 : /* ... */
-    1379            0 : /* ... */
-    1380            0 : /* ... */
-    1381            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1382            0 : /* (content generated from line coverage data) */
-    1383            0 : /* ... */
-    1384            0 : /* ... */
-    1385            1 : /* ... */
-    1386            0 : /* ... */
-    1387            0 : /* ... */
-    1388            0 : /* ... */
-    1389            0 : /* ... */
-    1390            0 : /* ... */
-    1391            0 : /* ... */
-    1392            0 : /* ... */
-    1393            1 : /* ... */
-    1394            0 : /* ... */
-    1395            0 : /* ... */
-    1396            0 : /* ... */
-    1397            0 : /* ... */
-    1398            0 : /* ... */
-    1399            0 : /* ... */
-    1400            0 : /* ... */
-    1401            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1402              : /* (content generated from line coverage data) */
-    1403              : /* ... */
-    1404           22 : /* ... */
-    1405           17 : /* ... */
-    1406          556 : /* ... */
-    1407          556 : /* ... */
-    1408           26 : /* ... */
-    1409           26 : /* ... */
-    1410           26 : /* ... */
-    1411           18 : /* ... */
-    1412              : /* ... */
-    1413              : /* ... */
-    1414            8 : /* ... */
-    1415            8 : /* ... */
-    1416            8 : /* ... */
-    1417              : /* ... */
-    1418              : /* ... */
-    1419            8 : /* ... */
-    1420            8 : /* ... */
-    1421            8 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1422            8 : /* (content generated from line coverage data) */
-    1423              : /* ... */
-    1424              : /* ... */
-    1425          538 : /* ... */
-    1426          538 : /* ... */
-    1427              : /* ... */
-    1428          538 : /* ... */
-    1429              : /* ... */
-    1430            5 : /* ... */
-    1431            3 : /* ... */
-    1432            7 : /* ... */
-    1433            7 : /* ... */
-    1434            3 : /* ... */
-    1435            3 : /* ... */
-    1436            3 : /* ... */
-    1437            3 : /* ... */
-    1438              : /* ... */
-    1439              : /* ... */
-    1440            0 : /* ... */
-    1441            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1442            0 : /* (content generated from line coverage data) */
-    1443              : /* ... */
-    1444              : /* ... */
-    1445            0 : /* ... */
-    1446            0 : /* ... */
-    1447            0 : /* ... */
-    1448            0 : /* ... */
-    1449            0 : /* ... */
-    1450              : /* ... */
-    1451              : /* ... */
-    1452            4 : /* ... */
-    1453            4 : /* ... */
-    1454              : /* ... */
-    1455            4 : /* ... */
-    1456              : /* ... */
-    1457            2 : /* ... */
-    1458            0 : /* ... */
-    1459            0 : /* ... */
-    1460            0 : /* ... */
-    1461            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1462            0 : /* (content generated from line coverage data) */
-    1463            0 : /* ... */
-    1464            0 : /* ... */
-    1465              : /* ... */
-    1466              : /* ... */
-    1467            0 : /* ... */
-    1468            0 : /* ... */
-    1469            0 : /* ... */
-    1470              : /* ... */
-    1471              : /* ... */
-    1472            0 : /* ... */
-    1473            0 : /* ... */
-    1474            0 : /* ... */
-    1475            0 : /* ... */
-    1476            0 : /* ... */
-    1477            0 : /* ... */
-    1478              : /* ... */
-    1479              : /* ... */
-    1480            0 : /* ... */
-    1481            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1482              : /* (content generated from line coverage data) */
-    1483            0 : /* ... */
-    1484              : /* ... */
-    1485            2 : /* ... */
-    1486            1 : /* ... */
-    1487            2 : /* ... */
-    1488            2 : /* ... */
-    1489            1 : /* ... */
-    1490            1 : /* ... */
-    1491            1 : /* ... */
-    1492            1 : /* ... */
-    1493              : /* ... */
-    1494              : /* ... */
-    1495            0 : /* ... */
-    1496            0 : /* ... */
-    1497            0 : /* ... */
-    1498              : /* ... */
-    1499              : /* ... */
-    1500            0 : /* ... */
-    1501            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1502            0 : /* (content generated from line coverage data) */
-    1503            0 : /* ... */
-    1504            0 : /* ... */
-    1505            0 : /* ... */
-    1506            0 : /* ... */
-    1507              : /* ... */
-    1508              : /* ... */
-    1509            1 : /* ... */
-    1510            1 : /* ... */
-    1511              : /* ... */
-    1512            1 : /* ... */
-    1513              : /* ... */
-    1514            1 : /* ... */
-    1515            0 : /* ... */
-    1516            0 : /* ... */
-    1517            0 : /* ... */
-    1518            0 : /* ... */
-    1519            0 : /* ... */
-    1520            0 : /* ... */
-    1521            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1522              : /* (content generated from line coverage data) */
-    1523              : /* ... */
-    1524            0 : /* ... */
-    1525            0 : /* ... */
-    1526            0 : /* ... */
-    1527              : /* ... */
-    1528              : /* ... */
-    1529            0 : /* ... */
-    1530            0 : /* ... */
-    1531            0 : /* ... */
-    1532            0 : /* ... */
-    1533            0 : /* ... */
-    1534            0 : /* ... */
-    1535            0 : /* ... */
-    1536            0 : /* ... */
-    1537              : /* ... */
-    1538              : /* ... */
-    1539            0 : /* ... */
-    1540            0 : /* ... */
-    1541              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1542            0 : /* (content generated from line coverage data) */
-    1543              : /* ... */
-    1544            1 : /* ... */
-    1545            0 : /* ... */
-    1546            0 : /* ... */
-    1547            0 : /* ... */
-    1548            0 : /* ... */
-    1549            0 : /* ... */
-    1550            0 : /* ... */
-    1551            0 : /* ... */
-    1552              : /* ... */
-    1553              : /* ... */
-    1554            0 : /* ... */
-    1555            0 : /* ... */
-    1556            0 : /* ... */
-    1557              : /* ... */
-    1558              : /* ... */
-    1559            0 : /* ... */
-    1560            0 : /* ... */
-    1561            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1562            0 : /* (content generated from line coverage data) */
-    1563            0 : /* ... */
-    1564            0 : /* ... */
-    1565            0 : /* ... */
-    1566            0 : /* ... */
-    1567            0 : /* ... */
-    1568              : /* ... */
-    1569              : /* ... */
-    1570            0 : /* ... */
-    1571            0 : /* ... */
-    1572              : /* ... */
-    1573            0 : /* ... */
-    1574              : /* ... */
-    1575            1 : /* ... */
-    1576            0 : /* ... */
-    1577            0 : /* ... */
-    1578            0 : /* ... */
-    1579            0 : /* ... */
-    1580            0 : /* ... */
-    1581            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1582            0 : /* (content generated from line coverage data) */
-    1583              : /* ... */
-    1584              : /* ... */
-    1585            0 : /* ... */
-    1586            0 : /* ... */
-    1587            0 : /* ... */
-    1588              : /* ... */
-    1589              : /* ... */
-    1590            0 : /* ... */
-    1591            0 : /* ... */
-    1592            0 : /* ... */
-    1593            0 : /* ... */
-    1594            0 : /* ... */
-    1595            0 : /* ... */
-    1596            0 : /* ... */
-    1597            0 : /* ... */
-    1598            0 : /* ... */
-    1599            0 : /* ... */
-    1600              : /* ... */
-    1601              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1602            0 : /* (content generated from line coverage data) */
-    1603            0 : /* ... */
-    1604              : /* ... */
-    1605            0 : /* ... */
-    1606              : /* ... */
-    1607            1 : /* ... */
-    1608            0 : /* ... */
-    1609            0 : /* ... */
-    1610            0 : /* ... */
-    1611            0 : /* ... */
-    1612            0 : /* ... */
-    1613            0 : /* ... */
-    1614            0 : /* ... */
-    1615              : /* ... */
-    1616              : /* ... */
-    1617            0 : /* ... */
-    1618            0 : /* ... */
-    1619            0 : /* ... */
-    1620              : /* ... */
-    1621              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1622            0 : /* (content generated from line coverage data) */
-    1623            0 : /* ... */
-    1624            0 : /* ... */
-    1625            0 : /* ... */
-    1626            0 : /* ... */
-    1627            0 : /* ... */
-    1628            0 : /* ... */
-    1629            0 : /* ... */
-    1630            0 : /* ... */
-    1631            0 : /* ... */
-    1632            0 : /* ... */
-    1633              : /* ... */
-    1634              : /* ... */
-    1635            0 : /* ... */
-    1636            0 : /* ... */
-    1637              : /* ... */
-    1638            0 : /* ... */
-    1639              : /* ... */
-    1640              : /* ... */
-    1641            1 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1642            1 : /* (content generated from line coverage data) */
-    1643            2 : /* ... */
-    1644            2 : /* ... */
-    1645            1 : /* ... */
-    1646            1 : /* ... */
-    1647            1 : /* ... */
-    1648            1 : /* ... */
-    1649              : /* ... */
-    1650              : /* ... */
-    1651            0 : /* ... */
-    1652            0 : /* ... */
-    1653            0 : /* ... */
-    1654              : /* ... */
-    1655              : /* ... */
-    1656            0 : /* ... */
-    1657            0 : /* ... */
-    1658            0 : /* ... */
-    1659              : /* ... */
-    1660              : /* ... */
-    1661            1 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1662            1 : /* (content generated from line coverage data) */
-    1663              : /* ... */
-    1664            1 : /* ... */
-    1665            9 : /* ... */
-    1666              : /* ... */
-    1667              : /* ... */
-    1668            1 : /* ... */
-    1669              : /* ... */
-    1670              : /* ... */
-    1671              : /* ... */
-    1672           22 : /* ... */
-    1673           22 : /* ... */
-    1674              : /* ... */
-    1675              : /* ... */
-    1676            1 : /* ... */
-    1677           20 : /* ... */
-    1678           20 : /* ... */
-    1679           19 : /* ... */
-    1680              : /* ... */
-    1681           20 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1682              : /* (content generated from line coverage data) */
-    1683              : /* ... */
-    1684            1 : /* ... */
-    1685            6 : /* ... */
-    1686            6 : /* ... */
-    1687            6 : /* ... */
-    1688            6 : /* ... */
-    1689            3 : /* ... */
-    1690            3 : /* ... */
-    1691            3 : /* ... */
-    1692              : /* ... */
-    1693            3 : /* ... */
-    1694            3 : /* ... */
-    1695            2 : /* ... */
-    1696            2 : /* ... */
-    1697              : /* ... */
-    1698              : /* ... */
-    1699              : /* ... */
-    1700            3 : /* ... */
-    1701              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1702              : /* (content generated from line coverage data) */
-    1703              : /* ... */
-    1704            2 : /* ... */
-    1705            2 : /* ... */
-    1706            0 : /* ... */
-    1707              : /* ... */
-    1708            2 : /* ... */
-    1709              : /* ... */
-    1710              : /* ... */
-    1711            6 : /* ... */
-    1712              : /* ... */
-    1713              : /* ... */
-    1714            1 : /* ... */
-    1715            1 : /* ... */
-    1716            1 : /* ... */
-    1717            1 : /* ... */
-    1718              : /* ... */
-    1719            1 : /* ... */
-    1720            0 : /* ... */
-    1721            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1722            0 : /* (content generated from line coverage data) */
-    1723              : /* ... */
-    1724            0 : /* ... */
-    1725            0 : /* ... */
-    1726            0 : /* ... */
-    1727            0 : /* ... */
-    1728              : /* ... */
-    1729              : /* ... */
-    1730              : /* ... */
-    1731            0 : /* ... */
-    1732              : /* ... */
-    1733              : /* ... */
-    1734              : /* ... */
-    1735            0 : /* ... */
-    1736            0 : /* ... */
-    1737            0 : /* ... */
-    1738              : /* ... */
-    1739            0 : /* ... */
-    1740              : /* ... */
-    1741              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1742            1 : /* (content generated from line coverage data) */
-    1743              : /* ... */
-    1744              : /* ... */
-    1745              : /* ... */
-    1746              : /* ... */
-    1747              : /* ... */
-    1748            1 : /* ... */
-    1749            5 : /* ... */
-    1750              : /* ... */
-    1751              : /* ... */
-    1752            1 : /* ... */
-    1753            6 : /* ... */
-    1754            6 : /* ... */
-    1755            6 : /* ... */
-    1756            1 : /* ... */
-    1757              : /* ... */
-    1758            5 : /* ... */
-    1759              : /* ... */
-    1760              : /* ... */
-    1761            6 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1762            6 : /* (content generated from line coverage data) */
-    1763              : /* ... */
-    1764            6 : /* ... */
-    1765            6 : /* ... */
-    1766            6 : /* ... */
-    1767              : /* ... */
-    1768            6 : /* ... */
-    1769            6 : /* ... */
-    1770            6 : /* ... */
-    1771            6 : /* ... */
-    1772            6 : /* ... */
-    1773            6 : /* ... */
-    1774            6 : /* ... */
-    1775              : /* ... */
-    1776            6 : /* ... */
-    1777              : /* ... */
-    1778              : /* ... */
-    1779            6 : /* ... */
-    1780            6 : /* ... */
-    1781            6 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1782            6 : /* (content generated from line coverage data) */
-    1783            6 : /* ... */
-    1784              : /* ... */
-    1785            6 : /* ... */
-    1786            6 : /* ... */
-    1787            6 : /* ... */
-    1788            6 : /* ... */
-    1789              : /* ... */
-    1790              : /* ... */
-    1791            6 : /* ... */
-    1792            6 : /* ... */
-    1793            6 : /* ... */
-    1794            6 : /* ... */
-    1795              : /* ... */
-    1796            6 : /* ... */
-    1797            6 : /* ... */
-    1798            6 : /* ... */
-    1799            6 : /* ... */
-    1800              : /* ... */
-    1801              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1802            6 : /* (content generated from line coverage data) */
-    1803            4 : /* ... */
-    1804              : /* ... */
-    1805              : /* ... */
-    1806            6 : /* ... */
-    1807            1 : /* ... */
-    1808            1 : /* ... */
-    1809            1 : /* ... */
-    1810            1 : /* ... */
-    1811              : /* ... */
-    1812              : /* ... */
-    1813            6 : /* ... */
-    1814            6 : /* ... */
-    1815              : /* ... */
-    1816            6 : /* ... */
-    1817            6 : /* ... */
-    1818              : /* ... */
-    1819            6 : /* ... */
-    1820           11 : /* ... */
-    1821           11 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1822           11 : /* (content generated from line coverage data) */
-    1823            1 : /* ... */
-    1824              : /* ... */
-    1825           10 : /* ... */
-    1826           10 : /* ... */
-    1827           10 : /* ... */
-    1828           10 : /* ... */
-    1829           10 : /* ... */
-    1830            6 : /* ... */
-    1831            4 : /* ... */
-    1832            4 : /* ... */
-    1833            4 : /* ... */
-    1834            0 : /* ... */
-    1835            0 : /* ... */
-    1836            0 : /* ... */
-    1837            0 : /* ... */
-    1838            0 : /* ... */
-    1839            0 : /* ... */
-    1840            0 : /* ... */
-    1841            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1842            0 : /* (content generated from line coverage data) */
-    1843            0 : /* ... */
-    1844            0 : /* ... */
-    1845            0 : /* ... */
-    1846            0 : /* ... */
-    1847            0 : /* ... */
-    1848            0 : /* ... */
-    1849            0 : /* ... */
-    1850            0 : /* ... */
-    1851            0 : /* ... */
-    1852            0 : /* ... */
-    1853            0 : /* ... */
-    1854            0 : /* ... */
-    1855            0 : /* ... */
-    1856            0 : /* ... */
-    1857            0 : /* ... */
-    1858            0 : /* ... */
-    1859            0 : /* ... */
-    1860            0 : /* ... */
-    1861            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1862            0 : /* (content generated from line coverage data) */
-    1863            0 : /* ... */
-    1864            0 : /* ... */
-    1865            0 : /* ... */
-    1866            0 : /* ... */
-    1867            0 : /* ... */
-    1868            0 : /* ... */
-    1869            0 : /* ... */
-    1870            0 : /* ... */
-    1871            0 : /* ... */
-    1872            0 : /* ... */
-    1873              : /* ... */
-    1874              : /* ... */
-    1875           10 : /* ... */
-    1876              : /* ... */
-    1877              : /* ... */
-    1878            6 : /* ... */
-    1879            5 : /* ... */
-    1880           11 : /* ... */
-    1881           11 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1882            6 : /* (content generated from line coverage data) */
-    1883            6 : /* ... */
-    1884            6 : /* ... */
-    1885            6 : /* ... */
-    1886              : /* ... */
-    1887              : /* ... */
-    1888            0 : /* ... */
-    1889            0 : /* ... */
-    1890            0 : /* ... */
-    1891              : /* ... */
-    1892              : /* ... */
-    1893            0 : /* ... */
-    1894            0 : /* ... */
-    1895            0 : /* ... */
-    1896            0 : /* ... */
-    1897              : /* ... */
-    1898              : /* ... */
-    1899            5 : /* ... */
-    1900            5 : /* ... */
-    1901              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1902            5 : /* (content generated from line coverage data) */
-    1903              : /* ... */
-    1904            1 : /* ... */
-    1905            1 : /* ... */
-    1906            8 : /* ... */
-    1907            8 : /* ... */
-    1908            4 : /* ... */
-    1909            4 : /* ... */
-    1910            4 : /* ... */
-    1911            4 : /* ... */
-    1912              : /* ... */
-    1913              : /* ... */
-    1914            0 : /* ... */
-    1915            0 : /* ... */
-    1916            0 : /* ... */
-    1917              : /* ... */
-    1918              : /* ... */
-    1919            0 : /* ... */
-    1920            0 : /* ... */
-    1921            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1922            0 : /* (content generated from line coverage data) */
-    1923            0 : /* ... */
-    1924              : /* ... */
-    1925              : /* ... */
-    1926            4 : /* ... */
-    1927            4 : /* ... */
-    1928              : /* ... */
-    1929            4 : /* ... */
-    1930              : /* ... */
-    1931            0 : /* ... */
-    1932            0 : /* ... */
-    1933            0 : /* ... */
-    1934            0 : /* ... */
-    1935            0 : /* ... */
-    1936            0 : /* ... */
-    1937            0 : /* ... */
-    1938            0 : /* ... */
-    1939              : /* ... */
-    1940              : /* ... */
-    1941            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1942            0 : /* (content generated from line coverage data) */
-    1943            0 : /* ... */
-    1944              : /* ... */
-    1945              : /* ... */
-    1946            0 : /* ... */
-    1947            0 : /* ... */
-    1948            0 : /* ... */
-    1949            0 : /* ... */
-    1950            0 : /* ... */
-    1951            0 : /* ... */
-    1952              : /* ... */
-    1953              : /* ... */
-    1954            0 : /* ... */
-    1955            0 : /* ... */
-    1956              : /* ... */
-    1957            0 : /* ... */
-    1958              : /* ... */
-    1959            0 : /* ... */
-    1960            0 : /* ... */
-    1961            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1962            0 : /* (content generated from line coverage data) */
-    1963            0 : /* ... */
-    1964            0 : /* ... */
-    1965            0 : /* ... */
-    1966            0 : /* ... */
-    1967              : /* ... */
-    1968              : /* ... */
-    1969            0 : /* ... */
-    1970            0 : /* ... */
-    1971            0 : /* ... */
-    1972              : /* ... */
-    1973              : /* ... */
-    1974            0 : /* ... */
-    1975            0 : /* ... */
-    1976            0 : /* ... */
-    1977            0 : /* ... */
-    1978            0 : /* ... */
-    1979            0 : /* ... */
-    1980            0 : /* ... */
-    1981              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    1982              : /* (content generated from line coverage data) */
-    1983            0 : /* ... */
-    1984            0 : /* ... */
-    1985              : /* ... */
-    1986            0 : /* ... */
-    1987              : /* ... */
-    1988            0 : /* ... */
-    1989            0 : /* ... */
-    1990            0 : /* ... */
-    1991            0 : /* ... */
-    1992            0 : /* ... */
-    1993            0 : /* ... */
-    1994            0 : /* ... */
-    1995            0 : /* ... */
-    1996              : /* ... */
-    1997              : /* ... */
-    1998            0 : /* ... */
-    1999            0 : /* ... */
-    2000            0 : /* ... */
-    2001              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2002              : /* (content generated from line coverage data) */
-    2003            0 : /* ... */
-    2004            0 : /* ... */
-    2005            0 : /* ... */
-    2006            0 : /* ... */
-    2007            0 : /* ... */
-    2008            0 : /* ... */
-    2009            0 : /* ... */
-    2010            0 : /* ... */
-    2011              : /* ... */
-    2012              : /* ... */
-    2013            0 : /* ... */
-    2014            0 : /* ... */
-    2015              : /* ... */
-    2016            0 : /* ... */
-    2017              : /* ... */
-    2018            0 : /* ... */
-    2019            0 : /* ... */
-    2020            0 : /* ... */
-    2021            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2022            0 : /* (content generated from line coverage data) */
-    2023            0 : /* ... */
-    2024            0 : /* ... */
-    2025            0 : /* ... */
-    2026              : /* ... */
-    2027              : /* ... */
-    2028            0 : /* ... */
-    2029            0 : /* ... */
-    2030            0 : /* ... */
-    2031              : /* ... */
-    2032              : /* ... */
-    2033            0 : /* ... */
-    2034            0 : /* ... */
-    2035            0 : /* ... */
-    2036            0 : /* ... */
-    2037            0 : /* ... */
-    2038            0 : /* ... */
-    2039            0 : /* ... */
-    2040            0 : /* ... */
-    2041            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2042              : /* (content generated from line coverage data) */
-    2043              : /* ... */
-    2044            0 : /* ... */
-    2045            0 : /* ... */
-    2046              : /* ... */
-    2047            0 : /* ... */
-    2048              : /* ... */
-    2049            0 : /* ... */
-    2050            0 : /* ... */
-    2051            0 : /* ... */
-    2052            0 : /* ... */
-    2053            0 : /* ... */
-    2054            0 : /* ... */
-    2055            0 : /* ... */
-    2056            0 : /* ... */
-    2057              : /* ... */
-    2058              : /* ... */
-    2059            0 : /* ... */
-    2060            0 : /* ... */
-    2061            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2062              : /* (content generated from line coverage data) */
-    2063              : /* ... */
-    2064            0 : /* ... */
-    2065            0 : /* ... */
-    2066            0 : /* ... */
-    2067            0 : /* ... */
-    2068            0 : /* ... */
-    2069            0 : /* ... */
-    2070            0 : /* ... */
-    2071            0 : /* ... */
-    2072            0 : /* ... */
-    2073            0 : /* ... */
-    2074              : /* ... */
-    2075              : /* ... */
-    2076            0 : /* ... */
-    2077            0 : /* ... */
-    2078              : /* ... */
-    2079            0 : /* ... */
-    2080              : /* ... */
-    2081            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2082            0 : /* (content generated from line coverage data) */
-    2083            0 : /* ... */
-    2084            0 : /* ... */
-    2085            0 : /* ... */
-    2086            0 : /* ... */
-    2087            0 : /* ... */
-    2088            0 : /* ... */
-    2089              : /* ... */
-    2090              : /* ... */
-    2091            0 : /* ... */
-    2092            0 : /* ... */
-    2093            0 : /* ... */
-    2094              : /* ... */
-    2095              : /* ... */
-    2096            0 : /* ... */
-    2097            0 : /* ... */
-    2098            0 : /* ... */
-    2099            0 : /* ... */
-    2100            0 : /* ... */
-    2101            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2102            0 : /* (content generated from line coverage data) */
-    2103            0 : /* ... */
-    2104            0 : /* ... */
-    2105            0 : /* ... */
-    2106            0 : /* ... */
-    2107              : /* ... */
-    2108              : /* ... */
-    2109            0 : /* ... */
-    2110            0 : /* ... */
-    2111              : /* ... */
-    2112            0 : /* ... */
-    2113              : /* ... */
-    2114              : /* ... */
-    2115            0 : /* ... */
-    2116            0 : /* ... */
-    2117            0 : /* ... */
-    2118            0 : /* ... */
-    2119            0 : /* ... */
-    2120            0 : /* ... */
-    2121            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2122            0 : /* (content generated from line coverage data) */
-    2123              : /* ... */
-    2124              : /* ... */
-    2125            0 : /* ... */
-    2126            0 : /* ... */
-    2127            0 : /* ... */
-    2128              : /* ... */
-    2129              : /* ... */
-    2130            0 : /* ... */
-    2131            0 : /* ... */
-    2132            0 : /* ... */
-    2133              : /* ... */
-    2134              : /* ... */
-    2135            0 : /* ... */
-    2136            0 : /* ... */
-    2137              : /* ... */
-    2138            0 : /* ... */
-    2139            0 : /* ... */
-    2140            0 : /* ... */
-    2141            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2142            0 : /* (content generated from line coverage data) */
-    2143            0 : /* ... */
-    2144            0 : /* ... */
-    2145            0 : /* ... */
-    2146              : /* ... */
-    2147              : /* ... */
-    2148            0 : /* ... */
-    2149            0 : /* ... */
-    2150              : /* ... */
-    2151              : /* ... */
-    2152            0 : /* ... */
-    2153              : /* ... */
-    2154              : /* ... */
-    2155              : /* ... */
-    2156            6 : /* ... */
-    2157            6 : /* ... */
-    2158            6 : /* ... */
-    2159            6 : /* ... */
-    2160            6 : /* ... */
-    2161            6 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2162              : /* (content generated from line coverage data) */
-    2163              : /* ... */
-    2164            1 : /* ... */
-    2165            1 : /* ... */
-    2166            1 : /* ... */
-    2167            1 : /* ... */
-    2168            1 : /* ... */
-    2169            1 : /* ... */
-    2170            1 : /* ... */
-    2171            1 : /* ... */
-    2172              : /* ... */
-    2173            1 : /* ... */
-    2174           33 : /* ... */
-    2175           33 : /* ... */
-    2176              : /* ... */
-    2177           33 : /* ... */
-    2178              : /* ... */
-    2179           33 : /* ... */
-    2180              : /* ... */
-    2181           33 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2182           33 : /* (content generated from line coverage data) */
-    2183              : /* ... */
-    2184           33 : /* ... */
-    2185           33 : /* ... */
-    2186           33 : /* ... */
-    2187           33 : /* ... */
-    2188           33 : /* ... */
-    2189              : /* ... */
-    2190           33 : /* ... */
-    2191           47 : /* ... */
-    2192           47 : /* ... */
-    2193            7 : /* ... */
-    2194              : /* ... */
-    2195              : /* ... */
-    2196           40 : /* ... */
-    2197           27 : /* ... */
-    2198              : /* ... */
-    2199              : /* ... */
-    2200              : /* ... */
-    2201           26 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2202            0 : /* (content generated from line coverage data) */
-    2203              : /* ... */
-    2204              : /* ... */
-    2205           26 : /* ... */
-    2206           48 : /* ... */
-    2207           48 : /* ... */
-    2208              : /* ... */
-    2209              : /* ... */
-    2210           34 : /* ... */
-    2211              : /* ... */
-    2212           34 : /* ... */
-    2213              : /* ... */
-    2214           34 : /* ... */
-    2215           47 : /* ... */
-    2216           47 : /* ... */
-    2217            0 : /* ... */
-    2218            0 : /* ... */
-    2219              : /* ... */
-    2220              : /* ... */
-    2221              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2222           34 : /* (content generated from line coverage data) */
-    2223              : /* ... */
-    2224              : /* ... */
-    2225              : /* ... */
-    2226           34 : /* ... */
-    2227           34 : /* ... */
-    2228              : /* ... */
-    2229              : /* ... */
-    2230           26 : /* ... */
-    2231              : /* ... */
-    2232              : /* ... */
-    2233            1 : /* ... */
-    2234            4 : /* ... */
-    2235            4 : /* ... */
-    2236            0 : /* ... */
-    2237              : /* ... */
-    2238              : /* ... */
-    2239            4 : /* ... */
-    2240            4 : /* ... */
-    2241            4 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2242            4 : /* (content generated from line coverage data) */
-    2243            4 : /* ... */
-    2244            0 : /* ... */
-    2245              : /* ... */
-    2246              : /* ... */
-    2247            4 : /* ... */
-    2248            4 : /* ... */
-    2249              : /* ... */
-    2250            4 : /* ... */
-    2251           24 : /* ... */
-    2252           24 : /* ... */
-    2253           22 : /* ... */
-    2254           22 : /* ... */
-    2255            8 : /* ... */
-    2256              : /* ... */
-    2257           14 : /* ... */
-    2258           14 : /* ... */
-    2259           14 : /* ... */
-    2260           14 : /* ... */
-    2261              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2262           16 : /* (content generated from line coverage data) */
-    2263           16 : /* ... */
-    2264              : /* ... */
-    2265              : /* ... */
-    2266              : /* ... */
-    2267            1 : /* ... */
-    2268            2 : /* ... */
-    2269              : /* ... */
-    2270              : /* ... */
-    2271              : /* ... */
-    2272              : /* ... */
-    2273              : /* ... */
-    2274              : /* ... */
-    2275              : /* ... */
-    2276              : /* ... */
-    2277              : /* ... */
-    2278              : /* ... */
-    2279              : /* ... */
-    2280              : /* ... */
-    2281              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2282              : /* (content generated from line coverage data) */
-    2283              : /* ... */
-    2284              : /* ... */
-    2285              : /* ... */
-    2286              : /* ... */
-    2287              : /* ... */
-    2288              : /* ... */
-    2289              : /* ... */
-    2290              : /* ... */
-    2291              : /* ... */
-    2292              : /* ... */
-    2293              : /* ... */
-    2294              : /* ... */
-    2295              : /* ... */
-    2296              : /* ... */
-    2297            1 : /* ... */
-    2298            1 : /* ... */
-    2299              : /* ... */
-    2300            1 : /* ... */
-    2301            1 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2302            1 : /* (content generated from line coverage data) */
-    2303            1 : /* ... */
-    2304            1 : /* ... */
-    2305            1 : /* ... */
-    2306            1 : /* ... */
-    2307            1 : /* ... */
-    2308            1 : /* ... */
-    2309            1 : /* ... */
-    2310            1 : /* ... */
-    2311            1 : /* ... */
-    2312            1 : /* ... */
-    2313            1 : /* ... */
-    2314            1 : /* ... */
-    2315            1 : /* ... */
-    2316              : /* ... */
-    2317            1 : /* ... */
-    2318           72 : /* ... */
-    2319           72 : /* ... */
-    2320           72 : /* ... */
-    2321           72 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2322           72 : /* (content generated from line coverage data) */
-    2323              : /* ... */
-    2324           72 : /* ... */
-    2325           72 : /* ... */
-    2326           72 : /* ... */
-    2327           72 : /* ... */
-    2328           72 : /* ... */
-    2329           72 : /* ... */
-    2330              : /* ... */
-    2331           72 : /* ... */
-    2332           72 : /* ... */
-    2333              : /* ... */
-    2334           72 : /* ... */
-    2335           72 : /* ... */
-    2336              : /* ... */
-    2337           72 : /* ... */
-    2338              : /* ... */
-    2339           72 : /* ... */
-    2340        18432 : /* ... */
-    2341        18432 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2342              : /* (content generated from line coverage data) */
-    2343              : /* ... */
-    2344           72 : /* ... */
-    2345              : /* ... */
-    2346         1008 : /* ... */
-    2347              : /* ... */
-    2348              : /* ... */
-    2349           72 : /* ... */
-    2350           72 : /* ... */
-    2351           72 : /* ... */
-    2352           72 : /* ... */
-    2353           72 : /* ... */
-    2354           72 : /* ... */
-    2355              : /* ... */
-    2356           72 : /* ... */
-    2357           72 : /* ... */
-    2358           72 : /* ... */
-    2359           72 : /* ... */
-    2360           72 : /* ... */
-    2361           72 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2362           72 : /* (content generated from line coverage data) */
-    2363           72 : /* ... */
-    2364           72 : /* ... */
-    2365           72 : /* ... */
-    2366           72 : /* ... */
-    2367           72 : /* ... */
-    2368              : /* ... */
-    2369           72 : /* ... */
-    2370              : /* ... */
-    2371           72 : /* ... */
-    2372              : /* ... */
-    2373              : /* ... */
-    2374            1 : /* ... */
-    2375              : /* ... */
-    2376              : /* ... */
-    2377              : /* ... */
-    2378              : /* ... */
-    2379              : /* ... */
-    2380              : /* ... */
-    2381              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2382              : /* (content generated from line coverage data) */
-    2383              : /* ... */
-    2384              : /* ... */
-    2385              : /* ... */
-    2386              : /* ... */
-    2387              : /* ... */
-    2388              : /* ... */
-    2389              : /* ... */
-    2390              : /* ... */
-    2391              : /* ... */
-    2392              : /* ... */
-    2393              : /* ... */
-    2394              : /* ... */
-    2395              : /* ... */
-    2396              : /* ... */
-    2397              : /* ... */
-    2398              : /* ... */
-    2399              : /* ... */
-    2400              : /* ... */
-    2401              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2402              : /* (content generated from line coverage data) */
-    2403              : /* ... */
-    2404              : /* ... */
-    2405              : /* ... */
-    2406              : /* ... */
-    2407              : /* ... */
-    2408              : /* ... */
-    2409              : /* ... */
-    2410              : /* ... */
-    2411              : /* ... */
-    2412              : /* ... */
-    2413              : /* ... */
-    2414              : /* ... */
-    2415              : /* ... */
-    2416              : /* ... */
-    2417              : /* ... */
-    2418              : /* ... */
-    2419              : /* ... */
-    2420              : /* ... */
-    2421              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2422              : /* (content generated from line coverage data) */
-    2423              : /* ... */
-    2424              : /* ... */
-    2425              : /* ... */
-    2426              : /* ... */
-    2427              : /* ... */
-    2428              : /* ... */
-    2429              : /* ... */
-    2430              : /* ... */
-    2431              : /* ... */
-    2432              : /* ... */
-    2433              : /* ... */
-    2434              : /* ... */
-    2435              : /* ... */
-    2436              : /* ... */
-    2437              : /* ... */
-    2438              : /* ... */
-    2439              : /* ... */
-    2440              : /* ... */
-    2441              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2442              : /* (content generated from line coverage data) */
-    2443              : /* ... */
-    2444              : /* ... */
-    2445              : /* ... */
-    2446              : /* ... */
-    2447              : /* ... */
-    2448              : /* ... */
-    2449              : /* ... */
-    2450              : /* ... */
-    2451              : /* ... */
-    2452              : /* ... */
-    2453              : /* ... */
-    2454              : /* ... */
-    2455              : /* ... */
-    2456              : /* ... */
-    2457              : /* ... */
-    2458              : /* ... */
-    2459              : /* ... */
-    2460              : /* ... */
-    2461              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2462              : /* (content generated from line coverage data) */
-    2463              : /* ... */
-    2464              : /* ... */
-    2465              : /* ... */
-    2466              : /* ... */
-    2467              : /* ... */
-    2468              : /* ... */
-    2469              : /* ... */
-    2470              : /* ... */
-    2471              : /* ... */
-    2472              : /* ... */
-    2473              : /* ... */
-    2474              : /* ... */
-    2475              : /* ... */
-    2476              : /* ... */
-    2477              : /* ... */
-    2478              : /* ... */
-    2479              : /* ... */
-    2480              : /* ... */
-    2481              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2482              : /* (content generated from line coverage data) */
-    2483              : /* ... */
-    2484              : /* ... */
-    2485            1 : /* ... */
-    2486            1 : /* ... */
-    2487            1 : /* ... */
-    2488              : /* ... */
-    2489            1 : /* ... */
-    2490            1 : /* ... */
-    2491            1 : /* ... */
-    2492            1 : /* ... */
-    2493            1 : /* ... */
-    2494            1 : /* ... */
-    2495            1 : /* ... */
-    2496            1 : /* ... */
-    2497            1 : /* ... */
-    2498            1 : /* ... */
-    2499            1 : /* ... */
-    2500            1 : /* ... */
-    2501            1 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2502              : /* (content generated from line coverage data) */
-    2503            1 : /* ... */
-    2504              : /* ... */
-    2505              : /* ... */
-    2506            1 : /* ... */
-    2507            1 : /* ... */
-    2508            1 : /* ... */
-    2509            1 : /* ... */
-    2510              : /* ... */
-    2511            1 : /* ... */
-    2512              : /* ... */
-    2513            1 : /* ... */
-    2514            1 : /* ... */
-    2515            1 : /* ... */
-    2516            1 : /* ... */
-    2517              : /* ... */
-    2518            1 : /* ... */
-    2519            1 : /* ... */
-    2520            1 : /* ... */
-    2521            1 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2522            1 : /* (content generated from line coverage data) */
-    2523            1 : /* ... */
-    2524            1 : /* ... */
-    2525            1 : /* ... */
-    2526            1 : /* ... */
-    2527            1 : /* ... */
-    2528            1 : /* ... */
-    2529            1 : /* ... */
-    2530            1 : /* ... */
-    2531            1 : /* ... */
-    2532            1 : /* ... */
-    2533              : /* ... */
-    2534            1 : /* ... */
-    2535              : /* ... */
-    2536            1 : /* ... */
-    2537            1 : /* ... */
-    2538            1 : /* ... */
-    2539            1 : /* ... */
-    2540            1 : /* ... */
-    2541              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/jecs.luau
 not found */
-    2542            1 : /* (content generated from line coverage data) */
-    2543            1 : /* ... */
-    2544            1 : /* ... */
-    2545            1 : /* ... */
-    2546            1 : /* ... */
-    2547            1 : /* ... */
-    2548              : /* ... */
-    2549            1 : /* ... */
-        
-
-
- - - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/test/test/index-sort-f.html b/coverage/jecs/test/test/index-sort-f.html deleted file mode 100644 index 08f6f0c..0000000 --- a/coverage/jecs/test/test/index-sort-f.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/test/test - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs/test/testCoverageTotalHit
Test:coverage.outLines:97.9 %12271201
Test Date:2025-03-27 03:52:25Functions:83.6 %6756
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Filename Sort by file nameLine Coverage Sort by line coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit
tests.luau -
97.9%97.9%
-
97.9 %1227120183.6 %6756
-
-
- - - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/test/test/index-sort-l.html b/coverage/jecs/test/test/index-sort-l.html deleted file mode 100644 index e16165b..0000000 --- a/coverage/jecs/test/test/index-sort-l.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/test/test - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs/test/testCoverageTotalHit
Test:coverage.outLines:97.9 %12271201
Test Date:2025-03-27 03:52:25Functions:83.6 %6756
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Filename Sort by file nameLine Coverage Sort by line coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit
tests.luau -
97.9%97.9%
-
97.9 %1227120183.6 %6756
-
-
- - - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/test/test/index.html b/coverage/jecs/test/test/index.html deleted file mode 100644 index c85e4b8..0000000 --- a/coverage/jecs/test/test/index.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/test/test - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs/test/testCoverageTotalHit
Test:coverage.outLines:97.9 %12271201
Test Date:2025-03-27 03:52:25Functions:83.6 %6756
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Filename Sort by file nameLine Coverage Sort by line coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit
tests.luau - -
97.9%97.9%
-
97.9 %1227120183.6 %6756
-
-
- - - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/test/test/tests.luau.func-c.html b/coverage/jecs/test/test/tests.luau.func-c.html deleted file mode 100644 index 58fa91c..0000000 --- a/coverage/jecs/test/test/tests.luau.func-c.html +++ /dev/null @@ -1,544 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/test/test/tests.luau - functions - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs/test/test - tests.luau (source / functions)CoverageTotalHit
Test:coverage.outLines:97.9 %12271201
Test Date:2025-03-27 03:52:25Functions:83.6 %6756
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Function Name Sort by function nameHit count Sort by function hit count
gray:58 0
green:38 0
green_highlight:54 0
name:116 0
pe:63 0
pp:68 0
red:42 0
red_highlight:50 0
white:34 0
white_underline:30 0
yellow:46 0
<anonymous>:1030 1
<anonymous>:1058 1
<anonymous>:1095 1
<anonymous>:1160 1
<anonymous>:1191 1
<anonymous>:120 1
<anonymous>:1210 1
<anonymous>:1221 1
<anonymous>:1229 1
<anonymous>:1306 1
<anonymous>:1311 1
<anonymous>:1351 1
<anonymous>:136 1
<anonymous>:1372 1
<anonymous>:1399 1
<anonymous>:1428 1
<anonymous>:1526 1
<anonymous>:1538 1
<anonymous>:1543 1
<anonymous>:1554 1
<anonymous>:1568 1
<anonymous>:1584 1
<anonymous>:1598 1
<anonymous>:1657 1
<anonymous>:1707 1
<anonymous>:174 1
<anonymous>:1776 1
<anonymous>:1784 1
<anonymous>:1806 1
<anonymous>:1826 1
<anonymous>:187 1
<anonymous>:192 1
<anonymous>:243 1
<anonymous>:259 1
<anonymous>:315 1
<anonymous>:389 1
<anonymous>:438 1
<anonymous>:449 1
<anonymous>:456 1
<anonymous>:478 1
<anonymous>:517 1
<anonymous>:575 1
<anonymous>:599 1
<anonymous>:899 1
<main> 1
columns:86 1
records:83 1
tuple:94 1
getTargets:195 2
updateCooldowns:1664 2
setAttacksAndEats:215 3
archetype:80 4
row:89 5
debug_world_inspect:73 7
tbl:77 12
record:74 17
-
-
- - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/test/test/tests.luau.func.html b/coverage/jecs/test/test/tests.luau.func.html deleted file mode 100644 index 563d1dd..0000000 --- a/coverage/jecs/test/test/tests.luau.func.html +++ /dev/null @@ -1,544 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/test/test/tests.luau - functions - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs/test/test - tests.luau (source / functions)CoverageTotalHit
Test:coverage.outLines:97.9 %12271201
Test Date:2025-03-27 03:52:25Functions:83.6 %6756
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Function Name Sort by function nameHit count Sort by function hit count
<anonymous>:1030 1
<anonymous>:1058 1
<anonymous>:1095 1
<anonymous>:1160 1
<anonymous>:1191 1
<anonymous>:120 1
<anonymous>:1210 1
<anonymous>:1221 1
<anonymous>:1229 1
<anonymous>:1306 1
<anonymous>:1311 1
<anonymous>:1351 1
<anonymous>:136 1
<anonymous>:1372 1
<anonymous>:1399 1
<anonymous>:1428 1
<anonymous>:1526 1
<anonymous>:1538 1
<anonymous>:1543 1
<anonymous>:1554 1
<anonymous>:1568 1
<anonymous>:1584 1
<anonymous>:1598 1
<anonymous>:1657 1
<anonymous>:1707 1
<anonymous>:174 1
<anonymous>:1776 1
<anonymous>:1784 1
<anonymous>:1806 1
<anonymous>:1826 1
<anonymous>:187 1
<anonymous>:192 1
<anonymous>:243 1
<anonymous>:259 1
<anonymous>:315 1
<anonymous>:389 1
<anonymous>:438 1
<anonymous>:449 1
<anonymous>:456 1
<anonymous>:478 1
<anonymous>:517 1
<anonymous>:575 1
<anonymous>:599 1
<anonymous>:899 1
<main> 1
archetype:80 4
columns:86 1
debug_world_inspect:73 7
getTargets:195 2
gray:58 0
green:38 0
green_highlight:54 0
name:116 0
pe:63 0
pp:68 0
record:74 17
records:83 1
red:42 0
red_highlight:50 0
row:89 5
setAttacksAndEats:215 3
tbl:77 12
tuple:94 1
updateCooldowns:1664 2
white:34 0
white_underline:30 0
yellow:46 0
-
-
- - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/test/test/tests.luau.gcov.html b/coverage/jecs/test/test/tests.luau.gcov.html deleted file mode 100644 index f0b5ca2..0000000 --- a/coverage/jecs/test/test/tests.luau.gcov.html +++ /dev/null @@ -1,1913 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/test/test/tests.luau - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs/test/test - tests.luau (source / functions)CoverageTotalHit
Test:coverage.outLines:97.9 %12271201
Test Date:2025-03-27 03:52:25Functions:83.6 %6756
-
- - - - - - - - -

-
            Line data    Source code
-
-       1            1 : /* test/tests.luau
 not found */
-       2              : /* (content generated from line coverage data) */
-       3            1 : /* ... */
-       4            1 : /* ... */
-       5            1 : /* ... */
-       6            1 : /* ... */
-       7            1 : /* ... */
-       8            1 : /* ... */
-       9            1 : /* ... */
-      10            1 : /* ... */
-      11            1 : /* ... */
-      12            1 : /* ... */
-      13            1 : /* ... */
-      14            1 : /* ... */
-      15            1 : /* ... */
-      16            1 : /* ... */
-      17              : /* ... */
-      18            1 : /* ... */
-      19            1 : /* ... */
-      20            1 : /* ... */
-      21            1 : /* test/tests.luau
 not found */
-      22            1 : /* (content generated from line coverage data) */
-      23              : /* ... */
-      24            1 : /* ... */
-      25              : /* ... */
-      26              : /* ... */
-      27              : /* ... */
-      28              : /* ... */
-      29            1 : /* ... */
-      30            1 : /* ... */
-      31            0 : /* ... */
-      32              : /* ... */
-      33              : /* ... */
-      34            1 : /* ... */
-      35            0 : /* ... */
-      36              : /* ... */
-      37              : /* ... */
-      38            1 : /* ... */
-      39            0 : /* ... */
-      40              : /* ... */
-      41              : /* test/tests.luau
 not found */
-      42            1 : /* (content generated from line coverage data) */
-      43            0 : /* ... */
-      44              : /* ... */
-      45              : /* ... */
-      46            1 : /* ... */
-      47            0 : /* ... */
-      48              : /* ... */
-      49              : /* ... */
-      50            1 : /* ... */
-      51            0 : /* ... */
-      52              : /* ... */
-      53              : /* ... */
-      54            1 : /* ... */
-      55            0 : /* ... */
-      56              : /* ... */
-      57              : /* ... */
-      58            1 : /* ... */
-      59            0 : /* ... */
-      60              : /* ... */
-      61              : /* test/tests.luau
 not found */
-      62              : /* (content generated from line coverage data) */
-      63            1 : /* ... */
-      64            0 : /* ... */
-      65            0 : /* ... */
-      66              : /* ... */
-      67              : /* ... */
-      68            1 : /* ... */
-      69            0 : /* ... */
-      70            0 : /* ... */
-      71              : /* ... */
-      72              : /* ... */
-      73            1 : /* ... */
-      74            7 : /* ... */
-      75           17 : /* ... */
-      76              : /* ... */
-      77            7 : /* ... */
-      78           12 : /* ... */
-      79              : /* ... */
-      80            7 : /* ... */
-      81            4 : /* test/tests.luau
 not found */
-      82              : /* (content generated from line coverage data) */
-      83            7 : /* ... */
-      84            1 : /* ... */
-      85              : /* ... */
-      86            7 : /* ... */
-      87            1 : /* ... */
-      88              : /* ... */
-      89            7 : /* ... */
-      90            5 : /* ... */
-      91              : /* ... */
-      92              : /* ... */
-      93              : /* ... */
-      94            7 : /* ... */
-      95            1 : /* ... */
-      96            2 : /* ... */
-      97            0 : /* ... */
-      98              : /* ... */
-      99              : /* ... */
-     100            1 : /* ... */
-     101              : /* test/tests.luau
 not found */
-     102              : /* (content generated from line coverage data) */
-     103            7 : /* ... */
-     104            7 : /* ... */
-     105            7 : /* ... */
-     106            7 : /* ... */
-     107            7 : /* ... */
-     108            7 : /* ... */
-     109            7 : /* ... */
-     110            7 : /* ... */
-     111              : /* ... */
-     112              : /* ... */
-     113              : /* ... */
-     114            1 : /* ... */
-     115              : /* ... */
-     116            1 : /* ... */
-     117            0 : /* ... */
-     118              : /* ... */
-     119              : /* ... */
-     120            1 : /* ... */
-     121            1 : /* test/tests.luau
 not found */
-     122            1 : /* (content generated from line coverage data) */
-     123              : /* ... */
-     124            1 : /* ... */
-     125            1 : /* ... */
-     126            1 : /* ... */
-     127            1 : /* ... */
-     128            1 : /* ... */
-     129            1 : /* ... */
-     130            1 : /* ... */
-     131            1 : /* ... */
-     132            1 : /* ... */
-     133              : /* ... */
-     134              : /* ... */
-     135              : /* ... */
-     136            1 : /* ... */
-     137            1 : /* ... */
-     138            1 : /* ... */
-     139            1 : /* ... */
-     140            1 : /* ... */
-     141              : /* test/tests.luau
 not found */
-     142            1 : /* (content generated from line coverage data) */
-     143            1 : /* ... */
-     144            1 : /* ... */
-     145            1 : /* ... */
-     146              : /* ... */
-     147            1 : /* ... */
-     148            1 : /* ... */
-     149              : /* ... */
-     150            1 : /* ... */
-     151            2 : /* ... */
-     152            2 : /* ... */
-     153            2 : /* ... */
-     154            2 : /* ... */
-     155              : /* ... */
-     156            2 : /* ... */
-     157            2 : /* ... */
-     158            2 : /* ... */
-     159            1 : /* ... */
-     160              : /* ... */
-     161            1 : /* test/tests.luau
 not found */
-     162              : /* (content generated from line coverage data) */
-     163            2 : /* ... */
-     164            2 : /* ... */
-     165              : /* ... */
-     166              : /* ... */
-     167              : /* ... */
-     168            1 : /* ... */
-     169            1 : /* ... */
-     170              : /* ... */
-     171              : /* ... */
-     172            1 : /* ... */
-     173              : /* ... */
-     174            1 : /* ... */
-     175            1 : /* ... */
-     176            1 : /* ... */
-     177            1 : /* ... */
-     178            1 : /* ... */
-     179            1 : /* ... */
-     180            1 : /* ... */
-     181            1 : /* test/tests.luau
 not found */
-     182            1 : /* (content generated from line coverage data) */
-     183            1 : /* ... */
-     184            1 : /* ... */
-     185            1 : /* ... */
-     186            1 : /* ... */
-     187            1 : /* ... */
-     188            1 : /* ... */
-     189              : /* ... */
-     190              : /* ... */
-     191              : /* ... */
-     192            1 : /* ... */
-     193            1 : /* ... */
-     194              : /* ... */
-     195            1 : /* ... */
-     196            2 : /* ... */
-     197            2 : /* ... */
-     198            2 : /* ... */
-     199            2 : /* ... */
-     200            2 : /* ... */
-     201            2 : /* test/tests.luau
 not found */
-     202            2 : /* (content generated from line coverage data) */
-     203            2 : /* ... */
-     204            2 : /* ... */
-     205            2 : /* ... */
-     206              : /* ... */
-     207              : /* ... */
-     208              : /* ... */
-     209            2 : /* ... */
-     210              : /* ... */
-     211              : /* ... */
-     212            1 : /* ... */
-     213            1 : /* ... */
-     214              : /* ... */
-     215            1 : /* ... */
-     216            3 : /* ... */
-     217            3 : /* ... */
-     218              : /* ... */
-     219              : /* ... */
-     220            1 : /* ... */
-     221            1 : /* test/tests.luau
 not found */
-     222            1 : /* (content generated from line coverage data) */
-     223            1 : /* ... */
-     224            1 : /* ... */
-     225            1 : /* ... */
-     226            1 : /* ... */
-     227            1 : /* ... */
-     228            1 : /* ... */
-     229            1 : /* ... */
-     230              : /* ... */
-     231              : /* ... */
-     232            1 : /* ... */
-     233            1 : /* ... */
-     234              : /* ... */
-     235            1 : /* ... */
-     236            1 : /* ... */
-     237              : /* ... */
-     238            1 : /* ... */
-     239            1 : /* ... */
-     240              : /* ... */
-     241              : /* test/tests.luau
 not found */
-     242              : /* (content generated from line coverage data) */
-     243            1 : /* ... */
-     244            1 : /* ... */
-     245            1 : /* ... */
-     246              : /* ... */
-     247            1 : /* ... */
-     248            1 : /* ... */
-     249            1 : /* ... */
-     250            1 : /* ... */
-     251            1 : /* ... */
-     252              : /* ... */
-     253            1 : /* ... */
-     254            1 : /* ... */
-     255            1 : /* ... */
-     256            1 : /* ... */
-     257              : /* ... */
-     258              : /* ... */
-     259            1 : /* ... */
-     260            1 : /* ... */
-     261            1 : /* test/tests.luau
 not found */
-     262            1 : /* (content generated from line coverage data) */
-     263            1 : /* ... */
-     264              : /* ... */
-     265            1 : /* ... */
-     266            1 : /* ... */
-     267            1 : /* ... */
-     268              : /* ... */
-     269            1 : /* ... */
-     270              : /* ... */
-     271            1 : /* ... */
-     272            1 : /* ... */
-     273              : /* ... */
-     274              : /* ... */
-     275            1 : /* ... */
-     276            1 : /* ... */
-     277            1 : /* ... */
-     278              : /* ... */
-     279            1 : /* ... */
-     280              : /* ... */
-     281            1 : /* test/tests.luau
 not found */
-     282            1 : /* (content generated from line coverage data) */
-     283            1 : /* ... */
-     284              : /* ... */
-     285            1 : /* ... */
-     286            1 : /* ... */
-     287            1 : /* ... */
-     288              : /* ... */
-     289            1 : /* ... */
-     290              : /* ... */
-     291            1 : /* ... */
-     292              : /* ... */
-     293            1 : /* ... */
-     294            1 : /* ... */
-     295            1 : /* ... */
-     296              : /* ... */
-     297            1 : /* ... */
-     298            1 : /* ... */
-     299            1 : /* ... */
-     300            1 : /* ... */
-     301            1 : /* test/tests.luau
 not found */
-     302            1 : /* (content generated from line coverage data) */
-     303            1 : /* ... */
-     304            1 : /* ... */
-     305            1 : /* ... */
-     306            1 : /* ... */
-     307            1 : /* ... */
-     308            1 : /* ... */
-     309            1 : /* ... */
-     310              : /* ... */
-     311              : /* ... */
-     312            1 : /* ... */
-     313            1 : /* ... */
-     314              : /* ... */
-     315            1 : /* ... */
-     316              : /* ... */
-     317            1 : /* ... */
-     318            1 : /* ... */
-     319            1 : /* ... */
-     320            1 : /* ... */
-     321          256 : /* test/tests.luau
 not found */
-     322          256 : /* (content generated from line coverage data) */
-     323          256 : /* ... */
-     324              : /* ... */
-     325              : /* ... */
-     326              : /* ... */
-     327            1 : /* ... */
-     328            1 : /* ... */
-     329            1 : /* ... */
-     330            1 : /* ... */
-     331            1 : /* ... */
-     332            1 : /* ... */
-     333            1 : /* ... */
-     334              : /* ... */
-     335              : /* ... */
-     336            1 : /* ... */
-     337            1 : /* ... */
-     338            1 : /* ... */
-     339            1 : /* ... */
-     340            1 : /* ... */
-     341              : /* test/tests.luau
 not found */
-     342              : /* (content generated from line coverage data) */
-     343            1 : /* ... */
-     344              : /* ... */
-     345            1 : /* ... */
-     346            1 : /* ... */
-     347              : /* ... */
-     348            1 : /* ... */
-     349            1 : /* ... */
-     350              : /* ... */
-     351            1 : /* ... */
-     352            1 : /* ... */
-     353            1 : /* ... */
-     354              : /* ... */
-     355            1 : /* ... */
-     356              : /* ... */
-     357              : /* ... */
-     358            1 : /* ... */
-     359            1 : /* ... */
-     360            1 : /* ... */
-     361            1 : /* test/tests.luau
 not found */
-     362            1 : /* (content generated from line coverage data) */
-     363            1 : /* ... */
-     364            1 : /* ... */
-     365            1 : /* ... */
-     366            1 : /* ... */
-     367            1 : /* ... */
-     368            1 : /* ... */
-     369            1 : /* ... */
-     370              : /* ... */
-     371              : /* ... */
-     372            1 : /* ... */
-     373            1 : /* ... */
-     374            1 : /* ... */
-     375            1 : /* ... */
-     376        65535 : /* ... */
-     377        65535 : /* ... */
-     378              : /* ... */
-     379            1 : /* ... */
-     380            1 : /* ... */
-     381            1 : /* test/tests.luau
 not found */
-     382            1 : /* (content generated from line coverage data) */
-     383            1 : /* ... */
-     384            1 : /* ... */
-     385            1 : /* ... */
-     386              : /* ... */
-     387              : /* ... */
-     388              : /* ... */
-     389            1 : /* ... */
-     390            1 : /* ... */
-     391              : /* ... */
-     392            1 : /* ... */
-     393              : /* ... */
-     394            1 : /* ... */
-     395              : /* ... */
-     396            1 : /* ... */
-     397            1 : /* ... */
-     398            1 : /* ... */
-     399              : /* ... */
-     400              : /* ... */
-     401            1 : /* test/tests.luau
 not found */
-     402            1 : /* (content generated from line coverage data) */
-     403              : /* ... */
-     404            1 : /* ... */
-     405              : /* ... */
-     406              : /* ... */
-     407            1 : /* ... */
-     408            1 : /* ... */
-     409            1 : /* ... */
-     410            1 : /* ... */
-     411            1 : /* ... */
-     412            1 : /* ... */
-     413            1 : /* ... */
-     414              : /* ... */
-     415            1 : /* ... */
-     416            1 : /* ... */
-     417              : /* ... */
-     418            1 : /* ... */
-     419              : /* ... */
-     420            1 : /* ... */
-     421              : /* test/tests.luau
 not found */
-     422              : /* (content generated from line coverage data) */
-     423              : /* ... */
-     424            1 : /* ... */
-     425            1 : /* ... */
-     426              : /* ... */
-     427            1 : /* ... */
-     428            1 : /* ... */
-     429            1 : /* ... */
-     430            1 : /* ... */
-     431              : /* ... */
-     432            1 : /* ... */
-     433              : /* ... */
-     434            1 : /* ... */
-     435            1 : /* ... */
-     436            1 : /* ... */
-     437              : /* ... */
-     438            1 : /* ... */
-     439            1 : /* ... */
-     440              : /* ... */
-     441              : /* test/tests.luau
 not found */
-     442            1 : /* (content generated from line coverage data) */
-     443            1 : /* ... */
-     444            1 : /* ... */
-     445            1 : /* ... */
-     446              : /* ... */
-     447            1 : /* ... */
-     448              : /* ... */
-     449            1 : /* ... */
-     450            1 : /* ... */
-     451              : /* ... */
-     452            1 : /* ... */
-     453              : /* ... */
-     454              : /* ... */
-     455              : /* ... */
-     456            1 : /* ... */
-     457              : /* ... */
-     458            1 : /* ... */
-     459            1 : /* ... */
-     460              : /* ... */
-     461            1 : /* test/tests.luau
 not found */
-     462            1 : /* (content generated from line coverage data) */
-     463              : /* ... */
-     464            1 : /* ... */
-     465              : /* ... */
-     466            1 : /* ... */
-     467            1 : /* ... */
-     468              : /* ... */
-     469              : /* ... */
-     470            1 : /* ... */
-     471            1 : /* ... */
-     472              : /* ... */
-     473            1 : /* ... */
-     474            1 : /* ... */
-     475              : /* ... */
-     476              : /* ... */
-     477              : /* ... */
-     478            1 : /* ... */
-     479              : /* ... */
-     480            1 : /* ... */
-     481            1 : /* test/tests.luau
 not found */
-     482            1 : /* (content generated from line coverage data) */
-     483            1 : /* ... */
-     484              : /* ... */
-     485            1 : /* ... */
-     486            1 : /* ... */
-     487            1 : /* ... */
-     488            1 : /* ... */
-     489            1 : /* ... */
-     490              : /* ... */
-     491              : /* ... */
-     492              : /* ... */
-     493            1 : /* ... */
-     494              : /* ... */
-     495            1 : /* ... */
-     496              : /* ... */
-     497            1 : /* ... */
-     498              : /* ... */
-     499            1 : /* ... */
-     500            1 : /* ... */
-     501              : /* test/tests.luau
 not found */
-     502              : /* (content generated from line coverage data) */
-     503            1 : /* ... */
-     504            1 : /* ... */
-     505              : /* ... */
-     506            1 : /* ... */
-     507              : /* ... */
-     508            1 : /* ... */
-     509            1 : /* ... */
-     510              : /* ... */
-     511            1 : /* ... */
-     512            1 : /* ... */
-     513              : /* ... */
-     514              : /* ... */
-     515              : /* ... */
-     516              : /* ... */
-     517            1 : /* ... */
-     518            1 : /* ... */
-     519            1 : /* ... */
-     520            1 : /* ... */
-     521            1 : /* test/tests.luau
 not found */
-     522            1 : /* (content generated from line coverage data) */
-     523            1 : /* ... */
-     524            1 : /* ... */
-     525            1 : /* ... */
-     526            1 : /* ... */
-     527            1 : /* ... */
-     528              : /* ... */
-     529            1 : /* ... */
-     530            1 : /* ... */
-     531            1 : /* ... */
-     532            1 : /* ... */
-     533              : /* ... */
-     534            1 : /* ... */
-     535            1 : /* ... */
-     536            1 : /* ... */
-     537            1 : /* ... */
-     538              : /* ... */
-     539            1 : /* ... */
-     540            1 : /* ... */
-     541            1 : /* test/tests.luau
 not found */
-     542              : /* (content generated from line coverage data) */
-     543            1 : /* ... */
-     544            1 : /* ... */
-     545            1 : /* ... */
-     546              : /* ... */
-     547            1 : /* ... */
-     548              : /* ... */
-     549            1 : /* ... */
-     550            1 : /* ... */
-     551            1 : /* ... */
-     552            1 : /* ... */
-     553              : /* ... */
-     554            1 : /* ... */
-     555            1 : /* ... */
-     556            1 : /* ... */
-     557            1 : /* ... */
-     558            1 : /* ... */
-     559            1 : /* ... */
-     560            1 : /* ... */
-     561            1 : /* test/tests.luau
 not found */
-     562            1 : /* (content generated from line coverage data) */
-     563            1 : /* ... */
-     564            1 : /* ... */
-     565              : /* ... */
-     566            1 : /* ... */
-     567            1 : /* ... */
-     568              : /* ... */
-     569            1 : /* ... */
-     570              : /* ... */
-     571            1 : /* ... */
-     572            1 : /* ... */
-     573            1 : /* ... */
-     574            1 : /* ... */
-     575            1 : /* ... */
-     576            1 : /* ... */
-     577              : /* ... */
-     578            1 : /* ... */
-     579            1 : /* ... */
-     580            1 : /* ... */
-     581            1 : /* test/tests.luau
 not found */
-     582              : /* (content generated from line coverage data) */
-     583            1 : /* ... */
-     584              : /* ... */
-     585            1 : /* ... */
-     586            1 : /* ... */
-     587              : /* ... */
-     588            1 : /* ... */
-     589            1 : /* ... */
-     590            1 : /* ... */
-     591            1 : /* ... */
-     592              : /* ... */
-     593            1 : /* ... */
-     594              : /* ... */
-     595            1 : /* ... */
-     596            1 : /* ... */
-     597            1 : /* ... */
-     598            1 : /* ... */
-     599            1 : /* ... */
-     600            1 : /* ... */
-     601              : /* test/tests.luau
 not found */
-     602              : /* (content generated from line coverage data) */
-     603            1 : /* ... */
-     604            1 : /* ... */
-     605            1 : /* ... */
-     606            1 : /* ... */
-     607            1 : /* ... */
-     608              : /* ... */
-     609              : /* ... */
-     610              : /* ... */
-     611            1 : /* ... */
-     612              : /* ... */
-     613            1 : /* ... */
-     614            1 : /* ... */
-     615            1 : /* ... */
-     616              : /* ... */
-     617            1 : /* ... */
-     618            1 : /* ... */
-     619          256 : /* ... */
-     620              : /* ... */
-     621          256 : /* test/tests.luau
 not found */
-     622          256 : /* (content generated from line coverage data) */
-     623          251 : /* ... */
-     624              : /* ... */
-     625          256 : /* ... */
-     626              : /* ... */
-     627              : /* ... */
-     628            1 : /* ... */
-     629          256 : /* ... */
-     630              : /* ... */
-     631              : /* ... */
-     632            1 : /* ... */
-     633              : /* ... */
-     634              : /* ... */
-     635              : /* ... */
-     636            1 : /* ... */
-     637            1 : /* ... */
-     638            1 : /* ... */
-     639            1 : /* ... */
-     640            1 : /* ... */
-     641            1 : /* test/tests.luau
 not found */
-     642            1 : /* (content generated from line coverage data) */
-     643            1 : /* ... */
-     644            1 : /* ... */
-     645            1 : /* ... */
-     646              : /* ... */
-     647              : /* ... */
-     648            1 : /* ... */
-     649              : /* ... */
-     650            1 : /* ... */
-     651            1 : /* ... */
-     652            1 : /* ... */
-     653            2 : /* ... */
-     654              : /* ... */
-     655            1 : /* ... */
-     656            0 : /* ... */
-     657              : /* ... */
-     658            1 : /* ... */
-     659            1 : /* ... */
-     660              : /* ... */
-     661              : /* test/tests.luau
 not found */
-     662              : /* (content generated from line coverage data) */
-     663              : /* ... */
-     664            1 : /* ... */
-     665            1 : /* ... */
-     666            1 : /* ... */
-     667            1 : /* ... */
-     668            1 : /* ... */
-     669              : /* ... */
-     670            1 : /* ... */
-     671            1 : /* ... */
-     672              : /* ... */
-     673            1 : /* ... */
-     674            1 : /* ... */
-     675            1 : /* ... */
-     676            1 : /* ... */
-     677              : /* ... */
-     678            1 : /* ... */
-     679            1 : /* ... */
-     680            0 : /* ... */
-     681              : /* test/tests.luau
 not found */
-     682            1 : /* (content generated from line coverage data) */
-     683              : /* ... */
-     684              : /* ... */
-     685              : /* ... */
-     686            1 : /* ... */
-     687            1 : /* ... */
-     688            1 : /* ... */
-     689              : /* ... */
-     690            1 : /* ... */
-     691            9 : /* ... */
-     692            9 : /* ... */
-     693              : /* ... */
-     694            1 : /* ... */
-     695            1 : /* ... */
-     696            9 : /* ... */
-     697              : /* ... */
-     698              : /* ... */
-     699            1 : /* ... */
-     700            1 : /* ... */
-     701            1 : /* test/tests.luau
 not found */
-     702            1 : /* (content generated from line coverage data) */
-     703            1 : /* ... */
-     704            1 : /* ... */
-     705            1 : /* ... */
-     706            1 : /* ... */
-     707            1 : /* ... */
-     708            1 : /* ... */
-     709              : /* ... */
-     710              : /* ... */
-     711              : /* ... */
-     712              : /* ... */
-     713            1 : /* ... */
-     714            1 : /* ... */
-     715            1 : /* ... */
-     716            1 : /* ... */
-     717            1 : /* ... */
-     718            1 : /* ... */
-     719            1 : /* ... */
-     720            1 : /* ... */
-     721            1 : /* test/tests.luau
 not found */
-     722            1 : /* (content generated from line coverage data) */
-     723            1 : /* ... */
-     724            1 : /* ... */
-     725              : /* ... */
-     726            1 : /* ... */
-     727              : /* ... */
-     728            1 : /* ... */
-     729            1 : /* ... */
-     730            2 : /* ... */
-     731            1 : /* ... */
-     732            1 : /* ... */
-     733            1 : /* ... */
-     734              : /* ... */
-     735            0 : /* ... */
-     736              : /* ... */
-     737              : /* ... */
-     738            2 : /* ... */
-     739              : /* ... */
-     740            1 : /* ... */
-     741              : /* test/tests.luau
 not found */
-     742              : /* (content generated from line coverage data) */
-     743            1 : /* ... */
-     744            1 : /* ... */
-     745            1 : /* ... */
-     746            1 : /* ... */
-     747            1 : /* ... */
-     748              : /* ... */
-     749            1 : /* ... */
-     750            1 : /* ... */
-     751          256 : /* ... */
-     752              : /* ... */
-     753              : /* ... */
-     754              : /* ... */
-     755          256 : /* ... */
-     756          256 : /* ... */
-     757          256 : /* ... */
-     758          251 : /* ... */
-     759              : /* ... */
-     760          256 : /* ... */
-     761              : /* test/tests.luau
 not found */
-     762              : /* (content generated from line coverage data) */
-     763            1 : /* ... */
-     764            1 : /* ... */
-     765          256 : /* ... */
-     766          256 : /* ... */
-     767              : /* ... */
-     768              : /* ... */
-     769            1 : /* ... */
-     770              : /* ... */
-     771              : /* ... */
-     772              : /* ... */
-     773            1 : /* ... */
-     774            1 : /* ... */
-     775            1 : /* ... */
-     776            1 : /* ... */
-     777              : /* ... */
-     778            1 : /* ... */
-     779            1 : /* ... */
-     780          256 : /* ... */
-     781              : /* test/tests.luau
 not found */
-     782          256 : /* (content generated from line coverage data) */
-     783          256 : /* ... */
-     784            4 : /* ... */
-     785              : /* ... */
-     786          252 : /* ... */
-     787              : /* ... */
-     788              : /* ... */
-     789              : /* ... */
-     790            1 : /* ... */
-     791            4 : /* ... */
-     792              : /* ... */
-     793              : /* ... */
-     794            1 : /* ... */
-     795              : /* ... */
-     796              : /* ... */
-     797              : /* ... */
-     798            1 : /* ... */
-     799            1 : /* ... */
-     800            1 : /* ... */
-     801            1 : /* test/tests.luau
 not found */
-     802            1 : /* (content generated from line coverage data) */
-     803              : /* ... */
-     804            1 : /* ... */
-     805            1 : /* ... */
-     806            1 : /* ... */
-     807            1 : /* ... */
-     808              : /* ... */
-     809              : /* ... */
-     810              : /* ... */
-     811              : /* ... */
-     812            1 : /* ... */
-     813            1 : /* ... */
-     814            1 : /* ... */
-     815            1 : /* ... */
-     816            1 : /* ... */
-     817              : /* ... */
-     818            1 : /* ... */
-     819              : /* ... */
-     820            1 : /* ... */
-     821            1 : /* test/tests.luau
 not found */
-     822            1 : /* (content generated from line coverage data) */
-     823            1 : /* ... */
-     824              : /* ... */
-     825            1 : /* ... */
-     826            1 : /* ... */
-     827            1 : /* ... */
-     828              : /* ... */
-     829              : /* ... */
-     830              : /* ... */
-     831              : /* ... */
-     832            1 : /* ... */
-     833            1 : /* ... */
-     834            1 : /* ... */
-     835            1 : /* ... */
-     836            1 : /* ... */
-     837            1 : /* ... */
-     838            1 : /* ... */
-     839              : /* ... */
-     840            1 : /* ... */
-     841            1 : /* test/tests.luau
 not found */
-     842              : /* (content generated from line coverage data) */
-     843            1 : /* ... */
-     844            1 : /* ... */
-     845            1 : /* ... */
-     846            2 : /* ... */
-     847            2 : /* ... */
-     848            1 : /* ... */
-     849              : /* ... */
-     850            1 : /* ... */
-     851              : /* ... */
-     852              : /* ... */
-     853              : /* ... */
-     854            1 : /* ... */
-     855            1 : /* ... */
-     856              : /* ... */
-     857            1 : /* ... */
-     858            1 : /* ... */
-     859            1 : /* ... */
-     860              : /* ... */
-     861            1 : /* test/tests.luau
 not found */
-     862              : /* (content generated from line coverage data) */
-     863              : /* ... */
-     864            1 : /* ... */
-     865            1 : /* ... */
-     866            1 : /* ... */
-     867            1 : /* ... */
-     868            1 : /* ... */
-     869            1 : /* ... */
-     870            1 : /* ... */
-     871              : /* ... */
-     872            1 : /* ... */
-     873            1 : /* ... */
-     874            1 : /* ... */
-     875              : /* ... */
-     876            1 : /* ... */
-     877            1 : /* ... */
-     878              : /* ... */
-     879            1 : /* ... */
-     880            1 : /* ... */
-     881            0 : /* test/tests.luau
 not found */
-     882              : /* (content generated from line coverage data) */
-     883              : /* ... */
-     884            1 : /* ... */
-     885              : /* ... */
-     886            1 : /* ... */
-     887            1 : /* ... */
-     888              : /* ... */
-     889              : /* ... */
-     890              : /* ... */
-     891              : /* ... */
-     892            1 : /* ... */
-     893            1 : /* ... */
-     894            1 : /* ... */
-     895            1 : /* ... */
-     896            1 : /* ... */
-     897              : /* ... */
-     898            1 : /* ... */
-     899            1 : /* ... */
-     900            1 : /* ... */
-     901              : /* test/tests.luau
 not found */
-     902              : /* (content generated from line coverage data) */
-     903              : /* ... */
-     904              : /* ... */
-     905            1 : /* ... */
-     906            1 : /* ... */
-     907            1 : /* ... */
-     908              : /* ... */
-     909            1 : /* ... */
-     910              : /* ... */
-     911            1 : /* ... */
-     912            1 : /* ... */
-     913            1 : /* ... */
-     914              : /* ... */
-     915            1 : /* ... */
-     916            1 : /* ... */
-     917            1 : /* ... */
-     918            1 : /* ... */
-     919            1 : /* ... */
-     920              : /* ... */
-     921            1 : /* test/tests.luau
 not found */
-     922            1 : /* (content generated from line coverage data) */
-     923            2 : /* ... */
-     924              : /* ... */
-     925            1 : /* ... */
-     926              : /* ... */
-     927              : /* ... */
-     928              : /* ... */
-     929            1 : /* ... */
-     930            1 : /* ... */
-     931            1 : /* ... */
-     932            1 : /* ... */
-     933              : /* ... */
-     934            1 : /* ... */
-     935            1 : /* ... */
-     936            1 : /* ... */
-     937            1 : /* ... */
-     938            1 : /* ... */
-     939              : /* ... */
-     940            1 : /* ... */
-     941            1 : /* test/tests.luau
 not found */
-     942            2 : /* (content generated from line coverage data) */
-     943            2 : /* ... */
-     944              : /* ... */
-     945            1 : /* ... */
-     946              : /* ... */
-     947              : /* ... */
-     948              : /* ... */
-     949            1 : /* ... */
-     950              : /* ... */
-     951            1 : /* ... */
-     952            1 : /* ... */
-     953            1 : /* ... */
-     954            1 : /* ... */
-     955            1 : /* ... */
-     956              : /* ... */
-     957            1 : /* ... */
-     958            1 : /* ... */
-     959            1 : /* ... */
-     960            1 : /* ... */
-     961            1 : /* test/tests.luau
 not found */
-     962              : /* (content generated from line coverage data) */
-     963            1 : /* ... */
-     964            1 : /* ... */
-     965            3 : /* ... */
-     966              : /* ... */
-     967            3 : /* ... */
-     968              : /* ... */
-     969              : /* ... */
-     970            1 : /* ... */
-     971              : /* ... */
-     972              : /* ... */
-     973              : /* ... */
-     974            1 : /* ... */
-     975            1 : /* ... */
-     976            1 : /* ... */
-     977            1 : /* ... */
-     978              : /* ... */
-     979            1 : /* ... */
-     980            1 : /* ... */
-     981            1 : /* test/tests.luau
 not found */
-     982            1 : /* (content generated from line coverage data) */
-     983            1 : /* ... */
-     984              : /* ... */
-     985            1 : /* ... */
-     986            3 : /* ... */
-     987            3 : /* ... */
-     988            3 : /* ... */
-     989              : /* ... */
-     990              : /* ... */
-     991            1 : /* ... */
-     992              : /* ... */
-     993              : /* ... */
-     994              : /* ... */
-     995              : /* ... */
-     996            1 : /* ... */
-     997            1 : /* ... */
-     998              : /* ... */
-     999            1 : /* ... */
-    1000            1 : /* ... */
-    1001              : /* test/tests.luau
 not found */
-    1002            1 : /* (content generated from line coverage data) */
-    1003            1 : /* ... */
-    1004            1 : /* ... */
-    1005              : /* ... */
-    1006            1 : /* ... */
-    1007            1 : /* ... */
-    1008            0 : /* ... */
-    1009              : /* ... */
-    1010              : /* ... */
-    1011            1 : /* ... */
-    1012              : /* ... */
-    1013              : /* ... */
-    1014              : /* ... */
-    1015            1 : /* ... */
-    1016              : /* ... */
-    1017              : /* ... */
-    1018            1 : /* ... */
-    1019            1 : /* ... */
-    1020              : /* ... */
-    1021            1 : /* test/tests.luau
 not found */
-    1022            1 : /* (content generated from line coverage data) */
-    1023            0 : /* ... */
-    1024              : /* ... */
-    1025            1 : /* ... */
-    1026              : /* ... */
-    1027              : /* ... */
-    1028              : /* ... */
-    1029              : /* ... */
-    1030            1 : /* ... */
-    1031            1 : /* ... */
-    1032            1 : /* ... */
-    1033            1 : /* ... */
-    1034            1 : /* ... */
-    1035              : /* ... */
-    1036            1 : /* ... */
-    1037            1 : /* ... */
-    1038            1 : /* ... */
-    1039              : /* ... */
-    1040            1 : /* ... */
-    1041              : /* test/tests.luau
 not found */
-    1042            1 : /* (content generated from line coverage data) */
-    1043            1 : /* ... */
-    1044              : /* ... */
-    1045            1 : /* ... */
-    1046            1 : /* ... */
-    1047            1 : /* ... */
-    1048              : /* ... */
-    1049            1 : /* ... */
-    1050            3 : /* ... */
-    1051            3 : /* ... */
-    1052            3 : /* ... */
-    1053              : /* ... */
-    1054            0 : /* ... */
-    1055              : /* ... */
-    1056              : /* ... */
-    1057              : /* ... */
-    1058            1 : /* ... */
-    1059            1 : /* ... */
-    1060            1 : /* ... */
-    1061            1 : /* test/tests.luau
 not found */
-    1062              : /* (content generated from line coverage data) */
-    1063            1 : /* ... */
-    1064            1 : /* ... */
-    1065              : /* ... */
-    1066            1 : /* ... */
-    1067              : /* ... */
-    1068            1 : /* ... */
-    1069            1 : /* ... */
-    1070              : /* ... */
-    1071            1 : /* ... */
-    1072            1 : /* ... */
-    1073              : /* ... */
-    1074            1 : /* ... */
-    1075            1 : /* ... */
-    1076            2 : /* ... */
-    1077            2 : /* ... */
-    1078            2 : /* ... */
-    1079            2 : /* ... */
-    1080              : /* ... */
-    1081            0 : /* test/tests.luau
 not found */
-    1082              : /* (content generated from line coverage data) */
-    1083            1 : /* ... */
-    1084              : /* ... */
-    1085            1 : /* ... */
-    1086              : /* ... */
-    1087            1 : /* ... */
-    1088            1 : /* ... */
-    1089            1 : /* ... */
-    1090              : /* ... */
-    1091              : /* ... */
-    1092            1 : /* ... */
-    1093              : /* ... */
-    1094              : /* ... */
-    1095            1 : /* ... */
-    1096              : /* ... */
-    1097            1 : /* ... */
-    1098            1 : /* ... */
-    1099            1 : /* ... */
-    1100            1 : /* ... */
-    1101              : /* test/tests.luau
 not found */
-    1102            1 : /* (content generated from line coverage data) */
-    1103              : /* ... */
-    1104            1 : /* ... */
-    1105            1 : /* ... */
-    1106              : /* ... */
-    1107            1 : /* ... */
-    1108            1 : /* ... */
-    1109              : /* ... */
-    1110            1 : /* ... */
-    1111            1 : /* ... */
-    1112            1 : /* ... */
-    1113              : /* ... */
-    1114              : /* ... */
-    1115              : /* ... */
-    1116            1 : /* ... */
-    1117            1 : /* ... */
-    1118            1 : /* ... */
-    1119              : /* ... */
-    1120            1 : /* ... */
-    1121            1 : /* test/tests.luau
 not found */
-    1122              : /* (content generated from line coverage data) */
-    1123            1 : /* ... */
-    1124            1 : /* ... */
-    1125              : /* ... */
-    1126            1 : /* ... */
-    1127            1 : /* ... */
-    1128              : /* ... */
-    1129            1 : /* ... */
-    1130            1 : /* ... */
-    1131              : /* ... */
-    1132            1 : /* ... */
-    1133            1 : /* ... */
-    1134              : /* ... */
-    1135            1 : /* ... */
-    1136            1 : /* ... */
-    1137            1 : /* ... */
-    1138            1 : /* ... */
-    1139            1 : /* ... */
-    1140            1 : /* ... */
-    1141            1 : /* test/tests.luau
 not found */
-    1142              : /* (content generated from line coverage data) */
-    1143            1 : /* ... */
-    1144              : /* ... */
-    1145            1 : /* ... */
-    1146            1 : /* ... */
-    1147            1 : /* ... */
-    1148            1 : /* ... */
-    1149              : /* ... */
-    1150            1 : /* ... */
-    1151            1 : /* ... */
-    1152              : /* ... */
-    1153            1 : /* ... */
-    1154            1 : /* ... */
-    1155            1 : /* ... */
-    1156            1 : /* ... */
-    1157              : /* ... */
-    1158              : /* ... */
-    1159              : /* ... */
-    1160            1 : /* ... */
-    1161              : /* test/tests.luau
 not found */
-    1162            1 : /* (content generated from line coverage data) */
-    1163            1 : /* ... */
-    1164              : /* ... */
-    1165            1 : /* ... */
-    1166              : /* ... */
-    1167            1 : /* ... */
-    1168            1 : /* ... */
-    1169              : /* ... */
-    1170            1 : /* ... */
-    1171              : /* ... */
-    1172              : /* ... */
-    1173              : /* ... */
-    1174            1 : /* ... */
-    1175            1 : /* ... */
-    1176              : /* ... */
-    1177            1 : /* ... */
-    1178            1 : /* ... */
-    1179            1 : /* ... */
-    1180            1 : /* ... */
-    1181              : /* test/tests.luau
 not found */
-    1182            1 : /* (content generated from line coverage data) */
-    1183            1 : /* ... */
-    1184            1 : /* ... */
-    1185            1 : /* ... */
-    1186              : /* ... */
-    1187            1 : /* ... */
-    1188              : /* ... */
-    1189              : /* ... */
-    1190              : /* ... */
-    1191            1 : /* ... */
-    1192              : /* ... */
-    1193            1 : /* ... */
-    1194            1 : /* ... */
-    1195            1 : /* ... */
-    1196            1 : /* ... */
-    1197              : /* ... */
-    1198            1 : /* ... */
-    1199            1 : /* ... */
-    1200              : /* ... */
-    1201              : /* test/tests.luau
 not found */
-    1202            1 : /* (content generated from line coverage data) */
-    1203            1 : /* ... */
-    1204            1 : /* ... */
-    1205            1 : /* ... */
-    1206            1 : /* ... */
-    1207            1 : /* ... */
-    1208            1 : /* ... */
-    1209            1 : /* ... */
-    1210            1 : /* ... */
-    1211            1 : /* ... */
-    1212              : /* ... */
-    1213              : /* ... */
-    1214            1 : /* ... */
-    1215            1 : /* ... */
-    1216            1 : /* ... */
-    1217            1 : /* ... */
-    1218              : /* ... */
-    1219              : /* ... */
-    1220              : /* ... */
-    1221            1 : /* test/tests.luau
 not found */
-    1222            1 : /* (content generated from line coverage data) */
-    1223            1 : /* ... */
-    1224              : /* ... */
-    1225            1 : /* ... */
-    1226            1 : /* ... */
-    1227              : /* ... */
-    1228            1 : /* ... */
-    1229            1 : /* ... */
-    1230            1 : /* ... */
-    1231              : /* ... */
-    1232              : /* ... */
-    1233            1 : /* ... */
-    1234            1 : /* ... */
-    1235              : /* ... */
-    1236            1 : /* ... */
-    1237              : /* ... */
-    1238            1 : /* ... */
-    1239            1 : /* ... */
-    1240            1 : /* ... */
-    1241            1 : /* test/tests.luau
 not found */
-    1242              : /* (content generated from line coverage data) */
-    1243            1 : /* ... */
-    1244            1 : /* ... */
-    1245            1 : /* ... */
-    1246            1 : /* ... */
-    1247            1 : /* ... */
-    1248            1 : /* ... */
-    1249            1 : /* ... */
-    1250            1 : /* ... */
-    1251            1 : /* ... */
-    1252              : /* ... */
-    1253              : /* ... */
-    1254            1 : /* ... */
-    1255            1 : /* ... */
-    1256            1 : /* ... */
-    1257            1 : /* ... */
-    1258              : /* ... */
-    1259            1 : /* ... */
-    1260            1 : /* ... */
-    1261            1 : /* test/tests.luau
 not found */
-    1262              : /* (content generated from line coverage data) */
-    1263            1 : /* ... */
-    1264            1 : /* ... */
-    1265              : /* ... */
-    1266            1 : /* ... */
-    1267            1 : /* ... */
-    1268            1 : /* ... */
-    1269            1 : /* ... */
-    1270            1 : /* ... */
-    1271            1 : /* ... */
-    1272              : /* ... */
-    1273              : /* ... */
-    1274            1 : /* ... */
-    1275            1 : /* ... */
-    1276              : /* ... */
-    1277            1 : /* ... */
-    1278            1 : /* ... */
-    1279              : /* ... */
-    1280            1 : /* ... */
-    1281            1 : /* test/tests.luau
 not found */
-    1282            1 : /* (content generated from line coverage data) */
-    1283            1 : /* ... */
-    1284            1 : /* ... */
-    1285            1 : /* ... */
-    1286              : /* ... */
-    1287            1 : /* ... */
-    1288            1 : /* ... */
-    1289            1 : /* ... */
-    1290            1 : /* ... */
-    1291              : /* ... */
-    1292            1 : /* ... */
-    1293            1 : /* ... */
-    1294              : /* ... */
-    1295              : /* ... */
-    1296              : /* ... */
-    1297            1 : /* ... */
-    1298            1 : /* ... */
-    1299              : /* ... */
-    1300            1 : /* ... */
-    1301            1 : /* test/tests.luau
 not found */
-    1302            1 : /* (content generated from line coverage data) */
-    1303              : /* ... */
-    1304            1 : /* ... */
-    1305            1 : /* ... */
-    1306            1 : /* ... */
-    1307            1 : /* ... */
-    1308              : /* ... */
-    1309            1 : /* ... */
-    1310            1 : /* ... */
-    1311            1 : /* ... */
-    1312            1 : /* ... */
-    1313              : /* ... */
-    1314              : /* ... */
-    1315            1 : /* ... */
-    1316            1 : /* ... */
-    1317            1 : /* ... */
-    1318              : /* ... */
-    1319            1 : /* ... */
-    1320            1 : /* ... */
-    1321            1 : /* test/tests.luau
 not found */
-    1322              : /* (content generated from line coverage data) */
-    1323            1 : /* ... */
-    1324            1 : /* ... */
-    1325            1 : /* ... */
-    1326            1 : /* ... */
-    1327            1 : /* ... */
-    1328              : /* ... */
-    1329              : /* ... */
-    1330              : /* ... */
-    1331            1 : /* ... */
-    1332            1 : /* ... */
-    1333              : /* ... */
-    1334            1 : /* ... */
-    1335            1 : /* ... */
-    1336            1 : /* ... */
-    1337              : /* ... */
-    1338            1 : /* ... */
-    1339            1 : /* ... */
-    1340            1 : /* ... */
-    1341              : /* test/tests.luau
 not found */
-    1342            1 : /* (content generated from line coverage data) */
-    1343            1 : /* ... */
-    1344           10 : /* ... */
-    1345           10 : /* ... */
-    1346           10 : /* ... */
-    1347           10 : /* ... */
-    1348           10 : /* ... */
-    1349              : /* ... */
-    1350              : /* ... */
-    1351            1 : /* ... */
-    1352            1 : /* ... */
-    1353              : /* ... */
-    1354              : /* ... */
-    1355            1 : /* ... */
-    1356           10 : /* ... */
-    1357           10 : /* ... */
-    1358           10 : /* ... */
-    1359              : /* ... */
-    1360              : /* ... */
-    1361            1 : /* test/tests.luau
 not found */
-    1362              : /* (content generated from line coverage data) */
-    1363            1 : /* ... */
-    1364            1 : /* ... */
-    1365           10 : /* ... */
-    1366           10 : /* ... */
-    1367           10 : /* ... */
-    1368           10 : /* ... */
-    1369           10 : /* ... */
-    1370              : /* ... */
-    1371              : /* ... */
-    1372            1 : /* ... */
-    1373            1 : /* ... */
-    1374              : /* ... */
-    1375              : /* ... */
-    1376            1 : /* ... */
-    1377            1 : /* ... */
-    1378           10 : /* ... */
-    1379           10 : /* ... */
-    1380           10 : /* ... */
-    1381              : /* test/tests.luau
 not found */
-    1382              : /* (content generated from line coverage data) */
-    1383              : /* ... */
-    1384              : /* ... */
-    1385            1 : /* ... */
-    1386            1 : /* ... */
-    1387              : /* ... */
-    1388            1 : /* ... */
-    1389            1 : /* ... */
-    1390            1 : /* ... */
-    1391              : /* ... */
-    1392            1 : /* ... */
-    1393          100 : /* ... */
-    1394          100 : /* ... */
-    1395          100 : /* ... */
-    1396          100 : /* ... */
-    1397              : /* ... */
-    1398              : /* ... */
-    1399            1 : /* ... */
-    1400            1 : /* ... */
-    1401          100 : /* test/tests.luau
 not found */
-    1402          100 : /* (content generated from line coverage data) */
-    1403              : /* ... */
-    1404              : /* ... */
-    1405              : /* ... */
-    1406            1 : /* ... */
-    1407          100 : /* ... */
-    1408              : /* ... */
-    1409              : /* ... */
-    1410              : /* ... */
-    1411              : /* ... */
-    1412            1 : /* ... */
-    1413            1 : /* ... */
-    1414            1 : /* ... */
-    1415            1 : /* ... */
-    1416            1 : /* ... */
-    1417            1 : /* ... */
-    1418              : /* ... */
-    1419            1 : /* ... */
-    1420            1 : /* ... */
-    1421              : /* test/tests.luau
 not found */
-    1422            1 : /* (content generated from line coverage data) */
-    1423            1 : /* ... */
-    1424            1 : /* ... */
-    1425              : /* ... */
-    1426              : /* ... */
-    1427              : /* ... */
-    1428            1 : /* ... */
-    1429            1 : /* ... */
-    1430            1 : /* ... */
-    1431            1 : /* ... */
-    1432            1 : /* ... */
-    1433            1 : /* ... */
-    1434            1 : /* ... */
-    1435            1 : /* ... */
-    1436            1 : /* ... */
-    1437            1 : /* ... */
-    1438            1 : /* ... */
-    1439            1 : /* ... */
-    1440            1 : /* ... */
-    1441            1 : /* test/tests.luau
 not found */
-    1442              : /* (content generated from line coverage data) */
-    1443            1 : /* ... */
-    1444            1 : /* ... */
-    1445            1 : /* ... */
-    1446            1 : /* ... */
-    1447            1 : /* ... */
-    1448            1 : /* ... */
-    1449            1 : /* ... */
-    1450              : /* ... */
-    1451            1 : /* ... */
-    1452            1 : /* ... */
-    1453            1 : /* ... */
-    1454              : /* ... */
-    1455            1 : /* ... */
-    1456            1 : /* ... */
-    1457            1 : /* ... */
-    1458            1 : /* ... */
-    1459            1 : /* ... */
-    1460            1 : /* ... */
-    1461            1 : /* test/tests.luau
 not found */
-    1462            1 : /* (content generated from line coverage data) */
-    1463            1 : /* ... */
-    1464            1 : /* ... */
-    1465            1 : /* ... */
-    1466            1 : /* ... */
-    1467            1 : /* ... */
-    1468            1 : /* ... */
-    1469            1 : /* ... */
-    1470              : /* ... */
-    1471            1 : /* ... */
-    1472            1 : /* ... */
-    1473            1 : /* ... */
-    1474            1 : /* ... */
-    1475              : /* ... */
-    1476            1 : /* ... */
-    1477            1 : /* ... */
-    1478              : /* ... */
-    1479              : /* ... */
-    1480              : /* ... */
-    1481            1 : /* test/tests.luau
 not found */
-    1482            1 : /* (content generated from line coverage data) */
-    1483            1 : /* ... */
-    1484            1 : /* ... */
-    1485            1 : /* ... */
-    1486            1 : /* ... */
-    1487            1 : /* ... */
-    1488              : /* ... */
-    1489            1 : /* ... */
-    1490            1 : /* ... */
-    1491            1 : /* ... */
-    1492            1 : /* ... */
-    1493            1 : /* ... */
-    1494              : /* ... */
-    1495            1 : /* ... */
-    1496            1 : /* ... */
-    1497            1 : /* ... */
-    1498              : /* ... */
-    1499              : /* ... */
-    1500              : /* ... */
-    1501            1 : /* test/tests.luau
 not found */
-    1502            1 : /* (content generated from line coverage data) */
-    1503              : /* ... */
-    1504            1 : /* ... */
-    1505            1 : /* ... */
-    1506            1 : /* ... */
-    1507              : /* ... */
-    1508            1 : /* ... */
-    1509           10 : /* ... */
-    1510           10 : /* ... */
-    1511           10 : /* ... */
-    1512              : /* ... */
-    1513              : /* ... */
-    1514            1 : /* ... */
-    1515            1 : /* ... */
-    1516            1 : /* ... */
-    1517           10 : /* ... */
-    1518           10 : /* ... */
-    1519           10 : /* ... */
-    1520              : /* ... */
-    1521              : /* test/tests.luau
 not found */
-    1522            1 : /* (content generated from line coverage data) */
-    1523              : /* ... */
-    1524              : /* ... */
-    1525              : /* ... */
-    1526            1 : /* ... */
-    1527            1 : /* ... */
-    1528            1 : /* ... */
-    1529            1 : /* ... */
-    1530              : /* ... */
-    1531              : /* ... */
-    1532            1 : /* ... */
-    1533            1 : /* ... */
-    1534            1 : /* ... */
-    1535              : /* ... */
-    1536              : /* ... */
-    1537              : /* ... */
-    1538            1 : /* ... */
-    1539            1 : /* ... */
-    1540            1 : /* ... */
-    1541            1 : /* test/tests.luau
 not found */
-    1542            1 : /* (content generated from line coverage data) */
-    1543            1 : /* ... */
-    1544            1 : /* ... */
-    1545              : /* ... */
-    1546            1 : /* ... */
-    1547              : /* ... */
-    1548              : /* ... */
-    1549            1 : /* ... */
-    1550            1 : /* ... */
-    1551            1 : /* ... */
-    1552            1 : /* ... */
-    1553              : /* ... */
-    1554            1 : /* ... */
-    1555            1 : /* ... */
-    1556            1 : /* ... */
-    1557            1 : /* ... */
-    1558              : /* ... */
-    1559            1 : /* ... */
-    1560              : /* ... */
-    1561              : /* test/tests.luau
 not found */
-    1562            1 : /* (content generated from line coverage data) */
-    1563              : /* ... */
-    1564              : /* ... */
-    1565            1 : /* ... */
-    1566            1 : /* ... */
-    1567            1 : /* ... */
-    1568            1 : /* ... */
-    1569            1 : /* ... */
-    1570            1 : /* ... */
-    1571              : /* ... */
-    1572            1 : /* ... */
-    1573              : /* ... */
-    1574            1 : /* ... */
-    1575            1 : /* ... */
-    1576              : /* ... */
-    1577              : /* ... */
-    1578              : /* ... */
-    1579            1 : /* ... */
-    1580            1 : /* ... */
-    1581            1 : /* test/tests.luau
 not found */
-    1582            1 : /* (content generated from line coverage data) */
-    1583              : /* ... */
-    1584            1 : /* ... */
-    1585            1 : /* ... */
-    1586            1 : /* ... */
-    1587            1 : /* ... */
-    1588              : /* ... */
-    1589              : /* ... */
-    1590            1 : /* ... */
-    1591            1 : /* ... */
-    1592            1 : /* ... */
-    1593            1 : /* ... */
-    1594              : /* ... */
-    1595              : /* ... */
-    1596              : /* ... */
-    1597              : /* ... */
-    1598            1 : /* ... */
-    1599            1 : /* ... */
-    1600            1 : /* ... */
-    1601            1 : /* test/tests.luau
 not found */
-    1602            1 : /* (content generated from line coverage data) */
-    1603              : /* ... */
-    1604            1 : /* ... */
-    1605            1 : /* ... */
-    1606            1 : /* ... */
-    1607              : /* ... */
-    1608              : /* ... */
-    1609            1 : /* ... */
-    1610            1 : /* ... */
-    1611            1 : /* ... */
-    1612            1 : /* ... */
-    1613              : /* ... */
-    1614            1 : /* ... */
-    1615            1 : /* ... */
-    1616            2 : /* ... */
-    1617            2 : /* ... */
-    1618              : /* ... */
-    1619              : /* ... */
-    1620            1 : /* ... */
-    1621            1 : /* test/tests.luau
 not found */
-    1622            1 : /* (content generated from line coverage data) */
-    1623            0 : /* ... */
-    1624            0 : /* ... */
-    1625              : /* ... */
-    1626              : /* ... */
-    1627            1 : /* ... */
-    1628              : /* ... */
-    1629              : /* ... */
-    1630            1 : /* ... */
-    1631            1 : /* ... */
-    1632            1 : /* ... */
-    1633            1 : /* ... */
-    1634            1 : /* ... */
-    1635              : /* ... */
-    1636            1 : /* ... */
-    1637              : /* ... */
-    1638            1 : /* ... */
-    1639              : /* ... */
-    1640            1 : /* ... */
-    1641              : /* test/tests.luau
 not found */
-    1642            1 : /* (content generated from line coverage data) */
-    1643            1 : /* ... */
-    1644            1 : /* ... */
-    1645            1 : /* ... */
-    1646              : /* ... */
-    1647              : /* ... */
-    1648            1 : /* ... */
-    1649              : /* ... */
-    1650            1 : /* ... */
-    1651            0 : /* ... */
-    1652              : /* ... */
-    1653              : /* ... */
-    1654              : /* ... */
-    1655              : /* ... */
-    1656              : /* ... */
-    1657            1 : /* ... */
-    1658            1 : /* ... */
-    1659            1 : /* ... */
-    1660            1 : /* ... */
-    1661            1 : /* test/tests.luau
 not found */
-    1662            1 : /* (content generated from line coverage data) */
-    1663              : /* ... */
-    1664            1 : /* ... */
-    1665            2 : /* ... */
-    1666              : /* ... */
-    1667            2 : /* ... */
-    1668            2 : /* ... */
-    1669            2 : /* ... */
-    1670              : /* ... */
-    1671            2 : /* ... */
-    1672            1 : /* ... */
-    1673              : /* ... */
-    1674              : /* ... */
-    1675            1 : /* ... */
-    1676              : /* ... */
-    1677              : /* ... */
-    1678              : /* ... */
-    1679            2 : /* ... */
-    1680            1 : /* ... */
-    1681            1 : /* test/tests.luau
 not found */
-    1682              : /* (content generated from line coverage data) */
-    1683              : /* ... */
-    1684              : /* ... */
-    1685            1 : /* ... */
-    1686            1 : /* ... */
-    1687              : /* ... */
-    1688              : /* ... */
-    1689            1 : /* ... */
-    1690            1 : /* ... */
-    1691            1 : /* ... */
-    1692            1 : /* ... */
-    1693              : /* ... */
-    1694            1 : /* ... */
-    1695              : /* ... */
-    1696            1 : /* ... */
-    1697            1 : /* ... */
-    1698              : /* ... */
-    1699            1 : /* ... */
-    1700            1 : /* ... */
-    1701            0 : /* test/tests.luau
 not found */
-    1702              : /* (content generated from line coverage data) */
-    1703            1 : /* ... */
-    1704              : /* ... */
-    1705              : /* ... */
-    1706              : /* ... */
-    1707            1 : /* ... */
-    1708            1 : /* ... */
-    1709            1 : /* ... */
-    1710            1 : /* ... */
-    1711              : /* ... */
-    1712            1 : /* ... */
-    1713            1 : /* ... */
-    1714            1 : /* ... */
-    1715              : /* ... */
-    1716            1 : /* ... */
-    1717            1 : /* ... */
-    1718              : /* ... */
-    1719            1 : /* ... */
-    1720              : /* ... */
-    1721            1 : /* test/tests.luau
 not found */
-    1722            1 : /* (content generated from line coverage data) */
-    1723            1 : /* ... */
-    1724            1 : /* ... */
-    1725            1 : /* ... */
-    1726              : /* ... */
-    1727            1 : /* ... */
-    1728            1 : /* ... */
-    1729            1 : /* ... */
-    1730              : /* ... */
-    1731            1 : /* ... */
-    1732              : /* ... */
-    1733            1 : /* ... */
-    1734            1 : /* ... */
-    1735            1 : /* ... */
-    1736              : /* ... */
-    1737            1 : /* ... */
-    1738            1 : /* ... */
-    1739            1 : /* ... */
-    1740              : /* ... */
-    1741            1 : /* test/tests.luau
 not found */
-    1742              : /* (content generated from line coverage data) */
-    1743            1 : /* ... */
-    1744              : /* ... */
-    1745            1 : /* ... */
-    1746              : /* ... */
-    1747            1 : /* ... */
-    1748            1 : /* ... */
-    1749            1 : /* ... */
-    1750              : /* ... */
-    1751            1 : /* ... */
-    1752              : /* ... */
-    1753            1 : /* ... */
-    1754            1 : /* ... */
-    1755            1 : /* ... */
-    1756              : /* ... */
-    1757            1 : /* ... */
-    1758            1 : /* ... */
-    1759            1 : /* ... */
-    1760              : /* ... */
-    1761            1 : /* test/tests.luau
 not found */
-    1762              : /* (content generated from line coverage data) */
-    1763            1 : /* ... */
-    1764              : /* ... */
-    1765            1 : /* ... */
-    1766            1 : /* ... */
-    1767              : /* ... */
-    1768            1 : /* ... */
-    1769            1 : /* ... */
-    1770            1 : /* ... */
-    1771              : /* ... */
-    1772            1 : /* ... */
-    1773              : /* ... */
-    1774              : /* ... */
-    1775              : /* ... */
-    1776            1 : /* ... */
-    1777            1 : /* ... */
-    1778            1 : /* ... */
-    1779              : /* ... */
-    1780            1 : /* ... */
-    1781            1 : /* test/tests.luau
 not found */
-    1782              : /* (content generated from line coverage data) */
-    1783            1 : /* ... */
-    1784            1 : /* ... */
-    1785            1 : /* ... */
-    1786              : /* ... */
-    1787              : /* ... */
-    1788            1 : /* ... */
-    1789            1 : /* ... */
-    1790              : /* ... */
-    1791            1 : /* ... */
-    1792              : /* ... */
-    1793            1 : /* ... */
-    1794            1 : /* ... */
-    1795            1 : /* ... */
-    1796              : /* ... */
-    1797            1 : /* ... */
-    1798            1 : /* ... */
-    1799            1 : /* ... */
-    1800              : /* ... */
-    1801            1 : /* test/tests.luau
 not found */
-    1802              : /* (content generated from line coverage data) */
-    1803            1 : /* ... */
-    1804              : /* ... */
-    1805            1 : /* ... */
-    1806            1 : /* ... */
-    1807            1 : /* ... */
-    1808              : /* ... */
-    1809              : /* ... */
-    1810            1 : /* ... */
-    1811            1 : /* ... */
-    1812              : /* ... */
-    1813            1 : /* ... */
-    1814              : /* ... */
-    1815            1 : /* ... */
-    1816              : /* ... */
-    1817            1 : /* ... */
-    1818            1 : /* ... */
-    1819            1 : /* ... */
-    1820              : /* ... */
-    1821            1 : /* test/tests.luau
 not found */
-    1822            1 : /* (content generated from line coverage data) */
-    1823            1 : /* ... */
-    1824              : /* ... */
-    1825            1 : /* ... */
-    1826            1 : /* ... */
-    1827            1 : /* ... */
-    1828              : /* ... */
-    1829              : /* ... */
-    1830            1 : /* ... */
-    1831              : /* ... */
-    1832            1 : /* ... */
-    1833              : /* ... */
-    1834            1 : /* ... */
-    1835              : /* ... */
-    1836              : /* ... */
-    1837            1 : /* ... */
-        
-
-
- - - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/tools/ansi.luau.func-c.html b/coverage/jecs/tools/ansi.luau.func-c.html deleted file mode 100644 index 46a9707..0000000 --- a/coverage/jecs/tools/ansi.luau.func-c.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/tools/ansi.luau - functions - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs/tools - ansi.luau (source / functions)CoverageTotalHit
Test:coverage.outLines:64.7 %1711
Test Date:2025-03-27 03:52:25Functions:33.3 %93
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Function Name Sort by function nameHit count Sort by function hit count
gray:30 0
green_highlight:26 0
red:14 0
red_highlight:22 0
white:6 0
white_underline:2 0
<main> 1
green:10 10
yellow:18 10
-
-
- - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/tools/ansi.luau.func.html b/coverage/jecs/tools/ansi.luau.func.html deleted file mode 100644 index 66cee07..0000000 --- a/coverage/jecs/tools/ansi.luau.func.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/tools/ansi.luau - functions - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs/tools - ansi.luau (source / functions)CoverageTotalHit
Test:coverage.outLines:64.7 %1711
Test Date:2025-03-27 03:52:25Functions:33.3 %93
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Function Name Sort by function nameHit count Sort by function hit count
<main> 1
gray:30 0
green:10 10
green_highlight:26 0
red:14 0
red_highlight:22 0
white:6 0
white_underline:2 0
yellow:18 10
-
-
- - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/tools/ansi.luau.gcov.html b/coverage/jecs/tools/ansi.luau.gcov.html deleted file mode 100644 index 8707e81..0000000 --- a/coverage/jecs/tools/ansi.luau.gcov.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/tools/ansi.luau - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs/tools - ansi.luau (source / functions)CoverageTotalHit
Test:coverage.outLines:64.7 %1711
Test Date:2025-03-27 03:52:25Functions:33.3 %93
-
- - - - - - - - -

-
            Line data    Source code
-
-       1            1 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/ansi.luau
 not found */
-       2            1 : /* (content generated from line coverage data) */
-       3            0 : /* ... */
-       4              : /* ... */
-       5              : /* ... */
-       6            1 : /* ... */
-       7            0 : /* ... */
-       8              : /* ... */
-       9              : /* ... */
-      10            1 : /* ... */
-      11           10 : /* ... */
-      12              : /* ... */
-      13              : /* ... */
-      14            1 : /* ... */
-      15            0 : /* ... */
-      16              : /* ... */
-      17              : /* ... */
-      18            1 : /* ... */
-      19           10 : /* ... */
-      20              : /* ... */
-      21              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/ansi.luau
 not found */
-      22            1 : /* (content generated from line coverage data) */
-      23            0 : /* ... */
-      24              : /* ... */
-      25              : /* ... */
-      26            1 : /* ... */
-      27            0 : /* ... */
-      28              : /* ... */
-      29              : /* ... */
-      30            1 : /* ... */
-      31            0 : /* ... */
-        
-
-
- - - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/tools/entity_visualiser.luau.func-c.html b/coverage/jecs/tools/entity_visualiser.luau.func-c.html deleted file mode 100644 index 6a866b0..0000000 --- a/coverage/jecs/tools/entity_visualiser.luau.func-c.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/tools/entity_visualiser.luau - functions - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs/tools - entity_visualiser.luau (source / functions)CoverageTotalHit
Test:coverage.outLines:93.3 %3028
Test Date:2025-03-27 03:52:25Functions:100.0 %44
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Function Name Sort by function nameHit count Sort by function hit count
<main> 1
components:15 3
pe:6 10
name:11 16
-
-
- - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/tools/entity_visualiser.luau.func.html b/coverage/jecs/tools/entity_visualiser.luau.func.html deleted file mode 100644 index 80ddee0..0000000 --- a/coverage/jecs/tools/entity_visualiser.luau.func.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/tools/entity_visualiser.luau - functions - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs/tools - entity_visualiser.luau (source / functions)CoverageTotalHit
Test:coverage.outLines:93.3 %3028
Test Date:2025-03-27 03:52:25Functions:100.0 %44
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Function Name Sort by function nameHit count Sort by function hit count
<main> 1
components:15 3
name:11 16
pe:6 10
-
-
- - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/tools/entity_visualiser.luau.gcov.html b/coverage/jecs/tools/entity_visualiser.luau.gcov.html deleted file mode 100644 index c81b0a5..0000000 --- a/coverage/jecs/tools/entity_visualiser.luau.gcov.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/tools/entity_visualiser.luau - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs/tools - entity_visualiser.luau (source / functions)CoverageTotalHit
Test:coverage.outLines:93.3 %3028
Test Date:2025-03-27 03:52:25Functions:100.0 %44
-
- - - - - - - - -

-
            Line data    Source code
-
-       1            1 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/entity_visualiser.luau
 not found */
-       2            1 : /* (content generated from line coverage data) */
-       3            1 : /* ... */
-       4            1 : /* ... */
-       5              : /* ... */
-       6            1 : /* ... */
-       7           10 : /* ... */
-       8           10 : /* ... */
-       9              : /* ... */
-      10              : /* ... */
-      11            1 : /* ... */
-      12           16 : /* ... */
-      13              : /* ... */
-      14              : /* ... */
-      15            1 : /* ... */
-      16            3 : /* ... */
-      17            3 : /* ... */
-      18            0 : /* ... */
-      19              : /* ... */
-      20              : /* ... */
-      21            3 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/entity_visualiser.luau
 not found */
-      22            3 : /* (content generated from line coverage data) */
-      23            3 : /* ... */
-      24            3 : /* ... */
-      25            3 : /* ... */
-      26            8 : /* ... */
-      27            8 : /* ... */
-      28            8 : /* ... */
-      29            8 : /* ... */
-      30              : /* ... */
-      31            0 : /* ... */
-      32              : /* ... */
-      33            8 : /* ... */
-      34            8 : /* ... */
-      35              : /* ... */
-      36            3 : /* ... */
-      37            3 : /* ... */
-      38              : /* ... */
-      39              : /* ... */
-      40            1 : /* ... */
-      41            1 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/entity_visualiser.luau
 not found */
-      42            1 : /* (content generated from line coverage data) */
-        
-
-
- - - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/tools/index-sort-f.html b/coverage/jecs/tools/index-sort-f.html deleted file mode 100644 index 5cf5382..0000000 --- a/coverage/jecs/tools/index-sort-f.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/tools - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs/toolsCoverageTotalHit
Test:coverage.outLines:63.0 %508320
Test Date:2025-03-27 03:52:25Functions:63.6 %5535
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Filename Sort by file nameLine Coverage Sort by line coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit
ansi.luau -
64.7%64.7%
-
64.7 %171133.3 %93
testkit.luau -
66.1%66.1%
-
66.1 %31921164.5 %3120
lifetime_tracker.luau -
49.3%49.3%
-
49.3 %1427072.7 %118
entity_visualiser.luau -
93.3%93.3%
-
93.3 %3028100.0 %44
-
-
- - - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/tools/index-sort-l.html b/coverage/jecs/tools/index-sort-l.html deleted file mode 100644 index 6e6d250..0000000 --- a/coverage/jecs/tools/index-sort-l.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/tools - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs/toolsCoverageTotalHit
Test:coverage.outLines:63.0 %508320
Test Date:2025-03-27 03:52:25Functions:63.6 %5535
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Filename Sort by file nameLine Coverage Sort by line coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit
lifetime_tracker.luau -
49.3%49.3%
-
49.3 %1427072.7 %118
ansi.luau -
64.7%64.7%
-
64.7 %171133.3 %93
testkit.luau -
66.1%66.1%
-
66.1 %31921164.5 %3120
entity_visualiser.luau -
93.3%93.3%
-
93.3 %3028100.0 %44
-
-
- - - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/tools/index.html b/coverage/jecs/tools/index.html deleted file mode 100644 index 596c726..0000000 --- a/coverage/jecs/tools/index.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/tools - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs/toolsCoverageTotalHit
Test:coverage.outLines:63.0 %508320
Test Date:2025-03-27 03:52:25Functions:63.6 %5535
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Filename Sort by file nameLine Coverage Sort by line coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit
ansi.luau -
64.7%64.7%
-
64.7 %171133.3 %93
entity_visualiser.luau -
93.3%93.3%
-
93.3 %3028100.0 %44
lifetime_tracker.luau -
49.3%49.3%
-
49.3 %1427072.7 %118
testkit.luau -
66.1%66.1%
-
66.1 %31921164.5 %3120
-
-
- - - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/tools/lifetime_tracker.luau.func-c.html b/coverage/jecs/tools/lifetime_tracker.luau.func-c.html deleted file mode 100644 index 103288a..0000000 --- a/coverage/jecs/tools/lifetime_tracker.luau.func-c.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/tools/lifetime_tracker.luau - functions - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs/tools - lifetime_tracker.luau (source / functions)CoverageTotalHit
Test:coverage.outLines:49.3 %14270
Test Date:2025-03-27 03:52:25Functions:72.7 %118
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Function Name Sort by function nameHit count Sort by function hit count
<anonymous>:135 0
<anonymous>:89 0
name:26 0
<anonymous>:164 1
<anonymous>:175 1
<anonymous>:62 1
<main> 1
lifetime_tracker_add:36 1
<anonymous>:48 3
print_centered_entity:12 3
pad:30 5
-
-
- - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/tools/lifetime_tracker.luau.func.html b/coverage/jecs/tools/lifetime_tracker.luau.func.html deleted file mode 100644 index 75126bf..0000000 --- a/coverage/jecs/tools/lifetime_tracker.luau.func.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/tools/lifetime_tracker.luau - functions - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs/tools - lifetime_tracker.luau (source / functions)CoverageTotalHit
Test:coverage.outLines:49.3 %14270
Test Date:2025-03-27 03:52:25Functions:72.7 %118
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Function Name Sort by function nameHit count Sort by function hit count
<anonymous>:135 0
<anonymous>:164 1
<anonymous>:175 1
<anonymous>:48 3
<anonymous>:62 1
<anonymous>:89 0
<main> 1
lifetime_tracker_add:36 1
name:26 0
pad:30 5
print_centered_entity:12 3
-
-
- - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/tools/lifetime_tracker.luau.gcov.html b/coverage/jecs/tools/lifetime_tracker.luau.gcov.html deleted file mode 100644 index 3a9cfd4..0000000 --- a/coverage/jecs/tools/lifetime_tracker.luau.gcov.html +++ /dev/null @@ -1,292 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/tools/lifetime_tracker.luau - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs/tools - lifetime_tracker.luau (source / functions)CoverageTotalHit
Test:coverage.outLines:49.3 %14270
Test Date:2025-03-27 03:52:25Functions:72.7 %118
-
- - - - - - - - -

-
            Line data    Source code
-
-       1            1 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/lifetime_tracker.luau
 not found */
-       2            1 : /* (content generated from line coverage data) */
-       3            1 : /* ... */
-       4            1 : /* ... */
-       5            1 : /* ... */
-       6              : /* ... */
-       7            1 : /* ... */
-       8              : /* ... */
-       9            1 : /* ... */
-      10            1 : /* ... */
-      11              : /* ... */
-      12            1 : /* ... */
-      13            3 : /* ... */
-      14            3 : /* ... */
-      15              : /* ... */
-      16            3 : /* ... */
-      17              : /* ... */
-      18            3 : /* ... */
-      19            3 : /* ... */
-      20              : /* ... */
-      21            3 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/lifetime_tracker.luau
 not found */
-      22              : /* (content generated from line coverage data) */
-      23            3 : /* ... */
-      24              : /* ... */
-      25              : /* ... */
-      26            1 : /* ... */
-      27            0 : /* ... */
-      28              : /* ... */
-      29            1 : /* ... */
-      30            1 : /* ... */
-      31            5 : /* ... */
-      32            0 : /* ... */
-      33              : /* ... */
-      34              : /* ... */
-      35              : /* ... */
-      36            1 : /* ... */
-      37            1 : /* ... */
-      38            1 : /* ... */
-      39            1 : /* ... */
-      40              : /* ... */
-      41            1 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/lifetime_tracker.luau
 not found */
-      42              : /* (content generated from line coverage data) */
-      43            1 : /* ... */
-      44              : /* ... */
-      45            1 : /* ... */
-      46              : /* ... */
-      47            1 : /* ... */
-      48            1 : /* ... */
-      49            3 : /* ... */
-      50            0 : /* ... */
-      51              : /* ... */
-      52            3 : /* ... */
-      53            3 : /* ... */
-      54            3 : /* ... */
-      55            0 : /* ... */
-      56              : /* ... */
-      57            3 : /* ... */
-      58              : /* ... */
-      59            3 : /* ... */
-      60            3 : /* ... */
-      61              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/lifetime_tracker.luau
 not found */
-      62            1 : /* (content generated from line coverage data) */
-      63            1 : /* ... */
-      64            1 : /* ... */
-      65            1 : /* ... */
-      66            1 : /* ... */
-      67              : /* ... */
-      68            1 : /* ... */
-      69            1 : /* ... */
-      70            1 : /* ... */
-      71            1 : /* ... */
-      72            2 : /* ... */
-      73            2 : /* ... */
-      74            2 : /* ... */
-      75              : /* ... */
-      76            1 : /* ... */
-      77              : /* ... */
-      78              : /* ... */
-      79            1 : /* ... */
-      80            1 : /* ... */
-      81            1 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/lifetime_tracker.luau
 not found */
-      82            1 : /* (content generated from line coverage data) */
-      83            1 : /* ... */
-      84              : /* ... */
-      85              : /* ... */
-      86            1 : /* ... */
-      87              : /* ... */
-      88            1 : /* ... */
-      89            1 : /* ... */
-      90            0 : /* ... */
-      91            0 : /* ... */
-      92            0 : /* ... */
-      93              : /* ... */
-      94            0 : /* ... */
-      95            0 : /* ... */
-      96            0 : /* ... */
-      97              : /* ... */
-      98              : /* ... */
-      99            0 : /* ... */
-     100            0 : /* ... */
-     101            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/lifetime_tracker.luau
 not found */
-     102            0 : /* (content generated from line coverage data) */
-     103              : /* ... */
-     104            0 : /* ... */
-     105            0 : /* ... */
-     106            0 : /* ... */
-     107              : /* ... */
-     108              : /* ... */
-     109            0 : /* ... */
-     110            0 : /* ... */
-     111            0 : /* ... */
-     112            0 : /* ... */
-     113            0 : /* ... */
-     114            0 : /* ... */
-     115            0 : /* ... */
-     116              : /* ... */
-     117            0 : /* ... */
-     118              : /* ... */
-     119              : /* ... */
-     120              : /* ... */
-     121            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/lifetime_tracker.luau
 not found */
-     122              : /* (content generated from line coverage data) */
-     123              : /* ... */
-     124            0 : /* ... */
-     125            0 : /* ... */
-     126            0 : /* ... */
-     127            0 : /* ... */
-     128            0 : /* ... */
-     129              : /* ... */
-     130            0 : /* ... */
-     131              : /* ... */
-     132              : /* ... */
-     133              : /* ... */
-     134              : /* ... */
-     135            0 : /* ... */
-     136            0 : /* ... */
-     137              : /* ... */
-     138              : /* ... */
-     139              : /* ... */
-     140            0 : /* ... */
-     141            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/lifetime_tracker.luau
 not found */
-     142            0 : /* (content generated from line coverage data) */
-     143            0 : /* ... */
-     144            0 : /* ... */
-     145            0 : /* ... */
-     146              : /* ... */
-     147            0 : /* ... */
-     148            0 : /* ... */
-     149            0 : /* ... */
-     150            0 : /* ... */
-     151            0 : /* ... */
-     152            0 : /* ... */
-     153              : /* ... */
-     154            0 : /* ... */
-     155              : /* ... */
-     156              : /* ... */
-     157            0 : /* ... */
-     158              : /* ... */
-     159            0 : /* ... */
-     160            0 : /* ... */
-     161              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/lifetime_tracker.luau
 not found */
-     162            1 : /* (content generated from line coverage data) */
-     163            1 : /* ... */
-     164            1 : /* ... */
-     165            1 : /* ... */
-     166            0 : /* ... */
-     167            0 : /* ... */
-     168            0 : /* ... */
-     169            0 : /* ... */
-     170            0 : /* ... */
-     171              : /* ... */
-     172              : /* ... */
-     173              : /* ... */
-     174            1 : /* ... */
-     175            1 : /* ... */
-     176            1 : /* ... */
-     177              : /* ... */
-     178            1 : /* ... */
-     179            1 : /* ... */
-     180            0 : /* ... */
-     181            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/lifetime_tracker.luau
 not found */
-     182            0 : /* (content generated from line coverage data) */
-     183            0 : /* ... */
-     184              : /* ... */
-     185              : /* ... */
-     186            0 : /* ... */
-     187            0 : /* ... */
-     188              : /* ... */
-     189              : /* ... */
-     190            0 : /* ... */
-     191            0 : /* ... */
-     192            0 : /* ... */
-     193            0 : /* ... */
-     194            0 : /* ... */
-     195            0 : /* ... */
-     196            0 : /* ... */
-     197              : /* ... */
-     198            0 : /* ... */
-     199              : /* ... */
-     200            0 : /* ... */
-     201            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/lifetime_tracker.luau
 not found */
-     202            0 : /* (content generated from line coverage data) */
-     203              : /* ... */
-     204              : /* ... */
-     205              : /* ... */
-     206              : /* ... */
-     207              : /* ... */
-     208              : /* ... */
-     209              : /* ... */
-     210            1 : /* ... */
-     211            1 : /* ... */
-     212              : /* ... */
-     213            1 : /* ... */
-     214              : /* ... */
-     215              : /* ... */
-     216            1 : /* ... */
-        
-
-
- - - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/tools/testkit.luau.func-c.html b/coverage/jecs/tools/testkit.luau.func-c.html deleted file mode 100644 index f06daf2..0000000 --- a/coverage/jecs/tools/testkit.luau.func-c.html +++ /dev/null @@ -1,292 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/tools/testkit.luau - functions - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs/tools - testkit.luau (source / functions)CoverageTotalHit
Test:coverage.outLines:66.1 %319211
Test Date:2025-03-27 03:52:25Functions:64.5 %3120
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Function Name Sort by function nameHit count Sort by function hit count
<anonymous>:240 0
<anonymous>:350 0
FOCUS:258 0
deep_eq:496 0
disable_formatting:545 0
green_highlight:35 0
print2:392 0
red_highlight:31 0
shallow_eq:476 0
tos:397 0
white_underline:11 0
<main> 1
FINISH:269 1
SKIP:310 1
START:326 1
benchmark:541 1
test:529 1
BENCH:338 3
convert_units:48 6
round:368 6
CHECK_EXPECT_ERR:183 9
TEST:224 24
output_test_result:131 24
white:15 24
CASE:169 72
orange:43 72
yellow:27 75
green:19 76
gray:39 83
red:23 144
CHECK:201 1173
-
-
- - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/tools/testkit.luau.func.html b/coverage/jecs/tools/testkit.luau.func.html deleted file mode 100644 index 4eedc20..0000000 --- a/coverage/jecs/tools/testkit.luau.func.html +++ /dev/null @@ -1,292 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/tools/testkit.luau - functions - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs/tools - testkit.luau (source / functions)CoverageTotalHit
Test:coverage.outLines:66.1 %319211
Test Date:2025-03-27 03:52:25Functions:64.5 %3120
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Function Name Sort by function nameHit count Sort by function hit count
<anonymous>:240 0
<anonymous>:350 0
<main> 1
BENCH:338 3
CASE:169 72
CHECK:201 1173
CHECK_EXPECT_ERR:183 9
FINISH:269 1
FOCUS:258 0
SKIP:310 1
START:326 1
TEST:224 24
benchmark:541 1
convert_units:48 6
deep_eq:496 0
disable_formatting:545 0
gray:39 83
green:19 76
green_highlight:35 0
orange:43 72
output_test_result:131 24
print2:392 0
red:23 144
red_highlight:31 0
round:368 6
shallow_eq:476 0
test:529 1
tos:397 0
white:15 24
white_underline:11 0
yellow:27 75
-
-
- - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/jecs/tools/testkit.luau.gcov.html b/coverage/jecs/tools/testkit.luau.gcov.html deleted file mode 100644 index 013f876..0000000 --- a/coverage/jecs/tools/testkit.luau.gcov.html +++ /dev/null @@ -1,630 +0,0 @@ - - - - - - - LCOV - coverage.out - jecs/tools/testkit.luau - - - - - - - - - - - - - - -
LCOV - code coverage report
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current view:top level - jecs/tools - testkit.luau (source / functions)CoverageTotalHit
Test:coverage.outLines:66.1 %319211
Test Date:2025-03-27 03:52:25Functions:64.5 %3120
-
- - - - - - - - -

-
            Line data    Source code
-
-       1            1 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-       2              : /* (content generated from line coverage data) */
-       3              : /* ... */
-       4              : /* ... */
-       5              : /* ... */
-       6              : /* ... */
-       7              : /* ... */
-       8            1 : /* ... */
-       9              : /* ... */
-      10            1 : /* ... */
-      11            1 : /* ... */
-      12            0 : /* ... */
-      13              : /* ... */
-      14              : /* ... */
-      15            1 : /* ... */
-      16           24 : /* ... */
-      17              : /* ... */
-      18              : /* ... */
-      19            1 : /* ... */
-      20           76 : /* ... */
-      21              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-      22              : /* (content generated from line coverage data) */
-      23            1 : /* ... */
-      24          144 : /* ... */
-      25              : /* ... */
-      26              : /* ... */
-      27            1 : /* ... */
-      28           75 : /* ... */
-      29              : /* ... */
-      30              : /* ... */
-      31            1 : /* ... */
-      32            0 : /* ... */
-      33              : /* ... */
-      34              : /* ... */
-      35            1 : /* ... */
-      36            0 : /* ... */
-      37              : /* ... */
-      38              : /* ... */
-      39            1 : /* ... */
-      40           83 : /* ... */
-      41              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-      42              : /* (content generated from line coverage data) */
-      43            1 : /* ... */
-      44           72 : /* ... */
-      45              : /* ... */
-      46              : /* ... */
-      47              : /* ... */
-      48            1 : /* ... */
-      49            6 : /* ... */
-      50            6 : /* ... */
-      51              : /* ... */
-      52            6 : /* ... */
-      53            6 : /* ... */
-      54            6 : /* ... */
-      55            6 : /* ... */
-      56            6 : /* ... */
-      57            6 : /* ... */
-      58            6 : /* ... */
-      59            6 : /* ... */
-      60            6 : /* ... */
-      61            6 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-      62              : /* (content generated from line coverage data) */
-      63              : /* ... */
-      64            6 : /* ... */
-      65            6 : /* ... */
-      66            6 : /* ... */
-      67            6 : /* ... */
-      68            6 : /* ... */
-      69            6 : /* ... */
-      70            6 : /* ... */
-      71            6 : /* ... */
-      72            6 : /* ... */
-      73            6 : /* ... */
-      74              : /* ... */
-      75              : /* ... */
-      76            6 : /* ... */
-      77              : /* ... */
-      78            7 : /* ... */
-      79            1 : /* ... */
-      80            1 : /* ... */
-      81              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-      82              : /* (content generated from line coverage data) */
-      83           11 : /* ... */
-      84            7 : /* ... */
-      85            7 : /* ... */
-      86              : /* ... */
-      87              : /* ... */
-      88            6 : /* ... */
-      89            1 : /* ... */
-      90            5 : /* ... */
-      91            1 : /* ... */
-      92            4 : /* ... */
-      93            2 : /* ... */
-      94              : /* ... */
-      95              : /* ... */
-      96            6 : /* ... */
-      97              : /* ... */
-      98              : /* ... */
-      99            1 : /* ... */
-     100              : /* ... */
-     101              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-     102              : /* (content generated from line coverage data) */
-     103              : /* ... */
-     104              : /* ... */
-     105              : /* ... */
-     106              : /* ... */
-     107              : /* ... */
-     108              : /* ... */
-     109              : /* ... */
-     110              : /* ... */
-     111              : /* ... */
-     112              : /* ... */
-     113              : /* ... */
-     114              : /* ... */
-     115              : /* ... */
-     116              : /* ... */
-     117              : /* ... */
-     118              : /* ... */
-     119              : /* ... */
-     120              : /* ... */
-     121              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-     122              : /* (content generated from line coverage data) */
-     123              : /* ... */
-     124            1 : /* ... */
-     125              : /* ... */
-     126            1 : /* ... */
-     127            1 : /* ... */
-     128            1 : /* ... */
-     129            1 : /* ... */
-     130              : /* ... */
-     131            1 : /* ... */
-     132           24 : /* ... */
-     133            0 : /* ... */
-     134            0 : /* ... */
-     135            0 : /* ... */
-     136              : /* ... */
-     137              : /* ... */
-     138            0 : /* ... */
-     139            0 : /* ... */
-     140              : /* ... */
-     141              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-     142              : /* (content generated from line coverage data) */
-     143           24 : /* ... */
-     144              : /* ... */
-     145           24 : /* ... */
-     146           72 : /* ... */
-     147           72 : /* ... */
-     148           72 : /* ... */
-     149           72 : /* ... */
-     150           72 : /* ... */
-     151           72 : /* ... */
-     152           72 : /* ... */
-     153              : /* ... */
-     154           72 : /* ... */
-     155           72 : /* ... */
-     156              : /* ... */
-     157              : /* ... */
-     158           72 : /* ... */
-     159              : /* ... */
-     160              : /* ... */
-     161           24 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-     162            0 : /* (content generated from line coverage data) */
-     163            0 : /* ... */
-     164              : /* ... */
-     165           24 : /* ... */
-     166              : /* ... */
-     167              : /* ... */
-     168              : /* ... */
-     169            1 : /* ... */
-     170           72 : /* ... */
-     171           72 : /* ... */
-     172              : /* ... */
-     173           72 : /* ... */
-     174           72 : /* ... */
-     175           72 : /* ... */
-     176           72 : /* ... */
-     177              : /* ... */
-     178              : /* ... */
-     179           72 : /* ... */
-     180           72 : /* ... */
-     181              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-     182              : /* (content generated from line coverage data) */
-     183            1 : /* ... */
-     184            9 : /* ... */
-     185            9 : /* ... */
-     186            9 : /* ... */
-     187            0 : /* ... */
-     188            0 : /* ... */
-     189              : /* ... */
-     190            9 : /* ... */
-     191            9 : /* ... */
-     192            9 : /* ... */
-     193            9 : /* ... */
-     194            9 : /* ... */
-     195            0 : /* ... */
-     196              : /* ... */
-     197            9 : /* ... */
-     198              : /* ... */
-     199              : /* ... */
-     200              : /* ... */
-     201            1 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-     202         1173 : /* (content generated from line coverage data) */
-     203              : /* ... */
-     204         1173 : /* ... */
-     205              : /* ... */
-     206         1173 : /* ... */
-     207            9 : /* ... */
-     208            9 : /* ... */
-     209              : /* ... */
-     210              : /* ... */
-     211         1173 : /* ... */
-     212              : /* ... */
-     213         1173 : /* ... */
-     214         1173 : /* ... */
-     215         1173 : /* ... */
-     216            1 : /* ... */
-     217              : /* ... */
-     218         1173 : /* ... */
-     219              : /* ... */
-     220              : /* ... */
-     221         1173 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-     222              : /* (content generated from line coverage data) */
-     223              : /* ... */
-     224            1 : /* ... */
-     225           24 : /* ... */
-     226           24 : /* ... */
-     227              : /* ... */
-     228           24 : /* ... */
-     229           24 : /* ... */
-     230           24 : /* ... */
-     231           24 : /* ... */
-     232           24 : /* ... */
-     233              : /* ... */
-     234           24 : /* ... */
-     235              : /* ... */
-     236           24 : /* ... */
-     237              : /* ... */
-     238           24 : /* ... */
-     239           24 : /* ... */
-     240           24 : /* ... */
-     241            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-     242              : /* (content generated from line coverage data) */
-     243           24 : /* ... */
-     244              : /* ... */
-     245           24 : /* ... */
-     246            0 : /* ... */
-     247              : /* ... */
-     248           24 : /* ... */
-     249              : /* ... */
-     250           24 : /* ... */
-     251            0 : /* ... */
-     252            0 : /* ... */
-     253              : /* ... */
-     254              : /* ... */
-     255           24 : /* ... */
-     256              : /* ... */
-     257              : /* ... */
-     258            1 : /* ... */
-     259            0 : /* ... */
-     260              : /* ... */
-     261            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-     262            0 : /* (content generated from line coverage data) */
-     263            0 : /* ... */
-     264              : /* ... */
-     265            0 : /* ... */
-     266              : /* ... */
-     267              : /* ... */
-     268              : /* ... */
-     269            1 : /* ... */
-     270            1 : /* ... */
-     271            1 : /* ... */
-     272            1 : /* ... */
-     273            1 : /* ... */
-     274            1 : /* ... */
-     275            1 : /* ... */
-     276              : /* ... */
-     277            1 : /* ... */
-     278           24 : /* ... */
-     279           24 : /* ... */
-     280           72 : /* ... */
-     281           72 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-     282            0 : /* (content generated from line coverage data) */
-     283              : /* ... */
-     284           72 : /* ... */
-     285           72 : /* ... */
-     286            0 : /* ... */
-     287              : /* ... */
-     288           72 : /* ... */
-     289              : /* ... */
-     290            0 : /* ... */
-     291              : /* ... */
-     292              : /* ... */
-     293              : /* ... */
-     294           24 : /* ... */
-     295              : /* ... */
-     296              : /* ... */
-     297            1 : /* ... */
-     298            1 : /* ... */
-     299            0 : /* ... */
-     300              : /* ... */
-     301              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-     302            1 : /* (content generated from line coverage data) */
-     303              : /* ... */
-     304            1 : /* ... */
-     305              : /* ... */
-     306            1 : /* ... */
-     307            1 : /* ... */
-     308              : /* ... */
-     309              : /* ... */
-     310            1 : /* ... */
-     311            1 : /* ... */
-     312              : /* ... */
-     313              : /* ... */
-     314              : /* ... */
-     315              : /* ... */
-     316              : /* ... */
-     317              : /* ... */
-     318              : /* ... */
-     319              : /* ... */
-     320              : /* ... */
-     321              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-     322              : /* (content generated from line coverage data) */
-     323              : /* ... */
-     324            1 : /* ... */
-     325              : /* ... */
-     326            1 : /* ... */
-     327            1 : /* ... */
-     328            1 : /* ... */
-     329            1 : /* ... */
-     330            1 : /* ... */
-     331              : /* ... */
-     332            1 : /* ... */
-     333            1 : /* ... */
-     334            1 : /* ... */
-     335            1 : /* ... */
-     336              : /* ... */
-     337              : /* ... */
-     338            1 : /* ... */
-     339            3 : /* ... */
-     340            3 : /* ... */
-     341              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-     342            3 : /* (content generated from line coverage data) */
-     343            3 : /* ... */
-     344            3 : /* ... */
-     345              : /* ... */
-     346            3 : /* ... */
-     347            3 : /* ... */
-     348            3 : /* ... */
-     349              : /* ... */
-     350            3 : /* ... */
-     351            0 : /* ... */
-     352              : /* ... */
-     353              : /* ... */
-     354            3 : /* ... */
-     355            3 : /* ... */
-     356              : /* ... */
-     357            3 : /* ... */
-     358            0 : /* ... */
-     359            0 : /* ... */
-     360              : /* ... */
-     361            3 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-     362            3 : /* (content generated from line coverage data) */
-     363              : /* ... */
-     364            3 : /* ... */
-     365            3 : /* ... */
-     366            3 : /* ... */
-     367              : /* ... */
-     368            3 : /* ... */
-     369            6 : /* ... */
-     370            5 : /* ... */
-     371              : /* ... */
-     372              : /* ... */
-     373            3 : /* ... */
-     374            3 : /* ... */
-     375            3 : /* ... */
-     376            3 : /* ... */
-     377            3 : /* ... */
-     378            3 : /* ... */
-     379            3 : /* ... */
-     380            3 : /* ... */
-     381              : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-     382              : /* (content generated from line coverage data) */
-     383              : /* ... */
-     384              : /* ... */
-     385            3 : /* ... */
-     386              : /* ... */
-     387              : /* ... */
-     388              : /* ... */
-     389              : /* ... */
-     390              : /* ... */
-     391              : /* ... */
-     392            1 : /* ... */
-     393              : /* ... */
-     394              : /* ... */
-     395              : /* ... */
-     396              : /* ... */
-     397            0 : /* ... */
-     398            0 : /* ... */
-     399            0 : /* ... */
-     400              : /* ... */
-     401            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-     402            0 : /* (content generated from line coverage data) */
-     403            0 : /* ... */
-     404            0 : /* ... */
-     405            0 : /* ... */
-     406            0 : /* ... */
-     407            0 : /* ... */
-     408            0 : /* ... */
-     409            0 : /* ... */
-     410            0 : /* ... */
-     411            0 : /* ... */
-     412            0 : /* ... */
-     413            0 : /* ... */
-     414            0 : /* ... */
-     415              : /* ... */
-     416            0 : /* ... */
-     417              : /* ... */
-     418            0 : /* ... */
-     419            0 : /* ... */
-     420            0 : /* ... */
-     421            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-     422              : /* (content generated from line coverage data) */
-     423            0 : /* ... */
-     424            0 : /* ... */
-     425              : /* ... */
-     426              : /* ... */
-     427            0 : /* ... */
-     428            0 : /* ... */
-     429            0 : /* ... */
-     430            0 : /* ... */
-     431              : /* ... */
-     432            0 : /* ... */
-     433            0 : /* ... */
-     434            0 : /* ... */
-     435            0 : /* ... */
-     436              : /* ... */
-     437            0 : /* ... */
-     438            0 : /* ... */
-     439            0 : /* ... */
-     440            0 : /* ... */
-     441            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-     442              : /* (content generated from line coverage data) */
-     443            0 : /* ... */
-     444            0 : /* ... */
-     445              : /* ... */
-     446              : /* ... */
-     447            0 : /* ... */
-     448            0 : /* ... */
-     449              : /* ... */
-     450            0 : /* ... */
-     451              : /* ... */
-     452            0 : /* ... */
-     453              : /* ... */
-     454            0 : /* ... */
-     455            0 : /* ... */
-     456            0 : /* ... */
-     457              : /* ... */
-     458              : /* ... */
-     459            0 : /* ... */
-     460            0 : /* ... */
-     461            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-     462            0 : /* (content generated from line coverage data) */
-     463              : /* ... */
-     464              : /* ... */
-     465              : /* ... */
-     466            0 : /* ... */
-     467            0 : /* ... */
-     468            0 : /* ... */
-     469            0 : /* ... */
-     470              : /* ... */
-     471              : /* ... */
-     472              : /* ... */
-     473              : /* ... */
-     474              : /* ... */
-     475              : /* ... */
-     476            1 : /* ... */
-     477            0 : /* ... */
-     478            0 : /* ... */
-     479              : /* ... */
-     480              : /* ... */
-     481            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-     482            0 : /* (content generated from line coverage data) */
-     483            0 : /* ... */
-     484              : /* ... */
-     485              : /* ... */
-     486              : /* ... */
-     487            0 : /* ... */
-     488            0 : /* ... */
-     489            0 : /* ... */
-     490              : /* ... */
-     491              : /* ... */
-     492              : /* ... */
-     493            0 : /* ... */
-     494              : /* ... */
-     495              : /* ... */
-     496            1 : /* ... */
-     497            0 : /* ... */
-     498            0 : /* ... */
-     499              : /* ... */
-     500              : /* ... */
-     501            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-     502            0 : /* (content generated from line coverage data) */
-     503            0 : /* ... */
-     504            0 : /* ... */
-     505              : /* ... */
-     506            0 : /* ... */
-     507            0 : /* ... */
-     508              : /* ... */
-     509              : /* ... */
-     510              : /* ... */
-     511            0 : /* ... */
-     512            0 : /* ... */
-     513            0 : /* ... */
-     514            0 : /* ... */
-     515              : /* ... */
-     516            0 : /* ... */
-     517            0 : /* ... */
-     518              : /* ... */
-     519              : /* ... */
-     520              : /* ... */
-     521            0 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-     522              : /* (content generated from line coverage data) */
-     523              : /* ... */
-     524              : /* ... */
-     525              : /* ... */
-     526              : /* ... */
-     527              : /* ... */
-     528            1 : /* ... */
-     529            1 : /* ... */
-     530            1 : /* ... */
-     531            1 : /* ... */
-     532            1 : /* ... */
-     533            1 : /* ... */
-     534            1 : /* ... */
-     535            1 : /* ... */
-     536            1 : /* ... */
-     537            1 : /* ... */
-     538              : /* ... */
-     539              : /* ... */
-     540              : /* ... */
-     541            1 : /* /mnt/c/Users/Marcus/Documents/packages/jecs/tools/testkit.luau
 not found */
-     542            1 : /* (content generated from line coverage data) */
-     543              : /* ... */
-     544              : /* ... */
-     545            1 : /* ... */
-     546            0 : /* ... */
-     547              : /* ... */
-     548              : /* ... */
-     549            1 : /* ... */
-     550              : /* ... */
-     551            1 : /* ... */
-     552            1 : /* ... */
-     553              : /* ... */
-     554            1 : /* ... */
-        
-
-
- - - - -
Generated by: LCOV version 2.0-1
-
- - - diff --git a/coverage/lifetime_tracker.luau.html b/coverage/lifetime_tracker.luau.html new file mode 100644 index 0000000..00b3738 --- /dev/null +++ b/coverage/lifetime_tracker.luau.html @@ -0,0 +1,250 @@ + + + + +

lifetime_tracker.luau Coverage

+

Total Execution Hits: 1

+

Function Coverage Overview: 9.09%

+ +
+

Function Coverage:

+ + + + + + + + + + + +
FunctionHits
1
print_centered_entity:120
name:260
pad:300
lifetime_tracker_add:360
:480
:620
:890
:1350
:1640
:1750
+

Source Code:

+ + + + + +> + +> + + +> + + + +> + +> + + +> + +> + +> +> + + +> + + + + +> +> +> + + + + +> + +> + +> + +> + + + + +> + + + + + + +> + + +> + + + + + +> + + + + + + + +> + +> +> + + + + + +> +> + +> + + + + + +> + + + +> +> + + + + +> + + + +> +> + + + + + + + +> + +> +> +> + +> +> + + + + + +> + +> +> +> +> + + +> +> +> + + + + + + +> + + + + + + + + +> +> + +> + + +> + + + + + + + + + +> +> +> + + + +> + + + + + + + +> + + + +> + + + + + + + +> + + + + + + +> +> +> +> +> +> + + +> + +> +> + +
LineHitsCode
11local jecs = require("@jecs")
21local ECS_GENERATION = jecs.ECS_GENERATION
31local ECS_ID = jecs.ECS_ID
41local __ = jecs.Wildcard
51local pair = jecs.pair
6N/A
71local prettify = require("@tools/entity_visualiser").prettify
8N/A
91local pe = prettify
101local ansi = require("@tools/ansi")
11N/A
121function print_centered_entity(entity, width: number)
130local entity_str = tostring(entity)
140local entity_length = #entity_str
15N/A
160local padding_total = width - 2 - entity_length
17N/A
180local padding_left = math.floor(padding_total / 2)
190local padding_right = padding_total - padding_left
20N/A
210local centered_str = string.rep(" ", padding_left) .. entity_str .. string.rep(" ", padding_right)
22N/A
230print("|" .. centered_str .. "|")
24N/Aend
25N/A
261local function name(world, e)
270return world:get(world, e, jecs.Name) or pe(e)
28N/Aend
291local padding_enabled = false
301local function pad()
310if padding_enabled then
320print("")
33N/Aend
34N/Aend
35N/A
361local function lifetime_tracker_add(world: jecs.World, opt)
370local entity_index = world.entity_index
380local dense_array = entity_index.dense_array
390local component_index = world.component_index
40N/A
410local ENTITY_RANGE = (jecs.Rest :: any) + 1
42N/A
430local w = setmetatable({}, { __index = world })
44N/A
450padding_enabled = opt.padding_enabled
46N/A
470local world_entity = world.entity
480w.entity = function(self, entity)
490if entity then
500return world_entity(world, entity)
51N/Aend
520local will_recycle = entity_index.max_id ~= entity_index.alive_count
530local e = world_entity(world)
540if will_recycle then
550print(`*recycled {pe(e)}`)
560else
570print(`*created {pe(e)}`)
58N/Aend
590pad()
600return e
61N/Aend
620w.print_entity_index = function(self)
630local max_id = entity_index.max_id
640local alive_count = entity_index.alive_count
650local alive = table.move(dense_array, 1 + jecs.Rest :: any, alive_count, 1, {})
660local dead = table.move(dense_array, alive_count + 1, max_id, 1, {})
67N/A
680local sep = "|--------|"
690if #alive > 0 then
700print("|-alive--|")
710for i = 1, #alive do
720local e = pe(alive[i])
730print_centered_entity(e, 32)
740print(sep)
75N/Aend
760print("\n")
77N/Aend
78N/A
790if #dead > 0 then
800print("|--dead--|")
810for i = 1, #dead do
820print_centered_entity(pe(dead[i]), 32)
830print(sep)
84N/Aend
85N/Aend
860pad()
87N/Aend
880local timelines = {}
890w.print_snapshot = function(self)
900local timeline = #timelines + 1
910local entity_column_width = 10
920local status_column_width = 8
93N/A
940local header = string.format("| %-" .. entity_column_width .. "s |", "Entity")
950for i = 1, timeline do
960header = header .. string.format(" %-" .. status_column_width .. "s |", string.format("T%d", i))
97N/Aend
98N/A
990local max_id = entity_index.max_id
1000local alive_count = entity_index.alive_count
1010local alive = table.move(dense_array, 1 + jecs.Rest :: any, alive_count, 1, {})
1020local dead = table.move(dense_array, alive_count + 1, max_id, 1, {})
103N/A
1040local data = {}
1050print("-------------------------------------------------------------------")
1060print(header)
107N/A
108N/A-- Store the snapshot data for this timeline
1090for i = ENTITY_RANGE, max_id do
1100if dense_array[i] then
1110local entity = dense_array[i]
1120local id = ECS_ID(entity)
1130local status = "alive"
1140if not world:contains(entity) then
1150status = "dead"
116N/Aend
1170data[id] = status
118N/Aend
119N/Aend
120N/A
1210table.insert(timelines, data)
122N/A
123N/A-- Create a table to hold entity data for sorting
1240local entities = {}
1250for i = ENTITY_RANGE, max_id do
1260if dense_array[i] then
1270local entity = dense_array[i]
1280local id = ECS_ID(entity)
129N/A-- Push entity and id into the new `entities` table
1300table.insert(entities, { entity = entity, id = id })
131N/Aend
132N/Aend
133N/A
134N/A-- Sort the entities by ECS_ID
1350table.sort(entities, function(a, b)
1360return a.id < b.id
137N/Aend)
138N/A
139N/A-- Print the sorted rows
1400for _, entity_data in ipairs(entities) do
1410local entity = entity_data.entity
1420local id = entity_data.id
1430local status = "alive"
1440if id > alive_count then
1450status = "dead"
146N/Aend
1470local row = string.format("| %-" .. entity_column_width .. "s |", pe(entity))
1480for j = 1, timeline do
1490local timeline_data = timelines[j]
1500local entity_data = timeline_data[id]
1510if entity_data then
1520row = row .. string.format(" %-" .. status_column_width .. "s |", entity_data)
1530else
1540row = row .. string.format(" %-" .. status_column_width .. "s |", "-")
155N/Aend
156N/Aend
1570print(row)
158N/Aend
1590print("-------------------------------------------------------------------")
1600pad()
161N/Aend
1620local world_add = world.add
1630local relations = {}
1640w.add = function(self, entity: any, component: any)
1650world_add(world, entity, component)
1660if jecs.IS_PAIR(component) then
1670local relation = jecs.pair_first(world, component)
1680local target = jecs.pair_second(world, component)
1690print(`*added ({pe(relation)}, {pe(target)}) to {pe(entity)}`)
1700pad()
171N/Aend
172N/Aend
173N/A
1740local world_delete = world.delete
1750w.delete = function(self, e)
1760world_delete(world, e)
177N/A
1780local idr_t = component_index[pair(__, e)]
1790if idr_t then
1800for archetype_id in idr_t.cache do
1810local archetype = world.archetypes[archetype_id]
1820for _, id in archetype.types do
1830if not jecs.IS_PAIR(id) then
1840continue
185N/Aend
1860local object = jecs.pair_second(world, id)
1870if object ~= e then
1880continue
189N/Aend
1900local id_record = component_index[id]
1910local flags = id_record.flags
1920local flags_delete_mask: number = bit32.band(flags, jecs.ECS_ID_DELETE)
1930if flags_delete_mask ~= 0 then
1940for _, entity in archetype.entities do
1950print(`*deleted dependant {pe(entity)} of {pe(e)}`)
1960pad()
197N/Aend
1980break
1990else
2000for _, entity in archetype.entities do
2010print(
2020`*removed dependency ({pe(jecs.pair_first(world, id))}, {pe(object)}) from {pe(entity)}`
2030)
204N/Aend
205N/Aend
206N/Aend
207N/Aend
208N/Aend
209N/A
2100print(`*deleted {pe(e)}`)
2110pad()
212N/Aend
2130return w
214N/Aend
215N/A
2161return lifetime_tracker_add
\ No newline at end of file diff --git a/coverage/ruby.png b/coverage/ruby.png deleted file mode 100644 index 991b6d4..0000000 Binary files a/coverage/ruby.png and /dev/null differ diff --git a/coverage/snow.png b/coverage/snow.png deleted file mode 100644 index 2cdae10..0000000 Binary files a/coverage/snow.png and /dev/null differ diff --git a/coverage/testkit.luau.html b/coverage/testkit.luau.html new file mode 100644 index 0000000..bfd5177 --- /dev/null +++ b/coverage/testkit.luau.html @@ -0,0 +1,613 @@ + + + + +

testkit.luau Coverage

+

Total Execution Hits: 615

+

Function Coverage Overview: 54.84%

+ +
+

Function Coverage:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FunctionHits
1
white_underline:110
white:1524
green:1977
red:23146
yellow:2776
red_highlight:310
green_highlight:350
gray:3984
orange:4373
convert_units:486
output_test_result:13124
CASE:16964
CHECK_EXPECT_ERR:1830
CHECK:2019
TEST:22424
FOCUS:2370
FINISH:2480
:2640
SKIP:3141
START:3301
BENCH:3423
:3540
round:3720
print2:3960
tos:4010
shallow_eq:4800
deep_eq:5000
test:5331
benchmark:5451
disable_formatting:5490
+

Source Code:

+> +> +> +> +> +> +> + +> + + + +> +> + + +> +> + + +> +> + + +> +> + + +> +> + + +> +> + + +> +> + + +> +> + + +> + +> + + + +> + + + + + + + + + + + +> + + + + + + + + + + + +> + +> + + + +> +> + + + +> +> + + + + + + +> +> + +> +> + +> +> +> +> +> + + + + + + + + + + + +> + + + + + + +> + +> + + + + +> + + + + + +> +> + + +> +> +> + +> + + + + + + + + +> + + + +> + +> +> + + + + + +> +> +> + + + +> + + + + + +> + + +> +> + + + + + + +> + + + + + + +> + +> +> +> + + +> + +> + + + +> +> + +> + + + + +> + +> +> + +> +> + +> + + + + + + + +> + +> +> + + +> + + + + + +> +> +> + + + + + + + +> + + + +> + + + + + + +> + +> + + +> + +> + + + +> + +> +> + + + + + + +> + + + +> + + + +> +> +> + +> +> + + + +> +> + +> + +> + + +> +> + + +> +> +> +> +> +> + + + + + +> + +> + + + + + +> + + + + +> +> + + + +> + + + +> + + + +> + + +> +> + + +> + + + + + + +> + + + +> + + + +> +> + + + + + + + + + + +> +> + +> +> +> +> +> +> + + + +> +> + + + +> + + + + + + + + + + + + + + + + +> + + + + + + + +> +> + + + + +> + + + + +> + + + + + + + + +> +> + + +> + +> + +> + + + +> +> + + + + +> +> +> + + + + +> +> +> +> +> +> + + + +> +> + + + +> +> +> + + + +> +> +> + +> +> + + + +> +> + + + + +> + + +> +> +> + + + + +> + + +> +> +> + +> +> +> +> +> +> + + + + + + + + + + + +> +> + + +> +> + + +> +> + +> + + +> + + +
LineHitsCode
1N/A--------------------------------------------------------------------------------
2N/A-- testkit.luau
3N/A-- v0.7.3
4N/A-- MIT License
5N/A-- Copyright (c) 2022 centau
6N/A--------------------------------------------------------------------------------
7N/A
81local disable_ansi = false
9N/A
101local color = {
111white_underline = function(s: string): string
120return if disable_ansi then s else `\27[1;4m{s}\27[0m`
13N/Aend,
14N/A
151white = function(s: string): string
1624return if disable_ansi then s else `\27[37;1m{s}\27[0m`
17N/Aend,
18N/A
191green = function(s: string): string
2077return if disable_ansi then s else `\27[32;1m{s}\27[0m`
21N/Aend,
22N/A
231red = function(s: string): string
24146return if disable_ansi then s else `\27[31;1m{s}\27[0m`
25N/Aend,
26N/A
271yellow = function(s: string): string
2876return if disable_ansi then s else `\27[33;1m{s}\27[0m`
29N/Aend,
30N/A
311red_highlight = function(s: string): string
320return if disable_ansi then s else `\27[41;1;30m{s}\27[0m`
33N/Aend,
34N/A
351green_highlight = function(s: string): string
360return if disable_ansi then s else `\27[42;1;30m{s}\27[0m`
37N/Aend,
38N/A
391gray = function(s: string): string
4084return if disable_ansi then s else `\27[38;1m{s}\27[0m`
41N/Aend,
42N/A
431orange = function(s: string): string
4473return if disable_ansi then s else `\27[38;5;208m{s}\27[0m`
45N/Aend,
460}
47N/A
481local function convert_units(unit: string, value: number): (number, string)
496local sign = math.sign(value)
506value = math.abs(value)
51N/A
526local prefix_colors = {
536[4] = color.red,
546[3] = color.red,
556[2] = color.yellow,
566[1] = color.yellow,
576[0] = color.green,
586[-1] = color.red,
596[-2] = color.yellow,
606[-3] = color.green,
616[-4] = color.red,
620}
63N/A
646local prefixes = {
656[4] = "T",
666[3] = "G",
676[2] = "M",
686[1] = "k",
696[0] = " ",
706[-1] = "m",
716[-2] = "u",
726[-3] = "n",
736[-4] = "p",
740}
75N/A
766local order = 0
77N/A
787while value >= 1000 do
791order += 1
801value /= 1000
81N/Aend
82N/A
8311while value ~= 0 and value < 1 do
847order -= 1
857value *= 1000
86N/Aend
87N/A
886if value >= 100 then
891value = math.floor(value)
905elseif value >= 10 then
911value = math.floor(value * 1e1) / 1e1
924elseif value >= 1 then
932value = math.floor(value * 1e2) / 1e2
94N/Aend
95N/A
966return value * sign, prefix_colors[order](prefixes[order] .. unit)
97N/Aend
98N/A
991local WALL = color.gray("│")
100N/A
101N/A--------------------------------------------------------------------------------
102N/A-- Testing
103N/A--------------------------------------------------------------------------------
104N/A
1050type Test = {
1060name: string,
1070case: Case?,
1080cases: { Case },
1090duration: number,
1100error: {
1110message: string,
1120trace: string,
1130}?,
1140focus: boolean,
1150}
116N/A
1170type Case = {
1180name: string,
1190result: number,
1200line: number?,
1210focus: boolean,
1220}
123N/A
1241local PASS, FAIL, NONE, ERROR, SKIPPED = 1, 2, 3, 4, 5
125N/A
1261local check_for_focused = false
1271local skip = false
1281local test: Test?
1291local tests: { Test } = {}
130N/A
1311local function output_test_result(test: Test)
13224if check_for_focused then
1330local any_focused = test.focus
1340for _, case in test.cases do
1350any_focused = any_focused or case.focus
136N/Aend
137N/A
1380if not any_focused then
1390return
140N/Aend
141N/Aend
142N/A
14324print(color.white(test.name))
144N/A
14524for _, case in test.cases do
14673local status = ({
14773[PASS] = color.green("PASS"),
14873[FAIL] = color.red("FAIL"),
14973[NONE] = color.orange("NONE"),
15073[ERROR] = color.red("FAIL"),
15173[SKIPPED] = color.yellow("SKIP"),
15273})[case.result]
153N/A
15473local line = case.result == FAIL and color.red(`{case.line}:`) or ""
15573if check_for_focused and case.focus == false and test.focus == false then
1560continue
157N/Aend
15873print(`{status}{WALL} {line}{color.gray(case.name)}`)
159N/Aend
160N/A
16124if test.error then
1620print(color.gray("error: ") .. color.red(test.error.message))
1630print(color.gray("trace: ") .. color.red(test.error.trace))
1640else
16524print()
166N/Aend
167N/Aend
168N/A
1691local function CASE(name: string)
1700skip = false
1710assert(test, "no active test")
172N/A
1730local case = {
1740name = name,
1750result = NONE,
1760focus = false,
1770}
178N/A
1790test.case = case
1800table.insert(test.cases, case)
181N/Aend
182N/A
1831local function CHECK_EXPECT_ERR(fn, ...)
1849assert(test, "no active test")
1859local case = test.case
1869if not case then
1870CASE("")
1880case = test.case
189N/Aend
1909assert(case, "no active case")
1919if case.result ~= FAIL then
1929local ok, err = pcall(fn, ...)
1939case.result = if ok then FAIL else PASS
1949if skip then
1950case.result = SKIPPED
196N/Aend
1979case.line = debug.info(stack and stack + 1 or 2, "l")
198N/Aend
199N/Aend
200N/A
2011local function CHECK(value: T, stack: number?): T?
2021195assert(test, "no active test")
203N/A
2041195local case = test.case
205N/A
2061195if not case then
2079CASE("")
2089case = test.case
209N/Aend
210N/A
2111195assert(case, "no active case")
212N/A
2131195if case.result ~= FAIL then
2141195case.result = value and PASS or FAIL
2151195if skip then
2161case.result = SKIPPED
217N/Aend
2181195case.line = debug.info(stack and stack + 1 or 2, "l")
219N/Aend
220N/A
2211195return value
222N/Aend
223N/A
2241local function TEST(name: string, fn: () -> ())
225N/A
22624test = {
22724name = name,
22824cases = {},
22924duration = 0,
23024focus = false,
23124fn = fn
2320}
233N/A
23424table.insert(tests, test)
235N/Aend
236N/A
2371local function FOCUS()
2380assert(test, "no active test")
239N/A
2400check_for_focused = true
2410if test.case then
2420test.case.focus = true
2430else
2440test.focus = true
245N/Aend
246N/Aend
247N/A
2481local function FINISH(): boolean
2491local success = true
2501local total_cases = 0
2511local passed_cases = 0
2521local passed_focus_cases = 0
2531local total_focus_cases = 0
2541local duration = 0
255N/A
2561for _, t in tests do
25724if check_for_focused and not t.focus then
2580continue
259N/Aend
26024test = t
26124fn = t.fn
26224local start = os.clock()
26324local err
26424local success = xpcall(fn, function(m: string)
2650err = { message = m, trace = debug.traceback(nil, 2) }
266N/Aend)
26724test.duration = os.clock() - start
268N/A
26924if not test.case then
2700CASE("")
271N/Aend
27224assert(test.case, "no active case")
273N/A
27424if not success then
2750test.case.result = ERROR
2760test.error = err
277N/Aend
27824collectgarbage()
279N/Aend
280N/A
2811for _, test in tests do
28224duration += test.duration
28324for _, case in test.cases do
28473total_cases += 1
28573if case.focus or test.focus then
2860total_focus_cases += 1
287N/Aend
28873if case.result == PASS or case.result == NONE or case.result == SKIPPED then
28973if case.focus or test.focus then
2900passed_focus_cases += 1
291N/Aend
29273passed_cases += 1
2930else
2940success = false
295N/Aend
296N/Aend
297N/A
29824output_test_result(test)
299N/Aend
300N/A
3011print(color.gray(string.format(`{passed_cases}/{total_cases} test cases passed in %.3f ms.`, duration * 1e3)))
3021if check_for_focused then
3030print(color.gray(`{passed_focus_cases}/{total_focus_cases} focused test cases passed`))
304N/Aend
305N/A
3061local fails = total_cases - passed_cases
307N/A
3081print((fails > 0 and color.red or color.green)(`{fails} {fails == 1 and "fail" or "fails"}`))
309N/A
3101check_for_focused = false
3111return success, table.clear(tests)
312N/Aend
313N/A
3141local function SKIP()
3151skip = true
316N/Aend
317N/A
318N/A--------------------------------------------------------------------------------
319N/A-- Benchmarking
320N/A--------------------------------------------------------------------------------
321N/A
3220type Bench = {
3230time_start: number?,
3240memory_start: number?,
3250iterations: number?,
3260}
327N/A
3281local bench: Bench?
329N/A
3301function START(iter: number?): number
3311local n = iter or 1
3321assert(n > 0, "iterations must be greater than 0")
3331assert(bench, "no active benchmark")
3341assert(not bench.time_start, "clock was already started")
335N/A
3361bench.iterations = n
3371bench.memory_start = gcinfo()
3381bench.time_start = os.clock()
3391return n
340N/Aend
341N/A
3421local function BENCH(name: string, fn: () -> ())
3433local active = bench
3443assert(not active, "a benchmark is already in progress")
345N/A
3463bench = {}
3473assert(bench);
3483(collectgarbage :: any)("collect")
349N/A
3503local mem_start = gcinfo()
3513local time_start = os.clock()
3523local err_msg: string?
353N/A
3543local success = xpcall(fn, function(m: string)
3550err_msg = m .. debug.traceback(nil, 2)
356N/Aend)
357N/A
3583local time_stop = os.clock()
3593local mem_stop = gcinfo()
360N/A
3613if not success then
3620print(`{WALL}{color.red("ERROR")}{WALL} {name}`)
3630print(color.gray(err_msg :: string))
3640else
3653time_start = bench.time_start or time_start
3663mem_start = bench.memory_start or mem_start
367N/A
3683local n = bench.iterations or 1
3693local d, d_unit = convert_units("s", (time_stop - time_start) / n)
3703local a, a_unit = convert_units("B", math.round((mem_stop - mem_start) / n * 1e3))
371N/A
3723local function round(x: number): string
3730return x > 0 and x < 10 and (x - math.floor(x)) > 0 and string.format("%2.1f", x)
3740or string.format("%3.f", x)
375N/Aend
376N/A
3773print(
3783string.format(
3793`%s %s %s %s{WALL} %s`,
3803color.gray(round(d)),
3813d_unit,
3823color.gray(round(a)),
3833a_unit,
3843color.gray(name)
3850)
3860)
387N/Aend
388N/A
3893bench = nil
390N/Aend
391N/A
392N/A--------------------------------------------------------------------------------
393N/A-- Printing
394N/A--------------------------------------------------------------------------------
395N/A
3961local function print2(v: unknown)
3970type Buffer = { n: number, [number]: string }
3980type Cyclic = { n: number, [{}]: number }
399N/A
400N/A-- overkill concatenationless string buffer
4010local function tos(value: any, stack: number, str: Buffer, cyclic: Cyclic)
4020local TAB = " "
4030local indent = table.concat(table.create(stack, TAB))
404N/A
4050if type(value) == "string" then
4060local n = str.n
4070str[n + 1] = "\""
4080str[n + 2] = value
4090str[n + 3] = "\""
4100str.n = n + 3
4110elseif type(value) ~= "table" then
4120local n = str.n
4130str[n + 1] = value == nil and "nil" or tostring(value)
4140str.n = n + 1
4150elseif next(value) == nil then
4160local n = str.n
4170str[n + 1] = "{}"
4180str.n = n + 1
4190else -- is table
4200local tabbed_indent = indent .. TAB
421N/A
4220if cyclic[value] then
4230str.n += 1
4240str[str.n] = color.gray(`CYCLIC REF {cyclic[value]}`)
4250return
4260else
4270cyclic.n += 1
4280cyclic[value] = cyclic.n
429N/Aend
430N/A
4310str.n += 3
4320str[str.n - 2] = "{ "
4330str[str.n - 1] = color.gray(tostring(cyclic[value]))
4340str[str.n - 0] = "\n"
435N/A
4360local i, v = next(value, nil)
4370while v ~= nil do
4380local n = str.n
4390str[n + 1] = tabbed_indent
440N/A
4410if type(i) ~= "string" then
4420str[n + 2] = "["
4430str[n + 3] = tostring(i)
4440str[n + 4] = "]"
4450n += 4
4460else
4470str[n + 2] = tostring(i)
4480n += 2
449N/Aend
450N/A
4510str[n + 1] = " = "
4520str.n = n + 1
453N/A
4540tos(v, stack + 1, str, cyclic)
455N/A
4560i, v = next(value, i)
457N/A
4580n = str.n
4590str[n + 1] = v ~= nil and ",\n" or "\n"
4600str.n = n + 1
461N/Aend
462N/A
4630local n = str.n
4640str[n + 1] = indent
4650str[n + 2] = "}"
4660str.n = n + 2
467N/Aend
468N/Aend
469N/A
4700local str = { n = 0 }
4710local cyclic = { n = 0 }
4720tos(v, 0, str, cyclic)
4730print(table.concat(str))
474N/Aend
475N/A
476N/A--------------------------------------------------------------------------------
477N/A-- Equality
478N/A--------------------------------------------------------------------------------
479N/A
4801local function shallow_eq(a: {}, b: {}): boolean
4810if #a ~= #b then
4820return false
483N/Aend
484N/A
4850for i, v in next, a do
4860if b[i] ~= v then
4870return false
488N/Aend
489N/Aend
490N/A
4910for i, v in next, b do
4920if a[i] ~= v then
4930return false
494N/Aend
495N/Aend
496N/A
4970return true
498N/Aend
499N/A
5001local function deep_eq(a: {}, b: {}): boolean
5010if #a ~= #b then
5020return false
503N/Aend
504N/A
5050for i, v in next, a do
5060if type(b[i]) == "table" and type(v) == "table" then
5070if deep_eq(b[i], v) == false then
5080return false
509N/Aend
5100elseif b[i] ~= v then
5110return false
512N/Aend
513N/Aend
514N/A
5150for i, v in next, b do
5160if type(a[i]) == "table" and type(v) == "table" then
5170if deep_eq(a[i], v) == false then
5180return false
519N/Aend
5200elseif a[i] ~= v then
5210return false
522N/Aend
523N/Aend
524N/A
5250return true
526N/Aend
527N/A
528N/A--------------------------------------------------------------------------------
529N/A-- Return
530N/A--------------------------------------------------------------------------------
531N/A
5321return {
5331test = function()
5341return {
5351TEST = TEST,
5361CASE = CASE,
5371CHECK = CHECK,
5381FINISH = FINISH,
5391SKIP = SKIP,
5401FOCUS = FOCUS,
5411CHECK_EXPECT_ERR = CHECK_EXPECT_ERR,
5420}
543N/Aend,
544N/A
5451benchmark = function()
5461return BENCH, START
547N/Aend,
548N/A
5491disable_formatting = function()
5500disable_ansi = true
551N/Aend,
552N/A
5531print = print2,
554N/A
5551seq = shallow_eq,
5561deq = deep_eq,
557N/A
5581color = color,
5590}
\ No newline at end of file diff --git a/coverage/tests.luau.html b/coverage/tests.luau.html new file mode 100644 index 0000000..26a41a5 --- /dev/null +++ b/coverage/tests.luau.html @@ -0,0 +1,2040 @@ + + + + +

tests.luau Coverage

+

Total Execution Hits: 72

+

Function Coverage Overview: 79.10%

+ +
+

Function Coverage:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FunctionHits
1
white_underline:300
white:340
green:380
red:420
yellow:460
red_highlight:500
green_highlight:540
gray:580
pe:630
pp:680
debug_world_inspect:737
record:740
tbl:776
archetype:804
records:831
columns:860
row:893
tuple:942
name:1160
:1201
:1361
:1741
:1841
:1891
getTargets:1922
setAttacksAndEats:2120
:2401
:2561
:3121
:3861
:4351
:4461
:4531
:4751
:5141
:5721
:5961
:8961
:10201
:10481
:10851
:11841
:12131
:12311
:12421
:12501
:13251
:13301
:13701
:13911
:15121
:15411
:16391
:16511
:16561
:16671
:16811
:16971
:17111
:17701
updateCooldowns:17772
:18201
:18891
:18971
:19191
:19391
+

Source Code:

+ +> + + + + + + + + + + + + + + +> + + + + + +> + +> + + +> + + + +> +> + + +> +> + + +> +> + + +> +> + + +> +> + + +> +> + + +> +> + + +> + +> + + + +> +> + + + +> +> + + + +> + + +> + + +> + + +> + + +> + + +> +> +> + + + + +> +> + +> +> + + + + + + + + + +> +> + +> + + +> +> + + + +> + + + + + + + + + +> +> +> + + + + + +> + + + + +> + +> +> + + + + +> +> + + + + + + +> + + +> +> +> + + +> +> + +> + + +> + + + + + + + + + +> +> +> + + +> + + + + + + + + + + + +> +> +> + +> +> + + +> + + + +> +> + + + + + + + + + + +> +> + + +> + + +> + + +> +> +> + + + +> + + + + + +> + + + + +> +> + + + + + +> + + + +> + +> + + +> +> + + + +> + +> + + + +> + + + +> + +> + +> + + + +> + + + + + + + + + + + + + +> +> + + +> + + + + + + + + + +> +> + + + + + + + + +> +> + + + + + +> +> + +> + + +> + + +> + + + +> + +> +> + + + + + + + + + + + + +> +> + + + + + + +> + + + + + + + +> +> +> + + + + +> + +> + + + +> +> + + +> + +> +> + + + + + + + +> + + +> + +> + +> +> +> + + +> + + + + +> + +> + + + +> + + +> +> + + + + +> + +> + + +> + +> +> +> + + + + +> + + +> + + + + +> +> + + +> + + +> +> +> + + + + + + +> + + + + + +> +> + + + + +> + +> + + +> +> + + +> + +> + + +> + + +> +> +> +> + + + + + + + + + + + +> + + + + +> + + + + +> + + + +> + + + +> + +> + + + + +> + + + + + + + + + + + +> + + +> + +> + + + + + + +> + + + + +> + +> + + +> + + + + +> + +> + + + + + + +> +> + + + + + +> +> + + + + + + +> + + + +> + + + +> + +> +> + + +> +> + +> +> + + + + + + + + + + + +> +> + +> + + + + +> + + +> + + +> +> +> + + + + + + +> + + +> + + + + +> + + + +> + +> +> + + + + +> + + + +> + + + +> +> + + + + + + + + + + +> +> +> + + + + + + + + + + + + + +> + +> + + + + + + + + +> +> + +> + +> +> + + + + + +> + + + +> +> +> + + + + +> + +> +> + + + + +> +> + +> +> + + + + + +> + + + +> + + + + + +> +> +> + + +> +> + +> +> + + + + + + +> + + + + +> +> +> + + + + + + +> + +> + + + + +> + + + +> +> +> + + + + + + + + +> + + +> + + + + + + + + +> +> +> + + +> + + + +> + +> +> + + + + + + + +> + + + +> + + +> + + + +> +> + +> + + +> +> +> + + + + + + +> + + + +> +> +> + + + + +> + +> + + + +> + + + + + +> + + + +> + +> +> + + + + + +> + + + + + +> + + + + +> + +> +> + + + + + + +> + + + + + +> + + + +> + +> +> + +> +> + + + + +> + + + + + +> + + + + +> +> + +> +> +> + + +> + + +> + + + +> + + + +> +> + +> +> + +> + + +> + + + +> + +> +> +> + + + + + +> + + + +> + +> + + +> + + + +> + + + + +> + +> +> +> + + + + +> + + +> + +> + + +> + + +> + + + + + + +> + +> + +> + +> + + + +> +> + +> +> + + + + + + + +> + + + +> + + +> + + +> + + +> + + + + + +> +> + + + + + +> + + + + +> + +> + + +> + + + +> + +> + + + +> + + +> + +> + + +> + + + + +> +> + + + + +> + +> + + + +> + + + +> + + + +> + + + + + + +> +> +> +> +> +> + + + +> + +> + + +> + +> +> + + +> + + + + +> + + + + +> + +> +> +> + + + + + +> + + +> +> + + + + + + + + + + +> +> + + + + +> +> +> + + + +> + + +> + + + +> +> + + +> + +> + + + + +> + + + + + + + + + +> + + + + + +> + + + +> + + +> + + + + + + +> + + +> + + +> + + + + + + +> + + + + +> + + +> +> + + +> + + + +> + + + + +> + + + + +> +> + + + +> + + + +> + + + + + +> +> +> + + +> + + + +> + + + +> + + + + + + + +> +> + + +> +> + + + + +> +> + +> + + + + + + + +> +> + + +> +> + + + + + +> +> +> + + + + + + + + + +> + +> + + +> + + + +> + +> + + + +> + + +> + +> + + +> + + +> +> + + + + + + +> + + + +> + +> + + +> + + +> + +> + + + +> +> +> + + + + + + + +> +> + + +> + + + +> + +> + + + +> + + +> + + +> +> +> + + + +> + + + +> + + + + + +> +> + + + + +> +> +> + + +> +> +> + + + + + + + +> + + +> + + + +> +> +> + + + + + + + + + + + + + + +> + + + + + + + +> + + + +> + + + + + + + + + + + + + + + +> + + + + +> + + +> +> + + + + + + + + +> + + + + + +> + + + +> +> + + + +> + + + +> + + + + +> +> + + + + + + +> +> + +> +> +> + + + + +> + + + + +> +> +> + + + + + + + +> + +> +> + + + + +> + + + + +> + +> +> + + +> + + + + + + +> + +> + + +> + +> + + + + +> + + + + +> +> + + + + +> +> +> +> + + + + + +> + + + + +> + + + + +> + + + + +> +> + + + + + +> +> + +> +> + + + + + +> + +> + +> + +> + + + + +> +> + +> + + +> +> +> +> +> + + + + + + +> + + +> + + + +> + + +> + + +> +> +> + + + +> +> +> + + +> +> + + + + +> + +> + + +> + + + +> + +> +> +> + + + + +> + + + +> + + +> + +> + + + + + +> + + + +> + +> + + + +> + + + +> + +> + +> + +> + + + +> + +> + + + +> + + + +> + +> + +> + + +> + + + +> + +> +> +> + + + +> + + +> + + + +> +> + + +> + +> + + + +> + + + +> + +> + +> + + + +> +> + + +> + +> + +> + + + +> + + + +> + + + +> +> + +> + +> + +> +> + +
LineHitsCode
11local jecs = require("@jecs")
2N/A
31local testkit = require("@testkit")
41local BENCH, START = testkit.benchmark()
51local __ = jecs.Wildcard
61local ECS_ID, ECS_GENERATION = jecs.ECS_ID, jecs.ECS_GENERATION
71local ECS_GENERATION_INC = jecs.ECS_GENERATION_INC
81local IS_PAIR = jecs.IS_PAIR
91local pair = jecs.pair
101local ecs_pair_first = jecs.pair_first
111local ecs_pair_second = jecs.pair_second
121local entity_index_try_get_any = jecs.entity_index_try_get_any
131local entity_index_get_alive = jecs.entity_index_get_alive
141local entity_index_is_alive = jecs.entity_index_is_alive
151local ChildOf = jecs.ChildOf
161local world_new = jecs.World.new
17N/A
181local it = testkit.test()
191local TEST, CASE = it.TEST, it.CASE
201local CHECK, FINISH = it.CHECK, it.FINISH
211local SKIP, FOCUS = it.SKIP, it.FOCUS
221local CHECK_EXPECT_ERR = it.CHECK_EXPECT_ERR
23N/A
241local N = 2 ^ 8
25N/A
260type World = jecs.World
270type Entity = jecs.Entity
28N/A
291local c = {
301white_underline = function(s: any)
310return `\27[1;4m{s}\27[0m`
32N/Aend,
33N/A
341white = function(s: any)
350return `\27[37;1m{s}\27[0m`
36N/Aend,
37N/A
381green = function(s: any)
390return `\27[32;1m{s}\27[0m`
40N/Aend,
41N/A
421red = function(s: any)
430return `\27[31;1m{s}\27[0m`
44N/Aend,
45N/A
461yellow = function(s: any)
470return `\27[33;1m{s}\27[0m`
48N/Aend,
49N/A
501red_highlight = function(s: any)
510return `\27[41;1;30m{s}\27[0m`
52N/Aend,
53N/A
541green_highlight = function(s: any)
550return `\27[42;1;30m{s}\27[0m`
56N/Aend,
57N/A
581gray = function(s: any)
590return `\27[30;1m{s}\27[0m`
60N/Aend,
610}
62N/A
631local function pe(e)
640local gen = ECS_GENERATION(e)
650return c.green(`e{ECS_ID(e)}`)..c.yellow(`v{gen}`)
66N/Aend
67N/A
681local function pp(e)
690local gen = ECS_GENERATION(e)
700return c.green(`e{ECS_ID(e)}`)..c.yellow(`v{jecs.ECS_ENTITY_T_HI(e)}`)
71N/Aend
72N/A
731local function debug_world_inspect(world: World)
747local function record(e): jecs.Record
752return entity_index_try_get_any(world.entity_index, e) :: any
76N/Aend
777local function tbl(e)
781return record(e).archetype
79N/Aend
807local function archetype(e)
814return tbl(e).type
82N/Aend
837local function records(e)
841return tbl(e).records
85N/Aend
867local function columns(e)
871return tbl(e).columns
88N/Aend
897local function row(e)
902return record(e).row
91N/Aend
92N/A
93N/A-- Important to order them in the order of their columns
947local function tuple(e, ...)
951for i, column in columns(e) do
962if select(i, ...) ~= column[row(e)] then
970return false
98N/Aend
99N/Aend
1001return true
101N/Aend
102N/A
1037return {
1047record = record,
1057tbl = tbl,
1067archetype = archetype,
1077records = records,
1087row = row,
1097tuple = tuple,
1107columns = columns
1110}
112N/Aend
113N/A
1141local dwi = debug_world_inspect
115N/A
1161local function name(world, e)
1170return world:get(e, jecs.Name)
118N/Aend
119N/A
1201TEST("#adding a recycled target", function()
1211local world = world_new()
1221local R = world:component()
123N/A
1241local e = world:entity()
1251local T = world:entity()
1261world:add(e, pair(R, T))
1271world:delete(T)
1281CHECK(not world:has(e, pair(R, T)))
1291local T2 = world:entity()
1301world:add(e, pair(R, T2))
1311CHECK(world:target(e, R) ~= T)
1321CHECK(world:target(e, R) ~= 0)
133N/A
134N/Aend)
135N/A
1361TEST("#repro2", function()
1371local world = world_new()
1381local Lifetime = world:component() :: jecs.Id
1391local Particle = world:entity()
1401local Beam = world:entity()
141N/A
1421local entity = world:entity()
1431world:set(entity, pair(Lifetime, Particle), 1)
1441world:set(entity, pair(Lifetime, Beam), 2)
1451world:set(entity, pair(4, 5), 6) -- noise
146N/A
1471local entity_visualizer = require("@tools/entity_visualiser")
148N/A-- entity_visualizer.components(world, entity)
149N/A
1501for e in world:each(pair(Lifetime, __)) do
1512local i = 0
1522local nth = world:target(e, Lifetime, i)
1532while nth do
154N/A-- entity_visualizer.components(world, e)
155N/A
1562local data = world:get(e, pair(Lifetime, nth))
1572data -= 1
1582if data <= 0 then
1591world:remove(e, pair(Lifetime, nth))
1600else
1611world:set(e, pair(Lifetime, nth), data)
162N/Aend
1632i += 1
1642nth = world:target(e, Lifetime, i)
165N/Aend
166N/Aend
167N/A
1681CHECK(not world:has(entity, pair(Lifetime, Particle)))
1691CHECK(world:get(entity, pair(Lifetime, Beam)) == 1)
170N/Aend)
171N/A
1721local lifetime_tracker_add = require("@tools/lifetime_tracker")
173N/A
1741TEST("another", function()
1751local world = world_new()
176N/A-- world = lifetime_tracker_add(world, {padding_enabled=false})
1771local e1 = world:entity()
1781local e2 = world:entity()
1791local e3 = world:entity()
1801world:delete(e2)
1811local e2_e3 = pair(e2, e3)
1821CHECK(jecs.pair_first(world, e2_e3) == 0)
1831CHECK(jecs.pair_second(world, e2_e3) == e3)
1841CHECK_EXPECT_ERR(function()
1851world:add(e1, pair(e2, e3))
186N/Aend)
187N/Aend)
188N/A
1891TEST("#repro", function()
1901local world = world_new()
191N/A
1921local function getTargets(relation)
1932local tgts = {}
1942local pairwildcard = pair(relation, jecs.Wildcard)
1952for _, archetype in world:query(pairwildcard):archetypes() do
1962local tr = archetype.records[pairwildcard]
1972local count = archetype.counts[pairwildcard]
1982local types = archetype.types
1992for _, entity in archetype.entities do
2002for i = 0, count - 1 do
2012local tgt = jecs.pair_second(world, types[i + tr])
2022table.insert(tgts, tgt)
203N/Aend
204N/Aend
205N/Aend
2062return tgts
207N/Aend
208N/A
2091local Attacks = world:component()
2101local Eats = world:component()
211N/A
2121local function setAttacksAndEats(entity1, entity2)
2130world:add(entity1, pair(Attacks, entity2))
2140world:add(entity1, pair(Eats, entity2))
215N/Aend
216N/A
2171local e1 = world:entity()
2181local e2 = world:entity()
2191local e3 = world:entity()
2201setAttacksAndEats(e3, e1)
2211setAttacksAndEats(e3, e2)
2221setAttacksAndEats(e1, e2)
2231local d = dwi(world)
2241world:delete(e2)
2251local types1 = { pair(Attacks, e1), pair(Eats, e1) }
2261table.sort(types1)
227N/A
228N/A
2291CHECK(d.tbl(e1).type == "")
2301CHECK(d.tbl(e3).type == table.concat(types1, "_"))
231N/A
2321for _, entity in getTargets(Attacks) do
2331CHECK(entity == e1)
234N/Aend
2351for _, entity in getTargets(Eats) do
2361CHECK(entity == e1)
237N/Aend
238N/Aend)
239N/A
2401TEST("archetype", function()
2411local archetype_traverse_add = jecs.archetype_traverse_add
2421local archetype_traverse_remove = jecs.archetype_traverse_remove
243N/A
2441local world = world_new()
2451local root = world.ROOT_ARCHETYPE
2461local c1 = world:component()
2471local c2 = world:component()
2481local c3 = world:component()
249N/A
2501local a1 = archetype_traverse_add(world, c1, nil :: any)
2511local a2 = archetype_traverse_remove(world, c1, a1)
2521CHECK(root.add[c1].to == a1)
2531CHECK(root == a2)
254N/Aend)
255N/A
2561TEST("world:cleanup()", function()
2571local world = world_new()
2581local A = world:component() :: jecs.Id
2591local B = world:component() :: jecs.Id
2601local C = world:component() :: jecs.Id
261N/A
2621local e1 = world:entity()
2631local e2 = world:entity()
2641local e3 = world:entity()
265N/A
2661world:set(e1, A, true)
267N/A
2681world:set(e2, A, true)
2691world:set(e2, B, true)
270N/A
271N/A
2721world:set(e3, A, true)
2731world:set(e3, B, true)
2741world:set(e3, C, true)
275N/A
2761local archetype_index = world.archetype_index
277N/A
2781CHECK(#archetype_index["1"].entities == 1)
2791CHECK(#archetype_index["1_2"].entities == 1)
2801CHECK(#archetype_index["1_2_3"].entities == 1)
281N/A
2821world:delete(e1)
2831world:delete(e2)
2841world:delete(e3)
285N/A
2861world:cleanup()
287N/A
2881archetype_index = world.archetype_index
289N/A
2901CHECK((archetype_index["1"] :: jecs.Archetype?) == nil)
2911CHECK((archetype_index["1_2"] :: jecs.Archetype?) == nil)
2921CHECK((archetype_index["1_2_3"] :: jecs.Archetype?) == nil)
293N/A
2941local e4 = world:entity()
2951world:set(e4, A, true)
2961CHECK(#archetype_index["1"].entities == 1)
2971CHECK((archetype_index["1_2"] :: jecs.Archetype?) == nil)
2981CHECK((archetype_index["1_2_3"] :: jecs.Archetype?) == nil)
2991world:set(e4, B, true)
3001CHECK(#archetype_index["1"].entities == 0)
3011CHECK(#archetype_index["1_2"].entities == 1)
3021CHECK((archetype_index["1_2_3"] :: jecs.Archetype?) == nil)
3031world:set(e4, C, true)
3041CHECK(#archetype_index["1"].entities == 0)
3051CHECK(#archetype_index["1_2"].entities == 0)
3061CHECK(#archetype_index["1_2_3"].entities == 1)
307N/Aend)
308N/A
3091local pe = require("@tools/entity_visualiser").prettify
3101local lifetime_tracker_add = require("@tools/lifetime_tracker")
311N/A
3121TEST("world:entity()", function()
3130do
3141CASE("unique IDs")
3151local world = jecs.World.new()
3161local set = {}
3171for i = 1, N do
318256local e = world:entity()
319256CHECK(not set[e])
320256set[e] = true
321N/Aend
322N/Aend
3230do
3241CASE("generations")
3251local world = jecs.World.new()
3261local e = world:entity() :: number
3271CHECK(ECS_ID(e) == 1 + jecs.Rest :: number)
3281CHECK(ECS_GENERATION(e) == 0) -- 0
3291e = ECS_GENERATION_INC(e)
3301CHECK(ECS_GENERATION(e) == 1) -- 1
331N/Aend
332N/A
3331do CASE "pairs"
3341local world = jecs.World.new()
3351local _e = world:entity()
3361local e2 = world:entity()
3371local e3 = world:entity()
338N/A
339N/A-- Incomplete pair, must have a bit flag that notes it is a pair
3401CHECK(IS_PAIR(world:entity()) == false)
341N/A
3421local p = pair(e2, e3)
3431CHECK(IS_PAIR(p) == true)
344N/A
3451CHECK(ecs_pair_first(world, p) == e2 :: number)
3461CHECK(ecs_pair_second(world, p) == e3 :: number)
347N/A
3481world:delete(e2)
3491local e2v2 = world:entity()
3501CHECK(IS_PAIR(e2v2) == false)
351N/A
3521CHECK(IS_PAIR(pair(e2v2, e3)) == true)
353N/Aend
354N/A
3551do CASE "Recycling"
3561local world = world_new()
3571local e = world:entity()
3581world:delete(e)
3591local e1 = world:entity()
3601world:delete(e1)
3611local e2 = world:entity()
3621CHECK(ECS_ID(e2) == e :: number)
3631CHECK(ECS_GENERATION(e2) == 2)
3641CHECK(world:contains(e2))
3651CHECK(not world:contains(e1))
3661CHECK(not world:contains(e))
367N/Aend
368N/A
3691do CASE "Recycling max generation"
3701local world = world_new()
3711local pin = (jecs.Rest :: any) :: number + 1
3721for i = 1, 2^16-1 do
37365535local e = world:entity()
37465535world:delete(e)
375N/Aend
3761local e = world:entity()
3771CHECK(ECS_ID(e) == pin)
3781CHECK(ECS_GENERATION(e) == 2^16-1)
3791world:delete(e)
3801e = world:entity()
3811CHECK(ECS_ID(e) == pin)
3821CHECK(ECS_GENERATION(e) == 0)
383N/Aend
384N/Aend)
385N/A
3861TEST("world:set()", function()
3871do CASE "archetype move"
3880do
3891local world = jecs.World.new()
390N/A
3911local d = debug_world_inspect(world)
392N/A
3931local _1 = world:component()
3941local _2 = world:component()
3951local e = world:entity()
396N/A-- An entity starts without an archetype or row
397N/A-- should therefore not need to copy over data
3981CHECK(d.tbl(e) == nil)
3991CHECK(d.row(e) == nil)
400N/A
4011local archetypes = #world.archetypes
402N/A-- This should create a new archetype since it is the first
403N/A-- entity to have moved there
4041world:set(e, _1, 1)
4051local oldRow = d.row(e)
4061local oldArchetype = d.archetype(e)
4071CHECK(#world.archetypes == archetypes + 1)
4081CHECK(oldArchetype == "1")
4091CHECK(d.tbl(e))
4101CHECK(oldRow == 1)
411N/A
4121world:set(e, _2, 2)
4131CHECK(d.archetype(e) == "1_2")
414N/A-- Should have tuple of fields to the next archetype and set the component data
4151CHECK(d.tuple(e, 1, 2))
416N/A-- Should have moved the data from the old archetype
4171CHECK(world.archetype_index[oldArchetype].columns[_1][oldRow] == nil)
418N/Aend
419N/Aend
420N/A
4211do CASE "pairs"
4221local world = jecs.World.new()
423N/A
4241local C1 = world:component()
4251local C2 = world:component()
4261local T1 = world:entity()
4271local T2 = world:entity()
428N/A
4291local e = world:entity()
430N/A
4311world:set(e, pair(C1, C2), true)
4321world:set(e, pair(C1, T1), true)
4331world:set(e, pair(T1, C1), true)
434N/A
4351CHECK_EXPECT_ERR(function()
4361world:set(e, pair(T1, T2), true :: any)
437N/Aend)
438N/A
4391CHECK(world:get(e, pair(C1, C2)))
4401CHECK(world:get(e, pair(C1, T1)))
4411CHECK(world:get(e, pair(T1, C1)))
4421CHECK(not world:get(e, pair(T1, T2)))
443N/A
4441local e2 = world:entity()
445N/A
4461CHECK_EXPECT_ERR(function()
4471world:set(e2, pair(jecs.ChildOf, e), true :: any)
448N/Aend)
4491CHECK(not world:get(e2, pair(jecs.ChildOf, e)))
450N/Aend
451N/Aend)
452N/A
4531TEST("world:remove()", function()
4540do
4551CASE("should allow remove a component that doesn't exist on entity")
4561local world = jecs.World.new()
457N/A
4581local Health = world:component()
4591local Poison = world:component()
460N/A
4611local id = world:entity()
4620do
4631world:remove(id, Poison)
4641CHECK(true) -- Didn't error
465N/Aend
466N/A
4671world:set(id, Health, 50)
4681world:remove(id, Poison)
469N/A
4701CHECK(world:get(id, Poison) == nil)
4711CHECK(world:get(id, Health) == 50)
472N/Aend
473N/Aend)
474N/A
4751TEST("world:add()", function()
4760do
4771CASE("idempotent")
4781local world = jecs.World.new()
4791local d = debug_world_inspect(world)
4801local _1, _2 = world:component(), world:component()
481N/A
4821local e = world:entity()
4831world:add(e, _1)
4841world:add(e, _2)
4851world:add(e, _2) -- should have 0 effects
4861CHECK(d.archetype(e) == "1_2")
487N/Aend
488N/A
4890do
4901CASE("archetype move")
4910do
4921local world = jecs.World.new()
493N/A
4941local d = debug_world_inspect(world)
495N/A
4961local _1 = world:component()
4971local e = world:entity()
498N/A-- An entity starts without an archetype or row
499N/A-- should therefore not need to copy over data
5001CHECK(d.tbl(e) == nil)
5011CHECK(d.row(e) == nil)
502N/A
5031local archetypes = #world.archetypes
504N/A-- This should create a new archetype
5051world:add(e, _1)
5061CHECK(#world.archetypes == archetypes + 1)
507N/A
5081CHECK(d.archetype(e) == "1")
5091CHECK(d.tbl(e))
510N/Aend
511N/Aend
512N/Aend)
513N/A
5141TEST("world:query()", function()
5151do CASE "cached"
5161local world = world_new()
5171local Foo = world:component()
5181local Bar = world:component()
5191local Baz = world:component()
5201local e = world:entity()
5211local q = world:query(Foo, Bar):without(Baz):cached()
5221world:set(e, Foo, true)
5231world:set(e, Bar, false)
5241local i = 0
525N/A
5261local iter = 0
5271for _, e in q:iter() do
5281iter += 1
5291i=1
530N/Aend
5311CHECK (iter == 1)
5321CHECK(i == 1)
5331for _, e in q:iter() do
5341i=2
535N/Aend
5361CHECK(i == 2)
5371for _, e in q :: any do
5381i=3
539N/Aend
5401CHECK(i == 3)
5411for _, e in q :: any do
5421i=4
543N/Aend
5441CHECK(i == 4)
545N/A
5461CHECK(#q:archetypes() == 1)
5471CHECK(not table.find(q:archetypes(), world.archetype_index[table.concat({Foo, Bar, Baz}, "_")]))
5481world:delete(Foo)
5491CHECK(#q:archetypes() == 0)
550N/Aend
5511do CASE "multiple iter"
5521local world = jecs.World.new()
5531local A = world:component()
5541local B = world:component()
5551local e = world:entity()
5561world:add(e, A)
5571world:add(e, B)
5581local q = world:query(A, B)
5591local counter = 0
5601for x in q:iter() do
5611counter += 1
562N/Aend
5631for x in q:iter() do
5641counter += 1
565N/Aend
5661CHECK(counter == 2)
567N/Aend
5681do CASE "tag"
5691local world = jecs.World.new()
5701local A = world:entity()
5711local e = world:entity()
5721CHECK_EXPECT_ERR(function()
5731world:set(e, A, "test" :: any)
574N/Aend)
5751local count = 0
5761for id, a in world:query(A) :: any do
5771count += 1
5781CHECK(a == nil)
579N/Aend
5801CHECK(count == 1)
581N/Aend
5821do CASE "pairs"
5831local world = jecs.World.new()
584N/A
5851local C1 = world:component() :: jecs.Id
5861local C2 = world:component() :: jecs.Id
5871local T1 = world:entity()
5881local T2 = world:entity()
589N/A
5901local e = world:entity()
591N/A
5921local C1_C2 = pair(C1, C2)
5931world:set(e, C1_C2, true)
5941world:set(e, pair(C1, T1), true)
5951world:set(e, pair(T1, C1), true)
5961CHECK_EXPECT_ERR(function()
5971world:set(e, pair(T1, T2), true :: any)
598N/Aend)
599N/A
6001for id, a, b, c, d in world:query(pair(C1, C2), pair(C1, T1), pair(T1, C1), pair(T1, T2)):iter() do
6011CHECK(a == true)
6021CHECK(b == true)
6031CHECK(c == true)
6041CHECK(d == nil)
605N/Aend
606N/Aend
6070do
6081CASE("query single component")
6090do
6101local world = jecs.World.new()
6111local A = world:component()
6121local B = world:component()
613N/A
6141local entities = {}
6151for i = 1, N do
616256local id = world:entity()
617N/A
618256world:set(id, A, true)
619256if i > 5 then
620251world:set(id, B, true)
621N/Aend
622256entities[i] = id
623N/Aend
624N/A
6251for id in world:query(A) :: any do
626256table.remove(entities, CHECK(table.find(entities, id)))
627N/Aend
628N/A
6291CHECK(#entities == 0)
630N/Aend
631N/A
6320do
6331local world = jecs.World.new() :: World
6341local A = world:component()
6351local B = world:component()
6361local eA = world:entity()
6371world:set(eA, A, true)
6381local eB = world:entity()
6391world:set(eB, B, true)
6401local eAB = world:entity()
6411world:set(eAB, A, true)
6421world:set(eAB, B, true)
643N/A
644N/A-- Should drain the iterator
6451local q = world:query(A)
646N/A
6471local i = 0
6481local j = 0
6491for _ in q :: any do
6502i += 1
651N/Aend
6521for _ in q :: any do
6530j += 1
654N/Aend
6551CHECK(i == 2)
6561CHECK(j == 0)
657N/Aend
658N/Aend
659N/A
6600do
6611CASE("query missing component")
6621local world = jecs.World.new()
6631local A = world:component()
6641local B = world:component()
6651local C = world:component()
666N/A
6671local e1 = world:entity()
6681local e2 = world:entity()
669N/A
6701world:set(e1, A, "abc")
6711world:set(e2, A, "def")
6721world:set(e1, B, 123)
6731world:set(e2, B, 457)
674N/A
6751local counter = 0
6761for _ in world:query(B, C) :: any do
6770counter += 1
678N/Aend
6791CHECK(counter == 0)
680N/Aend
681N/A
6820do
6831CASE("query more than 8 components")
6841local world = jecs.World.new()
6851local components = {}
686N/A
6871for i = 1, 9 do
6889local id = world:component()
6899components[i] = id
690N/Aend
6911local e = world:entity()
6921for i, id in components do
6939world:set(e, id, 13 ^ i)
694N/Aend
695N/A
6961for entity, a, b, c, d, e, f, g, h, i in world:query(unpack(components)) :: any do
6971CHECK(a == 13 ^ 1)
6981CHECK(b == 13 ^ 2)
6991CHECK(c == 13 ^ 3)
7001CHECK(d == 13 ^ 4)
7011CHECK(e == 13 ^ 5)
7021CHECK(f == 13 ^ 6)
7031CHECK(g == 13 ^ 7)
7041CHECK(h == 13 ^ 8)
7051CHECK(i == 13 ^ 9)
706N/Aend
707N/Aend
708N/A
7090do
7101CASE("should be able to get next results")
7111local world = jecs.World.new() :: World
7121world:component()
7131local A = world:component()
7141local B = world:component()
7151local eA = world:entity()
7161world:set(eA, A, true)
7171local eB = world:entity()
7181world:set(eB, B, true)
7191local eAB = world:entity()
7201world:set(eAB, A, true)
7211world:set(eAB, B, true)
722N/A
7231local it = world:query(A):iter()
724N/A
7251local e: number, data = it()
7261while e do
7272if e == eA :: number then
7281CHECK(data)
7291elseif e == eAB :: number then
7301CHECK(data)
7310else
7320CHECK(false)
733N/Aend
734N/A
7352e, data = it()
736N/Aend
7371CHECK(true)
738N/Aend
739N/A
7401do CASE "should query all matching entities when irrelevant component is removed"
7411local world = jecs.World.new()
7421local A = world:component()
7431local B = world:component()
7441local C = world:component()
745N/A
7461local entities = {}
7471for i = 1, N do
748256local id = world:entity()
749N/A
750N/A-- specifically put them in disorder to track regression
751N/A-- https://github.com/Ukendio/jecs/pull/15
752256world:set(id, B, true)
753256world:set(id, A, true)
754256if i > 5 then
755251world:remove(id, B)
756N/Aend
757256entities[i] = id
758N/Aend
759N/A
7601local added = 0
7611for id in world:query(A) :: any do
762256added += 1
763256table.remove(entities, CHECK(table.find(entities, id)))
764N/Aend
765N/A
7661CHECK(added == N)
767N/Aend
768N/A
7690do
7701CASE("should query all entities without B")
7711local world = jecs.World.new()
7721local A = world:component()
7731local B = world:component()
774N/A
7751local entities = {}
7761for i = 1, N do
777256local id = world:entity()
778N/A
779256world:set(id, A, true)
780256if i < 5 then
7814entities[i] = id
7820else
783252world:set(id, B, true)
784N/Aend
785N/Aend
786N/A
7871for id in world:query(A):without(B) :: any do
7884table.remove(entities, CHECK(table.find(entities, id)))
789N/Aend
790N/A
7911CHECK(#entities == 0)
792N/Aend
793N/A
7940do
7951CASE("should allow querying for relations")
7961local world = jecs.World.new()
7971local Eats = world:component()
7981local Apples = world:component()
7991local bob = world:entity()
800N/A
8011world:set(bob, pair(Eats, Apples), true)
8021for e, bool in world:query(pair(Eats, Apples)) :: any do
8031CHECK(e == bob)
8041CHECK(bool)
805N/Aend
806N/Aend
807N/A
8080do
8091CASE("should allow wildcards in queries")
8101local world = jecs.World.new()
8111local Eats = world:component()
8121local Apples = world:entity()
8131local bob = world:entity()
814N/A
8151world:set(bob, pair(Eats, Apples), "bob eats apples")
816N/A
8171local w = jecs.Wildcard
8181for e, data in world:query(pair(Eats, w)) :: any do
8191CHECK(e == bob)
8201CHECK(data == "bob eats apples")
821N/Aend
8221for e, data in world:query(pair(w, Apples)) :: any do
8231CHECK(e == bob)
8241CHECK(data == "bob eats apples")
825N/Aend
826N/Aend
827N/A
8280do
8291CASE("should match against multiple pairs")
8301local world = jecs.World.new()
8311local Eats = world:component()
8321local Apples = world:entity()
8331local Oranges = world:entity()
8341local bob = world:entity()
8351local alice = world:entity()
836N/A
8371world:set(bob, pair(Eats, Apples), "bob eats apples")
8381world:set(alice, pair(Eats, Oranges), "alice eats oranges")
839N/A
8401local w = jecs.Wildcard
8411local count = 0
8421for e, data in world:query(pair(Eats, w)) :: any do
8432count += 1
8442if e == bob then
8451CHECK(data == "bob eats apples")
8460else
8471CHECK(data == "alice eats oranges")
848N/Aend
849N/Aend
850N/A
8511CHECK(count == 2)
8521count = 0
853N/A
8541for e, data in world:query(pair(w, Apples)) :: any do
8551count += 1
8561CHECK(data == "bob eats apples")
857N/Aend
8581CHECK(count == 1)
859N/Aend
860N/A
8611do CASE "should only relate alive entities"
8621local world = jecs.World.new()
8631local Eats = world:entity()
8641local Apples = world:component()
8651local Oranges = world:component()
8661local bob = world:entity()
8671local alice = world:entity()
868N/A
8691world:set(bob, Apples, "apples")
8701world:set(bob, pair(Eats, Apples), "bob eats apples")
8711world:set(alice, pair(Eats, Oranges) :: Entity, "alice eats oranges")
872N/A
8731world:delete(Apples)
8741local Wildcard = jecs.Wildcard
875N/A
8761local count = 0
8771for _, data in world:query(pair(Wildcard, Apples)) :: any do
8780count += 1
879N/Aend
880N/A
8811world:delete(pair(Eats, Apples))
882N/A
8831CHECK(count == 0)
8841CHECK(world:get(bob, pair(Eats, Apples)) == nil)
885N/A
886N/Aend
887N/A
8880do
8891CASE("should error when setting invalid pair")
8901local world = jecs.World.new()
8911local Eats = world:component()
8921local Apples = world:component()
8931local bob = world:entity()
894N/A
8951world:delete(Apples)
8961CHECK_EXPECT_ERR(function()
8971world:set(bob, pair(Eats, Apples), "bob eats apples")
898N/Aend)
899N/Aend
900N/A
9010do
9021CASE("should find target for ChildOf")
9031local world = jecs.World.new()
9041local ChildOf = jecs.ChildOf
905N/A
9061local Name = world:component()
907N/A
9081local bob = world:entity()
9091local alice = world:entity()
9101local sara = world:entity()
911N/A
9121world:add(bob, pair(ChildOf, alice))
9131world:set(bob, Name, "bob")
9141world:add(sara, pair(ChildOf, alice))
9151world:set(sara, Name, "sara")
9161CHECK(world:parent(bob) :: number == alice :: number) -- O(1)
917N/A
9181local count = 0
9191for _, name in world:query(Name, pair(ChildOf, alice)) :: any do
9202count += 1
921N/Aend
9221CHECK(count == 2)
923N/Aend
924N/A
9250do
9261CASE("despawning while iterating")
9271local world = jecs.World.new()
9281local A = world:component()
9291local B = world:component()
930N/A
9311local e1 = world:entity()
9321local e2 = world:entity()
9331world:add(e1, A)
9341world:add(e2, A)
9351world:add(e2, B)
936N/A
9371local count = 0
9381for id in world:query(A) :: any do
9392world:clear(id)
9402count += 1
941N/Aend
9421CHECK(count == 2)
943N/Aend
944N/A
9451do CASE("iterator invalidation")
9461do CASE("adding")
9471SKIP()
9481local world = jecs.World.new()
9491local A = world:component()
9501local B = world:component()
951N/A
9521local e1 = world:entity()
9531local e2 = world:entity()
9541world:add(e1, A)
9551world:add(e2, A)
9561world:add(e2, B)
957N/A
9581local count = 0
9591for id in world:query(A) :: any do
9603world:add(id, B)
961N/A
9623count += 1
963N/Aend
964N/A
9651CHECK(count == 2)
966N/Aend
967N/A
9681do CASE("spawning")
9691local world = jecs.World.new()
9701local A = world:component()
9711local B = world:component()
972N/A
9731local e1 = world:entity()
9741local e2 = world:entity()
9751world:add(e1, A)
9761world:add(e2, A)
9771world:add(e2, B)
978N/A
9791for id in world:query(A) :: any do
9803local e = world:entity()
9813world:add(e, A)
9823world:add(e, B)
983N/Aend
984N/A
9851CHECK(true)
986N/Aend
987N/Aend
988N/A
9891do CASE("should not find any entities")
9901local world = jecs.World.new()
991N/A
9921local Hello = world:component()
9931local Bob = world:component()
994N/A
9951local helloBob = world:entity()
9961world:add(helloBob, pair(Hello, Bob))
9971world:add(helloBob, Bob)
998N/A
9991local withoutCount = 0
10001for _ in world:query(pair(Hello, Bob)):without(Bob) :: any do
10010withoutCount += 1
1002N/Aend
1003N/A
10041CHECK(withoutCount == 0)
1005N/Aend
1006N/A
10071do CASE("without")
1008N/A-- REGRESSION TEST
10091local world = jecs.World.new()
10101local _1, _2, _3 = world:component(), world:component(), world:component()
1011N/A
10121local counter = 0
10131for e, a, b in world:query(_1, _2):without(_3) :: any do
10140counter += 1
1015N/Aend
10161CHECK(counter == 0)
1017N/Aend
1018N/Aend)
1019N/A
10201TEST("world:each", function()
10211local world = world_new()
10221local A = world:component()
10231local B = world:component()
10241local C = world:component()
1025N/A
10261local e3 = world:entity()
10271local e1 = world:entity()
10281local e2 = world:entity()
1029N/A
10301world:set(e1, A, true)
1031N/A
10321world:set(e2, A, true)
10331world:set(e2, B, true)
1034N/A
10351world:set(e3, A, true)
10361world:set(e3, B, true)
10371world:set(e3, C, true)
1038N/A
10391for entity: number in world:each(A) do
10403if entity == e1 :: number or entity == e2 :: number or entity == e3 :: number then
10413CHECK(true)
10423continue
1043N/Aend
10440CHECK(false)
1045N/Aend
1046N/Aend)
1047N/A
10481TEST("world:children", function()
10491local world = world_new()
10501local C = world:component()
10511local T = world:entity()
1052N/A
10531local e1 = world:entity()
10541world:set(e1, C, true)
1055N/A
10561local e2 = world:entity() :: number
1057N/A
10581world:add(e2, T)
10591world:add(e2, pair(ChildOf, e1))
1060N/A
10611local e3 = world:entity() :: number
10621world:add(e3, pair(ChildOf, e1))
1063N/A
10641local count = 0
10651for entity: number in world:children(e1) do
10662count += 1
10672if entity == e2 or entity == e3 then
10682CHECK(true)
10692continue
1070N/Aend
10710CHECK(false)
1072N/Aend
10731CHECK(count == 2)
1074N/A
10751world:remove(e2, pair(ChildOf, e1))
1076N/A
10771count = 0
10781for entity in world:children(e1) do
10791count += 1
1080N/Aend
1081N/A
10821CHECK(count == 1)
1083N/Aend)
1084N/A
10851TEST("world:clear()", function()
10861do CASE("should remove its components")
10871local world = jecs.World.new() :: World
10881local A = world:component()
10891local B = world:component()
10901local C = world:component()
10911local D = world:component()
1092N/A
10931local e = world:entity()
10941local e1 = world:entity()
10951local e2 = world:entity()
1096N/A
10971world:set(e, A, true)
10981world:set(e, B, true)
1099N/A
11001world:set(e1, A, true)
11011world:set(e1, B, true)
1102N/A
11031CHECK(world:get(e, A))
11041CHECK(world:get(e, B))
1105N/A
11061world:clear(A)
11071CHECK(world:get(e, A) == nil)
11081CHECK(world:get(e, B))
11091CHECK(world:get(e1, A) == nil)
11101CHECK(world:get(e1, B))
1111N/Aend
1112N/A
11131do CASE("remove cleared ID from entities")
11141local world = world_new()
11151local A = world:component()
11161local B = world:component()
11171local C = world:component()
1118N/A
11190do
11201local id1 = world:entity()
11211local id2 = world:entity()
11221local id3 = world:entity()
1123N/A
11241world:set(id1, A, true)
1125N/A
11261world:set(id2, A, true)
11271world:set(id2, B, true)
1128N/A
11291world:set(id3, A, true)
11301world:set(id3, B, true)
11311world:set(id3, C, true)
1132N/A
11331world:clear(A)
1134N/A
11351CHECK(not world:has(id1, A))
11361CHECK(not world:has(id2, A))
11371CHECK(not world:has(id3, A))
1138N/A
11391CHECK(world:has(id2, B))
11401CHECK(world:has(id3, B, C))
1141N/A
11421world:clear(C)
1143N/A
11441CHECK(world:has(id2, B))
11451CHECK(world:has(id3, B))
1146N/A
11471CHECK(world:contains(A))
11481CHECK(world:contains(C))
11491CHECK(world:has(A, jecs.Component))
11501CHECK(world:has(B, jecs.Component))
1151N/Aend
1152N/A
11530do
11541local id1 = world:entity()
11551local id2 = world:entity()
11561local id3 = world:entity()
1157N/A
11581local tgt = world:entity()
1159N/A
11601world:add(id1, pair(A, tgt))
11611world:add(id1, pair(B, tgt))
11621world:add(id1, pair(C, tgt))
1163N/A
11641world:add(id2, pair(A, tgt))
11651world:add(id2, pair(B, tgt))
11661world:add(id2, pair(C, tgt))
1167N/A
11681world:add(id3, pair(A, tgt))
11691world:add(id3, pair(B, tgt))
11701world:add(id3, pair(C, tgt))
1171N/A
11721world:clear(B)
11731CHECK(world:has(id1, pair(A, tgt), pair(C, tgt)))
11741CHECK(not world:has(id1, pair(B, tgt)))
11751CHECK(world:has(id2, pair(A, tgt), pair(C, tgt)))
11761CHECK(not world:has(id1, pair(B, tgt)))
11771CHECK(world:has(id3, pair(A, tgt), pair(C, tgt)))
1178N/A
1179N/Aend
1180N/A
1181N/Aend
1182N/Aend)
1183N/A
11841TEST("world:has()", function()
11851do CASE("should find Tag on entity")
11861local world = jecs.World.new()
1187N/A
11881local Tag = world:entity()
1189N/A
11901local e = world:entity()
11911world:add(e, Tag)
1192N/A
11931CHECK(world:has(e, Tag))
1194N/Aend
1195N/A
11961do CASE("should return false when missing one tag")
11971local world = jecs.World.new()
1198N/A
11991local A = world:entity()
12001local B = world:entity()
12011local C = world:entity()
12021local D = world:entity()
1203N/A
12041local e = world:entity()
12051world:add(e, A)
12061world:add(e, C)
12071world:add(e, D)
1208N/A
12091CHECK(world:has(e, A, B, C, D) == false)
1210N/Aend
1211N/Aend)
1212N/A
12131TEST("world:component()", function()
12141do CASE("only components should have EcsComponent trait")
12151local world = jecs.World.new() :: World
12161local A = world:component()
12171local e = world:entity()
1218N/A
12191CHECK(world:has(A, jecs.Component))
12201CHECK(not world:has(e, jecs.Component))
1221N/Aend
1222N/A
12231do CASE("tag")
12241local world = jecs.World.new() :: World
12251local A = world:component()
12261local B = world:entity()
12271local C = world:entity()
12281local e = world:entity()
12291world:set(e, A, "test")
12301world:add(e, B)
12311CHECK_EXPECT_ERR(function()
12321world:set(e, C, 11 :: any)
1233N/Aend)
1234N/A
12351CHECK(world:has(e, A))
12361CHECK(world:get(e, A) == "test")
12371CHECK(world:get(e, B) == nil)
12381CHECK(world:get(e, C) == nil)
1239N/Aend
1240N/Aend)
1241N/A
12421TEST("world:delete", function()
12431do CASE "invoke OnRemove hooks"
12441local world = world_new()
1245N/A
12461local e1 = world:entity()
12471local e2 = world:entity()
1248N/A
12491local Stable = world:component()
12501world:set(Stable, jecs.OnRemove, function(e)
12511CHECK(e == e1)
1252N/Aend)
1253N/A
12541world:set(e1, Stable, true)
12551world:set(e2, Stable, true)
1256N/A
12571world:delete(e1)
1258N/Aend
12591do CASE "delete recycled entity id used as component"
12601local world = world_new()
12611local id = world:entity()
12621world:add(id, jecs.Component)
1263N/A
12641local e = world:entity()
12651world:set(e, id, 1)
12661CHECK(world:get(e, id) == 1)
12671world:delete(id)
12681local recycled = world:entity()
12691world:add(recycled, jecs.Component)
12701world:set(e, recycled, 1)
12711CHECK(world:has(recycled, jecs.Component))
12721CHECK(world:get(e, recycled) == 1)
1273N/Aend
12740do
12751CASE("bug: Empty entity does not respect cleanup policy")
12761local world = world_new()
12771local parent = world:entity()
12781local tag = world:entity()
1279N/A
12801local child = world:entity()
12811world:add(child, jecs.pair(jecs.ChildOf, parent))
12821world:delete(parent)
1283N/A
12841CHECK(not world:contains(parent))
12851CHECK(not world:contains(child))
1286N/A
12871local entity = world:entity()
12881world:add(entity, tag)
12891world:delete(tag)
12901CHECK(world:contains(entity))
12911CHECK(not world:contains(tag))
12921CHECK(not world:has(entity, tag)) -- => true
1293N/Aend
12941do CASE("should allow deleting components")
12951local world = jecs.World.new()
1296N/A
12971local Health = world:component()
12981local Poison = world:component()
1299N/A
13001local id = world:entity()
13011world:set(id, Poison, 5)
13021world:set(id, Health, 50)
13031local id1 = world:entity()
13041world:set(id1, Poison, 500)
13051world:set(id1, Health, 50)
1306N/A
13071world:delete(id)
13081CHECK(not world:contains(id))
13091CHECK(world:get(id, Poison) == nil)
13101CHECK(world:get(id, Health) == nil)
1311N/A
13121CHECK(world:get(id1, Poison) == 500)
13131CHECK(world:get(id1, Health) == 50)
1314N/Aend
1315N/A
13161do CASE("delete entities using another Entity as component with Delete cleanup action")
13171local world = jecs.World.new()
1318N/A
13191local Health = world:entity()
13201world:add(Health, pair(jecs.OnDelete, jecs.Delete))
13211local Poison = world:component()
1322N/A
13231local id = world:entity()
13241world:set(id, Poison, 5)
13251CHECK_EXPECT_ERR(function()
13261world:set(id, Health, 50 :: any)
1327N/Aend)
13281local id1 = world:entity()
13291world:set(id1, Poison, 500)
13301CHECK_EXPECT_ERR(function()
13311world:set(id1, Health, 50 :: any)
1332N/Aend)
1333N/A
13341CHECK(world:has(id, Poison, Health))
13351CHECK(world:has(id1, Poison, Health))
13361world:delete(Poison)
1337N/A
13381CHECK(world:contains(id))
13391CHECK(not world:has(id, Poison))
13401CHECK(not world:has(id1, Poison))
1341N/A
13421world:delete(Health)
13431CHECK(not world:contains(id))
13441CHECK(not world:contains(id1))
13451CHECK(not world:has(id, Health))
13461CHECK(not world:has(id1, Health))
1347N/Aend
1348N/A
1349N/A
13501do CASE("delete children")
13511local world = jecs.World.new()
1352N/A
13531local Health = world:component()
13541local Poison = world:component()
13551local FriendsWith = world:component()
1356N/A
13571local e = world:entity()
13581world:set(e, Poison, 5)
13591world:set(e, Health, 50)
1360N/A
13611local children = {}
13621for i = 1, 10 do
136310local child = world:entity()
136410world:set(child, Poison, 9999)
136510world:set(child, Health, 100)
136610world:add(child, pair(jecs.ChildOf, e))
136710table.insert(children, child)
1368N/Aend
1369N/A
13701BENCH("delete children of entity", function()
13711world:delete(e)
1372N/Aend)
1373N/A
13741for i, child in children do
137510CHECK(not world:contains(child))
137610CHECK(not world:has(child, pair(jecs.ChildOf, e)))
137710CHECK(not world:has(child, Health))
1378N/Aend
1379N/A
13801e = world:entity()
1381N/A
13821local friends = {}
13831for i = 1, 10 do
138410local friend = world:entity()
138510world:set(friend, Poison, 9999)
138610world:set(friend, Health, 100)
138710world:add(friend, pair(FriendsWith, e))
138810table.insert(friends, friend)
1389N/Aend
1390N/A
13911BENCH("remove friends of entity", function()
13921world:delete(e)
1393N/Aend)
1394N/A
13951local d = debug_world_inspect(world)
13961for i, friend in friends do
139710CHECK(not world:has(friend, pair(FriendsWith, e)))
139810CHECK(world:has(friend, Health))
139910CHECK(world:contains(friend))
1400N/Aend
1401N/Aend
1402N/A
14031do CASE("remove deleted ID from entities")
14041local world = world_new()
14050do
14061local A = world:component()
14071local B = world:component()
14081local C = world:component()
14091local id1 = world:entity()
14101local id2 = world:entity()
14111local id3 = world:entity()
1412N/A
14131world:set(id1, A, true)
1414N/A
14151world:set(id2, A, true)
14161world:set(id2, B, true)
1417N/A
14181world:set(id3, A, true)
14191world:set(id3, B, true)
14201world:set(id3, C, true)
1421N/A
14221world:delete(A)
1423N/A
14241CHECK(not world:has(id1, A))
14251CHECK(not world:has(id2, A))
14261CHECK(not world:has(id3, A))
1427N/A
14281CHECK(world:has(id2, B))
14291CHECK(world:has(id3, B, C))
1430N/A
14311world:delete(C)
1432N/A
14331CHECK(world:has(id2, B))
14341CHECK(world:has(id3, B))
1435N/A
14361CHECK(not world:contains(A))
14371CHECK(not world:contains(C))
1438N/Aend
1439N/A
14400do
14411local A = world:component()
14421world:add(A, pair(jecs.OnDeleteTarget, jecs.Delete))
14431local B = world:component()
14441local C = world:component()
14451world:add(C, pair(jecs.OnDeleteTarget, jecs.Delete))
1446N/A
14471local id1 = world:entity()
14481local id2 = world:entity()
14491local id3 = world:entity()
1450N/A
14511world:set(id1, C, true)
1452N/A
14531world:set(id2, pair(A, id1), true)
14541world:set(id2, B, true)
1455N/A
14561world:set(id3, B, true)
14571world:set(id3, pair(C, id2), true)
1458N/A
14591world:delete(id1)
1460N/A
14611CHECK(not world:contains(id1))
14621CHECK(not world:contains(id2))
14631CHECK(not world:contains(id3))
1464N/Aend
1465N/A
1466N/A
14670do
14681local A = world:component()
14691local B = world:component()
14701local C = world:component()
14711local id1 = world:entity()
14721local id2 = world:entity()
14731local id3 = world:entity()
1474N/A
1475N/A
14761world:set(id2, A, true)
14771world:set(id2, pair(B, id1), true)
1478N/A
14791world:set(id3, A, true)
14801world:set(id3, pair(B, id1), true)
14811world:set(id3, C, true)
1482N/A
14831world:delete(id1)
1484N/A
14851CHECK(not world:contains(id1))
14861CHECK(world:contains(id2))
14871CHECK(world:contains(id3))
1488N/A
14891CHECK(world:has(id2, A))
14901CHECK(world:has(id3, A, C))
1491N/A
14921CHECK(not world:target(id2, B))
14931CHECK(not world:target(id3, B))
1494N/Aend
1495N/Aend
1496N/A
14970do
14981CASE("fast delete")
14991local world = jecs.World.new()
1500N/A
15011local entities = {}
15021local Health = world:component()
15031local Poison = world:component()
1504N/A
15051for i = 1, 100 do
1506100local child = world:entity()
1507100world:set(child, Poison, 9999)
1508100world:set(child, Health, 100)
1509100table.insert(entities, child)
1510N/Aend
1511N/A
15121BENCH("simple deletion of entity", function()
15131for i = 1, START(100) do
1514100local e = entities[i]
1515100world:delete(e)
1516N/Aend
1517N/Aend)
1518N/A
15191for _, entity in entities do
1520100CHECK(not world:contains(entity))
1521N/Aend
1522N/Aend
1523N/A
15240do
15251CASE("cycle")
15261local world = jecs.World.new()
15271local Likes = world:component()
15281world:add(Likes, pair(jecs.OnDeleteTarget, jecs.Delete))
15291local bob = world:entity()
15301local alice = world:entity()
1531N/A
15321world:add(bob, pair(Likes, alice))
15331world:add(alice, pair(Likes, bob))
1534N/A
15351world:delete(bob)
15361CHECK(not world:contains(bob))
15371CHECK(not world:contains(alice))
1538N/Aend
1539N/Aend)
1540N/A
15411TEST("world:target", function()
15421do CASE("nth index")
15431local world = world_new()
15441local A = world:component()
15451world:set(A, jecs.Name, "A")
15461local B = world:component()
15471world:set(B, jecs.Name, "B")
15481local C = world:component()
15491world:set(C, jecs.Name, "C")
15501local D = world:component()
15511world:set(D, jecs.Name, "D")
15521local E = world:component()
15531world:set(E, jecs.Name, "E")
15541local e = world:entity()
1555N/A
15561world:add(e, pair(A, B))
15571world:add(e, pair(A, C))
15581world:add(e, pair(A, D))
15591world:add(e, pair(A, E))
15601world:add(e, pair(B, C))
15611world:add(e, pair(B, D))
15621world:add(e, pair(C, D))
1563N/A
15641CHECK(pair(A, B) < pair(A, C))
15651CHECK(pair(A, C) < pair(A, D))
15661CHECK(pair(C, A) < pair(C, D))
1567N/A
15681local records = debug_world_inspect(world).records(e)
15691CHECK(jecs.pair_first(world, pair(B, C)) == B)
15701local r = jecs.entity_index_try_get(world.entity_index, e)
15711local archetype = r.archetype
15721local counts = archetype.counts
15731CHECK(counts[pair(A, __)] == 4)
15741CHECK(records[pair(B, C)] > records[pair(A, E)])
15751CHECK(world:target(e, A, 0) == B)
15761CHECK(world:target(e, A, 1) == C)
15771CHECK(world:target(e, A, 2) == D)
15781CHECK(world:target(e, A, 3) == E)
15791CHECK(world:target(e, B, 0) == C)
15801CHECK(world:target(e, B, 1) == D)
15811CHECK(world:target(e, C, 0) == D)
15821CHECK(world:target(e, C, 1) == nil)
1583N/A
15841CHECK(archetype.records[pair(A, B)] == 1)
15851CHECK(archetype.records[pair(A, C)] == 2)
15861CHECK(archetype.records[pair(A, D)] == 3)
15871CHECK(archetype.records[pair(A, E)] == 4)
1588N/A
15891CHECK(world:target(e, C, 0) == D)
15901CHECK(world:target(e, C, 1) == nil)
1591N/Aend
1592N/A
15930do
15941CASE("infer index when unspecified")
15951local world = world_new()
15961local A = world:component()
15971local B = world:component()
15981local C = world:component()
15991local D = world:component()
16001local e = world:entity()
1601N/A
16021world:add(e, pair(A, B))
16031world:add(e, pair(A, C))
16041world:add(e, pair(B, C))
16051world:add(e, pair(B, D))
16061world:add(e, pair(C, D))
1607N/A
16081CHECK(world:target(e, A) == world:target(e, A, 0))
16091CHECK(world:target(e, B) == world:target(e, B, 0))
16101CHECK(world:target(e, C) == world:target(e, C, 0))
1611N/Aend
1612N/A
16130do
16141CASE("loop until no target")
16151local world = world_new()
1616N/A
16171local ROOT = world:entity()
16181local e1 = world:entity()
16191local targets = {}
1620N/A
16211for i = 1, 10 do
162210local target = world:entity()
162310targets[i] = target
162410world:add(e1, pair(ROOT, target))
1625N/Aend
1626N/A
16271local i = 0
16281local target = world:target(e1, ROOT, 0)
16291while target do
163010i += 1
163110CHECK(targets[i] == target)
163210target = world:target(e1, ROOT, i)
1633N/Aend
1634N/A
16351CHECK(i == 10)
1636N/Aend
1637N/Aend)
1638N/A
16391TEST("world:contains", function()
16401local world = jecs.World.new()
16411local id = world:entity()
16421CHECK(world:contains(id))
1643N/A
16440do
16451CASE("should not exist after delete")
16461world:delete(id)
16471CHECK(not world:contains(id))
1648N/Aend
1649N/Aend)
1650N/A
16511TEST("Hooks", function()
16521do CASE "OnAdd"
16531local world = jecs.World.new()
16541local Transform = world:component()
16551local e1 = world:entity()
16561world:set(Transform, jecs.OnAdd, function(entity)
16571CHECK(e1 == entity)
1658N/Aend)
16591world:add(e1, Transform)
1660N/Aend
1661N/A
16621do CASE "OnSet"
16631local world = jecs.World.new()
16641local Number = world:component()
16651local e1 = world:entity()
1666N/A
16671world:set(Number, jecs.OnSet, function(entity, data)
16681CHECK(e1 == entity)
16691CHECK(data == world:get(entity, Number))
16701CHECK(data == 1)
1671N/Aend)
16721world:set(e1, Number, 1)
1673N/Aend
1674N/A
16751do CASE("OnRemove")
16760do
1677N/A-- basic
16781local world = jecs.World.new()
16791local A = world:component() :: Entity
16801local e1 = world:entity()
16811world:set(A, jecs.OnRemove, function(entity)
16821CHECK(e1 == entity)
16831CHECK(world:has(e1, A))
1684N/Aend)
16851world:add(e1, A)
1686N/A
16871world:remove(e1, A)
16881CHECK(not world:has(e1, A))
1689N/Aend
16900do
1691N/A-- [BUG] https://github.com/Ukendio/jecs/issues/118
16921local world = world_new()
16931local A = world:component()
16941local B = world:component()
16951local e = world:entity()
1696N/A
16971world:set(A, jecs.OnRemove, function(entity)
16981world:set(entity, B, true)
16991CHECK(world:get(entity, A))
17001CHECK(world:get(entity, B))
1701N/Aend)
1702N/A
17031world:set(e, A, true)
17041world:remove(e, A)
17051CHECK(not world:get(e, A))
17061CHECK(world:get(e, B))
1707N/Aend
1708N/Aend
1709N/Aend)
1710N/A
17111TEST("change tracking", function()
17121do CASE "#1"
17131local world = world_new()
17141local Foo = world:component() :: Entity
17151local Previous = jecs.Rest
1716N/A
17171local q1 = world
17181:query(Foo)
17191:without(pair(Previous, Foo))
17200:cached()
1721N/A
17221local e1 = world:entity()
17231world:set(e1, Foo, 1)
17241local e2 = world:entity()
17251world:set(e2, Foo, 2)
1726N/A
17271local i = 0
17281for e, new in q1 :: any do
17292i += 1
17302world:set(e, pair(Previous, Foo), new)
1731N/Aend
1732N/A
17331CHECK(i == 2)
17341local j = 0
17351for e, new in q1 :: any do
17360j += 1
17370world:set(e, pair(Previous, Foo), new)
1738N/Aend
1739N/A
17401CHECK(j == 0)
1741N/Aend
1742N/A
17431do CASE "#2"
17441local world = world_new()
17451local component = world:component() :: Entity
17461local tag = world:entity()
17471local previous = jecs.Rest
1748N/A
17491local q1 = world:query(component):without(pair(previous, component), tag):cached()
1750N/A
17511local testEntity = world:entity()
1752N/A
17531world:set(testEntity, component, 10)
1754N/A
17551local i = 0
17561for entity, number in q1 :: any do
17571i += 1
17581world:add(testEntity, tag)
1759N/Aend
1760N/A
17611CHECK(i == 1)
1762N/A
17631for e, n in q1 :: any do
17640world:set(e, pair(previous, component), n)
1765N/Aend
1766N/Aend
1767N/A
1768N/Aend)
1769N/A
17701TEST("repro", function()
17711do CASE "#1"
17721local world = world_new()
17731local reproEntity = world:component()
17741local components = { Cooldown = world:component() :: jecs.Entity }
17751world:set(reproEntity, components.Cooldown, 2)
1776N/A
17771local function updateCooldowns(dt: number)
17782local toRemove = {}
1779N/A
17802local it = world:query(components.Cooldown):iter()
17812for id, cooldown in it do
17822cooldown -= dt
1783N/A
17842if cooldown <= 0 then
17851table.insert(toRemove, id)
1786N/A-- world:remove(id, components.Cooldown)
17870else
17881world:set(id, components.Cooldown, cooldown)
1789N/Aend
1790N/Aend
1791N/A
17922for _, id in toRemove do
17931world:remove(id, components.Cooldown)
17941CHECK(not world:get(id, components.Cooldown))
1795N/Aend
1796N/Aend
1797N/A
17981updateCooldowns(1.5)
17991updateCooldowns(1.5)
1800N/Aend
1801N/A
18021do CASE "#2" -- ISSUE #171
18031local world = world_new()
18041local component1 = world:component()
18051local tag1 = world:entity()
1806N/A
18071local query = world:query(component1):with(tag1):cached()
1808N/A
18091local entity = world:entity()
18101world:set(entity, component1, "some data")
1811N/A
18121local counter = 0
18131for x in query:iter() do
18140counter += 1
1815N/Aend
18161CHECK(counter == 0)
1817N/Aend
1818N/Aend)
1819N/A
18201TEST("wildcard query", function()
18211do CASE "#1"
18221local world = world_new()
18231local pair = jecs.pair
1824N/A
18251local Relation = world:entity()
18261local Wildcard = jecs.Wildcard
18271local A = world:entity()
1828N/A
18291local relationship = pair(Relation, Wildcard)
18301local query = world:query(relationship):cached()
1831N/A
18321local entity = world:entity()
1833N/A
18341local p = pair(Relation, A)
18351CHECK(jecs.pair_first(world, p) == Relation)
18361CHECK(jecs.pair_second(world, p) == A)
18371local w = dwi(world)
18381world:add(entity, pair(Relation, A))
1839N/A
18401local counter = 0
18411for e in query:iter() do
18421counter += 1
1843N/Aend
18441CHECK(counter == 1)
1845N/Aend
18461do CASE "#2"
18471local world = world_new()
18481local pair = jecs.pair
1849N/A
18501local Relation = world:entity()
18511local Wildcard = jecs.Wildcard
18521local A = world:entity()
1853N/A
18541local relationship = pair(Relation, Wildcard)
1855N/A
18561local entity = world:entity()
1857N/A
18581world:add(entity, pair(Relation, A))
1859N/A
18601local counter = 0
18611for e in world:query(relationship):iter() do
18621counter += 1
1863N/Aend
18641CHECK(counter == 1)
1865N/Aend
18661do CASE "#3"
18671local world = world_new()
18681local pair = jecs.pair
1869N/A
18701local Relation = world:entity()
18711local Wildcard = jecs.Wildcard
18721local A = world:entity()
1873N/A
18741local entity = world:entity()
1875N/A
18761world:add(entity, pair(Relation, A))
1877N/A
18781local relationship = pair(Relation, Wildcard)
18791local query = world:query(relationship):cached()
1880N/A
18811local counter = 0
18821for e in query:iter() do
18831counter += 1
1884N/Aend
18851CHECK(counter == 1)
1886N/Aend
1887N/Aend)
1888N/A
18891TEST("world:delete() invokes OnRemove hook", function()
18901do CASE "#1"
18911local world = world_new()
1892N/A
18931local A = world:entity()
18941local entity = world:entity()
1895N/A
18961local called = false
18971world:set(A, jecs.OnRemove, function(e)
18981called = true
1899N/Aend)
1900N/A
19011world:add(entity, A)
19021world:delete(entity)
1903N/A
19041CHECK(called)
1905N/Aend
19061do CASE "#2"
19071local world = world_new()
19081local pair = jecs.pair
1909N/A
19101local Relation = world:entity()
19111local A = world:entity()
19121local B = world:entity()
1913N/A
19141world:add(Relation, pair(jecs.OnDelete, jecs.Delete))
1915N/A
19161local entity = world:entity()
1917N/A
19181local called = false
19191world:set(A, jecs.OnRemove, function(e)
19201called = true
1921N/Aend)
1922N/A
19231world:add(entity, A)
19241world:add(entity, pair(Relation, B))
1925N/A
19261world:delete(B)
1927N/A
19281CHECK(called)
1929N/Aend
19301do CASE "#3"
19311local world = world_new()
19321local pair = jecs.pair
1933N/A
19341local viewingContainer = world:entity()
19351local character = world:entity()
19361local container = world:entity()
1937N/A
19381local called = false
19391world:set(viewingContainer, jecs.OnRemove, function(e)
19401called = true
1941N/Aend)
1942N/A
19431world:add(character, pair(viewingContainer, container))
1944N/A
19451world:delete(container)
1946N/A
19471CHECK(called)
1948N/Aend
1949N/Aend)
19501FINISH()
\ No newline at end of file diff --git a/coverage/updown.png b/coverage/updown.png deleted file mode 100644 index aa56a23..0000000 Binary files a/coverage/updown.png and /dev/null differ diff --git a/test/tests.luau b/test/tests.luau index 6e0ab22..9fe76af 100644 --- a/test/tests.luau +++ b/test/tests.luau @@ -1109,6 +1109,76 @@ TEST("world:clear()", function() CHECK(world:get(e1, A) == nil) CHECK(world:get(e1, B)) end + + do CASE("remove cleared ID from entities") + local world = world_new() + local A = world:component() + local B = world:component() + local C = world:component() + + do + local id1 = world:entity() + local id2 = world:entity() + local id3 = world:entity() + + world:set(id1, A, true) + + world:set(id2, A, true) + world:set(id2, B, true) + + world:set(id3, A, true) + world:set(id3, B, true) + world:set(id3, C, true) + + world:clear(A) + + CHECK(not world:has(id1, A)) + CHECK(not world:has(id2, A)) + CHECK(not world:has(id3, A)) + + CHECK(world:has(id2, B)) + CHECK(world:has(id3, B, C)) + + world:clear(C) + + CHECK(world:has(id2, B)) + CHECK(world:has(id3, B)) + + CHECK(world:contains(A)) + CHECK(world:contains(C)) + CHECK(world:has(A, jecs.Component)) + CHECK(world:has(B, jecs.Component)) + end + + do + local id1 = world:entity() + local id2 = world:entity() + local id3 = world:entity() + + local tgt = world:entity() + + world:add(id1, pair(A, tgt)) + world:add(id1, pair(B, tgt)) + world:add(id1, pair(C, tgt)) + + world:add(id2, pair(A, tgt)) + world:add(id2, pair(B, tgt)) + world:add(id2, pair(C, tgt)) + + world:add(id3, pair(A, tgt)) + world:add(id3, pair(B, tgt)) + world:add(id3, pair(C, tgt)) + + world:clear(B) + CHECK(world:has(id1, pair(A, tgt), pair(C, tgt))) + CHECK(not world:has(id1, pair(B, tgt))) + CHECK(world:has(id2, pair(A, tgt), pair(C, tgt))) + CHECK(not world:has(id1, pair(B, tgt))) + CHECK(world:has(id3, pair(A, tgt), pair(C, tgt))) + + end + + end end) TEST("world:has()", function() @@ -1221,8 +1291,7 @@ TEST("world:delete", function() CHECK(not world:contains(tag)) CHECK(not world:has(entity, tag)) -- => true end - do - CASE("should allow deleting components") + do CASE("should allow deleting components") local world = jecs.World.new() local Health = world:component() @@ -1244,8 +1313,7 @@ TEST("world:delete", function() CHECK(world:get(id1, Health) == 50) end - do - CASE("delete entities using another Entity as component with Delete cleanup action") + do CASE("delete entities using another Entity as component with Delete cleanup action") local world = jecs.World.new() local Health = world:entity() @@ -1278,8 +1346,8 @@ TEST("world:delete", function() CHECK(not world:has(id1, Health)) end - do - CASE("delete children") + + do CASE("delete children") local world = jecs.World.new() local Health = world:component() @@ -1332,6 +1400,100 @@ TEST("world:delete", function() end end + do CASE("remove deleted ID from entities") + local world = world_new() + do + local A = world:component() + local B = world:component() + local C = world:component() + local id1 = world:entity() + local id2 = world:entity() + local id3 = world:entity() + + world:set(id1, A, true) + + world:set(id2, A, true) + world:set(id2, B, true) + + world:set(id3, A, true) + world:set(id3, B, true) + world:set(id3, C, true) + + world:delete(A) + + CHECK(not world:has(id1, A)) + CHECK(not world:has(id2, A)) + CHECK(not world:has(id3, A)) + + CHECK(world:has(id2, B)) + CHECK(world:has(id3, B, C)) + + world:delete(C) + + CHECK(world:has(id2, B)) + CHECK(world:has(id3, B)) + + CHECK(not world:contains(A)) + CHECK(not world:contains(C)) + end + + do + local A = world:component() + world:add(A, pair(jecs.OnDeleteTarget, jecs.Delete)) + local B = world:component() + local C = world:component() + world:add(C, pair(jecs.OnDeleteTarget, jecs.Delete)) + + local id1 = world:entity() + local id2 = world:entity() + local id3 = world:entity() + + world:set(id1, C, true) + + world:set(id2, pair(A, id1), true) + world:set(id2, B, true) + + world:set(id3, B, true) + world:set(id3, pair(C, id2), true) + + world:delete(id1) + + CHECK(not world:contains(id1)) + CHECK(not world:contains(id2)) + CHECK(not world:contains(id3)) + end + + + do + local A = world:component() + local B = world:component() + local C = world:component() + local id1 = world:entity() + local id2 = world:entity() + local id3 = world:entity() + + + world:set(id2, A, true) + world:set(id2, pair(B, id1), true) + + world:set(id3, A, true) + world:set(id3, pair(B, id1), true) + world:set(id3, C, true) + + world:delete(id1) + + CHECK(not world:contains(id1)) + CHECK(world:contains(id2)) + CHECK(world:contains(id3)) + + CHECK(world:has(id2, A)) + CHECK(world:has(id3, A, C)) + + CHECK(not world:target(id2, B)) + CHECK(not world:target(id3, B)) + end + end + do CASE("fast delete") local world = jecs.World.new() diff --git a/tools/read_lcov.py b/tools/read_lcov.py new file mode 100644 index 0000000..25121d8 --- /dev/null +++ b/tools/read_lcov.py @@ -0,0 +1,148 @@ +import os + +LCOV_FILE = "coverage.out" +OUTPUT_DIR = "coverage" + +os.makedirs(OUTPUT_DIR, exist_ok=True) + +def parse_lcov(content): + """Parses LCOV data from a single string.""" + files = {} + current_file = None + + for line in content.splitlines(): + if line.startswith("SF:"): + current_file = line[3:].strip() + files[current_file] = {"coverage": {}, "functions": []} + elif line.startswith("DA:") and current_file: + parts = line[3:].split(",") + line_num = int(parts[0]) + execution_count = int(parts[1]) + files[current_file]["coverage"][line_num] = execution_count + elif line.startswith("FN:") and current_file: + parts = line[3:].split(",") + line_num = int(parts[0]) + function_name = parts[1].strip() + files[current_file]["functions"].append({"name": function_name, "line": line_num, "hits": 0}) + elif line.startswith("FNDA:") and current_file: + parts = line[5:].split(",") + hit_count = int(parts[0]) + function_name = parts[1].strip() + for func in files[current_file]["functions"]: + if func["name"] == function_name: + func["hits"] = hit_count + break + + return files + +def read_source_file(filepath): + """Reads source file content if available.""" + if not os.path.exists(filepath): + return [] + + with open(filepath, "r", encoding="utf-8") as f: + return f.readlines() + +def generate_file_html(filepath, coverage_data, functions_data): + """Generates an HTML file for a specific source file.""" + filename = os.path.basename(filepath) + source_code = read_source_file(filepath) + html_path = os.path.join(OUTPUT_DIR, f"{filename}.html") + + total_hits = sum(func["hits"] for func in functions_data) + max_hits = max((func["hits"] for func in functions_data), default=0) + + total_functions = len(functions_data) + covered_functions = sum(1 for func in functions_data if func["hits"] > 0) + function_coverage_percent = (covered_functions / total_functions * 100) if total_functions > 0 else 0 + + lines = [ + "", + '', + '', + "", + f'

{filename} Coverage

', + f'

Total Execution Hits: {total_hits}

', + f'

Function Coverage Overview: {function_coverage_percent:.2f}%

', + + '', + + '
', + '

Function Coverage:

' + ] + + longest_name = max((len(func["name"]) for func in functions_data), default=0) + + for func in functions_data: + hit_color = "red" if func["hits"] == 0 else "green" + lines.append( + f'' + f'' + ) + + lines.append('
FunctionHits
{func["name"]}{func["hits"]}
') # Close collapsible div + + lines.append('

Source Code:

') + + for i, line in enumerate(source_code, start=1): + stripped_line = line.strip() + class_name = "text-muted" + if not stripped_line or stripped_line.startswith("end") or stripped_line.startswith("--"): + count_display = "N/A" + lines.append(f'>') + else: + count = coverage_data.get(i, 0) + class_name = "zero-hits" if count == 0 else "low-hits" if count < max_hits * 0.3 else "high-hits" + count_display = f'{count}' + marked_text = f'{line.strip()}' + lines.append(f'') + + lines.append("
LineHitsCode
{i}{count_display}{line.strip()}
{i}{count_display}{marked_text}
") + + with open(html_path, "w", encoding="utf-8") as f: + f.write("\n".join(lines)) + +def generate_index(files): + """Generates an index.html summarizing the coverage.""" + index_html = [ + "", + '', + "", + '

Coverage Report

', + '' + ] + + for filepath, data in files.items(): + filename = os.path.basename(filepath) + total_hits = sum(func["hits"] for func in data["functions"]) + total_functions = len(data["functions"]) + + index_html.append(f'') + + index_html.append("
FileTotal HitsFunctions
{filename}{total_hits}{total_functions}
") + + with open(os.path.join(OUTPUT_DIR, "index.html"), "w", encoding="utf-8") as f: + f.write("\n".join(index_html)) + +with open(LCOV_FILE, "r", encoding="utf-8") as f: + lcov_content = f.read() + +files_data = parse_lcov(lcov_content) + +for file_path, data in files_data.items(): + generate_file_html(file_path, data["coverage"], data["functions"]) + +generate_index(files_data) + +print(f"Coverage report generated in {OUTPUT_DIR}/index.html")