roblox-opencode 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +112 -122
- package/commands/setup-game.md +108 -108
- package/commands/sync-check.md +53 -53
- package/core/roblox-core.md +93 -93
- package/dist/server.js +189 -167
- package/package.json +35 -35
- package/skills/roblox-analytics/SKILL.md +277 -277
- package/skills/roblox-analytics/references/event-batcher.luau +75 -75
- package/skills/roblox-animation-vfx/SKILL.md +1325 -1325
- package/skills/roblox-architecture/SKILL.md +877 -863
- package/skills/roblox-architecture/references/combat-systems.md +1381 -1381
- package/skills/roblox-code-review/SKILL.md +686 -686
- package/skills/roblox-data/SKILL.md +889 -889
- package/skills/roblox-data/references/inventory-systems.md +1729 -1729
- package/skills/roblox-debug/SKILL.md +98 -98
- package/skills/roblox-gui/SKILL.md +1103 -1103
- package/skills/roblox-gui-fusion/SKILL.md +150 -150
- package/skills/roblox-gui-fusion/references/inventory.luau +427 -427
- package/skills/roblox-gui-fusion/references/settings-menu.luau +579 -579
- package/skills/roblox-gui-fusion/references/shop.luau +411 -411
- package/skills/roblox-luau-mastery/SKILL.md +1618 -1519
- package/skills/roblox-monetization/SKILL.md +1084 -1084
- package/skills/roblox-monetization/references/process-receipt.luau +131 -131
- package/skills/roblox-networking/SKILL.md +669 -669
- package/skills/roblox-networking/references/remote-validator.luau +193 -193
- package/skills/roblox-publish-checklist/SKILL.md +127 -127
- package/skills/roblox-runtime/SKILL.md +753 -753
- package/skills/roblox-sharp-edges/SKILL.md +294 -294
- package/skills/roblox-sync/SKILL.md +126 -126
- package/skills/roblox-testing/SKILL.md +943 -943
- package/skills/roblox-tooling/SKILL.md +149 -149
- package/vendor/LICENSES/ProfileStore-LICENSE +201 -201
- package/vendor/LICENSES/RbxUtil-LICENSE +7 -7
- package/vendor/LICENSES/promise-LICENSE +20 -20
- package/vendor/LICENSES/t-LICENSE +21 -21
- package/vendor/LICENSES/testez-LICENSE +200 -200
- package/vendor/README.md +83 -83
- package/vendor/fusion/Animation/ExternalTime.luau +83 -83
- package/vendor/fusion/Animation/Spring.luau +321 -321
- package/vendor/fusion/Animation/Stopwatch.luau +127 -127
- package/vendor/fusion/Animation/Tween.luau +187 -187
- package/vendor/fusion/Animation/getTweenDuration.luau +27 -27
- package/vendor/fusion/Animation/getTweenRatio.luau +47 -47
- package/vendor/fusion/Animation/lerpType.luau +163 -163
- package/vendor/fusion/Animation/packType.luau +99 -99
- package/vendor/fusion/Animation/springCoefficients.luau +80 -80
- package/vendor/fusion/Animation/unpackType.luau +102 -102
- package/vendor/fusion/Colour/Oklab.luau +70 -70
- package/vendor/fusion/Colour/sRGB.luau +54 -54
- package/vendor/fusion/External.luau +167 -167
- package/vendor/fusion/ExternalDebug.luau +69 -69
- package/vendor/fusion/Graph/Observer.luau +113 -113
- package/vendor/fusion/Graph/castToGraph.luau +28 -28
- package/vendor/fusion/Graph/change.luau +80 -80
- package/vendor/fusion/Graph/depend.luau +32 -32
- package/vendor/fusion/Graph/evaluate.luau +55 -55
- package/vendor/fusion/Instances/Attribute.luau +57 -57
- package/vendor/fusion/Instances/AttributeChange.luau +46 -46
- package/vendor/fusion/Instances/AttributeOut.luau +63 -63
- package/vendor/fusion/Instances/Child.luau +21 -21
- package/vendor/fusion/Instances/Children.luau +147 -147
- package/vendor/fusion/Instances/Hydrate.luau +32 -32
- package/vendor/fusion/Instances/New.luau +52 -52
- package/vendor/fusion/Instances/OnChange.luau +49 -49
- package/vendor/fusion/Instances/OnEvent.luau +53 -53
- package/vendor/fusion/Instances/Out.luau +69 -69
- package/vendor/fusion/Instances/applyInstanceProps.luau +148 -148
- package/vendor/fusion/Instances/defaultProps.luau +194 -194
- package/vendor/fusion/LICENSE +21 -21
- package/vendor/fusion/Logging/formatError.luau +48 -48
- package/vendor/fusion/Logging/messages.luau +51 -51
- package/vendor/fusion/Logging/parseError.luau +24 -24
- package/vendor/fusion/Memory/checkLifetime.luau +133 -133
- package/vendor/fusion/Memory/deriveScope.luau +23 -23
- package/vendor/fusion/Memory/deriveScopeImpl.luau +44 -44
- package/vendor/fusion/Memory/doCleanup.luau +78 -78
- package/vendor/fusion/Memory/innerScope.luau +33 -33
- package/vendor/fusion/Memory/legacyCleanup.luau +17 -17
- package/vendor/fusion/Memory/needsDestruction.luau +16 -16
- package/vendor/fusion/Memory/poisonScope.luau +33 -33
- package/vendor/fusion/Memory/scopePool.luau +54 -54
- package/vendor/fusion/Memory/scoped.luau +26 -26
- package/vendor/fusion/Memory/whichLivesLonger.luau +74 -74
- package/vendor/fusion/RobloxExternal.luau +97 -97
- package/vendor/fusion/State/Computed.luau +138 -138
- package/vendor/fusion/State/For/Disassembly.luau +210 -210
- package/vendor/fusion/State/For/ForTypes.luau +30 -30
- package/vendor/fusion/State/For/init.luau +109 -109
- package/vendor/fusion/State/ForKeys.luau +93 -93
- package/vendor/fusion/State/ForPairs.luau +96 -96
- package/vendor/fusion/State/ForValues.luau +93 -93
- package/vendor/fusion/State/Value.luau +87 -87
- package/vendor/fusion/State/castToState.luau +25 -25
- package/vendor/fusion/State/peek.luau +30 -30
- package/vendor/fusion/Types.luau +314 -314
- package/vendor/fusion/Utility/Contextual.luau +90 -90
- package/vendor/fusion/Utility/Safe.luau +22 -22
- package/vendor/fusion/Utility/isSimilar.luau +29 -29
- package/vendor/fusion/Utility/merge.luau +35 -35
- package/vendor/fusion/Utility/nameOf.luau +34 -34
- package/vendor/fusion/Utility/never.luau +13 -13
- package/vendor/fusion/Utility/nicknames.luau +10 -10
- package/vendor/fusion/Utility/xtypeof.luau +26 -26
- package/vendor/fusion/init.luau +82 -82
- package/vendor/profilestore/init.luau +2242 -2242
- package/vendor/promise/init.luau +1982 -1982
- package/vendor/rbxutil/buffer-util/Buffer.test.luau +25 -25
- package/vendor/rbxutil/buffer-util/BufferReader.luau +228 -228
- package/vendor/rbxutil/buffer-util/BufferWriter.luau +269 -269
- package/vendor/rbxutil/buffer-util/DataTypeBuffer.luau +223 -223
- package/vendor/rbxutil/buffer-util/Types.luau +60 -60
- package/vendor/rbxutil/buffer-util/index.d.ts +153 -153
- package/vendor/rbxutil/buffer-util/init.luau +41 -41
- package/vendor/rbxutil/buffer-util/package.json +16 -16
- package/vendor/rbxutil/buffer-util/wally.toml +9 -9
- package/vendor/rbxutil/comm/Client/ClientComm.luau +232 -232
- package/vendor/rbxutil/comm/Client/ClientRemoteProperty.luau +156 -156
- package/vendor/rbxutil/comm/Client/ClientRemoteSignal.luau +109 -109
- package/vendor/rbxutil/comm/Client/init.luau +135 -135
- package/vendor/rbxutil/comm/Server/RemoteProperty.luau +295 -295
- package/vendor/rbxutil/comm/Server/RemoteSignal.luau +211 -211
- package/vendor/rbxutil/comm/Server/ServerComm.luau +211 -211
- package/vendor/rbxutil/comm/Server/init.luau +140 -140
- package/vendor/rbxutil/comm/Types.luau +18 -18
- package/vendor/rbxutil/comm/Util.luau +27 -27
- package/vendor/rbxutil/comm/init.luau +35 -35
- package/vendor/rbxutil/comm/wally.toml +13 -13
- package/vendor/rbxutil/component/init.luau +759 -759
- package/vendor/rbxutil/component/init.test.luau +311 -311
- package/vendor/rbxutil/component/wally.toml +14 -14
- package/vendor/rbxutil/concur/init.luau +542 -542
- package/vendor/rbxutil/concur/init.test.luau +364 -364
- package/vendor/rbxutil/concur/wally.toml +8 -8
- package/vendor/rbxutil/enum-list/init.luau +101 -101
- package/vendor/rbxutil/enum-list/init.test.luau +91 -91
- package/vendor/rbxutil/enum-list/wally.toml +8 -8
- package/vendor/rbxutil/find/index.d.ts +20 -20
- package/vendor/rbxutil/find/init.luau +44 -44
- package/vendor/rbxutil/find/package.json +17 -17
- package/vendor/rbxutil/find/wally.toml +8 -8
- package/vendor/rbxutil/input/Gamepad.luau +559 -559
- package/vendor/rbxutil/input/Keyboard.luau +124 -124
- package/vendor/rbxutil/input/Mouse.luau +278 -278
- package/vendor/rbxutil/input/PreferredInput.luau +91 -91
- package/vendor/rbxutil/input/Touch.luau +120 -120
- package/vendor/rbxutil/input/init.luau +33 -33
- package/vendor/rbxutil/input/wally.toml +12 -12
- package/vendor/rbxutil/loader/index.d.ts +15 -15
- package/vendor/rbxutil/loader/init.luau +137 -137
- package/vendor/rbxutil/loader/wally.toml +8 -8
- package/vendor/rbxutil/log/index.d.ts +38 -38
- package/vendor/rbxutil/log/init.luau +746 -746
- package/vendor/rbxutil/log/wally.toml +8 -8
- package/vendor/rbxutil/net/init.luau +190 -190
- package/vendor/rbxutil/net/wally.toml +8 -8
- package/vendor/rbxutil/option/index.d.ts +44 -44
- package/vendor/rbxutil/option/init.luau +489 -489
- package/vendor/rbxutil/option/init.test.luau +342 -342
- package/vendor/rbxutil/option/wally.toml +8 -8
- package/vendor/rbxutil/pid/index.d.ts +53 -53
- package/vendor/rbxutil/pid/init.luau +195 -195
- package/vendor/rbxutil/pid/package.json +16 -16
- package/vendor/rbxutil/pid/wally.toml +9 -9
- package/vendor/rbxutil/quaternion/index.d.ts +117 -117
- package/vendor/rbxutil/quaternion/init.luau +570 -570
- package/vendor/rbxutil/quaternion/package.json +16 -16
- package/vendor/rbxutil/quaternion/wally.toml +9 -9
- package/vendor/rbxutil/query/index.d.ts +43 -43
- package/vendor/rbxutil/query/init.luau +117 -117
- package/vendor/rbxutil/query/package.json +18 -18
- package/vendor/rbxutil/query/wally.toml +9 -9
- package/vendor/rbxutil/sequent/index.d.ts +28 -28
- package/vendor/rbxutil/sequent/init.luau +340 -340
- package/vendor/rbxutil/sequent/package.json +16 -16
- package/vendor/rbxutil/sequent/wally.toml +9 -9
- package/vendor/rbxutil/ser/init.luau +175 -175
- package/vendor/rbxutil/ser/init.test.luau +50 -50
- package/vendor/rbxutil/ser/wally.toml +11 -11
- package/vendor/rbxutil/shake/index.d.ts +36 -36
- package/vendor/rbxutil/shake/init.luau +532 -532
- package/vendor/rbxutil/shake/init.test.luau +267 -267
- package/vendor/rbxutil/shake/package.json +16 -16
- package/vendor/rbxutil/shake/wally.toml +9 -9
- package/vendor/rbxutil/signal/index.d.ts +100 -100
- package/vendor/rbxutil/signal/init.luau +432 -432
- package/vendor/rbxutil/signal/init.test.luau +190 -190
- package/vendor/rbxutil/signal/package.json +17 -17
- package/vendor/rbxutil/signal/wally.toml +9 -9
- package/vendor/rbxutil/silo/TableWatcher.luau +65 -65
- package/vendor/rbxutil/silo/Util.luau +55 -55
- package/vendor/rbxutil/silo/init.luau +338 -338
- package/vendor/rbxutil/silo/init.test.luau +215 -215
- package/vendor/rbxutil/silo/wally.toml +8 -8
- package/vendor/rbxutil/spring/index.d.ts +40 -40
- package/vendor/rbxutil/spring/init.luau +97 -97
- package/vendor/rbxutil/spring/package.json +17 -17
- package/vendor/rbxutil/spring/wally.toml +8 -8
- package/vendor/rbxutil/stream/index.d.ts +88 -88
- package/vendor/rbxutil/stream/init.luau +597 -597
- package/vendor/rbxutil/stream/package.json +18 -18
- package/vendor/rbxutil/stream/wally.toml +9 -9
- package/vendor/rbxutil/streamable/Streamable.luau +202 -202
- package/vendor/rbxutil/streamable/StreamableUtil.luau +80 -80
- package/vendor/rbxutil/streamable/init.luau +8 -8
- package/vendor/rbxutil/streamable/wally.toml +12 -12
- package/vendor/rbxutil/symbol/init.luau +56 -56
- package/vendor/rbxutil/symbol/init.test.luau +37 -37
- package/vendor/rbxutil/symbol/wally.toml +8 -8
- package/vendor/rbxutil/table-util/init.luau +938 -938
- package/vendor/rbxutil/table-util/init.test.luau +439 -439
- package/vendor/rbxutil/task-queue/index.d.ts +27 -27
- package/vendor/rbxutil/task-queue/init.luau +97 -97
- package/vendor/rbxutil/task-queue/wally.toml +8 -8
- package/vendor/rbxutil/timer/index.d.ts +81 -81
- package/vendor/rbxutil/timer/init.luau +249 -249
- package/vendor/rbxutil/timer/init.test.luau +73 -73
- package/vendor/rbxutil/timer/wally.toml +11 -11
- package/vendor/rbxutil/tree/index.d.ts +15 -15
- package/vendor/rbxutil/tree/init.luau +137 -137
- package/vendor/rbxutil/tree/wally.toml +8 -8
- package/vendor/rbxutil/trove/index.d.ts +46 -46
- package/vendor/rbxutil/trove/init.luau +787 -787
- package/vendor/rbxutil/trove/init.test.luau +203 -203
- package/vendor/rbxutil/trove/wally.toml +8 -8
- package/vendor/rbxutil/typed-remote/init.luau +196 -196
- package/vendor/rbxutil/typed-remote/wally.toml +8 -8
- package/vendor/rbxutil/wait-for/index.d.ts +17 -17
- package/vendor/rbxutil/wait-for/init.luau +257 -257
- package/vendor/rbxutil/wait-for/init.test.luau +182 -182
- package/vendor/rbxutil/wait-for/wally.toml +11 -11
- package/vendor/t/t.lua +1350 -1350
- package/vendor/testez/Context.lua +26 -26
- package/vendor/testez/Expectation.lua +311 -311
- package/vendor/testez/ExpectationContext.lua +38 -38
- package/vendor/testez/LifecycleHooks.lua +89 -89
- package/vendor/testez/Reporters/TeamCityReporter.lua +101 -101
- package/vendor/testez/Reporters/TextReporter.lua +105 -105
- package/vendor/testez/Reporters/TextReporterQuiet.lua +96 -96
- package/vendor/testez/TestBootstrap.lua +146 -146
- package/vendor/testez/TestEnum.lua +27 -27
- package/vendor/testez/TestPlan.lua +304 -304
- package/vendor/testez/TestPlanner.lua +39 -39
- package/vendor/testez/TestResults.lua +111 -111
- package/vendor/testez/TestRunner.lua +188 -188
- package/vendor/testez/TestSession.lua +243 -243
- package/vendor/testez/init.lua +39 -39
|
@@ -1,97 +1,97 @@
|
|
|
1
|
-
--[[
|
|
2
|
-
Copy of TextReporter that doesn't output successful tests.
|
|
3
|
-
|
|
4
|
-
This should be temporary, it's just a workaround to make CI environments
|
|
5
|
-
happy in the short-term.
|
|
6
|
-
]]
|
|
7
|
-
|
|
8
|
-
local TestService = game:GetService("TestService")
|
|
9
|
-
|
|
10
|
-
local TestEnum = require(script.Parent.Parent.TestEnum)
|
|
11
|
-
|
|
12
|
-
local INDENT = (" "):rep(3)
|
|
13
|
-
local STATUS_SYMBOLS = {
|
|
14
|
-
[TestEnum.TestStatus.Success] = "+",
|
|
15
|
-
[TestEnum.TestStatus.Failure] = "-",
|
|
16
|
-
[TestEnum.TestStatus.Skipped] = "~"
|
|
17
|
-
}
|
|
18
|
-
local UNKNOWN_STATUS_SYMBOL = "?"
|
|
19
|
-
|
|
20
|
-
local TextReporterQuiet = {}
|
|
21
|
-
|
|
22
|
-
local function reportNode(node, buffer, level)
|
|
23
|
-
buffer = buffer or {}
|
|
24
|
-
level = level or 0
|
|
25
|
-
|
|
26
|
-
if node.status == TestEnum.TestStatus.Skipped then
|
|
27
|
-
return buffer
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
local line
|
|
31
|
-
|
|
32
|
-
if node.status ~= TestEnum.TestStatus.Success then
|
|
33
|
-
local symbol = STATUS_SYMBOLS[node.status] or UNKNOWN_STATUS_SYMBOL
|
|
34
|
-
|
|
35
|
-
line = ("%s[%s] %s"):format(
|
|
36
|
-
INDENT:rep(level),
|
|
37
|
-
symbol,
|
|
38
|
-
node.planNode.phrase
|
|
39
|
-
)
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
table.insert(buffer, line)
|
|
43
|
-
|
|
44
|
-
for _, child in ipairs(node.children) do
|
|
45
|
-
reportNode(child, buffer, level + 1)
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
return buffer
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
local function reportRoot(node)
|
|
52
|
-
local buffer = {}
|
|
53
|
-
|
|
54
|
-
for _, child in ipairs(node.children) do
|
|
55
|
-
reportNode(child, buffer, 0)
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
return buffer
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
local function report(root)
|
|
62
|
-
local buffer = reportRoot(root)
|
|
63
|
-
|
|
64
|
-
return table.concat(buffer, "\n")
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
function TextReporterQuiet.report(results)
|
|
68
|
-
local resultBuffer = {
|
|
69
|
-
"Test results:",
|
|
70
|
-
report(results),
|
|
71
|
-
("%d passed, %d failed, %d skipped"):format(
|
|
72
|
-
results.successCount,
|
|
73
|
-
results.failureCount,
|
|
74
|
-
results.skippedCount
|
|
75
|
-
)
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
print(table.concat(resultBuffer, "\n"))
|
|
79
|
-
|
|
80
|
-
if results.failureCount > 0 then
|
|
81
|
-
print(("%d test nodes reported failures."):format(results.failureCount))
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
if #results.errors > 0 then
|
|
85
|
-
print("Errors reported by tests:")
|
|
86
|
-
print("")
|
|
87
|
-
|
|
88
|
-
for _, message in ipairs(results.errors) do
|
|
89
|
-
TestService:Error(message)
|
|
90
|
-
|
|
91
|
-
-- Insert a blank line after each error
|
|
92
|
-
print("")
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
|
|
1
|
+
--[[
|
|
2
|
+
Copy of TextReporter that doesn't output successful tests.
|
|
3
|
+
|
|
4
|
+
This should be temporary, it's just a workaround to make CI environments
|
|
5
|
+
happy in the short-term.
|
|
6
|
+
]]
|
|
7
|
+
|
|
8
|
+
local TestService = game:GetService("TestService")
|
|
9
|
+
|
|
10
|
+
local TestEnum = require(script.Parent.Parent.TestEnum)
|
|
11
|
+
|
|
12
|
+
local INDENT = (" "):rep(3)
|
|
13
|
+
local STATUS_SYMBOLS = {
|
|
14
|
+
[TestEnum.TestStatus.Success] = "+",
|
|
15
|
+
[TestEnum.TestStatus.Failure] = "-",
|
|
16
|
+
[TestEnum.TestStatus.Skipped] = "~"
|
|
17
|
+
}
|
|
18
|
+
local UNKNOWN_STATUS_SYMBOL = "?"
|
|
19
|
+
|
|
20
|
+
local TextReporterQuiet = {}
|
|
21
|
+
|
|
22
|
+
local function reportNode(node, buffer, level)
|
|
23
|
+
buffer = buffer or {}
|
|
24
|
+
level = level or 0
|
|
25
|
+
|
|
26
|
+
if node.status == TestEnum.TestStatus.Skipped then
|
|
27
|
+
return buffer
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
local line
|
|
31
|
+
|
|
32
|
+
if node.status ~= TestEnum.TestStatus.Success then
|
|
33
|
+
local symbol = STATUS_SYMBOLS[node.status] or UNKNOWN_STATUS_SYMBOL
|
|
34
|
+
|
|
35
|
+
line = ("%s[%s] %s"):format(
|
|
36
|
+
INDENT:rep(level),
|
|
37
|
+
symbol,
|
|
38
|
+
node.planNode.phrase
|
|
39
|
+
)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
table.insert(buffer, line)
|
|
43
|
+
|
|
44
|
+
for _, child in ipairs(node.children) do
|
|
45
|
+
reportNode(child, buffer, level + 1)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
return buffer
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
local function reportRoot(node)
|
|
52
|
+
local buffer = {}
|
|
53
|
+
|
|
54
|
+
for _, child in ipairs(node.children) do
|
|
55
|
+
reportNode(child, buffer, 0)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
return buffer
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
local function report(root)
|
|
62
|
+
local buffer = reportRoot(root)
|
|
63
|
+
|
|
64
|
+
return table.concat(buffer, "\n")
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
function TextReporterQuiet.report(results)
|
|
68
|
+
local resultBuffer = {
|
|
69
|
+
"Test results:",
|
|
70
|
+
report(results),
|
|
71
|
+
("%d passed, %d failed, %d skipped"):format(
|
|
72
|
+
results.successCount,
|
|
73
|
+
results.failureCount,
|
|
74
|
+
results.skippedCount
|
|
75
|
+
)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
print(table.concat(resultBuffer, "\n"))
|
|
79
|
+
|
|
80
|
+
if results.failureCount > 0 then
|
|
81
|
+
print(("%d test nodes reported failures."):format(results.failureCount))
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
if #results.errors > 0 then
|
|
85
|
+
print("Errors reported by tests:")
|
|
86
|
+
print("")
|
|
87
|
+
|
|
88
|
+
for _, message in ipairs(results.errors) do
|
|
89
|
+
TestService:Error(message)
|
|
90
|
+
|
|
91
|
+
-- Insert a blank line after each error
|
|
92
|
+
print("")
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
97
|
return TextReporterQuiet
|
|
@@ -1,147 +1,147 @@
|
|
|
1
|
-
--[[
|
|
2
|
-
Provides an interface to quickly run and report tests from a given object.
|
|
3
|
-
]]
|
|
4
|
-
|
|
5
|
-
local TestPlanner = require(script.Parent.TestPlanner)
|
|
6
|
-
local TestRunner = require(script.Parent.TestRunner)
|
|
7
|
-
local TextReporter = require(script.Parent.Reporters.TextReporter)
|
|
8
|
-
|
|
9
|
-
local TestBootstrap = {}
|
|
10
|
-
|
|
11
|
-
local function stripSpecSuffix(name)
|
|
12
|
-
return (name:gsub("%.spec$", ""))
|
|
13
|
-
end
|
|
14
|
-
local function isSpecScript(aScript)
|
|
15
|
-
return aScript:IsA("ModuleScript") and aScript.Name:match("%.spec$")
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
local function getPath(module, root)
|
|
19
|
-
root = root or game
|
|
20
|
-
|
|
21
|
-
local path = {}
|
|
22
|
-
local last = module
|
|
23
|
-
|
|
24
|
-
if last.Name == "init.spec" then
|
|
25
|
-
-- Use the directory's node for init.spec files.
|
|
26
|
-
last = last.Parent
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
while last ~= nil and last ~= root do
|
|
30
|
-
table.insert(path, stripSpecSuffix(last.Name))
|
|
31
|
-
last = last.Parent
|
|
32
|
-
end
|
|
33
|
-
table.insert(path, stripSpecSuffix(root.Name))
|
|
34
|
-
|
|
35
|
-
return path
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
local function toStringPath(tablePath)
|
|
39
|
-
local stringPath = ""
|
|
40
|
-
local first = true
|
|
41
|
-
for _, element in ipairs(tablePath) do
|
|
42
|
-
if first then
|
|
43
|
-
stringPath = element
|
|
44
|
-
first = false
|
|
45
|
-
else
|
|
46
|
-
stringPath = element .. " " .. stringPath
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
return stringPath
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
function TestBootstrap:getModulesImpl(root, modules, current)
|
|
53
|
-
modules = modules or {}
|
|
54
|
-
current = current or root
|
|
55
|
-
|
|
56
|
-
if isSpecScript(current) then
|
|
57
|
-
local method = require(current)
|
|
58
|
-
local path = getPath(current, root)
|
|
59
|
-
local pathString = toStringPath(path)
|
|
60
|
-
|
|
61
|
-
table.insert(modules, {
|
|
62
|
-
method = method,
|
|
63
|
-
path = path,
|
|
64
|
-
pathStringForSorting = pathString:lower()
|
|
65
|
-
})
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
--[[
|
|
70
|
-
Find all the ModuleScripts in this tree that are tests.
|
|
71
|
-
]]
|
|
72
|
-
function TestBootstrap:getModules(root)
|
|
73
|
-
local modules = {}
|
|
74
|
-
|
|
75
|
-
self:getModulesImpl(root, modules)
|
|
76
|
-
|
|
77
|
-
for _, child in ipairs(root:GetDescendants()) do
|
|
78
|
-
self:getModulesImpl(root, modules, child)
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
return modules
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
--[[
|
|
85
|
-
Runs all test and reports the results using the given test reporter.
|
|
86
|
-
|
|
87
|
-
If no reporter is specified, a reasonable default is provided.
|
|
88
|
-
|
|
89
|
-
This function demonstrates the expected workflow with this testing system:
|
|
90
|
-
1. Locate test modules
|
|
91
|
-
2. Generate test plan
|
|
92
|
-
3. Run test plan
|
|
93
|
-
4. Report test results
|
|
94
|
-
|
|
95
|
-
This means we could hypothetically present a GUI to the developer that shows
|
|
96
|
-
the test plan before we execute it, allowing them to toggle specific tests
|
|
97
|
-
before they're run, but after they've been identified!
|
|
98
|
-
]]
|
|
99
|
-
function TestBootstrap:run(roots, reporter, otherOptions)
|
|
100
|
-
reporter = reporter or TextReporter
|
|
101
|
-
|
|
102
|
-
otherOptions = otherOptions or {}
|
|
103
|
-
local showTimingInfo = otherOptions["showTimingInfo"] or false
|
|
104
|
-
local testNamePattern = otherOptions["testNamePattern"]
|
|
105
|
-
local extraEnvironment = otherOptions["extraEnvironment"] or {}
|
|
106
|
-
|
|
107
|
-
if type(roots) ~= "table" then
|
|
108
|
-
error(("Bad argument #1 to TestBootstrap:run. Expected table, got %s"):format(typeof(roots)), 2)
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
local startTime = tick()
|
|
112
|
-
|
|
113
|
-
local modules = {}
|
|
114
|
-
for _, subRoot in ipairs(roots) do
|
|
115
|
-
local newModules = self:getModules(subRoot)
|
|
116
|
-
|
|
117
|
-
for _, newModule in ipairs(newModules) do
|
|
118
|
-
table.insert(modules, newModule)
|
|
119
|
-
end
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
local afterModules = tick()
|
|
123
|
-
|
|
124
|
-
local plan = TestPlanner.createPlan(modules, testNamePattern, extraEnvironment)
|
|
125
|
-
local afterPlan = tick()
|
|
126
|
-
|
|
127
|
-
local results = TestRunner.runPlan(plan)
|
|
128
|
-
local afterRun = tick()
|
|
129
|
-
|
|
130
|
-
reporter.report(results)
|
|
131
|
-
local afterReport = tick()
|
|
132
|
-
|
|
133
|
-
if showTimingInfo then
|
|
134
|
-
local timing = {
|
|
135
|
-
("Took %f seconds to locate test modules"):format(afterModules - startTime),
|
|
136
|
-
("Took %f seconds to create test plan"):format(afterPlan - afterModules),
|
|
137
|
-
("Took %f seconds to run tests"):format(afterRun - afterPlan),
|
|
138
|
-
("Took %f seconds to report tests"):format(afterReport - afterRun),
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
print(table.concat(timing, "\n"))
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
return results
|
|
145
|
-
end
|
|
146
|
-
|
|
1
|
+
--[[
|
|
2
|
+
Provides an interface to quickly run and report tests from a given object.
|
|
3
|
+
]]
|
|
4
|
+
|
|
5
|
+
local TestPlanner = require(script.Parent.TestPlanner)
|
|
6
|
+
local TestRunner = require(script.Parent.TestRunner)
|
|
7
|
+
local TextReporter = require(script.Parent.Reporters.TextReporter)
|
|
8
|
+
|
|
9
|
+
local TestBootstrap = {}
|
|
10
|
+
|
|
11
|
+
local function stripSpecSuffix(name)
|
|
12
|
+
return (name:gsub("%.spec$", ""))
|
|
13
|
+
end
|
|
14
|
+
local function isSpecScript(aScript)
|
|
15
|
+
return aScript:IsA("ModuleScript") and aScript.Name:match("%.spec$")
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
local function getPath(module, root)
|
|
19
|
+
root = root or game
|
|
20
|
+
|
|
21
|
+
local path = {}
|
|
22
|
+
local last = module
|
|
23
|
+
|
|
24
|
+
if last.Name == "init.spec" then
|
|
25
|
+
-- Use the directory's node for init.spec files.
|
|
26
|
+
last = last.Parent
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
while last ~= nil and last ~= root do
|
|
30
|
+
table.insert(path, stripSpecSuffix(last.Name))
|
|
31
|
+
last = last.Parent
|
|
32
|
+
end
|
|
33
|
+
table.insert(path, stripSpecSuffix(root.Name))
|
|
34
|
+
|
|
35
|
+
return path
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
local function toStringPath(tablePath)
|
|
39
|
+
local stringPath = ""
|
|
40
|
+
local first = true
|
|
41
|
+
for _, element in ipairs(tablePath) do
|
|
42
|
+
if first then
|
|
43
|
+
stringPath = element
|
|
44
|
+
first = false
|
|
45
|
+
else
|
|
46
|
+
stringPath = element .. " " .. stringPath
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
return stringPath
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
function TestBootstrap:getModulesImpl(root, modules, current)
|
|
53
|
+
modules = modules or {}
|
|
54
|
+
current = current or root
|
|
55
|
+
|
|
56
|
+
if isSpecScript(current) then
|
|
57
|
+
local method = require(current)
|
|
58
|
+
local path = getPath(current, root)
|
|
59
|
+
local pathString = toStringPath(path)
|
|
60
|
+
|
|
61
|
+
table.insert(modules, {
|
|
62
|
+
method = method,
|
|
63
|
+
path = path,
|
|
64
|
+
pathStringForSorting = pathString:lower()
|
|
65
|
+
})
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
--[[
|
|
70
|
+
Find all the ModuleScripts in this tree that are tests.
|
|
71
|
+
]]
|
|
72
|
+
function TestBootstrap:getModules(root)
|
|
73
|
+
local modules = {}
|
|
74
|
+
|
|
75
|
+
self:getModulesImpl(root, modules)
|
|
76
|
+
|
|
77
|
+
for _, child in ipairs(root:GetDescendants()) do
|
|
78
|
+
self:getModulesImpl(root, modules, child)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
return modules
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
--[[
|
|
85
|
+
Runs all test and reports the results using the given test reporter.
|
|
86
|
+
|
|
87
|
+
If no reporter is specified, a reasonable default is provided.
|
|
88
|
+
|
|
89
|
+
This function demonstrates the expected workflow with this testing system:
|
|
90
|
+
1. Locate test modules
|
|
91
|
+
2. Generate test plan
|
|
92
|
+
3. Run test plan
|
|
93
|
+
4. Report test results
|
|
94
|
+
|
|
95
|
+
This means we could hypothetically present a GUI to the developer that shows
|
|
96
|
+
the test plan before we execute it, allowing them to toggle specific tests
|
|
97
|
+
before they're run, but after they've been identified!
|
|
98
|
+
]]
|
|
99
|
+
function TestBootstrap:run(roots, reporter, otherOptions)
|
|
100
|
+
reporter = reporter or TextReporter
|
|
101
|
+
|
|
102
|
+
otherOptions = otherOptions or {}
|
|
103
|
+
local showTimingInfo = otherOptions["showTimingInfo"] or false
|
|
104
|
+
local testNamePattern = otherOptions["testNamePattern"]
|
|
105
|
+
local extraEnvironment = otherOptions["extraEnvironment"] or {}
|
|
106
|
+
|
|
107
|
+
if type(roots) ~= "table" then
|
|
108
|
+
error(("Bad argument #1 to TestBootstrap:run. Expected table, got %s"):format(typeof(roots)), 2)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
local startTime = tick()
|
|
112
|
+
|
|
113
|
+
local modules = {}
|
|
114
|
+
for _, subRoot in ipairs(roots) do
|
|
115
|
+
local newModules = self:getModules(subRoot)
|
|
116
|
+
|
|
117
|
+
for _, newModule in ipairs(newModules) do
|
|
118
|
+
table.insert(modules, newModule)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
local afterModules = tick()
|
|
123
|
+
|
|
124
|
+
local plan = TestPlanner.createPlan(modules, testNamePattern, extraEnvironment)
|
|
125
|
+
local afterPlan = tick()
|
|
126
|
+
|
|
127
|
+
local results = TestRunner.runPlan(plan)
|
|
128
|
+
local afterRun = tick()
|
|
129
|
+
|
|
130
|
+
reporter.report(results)
|
|
131
|
+
local afterReport = tick()
|
|
132
|
+
|
|
133
|
+
if showTimingInfo then
|
|
134
|
+
local timing = {
|
|
135
|
+
("Took %f seconds to locate test modules"):format(afterModules - startTime),
|
|
136
|
+
("Took %f seconds to create test plan"):format(afterPlan - afterModules),
|
|
137
|
+
("Took %f seconds to run tests"):format(afterRun - afterPlan),
|
|
138
|
+
("Took %f seconds to report tests"):format(afterReport - afterRun),
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
print(table.concat(timing, "\n"))
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
return results
|
|
145
|
+
end
|
|
146
|
+
|
|
147
147
|
return TestBootstrap
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
--[[
|
|
2
|
-
Constants used throughout the testing framework.
|
|
3
|
-
]]
|
|
4
|
-
|
|
5
|
-
local TestEnum = {}
|
|
6
|
-
|
|
7
|
-
TestEnum.TestStatus = {
|
|
8
|
-
Success = "Success",
|
|
9
|
-
Failure = "Failure",
|
|
10
|
-
Skipped = "Skipped"
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
TestEnum.NodeType = {
|
|
14
|
-
Describe = "Describe",
|
|
15
|
-
It = "It",
|
|
16
|
-
BeforeAll = "BeforeAll",
|
|
17
|
-
AfterAll = "AfterAll",
|
|
18
|
-
BeforeEach = "BeforeEach",
|
|
19
|
-
AfterEach = "AfterEach"
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
TestEnum.NodeModifier = {
|
|
23
|
-
None = "None",
|
|
24
|
-
Skip = "Skip",
|
|
25
|
-
Focus = "Focus"
|
|
26
|
-
}
|
|
27
|
-
|
|
1
|
+
--[[
|
|
2
|
+
Constants used throughout the testing framework.
|
|
3
|
+
]]
|
|
4
|
+
|
|
5
|
+
local TestEnum = {}
|
|
6
|
+
|
|
7
|
+
TestEnum.TestStatus = {
|
|
8
|
+
Success = "Success",
|
|
9
|
+
Failure = "Failure",
|
|
10
|
+
Skipped = "Skipped"
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
TestEnum.NodeType = {
|
|
14
|
+
Describe = "Describe",
|
|
15
|
+
It = "It",
|
|
16
|
+
BeforeAll = "BeforeAll",
|
|
17
|
+
AfterAll = "AfterAll",
|
|
18
|
+
BeforeEach = "BeforeEach",
|
|
19
|
+
AfterEach = "AfterEach"
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
TestEnum.NodeModifier = {
|
|
23
|
+
None = "None",
|
|
24
|
+
Skip = "Skip",
|
|
25
|
+
Focus = "Focus"
|
|
26
|
+
}
|
|
27
|
+
|
|
28
28
|
return TestEnum
|