roblox-opencode 1.0.0 → 1.0.1
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 +863 -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 +1519 -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,364 +1,364 @@
|
|
|
1
|
-
local ServerScriptService = game:GetService("ServerScriptService")
|
|
2
|
-
|
|
3
|
-
local Test = require(ServerScriptService.TestRunner.Test)
|
|
4
|
-
|
|
5
|
-
return function(ctx: Test.TestContext)
|
|
6
|
-
local Concur = require(script.Parent)
|
|
7
|
-
|
|
8
|
-
local function Awaiter(timeout: number)
|
|
9
|
-
local awaiter = {}
|
|
10
|
-
local thread
|
|
11
|
-
local delayThread
|
|
12
|
-
function awaiter.Resume(...)
|
|
13
|
-
if coroutine.running() ~= delayThread then
|
|
14
|
-
task.cancel(delayThread)
|
|
15
|
-
end
|
|
16
|
-
task.spawn(thread, ...)
|
|
17
|
-
end
|
|
18
|
-
function awaiter.Yield()
|
|
19
|
-
thread = coroutine.running()
|
|
20
|
-
delayThread = task.delay(timeout, function()
|
|
21
|
-
awaiter.Resume()
|
|
22
|
-
end)
|
|
23
|
-
return coroutine.yield()
|
|
24
|
-
end
|
|
25
|
-
return awaiter
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
local bindableEvent
|
|
29
|
-
ctx:BeforeEach(function()
|
|
30
|
-
bindableEvent = Instance.new("BindableEvent")
|
|
31
|
-
end)
|
|
32
|
-
ctx:AfterEach(function()
|
|
33
|
-
bindableEvent:Destroy()
|
|
34
|
-
bindableEvent = nil
|
|
35
|
-
end)
|
|
36
|
-
|
|
37
|
-
ctx:Describe("Single", function()
|
|
38
|
-
ctx:Test("should spawn a new concur instance", function()
|
|
39
|
-
local value = nil
|
|
40
|
-
ctx:Expect(function()
|
|
41
|
-
Concur.spawn(function()
|
|
42
|
-
value = 10
|
|
43
|
-
end)
|
|
44
|
-
end)
|
|
45
|
-
:Not()
|
|
46
|
-
:ToThrow()
|
|
47
|
-
ctx:Expect(value):ToBe(10)
|
|
48
|
-
end)
|
|
49
|
-
|
|
50
|
-
ctx:Test("should defer a new concur instance", function()
|
|
51
|
-
local awaiter = Awaiter(1)
|
|
52
|
-
ctx:Expect(function()
|
|
53
|
-
Concur.defer(function()
|
|
54
|
-
awaiter.Resume(10)
|
|
55
|
-
end)
|
|
56
|
-
end)
|
|
57
|
-
:Not()
|
|
58
|
-
:ToThrow()
|
|
59
|
-
local value = awaiter.Yield()
|
|
60
|
-
ctx:Expect(value):ToBe(10)
|
|
61
|
-
end)
|
|
62
|
-
|
|
63
|
-
ctx:Test("should delay a new concur instance", function()
|
|
64
|
-
local awaiter = Awaiter(1)
|
|
65
|
-
ctx:Expect(function()
|
|
66
|
-
Concur.delay(0.1, function()
|
|
67
|
-
awaiter.Resume(10)
|
|
68
|
-
end)
|
|
69
|
-
end)
|
|
70
|
-
:Not()
|
|
71
|
-
:ToThrow()
|
|
72
|
-
local value = awaiter.Yield()
|
|
73
|
-
ctx:Expect(value):ToBe(10)
|
|
74
|
-
end)
|
|
75
|
-
|
|
76
|
-
ctx:Test("should create an immediate value concur instance", function()
|
|
77
|
-
local c
|
|
78
|
-
ctx:Expect(function()
|
|
79
|
-
c = Concur.value(10)
|
|
80
|
-
end)
|
|
81
|
-
:Not()
|
|
82
|
-
:ToThrow()
|
|
83
|
-
ctx:Expect(c):ToBeOk()
|
|
84
|
-
ctx:Expect(c:IsCompleted()):ToBe(true)
|
|
85
|
-
local err, val = c:Await()
|
|
86
|
-
ctx:Expect(err):ToBeNil()
|
|
87
|
-
ctx:Expect(val):ToBe(10)
|
|
88
|
-
end)
|
|
89
|
-
|
|
90
|
-
ctx:Test("should create a concur instance to watch an event with no predicate", function()
|
|
91
|
-
local c
|
|
92
|
-
ctx:Expect(function()
|
|
93
|
-
c = Concur.event(bindableEvent.Event)
|
|
94
|
-
end)
|
|
95
|
-
:Not()
|
|
96
|
-
:ToThrow()
|
|
97
|
-
ctx:Expect(c:IsCompleted()):ToBe(false)
|
|
98
|
-
bindableEvent:Fire(10)
|
|
99
|
-
local err, val = c:Await(1)
|
|
100
|
-
ctx:Expect(err):ToBeNil()
|
|
101
|
-
ctx:Expect(val):ToBe(10)
|
|
102
|
-
end)
|
|
103
|
-
|
|
104
|
-
ctx:Test("should create a concur instance to watch an event with a predicate", function()
|
|
105
|
-
local c
|
|
106
|
-
ctx:Expect(function()
|
|
107
|
-
c = Concur.event(bindableEvent.Event, function(v)
|
|
108
|
-
return v < 10
|
|
109
|
-
end)
|
|
110
|
-
end)
|
|
111
|
-
:Not()
|
|
112
|
-
:ToThrow()
|
|
113
|
-
ctx:Expect(c:IsCompleted()):ToBe(false)
|
|
114
|
-
bindableEvent:Fire(10)
|
|
115
|
-
bindableEvent:Fire(5)
|
|
116
|
-
local err, val = c:Await(1)
|
|
117
|
-
ctx:Expect(err):ToBeNil()
|
|
118
|
-
ctx:Expect(val):ToBe(5)
|
|
119
|
-
end)
|
|
120
|
-
end)
|
|
121
|
-
|
|
122
|
-
ctx:Describe("Multi", function()
|
|
123
|
-
ctx:Test("should complete all concur instances", function()
|
|
124
|
-
local c1 = Concur.spawn(function()
|
|
125
|
-
return 10
|
|
126
|
-
end)
|
|
127
|
-
local c2 = Concur.defer(function()
|
|
128
|
-
return 20
|
|
129
|
-
end)
|
|
130
|
-
local c3 = Concur.delay(0, function()
|
|
131
|
-
return 30
|
|
132
|
-
end)
|
|
133
|
-
local c4 = Concur.spawn(function()
|
|
134
|
-
error("fail")
|
|
135
|
-
end)
|
|
136
|
-
local c5 = Concur.event(bindableEvent.Event)
|
|
137
|
-
local c = Concur.all({ c1, c2, c3, c4, c5 })
|
|
138
|
-
ctx:Expect(c:IsCompleted()):ToBe(false)
|
|
139
|
-
bindableEvent:Fire(40)
|
|
140
|
-
local err, res = c:Await(1)
|
|
141
|
-
ctx:Expect(err):ToBeNil()
|
|
142
|
-
ctx:Expect(res[1][1]):ToBeNil()
|
|
143
|
-
ctx:Expect(res[1][2]):ToBe(10)
|
|
144
|
-
ctx:Expect(res[2][1]):ToBeNil()
|
|
145
|
-
ctx:Expect(res[2][2]):ToBe(20)
|
|
146
|
-
ctx:Expect(res[3][1]):ToBeNil()
|
|
147
|
-
ctx:Expect(res[3][2]):ToBe(30)
|
|
148
|
-
ctx:Expect(res[4][1]):ToBeOk()
|
|
149
|
-
ctx:Expect(res[4][2]):ToBeNil()
|
|
150
|
-
ctx:Expect(res[5][1]):ToBeNil()
|
|
151
|
-
ctx:Expect(res[5][2]):ToBe(40)
|
|
152
|
-
end)
|
|
153
|
-
|
|
154
|
-
ctx:Test("should complete the first concur instance", function()
|
|
155
|
-
local c1 = Concur.defer(function()
|
|
156
|
-
return 10
|
|
157
|
-
end)
|
|
158
|
-
local c2 = Concur.spawn(function()
|
|
159
|
-
return 20
|
|
160
|
-
end)
|
|
161
|
-
local c = Concur.first({ c1, c2 })
|
|
162
|
-
local err, res = c:Await(1)
|
|
163
|
-
ctx:Expect(err):ToBeNil()
|
|
164
|
-
ctx:Expect(res):ToBe(20)
|
|
165
|
-
end)
|
|
166
|
-
end)
|
|
167
|
-
|
|
168
|
-
ctx:Describe("Stop", function()
|
|
169
|
-
ctx:Test("should stop a single concur", function()
|
|
170
|
-
local c1 = Concur.defer(function()
|
|
171
|
-
return 10
|
|
172
|
-
end)
|
|
173
|
-
ctx:Expect(c1:IsCompleted()):ToBe(false)
|
|
174
|
-
c1:Stop()
|
|
175
|
-
ctx:Expect(c1:IsCompleted()):ToBe(true)
|
|
176
|
-
local err, val = c1:Await()
|
|
177
|
-
ctx:Expect(err):ToBe(Concur.Errors.Stopped)
|
|
178
|
-
ctx:Expect(val):ToBeNil()
|
|
179
|
-
end)
|
|
180
|
-
|
|
181
|
-
ctx:Test("should stop multiple concurs", function()
|
|
182
|
-
local c1 = Concur.defer(function() end)
|
|
183
|
-
local c2 = Concur.delay(1, function() end)
|
|
184
|
-
local c3 = Concur.event(bindableEvent.Event)
|
|
185
|
-
local c = Concur.all({ c1, c2, c3 })
|
|
186
|
-
c:Stop()
|
|
187
|
-
local err, val = c:Await()
|
|
188
|
-
ctx:Expect(err):ToBe(Concur.Errors.Stopped)
|
|
189
|
-
ctx:Expect(val):ToBeNil()
|
|
190
|
-
end)
|
|
191
|
-
|
|
192
|
-
ctx:Test("should not stop an already completed concur", function()
|
|
193
|
-
local c1 = Concur.spawn(function()
|
|
194
|
-
return 10
|
|
195
|
-
end)
|
|
196
|
-
ctx:Expect(c1:IsCompleted()):ToBe(true)
|
|
197
|
-
c1:Stop()
|
|
198
|
-
local err, val = c1:Await()
|
|
199
|
-
ctx:Expect(err):ToBeNil()
|
|
200
|
-
ctx:Expect(val):ToBe(10)
|
|
201
|
-
end)
|
|
202
|
-
end)
|
|
203
|
-
|
|
204
|
-
ctx:Describe("IsCompleted", function()
|
|
205
|
-
ctx:Test("should correctly check if a concur instance is completed", function()
|
|
206
|
-
local c1 = Concur.defer(function() end)
|
|
207
|
-
ctx:Expect(c1:IsCompleted()):ToBe(false)
|
|
208
|
-
local err = c1:Await()
|
|
209
|
-
ctx:Expect(err):ToBeNil()
|
|
210
|
-
ctx:Expect(c1:IsCompleted()):ToBe(true)
|
|
211
|
-
end)
|
|
212
|
-
|
|
213
|
-
ctx:Test("should be marked as completed if error", function()
|
|
214
|
-
local c1 = Concur.spawn(function()
|
|
215
|
-
error("err")
|
|
216
|
-
end)
|
|
217
|
-
ctx:Expect(c1:IsCompleted()):ToBe(true)
|
|
218
|
-
end)
|
|
219
|
-
|
|
220
|
-
ctx:Test("should be marked as completed if stopped", function()
|
|
221
|
-
local c1 = Concur.defer(function() end)
|
|
222
|
-
c1:Stop()
|
|
223
|
-
ctx:Expect(c1:IsCompleted()):ToBe(true)
|
|
224
|
-
end)
|
|
225
|
-
end)
|
|
226
|
-
|
|
227
|
-
ctx:Describe("Await", function()
|
|
228
|
-
ctx:Test("should await concur to be completed", function()
|
|
229
|
-
local c1 = Concur.defer(function()
|
|
230
|
-
return 10
|
|
231
|
-
end)
|
|
232
|
-
local err, val = c1:Await(1)
|
|
233
|
-
ctx:Expect(err):ToBeNil()
|
|
234
|
-
ctx:Expect(val):ToBe(10)
|
|
235
|
-
end)
|
|
236
|
-
|
|
237
|
-
ctx:Test("should await concur to be completed even if error", function()
|
|
238
|
-
local c1 = Concur.defer(function()
|
|
239
|
-
return error("err")
|
|
240
|
-
end)
|
|
241
|
-
local err, val = c1:Await(1)
|
|
242
|
-
ctx:Expect(err):ToBeOk()
|
|
243
|
-
ctx:Expect(val):ToBeNil()
|
|
244
|
-
end)
|
|
245
|
-
|
|
246
|
-
ctx:Test("should await concur to be completed even if stopped", function()
|
|
247
|
-
local c1 = Concur.delay(0.1, function()
|
|
248
|
-
return 10
|
|
249
|
-
end)
|
|
250
|
-
task.defer(function()
|
|
251
|
-
c1:Stop()
|
|
252
|
-
end)
|
|
253
|
-
local err, val = c1:Await(1)
|
|
254
|
-
ctx:Expect(err):ToBe(Concur.Errors.Stopped)
|
|
255
|
-
ctx:Expect(val):ToBeNil()
|
|
256
|
-
end)
|
|
257
|
-
|
|
258
|
-
ctx:Test("should return completed values immediately if already completed", function()
|
|
259
|
-
local c1 = Concur.spawn(function()
|
|
260
|
-
return 10
|
|
261
|
-
end)
|
|
262
|
-
ctx:Expect(c1:IsCompleted()):ToBe(true)
|
|
263
|
-
local err, val = c1:Await()
|
|
264
|
-
ctx:Expect(err):ToBeNil()
|
|
265
|
-
ctx:Expect(val):ToBe(10)
|
|
266
|
-
end)
|
|
267
|
-
|
|
268
|
-
ctx:Test("should timeout", function()
|
|
269
|
-
local c1 = Concur.delay(0.2, function()
|
|
270
|
-
return 10
|
|
271
|
-
end)
|
|
272
|
-
local err, val = c1:Await(0.1)
|
|
273
|
-
ctx:Expect(err):ToBe(Concur.Errors.Timeout)
|
|
274
|
-
ctx:Expect(val):ToBeNil()
|
|
275
|
-
err, val = c1:Await()
|
|
276
|
-
ctx:Expect(err):ToBeNil()
|
|
277
|
-
ctx:Expect(val):ToBe(10)
|
|
278
|
-
end)
|
|
279
|
-
end)
|
|
280
|
-
|
|
281
|
-
ctx:Describe("OnCompleted", function()
|
|
282
|
-
ctx:Test("should fire function once completed", function()
|
|
283
|
-
local awaiter = Awaiter(0.1)
|
|
284
|
-
local c1 = Concur.defer(function()
|
|
285
|
-
return 10
|
|
286
|
-
end)
|
|
287
|
-
ctx:Expect(c1:IsCompleted()):ToBe(false)
|
|
288
|
-
c1:OnCompleted(function(err, val)
|
|
289
|
-
awaiter.Resume(err, val)
|
|
290
|
-
end)
|
|
291
|
-
local err, val = awaiter.Yield()
|
|
292
|
-
ctx:Expect(err):ToBeNil()
|
|
293
|
-
ctx:Expect(val):ToBe(10)
|
|
294
|
-
end)
|
|
295
|
-
|
|
296
|
-
ctx:Test("should fire function even if already completed", function()
|
|
297
|
-
local c1 = Concur.spawn(function()
|
|
298
|
-
return 10
|
|
299
|
-
end)
|
|
300
|
-
ctx:Expect(c1:IsCompleted()):ToBe(true)
|
|
301
|
-
local err, val
|
|
302
|
-
c1:OnCompleted(function(e, v)
|
|
303
|
-
err, val = e, v
|
|
304
|
-
end)
|
|
305
|
-
ctx:Expect(err):ToBeNil()
|
|
306
|
-
ctx:Expect(val):ToBe(10)
|
|
307
|
-
end)
|
|
308
|
-
|
|
309
|
-
ctx:Test("should fire function even if error", function()
|
|
310
|
-
local awaiter = Awaiter(0.1)
|
|
311
|
-
local c1 = Concur.defer(function()
|
|
312
|
-
error("err")
|
|
313
|
-
end)
|
|
314
|
-
c1:OnCompleted(function(err, val)
|
|
315
|
-
awaiter.Resume(err, val)
|
|
316
|
-
end)
|
|
317
|
-
local err, val = awaiter.Yield()
|
|
318
|
-
ctx:Expect(err):ToBeOk()
|
|
319
|
-
ctx:Expect(val):ToBeNil()
|
|
320
|
-
end)
|
|
321
|
-
|
|
322
|
-
ctx:Test("should fire function even if stopped", function()
|
|
323
|
-
local awaiter = Awaiter(0.2)
|
|
324
|
-
local c1 = Concur.delay(0.1, function()
|
|
325
|
-
error("err")
|
|
326
|
-
end)
|
|
327
|
-
c1:OnCompleted(function(err, val)
|
|
328
|
-
awaiter.Resume(err, val)
|
|
329
|
-
end)
|
|
330
|
-
task.defer(function()
|
|
331
|
-
c1:Stop()
|
|
332
|
-
end)
|
|
333
|
-
local err, val = awaiter.Yield()
|
|
334
|
-
ctx:Expect(err):ToBe(Concur.Errors.Stopped)
|
|
335
|
-
ctx:Expect(val):ToBeNil()
|
|
336
|
-
end)
|
|
337
|
-
|
|
338
|
-
ctx:Test("should fire function even if timeout", function()
|
|
339
|
-
local awaiter = Awaiter(0.5)
|
|
340
|
-
local c1 = Concur.delay(0.2, function()
|
|
341
|
-
error("err")
|
|
342
|
-
end)
|
|
343
|
-
c1:OnCompleted(function(err, val)
|
|
344
|
-
awaiter.Resume(err, val)
|
|
345
|
-
end, 0.1)
|
|
346
|
-
local err, val = awaiter.Yield()
|
|
347
|
-
ctx:Expect(err):ToBe(Concur.Errors.Timeout)
|
|
348
|
-
ctx:Expect(val):ToBeNil()
|
|
349
|
-
end)
|
|
350
|
-
|
|
351
|
-
ctx:Test("should unbind function", function()
|
|
352
|
-
local c1 = Concur.defer(function() end)
|
|
353
|
-
local val = nil
|
|
354
|
-
local unbind = c1:OnCompleted(function()
|
|
355
|
-
val = 10
|
|
356
|
-
end)
|
|
357
|
-
unbind()
|
|
358
|
-
local err = c1:Await()
|
|
359
|
-
ctx:Expect(err):ToBeNil()
|
|
360
|
-
task.wait()
|
|
361
|
-
ctx:Expect(val):ToBeNil()
|
|
362
|
-
end)
|
|
363
|
-
end)
|
|
364
|
-
end
|
|
1
|
+
local ServerScriptService = game:GetService("ServerScriptService")
|
|
2
|
+
|
|
3
|
+
local Test = require(ServerScriptService.TestRunner.Test)
|
|
4
|
+
|
|
5
|
+
return function(ctx: Test.TestContext)
|
|
6
|
+
local Concur = require(script.Parent)
|
|
7
|
+
|
|
8
|
+
local function Awaiter(timeout: number)
|
|
9
|
+
local awaiter = {}
|
|
10
|
+
local thread
|
|
11
|
+
local delayThread
|
|
12
|
+
function awaiter.Resume(...)
|
|
13
|
+
if coroutine.running() ~= delayThread then
|
|
14
|
+
task.cancel(delayThread)
|
|
15
|
+
end
|
|
16
|
+
task.spawn(thread, ...)
|
|
17
|
+
end
|
|
18
|
+
function awaiter.Yield()
|
|
19
|
+
thread = coroutine.running()
|
|
20
|
+
delayThread = task.delay(timeout, function()
|
|
21
|
+
awaiter.Resume()
|
|
22
|
+
end)
|
|
23
|
+
return coroutine.yield()
|
|
24
|
+
end
|
|
25
|
+
return awaiter
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
local bindableEvent
|
|
29
|
+
ctx:BeforeEach(function()
|
|
30
|
+
bindableEvent = Instance.new("BindableEvent")
|
|
31
|
+
end)
|
|
32
|
+
ctx:AfterEach(function()
|
|
33
|
+
bindableEvent:Destroy()
|
|
34
|
+
bindableEvent = nil
|
|
35
|
+
end)
|
|
36
|
+
|
|
37
|
+
ctx:Describe("Single", function()
|
|
38
|
+
ctx:Test("should spawn a new concur instance", function()
|
|
39
|
+
local value = nil
|
|
40
|
+
ctx:Expect(function()
|
|
41
|
+
Concur.spawn(function()
|
|
42
|
+
value = 10
|
|
43
|
+
end)
|
|
44
|
+
end)
|
|
45
|
+
:Not()
|
|
46
|
+
:ToThrow()
|
|
47
|
+
ctx:Expect(value):ToBe(10)
|
|
48
|
+
end)
|
|
49
|
+
|
|
50
|
+
ctx:Test("should defer a new concur instance", function()
|
|
51
|
+
local awaiter = Awaiter(1)
|
|
52
|
+
ctx:Expect(function()
|
|
53
|
+
Concur.defer(function()
|
|
54
|
+
awaiter.Resume(10)
|
|
55
|
+
end)
|
|
56
|
+
end)
|
|
57
|
+
:Not()
|
|
58
|
+
:ToThrow()
|
|
59
|
+
local value = awaiter.Yield()
|
|
60
|
+
ctx:Expect(value):ToBe(10)
|
|
61
|
+
end)
|
|
62
|
+
|
|
63
|
+
ctx:Test("should delay a new concur instance", function()
|
|
64
|
+
local awaiter = Awaiter(1)
|
|
65
|
+
ctx:Expect(function()
|
|
66
|
+
Concur.delay(0.1, function()
|
|
67
|
+
awaiter.Resume(10)
|
|
68
|
+
end)
|
|
69
|
+
end)
|
|
70
|
+
:Not()
|
|
71
|
+
:ToThrow()
|
|
72
|
+
local value = awaiter.Yield()
|
|
73
|
+
ctx:Expect(value):ToBe(10)
|
|
74
|
+
end)
|
|
75
|
+
|
|
76
|
+
ctx:Test("should create an immediate value concur instance", function()
|
|
77
|
+
local c
|
|
78
|
+
ctx:Expect(function()
|
|
79
|
+
c = Concur.value(10)
|
|
80
|
+
end)
|
|
81
|
+
:Not()
|
|
82
|
+
:ToThrow()
|
|
83
|
+
ctx:Expect(c):ToBeOk()
|
|
84
|
+
ctx:Expect(c:IsCompleted()):ToBe(true)
|
|
85
|
+
local err, val = c:Await()
|
|
86
|
+
ctx:Expect(err):ToBeNil()
|
|
87
|
+
ctx:Expect(val):ToBe(10)
|
|
88
|
+
end)
|
|
89
|
+
|
|
90
|
+
ctx:Test("should create a concur instance to watch an event with no predicate", function()
|
|
91
|
+
local c
|
|
92
|
+
ctx:Expect(function()
|
|
93
|
+
c = Concur.event(bindableEvent.Event)
|
|
94
|
+
end)
|
|
95
|
+
:Not()
|
|
96
|
+
:ToThrow()
|
|
97
|
+
ctx:Expect(c:IsCompleted()):ToBe(false)
|
|
98
|
+
bindableEvent:Fire(10)
|
|
99
|
+
local err, val = c:Await(1)
|
|
100
|
+
ctx:Expect(err):ToBeNil()
|
|
101
|
+
ctx:Expect(val):ToBe(10)
|
|
102
|
+
end)
|
|
103
|
+
|
|
104
|
+
ctx:Test("should create a concur instance to watch an event with a predicate", function()
|
|
105
|
+
local c
|
|
106
|
+
ctx:Expect(function()
|
|
107
|
+
c = Concur.event(bindableEvent.Event, function(v)
|
|
108
|
+
return v < 10
|
|
109
|
+
end)
|
|
110
|
+
end)
|
|
111
|
+
:Not()
|
|
112
|
+
:ToThrow()
|
|
113
|
+
ctx:Expect(c:IsCompleted()):ToBe(false)
|
|
114
|
+
bindableEvent:Fire(10)
|
|
115
|
+
bindableEvent:Fire(5)
|
|
116
|
+
local err, val = c:Await(1)
|
|
117
|
+
ctx:Expect(err):ToBeNil()
|
|
118
|
+
ctx:Expect(val):ToBe(5)
|
|
119
|
+
end)
|
|
120
|
+
end)
|
|
121
|
+
|
|
122
|
+
ctx:Describe("Multi", function()
|
|
123
|
+
ctx:Test("should complete all concur instances", function()
|
|
124
|
+
local c1 = Concur.spawn(function()
|
|
125
|
+
return 10
|
|
126
|
+
end)
|
|
127
|
+
local c2 = Concur.defer(function()
|
|
128
|
+
return 20
|
|
129
|
+
end)
|
|
130
|
+
local c3 = Concur.delay(0, function()
|
|
131
|
+
return 30
|
|
132
|
+
end)
|
|
133
|
+
local c4 = Concur.spawn(function()
|
|
134
|
+
error("fail")
|
|
135
|
+
end)
|
|
136
|
+
local c5 = Concur.event(bindableEvent.Event)
|
|
137
|
+
local c = Concur.all({ c1, c2, c3, c4, c5 })
|
|
138
|
+
ctx:Expect(c:IsCompleted()):ToBe(false)
|
|
139
|
+
bindableEvent:Fire(40)
|
|
140
|
+
local err, res = c:Await(1)
|
|
141
|
+
ctx:Expect(err):ToBeNil()
|
|
142
|
+
ctx:Expect(res[1][1]):ToBeNil()
|
|
143
|
+
ctx:Expect(res[1][2]):ToBe(10)
|
|
144
|
+
ctx:Expect(res[2][1]):ToBeNil()
|
|
145
|
+
ctx:Expect(res[2][2]):ToBe(20)
|
|
146
|
+
ctx:Expect(res[3][1]):ToBeNil()
|
|
147
|
+
ctx:Expect(res[3][2]):ToBe(30)
|
|
148
|
+
ctx:Expect(res[4][1]):ToBeOk()
|
|
149
|
+
ctx:Expect(res[4][2]):ToBeNil()
|
|
150
|
+
ctx:Expect(res[5][1]):ToBeNil()
|
|
151
|
+
ctx:Expect(res[5][2]):ToBe(40)
|
|
152
|
+
end)
|
|
153
|
+
|
|
154
|
+
ctx:Test("should complete the first concur instance", function()
|
|
155
|
+
local c1 = Concur.defer(function()
|
|
156
|
+
return 10
|
|
157
|
+
end)
|
|
158
|
+
local c2 = Concur.spawn(function()
|
|
159
|
+
return 20
|
|
160
|
+
end)
|
|
161
|
+
local c = Concur.first({ c1, c2 })
|
|
162
|
+
local err, res = c:Await(1)
|
|
163
|
+
ctx:Expect(err):ToBeNil()
|
|
164
|
+
ctx:Expect(res):ToBe(20)
|
|
165
|
+
end)
|
|
166
|
+
end)
|
|
167
|
+
|
|
168
|
+
ctx:Describe("Stop", function()
|
|
169
|
+
ctx:Test("should stop a single concur", function()
|
|
170
|
+
local c1 = Concur.defer(function()
|
|
171
|
+
return 10
|
|
172
|
+
end)
|
|
173
|
+
ctx:Expect(c1:IsCompleted()):ToBe(false)
|
|
174
|
+
c1:Stop()
|
|
175
|
+
ctx:Expect(c1:IsCompleted()):ToBe(true)
|
|
176
|
+
local err, val = c1:Await()
|
|
177
|
+
ctx:Expect(err):ToBe(Concur.Errors.Stopped)
|
|
178
|
+
ctx:Expect(val):ToBeNil()
|
|
179
|
+
end)
|
|
180
|
+
|
|
181
|
+
ctx:Test("should stop multiple concurs", function()
|
|
182
|
+
local c1 = Concur.defer(function() end)
|
|
183
|
+
local c2 = Concur.delay(1, function() end)
|
|
184
|
+
local c3 = Concur.event(bindableEvent.Event)
|
|
185
|
+
local c = Concur.all({ c1, c2, c3 })
|
|
186
|
+
c:Stop()
|
|
187
|
+
local err, val = c:Await()
|
|
188
|
+
ctx:Expect(err):ToBe(Concur.Errors.Stopped)
|
|
189
|
+
ctx:Expect(val):ToBeNil()
|
|
190
|
+
end)
|
|
191
|
+
|
|
192
|
+
ctx:Test("should not stop an already completed concur", function()
|
|
193
|
+
local c1 = Concur.spawn(function()
|
|
194
|
+
return 10
|
|
195
|
+
end)
|
|
196
|
+
ctx:Expect(c1:IsCompleted()):ToBe(true)
|
|
197
|
+
c1:Stop()
|
|
198
|
+
local err, val = c1:Await()
|
|
199
|
+
ctx:Expect(err):ToBeNil()
|
|
200
|
+
ctx:Expect(val):ToBe(10)
|
|
201
|
+
end)
|
|
202
|
+
end)
|
|
203
|
+
|
|
204
|
+
ctx:Describe("IsCompleted", function()
|
|
205
|
+
ctx:Test("should correctly check if a concur instance is completed", function()
|
|
206
|
+
local c1 = Concur.defer(function() end)
|
|
207
|
+
ctx:Expect(c1:IsCompleted()):ToBe(false)
|
|
208
|
+
local err = c1:Await()
|
|
209
|
+
ctx:Expect(err):ToBeNil()
|
|
210
|
+
ctx:Expect(c1:IsCompleted()):ToBe(true)
|
|
211
|
+
end)
|
|
212
|
+
|
|
213
|
+
ctx:Test("should be marked as completed if error", function()
|
|
214
|
+
local c1 = Concur.spawn(function()
|
|
215
|
+
error("err")
|
|
216
|
+
end)
|
|
217
|
+
ctx:Expect(c1:IsCompleted()):ToBe(true)
|
|
218
|
+
end)
|
|
219
|
+
|
|
220
|
+
ctx:Test("should be marked as completed if stopped", function()
|
|
221
|
+
local c1 = Concur.defer(function() end)
|
|
222
|
+
c1:Stop()
|
|
223
|
+
ctx:Expect(c1:IsCompleted()):ToBe(true)
|
|
224
|
+
end)
|
|
225
|
+
end)
|
|
226
|
+
|
|
227
|
+
ctx:Describe("Await", function()
|
|
228
|
+
ctx:Test("should await concur to be completed", function()
|
|
229
|
+
local c1 = Concur.defer(function()
|
|
230
|
+
return 10
|
|
231
|
+
end)
|
|
232
|
+
local err, val = c1:Await(1)
|
|
233
|
+
ctx:Expect(err):ToBeNil()
|
|
234
|
+
ctx:Expect(val):ToBe(10)
|
|
235
|
+
end)
|
|
236
|
+
|
|
237
|
+
ctx:Test("should await concur to be completed even if error", function()
|
|
238
|
+
local c1 = Concur.defer(function()
|
|
239
|
+
return error("err")
|
|
240
|
+
end)
|
|
241
|
+
local err, val = c1:Await(1)
|
|
242
|
+
ctx:Expect(err):ToBeOk()
|
|
243
|
+
ctx:Expect(val):ToBeNil()
|
|
244
|
+
end)
|
|
245
|
+
|
|
246
|
+
ctx:Test("should await concur to be completed even if stopped", function()
|
|
247
|
+
local c1 = Concur.delay(0.1, function()
|
|
248
|
+
return 10
|
|
249
|
+
end)
|
|
250
|
+
task.defer(function()
|
|
251
|
+
c1:Stop()
|
|
252
|
+
end)
|
|
253
|
+
local err, val = c1:Await(1)
|
|
254
|
+
ctx:Expect(err):ToBe(Concur.Errors.Stopped)
|
|
255
|
+
ctx:Expect(val):ToBeNil()
|
|
256
|
+
end)
|
|
257
|
+
|
|
258
|
+
ctx:Test("should return completed values immediately if already completed", function()
|
|
259
|
+
local c1 = Concur.spawn(function()
|
|
260
|
+
return 10
|
|
261
|
+
end)
|
|
262
|
+
ctx:Expect(c1:IsCompleted()):ToBe(true)
|
|
263
|
+
local err, val = c1:Await()
|
|
264
|
+
ctx:Expect(err):ToBeNil()
|
|
265
|
+
ctx:Expect(val):ToBe(10)
|
|
266
|
+
end)
|
|
267
|
+
|
|
268
|
+
ctx:Test("should timeout", function()
|
|
269
|
+
local c1 = Concur.delay(0.2, function()
|
|
270
|
+
return 10
|
|
271
|
+
end)
|
|
272
|
+
local err, val = c1:Await(0.1)
|
|
273
|
+
ctx:Expect(err):ToBe(Concur.Errors.Timeout)
|
|
274
|
+
ctx:Expect(val):ToBeNil()
|
|
275
|
+
err, val = c1:Await()
|
|
276
|
+
ctx:Expect(err):ToBeNil()
|
|
277
|
+
ctx:Expect(val):ToBe(10)
|
|
278
|
+
end)
|
|
279
|
+
end)
|
|
280
|
+
|
|
281
|
+
ctx:Describe("OnCompleted", function()
|
|
282
|
+
ctx:Test("should fire function once completed", function()
|
|
283
|
+
local awaiter = Awaiter(0.1)
|
|
284
|
+
local c1 = Concur.defer(function()
|
|
285
|
+
return 10
|
|
286
|
+
end)
|
|
287
|
+
ctx:Expect(c1:IsCompleted()):ToBe(false)
|
|
288
|
+
c1:OnCompleted(function(err, val)
|
|
289
|
+
awaiter.Resume(err, val)
|
|
290
|
+
end)
|
|
291
|
+
local err, val = awaiter.Yield()
|
|
292
|
+
ctx:Expect(err):ToBeNil()
|
|
293
|
+
ctx:Expect(val):ToBe(10)
|
|
294
|
+
end)
|
|
295
|
+
|
|
296
|
+
ctx:Test("should fire function even if already completed", function()
|
|
297
|
+
local c1 = Concur.spawn(function()
|
|
298
|
+
return 10
|
|
299
|
+
end)
|
|
300
|
+
ctx:Expect(c1:IsCompleted()):ToBe(true)
|
|
301
|
+
local err, val
|
|
302
|
+
c1:OnCompleted(function(e, v)
|
|
303
|
+
err, val = e, v
|
|
304
|
+
end)
|
|
305
|
+
ctx:Expect(err):ToBeNil()
|
|
306
|
+
ctx:Expect(val):ToBe(10)
|
|
307
|
+
end)
|
|
308
|
+
|
|
309
|
+
ctx:Test("should fire function even if error", function()
|
|
310
|
+
local awaiter = Awaiter(0.1)
|
|
311
|
+
local c1 = Concur.defer(function()
|
|
312
|
+
error("err")
|
|
313
|
+
end)
|
|
314
|
+
c1:OnCompleted(function(err, val)
|
|
315
|
+
awaiter.Resume(err, val)
|
|
316
|
+
end)
|
|
317
|
+
local err, val = awaiter.Yield()
|
|
318
|
+
ctx:Expect(err):ToBeOk()
|
|
319
|
+
ctx:Expect(val):ToBeNil()
|
|
320
|
+
end)
|
|
321
|
+
|
|
322
|
+
ctx:Test("should fire function even if stopped", function()
|
|
323
|
+
local awaiter = Awaiter(0.2)
|
|
324
|
+
local c1 = Concur.delay(0.1, function()
|
|
325
|
+
error("err")
|
|
326
|
+
end)
|
|
327
|
+
c1:OnCompleted(function(err, val)
|
|
328
|
+
awaiter.Resume(err, val)
|
|
329
|
+
end)
|
|
330
|
+
task.defer(function()
|
|
331
|
+
c1:Stop()
|
|
332
|
+
end)
|
|
333
|
+
local err, val = awaiter.Yield()
|
|
334
|
+
ctx:Expect(err):ToBe(Concur.Errors.Stopped)
|
|
335
|
+
ctx:Expect(val):ToBeNil()
|
|
336
|
+
end)
|
|
337
|
+
|
|
338
|
+
ctx:Test("should fire function even if timeout", function()
|
|
339
|
+
local awaiter = Awaiter(0.5)
|
|
340
|
+
local c1 = Concur.delay(0.2, function()
|
|
341
|
+
error("err")
|
|
342
|
+
end)
|
|
343
|
+
c1:OnCompleted(function(err, val)
|
|
344
|
+
awaiter.Resume(err, val)
|
|
345
|
+
end, 0.1)
|
|
346
|
+
local err, val = awaiter.Yield()
|
|
347
|
+
ctx:Expect(err):ToBe(Concur.Errors.Timeout)
|
|
348
|
+
ctx:Expect(val):ToBeNil()
|
|
349
|
+
end)
|
|
350
|
+
|
|
351
|
+
ctx:Test("should unbind function", function()
|
|
352
|
+
local c1 = Concur.defer(function() end)
|
|
353
|
+
local val = nil
|
|
354
|
+
local unbind = c1:OnCompleted(function()
|
|
355
|
+
val = 10
|
|
356
|
+
end)
|
|
357
|
+
unbind()
|
|
358
|
+
local err = c1:Await()
|
|
359
|
+
ctx:Expect(err):ToBeNil()
|
|
360
|
+
task.wait()
|
|
361
|
+
ctx:Expect(val):ToBeNil()
|
|
362
|
+
end)
|
|
363
|
+
end)
|
|
364
|
+
end
|