aboutsummaryrefslogtreecommitdiff
path: root/unit_tests
diff options
context:
space:
mode:
Diffstat (limited to 'unit_tests')
-rw-r--r--unit_tests/Catch2.runsettings29
-rw-r--r--unit_tests/UnitTests.vcxproj457
-rw-r--r--unit_tests/UnitTests.vcxproj.filters50
-rw-r--r--unit_tests/UnitTests.vcxproj.user143
-rw-r--r--unit_tests/_pch.cpp14
-rw-r--r--unit_tests/_pch.hpp2
-rw-r--r--unit_tests/deep_tests.cpp11
-rw-r--r--unit_tests/embedded_tests.cpp24
-rw-r--r--unit_tests/init_and_shutdown.cpp962
-rw-r--r--unit_tests/lane_tests.cpp260
-rw-r--r--unit_tests/legacy_tests.cpp4
-rw-r--r--unit_tests/linda_tests.cpp333
-rw-r--r--unit_tests/scripts/_utils.lua20
-rw-r--r--unit_tests/scripts/_utils54.lua30
-rw-r--r--unit_tests/scripts/coro/basics.lua97
-rw-r--r--unit_tests/scripts/coro/cancelling_suspended.lua31
-rw-r--r--unit_tests/scripts/coro/collect_yielded_lane.lua64
-rw-r--r--unit_tests/scripts/coro/error_handling.lua6
-rw-r--r--unit_tests/scripts/coro/index_suspended.lua28
-rw-r--r--unit_tests/scripts/coro/join_suspended.lua24
-rw-r--r--unit_tests/scripts/coro/linda_in_close_handler.lua43
-rw-r--r--unit_tests/scripts/coro/regular_function.lua38
-rw-r--r--unit_tests/scripts/coro/resume_basics.lua40
-rw-r--r--unit_tests/scripts/coro/yielding_in_non_coro_errors.lua28
-rw-r--r--unit_tests/scripts/lane/body_is_a_c_function.lua28
-rw-r--r--unit_tests/scripts/lane/cooperative_shutdown.lua22
-rw-r--r--unit_tests/scripts/lane/stdlib_naming.lua2
-rw-r--r--unit_tests/scripts/lane/tasking_basic.lua2
-rw-r--r--unit_tests/scripts/lane/tasking_cancelling.lua118
-rw-r--r--unit_tests/scripts/lane/tasking_cancelling_with_hook.lua68
-rw-r--r--unit_tests/scripts/lane/tasking_comms_criss_cross.lua4
-rw-r--r--unit_tests/scripts/lane/tasking_communications.lua6
-rw-r--r--unit_tests/scripts/lane/tasking_error.lua2
-rw-r--r--unit_tests/scripts/lane/tasking_join_test.lua16
-rw-r--r--unit_tests/scripts/lane/tasking_send_receive_code.lua22
-rw-r--r--unit_tests/scripts/lane/uncooperative_shutdown.lua6
-rw-r--r--unit_tests/scripts/linda/multiple_keepers.lua6
-rw-r--r--unit_tests/scripts/linda/send_receive_func_and_string.lua13
-rw-r--r--unit_tests/scripts/linda/send_registered_userdata.lua2
-rw-r--r--unit_tests/scripts/linda/wake_period.lua42
-rw-r--r--unit_tests/scripts/misc/deeptest.lua161
-rw-r--r--unit_tests/shared.cpp127
-rw-r--r--unit_tests/shared.h7
43 files changed, 2174 insertions, 1218 deletions
diff --git a/unit_tests/Catch2.runsettings b/unit_tests/Catch2.runsettings
deleted file mode 100644
index fcf7f5a..0000000
--- a/unit_tests/Catch2.runsettings
+++ /dev/null
@@ -1,29 +0,0 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- https://github.com/JohnnyHendriks/TestAdapter_Catch2/blob/main/Docs/Settings.md -->
3<RunSettings>
4 <Catch2Adapter>
5 <DiscoverCommandLine>--list-tests --verbosity high</DiscoverCommandLine>
6 <DiscoverTimeout>300000</DiscoverTimeout>
7
8 <!-- Executable Filename
9 Discover filenames with ... (must not include the .exe extension)
10 Regex breakdown: ^foo(_(.+))+(p|r|d)(_?(.+))x*$
11 - ^foo : find file that starts with foo
12 - (_(.+))+ : follows with a number of elements starting with _ (_foo_bar_dll)
13 - (r|d|p) : contains a word with one of these letters : r (release), d (debug), p (profile).
14 - (_?(.+)): optionally follow with underscores.
15 - x*$ end of line
16 -->
17 <FilenameFilter>UnitTests</FilenameFilter>
18
19 <!-- Enable breaking on failure -->
20 <DebugBreak>on</DebugBreak>
21
22 <!-- Combine: A single test executable is started to run multiple test cases. (Single: instance per test case) -->
23 <ExecutionMode>Combine</ExecutionMode>
24
25 <!-- Working directory -->
26 <WorkingDirectoryRoot>Solution</WorkingDirectoryRoot>
27 <WorkingDirectory>.</WorkingDirectory>
28 </Catch2Adapter>
29</RunSettings> \ No newline at end of file
diff --git a/unit_tests/UnitTests.vcxproj b/unit_tests/UnitTests.vcxproj
index 013a84f..2093063 100644
--- a/unit_tests/UnitTests.vcxproj
+++ b/unit_tests/UnitTests.vcxproj
@@ -45,28 +45,52 @@
45 <Configuration>Debug 5.4</Configuration> 45 <Configuration>Debug 5.4</Configuration>
46 <Platform>Win32</Platform> 46 <Platform>Win32</Platform>
47 </ProjectConfiguration> 47 </ProjectConfiguration>
48 <ProjectConfiguration Include="Debug LuaJIT|Prospero"> 48 <ProjectConfiguration Include="Debug 5.5|Prospero">
49 <Configuration>Debug LuaJIT</Configuration> 49 <Configuration>Debug 5.5</Configuration>
50 <Platform>Prospero</Platform> 50 <Platform>Prospero</Platform>
51 </ProjectConfiguration> 51 </ProjectConfiguration>
52 <ProjectConfiguration Include="Debug LuaJIT|Win32"> 52 <ProjectConfiguration Include="Debug 5.5|Win32">
53 <Configuration>Debug LuaJIT</Configuration> 53 <Configuration>Debug 5.5</Configuration>
54 <Platform>Win32</Platform> 54 <Platform>Win32</Platform>
55 </ProjectConfiguration> 55 </ProjectConfiguration>
56 <ProjectConfiguration Include="Debug LuaJIT|x64"> 56 <ProjectConfiguration Include="Debug 5.5|x64">
57 <Configuration>Debug LuaJIT</Configuration> 57 <Configuration>Debug 5.5</Configuration>
58 <Platform>x64</Platform> 58 <Platform>x64</Platform>
59 </ProjectConfiguration> 59 </ProjectConfiguration>
60 <ProjectConfiguration Include="Debug MoonJIT|Prospero"> 60 <ProjectConfiguration Include="Release 5.5|Prospero">
61 <Configuration>Debug MoonJIT</Configuration> 61 <Configuration>Release 5.5</Configuration>
62 <Platform>Prospero</Platform> 62 <Platform>Prospero</Platform>
63 </ProjectConfiguration> 63 </ProjectConfiguration>
64 <ProjectConfiguration Include="Debug MoonJIT|Win32"> 64 <ProjectConfiguration Include="Release 5.5|Win32">
65 <Configuration>Debug MoonJIT</Configuration> 65 <Configuration>Release 5.5</Configuration>
66 <Platform>Win32</Platform> 66 <Platform>Win32</Platform>
67 </ProjectConfiguration> 67 </ProjectConfiguration>
68 <ProjectConfiguration Include="Debug MoonJIT|x64"> 68 <ProjectConfiguration Include="Release 5.5|x64">
69 <Configuration>Debug MoonJIT</Configuration> 69 <Configuration>Release 5.5</Configuration>
70 <Platform>x64</Platform>
71 </ProjectConfiguration>
72 <ProjectConfiguration Include="Release LuaJIT|Prospero">
73 <Configuration>Release LuaJIT</Configuration>
74 <Platform>Prospero</Platform>
75 </ProjectConfiguration>
76 <ProjectConfiguration Include="Release LuaJIT|Win32">
77 <Configuration>Release LuaJIT</Configuration>
78 <Platform>Win32</Platform>
79 </ProjectConfiguration>
80 <ProjectConfiguration Include="Release LuaJIT|x64">
81 <Configuration>Release LuaJIT</Configuration>
82 <Platform>x64</Platform>
83 </ProjectConfiguration>
84 <ProjectConfiguration Include="Release MoonJIT|Prospero">
85 <Configuration>Release MoonJIT</Configuration>
86 <Platform>Prospero</Platform>
87 </ProjectConfiguration>
88 <ProjectConfiguration Include="Release MoonJIT|Win32">
89 <Configuration>Release MoonJIT</Configuration>
90 <Platform>Win32</Platform>
91 </ProjectConfiguration>
92 <ProjectConfiguration Include="Release MoonJIT|x64">
93 <Configuration>Release MoonJIT</Configuration>
70 <Platform>x64</Platform> 94 <Platform>x64</Platform>
71 </ProjectConfiguration> 95 </ProjectConfiguration>
72 <ProjectConfiguration Include="Release 5.1|Prospero"> 96 <ProjectConfiguration Include="Release 5.1|Prospero">
@@ -125,7 +149,7 @@
125 <PropertyGroup Label="Globals"> 149 <PropertyGroup Label="Globals">
126 <ProjectGuid>{aed7f42f-139a-46ba-80fe-16e062ea1345}</ProjectGuid> 150 <ProjectGuid>{aed7f42f-139a-46ba-80fe-16e062ea1345}</ProjectGuid>
127 <Keyword>Win32Proj</Keyword> 151 <Keyword>Win32Proj</Keyword>
128 <WindowsTargetPlatformVersion>10.0.22621.0</WindowsTargetPlatformVersion> 152 <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
129 <ConfigurationType>Application</ConfigurationType> 153 <ConfigurationType>Application</ConfigurationType>
130 <PlatformToolset>v143</PlatformToolset> 154 <PlatformToolset>v143</PlatformToolset>
131 <CharacterSet>Unicode</CharacterSet> 155 <CharacterSet>Unicode</CharacterSet>
@@ -143,10 +167,13 @@
143 <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|x64'"> 167 <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|x64'">
144 <UseDebugLibraries>true</UseDebugLibraries> 168 <UseDebugLibraries>true</UseDebugLibraries>
145 </PropertyGroup> 169 </PropertyGroup>
146 <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug LuaJIT|x64'"> 170 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.5|x64'" Label="Configuration">
171 <UseDebugLibraries>true</UseDebugLibraries>
172 </PropertyGroup>
173 <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release LuaJIT|x64'">
147 <UseDebugLibraries>true</UseDebugLibraries> 174 <UseDebugLibraries>true</UseDebugLibraries>
148 </PropertyGroup> 175 </PropertyGroup>
149 <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug MoonJIT|x64'"> 176 <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release MoonJIT|x64'">
150 <UseDebugLibraries>true</UseDebugLibraries> 177 <UseDebugLibraries>true</UseDebugLibraries>
151 </PropertyGroup> 178 </PropertyGroup>
152 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> 179 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@@ -155,85 +182,125 @@
155 <ImportGroup Label="PropertySheets" /> 182 <ImportGroup Label="PropertySheets" />
156 <PropertyGroup Label="UserMacros" /> 183 <PropertyGroup Label="UserMacros" />
157 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|Win32'"> 184 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|Win32'">
158 <OutDir>$(SolutionDir)..\..\..\Lua54\bin\$(Platform)\Debug\</OutDir> 185 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
159 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir> 186 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
187 <LinkIncremental>false</LinkIncremental>
188 </PropertyGroup>
189 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.5|Win32'">
190 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
191 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
192 <LinkIncremental>false</LinkIncremental>
160 </PropertyGroup> 193 </PropertyGroup>
161 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|Win32'"> 194 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|Win32'">
162 <OutDir>$(SolutionDir)..\..\..\Lua53\bin\$(Platform)\Debug\</OutDir> 195 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
163 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir> 196 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
197 <LinkIncremental>false</LinkIncremental>
164 </PropertyGroup> 198 </PropertyGroup>
165 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.3|Win32'"> 199 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.3|Win32'">
166 <OutDir>$(SolutionDir)..\..\..\Lua53\bin\$(Platform)\Release\</OutDir> 200 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
167 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir> 201 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
202 <LinkIncremental>false</LinkIncremental>
168 </PropertyGroup> 203 </PropertyGroup>
169 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.2|Win32'"> 204 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.2|Win32'">
170 <OutDir>$(SolutionDir)..\..\..\Lua52\bin\$(Platform)\Debug\</OutDir> 205 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
171 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir> 206 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
207 <LinkIncremental>false</LinkIncremental>
172 </PropertyGroup> 208 </PropertyGroup>
173 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.2|Win32'"> 209 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.2|Win32'">
174 <OutDir>$(SolutionDir)..\..\..\Lua52\bin\$(Platform)\Release\</OutDir> 210 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
175 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir> 211 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
212 <LinkIncremental>false</LinkIncremental>
176 </PropertyGroup> 213 </PropertyGroup>
177 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|Win32'"> 214 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|Win32'">
178 <OutDir>$(SolutionDir)..\..\..\Lua51\bin\$(Platform)\Debug\</OutDir> 215 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
179 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir> 216 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
217 <LinkIncremental>false</LinkIncremental>
180 </PropertyGroup> 218 </PropertyGroup>
181 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.1|Win32'"> 219 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.1|Win32'">
182 <OutDir>$(SolutionDir)..\..\..\Lua51\bin\$(Platform)\Release\</OutDir> 220 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
183 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir> 221 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
222 <LinkIncremental>false</LinkIncremental>
184 </PropertyGroup> 223 </PropertyGroup>
185 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug LuaJIT|Win32'"> 224 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release LuaJIT|Win32'">
186 <OutDir>$(SolutionDir)..\..\..\LuaJIT\bin\$(Platform)\</OutDir> 225 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
187 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir> 226 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
227 <LinkIncremental>false</LinkIncremental>
188 </PropertyGroup> 228 </PropertyGroup>
189 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug MoonJIT|Win32'"> 229 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release MoonJIT|Win32'">
190 <OutDir>$(SolutionDir)..\..\..\LuaJIT\bin\$(Platform)\</OutDir> 230 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
191 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir> 231 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
232 <LinkIncremental>false</LinkIncremental>
192 </PropertyGroup> 233 </PropertyGroup>
193 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.4|Win32'"> 234 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.4|Win32'">
194 <OutDir>$(SolutionDir)..\..\..\Lua54\bin\$(Platform)\Release\</OutDir> 235 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
236 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
237 <LinkIncremental>false</LinkIncremental>
238 </PropertyGroup>
239 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.5|Win32'">
240 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
195 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir> 241 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
242 <LinkIncremental>false</LinkIncremental>
196 </PropertyGroup> 243 </PropertyGroup>
197 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|x64'"> 244 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|x64'">
198 <OutDir>$(SolutionDir)..\..\..\Lua54\bin\$(Platform)\Debug\</OutDir> 245 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
199 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir> 246 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
247 <LinkIncremental>false</LinkIncremental>
248 </PropertyGroup>
249 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.5|x64'">
250 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
251 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
252 <LinkIncremental>false</LinkIncremental>
200 </PropertyGroup> 253 </PropertyGroup>
201 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|Prospero'" /> 254 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|Prospero'" />
202 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|x64'"> 255 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|x64'">
203 <OutDir>$(SolutionDir)..\..\..\Lua53\bin\$(Platform)\Debug\</OutDir> 256 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
204 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir> 257 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
258 <LinkIncremental>false</LinkIncremental>
205 </PropertyGroup> 259 </PropertyGroup>
206 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.3|x64'"> 260 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.3|x64'">
207 <OutDir>$(SolutionDir)..\..\..\Lua53\bin\$(Platform)\Release\</OutDir> 261 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
208 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir> 262 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
263 <LinkIncremental>false</LinkIncremental>
209 </PropertyGroup> 264 </PropertyGroup>
210 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.2|x64'"> 265 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.2|x64'">
211 <OutDir>$(SolutionDir)..\..\..\Lua52\bin\$(Platform)\Debug\</OutDir> 266 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
212 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir> 267 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
268 <LinkIncremental>false</LinkIncremental>
213 </PropertyGroup> 269 </PropertyGroup>
214 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.2|x64'"> 270 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.2|x64'">
215 <OutDir>$(SolutionDir)..\..\..\Lua52\bin\$(Platform)\Release\</OutDir> 271 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
216 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir> 272 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
273 <LinkIncremental>false</LinkIncremental>
217 </PropertyGroup> 274 </PropertyGroup>
218 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|x64'"> 275 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|x64'">
219 <OutDir>$(SolutionDir)..\..\..\Lua51\bin\$(Platform)\Debug\</OutDir> 276 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
220 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir> 277 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
278 <LinkIncremental>false</LinkIncremental>
221 </PropertyGroup> 279 </PropertyGroup>
222 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.1|x64'"> 280 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.1|x64'">
223 <OutDir>$(SolutionDir)..\..\..\Lua51\bin\$(Platform)\Release\</OutDir> 281 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
224 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir> 282 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
283 <LinkIncremental>false</LinkIncremental>
225 </PropertyGroup> 284 </PropertyGroup>
226 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug LuaJIT|x64'"> 285 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release LuaJIT|x64'">
227 <OutDir>$(SolutionDir)..\..\..\LuaJIT\bin\$(Platform)\</OutDir> 286 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
228 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir> 287 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
288 <LinkIncremental>false</LinkIncremental>
229 </PropertyGroup> 289 </PropertyGroup>
230 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug MoonJIT|x64'"> 290 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release MoonJIT|x64'">
231 <OutDir>$(SolutionDir)..\..\..\LuaJIT\bin\$(Platform)\</OutDir> 291 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
232 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir> 292 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
293 <LinkIncremental>false</LinkIncremental>
233 </PropertyGroup> 294 </PropertyGroup>
234 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.4|x64'"> 295 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.4|x64'">
235 <OutDir>$(SolutionDir)..\..\..\Lua54\bin\$(Platform)\Release\</OutDir> 296 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
236 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir> 297 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
298 <LinkIncremental>false</LinkIncremental>
299 </PropertyGroup>
300 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.5|x64'">
301 <OutDir>$(SolutionDir)_LuaVersions\$(PlatformName)\$(Configuration)\</OutDir>
302 <IntDir>$(SolutionDir)_Tmp\$(ProjectName)\$(PlatformName)\$(Configuration)\</IntDir>
303 <LinkIncremental>false</LinkIncremental>
237 </PropertyGroup> 304 </PropertyGroup>
238 <ItemDefinitionGroup /> 305 <ItemDefinitionGroup />
239 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|Win32'"> 306 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|Win32'">
@@ -241,10 +308,29 @@
241 <PrecompiledHeader>Use</PrecompiledHeader> 308 <PrecompiledHeader>Use</PrecompiledHeader>
242 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 309 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
243 <Optimization>Disabled</Optimization> 310 <Optimization>Disabled</Optimization>
244 <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> 311 <PreprocessorDefinitions>LANES_DEBUG;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
245 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> 312 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
246 <WarningLevel>Level3</WarningLevel> 313 <WarningLevel>Level3</WarningLevel>
247 <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\Lua54\include;$(SolutionDir)..</AdditionalIncludeDirectories> 314 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
315 <LanguageStandard>stdcpp20</LanguageStandard>
316 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
317 </ClCompile>
318 <Link>
319 <GenerateDebugInformation>true</GenerateDebugInformation>
320 <SubSystem>Console</SubSystem>
321 <AdditionalDependencies>lua54.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
322 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
323 </Link>
324 </ItemDefinitionGroup>
325 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.5|Win32'">
326 <ClCompile>
327 <PrecompiledHeader>Use</PrecompiledHeader>
328 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
329 <Optimization>Disabled</Optimization>
330 <PreprocessorDefinitions>LANES_DEBUG;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
331 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
332 <WarningLevel>Level3</WarningLevel>
333 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
248 <LanguageStandard>stdcpp20</LanguageStandard> 334 <LanguageStandard>stdcpp20</LanguageStandard>
249 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> 335 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
250 </ClCompile> 336 </ClCompile>
@@ -252,6 +338,7 @@
252 <GenerateDebugInformation>true</GenerateDebugInformation> 338 <GenerateDebugInformation>true</GenerateDebugInformation>
253 <SubSystem>Console</SubSystem> 339 <SubSystem>Console</SubSystem>
254 <AdditionalDependencies>lua54.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies> 340 <AdditionalDependencies>lua54.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
341 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
255 </Link> 342 </Link>
256 </ItemDefinitionGroup> 343 </ItemDefinitionGroup>
257 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|Win32'"> 344 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|Win32'">
@@ -259,10 +346,10 @@
259 <PrecompiledHeader>Use</PrecompiledHeader> 346 <PrecompiledHeader>Use</PrecompiledHeader>
260 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 347 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
261 <Optimization>Disabled</Optimization> 348 <Optimization>Disabled</Optimization>
262 <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> 349 <PreprocessorDefinitions>LANES_DEBUG;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
263 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> 350 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
264 <WarningLevel>Level3</WarningLevel> 351 <WarningLevel>Level3</WarningLevel>
265 <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\Lua53\include;$(SolutionDir)..</AdditionalIncludeDirectories> 352 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
266 <LanguageStandard>stdcpp20</LanguageStandard> 353 <LanguageStandard>stdcpp20</LanguageStandard>
267 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> 354 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
268 </ClCompile> 355 </ClCompile>
@@ -270,6 +357,7 @@
270 <GenerateDebugInformation>true</GenerateDebugInformation> 357 <GenerateDebugInformation>true</GenerateDebugInformation>
271 <SubSystem>Console</SubSystem> 358 <SubSystem>Console</SubSystem>
272 <AdditionalDependencies>lua53.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies> 359 <AdditionalDependencies>lua53.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
360 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
273 </Link> 361 </Link>
274 </ItemDefinitionGroup> 362 </ItemDefinitionGroup>
275 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.3|Win32'"> 363 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.3|Win32'">
@@ -277,10 +365,10 @@
277 <PrecompiledHeader>Use</PrecompiledHeader> 365 <PrecompiledHeader>Use</PrecompiledHeader>
278 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 366 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
279 <Optimization>Disabled</Optimization> 367 <Optimization>Disabled</Optimization>
280 <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> 368 <PreprocessorDefinitions>LANES_DEBUG;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
281 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> 369 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
282 <WarningLevel>Level3</WarningLevel> 370 <WarningLevel>Level3</WarningLevel>
283 <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\Lua53\include;$(SolutionDir)..</AdditionalIncludeDirectories> 371 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
284 <LanguageStandard>stdcpp20</LanguageStandard> 372 <LanguageStandard>stdcpp20</LanguageStandard>
285 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> 373 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
286 </ClCompile> 374 </ClCompile>
@@ -288,6 +376,7 @@
288 <GenerateDebugInformation>true</GenerateDebugInformation> 376 <GenerateDebugInformation>true</GenerateDebugInformation>
289 <SubSystem>Console</SubSystem> 377 <SubSystem>Console</SubSystem>
290 <AdditionalDependencies>lua53.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies> 378 <AdditionalDependencies>lua53.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
379 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
291 </Link> 380 </Link>
292 </ItemDefinitionGroup> 381 </ItemDefinitionGroup>
293 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.2|Win32'"> 382 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.2|Win32'">
@@ -295,10 +384,10 @@
295 <PrecompiledHeader>Use</PrecompiledHeader> 384 <PrecompiledHeader>Use</PrecompiledHeader>
296 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 385 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
297 <Optimization>Disabled</Optimization> 386 <Optimization>Disabled</Optimization>
298 <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> 387 <PreprocessorDefinitions>LANES_DEBUG;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
299 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> 388 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
300 <WarningLevel>Level3</WarningLevel> 389 <WarningLevel>Level3</WarningLevel>
301 <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\Lua52\include;$(SolutionDir)..</AdditionalIncludeDirectories> 390 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
302 <LanguageStandard>stdcpp20</LanguageStandard> 391 <LanguageStandard>stdcpp20</LanguageStandard>
303 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> 392 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
304 </ClCompile> 393 </ClCompile>
@@ -306,6 +395,7 @@
306 <GenerateDebugInformation>true</GenerateDebugInformation> 395 <GenerateDebugInformation>true</GenerateDebugInformation>
307 <SubSystem>Console</SubSystem> 396 <SubSystem>Console</SubSystem>
308 <AdditionalDependencies>lua52.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies> 397 <AdditionalDependencies>lua52.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
398 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
309 </Link> 399 </Link>
310 </ItemDefinitionGroup> 400 </ItemDefinitionGroup>
311 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.2|Win32'"> 401 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.2|Win32'">
@@ -313,10 +403,10 @@
313 <PrecompiledHeader>Use</PrecompiledHeader> 403 <PrecompiledHeader>Use</PrecompiledHeader>
314 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 404 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
315 <Optimization>Disabled</Optimization> 405 <Optimization>Disabled</Optimization>
316 <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> 406 <PreprocessorDefinitions>LANES_DEBUG;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
317 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> 407 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
318 <WarningLevel>Level3</WarningLevel> 408 <WarningLevel>Level3</WarningLevel>
319 <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\Lua52\include;$(SolutionDir)..</AdditionalIncludeDirectories> 409 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
320 <LanguageStandard>stdcpp20</LanguageStandard> 410 <LanguageStandard>stdcpp20</LanguageStandard>
321 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> 411 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
322 </ClCompile> 412 </ClCompile>
@@ -324,6 +414,7 @@
324 <GenerateDebugInformation>true</GenerateDebugInformation> 414 <GenerateDebugInformation>true</GenerateDebugInformation>
325 <SubSystem>Console</SubSystem> 415 <SubSystem>Console</SubSystem>
326 <AdditionalDependencies>lua52.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies> 416 <AdditionalDependencies>lua52.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
417 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
327 </Link> 418 </Link>
328 </ItemDefinitionGroup> 419 </ItemDefinitionGroup>
329 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|Win32'"> 420 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|Win32'">
@@ -331,10 +422,10 @@
331 <PrecompiledHeader>Use</PrecompiledHeader> 422 <PrecompiledHeader>Use</PrecompiledHeader>
332 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 423 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
333 <Optimization>Disabled</Optimization> 424 <Optimization>Disabled</Optimization>
334 <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> 425 <PreprocessorDefinitions>LANES_DEBUG;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
335 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> 426 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
336 <WarningLevel>Level3</WarningLevel> 427 <WarningLevel>Level3</WarningLevel>
337 <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\Lua51\include;$(SolutionDir)..</AdditionalIncludeDirectories> 428 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
338 <LanguageStandard>stdcpp20</LanguageStandard> 429 <LanguageStandard>stdcpp20</LanguageStandard>
339 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> 430 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
340 </ClCompile> 431 </ClCompile>
@@ -342,6 +433,7 @@
342 <GenerateDebugInformation>true</GenerateDebugInformation> 433 <GenerateDebugInformation>true</GenerateDebugInformation>
343 <SubSystem>Console</SubSystem> 434 <SubSystem>Console</SubSystem>
344 <AdditionalDependencies>lua51.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies> 435 <AdditionalDependencies>lua51.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
436 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
345 </Link> 437 </Link>
346 </ItemDefinitionGroup> 438 </ItemDefinitionGroup>
347 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.1|Win32'"> 439 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.1|Win32'">
@@ -349,10 +441,10 @@
349 <PrecompiledHeader>Use</PrecompiledHeader> 441 <PrecompiledHeader>Use</PrecompiledHeader>
350 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 442 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
351 <Optimization>Disabled</Optimization> 443 <Optimization>Disabled</Optimization>
352 <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> 444 <PreprocessorDefinitions>LANES_DEBUG;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
353 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> 445 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
354 <WarningLevel>Level3</WarningLevel> 446 <WarningLevel>Level3</WarningLevel>
355 <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\Lua51\include;$(SolutionDir)..</AdditionalIncludeDirectories> 447 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
356 <LanguageStandard>stdcpp20</LanguageStandard> 448 <LanguageStandard>stdcpp20</LanguageStandard>
357 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> 449 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
358 </ClCompile> 450 </ClCompile>
@@ -360,17 +452,18 @@
360 <GenerateDebugInformation>true</GenerateDebugInformation> 452 <GenerateDebugInformation>true</GenerateDebugInformation>
361 <SubSystem>Console</SubSystem> 453 <SubSystem>Console</SubSystem>
362 <AdditionalDependencies>lua51.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies> 454 <AdditionalDependencies>lua51.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
455 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
363 </Link> 456 </Link>
364 </ItemDefinitionGroup> 457 </ItemDefinitionGroup>
365 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug LuaJIT|Win32'"> 458 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release LuaJIT|Win32'">
366 <ClCompile> 459 <ClCompile>
367 <PrecompiledHeader>Use</PrecompiledHeader> 460 <PrecompiledHeader>Use</PrecompiledHeader>
368 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 461 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
369 <Optimization>Disabled</Optimization> 462 <Optimization>Disabled</Optimization>
370 <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> 463 <PreprocessorDefinitions>LANES_DEBUG;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
371 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> 464 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
372 <WarningLevel>Level3</WarningLevel> 465 <WarningLevel>Level3</WarningLevel>
373 <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\LuaJIT\src;$(SolutionDir)..</AdditionalIncludeDirectories> 466 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
374 <LanguageStandard>stdcpp20</LanguageStandard> 467 <LanguageStandard>stdcpp20</LanguageStandard>
375 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> 468 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
376 </ClCompile> 469 </ClCompile>
@@ -378,26 +471,26 @@
378 <GenerateDebugInformation>true</GenerateDebugInformation> 471 <GenerateDebugInformation>true</GenerateDebugInformation>
379 <SubSystem>Console</SubSystem> 472 <SubSystem>Console</SubSystem>
380 <AdditionalDependencies>lua51.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies> 473 <AdditionalDependencies>lua51.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
381 <AdditionalLibraryDirectories>$(SolutionDir)..\..\..\LuaJIT\bin\$(Platform)</AdditionalLibraryDirectories> 474 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
382 </Link> 475 </Link>
383 </ItemDefinitionGroup> 476 </ItemDefinitionGroup>
384 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug MoonJIT|Win32'"> 477 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release MoonJIT|Win32'">
385 <ClCompile> 478 <ClCompile>
386 <PrecompiledHeader>Use</PrecompiledHeader> 479 <PrecompiledHeader>Use</PrecompiledHeader>
387 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 480 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
388 <Optimization>Disabled</Optimization> 481 <Optimization>Disabled</Optimization>
389 <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> 482 <PreprocessorDefinitions>LANES_DEBUG;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
390 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> 483 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
391 <WarningLevel>Level3</WarningLevel> 484 <WarningLevel>Level3</WarningLevel>
392 <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\MoonJIT\src;$(SolutionDir)..</AdditionalIncludeDirectories> 485 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
393 <LanguageStandard>stdcpp20</LanguageStandard> 486 <LanguageStandard>stdcpp20</LanguageStandard>
394 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> 487 <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
395 </ClCompile> 488 </ClCompile>
396 <Link> 489 <Link>
397 <GenerateDebugInformation>true</GenerateDebugInformation> 490 <GenerateDebugInformation>true</GenerateDebugInformation>
398 <SubSystem>Console</SubSystem> 491 <SubSystem>Console</SubSystem>
399 <AdditionalDependencies>lua51.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies> 492 <AdditionalDependencies>lua51.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
400 <AdditionalLibraryDirectories>$(SolutionDir)..\..\..\MoonJIT\bin\$(Platform)</AdditionalLibraryDirectories> 493 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
401 </Link> 494 </Link>
402 </ItemDefinitionGroup> 495 </ItemDefinitionGroup>
403 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|x64'"> 496 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|x64'">
@@ -405,6 +498,48 @@
405 <PrecompiledHeader>Use</PrecompiledHeader> 498 <PrecompiledHeader>Use</PrecompiledHeader>
406 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 499 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
407 <Optimization>Disabled</Optimization> 500 <Optimization>Disabled</Optimization>
501 <PreprocessorDefinitions>LANES_DEBUG;X64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
502 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
503 <WarningLevel>Level3</WarningLevel>
504 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
505 <LanguageStandard>stdcpp20</LanguageStandard>
506 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
507 </ClCompile>
508 <Link>
509 <GenerateDebugInformation>true</GenerateDebugInformation>
510 <SubSystem>Console</SubSystem>
511 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
512 <AdditionalDependencies>lua54.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
513 <IgnoreSpecificDefaultLibraries>
514 </IgnoreSpecificDefaultLibraries>
515 </Link>
516 </ItemDefinitionGroup>
517 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.5|x64'">
518 <ClCompile>
519 <PrecompiledHeader>Use</PrecompiledHeader>
520 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
521 <Optimization>Disabled</Optimization>
522 <PreprocessorDefinitions>LANES_DEBUG;X64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
523 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
524 <WarningLevel>Level3</WarningLevel>
525 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
526 <LanguageStandard>stdcpp20</LanguageStandard>
527 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
528 </ClCompile>
529 <Link>
530 <GenerateDebugInformation>true</GenerateDebugInformation>
531 <SubSystem>Console</SubSystem>
532 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
533 <AdditionalDependencies>lua55.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
534 <IgnoreSpecificDefaultLibraries>
535 </IgnoreSpecificDefaultLibraries>
536 </Link>
537 </ItemDefinitionGroup>
538 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|Prospero'">
539 <ClCompile>
540 <PrecompiledHeader>Use</PrecompiledHeader>
541 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
542 <Optimization>Disabled</Optimization>
408 <PreprocessorDefinitions>X64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> 543 <PreprocessorDefinitions>X64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
409 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> 544 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
410 <WarningLevel>Level3</WarningLevel> 545 <WarningLevel>Level3</WarningLevel>
@@ -415,13 +550,13 @@
415 <Link> 550 <Link>
416 <GenerateDebugInformation>true</GenerateDebugInformation> 551 <GenerateDebugInformation>true</GenerateDebugInformation>
417 <SubSystem>Console</SubSystem> 552 <SubSystem>Console</SubSystem>
418 <AdditionalLibraryDirectories>$(SolutionDir)..\..\..\Lua54\bin\$(Platform)\Debug</AdditionalLibraryDirectories> 553 <AdditionalLibraryDirectories>$(SolutionDir)..\..\..\Lua54\bin\$(Platform)\Debug;$(SolutionDir)..\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn.1.8.1.7\lib\native\v140\windesktop\msvcstl\static\rt-dyn\x64\Debug</AdditionalLibraryDirectories>
419 <AdditionalDependencies>lua54.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies> 554 <AdditionalDependencies>lua54.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
420 <IgnoreSpecificDefaultLibraries> 555 <IgnoreSpecificDefaultLibraries>
421 </IgnoreSpecificDefaultLibraries> 556 </IgnoreSpecificDefaultLibraries>
422 </Link> 557 </Link>
423 </ItemDefinitionGroup> 558 </ItemDefinitionGroup>
424 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|Prospero'"> 559 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.5|Prospero'">
425 <ClCompile> 560 <ClCompile>
426 <PrecompiledHeader>Use</PrecompiledHeader> 561 <PrecompiledHeader>Use</PrecompiledHeader>
427 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 562 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
@@ -447,17 +582,17 @@
447 <PrecompiledHeader>Use</PrecompiledHeader> 582 <PrecompiledHeader>Use</PrecompiledHeader>
448 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 583 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
449 <Optimization>Disabled</Optimization> 584 <Optimization>Disabled</Optimization>
450 <PreprocessorDefinitions>X64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> 585 <PreprocessorDefinitions>LANES_DEBUG;X64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
451 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> 586 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
452 <WarningLevel>Level3</WarningLevel> 587 <WarningLevel>Level3</WarningLevel>
453 <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\Lua53\include;$(SolutionDir)..</AdditionalIncludeDirectories> 588 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
454 <LanguageStandard>stdcpp20</LanguageStandard> 589 <LanguageStandard>stdcpp20</LanguageStandard>
455 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> 590 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
456 </ClCompile> 591 </ClCompile>
457 <Link> 592 <Link>
458 <GenerateDebugInformation>true</GenerateDebugInformation> 593 <GenerateDebugInformation>true</GenerateDebugInformation>
459 <SubSystem>Console</SubSystem> 594 <SubSystem>Console</SubSystem>
460 <AdditionalLibraryDirectories>$(SolutionDir)..\..\..\Lua53\bin\$(Platform)\Debug</AdditionalLibraryDirectories> 595 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
461 <AdditionalDependencies>lua53.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies> 596 <AdditionalDependencies>lua53.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
462 <IgnoreSpecificDefaultLibraries> 597 <IgnoreSpecificDefaultLibraries>
463 </IgnoreSpecificDefaultLibraries> 598 </IgnoreSpecificDefaultLibraries>
@@ -467,15 +602,15 @@
467 <ClCompile> 602 <ClCompile>
468 <PrecompiledHeader>Use</PrecompiledHeader> 603 <PrecompiledHeader>Use</PrecompiledHeader>
469 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 604 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
470 <PreprocessorDefinitions>X64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> 605 <PreprocessorDefinitions>LANES_DEBUG;X64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
471 <WarningLevel>Level3</WarningLevel> 606 <WarningLevel>Level3</WarningLevel>
472 <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\Lua53\include;$(SolutionDir)..</AdditionalIncludeDirectories> 607 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
473 <LanguageStandard>stdcpp20</LanguageStandard> 608 <LanguageStandard>stdcpp20</LanguageStandard>
474 </ClCompile> 609 </ClCompile>
475 <Link> 610 <Link>
476 <GenerateDebugInformation>true</GenerateDebugInformation> 611 <GenerateDebugInformation>true</GenerateDebugInformation>
477 <SubSystem>Console</SubSystem> 612 <SubSystem>Console</SubSystem>
478 <AdditionalLibraryDirectories>$(SolutionDir)..\..\..\Lua53\bin\$(Platform)\Release</AdditionalLibraryDirectories> 613 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
479 <AdditionalDependencies>lua53.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies> 614 <AdditionalDependencies>lua53.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
480 <IgnoreSpecificDefaultLibraries> 615 <IgnoreSpecificDefaultLibraries>
481 </IgnoreSpecificDefaultLibraries> 616 </IgnoreSpecificDefaultLibraries>
@@ -528,17 +663,17 @@
528 <PrecompiledHeader>Use</PrecompiledHeader> 663 <PrecompiledHeader>Use</PrecompiledHeader>
529 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 664 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
530 <Optimization>Disabled</Optimization> 665 <Optimization>Disabled</Optimization>
531 <PreprocessorDefinitions>X64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> 666 <PreprocessorDefinitions>LANES_DEBUG;X64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
532 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> 667 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
533 <WarningLevel>Level3</WarningLevel> 668 <WarningLevel>Level3</WarningLevel>
534 <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\Lua52\include;$(SolutionDir)..</AdditionalIncludeDirectories> 669 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
535 <LanguageStandard>stdcpp20</LanguageStandard> 670 <LanguageStandard>stdcpp20</LanguageStandard>
536 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> 671 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
537 </ClCompile> 672 </ClCompile>
538 <Link> 673 <Link>
539 <GenerateDebugInformation>true</GenerateDebugInformation> 674 <GenerateDebugInformation>true</GenerateDebugInformation>
540 <SubSystem>Console</SubSystem> 675 <SubSystem>Console</SubSystem>
541 <AdditionalLibraryDirectories>$(SolutionDir)..\..\..\Lua52\bin\$(Platform)\Debug</AdditionalLibraryDirectories> 676 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
542 <AdditionalDependencies>lua52.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies> 677 <AdditionalDependencies>lua52.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
543 <IgnoreSpecificDefaultLibraries> 678 <IgnoreSpecificDefaultLibraries>
544 </IgnoreSpecificDefaultLibraries> 679 </IgnoreSpecificDefaultLibraries>
@@ -548,15 +683,15 @@
548 <ClCompile> 683 <ClCompile>
549 <PrecompiledHeader>Use</PrecompiledHeader> 684 <PrecompiledHeader>Use</PrecompiledHeader>
550 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 685 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
551 <PreprocessorDefinitions>X64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> 686 <PreprocessorDefinitions>LANES_DEBUG;X64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
552 <WarningLevel>Level3</WarningLevel> 687 <WarningLevel>Level3</WarningLevel>
553 <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\Lua52\include;$(SolutionDir)..</AdditionalIncludeDirectories> 688 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
554 <LanguageStandard>stdcpp20</LanguageStandard> 689 <LanguageStandard>stdcpp20</LanguageStandard>
555 </ClCompile> 690 </ClCompile>
556 <Link> 691 <Link>
557 <GenerateDebugInformation>true</GenerateDebugInformation> 692 <GenerateDebugInformation>true</GenerateDebugInformation>
558 <SubSystem>Console</SubSystem> 693 <SubSystem>Console</SubSystem>
559 <AdditionalLibraryDirectories>$(SolutionDir)..\..\..\Lua52\bin\$(Platform)\Release</AdditionalLibraryDirectories> 694 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
560 <AdditionalDependencies>lua52.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies> 695 <AdditionalDependencies>lua52.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
561 <IgnoreSpecificDefaultLibraries> 696 <IgnoreSpecificDefaultLibraries>
562 </IgnoreSpecificDefaultLibraries> 697 </IgnoreSpecificDefaultLibraries>
@@ -609,17 +744,17 @@
609 <PrecompiledHeader>Use</PrecompiledHeader> 744 <PrecompiledHeader>Use</PrecompiledHeader>
610 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 745 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
611 <Optimization>Disabled</Optimization> 746 <Optimization>Disabled</Optimization>
612 <PreprocessorDefinitions>X64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> 747 <PreprocessorDefinitions>LANES_DEBUG;X64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
613 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> 748 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
614 <WarningLevel>Level3</WarningLevel> 749 <WarningLevel>Level3</WarningLevel>
615 <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\Lua51\include;$(SolutionDir)..</AdditionalIncludeDirectories> 750 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
616 <LanguageStandard>stdcpp20</LanguageStandard> 751 <LanguageStandard>stdcpp20</LanguageStandard>
617 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> 752 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
618 </ClCompile> 753 </ClCompile>
619 <Link> 754 <Link>
620 <GenerateDebugInformation>true</GenerateDebugInformation> 755 <GenerateDebugInformation>true</GenerateDebugInformation>
621 <SubSystem>Console</SubSystem> 756 <SubSystem>Console</SubSystem>
622 <AdditionalLibraryDirectories>$(SolutionDir)..\..\..\Lua51\bin\$(Platform)\Debug</AdditionalLibraryDirectories> 757 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
623 <AdditionalDependencies>lua51.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies> 758 <AdditionalDependencies>lua51.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
624 <IgnoreSpecificDefaultLibraries> 759 <IgnoreSpecificDefaultLibraries>
625 </IgnoreSpecificDefaultLibraries> 760 </IgnoreSpecificDefaultLibraries>
@@ -629,15 +764,15 @@
629 <ClCompile> 764 <ClCompile>
630 <PrecompiledHeader>Use</PrecompiledHeader> 765 <PrecompiledHeader>Use</PrecompiledHeader>
631 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 766 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
632 <PreprocessorDefinitions>X64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> 767 <PreprocessorDefinitions>LANES_DEBUG;X64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
633 <WarningLevel>Level3</WarningLevel> 768 <WarningLevel>Level3</WarningLevel>
634 <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\Lua51\include;$(SolutionDir)..</AdditionalIncludeDirectories> 769 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
635 <LanguageStandard>stdcpp20</LanguageStandard> 770 <LanguageStandard>stdcpp20</LanguageStandard>
636 </ClCompile> 771 </ClCompile>
637 <Link> 772 <Link>
638 <GenerateDebugInformation>true</GenerateDebugInformation> 773 <GenerateDebugInformation>true</GenerateDebugInformation>
639 <SubSystem>Console</SubSystem> 774 <SubSystem>Console</SubSystem>
640 <AdditionalLibraryDirectories>$(SolutionDir)..\..\..\Lua51\bin\$(Platform)\Release</AdditionalLibraryDirectories> 775 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
641 <AdditionalDependencies>lua51.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies> 776 <AdditionalDependencies>lua51.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
642 <IgnoreSpecificDefaultLibraries> 777 <IgnoreSpecificDefaultLibraries>
643 </IgnoreSpecificDefaultLibraries> 778 </IgnoreSpecificDefaultLibraries>
@@ -685,49 +820,49 @@
685 </IgnoreSpecificDefaultLibraries> 820 </IgnoreSpecificDefaultLibraries>
686 </Link> 821 </Link>
687 </ItemDefinitionGroup> 822 </ItemDefinitionGroup>
688 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug LuaJIT|x64'"> 823 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release LuaJIT|x64'">
689 <ClCompile> 824 <ClCompile>
690 <PrecompiledHeader>Use</PrecompiledHeader> 825 <PrecompiledHeader>Use</PrecompiledHeader>
691 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 826 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
692 <Optimization>Disabled</Optimization> 827 <Optimization>Disabled</Optimization>
693 <PreprocessorDefinitions>X64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> 828 <PreprocessorDefinitions>LANES_DEBUG;X64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
694 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> 829 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
695 <WarningLevel>Level3</WarningLevel> 830 <WarningLevel>Level3</WarningLevel>
696 <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\LuaJIT\src;$(SolutionDir)..</AdditionalIncludeDirectories> 831 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
697 <LanguageStandard>stdcpp20</LanguageStandard> 832 <LanguageStandard>stdcpp20</LanguageStandard>
698 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> 833 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
699 </ClCompile> 834 </ClCompile>
700 <Link> 835 <Link>
701 <GenerateDebugInformation>true</GenerateDebugInformation> 836 <GenerateDebugInformation>true</GenerateDebugInformation>
702 <SubSystem>Console</SubSystem> 837 <SubSystem>Console</SubSystem>
703 <AdditionalLibraryDirectories>$(SolutionDir)..\..\..\LuaJIT\bin\$(Platform)</AdditionalLibraryDirectories> 838 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
704 <AdditionalDependencies>lua51.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies> 839 <AdditionalDependencies>lua51.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
705 <IgnoreSpecificDefaultLibraries> 840 <IgnoreSpecificDefaultLibraries>
706 </IgnoreSpecificDefaultLibraries> 841 </IgnoreSpecificDefaultLibraries>
707 </Link> 842 </Link>
708 </ItemDefinitionGroup> 843 </ItemDefinitionGroup>
709 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug MoonJIT|x64'"> 844 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release MoonJIT|x64'">
710 <ClCompile> 845 <ClCompile>
711 <PrecompiledHeader>Use</PrecompiledHeader> 846 <PrecompiledHeader>Use</PrecompiledHeader>
712 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 847 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
713 <Optimization>Disabled</Optimization> 848 <Optimization>Disabled</Optimization>
714 <PreprocessorDefinitions>X64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> 849 <PreprocessorDefinitions>LANES_DEBUG;X64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
715 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> 850 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
716 <WarningLevel>Level3</WarningLevel> 851 <WarningLevel>Level3</WarningLevel>
717 <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\MoonJIT\src;$(SolutionDir)..</AdditionalIncludeDirectories> 852 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
718 <LanguageStandard>stdcpp20</LanguageStandard> 853 <LanguageStandard>stdcpp20</LanguageStandard>
719 <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> 854 <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
720 </ClCompile> 855 </ClCompile>
721 <Link> 856 <Link>
722 <GenerateDebugInformation>true</GenerateDebugInformation> 857 <GenerateDebugInformation>true</GenerateDebugInformation>
723 <SubSystem>Console</SubSystem> 858 <SubSystem>Console</SubSystem>
724 <AdditionalLibraryDirectories>$(SolutionDir)..\..\..\MoonJIT\bin\$(Platform)</AdditionalLibraryDirectories> 859 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
725 <AdditionalDependencies>lua51.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies> 860 <AdditionalDependencies>lua51.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
726 <IgnoreSpecificDefaultLibraries> 861 <IgnoreSpecificDefaultLibraries>
727 </IgnoreSpecificDefaultLibraries> 862 </IgnoreSpecificDefaultLibraries>
728 </Link> 863 </Link>
729 </ItemDefinitionGroup> 864 </ItemDefinitionGroup>
730 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug LuaJIT|Prospero'"> 865 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release LuaJIT|Prospero'">
731 <ClCompile> 866 <ClCompile>
732 <PrecompiledHeader>Use</PrecompiledHeader> 867 <PrecompiledHeader>Use</PrecompiledHeader>
733 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 868 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
@@ -748,7 +883,7 @@
748 </IgnoreSpecificDefaultLibraries> 883 </IgnoreSpecificDefaultLibraries>
749 </Link> 884 </Link>
750 </ItemDefinitionGroup> 885 </ItemDefinitionGroup>
751 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug MoonJIT|Prospero'"> 886 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release MoonJIT|Prospero'">
752 <ClCompile> 887 <ClCompile>
753 <PrecompiledHeader>Use</PrecompiledHeader> 888 <PrecompiledHeader>Use</PrecompiledHeader>
754 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 889 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
@@ -773,11 +908,11 @@
773 <ClCompile> 908 <ClCompile>
774 <PrecompiledHeader>Use</PrecompiledHeader> 909 <PrecompiledHeader>Use</PrecompiledHeader>
775 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 910 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
776 <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> 911 <PreprocessorDefinitions>LANES_DEBUG;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
777 <WarningLevel>Level3</WarningLevel> 912 <WarningLevel>Level3</WarningLevel>
778 <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> 913 <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
779 <LanguageStandard>stdcpp20</LanguageStandard> 914 <LanguageStandard>stdcpp20</LanguageStandard>
780 <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\Lua54\include;$(SolutionDir)..</AdditionalIncludeDirectories> 915 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
781 </ClCompile> 916 </ClCompile>
782 <Link> 917 <Link>
783 <GenerateDebugInformation>true</GenerateDebugInformation> 918 <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -785,14 +920,71 @@
785 <OptimizeReferences>true</OptimizeReferences> 920 <OptimizeReferences>true</OptimizeReferences>
786 <EnableCOMDATFolding>true</EnableCOMDATFolding> 921 <EnableCOMDATFolding>true</EnableCOMDATFolding>
787 <AdditionalDependencies>lua54.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies> 922 <AdditionalDependencies>lua54.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
923 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
924 </Link>
925 </ItemDefinitionGroup>
926 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.5|Win32'">
927 <ClCompile>
928 <PrecompiledHeader>Use</PrecompiledHeader>
929 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
930 <PreprocessorDefinitions>LANES_DEBUG;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
931 <WarningLevel>Level3</WarningLevel>
932 <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
933 <LanguageStandard>stdcpp20</LanguageStandard>
934 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
935 </ClCompile>
936 <Link>
937 <GenerateDebugInformation>true</GenerateDebugInformation>
938 <SubSystem>Console</SubSystem>
939 <OptimizeReferences>true</OptimizeReferences>
940 <EnableCOMDATFolding>true</EnableCOMDATFolding>
941 <AdditionalDependencies>lua54.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
942 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
788 </Link> 943 </Link>
789 </ItemDefinitionGroup> 944 </ItemDefinitionGroup>
790 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.4|x64'"> 945 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.4|x64'">
791 <ClCompile> 946 <ClCompile>
792 <PrecompiledHeader>Use</PrecompiledHeader> 947 <PrecompiledHeader>Use</PrecompiledHeader>
793 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 948 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
949 <PreprocessorDefinitions>LANES_DEBUG;X64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
950 <WarningLevel>Level3</WarningLevel>
951 <LanguageStandard>stdcpp20</LanguageStandard>
952 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
953 </ClCompile>
954 <Link>
955 <GenerateDebugInformation>true</GenerateDebugInformation>
956 <SubSystem>Console</SubSystem>
957 <OptimizeReferences>true</OptimizeReferences>
958 <EnableCOMDATFolding>true</EnableCOMDATFolding>
959 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
960 <AdditionalDependencies>lua54.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
961 </Link>
962 </ItemDefinitionGroup>
963 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.5|x64'">
964 <ClCompile>
965 <PrecompiledHeader>Use</PrecompiledHeader>
966 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
967 <PreprocessorDefinitions>LANES_DEBUG;X64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
968 <WarningLevel>Level3</WarningLevel>
969 <LanguageStandard>stdcpp20</LanguageStandard>
970 <AdditionalIncludeDirectories>$(SolutionDir)/_LuaVersions/$(PlatformName)/$(ConfigurationName)/include;$(SolutionDir)..</AdditionalIncludeDirectories>
971 </ClCompile>
972 <Link>
973 <GenerateDebugInformation>true</GenerateDebugInformation>
974 <SubSystem>Console</SubSystem>
975 <OptimizeReferences>true</OptimizeReferences>
976 <EnableCOMDATFolding>true</EnableCOMDATFolding>
977 <AdditionalLibraryDirectories>$(SolutionDir)_LuaVersions\$(PlatformName)\$(ConfigurationName)</AdditionalLibraryDirectories>
978 <AdditionalDependencies>lua55.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
979 </Link>
980 </ItemDefinitionGroup>
981 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.4|Prospero'">
982 <ClCompile>
983 <PrecompiledHeader>Use</PrecompiledHeader>
984 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
794 <PreprocessorDefinitions>X64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> 985 <PreprocessorDefinitions>X64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
795 <WarningLevel>Level3</WarningLevel> 986 <WarningLevel>Level3</WarningLevel>
987 <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
796 <LanguageStandard>stdcpp20</LanguageStandard> 988 <LanguageStandard>stdcpp20</LanguageStandard>
797 <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\Lua54\include;$(SolutionDir)..</AdditionalIncludeDirectories> 989 <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\Lua54\include;$(SolutionDir)..</AdditionalIncludeDirectories>
798 </ClCompile> 990 </ClCompile>
@@ -801,11 +993,11 @@
801 <SubSystem>Console</SubSystem> 993 <SubSystem>Console</SubSystem>
802 <OptimizeReferences>true</OptimizeReferences> 994 <OptimizeReferences>true</OptimizeReferences>
803 <EnableCOMDATFolding>true</EnableCOMDATFolding> 995 <EnableCOMDATFolding>true</EnableCOMDATFolding>
804 <AdditionalLibraryDirectories>$(SolutionDir)..\..\..\Lua54\bin\$(Platform)\Release</AdditionalLibraryDirectories> 996 <AdditionalLibraryDirectories>$(SolutionDir)..\..\..\Lua54\bin\$(Platform)\Release;$(SolutionDir)..\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn.1.8.1.7\lib\native\v140\windesktop\msvcstl\static\rt-dyn\x64\Release</AdditionalLibraryDirectories>
805 <AdditionalDependencies>lua54.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies> 997 <AdditionalDependencies>lua54.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
806 </Link> 998 </Link>
807 </ItemDefinitionGroup> 999 </ItemDefinitionGroup>
808 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.4|Prospero'"> 1000 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.5|Prospero'">
809 <ClCompile> 1001 <ClCompile>
810 <PrecompiledHeader>Use</PrecompiledHeader> 1002 <PrecompiledHeader>Use</PrecompiledHeader>
811 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile> 1003 <PrecompiledHeaderFile>_pch.hpp</PrecompiledHeaderFile>
@@ -836,11 +1028,13 @@
836 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|Win32'">NotUsing</PrecompiledHeader> 1028 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|Win32'">NotUsing</PrecompiledHeader>
837 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.3|Win32'">NotUsing</PrecompiledHeader> 1029 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.3|Win32'">NotUsing</PrecompiledHeader>
838 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|Win32'">NotUsing</PrecompiledHeader> 1030 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|Win32'">NotUsing</PrecompiledHeader>
1031 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.5|Win32'">NotUsing</PrecompiledHeader>
839 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|Win32'">NotUsing</PrecompiledHeader> 1032 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|Win32'">NotUsing</PrecompiledHeader>
840 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.1|Win32'">NotUsing</PrecompiledHeader> 1033 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.1|Win32'">NotUsing</PrecompiledHeader>
841 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug LuaJIT|Win32'">NotUsing</PrecompiledHeader> 1034 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release LuaJIT|Win32'">NotUsing</PrecompiledHeader>
842 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug MoonJIT|Win32'">NotUsing</PrecompiledHeader> 1035 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release MoonJIT|Win32'">NotUsing</PrecompiledHeader>
843 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.4|Win32'">NotUsing</PrecompiledHeader> 1036 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.4|Win32'">NotUsing</PrecompiledHeader>
1037 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.5|Win32'">NotUsing</PrecompiledHeader>
844 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.2|Win32'">NotUsing</PrecompiledHeader> 1038 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.2|Win32'">NotUsing</PrecompiledHeader>
845 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.2|Win32'">NotUsing</PrecompiledHeader> 1039 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.2|Win32'">NotUsing</PrecompiledHeader>
846 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|x64'">NotUsing</PrecompiledHeader> 1040 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|x64'">NotUsing</PrecompiledHeader>
@@ -848,17 +1042,21 @@
848 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|Prospero'">NotUsing</PrecompiledHeader> 1042 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|Prospero'">NotUsing</PrecompiledHeader>
849 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.3|Prospero'">NotUsing</PrecompiledHeader> 1043 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.3|Prospero'">NotUsing</PrecompiledHeader>
850 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|x64'">NotUsing</PrecompiledHeader> 1044 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|x64'">NotUsing</PrecompiledHeader>
1045 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.5|x64'">NotUsing</PrecompiledHeader>
851 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|Prospero'">NotUsing</PrecompiledHeader> 1046 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|Prospero'">NotUsing</PrecompiledHeader>
1047 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.5|Prospero'">NotUsing</PrecompiledHeader>
852 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|x64'">NotUsing</PrecompiledHeader> 1048 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|x64'">NotUsing</PrecompiledHeader>
853 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.1|x64'">NotUsing</PrecompiledHeader> 1049 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.1|x64'">NotUsing</PrecompiledHeader>
854 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|Prospero'">NotUsing</PrecompiledHeader> 1050 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|Prospero'">NotUsing</PrecompiledHeader>
855 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.1|Prospero'">NotUsing</PrecompiledHeader> 1051 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.1|Prospero'">NotUsing</PrecompiledHeader>
856 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug LuaJIT|x64'">NotUsing</PrecompiledHeader> 1052 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release LuaJIT|x64'">NotUsing</PrecompiledHeader>
857 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug MoonJIT|x64'">NotUsing</PrecompiledHeader> 1053 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release MoonJIT|x64'">NotUsing</PrecompiledHeader>
858 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug LuaJIT|Prospero'">NotUsing</PrecompiledHeader> 1054 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release LuaJIT|Prospero'">NotUsing</PrecompiledHeader>
859 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug MoonJIT|Prospero'">NotUsing</PrecompiledHeader> 1055 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release MoonJIT|Prospero'">NotUsing</PrecompiledHeader>
860 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.4|x64'">NotUsing</PrecompiledHeader> 1056 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.4|x64'">NotUsing</PrecompiledHeader>
1057 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.5|x64'">NotUsing</PrecompiledHeader>
861 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.4|Prospero'">NotUsing</PrecompiledHeader> 1058 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.4|Prospero'">NotUsing</PrecompiledHeader>
1059 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.5|Prospero'">NotUsing</PrecompiledHeader>
862 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.2|x64'">NotUsing</PrecompiledHeader> 1060 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.2|x64'">NotUsing</PrecompiledHeader>
863 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.2|x64'">NotUsing</PrecompiledHeader> 1061 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.2|x64'">NotUsing</PrecompiledHeader>
864 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.2|Prospero'">NotUsing</PrecompiledHeader> 1062 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.2|Prospero'">NotUsing</PrecompiledHeader>
@@ -869,11 +1067,13 @@
869 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|Win32'">NotUsing</PrecompiledHeader> 1067 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|Win32'">NotUsing</PrecompiledHeader>
870 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.3|Win32'">NotUsing</PrecompiledHeader> 1068 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.3|Win32'">NotUsing</PrecompiledHeader>
871 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|Win32'">NotUsing</PrecompiledHeader> 1069 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|Win32'">NotUsing</PrecompiledHeader>
1070 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.5|Win32'">NotUsing</PrecompiledHeader>
872 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|Win32'">NotUsing</PrecompiledHeader> 1071 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|Win32'">NotUsing</PrecompiledHeader>
873 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.1|Win32'">NotUsing</PrecompiledHeader> 1072 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.1|Win32'">NotUsing</PrecompiledHeader>
874 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug LuaJIT|Win32'">NotUsing</PrecompiledHeader> 1073 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release LuaJIT|Win32'">NotUsing</PrecompiledHeader>
875 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug MoonJIT|Win32'">NotUsing</PrecompiledHeader> 1074 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release MoonJIT|Win32'">NotUsing</PrecompiledHeader>
876 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.4|Win32'">NotUsing</PrecompiledHeader> 1075 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.4|Win32'">NotUsing</PrecompiledHeader>
1076 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.5|Win32'">NotUsing</PrecompiledHeader>
877 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.2|Win32'">NotUsing</PrecompiledHeader> 1077 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.2|Win32'">NotUsing</PrecompiledHeader>
878 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.2|Win32'">NotUsing</PrecompiledHeader> 1078 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.2|Win32'">NotUsing</PrecompiledHeader>
879 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|x64'">NotUsing</PrecompiledHeader> 1079 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|x64'">NotUsing</PrecompiledHeader>
@@ -881,17 +1081,21 @@
881 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|Prospero'">NotUsing</PrecompiledHeader> 1081 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|Prospero'">NotUsing</PrecompiledHeader>
882 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.3|Prospero'">NotUsing</PrecompiledHeader> 1082 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.3|Prospero'">NotUsing</PrecompiledHeader>
883 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|x64'">NotUsing</PrecompiledHeader> 1083 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|x64'">NotUsing</PrecompiledHeader>
1084 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.5|x64'">NotUsing</PrecompiledHeader>
884 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|Prospero'">NotUsing</PrecompiledHeader> 1085 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|Prospero'">NotUsing</PrecompiledHeader>
1086 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.5|Prospero'">NotUsing</PrecompiledHeader>
885 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|x64'">NotUsing</PrecompiledHeader> 1087 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|x64'">NotUsing</PrecompiledHeader>
886 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.1|x64'">NotUsing</PrecompiledHeader> 1088 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.1|x64'">NotUsing</PrecompiledHeader>
887 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|Prospero'">NotUsing</PrecompiledHeader> 1089 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|Prospero'">NotUsing</PrecompiledHeader>
888 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.1|Prospero'">NotUsing</PrecompiledHeader> 1090 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.1|Prospero'">NotUsing</PrecompiledHeader>
889 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug LuaJIT|x64'">NotUsing</PrecompiledHeader> 1091 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release LuaJIT|x64'">NotUsing</PrecompiledHeader>
890 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug MoonJIT|x64'">NotUsing</PrecompiledHeader> 1092 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release MoonJIT|x64'">NotUsing</PrecompiledHeader>
891 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug LuaJIT|Prospero'">NotUsing</PrecompiledHeader> 1093 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release LuaJIT|Prospero'">NotUsing</PrecompiledHeader>
892 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug MoonJIT|Prospero'">NotUsing</PrecompiledHeader> 1094 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release MoonJIT|Prospero'">NotUsing</PrecompiledHeader>
893 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.4|x64'">NotUsing</PrecompiledHeader> 1095 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.4|x64'">NotUsing</PrecompiledHeader>
1096 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.5|x64'">NotUsing</PrecompiledHeader>
894 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.4|Prospero'">NotUsing</PrecompiledHeader> 1097 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.4|Prospero'">NotUsing</PrecompiledHeader>
1098 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.5|Prospero'">NotUsing</PrecompiledHeader>
895 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.2|x64'">NotUsing</PrecompiledHeader> 1099 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.2|x64'">NotUsing</PrecompiledHeader>
896 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.2|x64'">NotUsing</PrecompiledHeader> 1100 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.2|x64'">NotUsing</PrecompiledHeader>
897 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.2|Prospero'">NotUsing</PrecompiledHeader> 1101 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.2|Prospero'">NotUsing</PrecompiledHeader>
@@ -906,17 +1110,21 @@
906 <ClCompile Include="init_and_shutdown.cpp" /> 1110 <ClCompile Include="init_and_shutdown.cpp" />
907 <ClCompile Include="_pch.cpp"> 1111 <ClCompile Include="_pch.cpp">
908 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|Win32'">Create</PrecompiledHeader> 1112 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|Win32'">Create</PrecompiledHeader>
1113 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.5|Win32'">Create</PrecompiledHeader>
909 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|Win32'">Create</PrecompiledHeader> 1114 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|Win32'">Create</PrecompiledHeader>
910 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.3|Win32'">Create</PrecompiledHeader> 1115 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.3|Win32'">Create</PrecompiledHeader>
911 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.2|Win32'">Create</PrecompiledHeader> 1116 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.2|Win32'">Create</PrecompiledHeader>
912 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.2|Win32'">Create</PrecompiledHeader> 1117 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.2|Win32'">Create</PrecompiledHeader>
913 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|Win32'">Create</PrecompiledHeader> 1118 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|Win32'">Create</PrecompiledHeader>
914 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.1|Win32'">Create</PrecompiledHeader> 1119 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.1|Win32'">Create</PrecompiledHeader>
915 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug LuaJIT|Win32'">Create</PrecompiledHeader> 1120 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release LuaJIT|Win32'">Create</PrecompiledHeader>
916 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug MoonJIT|Win32'">Create</PrecompiledHeader> 1121 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release MoonJIT|Win32'">Create</PrecompiledHeader>
917 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.4|Win32'">Create</PrecompiledHeader> 1122 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.4|Win32'">Create</PrecompiledHeader>
1123 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.5|Win32'">Create</PrecompiledHeader>
918 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|x64'">Create</PrecompiledHeader> 1124 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|x64'">Create</PrecompiledHeader>
1125 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.5|x64'">Create</PrecompiledHeader>
919 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|Prospero'">Create</PrecompiledHeader> 1126 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|Prospero'">Create</PrecompiledHeader>
1127 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.5|Prospero'">Create</PrecompiledHeader>
920 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|x64'">Create</PrecompiledHeader> 1128 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|x64'">Create</PrecompiledHeader>
921 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.3|x64'">Create</PrecompiledHeader> 1129 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.3|x64'">Create</PrecompiledHeader>
922 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|Prospero'">Create</PrecompiledHeader> 1130 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|Prospero'">Create</PrecompiledHeader>
@@ -929,18 +1137,33 @@
929 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.1|x64'">Create</PrecompiledHeader> 1137 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.1|x64'">Create</PrecompiledHeader>
930 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|Prospero'">Create</PrecompiledHeader> 1138 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|Prospero'">Create</PrecompiledHeader>
931 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.1|Prospero'">Create</PrecompiledHeader> 1139 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.1|Prospero'">Create</PrecompiledHeader>
932 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug LuaJIT|x64'">Create</PrecompiledHeader> 1140 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release LuaJIT|x64'">Create</PrecompiledHeader>
933 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug MoonJIT|x64'">Create</PrecompiledHeader> 1141 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release MoonJIT|x64'">Create</PrecompiledHeader>
934 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug LuaJIT|Prospero'">Create</PrecompiledHeader> 1142 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release LuaJIT|Prospero'">Create</PrecompiledHeader>
935 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug MoonJIT|Prospero'">Create</PrecompiledHeader> 1143 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release MoonJIT|Prospero'">Create</PrecompiledHeader>
936 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.4|x64'">Create</PrecompiledHeader> 1144 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.4|x64'">Create</PrecompiledHeader>
1145 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.5|x64'">Create</PrecompiledHeader>
937 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.4|Prospero'">Create</PrecompiledHeader> 1146 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.4|Prospero'">Create</PrecompiledHeader>
1147 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release 5.5|Prospero'">Create</PrecompiledHeader>
938 </ClCompile> 1148 </ClCompile>
939 </ItemGroup> 1149 </ItemGroup>
940 <ItemGroup> 1150 <ItemGroup>
941 <None Include="Catch2.runsettings" /> 1151 <None Include="..\.runsettings" />
1152 <None Include="scripts\coro\cancelling_suspended.lua" />
1153 <None Include="scripts\coro\collect_yielded_lane.lua" />
1154 <None Include="scripts\coro\join_suspended.lua" />
1155 <None Include="scripts\coro\linda_in_close_handler.lua" />
1156 <None Include="scripts\coro\regular_function.lua" />
1157 <None Include="scripts\coro\resume_basics.lua" />
1158 <None Include="scripts\coro\yielding_in_non_coro_errors.lua" />
1159 <None Include="scripts\lane\body_is_a_c_function.lua" />
1160 <None Include="scripts\lane\tasking_cancelling_with_hook.lua" />
1161 <None Include="scripts\linda\send_receive_func_and_string.lua" />
1162 <None Include="scripts\linda\wake_period.lua" />
1163 <None Include="scripts\misc\deeptest.lua" />
1164 <None Include="scripts\_utils54.lua" />
942 <None Include="UnitTests.makefile" /> 1165 <None Include="UnitTests.makefile" />
943 <None Include="scripts\coro\basics.lua" /> 1166 <None Include="scripts\coro\index_suspended.lua" />
944 <None Include="scripts\coro\error_handling.lua" /> 1167 <None Include="scripts\coro\error_handling.lua" />
945 <None Include="scripts\lane\cooperative_shutdown.lua" /> 1168 <None Include="scripts\lane\cooperative_shutdown.lua" />
946 <None Include="scripts\lane\stdlib_naming.lua" /> 1169 <None Include="scripts\lane\stdlib_naming.lua" />
diff --git a/unit_tests/UnitTests.vcxproj.filters b/unit_tests/UnitTests.vcxproj.filters
index eb02d19..df82447 100644
--- a/unit_tests/UnitTests.vcxproj.filters
+++ b/unit_tests/UnitTests.vcxproj.filters
@@ -54,6 +54,9 @@
54 <Filter Include="Make"> 54 <Filter Include="Make">
55 <UniqueIdentifier>{c62af5d9-9161-4ca1-9b58-6837e2907e35}</UniqueIdentifier> 55 <UniqueIdentifier>{c62af5d9-9161-4ca1-9b58-6837e2907e35}</UniqueIdentifier>
56 </Filter> 56 </Filter>
57 <Filter Include="Scripts\misc">
58 <UniqueIdentifier>{1fbb1341-2f93-4eaa-924c-1df79e083704}</UniqueIdentifier>
59 </Filter>
57 </ItemGroup> 60 </ItemGroup>
58 <ItemGroup> 61 <ItemGroup>
59 <None Include="scripts\linda\send_receive.lua"> 62 <None Include="scripts\linda\send_receive.lua">
@@ -95,7 +98,7 @@
95 <None Include="scripts\lane\tasking_join_test.lua"> 98 <None Include="scripts\lane\tasking_join_test.lua">
96 <Filter>Scripts\lane</Filter> 99 <Filter>Scripts\lane</Filter>
97 </None> 100 </None>
98 <None Include="scripts\coro\basics.lua"> 101 <None Include="scripts\coro\index_suspended.lua">
99 <Filter>Scripts\coro</Filter> 102 <Filter>Scripts\coro</Filter>
100 </None> 103 </None>
101 <None Include="scripts\coro\error_handling.lua"> 104 <None Include="scripts\coro\error_handling.lua">
@@ -107,11 +110,50 @@
107 <None Include="scripts\linda\send_registered_userdata.lua"> 110 <None Include="scripts\linda\send_registered_userdata.lua">
108 <Filter>Scripts\linda</Filter> 111 <Filter>Scripts\linda</Filter>
109 </None> 112 </None>
110 <None Include="Catch2.runsettings">
111 <Filter>Catch2</Filter>
112 </None>
113 <None Include="UnitTests.makefile"> 113 <None Include="UnitTests.makefile">
114 <Filter>Make</Filter> 114 <Filter>Make</Filter>
115 </None> 115 </None>
116 <None Include="..\.runsettings">
117 <Filter>Catch2</Filter>
118 </None>
119 <None Include="scripts\lane\tasking_cancelling_with_hook.lua">
120 <Filter>Scripts\lane</Filter>
121 </None>
122 <None Include="scripts\linda\wake_period.lua">
123 <Filter>Scripts\linda</Filter>
124 </None>
125 <None Include="scripts\coro\collect_yielded_lane.lua">
126 <Filter>Scripts\coro</Filter>
127 </None>
128 <None Include="scripts\lane\body_is_a_c_function.lua">
129 <Filter>Scripts\lane</Filter>
130 </None>
131 <None Include="scripts\coro\regular_function.lua">
132 <Filter>Scripts\coro</Filter>
133 </None>
134 <None Include="scripts\coro\yielding_in_non_coro_errors.lua">
135 <Filter>Scripts\coro</Filter>
136 </None>
137 <None Include="scripts\coro\resume_basics.lua">
138 <Filter>Scripts\coro</Filter>
139 </None>
140 <None Include="scripts\coro\join_suspended.lua">
141 <Filter>Scripts\coro</Filter>
142 </None>
143 <None Include="scripts\_utils54.lua">
144 <Filter>Scripts</Filter>
145 </None>
146 <None Include="scripts\coro\linda_in_close_handler.lua">
147 <Filter>Scripts\coro</Filter>
148 </None>
149 <None Include="scripts\coro\cancelling_suspended.lua">
150 <Filter>Scripts\coro</Filter>
151 </None>
152 <None Include="scripts\linda\send_receive_func_and_string.lua">
153 <Filter>Scripts\linda</Filter>
154 </None>
155 <None Include="scripts\misc\deeptest.lua">
156 <Filter>Scripts\misc</Filter>
157 </None>
116 </ItemGroup> 158 </ItemGroup>
117</Project> \ No newline at end of file 159</Project> \ No newline at end of file
diff --git a/unit_tests/UnitTests.vcxproj.user b/unit_tests/UnitTests.vcxproj.user
deleted file mode 100644
index d3fc335..0000000
--- a/unit_tests/UnitTests.vcxproj.user
+++ /dev/null
@@ -1,143 +0,0 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|x64'">
4 <LocalDebuggerCommandArguments />
5 <RemoteDebuggerCommandArguments />
6 <LocalDebuggerWorkingDirectory>$(SolutionDir)</LocalDebuggerWorkingDirectory>
7 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
8 </PropertyGroup>
9 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|Prospero'">
10 <LocalDebuggerCommandArguments />
11 <RemoteDebuggerCommandArguments />
12 <LocalDebuggerWorkingDirectory>$(SolutionDir)Lanes</LocalDebuggerWorkingDirectory>
13 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
14 </PropertyGroup>
15 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|Win32'">
16 <LocalDebuggerWorkingDirectory>$(SolutionDir)</LocalDebuggerWorkingDirectory>
17 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
18 </PropertyGroup>
19 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.1|Win32'">
20 <LocalDebuggerWorkingDirectory>$(SolutionDir)</LocalDebuggerWorkingDirectory>
21 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
22 </PropertyGroup>
23 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug LuaJIT|Win32'">
24 <LocalDebuggerWorkingDirectory>$(SolutionDir)</LocalDebuggerWorkingDirectory>
25 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
26 </PropertyGroup>
27 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug MoonJIT|Win32'">
28 <LocalDebuggerWorkingDirectory>$(SolutionDir)</LocalDebuggerWorkingDirectory>
29 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
30 </PropertyGroup>
31 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.2|Win32'">
32 <LocalDebuggerWorkingDirectory>$(SolutionDir)</LocalDebuggerWorkingDirectory>
33 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
34 </PropertyGroup>
35 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.2|Win32'">
36 <LocalDebuggerWorkingDirectory>$(SolutionDir)</LocalDebuggerWorkingDirectory>
37 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
38 </PropertyGroup>
39 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|Win32'">
40 <LocalDebuggerWorkingDirectory>$(SolutionDir)</LocalDebuggerWorkingDirectory>
41 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
42 </PropertyGroup>
43 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.3|Win32'">
44 <LocalDebuggerWorkingDirectory>$(SolutionDir)</LocalDebuggerWorkingDirectory>
45 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
46 </PropertyGroup>
47 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.4|Win32'">
48 <LocalDebuggerWorkingDirectory>$(SolutionDir)</LocalDebuggerWorkingDirectory>
49 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
50 </PropertyGroup>
51 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.4|Win32'">
52 <LocalDebuggerWorkingDirectory>$(SolutionDir)</LocalDebuggerWorkingDirectory>
53 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
54 </PropertyGroup>
55 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|x64'">
56 <LocalDebuggerWorkingDirectory>$(SolutionDir)</LocalDebuggerWorkingDirectory>
57 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
58 <LocalDebuggerCommandArguments />
59 <RemoteDebuggerCommandArguments />
60 </PropertyGroup>
61 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.1|x64'">
62 <LocalDebuggerWorkingDirectory>$(SolutionDir)</LocalDebuggerWorkingDirectory>
63 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
64 <LocalDebuggerCommandArguments />
65 <RemoteDebuggerCommandArguments />
66 </PropertyGroup>
67 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.1|Prospero'">
68 <LocalDebuggerWorkingDirectory>$(SolutionDir)Lanes</LocalDebuggerWorkingDirectory>
69 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
70 <LocalDebuggerCommandArguments />
71 <RemoteDebuggerCommandArguments />
72 </PropertyGroup>
73 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.1|Prospero'">
74 <LocalDebuggerWorkingDirectory>$(SolutionDir)Lanes</LocalDebuggerWorkingDirectory>
75 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
76 <LocalDebuggerCommandArguments />
77 <RemoteDebuggerCommandArguments />
78 </PropertyGroup>
79 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug LuaJIT|x64'">
80 <LocalDebuggerWorkingDirectory>$(SolutionDir)</LocalDebuggerWorkingDirectory>
81 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
82 <LocalDebuggerCommandArguments />
83 <RemoteDebuggerCommandArguments />
84 </PropertyGroup>
85 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug MoonJIT|x64'">
86 <LocalDebuggerWorkingDirectory>$(SolutionDir)</LocalDebuggerWorkingDirectory>
87 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
88 <LocalDebuggerCommandArguments />
89 <RemoteDebuggerCommandArguments />
90 </PropertyGroup>
91 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug LuaJIT|Prospero'">
92 <LocalDebuggerWorkingDirectory>$(SolutionDir)Lanes</LocalDebuggerWorkingDirectory>
93 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
94 <LocalDebuggerCommandArguments />
95 <RemoteDebuggerCommandArguments />
96 </PropertyGroup>
97 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug MoonJIT|Prospero'">
98 <LocalDebuggerWorkingDirectory>$(SolutionDir)Lanes</LocalDebuggerWorkingDirectory>
99 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
100 <LocalDebuggerCommandArguments />
101 <RemoteDebuggerCommandArguments />
102 </PropertyGroup>
103 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.2|x64'">
104 <LocalDebuggerWorkingDirectory>$(SolutionDir)</LocalDebuggerWorkingDirectory>
105 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
106 </PropertyGroup>
107 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.2|x64'">
108 <LocalDebuggerWorkingDirectory>$(SolutionDir)</LocalDebuggerWorkingDirectory>
109 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
110 </PropertyGroup>
111 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.2|Prospero'">
112 <LocalDebuggerWorkingDirectory>$(SolutionDir)Lanes</LocalDebuggerWorkingDirectory>
113 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
114 </PropertyGroup>
115 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.2|Prospero'">
116 <LocalDebuggerWorkingDirectory>$(SolutionDir)Lanes</LocalDebuggerWorkingDirectory>
117 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
118 </PropertyGroup>
119 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|x64'">
120 <LocalDebuggerWorkingDirectory>$(SolutionDir)</LocalDebuggerWorkingDirectory>
121 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
122 </PropertyGroup>
123 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.3|x64'">
124 <LocalDebuggerWorkingDirectory>$(SolutionDir)</LocalDebuggerWorkingDirectory>
125 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
126 </PropertyGroup>
127 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 5.3|Prospero'">
128 <LocalDebuggerWorkingDirectory>$(SolutionDir)Lanes</LocalDebuggerWorkingDirectory>
129 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
130 </PropertyGroup>
131 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.3|Prospero'">
132 <LocalDebuggerWorkingDirectory>$(SolutionDir)Lanes</LocalDebuggerWorkingDirectory>
133 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
134 </PropertyGroup>
135 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.4|x64'">
136 <LocalDebuggerWorkingDirectory>$(SolutionDir)</LocalDebuggerWorkingDirectory>
137 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
138 </PropertyGroup>
139 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release 5.4|Prospero'">
140 <LocalDebuggerWorkingDirectory>$(SolutionDir)Lanes</LocalDebuggerWorkingDirectory>
141 <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
142 </PropertyGroup>
143</Project> \ No newline at end of file
diff --git a/unit_tests/_pch.cpp b/unit_tests/_pch.cpp
index 189089a..0d37ba4 100644
--- a/unit_tests/_pch.cpp
+++ b/unit_tests/_pch.cpp
@@ -1,15 +1 @@
1#include "_pch.hpp" #include "_pch.hpp"
2
3// IMPORTANT INFORMATION: some relative paths coded in the test implementations suppose that the cwd when debugging is $(SolutionDir)Lanes
4// Therefore that's what needs to be set in Google Test Adapter 'Working Directory' global setting...
5
6//int main(int argc, char* argv[])
7//{
8// // your setup ...
9//
10// int result = Catch::Session().run(argc, argv);
11//
12// // your clean-up...
13//
14// return result;
15//} \ No newline at end of file
diff --git a/unit_tests/_pch.hpp b/unit_tests/_pch.hpp
index 1e98c5a..f6e5fff 100644
--- a/unit_tests/_pch.hpp
+++ b/unit_tests/_pch.hpp
@@ -1,5 +1,3 @@
1#pragma once
2
3#include <atomic> 1#include <atomic>
4#include <cassert> 2#include <cassert>
5#include <filesystem> 3#include <filesystem>
diff --git a/unit_tests/deep_tests.cpp b/unit_tests/deep_tests.cpp
index e21072c..f18ff81 100644
--- a/unit_tests/deep_tests.cpp
+++ b/unit_tests/deep_tests.cpp
@@ -92,4 +92,13 @@ TEST_CASE("misc.deep_userdata.example")
92 " assert(due.get_deep_count() == 0)" 92 " assert(due.get_deep_count() == 0)"
93 ); 93 );
94 } 94 }
95} \ No newline at end of file 95}
96
97#define MAKE_TEST_CASE(DIR, FILE, CONDITION) \
98 TEST_CASE("scripted_tests." #DIR "." #FILE) \
99 { \
100 FileRunner _runner(R"(.\unit_tests\scripts)"); \
101 _runner.performTest(FileRunnerParam{ #DIR "/" #FILE, TestType::CONDITION }); \
102 }
103
104MAKE_TEST_CASE(misc, deeptest, AssertNoLuaError)
diff --git a/unit_tests/embedded_tests.cpp b/unit_tests/embedded_tests.cpp
index a63383a..388548d 100644
--- a/unit_tests/embedded_tests.cpp
+++ b/unit_tests/embedded_tests.cpp
@@ -2,6 +2,7 @@
2#include "shared.h" 2#include "shared.h"
3#include "lanes/src/lanes.hpp" 3#include "lanes/src/lanes.hpp"
4 4
5#if defined __has_include && __has_include(<windows.h>)
5#include <windows.h> 6#include <windows.h>
6 7
7// ################################################################################################# 8// #################################################################################################
@@ -138,13 +139,13 @@ namespace
138 139
139// ################################################################################################# 140// #################################################################################################
140 141
141TEST_CASE("lanes.embedding.with default allocator") 142TEST_CASE("lanes.embedding.with_default_allocator")
142{ 143{
143 local::EmbeddedLuaState S; 144 local::EmbeddedLuaState S;
144 145
145 // --------------------------------------------------------------------------------------------- 146 // ---------------------------------------------------------------------------------------------
146 147
147 SECTION("single state") 148 SECTION("single_state")
148 { 149 {
149 // this sends data in a linda. current contents: 150 // this sends data in a linda. current contents:
150 // key: short string 151 // key: short string
@@ -157,7 +158,7 @@ TEST_CASE("lanes.embedding.with default allocator")
157 // function with an upvalue 158 // function with an upvalue
158 std::string_view const _script{ 159 std::string_view const _script{
159 " local lanes = require 'lanes'.configure{with_timers = false}" 160 " local lanes = require 'lanes'.configure{with_timers = false}"
160 " local l = lanes.linda'gleh'" 161 " local l = lanes.linda{name = 'gleh'}"
161 " local upvalue = 'oeauaoeuoeuaoeuaoeujaoefubycfjbycfybcfjybcfjybcfjbcf'" 162 " local upvalue = 'oeauaoeuoeuaoeuaoeujaoefubycfjbycfybcfjybcfjybcfjbcf'"
162 " local upvalued = function()" 163 " local upvalued = function()"
163 " return upvalue" 164 " return upvalue"
@@ -171,7 +172,7 @@ TEST_CASE("lanes.embedding.with default allocator")
171 172
172 // --------------------------------------------------------------------------------------------- 173 // ---------------------------------------------------------------------------------------------
173 174
174 SECTION("manual registration") 175 SECTION("manual_registration")
175 { 176 {
176 S.requireSuccess("require 'lanes'.configure{with_timers = false}"); 177 S.requireSuccess("require 'lanes'.configure{with_timers = false}");
177 178
@@ -183,7 +184,7 @@ TEST_CASE("lanes.embedding.with default allocator")
183 // try to send io.open into a linda, which fails if io base library is not loaded 184 // try to send io.open into a linda, which fails if io base library is not loaded
184 std::string_view const _script{ 185 std::string_view const _script{
185 " local lanes = require 'lanes'" 186 " local lanes = require 'lanes'"
186 " local l = lanes.linda'gleh'" 187 " local l = lanes.linda{name = 'gleh'}"
187 " l:set('yo', io.open)" 188 " l:set('yo', io.open)"
188 " return 'SUCCESS'" 189 " return 'SUCCESS'"
189 }; 190 };
@@ -191,7 +192,7 @@ TEST_CASE("lanes.embedding.with default allocator")
191 192
192 // try again after manual registration 193 // try again after manual registration
193 lua_pushcfunction(S, S.get_lanes_register()); // S: lanes_register 194 lua_pushcfunction(S, S.get_lanes_register()); // S: lanes_register
194 luaG_pushstring(S, LUA_IOLIBNAME); // S: lanes_register "io" 195 luaW_pushstring(S, LUA_IOLIBNAME); // S: lanes_register "io"
195 luaL_requiref(S, LUA_IOLIBNAME, luaopen_io, 1); // S: lanes_register "io" io 196 luaL_requiref(S, LUA_IOLIBNAME, luaopen_io, 1); // S: lanes_register "io" io
196 lua_call(S, 2, 0); // S: 197 lua_call(S, 2, 0); // S:
197 S.stackCheck(0); 198 S.stackCheck(0);
@@ -202,7 +203,8 @@ TEST_CASE("lanes.embedding.with default allocator")
202// ################################################################################################# 203// #################################################################################################
203 204
204// this is not really a test yet, just something sitting here until it is converted properly 205// this is not really a test yet, just something sitting here until it is converted properly
205TEST_CASE("lanes.embedding.with custom allocator") 206// currently it crashes with moonjit (but maybe I just need a more recent moonjit version)
207TEST_CASE("lanes.embedding.with_custom_allocator")
206{ 208{
207 static constexpr auto logPrint = +[](lua_State* L) { 209 static constexpr auto logPrint = +[](lua_State* L) {
208 lua_getglobal(L, "ID"); // ID 210 lua_getglobal(L, "ID"); // ID
@@ -218,7 +220,7 @@ TEST_CASE("lanes.embedding.with custom allocator")
218 220
219 static constexpr auto launch_lane = +[](lua_CFunction on_state_create_, int id_, int n_) { 221 static constexpr auto launch_lane = +[](lua_CFunction on_state_create_, int id_, int n_) {
220 char script[500]; 222 char script[500];
221 lua_State* L = lua_newstate(local::allocf, nullptr); 223 lua_State* L = luaW_newstate(local::allocf, nullptr, luaL_makeseed(nullptr));
222 // _G.ID = id_ 224 // _G.ID = id_
223 luaL_openlibs(L); 225 luaL_openlibs(L);
224 luaL_dostring(L, "lanes = require 'lanes'"); 226 luaL_dostring(L, "lanes = require 'lanes'");
@@ -234,7 +236,7 @@ TEST_CASE("lanes.embedding.with custom allocator")
234 // lua_setfield(L, -2, "allocator"); // configure {on_state_create = on_state_create_, allocater = "protected"} 236 // lua_setfield(L, -2, "allocator"); // configure {on_state_create = on_state_create_, allocater = "protected"}
235 lua_pcall(L, 1, 0, 0); 237 lua_pcall(L, 1, 0, 0);
236 sprintf_s(script, 238 sprintf_s(script,
237 "g = lanes.gen('*', {globals = {ID = %d}}, function(id_) lane_threadname('Lane %d.'..id_) logPrint('This is L%d.'..id_) end)" // lane generator 239 "g = lanes.gen('*', { name = 'auto', globals = {ID = %d} }, function(id_) lane_threadname('Lane %d.'..id_) logPrint('This is L%d.'..id_) end)" // lane generator
238 "for i = 1,%d do _G['a'..i] = g(i) end" // launch a few lanes, handle stored in global a<i> 240 "for i = 1,%d do _G['a'..i] = g(i) end" // launch a few lanes, handle stored in global a<i>
239 , 241 ,
240 id_, 242 id_,
@@ -264,4 +266,6 @@ TEST_CASE("lanes.embedding.with custom allocator")
264 lua_close(L3); 266 lua_close(L3);
265 lua_close(L2); 267 lua_close(L2);
266 lua_close(L1); 268 lua_close(L1);
267} \ No newline at end of file 269}
270
271#endif // windows.h
diff --git a/unit_tests/init_and_shutdown.cpp b/unit_tests/init_and_shutdown.cpp
index 7e4c215..69e4f1b 100644
--- a/unit_tests/init_and_shutdown.cpp
+++ b/unit_tests/init_and_shutdown.cpp
@@ -3,7 +3,7 @@
3 3
4// ################################################################################################# 4// #################################################################################################
5 5
6TEST_CASE("lanes.require 'lanes'") 6TEST_CASE("Lua.require_lanes")
7{ 7{
8 LuaState L{ LuaState::WithBaseLibs{ false }, LuaState::WithFixture{ false } }; 8 LuaState L{ LuaState::WithBaseLibs{ false }, LuaState::WithFixture{ false } };
9 9
@@ -56,612 +56,717 @@ TEST_CASE("lanes.require 'lanes'")
56} 56}
57 57
58// ################################################################################################# 58// #################################################################################################
59// ################################################################################################# 59
60// allocator should be "protected", a C function returning a suitable userdata, or nil 60// allocator should be "protected", a C function returning a suitable userdata, or nil
61TEST_CASE("lanes.configure.allocator/bool_number_table_string")
62{
63 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
64
65 SECTION("allocator = false")
66 {
67 L.requireFailure("require 'lanes'.configure{allocator = false}");
68 }
69
70 // ---------------------------------------------------------------------------------------------
71
72 SECTION("allocator = true")
73 {
74 L.requireFailure("require 'lanes'.configure{allocator = true}");
75 }
76
77 // ---------------------------------------------------------------------------------------------
78
79 SECTION("allocator = <number>")
80 {
81 L.requireFailure("require 'lanes'.configure{allocator = 33}");
82 }
83
84 // ---------------------------------------------------------------------------------------------
85
86 SECTION("allocator = <table>")
87 {
88 L.requireFailure("require 'lanes'.configure{allocator = {}}");
89 }
90
91 // ---------------------------------------------------------------------------------------------
92
93 SECTION("allocator = <string with a typo>")
94 {
95 // oops, a typo
96 L.requireFailure("require 'lanes'.configure{allocator = 'Protected'}");
97 }
98}
99
100// #################################################################################################
61 101
62TEST_CASE("lanes.configure") 102TEST_CASE("lanes.configure.allocator/bad_functions")
63{ 103{
64 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } }; 104 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
65 105
66 // --------------------------------------------------------------------------------------------- 106 // ---------------------------------------------------------------------------------------------
67 107
68 SECTION("allocator", "[allocator]") 108 SECTION("allocator = <Lua function>")
69 { 109 {
70 SECTION("allocator = false") 110 L.requireFailure("require 'lanes'.configure{allocator = function() return {}, 12, 'yoy' end}");
71 { 111 }
72 L.requireFailure("require 'lanes'.configure{allocator = false}");
73 }
74 112
75 // ----------------------------------------------------------------------------------------- 113 // ---------------------------------------------------------------------------------------------
76 114
77 SECTION("allocator = true") 115 SECTION("allocator = <bad C function>")
78 { 116 {
79 L.requireFailure("require 'lanes'.configure{allocator = true}"); 117 // a C function that doesn't return what we expect should cause an error too
80 } 118 // TODO: for some reason, we use os.getenv here because using 'print' as the culprit, the tests deadlock in Release builds
119 L.requireFailure("return type(require 'lanes'.configure{allocator = os.getenv})");
120 }
81 121
82 // ----------------------------------------------------------------------------------------- 122 // ---------------------------------------------------------------------------------------------
83 123
84 SECTION("allocator = <number>") 124 SECTION("allocator not returning an AllocatorDefinition")
85 { 125 {
86 L.requireFailure("require 'lanes'.configure{allocator = 33}"); 126 // a function that provides something that is definitely not an AllocatorDefinition, should cause an error
87 } 127 static constexpr lua_CFunction _provideAllocator = +[](lua_State* const L_) {
128 lua_newtable(L_);
129 return 1;
130 };
131 lua_pushcfunction(L, _provideAllocator);
132 lua_setglobal(L, "ProvideAllocator");
133 // force value of internal_allocator so that the LuaJIT-default 'libc' is not selected
134 // which would prevent us from calling _provideAllocator
135 L.requireFailure("require 'lanes'.configure{allocator = ProvideAllocator, internal_allocator = 'allocator'}");
136 }
88 137
89 // ----------------------------------------------------------------------------------------- 138 // ---------------------------------------------------------------------------------------------
90 139
91 SECTION("allocator = <table>") 140 SECTION("allocator returning an AllocatorDefinition with the wrong signature")
92 { 141 {
93 L.requireFailure("require 'lanes'.configure{allocator = {}}"); 142 // a function that provides something that is too small to contain an AllocatorDefinition, should cause an error
94 } 143 static constexpr lua_CFunction _provideAllocator = +[](lua_State* const L_) {
144 // create a full userdata that is too small (it only contains enough to store a version tag, but not the rest
145 auto* const _duck{ static_cast<lanes::AllocatorDefinition::version_t*>(lua_newuserdata(L_, sizeof(lanes::AllocatorDefinition::version_t))) };
146 *_duck = 666777;
147 return 1;
148 };
149 lua_pushcfunction(L, _provideAllocator);
150 lua_setglobal(L, "ProvideAllocator");
151 // force value of internal_allocator so that the LuaJIT-default 'libc' is not selected
152 // which would prevent us from calling _provideAllocator
153 L.requireFailure("require 'lanes'.configure{allocator = ProvideAllocator, internal_allocator = 'allocator'}");
154 }
95 155
96 // ----------------------------------------------------------------------------------------- 156 // -----------------------------------------------------------------------------------------
97 157
98 SECTION("allocator = <Lua function>") 158 SECTION("allocator returning something too small to be a valid AllocatorDefinition")
99 { 159 {
100 L.requireFailure("require 'lanes'.configure{allocator = function() return {}, 12, 'yoy' end}"); 160 // a function that provides something that attempts to pass as an AllocatorDefinition, but is not, should cause an error
101 } 161 static constexpr lua_CFunction _provideAllocator = +[](lua_State* const L_) {
162 // create a full userdata of the correct size, but of course the contents don't match
163 int* const _duck{ static_cast<int*>(lua_newuserdata(L_, sizeof(lanes::AllocatorDefinition))) };
164 _duck[0] = 666;
165 _duck[1] = 777;
166 return 1;
167 };
168 lua_pushcfunction(L, _provideAllocator);
169 lua_setglobal(L, "ProvideAllocator");
170 // force value of internal_allocator so that the LuaJIT-default 'libc' is not selected
171 // which would prevent us from calling _provideAllocator
172 L.requireFailure("require 'lanes'.configure{allocator = ProvideAllocator, internal_allocator = 'allocator'}");
173 }
174}
102 175
103 // ----------------------------------------------------------------------------------------- 176// #################################################################################################
104 177
105 SECTION("allocator = <bad C function>") 178TEST_CASE("lanes.configure.allocator/good_function")
106 { 179{
107 // a C function that doesn't return what we expect should cause an error too 180 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
108 L.requireFailure("require 'lanes'.configure{allocator = print}");
109 }
110 181
111 // ----------------------------------------------------------------------------------------- 182 SECTION("allocator = <good custom C allocator>")
183 {
184 // a function that provides what we expect is fine
185 static constexpr lua_CFunction _provideAllocator = +[](lua_State* const L_) {
186 lanes::AllocatorDefinition* const _def{ new (L_) lanes::AllocatorDefinition{} };
187 _def->initFrom(L_);
188 return 1;
189 };
190 lua_pushcfunction(L, _provideAllocator);
191 lua_setglobal(L, "ProvideAllocator");
192 L.requireSuccess("require 'lanes'.configure{allocator = ProvideAllocator}");
193 }
194}
112 195
113 SECTION("allocator = <string with a typo>") 196// #################################################################################################
114 {
115 // oops, a typo
116 L.requireFailure("require 'lanes'.configure{allocator = 'Protected'}");
117 }
118 197
119 // ----------------------------------------------------------------------------------------- 198// TODO: investigate why this test crashes under AppVerifier on lanes_core.dll unload when running against Lua 5.1, 5.2 and 5.4 RELEASE ONLY!
199// apparently, the mutex of ProtectedAllocator is deemed still in use. Crash goes away if I don't use it in protected_lua_Alloc
200TEST_CASE(("lanes.configure.allocator/protected"))
201{
202 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
120 203
121 SECTION("allocator = 'protected'") 204 // no typo, should work
122 { 205 L.requireSuccess("require 'lanes'.configure{allocator = 'protected'}");
123 // no typo, should work 206}
124 L.requireSuccess("require 'lanes'.configure{allocator = 'protected'}");
125 }
126 207
127 // -----------------------------------------------------------------------------------------
128 208
129 SECTION("allocator = <good custom C allocator>") 209// #################################################################################################
130 {
131 // a function that provides what we expect is fine
132 static constexpr lua_CFunction _provideAllocator = +[](lua_State* const L_) {
133 lanes::AllocatorDefinition* const _def{ new (L_) lanes::AllocatorDefinition{} };
134 _def->initFrom(L_);
135 return 1;
136 };
137 lua_pushcfunction(L, _provideAllocator);
138 lua_setglobal(L, "ProvideAllocator");
139 L.requireSuccess("require 'lanes'.configure{allocator = ProvideAllocator}");
140 }
141 210
142 // ----------------------------------------------------------------------------------------- 211TEST_CASE("lanes.configure.internal_allocator")
212{
213 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
143 214
144 SECTION("allocator not returning an AllocatorDefinition") 215 // internal_allocator should be a string, "libc"/"allocator"
145 { 216
146 // a function that provides something that is definitely not an AllocatorDefinition, should cause an error 217 SECTION("internal_allocator = false")
147 static constexpr lua_CFunction _provideAllocator = +[](lua_State* const L_) { 218 {
148 lua_newtable(L_); 219 L.requireFailure("require 'lanes'.configure{internal_allocator = false}");
149 return 1; 220 }
150 };
151 lua_pushcfunction(L, _provideAllocator);
152 lua_setglobal(L, "ProvideAllocator");
153 // force value of internal_allocator so that the LuaJIT-default 'libc' is not selected
154 // which would prevent us from calling _provideAllocator
155 L.requireFailure("require 'lanes'.configure{allocator = ProvideAllocator, internal_allocator = 'allocator'}");
156 }
157 221
158 // ----------------------------------------------------------------------------------------- 222 // ---------------------------------------------------------------------------------------------
159 223
160 SECTION("allocator returning an AllocatorDefinition with the wrong signature") 224 SECTION("internal_allocator = true")
161 { 225 {
162 // a function that provides something that is too small to contain an AllocatorDefinition, should cause an error 226 L.requireFailure("require 'lanes'.configure{internal_allocator = true}");
163 static constexpr lua_CFunction _provideAllocator = +[](lua_State* const L_) { 227 }
164 // create a full userdata that is too small (it only contains enough to store a version tag, but not the rest
165 auto* const _duck{ static_cast<lanes::AllocatorDefinition::version_t*>(lua_newuserdata(L_, sizeof(lanes::AllocatorDefinition::version_t))) };
166 *_duck = 666777;
167 return 1;
168 };
169 lua_pushcfunction(L, _provideAllocator);
170 lua_setglobal(L, "ProvideAllocator");
171 // force value of internal_allocator so that the LuaJIT-default 'libc' is not selected
172 // which would prevent us from calling _provideAllocator
173 L.requireFailure("require 'lanes'.configure{allocator = ProvideAllocator, internal_allocator = 'allocator'}");
174 }
175 228
176 // ----------------------------------------------------------------------------------------- 229 // ---------------------------------------------------------------------------------------------
177 230
178 SECTION("allocator returning something too small to be a valid AllocatorDefinition") 231 SECTION("internal_allocator = <table>")
179 { 232 {
180 // a function that provides something that attempts to pass as an AllocatorDefinition, but is not, should cause an error 233 L.requireFailure("require 'lanes'.configure{internal_allocator = {}}");
181 static constexpr lua_CFunction _provideAllocator = +[](lua_State* const L_) {
182 // create a full userdata of the correct size, but of course the contents don't match
183 int* const _duck{ static_cast<int*>(lua_newuserdata(L_, sizeof(lanes::AllocatorDefinition))) };
184 _duck[0] = 666;
185 _duck[1] = 777;
186 return 1;
187 };
188 lua_pushcfunction(L, _provideAllocator);
189 lua_setglobal(L, "ProvideAllocator");
190 // force value of internal_allocator so that the LuaJIT-default 'libc' is not selected
191 // which would prevent us from calling _provideAllocator
192 L.requireFailure("require 'lanes'.configure{allocator = ProvideAllocator, internal_allocator = 'allocator'}");
193 }
194 } 234 }
195 235
196 // --------------------------------------------------------------------------------------------- 236 // ---------------------------------------------------------------------------------------------
197 // internal_allocator should be a string, "libc"/"allocator"
198 237
199 SECTION("[internal_allocator") 238 SECTION("internal_allocator = <Lua function>")
200 { 239 {
201 SECTION("internal_allocator = false") 240 L.requireFailure("require 'lanes'.configure{internal_allocator = function() end}");
202 { 241 }
203 L.requireFailure("require 'lanes'.configure{internal_allocator = false}");
204 }
205 242
206 // ----------------------------------------------------------------------------------------- 243 // ---------------------------------------------------------------------------------------------
207 244
208 SECTION("internal_allocator = true") 245 SECTION("internal_allocator = <bad string>")
209 { 246 {
210 L.requireFailure("require 'lanes'.configure{internal_allocator = true}"); 247 L.requireFailure("require 'lanes'.configure{internal_allocator = 'gluh'}");
211 } 248 }
212 249
213 // ----------------------------------------------------------------------------------------- 250 // ---------------------------------------------------------------------------------------------
214 251
215 SECTION("internal_allocator = <table>") 252 SECTION("internal_allocator = 'libc'")
216 { 253 {
217 L.requireFailure("require 'lanes'.configure{internal_allocator = {}}"); 254 L.requireSuccess("require 'lanes'.configure{internal_allocator = 'libc'}");
218 } 255 }
219 256
220 // ----------------------------------------------------------------------------------------- 257 // ---------------------------------------------------------------------------------------------
221 258
222 SECTION("internal_allocator = <Lua function>") 259 SECTION("internal_allocator = 'allocator'")
223 { 260 {
224 L.requireFailure("require 'lanes'.configure{internal_allocator = function() end}"); 261 L.requireSuccess("require 'lanes'.configure{internal_allocator = 'allocator'}");
225 } 262 }
263}
226 264
227 // ----------------------------------------------------------------------------------------- 265// #################################################################################################
228 266
229 SECTION("internal_allocator = <bad string>") 267TEST_CASE("lanes.configure.keepers_gc_threshold")
230 { 268{
231 L.requireFailure("require 'lanes'.configure{internal_allocator = 'gluh'}"); 269 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
232 }
233 270
234 // ----------------------------------------------------------------------------------------- 271 // keepers_gc_threshold should be a number in [0, 100]
235 272
236 SECTION("internal_allocator = 'libc'") 273 SECTION("keepers_gc_threshold = <table>")
237 { 274 {
238 L.requireSuccess("require 'lanes'.configure{internal_allocator = 'libc'}"); 275 L.requireFailure("require 'lanes'.configure{keepers_gc_threshold = {}}");
239 } 276 }
240 277
241 // ----------------------------------------------------------------------------------------- 278 // ---------------------------------------------------------------------------------------------
242 279
243 SECTION("internal_allocator = 'allocator'") 280 SECTION("keepers_gc_threshold = <string>")
244 { 281 {
245 L.requireSuccess("require 'lanes'.configure{internal_allocator = 'allocator'}"); 282 L.requireFailure("require 'lanes'.configure{keepers_gc_threshold = 'gluh'}");
246 }
247 } 283 }
248 284
249 // --------------------------------------------------------------------------------------------- 285 // ---------------------------------------------------------------------------------------------
250 // keepers_gc_threshold should be a number in [0, 100]
251 286
252 SECTION("keepers_gc_threshold") 287 SECTION("keepers_gc_threshold = -1")
253 { 288 {
254 SECTION("keepers_gc_threshold = <table>") 289 L.requireSuccess("require 'lanes'.configure{keepers_gc_threshold = -1}");
255 { 290 }
256 L.requireFailure("require 'lanes'.configure{keepers_gc_threshold = {}}");
257 }
258 291
259 // ----------------------------------------------------------------------------------------- 292 // ---------------------------------------------------------------------------------------------
260 293
261 SECTION("keepers_gc_threshold = <string>") 294 SECTION("keepers_gc_threshold = 0")
262 { 295 {
263 L.requireFailure("require 'lanes'.configure{keepers_gc_threshold = 'gluh'}"); 296 L.requireSuccess("require 'lanes'.configure{keepers_gc_threshold = 0}");
264 } 297 }
265 298
266 // ----------------------------------------------------------------------------------------- 299 // ---------------------------------------------------------------------------------------------
267 300
268 SECTION("keepers_gc_threshold = -1") 301 SECTION("keepers_gc_threshold = 100")
269 { 302 {
270 L.requireSuccess("require 'lanes'.configure{keepers_gc_threshold = -1}"); 303 L.requireSuccess("require 'lanes'.configure{keepers_gc_threshold = 100}");
271 } 304 }
305}
272 306
273 // ----------------------------------------------------------------------------------------- 307// #################################################################################################
274 308
275 SECTION("keepers_gc_threshold = 0") 309TEST_CASE("lanes.configure.linda_wake_period")
276 { 310{
277 L.requireSuccess("require 'lanes'.configure{keepers_gc_threshold = 0}"); 311 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
278 }
279 312
280 // ----------------------------------------------------------------------------------------- 313 // linda_wake_period should be a number > 0, or 'never'
281 314
282 SECTION("keepers_gc_threshold = 100") 315 SECTION("linda_wake_period = <table>")
283 { 316 {
284 L.requireSuccess("require 'lanes'.configure{keepers_gc_threshold = 100}"); 317 L.requireFailure("require 'lanes'.configure{linda_wake_period = {}}");
285 }
286 } 318 }
287 319
288 // --------------------------------------------------------------------------------------------- 320 // ---------------------------------------------------------------------------------------------
289 // nb_user_keepers should be a number in [0, 100]
290 321
291 SECTION("nb_user_keepers") 322 SECTION("linda_wake_period = <string>")
292 { 323 {
293 SECTION("nb_user_keepers = <table>") 324 L.requireFailure("require 'lanes'.configure{linda_wake_period = 'gluh'}");
294 { 325 }
295 L.requireFailure("require 'lanes'.configure{nb_user_keepers = {}}");
296 }
297 326
298 // ----------------------------------------------------------------------------------------- 327 // ---------------------------------------------------------------------------------------------
299 328
300 SECTION("nb_user_keepers = <string>") 329 SECTION("linda_wake_period = 'never'")
301 { 330 {
302 L.requireFailure("require 'lanes'.configure{nb_user_keepers = 'gluh'}"); 331 L.requireSuccess("require 'lanes'.configure{linda_wake_period = 'never'}");
303 } 332 }
304 333
305 // ----------------------------------------------------------------------------------------- 334 // ---------------------------------------------------------------------------------------------
306 335
307 SECTION("nb_user_keepers = -1") 336 SECTION("linda_wake_period = <negative number>")
308 { 337 {
309 L.requireFailure("require 'lanes'.configure{nb_user_keepers = -1}"); 338 L.requireFailure("require 'lanes'.configure{linda_wake_period = -0.001}");
310 } 339 }
311 340
312 // ----------------------------------------------------------------------------------------- 341 // ---------------------------------------------------------------------------------------------
313 342
314 SECTION("nb_user_keepers = 0") 343 SECTION("linda_wake_period = 0")
315 { 344 {
316 L.requireSuccess("require 'lanes'.configure{nb_user_keepers = 0}"); 345 L.requireFailure("require 'lanes'.configure{linda_wake_period = 0}");
317 } 346 }
347
348 // ---------------------------------------------------------------------------------------------
318 349
319 // ----------------------------------------------------------------------------------------- 350 SECTION("linda_wake_period = 0.0001s")
351 {
352 L.requireSuccess("require 'lanes'.configure{linda_wake_period = 0.0001}");
353 }
320 354
321 SECTION("nb_user_keepers = 100") 355 // ---------------------------------------------------------------------------------------------
322 {
323 L.requireSuccess("require 'lanes'.configure{nb_user_keepers = 100}");
324 }
325 356
326 // ----------------------------------------------------------------------------------------- 357 SECTION("linda_wake_period = 1e30")
358 {
359 L.requireSuccess("require 'lanes'.configure{linda_wake_period = 1e30}");
360 }
361}
327 362
328 SECTION("nb_user_keepers = 101") 363// #################################################################################################
329 { 364
330 L.requireFailure("require 'lanes'.configure{nb_user_keepers = 101}"); 365TEST_CASE("lanes.configure.nb_user_keepers")
331 } 366{
367 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
368
369 // nb_user_keepers should be a number in [0, 100]
370
371 SECTION("nb_user_keepers = <table>")
372 {
373 L.requireFailure("require 'lanes'.configure{nb_user_keepers = {}}");
332 } 374 }
333 375
334 // --------------------------------------------------------------------------------------------- 376 // ---------------------------------------------------------------------------------------------
335 // on_state_create should be a function, either C or Lua, without upvalues
336 377
337 SECTION("on_state_create") 378 SECTION("nb_user_keepers = <string>")
338 { 379 {
339 SECTION("on_state_create = <table>") 380 L.requireFailure("require 'lanes'.configure{nb_user_keepers = 'gluh'}");
340 { 381 }
341 L.requireFailure("require 'lanes'.configure{on_state_create = {}}");
342 }
343 382
344 // ----------------------------------------------------------------------------------------- 383 // ---------------------------------------------------------------------------------------------
345 384
346 SECTION("on_state_create = <string>") 385 SECTION("nb_user_keepers = -1")
347 { 386 {
348 L.requireFailure("require 'lanes'.configure{on_state_create = 'gluh'}"); 387 L.requireFailure("require 'lanes'.configure{nb_user_keepers = -1}");
349 } 388 }
389
390 // ---------------------------------------------------------------------------------------------
350 391
351 // ----------------------------------------------------------------------------------------- 392 SECTION("nb_user_keepers = 0")
393 {
394 L.requireSuccess("require 'lanes'.configure{nb_user_keepers = 0}");
395 }
352 396
353 SECTION("on_state_create = <number>") 397 // ---------------------------------------------------------------------------------------------
354 {
355 L.requireFailure("require 'lanes'.configure{on_state_create = 1}");
356 }
357 398
358 // ----------------------------------------------------------------------------------------- 399 SECTION("nb_user_keepers = 1")
400 {
401 L.requireSuccess("require 'lanes'.configure{nb_user_keepers = 1}");
402 }
359 403
360 SECTION("on_state_create = false") 404 // ---------------------------------------------------------------------------------------------
361 {
362 L.requireFailure("require 'lanes'.configure{on_state_create = false}");
363 }
364 405
365 // ----------------------------------------------------------------------------------------- 406 SECTION("nb_user_keepers = 100")
407 {
408 L.requireSuccess("require 'lanes'.configure{nb_user_keepers = 100}");
409 }
366 410
367 SECTION("on_state_create = true") 411 // -----------------------------------------------------------------------------------------
368 {
369 L.requireFailure("require 'lanes'.configure{on_state_create = true}");
370 }
371 412
372 // ----------------------------------------------------------------------------------------- 413 SECTION("nb_user_keepers = 101")
414 {
415 L.requireFailure("require 'lanes'.configure{nb_user_keepers = 101}");
416 }
417}
373 418
374 SECTION("on_state_create = <Lua function>") 419// #################################################################################################
375 { 420
376 // on_state_create isn't called inside a Keeper state if it's a Lua function (which is good as print() doesn't exist there!) 421TEST_CASE("lanes.configure.on_state_create/configuration")
377 L.requireSuccess("local print = print; require 'lanes'.configure{on_state_create = function() print 'hello' end}"); 422{
378 } 423 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
379 424
380 // ----------------------------------------------------------------------------------------- 425 // on_state_create should be a function, either C or Lua, without upvalues
381 426
382 SECTION("on_state_create = <C function>") 427 SECTION("on_state_create = <table>")
383 { 428 {
384 // funnily enough, in Lua 5.3, print() uses global tostring(), that doesn't exist in a keeper since we didn't open libs -> "attempt to call a nil value" 429 L.requireFailure("require 'lanes'.configure{on_state_create = {}}");
385 // conclusion, don't use print() as a fake on_state_create() callback!
386 // assert() should be fine since we pass a non-false argument to on_state_create
387 L.requireSuccess("require 'lanes'.configure{on_state_create = assert}");
388 }
389 } 430 }
390 431
391 // --------------------------------------------------------------------------------------------- 432 // ---------------------------------------------------------------------------------------------
392 // shutdown_timeout should be a number in [0,3600]
393 433
394 SECTION("shutdown_timeout") 434 SECTION("on_state_create = <string>")
395 { 435 {
396 SECTION("shutdown_timeout = <table>") 436 L.requireFailure("require 'lanes'.configure{on_state_create = 'gluh'}");
397 { 437 }
398 L.requireFailure("require 'lanes'.configure{shutdown_timeout = {}}");
399 }
400 438
401 // ----------------------------------------------------------------------------------------- 439 // ---------------------------------------------------------------------------------------------
402 440
403 SECTION("shutdown_timeout = <string>") 441 SECTION("on_state_create = <number>")
404 { 442 {
405 L.requireFailure("require 'lanes'.configure{shutdown_timeout = 'gluh'}"); 443 L.requireFailure("require 'lanes'.configure{on_state_create = 1}");
406 } 444 }
407 445
408 // ----------------------------------------------------------------------------------------- 446 // ---------------------------------------------------------------------------------------------
409 447
410 SECTION("shutdown_timeout = <negative number>") 448 SECTION("on_state_create = false")
411 { 449 {
412 L.requireFailure("require 'lanes'.configure{shutdown_timeout = -0.001}"); 450 L.requireFailure("require 'lanes'.configure{on_state_create = false}");
413 } 451 }
414 452
415 // ----------------------------------------------------------------------------------------- 453 // ---------------------------------------------------------------------------------------------
416 454
417 SECTION("shutdown_timeout = 0") 455 SECTION("on_state_create = true")
418 { 456 {
419 L.requireSuccess("require 'lanes'.configure{shutdown_timeout = 0}"); 457 L.requireFailure("require 'lanes'.configure{on_state_create = true}");
420 } 458 }
421 459
422 // ----------------------------------------------------------------------------------------- 460 // ---------------------------------------------------------------------------------------------
423 461
424 SECTION("shutdown_timeout = 1s") 462 SECTION("on_state_create = <Lua function>")
425 { 463 {
426 L.requireSuccess("require 'lanes'.configure{shutdown_timeout = 1}"); 464 // on_state_create isn't called inside a Keeper state if it's a Lua function (which is good as print() doesn't exist there!)
427 } 465 L.requireSuccess("local print = print; require 'lanes'.configure{on_state_create = function() print 'hello' end}");
466 }
428 467
429 // ----------------------------------------------------------------------------------------- 468 // ---------------------------------------------------------------------------------------------
430 469
431 SECTION("shutdown_timeout = 3600s") 470 SECTION("on_state_create = <C function>")
432 { 471 {
433 L.requireSuccess("require 'lanes'.configure{shutdown_timeout = 3600}"); 472 // funnily enough, in Lua 5.3, print() uses global tostring(), that doesn't exist in a keeper since we didn't open libs -> "attempt to call a nil value"
434 } 473 // conclusion, don't use print() as a fake on_state_create() callback!
474 // assert() should be fine since we pass a non-false argument to on_state_create
475 L.requireSuccess("require 'lanes'.configure{on_state_create = assert}");
476 }
477}
435 478
436 // ----------------------------------------------------------------------------------------- 479// #################################################################################################
437 480
438 SECTION("shutdown_timeout = <too long>") 481TEST_CASE("lanes.configure.shutdown_timeout")
439 { 482{
440 L.requireFailure("require 'lanes'.configure{shutdown_timeout = 3600.001}"); 483 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
441 } 484
485 // shutdown_timeout should be a number in [0,3600]
486
487 SECTION("shutdown_timeout = <table>")
488 {
489 L.requireFailure("require 'lanes'.configure{shutdown_timeout = {}}");
442 } 490 }
443 491
444 // --------------------------------------------------------------------------------------------- 492 // ---------------------------------------------------------------------------------------------
445 // strip_functions should be a boolean
446 493
447 SECTION("strip_functions") 494 SECTION("shutdown_timeout = <string>")
448 { 495 {
449 SECTION("strip_functions = <table>") 496 L.requireFailure("require 'lanes'.configure{shutdown_timeout = 'gluh'}");
450 { 497 }
451 L.requireFailure("require 'lanes'.configure{strip_functions = {}}");
452 }
453 498
454 // ----------------------------------------------------------------------------------------- 499 // ---------------------------------------------------------------------------------------------
455 500
456 SECTION("strip_functions = <string>") 501 SECTION("shutdown_timeout = <negative number>")
457 { 502 {
458 L.requireFailure("require 'lanes'.configure{strip_functions = 'gluh'}"); 503 L.requireFailure("require 'lanes'.configure{shutdown_timeout = -0.001}");
459 } 504 }
460 505
461 // ----------------------------------------------------------------------------------------- 506 // ---------------------------------------------------------------------------------------------
462 507
463 SECTION("strip_functions = <number>") 508 SECTION("shutdown_timeout = 0")
464 { 509 {
465 L.requireFailure("require 'lanes'.configure{strip_functions = 1}"); 510 L.requireSuccess("require 'lanes'.configure{shutdown_timeout = 0}");
466 } 511 }
467 512
468 // ----------------------------------------------------------------------------------------- 513 // ---------------------------------------------------------------------------------------------
469 514
470 SECTION("strip_functions = <C function>") 515 SECTION("shutdown_timeout = 1s")
471 { 516 {
472 L.requireFailure("require 'lanes'.configure{strip_functions = print}"); 517 L.requireSuccess("require 'lanes'.configure{shutdown_timeout = 1}");
473 } 518 }
519
520 // ---------------------------------------------------------------------------------------------
474 521
475 // ----------------------------------------------------------------------------------------- 522 SECTION("shutdown_timeout = 3600s")
523 {
524 L.requireSuccess("require 'lanes'.configure{shutdown_timeout = 3600}");
525 }
476 526
477 SECTION("strip_functions = false") 527 // ---------------------------------------------------------------------------------------------
478 {
479 L.requireSuccess("require 'lanes'.configure{strip_functions = false}");
480 }
481 528
482 // ----------------------------------------------------------------------------------------- 529 SECTION("shutdown_timeout = <too long>")
530 {
531 L.requireFailure("require 'lanes'.configure{shutdown_timeout = 3600.001}");
532 }
533}
483 534
484 SECTION("strip_functions = true") 535// #################################################################################################
485 { 536
486 L.requireSuccess("require 'lanes'.configure{strip_functions = true}"); 537TEST_CASE("lanes.configure.strip_functions")
487 } 538{
539 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
540
541 // strip_functions should be a boolean
542
543 SECTION("strip_functions = <table>")
544 {
545 L.requireFailure("require 'lanes'.configure{strip_functions = {}}");
488 } 546 }
489 547
490 // --------------------------------------------------------------------------------------------- 548 // ---------------------------------------------------------------------------------------------
491 // track_lanes should be a boolean
492 549
493 SECTION("track_lanes") 550 SECTION("strip_functions = <string>")
494 { 551 {
495 SECTION("track_lanes = <table>") 552 L.requireFailure("require 'lanes'.configure{strip_functions = 'gluh'}");
496 { 553 }
497 L.requireFailure("require 'lanes'.configure{track_lanes = {}}");
498 }
499 554
500 // ----------------------------------------------------------------------------------------- 555 // ---------------------------------------------------------------------------------------------
501 556
502 SECTION("track_lanes = <string>") 557 SECTION("strip_functions = <number>")
503 { 558 {
504 L.requireFailure("require 'lanes'.configure{track_lanes = 'gluh'}"); 559 L.requireFailure("require 'lanes'.configure{strip_functions = 1}");
505 } 560 }
561
562 // ---------------------------------------------------------------------------------------------
506 563
507 // ----------------------------------------------------------------------------------------- 564 SECTION("strip_functions = <C function>")
565 {
566 L.requireFailure("require 'lanes'.configure{strip_functions = print}");
567 }
508 568
509 SECTION("track_lanes = <number>") 569 // ---------------------------------------------------------------------------------------------
510 {
511 L.requireFailure("require 'lanes'.configure{track_lanes = 1}");
512 }
513 570
514 // ----------------------------------------------------------------------------------------- 571 SECTION("strip_functions = false")
572 {
573 L.requireSuccess("require 'lanes'.configure{strip_functions = false}");
574 }
515 575
516 SECTION("track_lanes = <C function>") 576 // ---------------------------------------------------------------------------------------------
517 {
518 L.requireFailure("require 'lanes'.configure{track_lanes = print}");
519 }
520 577
521 // ----------------------------------------------------------------------------------------- 578 SECTION("strip_functions = true")
579 {
580 L.requireSuccess("require 'lanes'.configure{strip_functions = true}");
581 }
582}
522 583
523 SECTION("track_lanes = false") 584// #################################################################################################
524 {
525 L.requireSuccess("require 'lanes'.configure{track_lanes = false}");
526 }
527 585
528 // ----------------------------------------------------------------------------------------- 586TEST_CASE("lanes.configure.track_lanes")
587{
588 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
529 589
530 SECTION("track_lanes = true") 590 // track_lanes should be a boolean
531 { 591
532 L.requireSuccess("require 'lanes'.configure{track_lanes = true}"); 592 SECTION("track_lanes = <table>")
533 } 593 {
594 L.requireFailure("require 'lanes'.configure{track_lanes = {}}");
534 } 595 }
535 596
536 // --------------------------------------------------------------------------------------------- 597 // ---------------------------------------------------------------------------------------------
537 // verbose_errors should be a boolean
538 598
539 SECTION("verbose_errors") 599 SECTION("track_lanes = <string>")
540 { 600 {
541 SECTION("verbose_errors = <table>") 601 L.requireFailure("require 'lanes'.configure{track_lanes = 'gluh'}");
542 { 602 }
543 L.requireFailure("require 'lanes'.configure{verbose_errors = {}}");
544 }
545 603
546 // ----------------------------------------------------------------------------------------- 604 // ---------------------------------------------------------------------------------------------
547 605
548 SECTION("verbose_errors = <string>") 606 SECTION("track_lanes = <number>")
549 { 607 {
550 L.requireFailure("require 'lanes'.configure{verbose_errors = 'gluh'}"); 608 L.requireFailure("require 'lanes'.configure{track_lanes = 1}");
551 } 609 }
552 610
553 // ----------------------------------------------------------------------------------------- 611 // ---------------------------------------------------------------------------------------------
554 612
555 SECTION("verbose_errors = <number>") 613 SECTION("track_lanes = <C function>")
556 { 614 {
557 L.requireFailure("require 'lanes'.configure{verbose_errors = 1}"); 615 L.requireFailure("require 'lanes'.configure{track_lanes = print}");
558 } 616 }
559 617
560 // ----------------------------------------------------------------------------------------- 618 // ---------------------------------------------------------------------------------------------
561 619
562 SECTION("verbose_errors = <C function>") 620 SECTION("track_lanes = false")
563 { 621 {
564 L.requireFailure("require 'lanes'.configure{verbose_errors = print}"); 622 L.requireSuccess("require 'lanes'.configure{track_lanes = false}");
565 } 623 }
566 624
567 // ----------------------------------------------------------------------------------------- 625 // ---------------------------------------------------------------------------------------------
568 626
569 SECTION("verbose_errors = false") 627 SECTION("track_lanes = true")
570 { 628 {
571 L.requireSuccess("require 'lanes'.configure{verbose_errors = false}"); 629 L.requireSuccess("require 'lanes'.configure{track_lanes = true}");
572 } 630 }
631}
573 632
574 // ----------------------------------------------------------------------------------------- 633// #################################################################################################
575 634
576 SECTION("verbose_errors = true") 635TEST_CASE("lanes.configure.verbose_errors")
577 { 636{
578 L.requireSuccess("require 'lanes'.configure{verbose_errors = true}"); 637 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
579 } 638
639 // verbose_errors should be a boolean
640
641 SECTION("verbose_errors = <table>")
642 {
643 L.requireFailure("require 'lanes'.configure{verbose_errors = {}}");
580 } 644 }
581 645
582 // --------------------------------------------------------------------------------------------- 646 // ---------------------------------------------------------------------------------------------
583 // with_timers should be a boolean
584 647
585 SECTION("with_timers") 648 SECTION("verbose_errors = <string>")
586 { 649 {
587 SECTION("with_timers = <table>") 650 L.requireFailure("require 'lanes'.configure{verbose_errors = 'gluh'}");
588 { 651 }
589 L.requireFailure("require 'lanes'.configure{with_timers = {}}");
590 }
591 652
592 // ----------------------------------------------------------------------------------------- 653 // ---------------------------------------------------------------------------------------------
593 654
594 SECTION("with_timers = <string>") 655 SECTION("verbose_errors = <number>")
595 { 656 {
596 L.requireFailure("require 'lanes'.configure{with_timers = 'gluh'}"); 657 L.requireFailure("require 'lanes'.configure{verbose_errors = 1}");
597 } 658 }
598 659
599 // ----------------------------------------------------------------------------------------- 660 // ---------------------------------------------------------------------------------------------
600 661
601 SECTION("with_timers = <number>") 662 SECTION("verbose_errors = <C function>")
602 { 663 {
603 L.requireFailure("require 'lanes'.configure{with_timers = 1}"); 664 L.requireFailure("require 'lanes'.configure{verbose_errors = print}");
604 } 665 }
605 666
606 // ----------------------------------------------------------------------------------------- 667 // ---------------------------------------------------------------------------------------------
607 668
608 SECTION("with_timers = <C function>") 669 SECTION("verbose_errors = false")
609 { 670 {
610 L.requireFailure("require 'lanes'.configure{with_timers = print}"); 671 L.requireSuccess("require 'lanes'.configure{verbose_errors = false}");
611 } 672 }
612 673
613 // ----------------------------------------------------------------------------------------- 674 // ---------------------------------------------------------------------------------------------
614 675
615 SECTION("with_timers = false") 676 SECTION("verbose_errors = true")
616 { 677 {
617 L.requireSuccess("require 'lanes'.configure{with_timers = false}"); 678 L.requireSuccess("require 'lanes'.configure{verbose_errors = true}");
618 } 679 }
680}
619 681
620 // ----------------------------------------------------------------------------------------- 682// #################################################################################################
621 683
622 SECTION("with_timers = true") 684TEST_CASE("lanes.configure.with_timers")
623 { 685{
624 L.requireSuccess("require 'lanes'.configure{with_timers = true}"); 686 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
625 } 687
688 // with_timers should be a boolean
689
690 SECTION("with_timers = <table>")
691 {
692 L.requireFailure("require 'lanes'.configure{with_timers = {}}");
693 }
694
695 // ---------------------------------------------------------------------------------------------
696
697 SECTION("with_timers = <string>")
698 {
699 L.requireFailure("require 'lanes'.configure{with_timers = 'gluh'}");
700 }
701
702 // ---------------------------------------------------------------------------------------------
703
704 SECTION("with_timers = <number>")
705 {
706 L.requireFailure("require 'lanes'.configure{with_timers = 1}");
626 } 707 }
627 708
628 // --------------------------------------------------------------------------------------------- 709 // ---------------------------------------------------------------------------------------------
710
711 SECTION("with_timers = <C function>")
712 {
713 L.requireFailure("require 'lanes'.configure{with_timers = print}");
714 }
715
716 // ---------------------------------------------------------------------------------------------
717
718 SECTION("with_timers = false")
719 {
720 L.requireSuccess("require 'lanes'.configure{with_timers = false}");
721 }
722
723 // ---------------------------------------------------------------------------------------------
724
725 SECTION("with_timers = true")
726 {
727 L.requireSuccess("require 'lanes'.configure{with_timers = true}");
728 }
729}
730
731// #################################################################################################
732
733TEST_CASE("lanes.configure.unknown_setting")
734{
735 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
736
629 // any unknown setting should be rejected 737 // any unknown setting should be rejected
630 738
631 SECTION("unknown_setting") 739 SECTION("table setting")
632 { 740 {
633 SECTION("table setting") 741 L.requireFailure("require 'lanes'.configure{[{}] = {}}");
634 { 742 }
635 L.requireFailure("require 'lanes'.configure{[{}] = {}}");
636 }
637 743
638 // ----------------------------------------------------------------------------------------- 744 // ---------------------------------------------------------------------------------------------
639 745
640 SECTION("boolean setting") 746 SECTION("boolean setting")
641 { 747 {
642 L.requireFailure("require 'lanes'.configure{[true] = 'gluh'}"); 748 L.requireFailure("require 'lanes'.configure{[true] = 'gluh'}");
643 } 749 }
644 750
645 // ----------------------------------------------------------------------------------------- 751 // ---------------------------------------------------------------------------------------------
646 752
647 SECTION("function setting") 753 SECTION("function setting")
648 { 754 {
649 L.requireFailure("require 'lanes'.configure{[function() end] = 1}"); 755 L.requireFailure("require 'lanes'.configure{[function() end] = 1}");
650 } 756 }
651 757
652 // ----------------------------------------------------------------------------------------- 758 // ---------------------------------------------------------------------------------------------
653 759
654 SECTION("number setting") 760 SECTION("number setting")
655 { 761 {
656 L.requireFailure("require 'lanes'.configure{[1] = function() end}"); 762 L.requireFailure("require 'lanes'.configure{[1] = function() end}");
657 } 763 }
658 764
659 // ----------------------------------------------------------------------------------------- 765 // ---------------------------------------------------------------------------------------------
660 766
661 SECTION("unknown string setting") 767 SECTION("unknown string setting")
662 { 768 {
663 L.requireFailure("require 'lanes'.configure{['gluh'] = false}"); 769 L.requireFailure("require 'lanes'.configure{['gluh'] = false}");
664 }
665 } 770 }
666} 771}
667 772
@@ -670,7 +775,7 @@ TEST_CASE("lanes.configure")
670 775
671#if LUAJIT_FLAVOR() == 0 776#if LUAJIT_FLAVOR() == 0
672// TODO: this test crashes inside S.close() against LuaJIT. to be investigated 777// TODO: this test crashes inside S.close() against LuaJIT. to be investigated
673TEST_CASE("lanes.finally.no fixture") 778TEST_CASE("lanes.finally.no_fixture")
674{ 779{
675 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } }; 780 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
676 // we need Lanes to be up. Since we run several 'scripts', we store it as a global 781 // we need Lanes to be up. Since we run several 'scripts', we store it as a global
@@ -691,7 +796,7 @@ TEST_CASE("lanes.finally.no fixture")
691 796
692// ################################################################################################# 797// #################################################################################################
693 798
694TEST_CASE("lanes.finally.with fixture") 799TEST_CASE("lanes.finally.with_fixture")
695{ 800{
696 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } }; 801 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
697 802
@@ -709,7 +814,7 @@ TEST_CASE("lanes.finally.with fixture")
709 814
710// ################################################################################################# 815// #################################################################################################
711 816
712TEST_CASE("lanes.finally.shutdown with an uncooperative lane") 817TEST_CASE("lanes.finally.shutdown_with_an_uncooperative_lane")
713{ 818{
714 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } }; 819 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
715 S.requireSuccess("lanes = require 'lanes'.configure()"); 820 S.requireSuccess("lanes = require 'lanes'.configure()");
@@ -758,7 +863,7 @@ namespace
758 863
759// ################################################################################################# 864// #################################################################################################
760 865
761TEST_CASE("lanes.on_state_create setting") 866TEST_CASE("lanes.configure.on_state_create/details")
762{ 867{
763 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } }; 868 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
764 869
@@ -829,6 +934,7 @@ TEST_CASE("lanes.on_state_create setting")
829 // launch a Lane that requires the module. It should succeed because _on_state_create was called and made it possible 934 // launch a Lane that requires the module. It should succeed because _on_state_create was called and made it possible
830 std::string_view const _script{ 935 std::string_view const _script{
831 " f = lanes.gen('*'," 936 " f = lanes.gen('*',"
937 " { name = 'auto' },"
832 " function()" 938 " function()"
833 " local Stuff = require ('Stuff')" 939 " local Stuff = require ('Stuff')"
834 " Stuff.DoStuffInC()" 940 " Stuff.DoStuffInC()"
diff --git a/unit_tests/lane_tests.cpp b/unit_tests/lane_tests.cpp
index bf239ba..b6fb188 100644
--- a/unit_tests/lane_tests.cpp
+++ b/unit_tests/lane_tests.cpp
@@ -1,5 +1,7 @@
1#include "_pch.hpp" 1#include "_pch.hpp"
2
2#include "shared.h" 3#include "shared.h"
4#include "lanes/src/threading.hpp"
3 5
4// ################################################################################################# 6// #################################################################################################
5// ################################################################################################# 7// #################################################################################################
@@ -33,7 +35,77 @@ TEST_CASE("lanes.nameof")
33// ################################################################################################# 35// #################################################################################################
34// ################################################################################################# 36// #################################################################################################
35 37
36TEST_CASE("lanes.sleep.argument validation") 38TEST_CASE("lanes.thread_priority_range")
39{
40 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
41 S.requireSuccess("lanes = require 'lanes'.configure()");
42
43 S.requireSuccess("a, b = lanes.thread_priority_range(); print(a, b)");
44 S.requireSuccess("assert(type(a) == 'number' and type(b) == 'number' and b > a)");
45 S.requireSuccess("c, d = lanes.thread_priority_range('native'); print(c, d)");
46 S.requireSuccess("assert(type(c) == 'number' and type(d) == 'number' and d > c)");
47
48 // can't really test the range of values from pthread as they are platform-dependent
49 if constexpr (THREADAPI == THREADAPI_WINDOWS) {
50 // windows constants THREAD_PRIORITY_IDLE and THREAD_PRIORITY_TIME_CRITICAL
51 S.requireSuccess("assert(c == -15 and d == 15)");
52 }
53}
54
55// #################################################################################################
56// #################################################################################################
57
58TEST_CASE("lanes.set_thread_priority")
59{
60 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
61 S.requireSuccess("lanes = require 'lanes'.configure()");
62
63 SECTION("mapped priorities")
64 {
65 std::string_view const _script{
66 " min_prio, max_prio = lanes.thread_priority_range()"
67 " for prio = min_prio, max_prio do"
68 " lanes.set_thread_priority(prio)"
69 " end"
70 };
71 S.requireSuccess(_script);
72
73 S.requireFailure("lanes.set_thread_priority(min_prio - 1)");
74 S.requireFailure("lanes.set_thread_priority(max_prio + 1)");
75 }
76
77 SECTION("native priorities")
78 {
79 S.requireSuccess("min_prio, max_prio = lanes.thread_priority_range('native')");
80 if constexpr (THREADAPI == THREADAPI_WINDOWS) {
81 // Win32 range is -15 to 15, but only some values are accepted
82 S.requireSuccess("lanes.set_thread_priority(-15, 'native')"); // THREAD_PRIORITY_IDLE
83 S.requireFailure("lanes.set_thread_priority(-3, 'native')");
84 S.requireSuccess("lanes.set_thread_priority(-2, 'native')"); // THREAD_PRIORITY_LOWEST
85 S.requireSuccess("lanes.set_thread_priority(-1, 'native')"); // THREAD_PRIORITY_BELOW_NORMAL
86 S.requireSuccess("lanes.set_thread_priority(0, 'native')"); // THREAD_PRIORITY_NORMAL
87 S.requireSuccess("lanes.set_thread_priority(1, 'native')"); // THREAD_PRIORITY_ABOVE_NORMAL
88 S.requireSuccess("lanes.set_thread_priority(2, 'native')"); // THREAD_PRIORITY_HIGHEST
89 S.requireFailure("lanes.set_thread_priority(3, 'native')");
90 S.requireSuccess("lanes.set_thread_priority(-15, 'native')"); // THREAD_PRIORITY_TIME_CRITICAL
91 } else {
92 // until proven otherwise, the full set of values is supported by pthread
93 std::string_view const _script{
94 " for prio = min_prio, max_prio do"
95 " lanes.set_thread_priority(prio, 'native')"
96 " end"
97 };
98 S.requireSuccess(_script);
99 }
100 S.requireFailure("lanes.set_thread_priority(min_prio - 1)");
101 S.requireFailure("lanes.set_thread_priority(max_prio + 1)");
102 }
103}
104
105// #################################################################################################
106// #################################################################################################
107
108TEST_CASE("lanes.sleep.argument_validation/not_numbers")
37{ 109{
38 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } }; 110 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
39 S.requireSuccess("lanes = require 'lanes'.configure()"); 111 S.requireSuccess("lanes = require 'lanes'.configure()");
@@ -44,6 +116,14 @@ TEST_CASE("lanes.sleep.argument validation")
44 S.requireFailure("lanes.sleep('a string')"); 116 S.requireFailure("lanes.sleep('a string')");
45 S.requireFailure("lanes.sleep(lanes.null)"); 117 S.requireFailure("lanes.sleep(lanes.null)");
46 S.requireFailure("lanes.sleep(print)"); 118 S.requireFailure("lanes.sleep(print)");
119}
120
121// #################################################################################################
122
123TEST_CASE("lanes.sleep.argument_validation/numbers")
124{
125 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
126 S.requireSuccess("lanes = require 'lanes'.configure()");
47 127
48 // negative durations are not supported 128 // negative durations are not supported
49 S.requireFailure("lanes.sleep(-1)"); 129 S.requireFailure("lanes.sleep(-1)");
@@ -80,7 +160,7 @@ TEST_CASE("lanes.sleep.interactions with timers")
80 " local l = lanes.linda()" 160 " local l = lanes.linda()"
81 " lanes.timer(l, 'gluh', 0.1, 0.1)" 161 " lanes.timer(l, 'gluh', 0.1, 0.1)"
82 // launch a lane that is supposed to sleep forever 162 // launch a lane that is supposed to sleep forever
83 " local g = lanes.gen('*', lanes.sleep)" 163 " local g = lanes.gen('*', { name = 'auto' }, lanes.sleep)"
84 " local h = g('indefinitely')" 164 " local h = g('indefinitely')"
85 // sleep 1 second (this uses the timer linda) 165 // sleep 1 second (this uses the timer linda)
86 " lanes.sleep(1)" 166 " lanes.sleep(1)"
@@ -97,88 +177,109 @@ TEST_CASE("lanes.sleep.interactions with timers")
97// ################################################################################################# 177// #################################################################################################
98// ################################################################################################# 178// #################################################################################################
99 179
100TEST_CASE("lanes.gen") 180TEST_CASE("lanes.gen.argument_checks")
101{ 181{
102 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } }; 182 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
103 S.requireSuccess("lanes = require 'lanes'.configure()"); 183 S.requireSuccess("lanes = require 'lanes'.configure()");
104 184
105 // --------------------------------------------------------------------------------------------- 185 // ---------------------------------------------------------------------------------------------
106 186
107 SECTION("argument checks") 187 // no argument is bad
108 { 188 S.requireFailure("lanes.gen()");
109 // no parameter is bad 189
110 S.requireFailure("lanes.gen()"); 190 // minimal generator needs a function
111 191 S.requireSuccess("lanes.gen(function() end)");
112 // minimal generator needs a function 192
113 S.requireSuccess("lanes.gen(function() end)"); 193 // acceptable arguments for the generator are strings, tables, nil, followed by the function body
114 194 S.requireSuccess("lanes.gen(nil, function() end)");
115 // acceptable parameters for the generator are strings, tables, nil, followed by the function body 195 S.requireSuccess("lanes.gen('', function() end)");
116 S.requireSuccess("lanes.gen(nil, function() end)"); 196 S.requireSuccess("lanes.gen({}, function() end)");
117 S.requireSuccess("lanes.gen('', function() end)"); 197 S.requireSuccess("lanes.gen('', {}, function() end)");
118 S.requireSuccess("lanes.gen({}, function() end)"); 198 S.requireSuccess("lanes.gen({}, '', function() end)");
119 S.requireSuccess("lanes.gen('', {}, function() end)"); 199 S.requireSuccess("lanes.gen('', '', function() end)");
120 S.requireSuccess("lanes.gen({}, '', function() end)"); 200 S.requireSuccess("lanes.gen({}, {}, function() end)");
121 S.requireSuccess("lanes.gen('', '', function() end)"); 201
122 S.requireSuccess("lanes.gen({}, {}, function() end)"); 202 // anything different should fail: booleans, numbers, any userdata
123 203 S.requireFailure("lanes.gen(false, function() end)");
124 // anything different should fail: booleans, numbers, any userdata 204 S.requireFailure("lanes.gen(true, function() end)");
125 S.requireFailure("lanes.gen(false, function() end)"); 205 S.requireFailure("lanes.gen(42, function() end)");
126 S.requireFailure("lanes.gen(true, function() end)"); 206 S.requireFailure("lanes.gen(io.stdin, function() end)");
127 S.requireFailure("lanes.gen(42, function() end)"); 207 S.requireFailure("lanes.gen(lanes.linda(), function() end)");
128 S.requireFailure("lanes.gen(io.stdin, function() end)"); 208 S.requireFailure("lanes.gen(lanes.linda():deep(), function() end)");
129 S.requireFailure("lanes.gen(lanes.linda(), function() end)"); 209
130 S.requireFailure("lanes.gen(lanes.linda():deep(), function() end)"); 210 // even if argument types are correct, the function must come last
131 211 S.requireFailure("lanes.gen(function() end, '')");
132 // even if parameter types are correct, the function must come last 212
133 S.requireFailure("lanes.gen(function() end, '')"); 213 // the strings should only list "known base libraries", in any order, or "*"
134 214 // if the particular Lua flavor we build for doesn't support them, they raise an error unless postfixed by '?'
135 // the strings should only list "known base libraries", in any order, or "*" 215 S.requireSuccess("lanes.gen('base', function() end)");
136 // if the particular Lua flavor we build for doesn't support them, they raise an error unless postfixed by '?' 216
137 S.requireSuccess("lanes.gen('base', function() end)"); 217 // bit, ffi, jit are LuaJIT-specific
138
139 // bit, ffi, jit are LuaJIT-specific
140#if LUAJIT_FLAVOR() == 0 218#if LUAJIT_FLAVOR() == 0
141 S.requireFailure("lanes.gen('bit,ffi,jit', function() end)"); 219 S.requireFailure("lanes.gen('bit,ffi,jit', function() end)");
142 S.requireSuccess("lanes.gen('bit?,ffi?,jit?', function() end)"); 220 S.requireSuccess("lanes.gen('bit?,ffi?,jit?', function() end)");
143#endif // LUAJIT_FLAVOR() 221#endif // LUAJIT_FLAVOR()
144 222
145 // bit32 library existed only in Lua 5.2, there is still a loader that will raise an error in Lua 5.3 223 // bit32 library existed only in Lua 5.2, there is still a loader that will raise an error in Lua 5.3
146#if LUA_VERSION_NUM == 502 || LUA_VERSION_NUM == 503 224#if LUA_VERSION_NUM == 502 || LUA_VERSION_NUM == 503
147 S.requireSuccess("lanes.gen('bit32', function() end)"); 225 S.requireSuccess("lanes.gen('bit32', function() end)");
148#else // LUA_VERSION_NUM == 502 || LUA_VERSION_NUM == 503 226#else // LUA_VERSION_NUM == 502 || LUA_VERSION_NUM == 503
149 S.requireFailure("lanes.gen('bit32', function() end)"); 227 S.requireFailure("lanes.gen('bit32', function() end)");
150 S.requireSuccess("lanes.gen('bit32?', function() end)"); 228 S.requireSuccess("lanes.gen('bit32?', function() end)");
151#endif // LUA_VERSION_NUM == 502 || LUA_VERSION_NUM == 503 229#endif // LUA_VERSION_NUM == 502 || LUA_VERSION_NUM == 503
152 230
153 // coroutine library appeared with Lua 5.2 231 // coroutine library appeared with Lua 5.2
154#if LUA_VERSION_NUM == 501 232#if LUA_VERSION_NUM == 501
155 S.requireFailure("lanes.gen('coroutine', function() end)"); 233 S.requireFailure("lanes.gen('coroutine', function() end)");
156 S.requireSuccess("lanes.gen('coroutine?', function() end)"); 234 S.requireSuccess("lanes.gen('coroutine?', function() end)");
157#endif // LUA_VERSION_NUM == 501 235#endif // LUA_VERSION_NUM == 501
158 236
159 S.requireSuccess("lanes.gen('debug', function() end)"); 237 S.requireSuccess("lanes.gen('debug', function() end)");
160 S.requireSuccess("lanes.gen('io', function() end)"); 238 S.requireSuccess("lanes.gen('io', function() end)");
161 S.requireSuccess("lanes.gen('math', function() end)"); 239 S.requireSuccess("lanes.gen('math', function() end)");
162 S.requireSuccess("lanes.gen('os', function() end)"); 240 S.requireSuccess("lanes.gen('os', function() end)");
163 S.requireSuccess("lanes.gen('package', function() end)"); 241 S.requireSuccess("lanes.gen('package', function() end)");
164 S.requireSuccess("lanes.gen('string', function() end)"); 242 S.requireSuccess("lanes.gen('string', function() end)");
165 S.requireSuccess("lanes.gen('table', function() end)"); 243 S.requireSuccess("lanes.gen('table', function() end)");
166 244
167 // utf8 library appeared with Lua 5.3 245 // utf8 library appeared with Lua 5.3
168#if LUA_VERSION_NUM < 503 246#if LUA_VERSION_NUM < 503
169 S.requireFailure("lanes.gen('utf8', function() end)"); 247 S.requireFailure("lanes.gen('utf8', function() end)");
170 S.requireSuccess("lanes.gen('utf8?', function() end)"); 248 S.requireSuccess("lanes.gen('utf8?', function() end)");
171#endif // LUA_VERSION_NUM < 503 249#endif // LUA_VERSION_NUM < 503
172 250
173 S.requireSuccess("lanes.gen('lanes_core', function() end)"); 251 S.requireSuccess("lanes.gen('lanes_core', function() end)");
174 // "*" repeated or combined with anything else is forbidden 252 // "*" repeated or combined with anything else is forbidden
175 S.requireFailure("lanes.gen('*', '*', function() end)"); 253 S.requireFailure("lanes.gen('*', '*', function() end)");
176 S.requireFailure("lanes.gen('base', '*', function() end)"); 254 S.requireFailure("lanes.gen('base', '*', function() end)");
177 // unknown names are forbidden 255 // unknown names are forbidden
178 S.requireFailure("lanes.gen('Base', function() end)"); 256 S.requireFailure("lanes.gen('Base', function() end)");
179 // repeating the same library more than once is forbidden 257 // repeating the same library more than once is forbidden
180 S.requireFailure("lanes.gen('base,base', function() end)"); 258 S.requireFailure("lanes.gen('base,base', function() end)");
181 } 259}
260
261// #################################################################################################
262// #################################################################################################
263
264TEST_CASE("lanes.gen.priority")
265{
266 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
267 S.requireSuccess("lanes = require 'lanes'.configure()");
268
269 S.requireSuccess("lanes.gen({priority=1}, function() end)");
270 // AFAICT, 1 is accepted by all pthread flavors and win32 API
271 S.requireSuccess("lanes.gen({native_priority=1}, function() end)");
272 // shouldn't be able to provide 2 priority settings
273 S.requireFailure("lanes.gen({priority=1, native_priority=1}, function() end)");
274}
275
276// #################################################################################################
277// #################################################################################################
278
279TEST_CASE("lanes.gen.thread_naming")
280{
281 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
282 S.requireSuccess("lanes = require 'lanes'.configure()");
182 283
183 // --------------------------------------------------------------------------------------------- 284 // ---------------------------------------------------------------------------------------------
184 285
@@ -319,19 +420,24 @@ TEST_CASE("lane.cancel")
319// unfortunately, VS Test adapter does not list individual sections, 420// unfortunately, VS Test adapter does not list individual sections,
320// so let's create a separate test case for each file with an ugly macro... 421// so let's create a separate test case for each file with an ugly macro...
321 422
322#define MAKE_TEST_CASE(DIR, FILE, CONDITION)\ 423#define MAKE_TEST_CASE(DIR, FILE, CONDITION) \
323TEST_CASE("scripted tests." #DIR "." #FILE) \ 424TEST_CASE("scripted_tests." #DIR "." #FILE) \
324{ \ 425{ \
325 FileRunner _runner(R"(.\unit_tests\scripts)"); \ 426 FileRunner _runner(R"(.\unit_tests\scripts)"); \
326 _runner.performTest(FileRunnerParam{ #DIR "/" #FILE, TestType::CONDITION }); \ 427 _runner.performTest(FileRunnerParam{ #DIR "/" #FILE, TestType::CONDITION }); \
327} 428}
328 429
430#if LUA_VERSION_NUM >= 504 // this makes use of to-be-closed variables, a Lua 5.4 feature
431#define MAKE_TEST_CASE_54(DIR, FILE, CONDITION) MAKE_TEST_CASE(DIR, FILE, CONDITION)
432#else // LUA_VERSION_NUM
433#define MAKE_TEST_CASE_54(DIR, FILE, CONDITION)
434#endif // LUA_VERSION_NUM
435
436MAKE_TEST_CASE(lane, body_is_a_c_function, AssertNoLuaError)
329MAKE_TEST_CASE(lane, cooperative_shutdown, AssertNoLuaError) 437MAKE_TEST_CASE(lane, cooperative_shutdown, AssertNoLuaError)
330#if LUAJIT_FLAVOR() == 0 438MAKE_TEST_CASE_54(lane, uncooperative_shutdown, AssertWarns) // NOTE: when this test ends, there are resource leaks and a dangling thread
331// TODO: for some reason, even though we throw as expected, the test fails with LuaJIT. To be investigated
332MAKE_TEST_CASE(lane, uncooperative_shutdown, AssertThrows)
333#endif // LUAJIT_FLAVOR()
334MAKE_TEST_CASE(lane, tasking_basic, AssertNoLuaError) 439MAKE_TEST_CASE(lane, tasking_basic, AssertNoLuaError)
440MAKE_TEST_CASE(lane, tasking_cancelling_with_hook, AssertNoLuaError)
335MAKE_TEST_CASE(lane, tasking_cancelling, AssertNoLuaError) 441MAKE_TEST_CASE(lane, tasking_cancelling, AssertNoLuaError)
336MAKE_TEST_CASE(lane, tasking_comms_criss_cross, AssertNoLuaError) 442MAKE_TEST_CASE(lane, tasking_comms_criss_cross, AssertNoLuaError)
337MAKE_TEST_CASE(lane, tasking_communications, AssertNoLuaError) 443MAKE_TEST_CASE(lane, tasking_communications, AssertNoLuaError)
@@ -339,19 +445,27 @@ MAKE_TEST_CASE(lane, tasking_error, AssertNoLuaError)
339MAKE_TEST_CASE(lane, tasking_join_test, AssertNoLuaError) 445MAKE_TEST_CASE(lane, tasking_join_test, AssertNoLuaError)
340MAKE_TEST_CASE(lane, tasking_send_receive_code, AssertNoLuaError) 446MAKE_TEST_CASE(lane, tasking_send_receive_code, AssertNoLuaError)
341MAKE_TEST_CASE(lane, stdlib_naming, AssertNoLuaError) 447MAKE_TEST_CASE(lane, stdlib_naming, AssertNoLuaError)
342MAKE_TEST_CASE(coro, basics, AssertNoLuaError) 448MAKE_TEST_CASE(coro, cancelling_suspended, AssertNoLuaError)
449MAKE_TEST_CASE_54(coro, collect_yielded_lane, AssertNoLuaError)
343#if LUAJIT_FLAVOR() == 0 450#if LUAJIT_FLAVOR() == 0
344// TODO: for some reason, the test fails with LuaJIT. To be investigated 451// TODO: for some reason, the test fails with LuaJIT. To be investigated
345MAKE_TEST_CASE(coro, error_handling, AssertNoLuaError) 452MAKE_TEST_CASE(coro, error_handling, AssertNoLuaError)
346#endif // LUAJIT_FLAVOR() 453#endif // LUAJIT_FLAVOR()
454MAKE_TEST_CASE(coro, index_suspended, AssertNoLuaError)
455MAKE_TEST_CASE(coro, join_suspended, AssertNoLuaError)
456MAKE_TEST_CASE_54(coro, linda_in_close_handler, AssertNoLuaError)
457MAKE_TEST_CASE(coro, regular_function, AssertNoLuaError)
458MAKE_TEST_CASE(coro, resume_basics, AssertNoLuaError)
459MAKE_TEST_CASE(coro, yielding_in_non_coro_errors, AssertNoLuaError)
347 460
348/* 461/*
349TEST_CASE("lanes.scripted tests") 462TEST_CASE("lanes.scripted_tests")
350{ 463{
351 auto const& _testParam = GENERATE( 464 auto const& _testParam = GENERATE(
352 FileRunnerParam{ PUC_LUA_ONLY("lane/cooperative_shutdown"), TestType::AssertNoLuaError }, // 0 465 FileRunnerParam{ PUC_LUA_ONLY("lane/cooperative_shutdown"), TestType::AssertNoLuaError }, // 0
353 FileRunnerParam{ "lane/uncooperative_shutdown", TestType::AssertThrows }, 466 FileRunnerParam{ "lane/uncooperative_shutdown", TestType::AssertWarns },
354 FileRunnerParam{ "lane/tasking_basic", TestType::AssertNoLuaError }, // 2 467 FileRunnerParam{ "lane/tasking_basic", TestType::AssertNoLuaError }, // 2
468 FileRunnerParam{ "lane/tasking_cancelling_with_hook", TestType::AssertNoLuaError }, // 3
355 FileRunnerParam{ "lane/tasking_cancelling", TestType::AssertNoLuaError }, // 3 469 FileRunnerParam{ "lane/tasking_cancelling", TestType::AssertNoLuaError }, // 3
356 FileRunnerParam{ "lane/tasking_comms_criss_cross", TestType::AssertNoLuaError }, // 4 470 FileRunnerParam{ "lane/tasking_comms_criss_cross", TestType::AssertNoLuaError }, // 4
357 FileRunnerParam{ "lane/tasking_communications", TestType::AssertNoLuaError }, 471 FileRunnerParam{ "lane/tasking_communications", TestType::AssertNoLuaError },
diff --git a/unit_tests/legacy_tests.cpp b/unit_tests/legacy_tests.cpp
index 7f2f31d..84581d2 100644
--- a/unit_tests/legacy_tests.cpp
+++ b/unit_tests/legacy_tests.cpp
@@ -11,7 +11,7 @@
11// so let's create a separate test case for each file with an ugly macro... 11// so let's create a separate test case for each file with an ugly macro...
12 12
13#define MAKE_TEST_CASE(FILE) \ 13#define MAKE_TEST_CASE(FILE) \
14TEST_CASE("scripted tests.legacy." #FILE) \ 14TEST_CASE("scripted_tests.legacy." #FILE) \
15{ \ 15{ \
16 FileRunner _runner(R"(.\tests\)"); \ 16 FileRunner _runner(R"(.\tests\)"); \
17 _runner.performTest(FileRunnerParam{ #FILE, TestType::AssertNoLuaError }); \ 17 _runner.performTest(FileRunnerParam{ #FILE, TestType::AssertNoLuaError }); \
@@ -49,7 +49,7 @@ MAKE_TEST_CASE(tobeclosed)
49MAKE_TEST_CASE(track_lanes) 49MAKE_TEST_CASE(track_lanes)
50 50
51/* 51/*
52TEST_CASE("lanes.legacy scripted tests") 52TEST_CASE("lanes.legacy_scripted_tests")
53{ 53{
54 auto const& _testParam = GENERATE( 54 auto const& _testParam = GENERATE(
55 FileRunnerParam{ "appendud", TestType::AssertNoLuaError } // 0 55 FileRunnerParam{ "appendud", TestType::AssertNoLuaError } // 0
diff --git a/unit_tests/linda_tests.cpp b/unit_tests/linda_tests.cpp
index efdb8a5..90630a7 100644
--- a/unit_tests/linda_tests.cpp
+++ b/unit_tests/linda_tests.cpp
@@ -3,154 +3,216 @@
3 3
4// ################################################################################################# 4// #################################################################################################
5 5
6TEST_CASE("linda.single Keeper") 6TEST_CASE("linda.single_keeper.creation/no_argument")
7{ 7{
8 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } }; 8 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
9 S.requireSuccess("lanes = require 'lanes'"); 9 S.requireSuccess("lanes = require 'lanes'");
10 10
11 SECTION("Linda creation") 11 // no argument is ok
12 { 12 S.requireSuccess("lanes.linda()");
13 // no parameters is ok 13 S.requireNotReturnedString("return tostring(lanes.linda())", R"===(Linda: <not a string>)==="); // unspecified name should not result in <not a string>
14 S.requireSuccess("lanes.linda()"); 14}
15 S.requireNotReturnedString("return tostring(lanes.linda())", R"===(Linda: <not a string>)==="); // unspecified name should not result in <not a string>
16
17 // since we have only one keeper, only group 0 is authorized
18 S.requireFailure("lanes.linda(-1)");
19 S.requireSuccess("lanes.linda(0)");
20 S.requireFailure("lanes.linda(1)");
21
22 // any name is ok
23 S.requireSuccess("lanes.linda('')"); // an empty name results in a string conversion of the form "Linda: <some hex value>" that we can't test (but it works)
24 S.requireReturnedString("return tostring(lanes.linda('short name'))", R"===(Linda: short name)===");
25 S.requireReturnedString("return tostring(lanes.linda('very very very very very very long name'))", R"===(Linda: very very very very very very long name)===");
26 S.requireReturnedString("return tostring(lanes.linda('auto'))", R"===(Linda: [string "return tostring(lanes.linda('auto'))"]:1)===");
27
28 if constexpr (LUA_VERSION_NUM == 504) {
29 // a function is acceptable as a __close handler
30 S.requireSuccess("local l <close> = lanes.linda(function() end)");
31 // a callable table too (a callable full userdata as well, but I have none here)
32 S.requireSuccess("local l <close> = lanes.linda(setmetatable({}, {__call = function() end}))");
33 // if the function raises an error, we should get it
34 S.requireFailure("local l <close> = lanes.linda(function() error 'gluh' end)");
35 } else {
36 // no __close support before Lua 5.4
37 S.requireFailure("lanes.linda(function() end)");
38 S.requireFailure("lanes.linda(setmetatable({}, {__call = function() end}))");
39 }
40 15
41 // mixing parameters in any order is ok: 2 out of 3 16// #################################################################################################
42 S.requireSuccess("lanes.linda(0, 'name')");
43 S.requireSuccess("lanes.linda('name', 0)");
44 if constexpr (LUA_VERSION_NUM == 504) {
45 S.requireSuccess("lanes.linda(0, function() end)");
46 S.requireSuccess("lanes.linda(function() end, 0)");
47 S.requireSuccess("lanes.linda('name', function() end)");
48 S.requireSuccess("lanes.linda(function() end, 'name')");
49 }
50 17
51 // mixing parameters in any order is ok: 3 out of 3 18TEST_CASE("linda.single_keeper.creation/non_table_arguments")
52 if constexpr (LUA_VERSION_NUM == 504) { 19{
53 S.requireSuccess("lanes.linda(0, 'name', function() end)"); 20 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
54 S.requireSuccess("lanes.linda(0, function() end, 'name')"); 21 S.requireSuccess("lanes = require 'lanes'");
55 S.requireSuccess("lanes.linda('name', 0, function() end)"); 22
56 S.requireSuccess("lanes.linda('name', function() end, 0)"); 23 // any argument that is not a table is not ok
57 S.requireSuccess("lanes.linda(function() end, 0, 'name')"); 24 S.requireFailure("lanes.linda(0)");
58 S.requireSuccess("lanes.linda(function() end, 'name', 0)"); 25 S.requireFailure("lanes.linda('bob')");
59 } 26 S.requireFailure("lanes.linda(false)");
27 S.requireFailure("lanes.linda(function() end)");
28 S.requireFailure("lanes.linda(lanes.cancel_error)");
29}
30
31// #################################################################################################
60 32
61 // unsupported parameters should fail 33TEST_CASE("linda.single_keeper.creation/close_handler")
62 S.requireFailure("lanes.linda(true)"); 34{
63 S.requireFailure("lanes.linda(false)"); 35 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
64 // uncallable table or full userdata 36 S.requireSuccess("lanes = require 'lanes'");
65 S.requireFailure("lanes.linda({})"); 37
66 S.requireFailure("lanes.linda(lanes.linda())"); 38 if constexpr (LUA_VERSION_NUM >= 504) {
39 // a function is acceptable as a __close handler
40 S.requireSuccess("local l <close> = lanes.linda{close_handler = function() end}");
41 // a callable table too (a callable full userdata as well, but I have none here)
42 S.requireSuccess("local l <close> = lanes.linda{close_handler = setmetatable({}, {__call = function() end})}");
43 } else {
44 // no __close support before Lua 5.4, field is ignored (therefore invalid values are accepted too!)
45 S.requireSuccess("lanes.linda{close_handler = 'a string'}");
46 S.requireSuccess("lanes.linda{close_handler = function() end}");
47 S.requireSuccess("lanes.linda{close_handler = setmetatable({}, {__call = function() end})}");
67 } 48 }
49}
68 50
69 // --------------------------------------------------------------------------------------------- 51// #################################################################################################
52
53TEST_CASE("linda.single_keeper.creation/table_argument")
54{
55 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
56 S.requireSuccess("lanes = require 'lanes'");
57
58 // one table is fine
59 S.requireSuccess("lanes.linda{}");
60 // anything beyond that is not
61 S.requireFailure("lanes.linda({},{})");
62 S.requireFailure("lanes.linda({},'bob')");
63 S.requireFailure("lanes.linda({},42)");
64}
65
66// #################################################################################################
67
68TEST_CASE("linda.single_keeper.creation/group")
69{
70 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
71 S.requireSuccess("lanes = require 'lanes'");
72
73 // since we have only one keeper, only group 0 is authorized
74 S.requireFailure("lanes.linda{group = -1}");
75 S.requireSuccess("lanes.linda{group = 0}");
76 S.requireFailure("lanes.linda{group = 1}");
77}
78
79// #################################################################################################
80
81TEST_CASE("linda.single_keeper.creation/name")
82{
83 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
84 S.requireSuccess("lanes = require 'lanes'");
85
86 // any name is ok
87 S.requireSuccess("lanes.linda{name = ''}"); // an empty name results in a string conversion of the form "Linda: <some hex value>" that we can't test (but it works)
88 S.requireReturnedString("return tostring(lanes.linda{name = 'short name'})", R"===(Linda: short name)===");
89 S.requireReturnedString("return tostring(lanes.linda{name = 'very very very very very very long name'})", R"===(Linda: very very very very very very long name)===");
90 S.requireReturnedString("return tostring(lanes.linda{name = 'auto'})", R"===(Linda: [string "return tostring(lanes.linda{name = 'auto'})"]:1)===");
91}
92
93// #################################################################################################
94
95TEST_CASE("linda.single_keeper.creation/wake_period")
96{
97 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
98 S.requireSuccess("lanes = require 'lanes'");
99
100 // wake_period should be a number > 0
101 S.requireFailure("lanes.linda{wake_period = false}");
102 S.requireFailure("lanes.linda{wake_period = 'bob'}");
103 S.requireFailure("lanes.linda{wake_period = {}}");
104 S.requireFailure("lanes.linda{wake_period = -1}");
105 S.requireFailure("lanes.linda{wake_period = 0}");
106 S.requireSuccess("lanes.linda{wake_period = 0.0001}");
107 S.requireSuccess("lanes.linda{wake_period = 'never'}");
108}
109
110// #################################################################################################
70 111
71 SECTION("Linda indexing") 112TEST_CASE("linda.single_keeper.indexing")
113{
114 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
115 S.requireSuccess("lanes = require 'lanes'.configure()");
116
117 // indexing the linda with an unknown string key should fail
118 S.requireFailure("return lanes.linda().gouikra");
119 // indexing the linda with an unsupported key type should fail
120 S.requireFailure("return lanes.linda()[5]");
121 S.requireFailure("return lanes.linda()[false]");
122 S.requireFailure("return lanes.linda()[{}]");
123 S.requireFailure("return lanes.linda()[function() end]");
124}
125
126// #################################################################################################
127
128TEST_CASE("linda.single_keeper.send()")
129{
130 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
131 S.requireSuccess("lanes = require 'lanes'.configure()");
132
133 SECTION("timeout")
72 { 134 {
73 // indexing the linda with an unknown string key should fail 135 // timeout checks
74 S.requireFailure("return lanes.linda().gouikra"); 136 // linda:send() should fail if the timeout is bad
75 // indexing the linda with an unsupported key type should fail 137 S.requireFailure("lanes.linda():send(-1, 'k', 'v')");
76 S.requireFailure("return lanes.linda()[5]"); 138 // any positive value is ok
77 S.requireFailure("return lanes.linda()[false]"); 139 S.requireSuccess("lanes.linda():send(0, 'k', 'v')");
78 S.requireFailure("return lanes.linda()[{}]"); 140 S.requireSuccess("lanes.linda():send(1e20, 'k', 'v')");
79 S.requireFailure("return lanes.linda()[function() end]"); 141 // nil too (same as 'forever')
142 S.requireSuccess("lanes.linda():send(nil, 'k', 'v')");
80 } 143 }
81 144
82 // --------------------------------------------------------------------------------------------- 145 // -----------------------------------------------------------------------------------------
83 SECTION("linda:send()") 146
147 SECTION("fails on bad keys")
84 { 148 {
85 SECTION("timeout") 149 // key checks
86 { 150 // linda:send() should fail if the key is unsupported (nil, table, function, full userdata, reserved light userdata)
87 // timeout checks 151 S.requireFailure("lanes.linda():send(0, nil, 'v')");
88 // linda:send() should fail if the timeout is bad 152 S.requireFailure("lanes.linda():send(0, {}, 'v')");
89 S.requireFailure("lanes.linda():send(-1, 'k', 'v')"); 153 S.requireFailure("lanes.linda():send(0, function() end, 'v')");
90 // any positive value is ok 154 S.requireFailure("lanes.linda():send(0, io.stdin, 'v')");
91 S.requireSuccess("lanes.linda():send(0, 'k', 'v')"); 155 S.requireFailure("lanes.linda():send(0, lanes.null, 'v')");
92 S.requireSuccess("lanes.linda():send(1e20, 'k', 'v')"); 156 S.requireFailure("lanes.linda():send(0, lanes.cancel_error, 'v')");
93 // nil too (same as 'forever') 157 }
94 S.requireSuccess("lanes.linda():send(nil, 'k', 'v')");
95 }
96 158
97 // ----------------------------------------------------------------------------------------- 159 // -----------------------------------------------------------------------------------------
98 160
99 SECTION("fails on bad keys") 161 SECTION("succeeds on supported keys")
100 { 162 {
101 // key checks 163 // supported keys are ok: boolean, number, string, light userdata, deep userdata
102 // linda:send() should fail if the key is unsupported (nil, table, function, full userdata, reserved light userdata) 164 S.requireSuccess("lanes.linda():send(0, true, 'v')");
103 S.requireFailure("lanes.linda():send(0, nil, 'v')"); 165 S.requireSuccess("lanes.linda():send(0, false, 'v')");
104 S.requireFailure("lanes.linda():send(0, {}, 'v')"); 166 S.requireSuccess("lanes.linda():send(0, 99, 'v')");
105 S.requireFailure("lanes.linda():send(0, function() end, 'v')"); 167 S.requireSuccess("local l = lanes.linda(); l:send(0, l:deep(), 'v')");
106 S.requireFailure("lanes.linda():send(0, io.stdin, 'v')"); 168 }
107 S.requireFailure("lanes.linda():send(0, lanes.null, 'v')");
108 S.requireFailure("lanes.linda():send(0, lanes.cancel_error, 'v')");
109 S.requireFailure("local l = lanes.linda(); l:send(0, l.batched, 'v')");
110 }
111 169
112 // ----------------------------------------------------------------------------------------- 170 // -----------------------------------------------------------------------------------------
113 171
114 SECTION("succeeds on supported keys") 172 SECTION("succeeds on deep userdata key")
115 { 173 {
116 // supported keys are ok: boolean, number, string, light userdata, deep userdata 174 S.requireSuccess("local l = lanes.linda(); l:send(0, l, 'v')");
117 S.requireSuccess("lanes.linda():send(0, true, 'v')"); 175 }
118 S.requireSuccess("lanes.linda():send(0, false, 'v')");
119 S.requireSuccess("lanes.linda():send(0, 99, 'v')");
120 S.requireSuccess("local l = lanes.linda(); l:send(0, l:deep(), 'v')");
121 }
122 176
123 // ----------------------------------------------------------------------------------------- 177 // -----------------------------------------------------------------------------------------
124 178
125 SECTION("succeeds on deep userdata key") 179 SECTION(". fails")
126 { 180 {
127 S.requireSuccess("local l = lanes.linda(); l:send(0, l, 'v')"); 181 // misuse checks, . instead of :
128 } 182 S.requireFailure("lanes.linda().send(nil, 'k', 'v')");
183 }
129 184
130 // ----------------------------------------------------------------------------------------- 185 // -----------------------------------------------------------------------------------------
131 186
132 SECTION(". fails") 187 SECTION("unsupported values fail")
133 { 188 {
134 // misuse checks, . instead of : 189 // value checks
135 S.requireFailure("lanes.linda().send(nil, 'k', 'v')"); 190 // linda:send() should fail if we don't send anything
136 } 191 S.requireFailure("lanes.linda():send()");
192 S.requireFailure("lanes.linda():send(0)");
193 S.requireFailure("lanes.linda():send(0, 'k')");
194 // or non-deep userdata
195 S.requireFailure("lanes.linda():send(0, 'k', fixture.newuserdata())");
196 // or something with a converter that raises an error (maybe that should go to a dedicated __lanesconvert test!)
197 S.requireFailure("lanes.linda():send(0, 'k', setmetatable({}, {__lanesconvert = function(where_) error (where_ .. ': should not send me' end}))");
198 // but a registered non-deep userdata should work
199 S.requireSuccess("lanes.linda():send(0, 'k', io.stdin)");
200 }
201}
137 202
138 // ----------------------------------------------------------------------------------------- 203// #################################################################################################
139 204
140 SECTION("unsupported values fail") 205TEST_CASE("linda.single_keeper.the_rest")
141 { 206{
142 // value checks 207 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
143 // linda:send() should fail if we don't send anything 208 S.requireSuccess("lanes = require 'lanes'");
144 S.requireFailure("lanes.linda():send()"); 209
145 S.requireFailure("lanes.linda():send(0)"); 210 // ---------------------------------------------------------------------------------------------
146 S.requireFailure("lanes.linda():send(0, 'k')"); 211
147 // or non-deep userdata 212 SECTION("error in close handler is propagated")
148 S.requireFailure("lanes.linda():send(0, 'k', fixture.newuserdata())"); 213 {
149 // or something with a converter that raises an error (maybe that should go to a dedicated __lanesconvert test!) 214 // if the function raises an error, we should get it
150 S.requireFailure("lanes.linda():send(0, 'k', setmetatable({}, {__lanesconvert = function(where_) error (where_ .. ': should not send me' end}))"); 215 S.requireFailure("local l <close> = lanes.linda{close_handler = function() error 'gluh' end}");
151 // but a registered non-deep userdata should work
152 S.requireSuccess("lanes.linda():send(0, 'k', io.stdin)");
153 }
154 } 216 }
155 217
156 // --------------------------------------------------------------------------------------------- 218 // ---------------------------------------------------------------------------------------------
@@ -312,12 +374,12 @@ TEST_CASE("linda.multi Keeper")
312 374
313 S.requireSuccess("lanes = require 'lanes'.configure{nb_user_keepers = 3}"); 375 S.requireSuccess("lanes = require 'lanes'.configure{nb_user_keepers = 3}");
314 376
315 S.requireFailure("lanes.linda(-1)"); 377 S.requireFailure("lanes.linda{group = -1}");
316 S.requireSuccess("lanes.linda(0)"); 378 S.requireSuccess("lanes.linda{group = 0}");
317 S.requireSuccess("lanes.linda(1)"); 379 S.requireSuccess("lanes.linda{group = 1}");
318 S.requireSuccess("lanes.linda(2)"); 380 S.requireSuccess("lanes.linda{group = 2}");
319 S.requireSuccess("lanes.linda(3)"); 381 S.requireSuccess("lanes.linda{group = 3}");
320 S.requireFailure("lanes.linda(4)"); 382 S.requireFailure("lanes.linda{group = 4}");
321} 383}
322 384
323// ################################################################################################# 385// #################################################################################################
@@ -327,23 +389,26 @@ TEST_CASE("linda.multi Keeper")
327// so let's create a separate test case for each file with an ugly macro... 389// so let's create a separate test case for each file with an ugly macro...
328 390
329#define MAKE_TEST_CASE(DIR, FILE) \ 391#define MAKE_TEST_CASE(DIR, FILE) \
330TEST_CASE("scripted tests." #DIR "." #FILE) \ 392TEST_CASE("scripted_tests." #DIR "." #FILE) \
331{ \ 393{ \
332 FileRunner _runner(R"(.\unit_tests\scripts)"); \ 394 FileRunner _runner(R"(.\unit_tests\scripts)"); \
333 _runner.performTest(FileRunnerParam{ #DIR "/" #FILE, TestType::AssertNoLuaError }); \ 395 _runner.performTest(FileRunnerParam{ #DIR "/" #FILE, TestType::AssertNoLuaError }); \
334} 396}
335 397
398MAKE_TEST_CASE(linda, multiple_keepers)
336MAKE_TEST_CASE(linda, send_receive) 399MAKE_TEST_CASE(linda, send_receive)
400MAKE_TEST_CASE(linda, send_receive_func_and_string)
337MAKE_TEST_CASE(linda, send_registered_userdata) 401MAKE_TEST_CASE(linda, send_registered_userdata)
338MAKE_TEST_CASE(linda, multiple_keepers) 402MAKE_TEST_CASE(linda, wake_period)
339 403
340/* 404/*
341TEST_CASE("linda.scripted tests") 405TEST_CASE("linda.scripted_tests")
342{ 406{
343 auto const& _testParam = GENERATE( 407 auto const& _testParam = GENERATE(
408 FileRunnerParam{ "linda/multiple_keepers", TestType::AssertNoLuaError },
344 FileRunnerParam{ "linda/send_receive", TestType::AssertNoLuaError }, 409 FileRunnerParam{ "linda/send_receive", TestType::AssertNoLuaError },
345 FileRunnerParam{ "linda/send_registered_userdata", TestType::AssertNoLuaError }, 410 FileRunnerParam{ "linda/send_registered_userdata", TestType::AssertNoLuaError },
346 FileRunnerParam{ "linda/multiple_keepers", TestType::AssertNoLuaError } 411 FileRunnerParam{ "linda/wake_period", TestType::AssertNoLuaError }
347 ); 412 );
348 413
349 FileRunner _runner(R"(.\unit_tests\scripts)"); 414 FileRunner _runner(R"(.\unit_tests\scripts)");
diff --git a/unit_tests/scripts/_utils.lua b/unit_tests/scripts/_utils.lua
index d710702..9f46237 100644
--- a/unit_tests/scripts/_utils.lua
+++ b/unit_tests/scripts/_utils.lua
@@ -68,8 +68,26 @@ local function dump_error_stack(error_reporting_mode_, stack)
68 end 68 end
69end 69end
70 70
71-- a function that yields back what got in, one element at a time
72local yield_one_by_one = function(...)
73 local PRINT = MAKE_PRINT()
74 PRINT "In lane"
75 for _i = 1, select('#', ...) do
76 local _val = select(_i, ...)
77 PRINT("yielding #", _i, _val)
78 local _ack = coroutine.yield(_val)
79 if cancel_test and cancel_test() then -- cancel_test does not exist when run immediately (not in a Lane)
80 return "cancelled!"
81 end
82 -- of course, if we are cancelled, we were not resumed, and yield() didn't return what we expect
83 assert(_ack == _i)
84 end
85 return "bye!"
86end
87
71return { 88return {
72 MAKE_PRINT = MAKE_PRINT, 89 MAKE_PRINT = MAKE_PRINT,
73 tables_match = tables_match, 90 tables_match = tables_match,
74 dump_error_stack = dump_error_stack 91 dump_error_stack = dump_error_stack,
92 yield_one_by_one = yield_one_by_one
75} 93}
diff --git a/unit_tests/scripts/_utils54.lua b/unit_tests/scripts/_utils54.lua
new file mode 100644
index 0000000..a511563
--- /dev/null
+++ b/unit_tests/scripts/_utils54.lua
@@ -0,0 +1,30 @@
1local utils = require "_utils"
2
3-- expand _utils module with Lua5.4 specific stuff
4
5-- a lane body that yields stuff
6utils.yielder_with_to_be_closed = function(out_linda_, wait_)
7 local fixture = assert(require "fixture")
8 -- here is a to-be-closed variable that, when closed, sends "Closed!" in the "out" slot of the provided linda
9 local t <close> = setmetatable(
10 { text = "Closed!" }, {
11 __close = function(self, err)
12 if wait_ then
13 fixture.block_for(wait_)
14 end
15 out_linda_:send("out", self.text)
16 end
17 }
18 )
19 -- yield forever, but be cancel-friendly
20 local n = 1
21 while true do
22 coroutine.yield("I yield!", n)
23 if cancel_test and cancel_test() then -- cancel_test does not exist when run immediately (not in a Lane)
24 return "I am cancelled"
25 end
26 n = n + 1
27 end
28end
29
30return utils
diff --git a/unit_tests/scripts/coro/basics.lua b/unit_tests/scripts/coro/basics.lua
deleted file mode 100644
index dc74b7c..0000000
--- a/unit_tests/scripts/coro/basics.lua
+++ /dev/null
@@ -1,97 +0,0 @@
1local lanes = require "lanes"
2
3local fixture = require "fixture"
4lanes.finally(fixture.throwing_finalizer)
5
6local utils = lanes.require "_utils"
7local PRINT = utils.MAKE_PRINT()
8
9if true then
10 -- a lane body that just returns some value
11 local lane = function(msg_)
12 local utils = lanes.require "_utils"
13 local PRINT = utils.MAKE_PRINT()
14 PRINT "In lane"
15 assert(msg_ == "hi")
16 return "bye"
17 end
18
19 -- the generator
20 local g1 = lanes.coro("*", {name = "auto"}, lane)
21
22 -- launch lane
23 local h1 = g1("hi")
24
25 local r = h1[1]
26 assert(r == "bye")
27end
28
29-- a lane coroutine that yields back what got in, one element at a time
30local yielder = function(...)
31 local utils = lanes.require "_utils"
32 local PRINT = utils.MAKE_PRINT()
33 PRINT "In lane"
34 for _i = 1, select('#', ...) do
35 local _val = select(_i, ...)
36 PRINT("yielding #", _i, _val)
37 local _ack = coroutine.yield(_val)
38 assert(_ack == _i)
39 end
40 return "done!"
41end
42
43if true then
44 -- if we start a non-coroutine lane with a yielding function, we should get an error, right?
45 local fun_g = lanes.gen("*", {name = "auto"}, yielder)
46 local h = fun_g("hello", "world", "!")
47 local err, status, stack = h:join()
48 PRINT(err, status, stack)
49 -- the actual error message is not the same for Lua 5.1
50 -- of course, it also has to be different for LuaJIT as well
51 -- also, LuaJIT prepends a file:line to the actual error message, which Lua5.1 does not.
52 local msgs = {
53 ["Lua 5.1"] = jit and "attempt to yield across C-call boundary" or "attempt to yield across metamethod/C-call boundary",
54 ["Lua 5.2"] = "attempt to yield from outside a coroutine",
55 ["Lua 5.3"] = "attempt to yield from outside a coroutine",
56 ["Lua 5.4"] = "attempt to yield from outside a coroutine"
57 }
58 local expected_msg = msgs[_VERSION]
59 PRINT("expected_msg = " .. expected_msg)
60 assert(err == nil and string.find(status, expected_msg, 1, true) and stack == nil, "status = " .. status)
61end
62
63-- the generator
64local coro_g = lanes.coro("*", {name = "auto"}, yielder)
65
66if true then
67 -- launch coroutine lane
68 local h2 = coro_g("hello", "world", "!")
69 -- read the yielded values, sending back the expected index
70 assert(h2:resume(1) == "hello")
71 assert(h2:resume(2) == "world")
72 assert(h2:resume(3) == "!")
73 -- the lane return value is available as usual
74 local r = h2[1]
75 assert(r == "done!")
76end
77
78if true then
79 -- another coroutine lane
80 local h3 = coro_g("hello", "world", "!")
81
82 -- yielded values are available as regular return values
83 assert(h3[1] == "hello" and h3.status == "suspended")
84 -- since we consumed the returned values, they should not be here when we resume
85 assert(h3:resume(1) == nil)
86
87 -- similarly, we can get them with join()
88 assert(h3:join() == "world" and h3.status == "suspended")
89 -- since we consumed the returned values, they should not be here when we resume
90 assert(h3:resume(2) == nil)
91
92 -- the rest should work as usual
93 assert(h3:resume(3) == "!")
94
95 -- the final return value of the lane body remains to be read
96 assert(h3:join() == "done!" and h3.status == "done")
97end
diff --git a/unit_tests/scripts/coro/cancelling_suspended.lua b/unit_tests/scripts/coro/cancelling_suspended.lua
new file mode 100644
index 0000000..3a29e55
--- /dev/null
+++ b/unit_tests/scripts/coro/cancelling_suspended.lua
@@ -0,0 +1,31 @@
1local fixture = require "fixture"
2local lanes = require "lanes".configure{on_state_create = fixture.on_state_create}
3
4local fixture = require "fixture"
5lanes.finally(fixture.throwing_finalizer)
6
7local utils = lanes.require "_utils"
8local PRINT = utils.MAKE_PRINT()
9
10--------------------------------------------------
11-- TEST: cancelling a suspended Lane should end it
12--------------------------------------------------
13if true then
14 -- the generator
15 local coro_g = lanes.coro("*", utils.yield_one_by_one)
16
17 -- start the lane
18 local h = coro_g("hello", "world", "!")
19 repeat until h.status == "suspended"
20
21 -- first cancellation attempt: don't wake the lane
22 local b, r = h:cancel("soft", 0.5)
23 -- the lane is still blocked in its suspended state
24 assert(b == false and r == "timeout" and h.status == "suspended", "got " .. tostring(b) .. " " .. tostring(r) .. " " .. h.status)
25
26 -- cancel the Lane again, this time waking it. it will resume, and yielder()'s will break out of its infinite loop
27 h:cancel("soft", nil, true)
28
29 -- lane should be done, because it returned cooperatively when detecting a soft cancel
30 assert(h.status == "done", "got " .. h.status)
31end
diff --git a/unit_tests/scripts/coro/collect_yielded_lane.lua b/unit_tests/scripts/coro/collect_yielded_lane.lua
new file mode 100644
index 0000000..2ee58f8
--- /dev/null
+++ b/unit_tests/scripts/coro/collect_yielded_lane.lua
@@ -0,0 +1,64 @@
1local fixture = require "fixture"
2local lanes = require "lanes".configure{on_state_create = fixture.on_state_create}
3
4local fixture = require "fixture"
5lanes.finally(fixture.throwing_finalizer)
6
7-- this test is only for Lua 5.4+
8local utils = lanes.require "_utils54"
9local PRINT = utils.MAKE_PRINT()
10
11local out_linda = lanes.linda()
12
13------------------------------------------------------------------------------
14-- TEST: to-be-closed variables are properly closed when the lane is collected
15------------------------------------------------------------------------------
16if true then
17 -- the generator
18 local coro_g = lanes.coro("*", utils.yielder_with_to_be_closed)
19
20 -- start the lane
21 local h = coro_g(out_linda)
22
23 -- join the lane. it should be done and give back the values resulting of the first yield point
24 local r, v1, v2 = h:join()
25 assert(r == true and v1 == "I yield!" and v2 == 1, "got " .. tostring(r) .. " " .. tostring(v1) .. " " .. tostring(v2))
26 assert(h.status == "done", "got " .. h.status)
27
28 -- force collection of the lane
29 h = nil
30 collectgarbage()
31
32 -- I want the to-be-closed variable of the coroutine linda to be properly closed
33 local s, r = out_linda:receive(0, "out")
34 assert(s == "out" and r == "Closed!", "coro got " .. tostring(s) .. " " .. tostring(r)) -- THIS TEST FAILS
35end
36
37---------------------------------------------------------------------------------------------------
38-- TEST: if a to-be-closed handler takes longer than the join timeout, everything works as expected
39---------------------------------------------------------------------------------------------------
40if true then
41 -- the generator
42 local coro_g = lanes.coro("*", utils.yielder_with_to_be_closed)
43
44 -- start the lane. The to-be-closed handler will sleep for 1 second
45 local h = coro_g(out_linda, 1)
46
47 -- first join attempt should timeout
48 local r, v = h:join(0.6)
49 assert(r == nil and v == "timeout", "got " .. tostring(r) .. " " .. tostring(v))
50 assert(h.status == "running", "got " .. h.status)
51
52 -- join the lane again. it should be done and give back the values resulting of the first yield point
53 local r, v1, v2 = h:join(0.6)
54 assert(r == true and v1 == "I yield!" and v2 == 1, "got " .. tostring(r) .. " " .. tostring(v1) .. " " .. tostring(v2))
55 assert(h.status == "done", "got " .. h.status)
56
57 -- force collection of the lane
58 h = nil
59 collectgarbage()
60
61 -- I want the to-be-closed variable of the coroutine linda to be properly closed
62 local s, r = out_linda:receive(0, "out")
63 assert(s == "out" and r == "Closed!", "coro got " .. tostring(s) .. " " .. tostring(r)) -- THIS TEST FAILS
64end
diff --git a/unit_tests/scripts/coro/error_handling.lua b/unit_tests/scripts/coro/error_handling.lua
index ba6cff6..1cfb8c8 100644
--- a/unit_tests/scripts/coro/error_handling.lua
+++ b/unit_tests/scripts/coro/error_handling.lua
@@ -38,15 +38,15 @@ local force_error_test = function(error_trace_level_)
38 utils.dump_error_stack(error_trace_level_, c) 38 utils.dump_error_stack(error_trace_level_, c)
39end 39end
40 40
41if false then 41if true then
42 force_error_test("minimal") 42 force_error_test("minimal")
43end 43end
44 44
45if false then 45if true then
46 force_error_test("basic") 46 force_error_test("basic")
47end 47end
48 48
49if false then 49if true then
50 force_error_test("extended") 50 force_error_test("extended")
51end 51end
52 52
diff --git a/unit_tests/scripts/coro/index_suspended.lua b/unit_tests/scripts/coro/index_suspended.lua
new file mode 100644
index 0000000..2cd8c28
--- /dev/null
+++ b/unit_tests/scripts/coro/index_suspended.lua
@@ -0,0 +1,28 @@
1local lanes = require "lanes"
2
3local fixture = require "fixture"
4lanes.finally(fixture.throwing_finalizer)
5
6local utils = lanes.require "_utils"
7local PRINT = utils.MAKE_PRINT()
8
9-- the coroutine generator
10local coro_g = lanes.coro("*", {name = "auto"}, utils.yield_one_by_one)
11
12-------------------------------------------------------------------------
13-- TEST: if we index a yielded lane, we should get the last yielded value
14-------------------------------------------------------------------------
15if true then
16 -- launch coroutine lane
17 local h = coro_g("hello", "world", "!")
18 -- read the first yielded value, sending back the expected index
19 assert(h:resume(1) == "hello")
20 -- indexing multiple times gives back the same us the same yielded value
21 local r1 = h[1]
22 local r2 = h[1]
23 local r3 = h[1]
24 assert(r1 == "world" and r2 == "world" and r3 == "world", "got " .. r1 .. " " .. r2 .. " " .. r3)
25 -- once the lane was indexed, it is no longer resumable (just like after join)
26 local b, e = pcall(h.resume, h, 2)
27 assert(b == false and e == "cannot resume non-suspended coroutine Lane")
28end
diff --git a/unit_tests/scripts/coro/join_suspended.lua b/unit_tests/scripts/coro/join_suspended.lua
new file mode 100644
index 0000000..33be406
--- /dev/null
+++ b/unit_tests/scripts/coro/join_suspended.lua
@@ -0,0 +1,24 @@
1local lanes = require "lanes"
2
3local fixture = require "fixture"
4lanes.finally(fixture.throwing_finalizer)
5
6local utils = lanes.require "_utils"
7local PRINT = utils.MAKE_PRINT()
8
9-- the coroutine generator
10local coro_g = lanes.coro("*", {name = "auto"}, utils.yield_one_by_one)
11
12---------------------------------------------------
13-- TEST: if we join a yielded lane, the lane aborts
14---------------------------------------------------
15if true then
16 -- launch coroutine lane
17 local h = coro_g("hello", "world", "!")
18 -- read the first yielded value, sending back the expected index
19 assert(h:resume(1) == "hello")
20 -- join the lane. since it will reach a yield point, it unblocks and ends. last yielded values are returned normally
21 local b, r = h:join(0.5)
22 local s = h.status
23 assert(s == "done" and b == true and r == "world", "got " .. s .. " " .. tostring(b) .. " " .. tostring(r))
24end
diff --git a/unit_tests/scripts/coro/linda_in_close_handler.lua b/unit_tests/scripts/coro/linda_in_close_handler.lua
new file mode 100644
index 0000000..8636f01
--- /dev/null
+++ b/unit_tests/scripts/coro/linda_in_close_handler.lua
@@ -0,0 +1,43 @@
1local fixture = require "fixture"
2local lanes = require "lanes".configure{on_state_create = fixture.on_state_create}
3
4local fixture = require "fixture"
5lanes.finally(fixture.throwing_finalizer)
6
7-- this test is only for Lua 5.4+
8local utils = lanes.require "_utils54"
9local PRINT = utils.MAKE_PRINT()
10
11local out_linda = lanes.linda()
12
13local test_close = function(what_, f_)
14 local c = coroutine.create(f_)
15 for i = 1, 10 do
16 local t, r1, r2 = coroutine.resume(c, out_linda) -- returns true + <yielded values>
17 assert(t == true and r1 == "I yield!" and r2 == i, "got " .. tostring(t) .. " " .. tostring(r1) .. " " .. tostring(r2))
18 local s = coroutine.status(c)
19 assert(s == "suspended")
20 end
21 local r, s = coroutine.close(c)
22 assert(r == true and s == nil)
23 -- the local variable inside the yielder body should be closed
24 local s, r = out_linda:receive(0, "out")
25 assert(s == "out" and r == "Closed!", what_ .. " got " .. tostring(s) .. " " .. tostring(r))
26end
27
28---------------------------------------------------------
29-- TEST: first, try the close mechanism outside of a lane
30---------------------------------------------------------
31if true then
32 assert(type(utils.yielder_with_to_be_closed) == "function")
33 test_close("base", utils.yielder_with_to_be_closed)
34end
35
36---------------------------------------------------------------
37-- TEST: try again with a function obtained through dump/undump
38---------------------------------------------------------------
39if true then
40 -- note this means our yielder implementation can't have upvalues, as they are lost in the process
41 test_close("dumped", load(string.dump(utils.yielder_with_to_be_closed)))
42end
43
diff --git a/unit_tests/scripts/coro/regular_function.lua b/unit_tests/scripts/coro/regular_function.lua
new file mode 100644
index 0000000..09aa3b7
--- /dev/null
+++ b/unit_tests/scripts/coro/regular_function.lua
@@ -0,0 +1,38 @@
1local lanes = require "lanes".configure()
2
3local utils = lanes.require "_utils"
4local PRINT = utils.MAKE_PRINT()
5
6-- a lane body that just returns some value
7local returner = function(msg_)
8 local utils = lanes.require "_utils"
9 local PRINT = utils.MAKE_PRINT()
10 PRINT "In lane"
11 assert(msg_ == "hi")
12 return "bye"
13end
14
15-- a function that returns some value can run in a coroutine
16if true then
17 -- the generator
18 local g = lanes.coro("*", {name = "auto"}, returner)
19
20 -- launch lane
21 local h = g("hi")
22
23 local r = h[1]
24 assert(r == "bye")
25end
26
27-- can't resume a coro after the lane body has returned
28if true then
29 -- the generator
30 local g = lanes.coro("*", {name = "auto"}, returner)
31
32 -- launch lane
33 local h = g("hi")
34
35 -- resuming a lane that terminated execution should raise an error
36 local b, e = pcall(h.resume, h)
37 assert(b == false and type(e) == "string")
38end
diff --git a/unit_tests/scripts/coro/resume_basics.lua b/unit_tests/scripts/coro/resume_basics.lua
new file mode 100644
index 0000000..5b124f5
--- /dev/null
+++ b/unit_tests/scripts/coro/resume_basics.lua
@@ -0,0 +1,40 @@
1local lanes = require "lanes"
2
3local fixture = require "fixture"
4lanes.finally(fixture.throwing_finalizer)
5
6local utils = lanes.require "_utils"
7local PRINT = utils.MAKE_PRINT()
8
9-- the coroutine generator
10local coro_g = lanes.coro("*", {name = "auto"}, utils.yield_one_by_one)
11
12-------------------------------------------------------------------------------------------------
13-- TEST: we can resume as many times as the lane yields, then read the returned value on indexing
14-------------------------------------------------------------------------------------------------
15if true then
16 -- launch coroutine lane
17 local h = coro_g("hello", "world", "!")
18 -- read the yielded values, sending back the expected index
19 assert(h:resume(1) == "hello")
20 assert(h:resume(2) == "world")
21 assert(h:resume(3) == "!")
22 -- the lane return value is available as usual
23 local r = h[1]
24 assert(r == "bye!")
25end
26
27---------------------------------------------------------------------------------------------
28-- TEST: we can resume as many times as the lane yields, then read the returned value on join
29---------------------------------------------------------------------------------------------
30if true then
31 -- launch coroutine lane
32 local h = coro_g("hello", "world", "!")
33 -- read the yielded values, sending back the expected index
34 assert(h:resume(1) == "hello")
35 assert(h:resume(2) == "world")
36 assert(h:resume(3) == "!")
37 -- the lane return value is available as usual
38 local s, r = h:join()
39 assert(h.status == "done" and s == true and r == "bye!")
40end
diff --git a/unit_tests/scripts/coro/yielding_in_non_coro_errors.lua b/unit_tests/scripts/coro/yielding_in_non_coro_errors.lua
new file mode 100644
index 0000000..fc0c072
--- /dev/null
+++ b/unit_tests/scripts/coro/yielding_in_non_coro_errors.lua
@@ -0,0 +1,28 @@
1local lanes = require "lanes"
2
3local fixture = require "fixture"
4lanes.finally(fixture.throwing_finalizer)
5
6local utils = lanes.require "_utils"
7local PRINT = utils.MAKE_PRINT()
8
9--------------------------------------------------------------------------------------------------
10-- TEST: if we start a non-coroutine lane with a yielding function, we should get an error, right?
11--------------------------------------------------------------------------------------------------
12local fun_g = lanes.gen("*", { name = 'auto' }, utils.yield_one_by_one)
13local h = fun_g("hello", "world", "!")
14local err, status, stack = h:join()
15PRINT(err, status, stack)
16-- the actual error message is not the same for Lua 5.1
17-- of course, it also has to be different for LuaJIT as well
18-- also, LuaJIT prepends a file:line to the actual error message, which Lua5.1 does not.
19local msgs = {
20 ["Lua 5.1"] = jit and "attempt to yield across C-call boundary" or "attempt to yield across metamethod/C-call boundary",
21 ["Lua 5.2"] = "attempt to yield from outside a coroutine",
22 ["Lua 5.3"] = "attempt to yield from outside a coroutine",
23 ["Lua 5.4"] = "attempt to yield from outside a coroutine",
24 ["Lua 5.5"] = "attempt to yield from outside a coroutine"
25}
26local expected_msg = msgs[_VERSION]
27PRINT("expected_msg = " .. expected_msg)
28assert(err == nil and string.find(status, expected_msg, 1, true) and stack == nil, "status = " .. status)
diff --git a/unit_tests/scripts/lane/body_is_a_c_function.lua b/unit_tests/scripts/lane/body_is_a_c_function.lua
new file mode 100644
index 0000000..d8d329f
--- /dev/null
+++ b/unit_tests/scripts/lane/body_is_a_c_function.lua
@@ -0,0 +1,28 @@
1local lanes = require "lanes".configure()
2
3-- ##################################################################################################
4-- ##################################################################################################
5-- ##################################################################################################
6
7-- we can create a generator where the lane body is a C function
8do
9 local b, g = pcall(lanes.gen, "*", print)
10 assert(b == true and type(g) == "function")
11 -- we can start the lane
12 local b, h = pcall(g, "hello")
13 -- the lane runs normally
14 h:join()
15 assert(h.status == "done")
16end
17
18-- we can create a generator where the lane body is a C function that raises an error
19do
20 local b, g = pcall(lanes.gen, "*", error)
21 assert(b == true and type(g) == "function")
22 -- we can start the lane
23 local b, h = pcall(g, "this is an error")
24 -- this provides the error that occurred in the lane
25 local s, e, t = h:join()
26 assert(h.status == "error")
27 assert(s == nil and e == "this is an error" and t == nil)
28end
diff --git a/unit_tests/scripts/lane/cooperative_shutdown.lua b/unit_tests/scripts/lane/cooperative_shutdown.lua
index 1204e35..0a0943e 100644
--- a/unit_tests/scripts/lane/cooperative_shutdown.lua
+++ b/unit_tests/scripts/lane/cooperative_shutdown.lua
@@ -1,10 +1,10 @@
1local lanes = require "lanes" 1local lanes = require "lanes".configure{on_state_create = require "fixture".on_state_create}
2 2
3-- launch lanes that cooperate properly with cancellation request 3-- launch lanes that cooperate properly with cancellation request
4 4
5local lane1 = function() 5local lane1 = function()
6 lane_threadname("lane1") 6 lane_threadname("lane1")
7 -- loop breaks on cancellation request 7 -- loop breaks on soft cancellation request
8 repeat 8 repeat
9 lanes.sleep(0) 9 lanes.sleep(0)
10 until cancel_test() 10 until cancel_test()
@@ -23,7 +23,6 @@ end
23local lane3 = function() 23local lane3 = function()
24 lane_threadname("lane3") 24 lane_threadname("lane3")
25 -- this one cooperates too, because of the hook cancellation modes that Lanes will be using 25 -- this one cooperates too, because of the hook cancellation modes that Lanes will be using
26 -- but not with LuaJIT, because the function is compiled, and we don't call anyone, so no hook triggers
27 local fixture = require "fixture" 26 local fixture = require "fixture"
28 repeat until fixture.give_me_back(false) 27 repeat until fixture.give_me_back(false)
29end 28end
@@ -31,9 +30,9 @@ end
31 30
32 31
33-- the generators 32-- the generators
34local g1 = lanes.gen("*", lane1) 33local g1 = lanes.gen("*", { name = 'auto' }, lane1)
35local g2 = lanes.gen("*", lane2) 34local g2 = lanes.gen("*", { name = 'auto' }, lane2)
36local g3 = lanes.gen("*", lane3) 35local g3 = lanes.gen("*", { name = 'auto' }, lane3)
37 36
38-- launch lanes 37-- launch lanes
39local h1 = g1() 38local h1 = g1()
@@ -43,7 +42,14 @@ local h2 = g2(linda)
43 42
44local h3 = g3() 43local h3 = g3()
45 44
46-- wait until they are both started 45lanes.sleep(0.1)
47repeat until h1.status == "running" and h2.status == "waiting" and h3.status == "running" 46
47local is_running = function(lane_h)
48 local status = lane_h.status
49 return status == "running" or status == "waiting"
50end
51
52-- wait until they are all started
53repeat until is_running(h1) and is_running(h2) and is_running(h3)
48 54
49-- let the script terminate, Lanes should not crash at shutdown 55-- let the script terminate, Lanes should not crash at shutdown
diff --git a/unit_tests/scripts/lane/stdlib_naming.lua b/unit_tests/scripts/lane/stdlib_naming.lua
index 2e045c3..4884cca 100644
--- a/unit_tests/scripts/lane/stdlib_naming.lua
+++ b/unit_tests/scripts/lane/stdlib_naming.lua
@@ -63,7 +63,7 @@ local function coro_f(_x)
63 return true 63 return true
64end 64end
65 65
66assert.fails(function() lanes_gen("xxx", {gc_cb = gc_cb}, io_os_f) end) 66assert.fails(function() lanes_gen("xxx", { name = 'auto', gc_cb = gc_cb }, io_os_f) end)
67 67
68local stdlib_naming_tests = 68local stdlib_naming_tests =
69{ 69{
diff --git a/unit_tests/scripts/lane/tasking_basic.lua b/unit_tests/scripts/lane/tasking_basic.lua
index 99be321..233accf 100644
--- a/unit_tests/scripts/lane/tasking_basic.lua
+++ b/unit_tests/scripts/lane/tasking_basic.lua
@@ -39,7 +39,7 @@ end
39 39
40PRINT("\n\n", "---=== Tasking (basic) ===---", "\n\n") 40PRINT("\n\n", "---=== Tasking (basic) ===---", "\n\n")
41 41
42local task_launch = lanes_gen("", { globals={hey=true}, gc_cb = gc_cb}, task) 42local task_launch = lanes_gen("", { name = 'auto', globals={hey=true}, gc_cb = gc_cb }, task)
43 -- base stdlibs, normal priority 43 -- base stdlibs, normal priority
44 44
45-- 'task_launch' is a factory of multithreaded tasks, we can launch several: 45-- 'task_launch' is a factory of multithreaded tasks, we can launch several:
diff --git a/unit_tests/scripts/lane/tasking_cancelling.lua b/unit_tests/scripts/lane/tasking_cancelling.lua
index a4e0fde..d153ffa 100644
--- a/unit_tests/scripts/lane/tasking_cancelling.lua
+++ b/unit_tests/scripts/lane/tasking_cancelling.lua
@@ -1,4 +1,7 @@
1local require_lanes_result_1, require_lanes_result_2 = require "lanes".configure(config).configure() 1local require_fixture_result_1, require_fixture_result_2 = require "fixture"
2local fixture = assert(require_fixture_result_1)
3
4local require_lanes_result_1, require_lanes_result_2 = require "lanes".configure{on_state_create = fixture.on_state_create}.configure()
2print("require_lanes_result:", require_lanes_result_1, require_lanes_result_2) 5print("require_lanes_result:", require_lanes_result_1, require_lanes_result_2)
3local lanes = require_lanes_result_1 6local lanes = require_lanes_result_1
4 7
@@ -15,69 +18,34 @@ local lanes_linda = assert(lanes.linda)
15-- ################################################################################################## 18-- ##################################################################################################
16-- ################################################################################################## 19-- ##################################################################################################
17 20
18local function task(a, b, c) 21-- cancellation of cooperating lanes
19 lane_threadname("task("..a..","..b..","..c..")") 22local cooperative = function()
20 --error "111" -- testing error messages 23 local fixture = assert(require "fixture")
21 assert(hey) 24 local which_cancel
22 local v=0 25 repeat
23 for i=a,b,c do 26 fixture.block_for(0.2)
24 v= v+i 27 which_cancel = cancel_test()
25 end 28 until which_cancel
26 return v, hey 29 return which_cancel
27end
28
29local gc_cb = function(name_, status_)
30 PRINT(" ---> lane '" .. name_ .. "' collected with status '" .. status_ .. "'")
31end 30end
31-- soft and hard are behaviorally equivalent when no blocking linda operation is involved
32local cooperative_lane_soft = lanes_gen("*", { name = 'auto' }, cooperative)()
33local a, b = cooperative_lane_soft:cancel("soft", 0) -- issue request, do not wait for lane to terminate
34assert(a == false and b == "timeout", "got " .. tostring(a) .. " " .. tostring(b))
35assert(cooperative_lane_soft[1] == "soft") -- return value of the lane body is the value returned by cancel_test()
36local cooperative_lane_hard = lanes_gen("*", { name = 'auto' }, cooperative)()
37local c, d = cooperative_lane_hard:cancel("hard", 0) -- issue request, do not wait for lane to terminate
38assert(a == false and b == "timeout", "got " .. tostring(c) .. " " .. tostring(d))
39assert(cooperative_lane_hard[1] == "hard") -- return value of the lane body is the value returned by cancel_test()
32 40
33-- ################################################################################################## 41-- ##################################################################################################
34-- ##################################################################################################
35-- ##################################################################################################
36
37PRINT("\n\n", "---=== Tasking (cancelling) ===---", "\n\n")
38
39local task_launch2 = lanes_gen("", { globals={hey=true}, gc_cb = gc_cb}, task)
40
41local N=999999999
42local lane9= task_launch2(1,N,1) -- huuuuuuge...
43
44-- Wait until state changes "pending"->"running"
45--
46local st
47local t0= os.time()
48while os.time()-t0 < 5 do
49 st= lane9.status
50 io.stderr:write((i==1) and st.." " or '.')
51 if st~="pending" then break end
52end
53PRINT(" "..st)
54
55if st=="error" then
56 local _= lane9[0] -- propagate the error here
57end
58if st=="done" then
59 error("Looping to "..N.." was not long enough (cannot test cancellation)")
60end
61assert(st=="running", "st == " .. st)
62
63-- when running under luajit, the function is JIT-ed, and the instruction count isn't hit, so we need a different hook
64lane9:cancel(jit and "line" or "count", 100) -- 0 timeout, hook triggers cancelslation when reaching the specified count
65
66local t0= os.time()
67while os.time()-t0 < 5 do
68 st= lane9.status
69 io.stderr:write((i==1) and st.." " or '.')
70 if st~="running" then break end
71end
72PRINT(" "..st)
73assert(st == "cancelled", "st is '" .. st .. "' instead of 'cancelled'")
74 42
75-- cancellation of lanes waiting on a linda 43-- cancellation of lanes waiting on a linda
76local limited = lanes_linda("limited") 44local limited = lanes_linda{name = "limited"}
77assert.fails(function() limited:limit("key", -1) end) 45assert.fails(function() limited:limit("key", -1) end)
78assert.failsnot(function() limited:limit("key", 1) end) 46assert.failsnot(function() limited:limit("key", 1) end)
79-- [[################################################ 47-- [[################################################
80limited:send("key", "hello") -- saturate linda 48limited:send("key", "hello") -- saturate linda, so that subsequent sends will block
81for k, v in pairs(limited:dump()) do 49for k, v in pairs(limited:dump()) do
82 PRINT("limited[" .. tostring(k) .. "] = " .. tostring(v)) 50 PRINT("limited[" .. tostring(k) .. "] = " .. tostring(v))
83end 51end
@@ -87,12 +55,16 @@ local wait_send = function()
87 a,b = limited:send("key", "bybye") -- infinite timeout, returns only when lane is cancelled 55 a,b = limited:send("key", "bybye") -- infinite timeout, returns only when lane is cancelled
88end 56end
89 57
90local wait_send_lane = lanes.gen("*", wait_send)() 58local wait_send_lane = lanes_gen("*", { name = 'auto' }, wait_send)()
91repeat until wait_send_lane.status == "waiting" 59repeat
92print "wait_send_lane is waiting" 60 io.stderr:write('!')
61 -- currently mingw64 builds can deadlock if we cancel the lane too early (before the linda blocks, at it causes the linda condvar not to be signalled)
62 lanes.sleep(0.1)
63until wait_send_lane.status == "waiting"
64PRINT "wait_send_lane is waiting"
93wait_send_lane:cancel() -- hard cancel, 0 timeout 65wait_send_lane:cancel() -- hard cancel, 0 timeout
94repeat until wait_send_lane.status == "cancelled" 66repeat until wait_send_lane.status == "cancelled"
95print "wait_send_lane is cancelled" 67PRINT "wait_send_lane is cancelled"
96--################################################]] 68--################################################]]
97local wait_receive = function() 69local wait_receive = function()
98 local k, v 70 local k, v
@@ -100,23 +72,31 @@ local wait_receive = function()
100 k, v = limited:receive("dummy") -- infinite timeout, returns only when lane is cancelled 72 k, v = limited:receive("dummy") -- infinite timeout, returns only when lane is cancelled
101end 73end
102 74
103local wait_receive_lane = lanes.gen("*", wait_receive)() 75local wait_receive_lane = lanes_gen("*", { name = 'auto' }, wait_receive)()
104repeat until wait_receive_lane.status == "waiting" 76repeat
105print "wait_receive_lane is waiting" 77 io.stderr:write('!')
78 -- currently mingw64 builds can deadlock if we cancel the lane too early (before the linda blocks, at it causes the linda condvar not to be signalled)
79 lanes.sleep(0.1)
80until wait_receive_lane.status == "waiting"
81PRINT "wait_receive_lane is waiting"
106wait_receive_lane:cancel() -- hard cancel, 0 timeout 82wait_receive_lane:cancel() -- hard cancel, 0 timeout
107repeat until wait_receive_lane.status == "cancelled" 83repeat until wait_receive_lane.status == "cancelled"
108print "wait_receive_lane is cancelled" 84PRINT "wait_receive_lane is cancelled"
109--################################################]] 85--################################################]]
110local wait_receive_batched = function() 86local wait_receive_batched = function()
111 local k, v1, v2 87 local k, v1, v2
112 set_finalizer(function() print("wait_receive_batched", k, v1, v2) end) 88 set_finalizer(function() print("wait_receive_batched", k, v1, v2) end)
113 k, v1, v2 = limited:receive(limited.batched, "dummy", 2) -- infinite timeout, returns only when lane is cancelled 89 k, v1, v2 = limited:receive_batched("dummy", 2) -- infinite timeout, returns only when lane is cancelled
114end 90end
115 91
116local wait_receive_batched_lane = lanes.gen("*", wait_receive_batched)() 92local wait_receive_batched_lane = lanes_gen("*", { name = 'auto' }, wait_receive_batched)()
117repeat until wait_receive_batched_lane.status == "waiting" 93repeat
118print "wait_receive_batched_lane is waiting" 94 io.stderr:write('!')
95 -- currently mingw64 builds can deadlock if we cancel the lane too early (before the linda blocks, at it causes the linda condvar not to be signalled)
96 lanes.sleep(0.1)
97until wait_receive_batched_lane.status == "waiting"
98PRINT "wait_receive_batched_lane is waiting"
119wait_receive_batched_lane:cancel() -- hard cancel, 0 timeout 99wait_receive_batched_lane:cancel() -- hard cancel, 0 timeout
120repeat until wait_receive_batched_lane.status == "cancelled" 100repeat until wait_receive_batched_lane.status == "cancelled"
121print "wait_receive_batched_lane is cancelled" 101PRINT "wait_receive_batched_lane is cancelled"
122--################################################]] 102--################################################]]
diff --git a/unit_tests/scripts/lane/tasking_cancelling_with_hook.lua b/unit_tests/scripts/lane/tasking_cancelling_with_hook.lua
new file mode 100644
index 0000000..56b934f
--- /dev/null
+++ b/unit_tests/scripts/lane/tasking_cancelling_with_hook.lua
@@ -0,0 +1,68 @@
1local require_lanes_result_1, require_lanes_result_2 = require "lanes".configure(config).configure()
2print("require_lanes_result:", require_lanes_result_1, require_lanes_result_2)
3local lanes = require_lanes_result_1
4
5local require_assert_result_1, require_assert_result_2 = require "_assert"
6print("require_assert_result:", require_assert_result_1, require_assert_result_2)
7
8local utils = lanes.require "_utils"
9local PRINT = utils.MAKE_PRINT()
10
11-- ##################################################################################################
12-- ##################################################################################################
13-- ##################################################################################################
14
15local function task(a, b, c)
16 lane_threadname("task("..a..","..b..","..c..")")
17 --error "111" -- testing error messages
18 assert(hey)
19 local v=0
20 for i=a,b,c do
21 v= v+i
22 end
23 return v, hey
24end
25
26local gc_cb = function(name_, status_)
27 PRINT(" ---> lane '" .. name_ .. "' collected with status '" .. status_ .. "'")
28end
29
30-- ##################################################################################################
31-- ##################################################################################################
32-- ##################################################################################################
33
34local generator = lanes.gen("", { name = 'auto', globals={hey=true}, gc_cb = gc_cb }, task)
35
36local N = 999999999
37local lane_h = generator(1,N,1) -- huuuuuuge...
38
39-- Wait until state changes "pending"->"running"
40--
41local st
42local t0 = os.time()
43while os.time()-t0 < 5 do
44 st = lane_h.status
45 io.stderr:write((i==1) and st.." " or '.')
46 if st~="pending" then break end
47end
48PRINT(" "..st)
49
50if st == "error" then
51 local _ = lane_h[0] -- propagate the error here
52end
53if st == "done" then
54 error("Looping to "..N.." was not long enough (cannot test cancellation)")
55end
56assert(st == "running", "st == " .. st)
57
58-- when running under luajit, the function is JIT-ed, and the instruction count isn't hit, so we need a different hook
59lane_h:cancel(jit and "line" or "count", 100) -- 0 timeout, hook triggers cancelslation when reaching the specified count
60
61local t0 = os.time()
62while os.time()-t0 < 5 do
63 st = lane_h.status
64 io.stderr:write((i==1) and st.." " or '.')
65 if st~="running" then break end
66end
67PRINT(" "..st)
68assert(st == "cancelled", "st is '" .. st .. "' instead of 'cancelled'")
diff --git a/unit_tests/scripts/lane/tasking_comms_criss_cross.lua b/unit_tests/scripts/lane/tasking_comms_criss_cross.lua
index db63b8e..610da8b 100644
--- a/unit_tests/scripts/lane/tasking_comms_criss_cross.lua
+++ b/unit_tests/scripts/lane/tasking_comms_criss_cross.lua
@@ -27,7 +27,7 @@ PRINT("\n\n", "---=== Comms criss cross ===---", "\n\n")
27 27
28-- We make two identical lanes, which are using the same Linda channel. 28-- We make two identical lanes, which are using the same Linda channel.
29-- 29--
30local tc = lanes_gen("io", {gc_cb = gc_cb}, 30local tc = lanes_gen("io", { name = 'auto', gc_cb = gc_cb },
31 function(linda, ch_in, ch_out) 31 function(linda, ch_in, ch_out)
32 lane_threadname("criss cross " .. ch_in .. " -> " .. ch_out) 32 lane_threadname("criss cross " .. ch_in .. " -> " .. ch_out)
33 local function STAGE(str) 33 local function STAGE(str)
@@ -42,7 +42,7 @@ local tc = lanes_gen("io", {gc_cb = gc_cb},
42 end 42 end
43) 43)
44 44
45local linda= lanes_linda("criss cross") 45local linda= lanes_linda{name = "criss cross"}
46 46
47local a,b= tc(linda, "A","B"), tc(linda, "B","A") -- launching two lanes, twisted comms 47local a,b= tc(linda, "A","B"), tc(linda, "B","A") -- launching two lanes, twisted comms
48 48
diff --git a/unit_tests/scripts/lane/tasking_communications.lua b/unit_tests/scripts/lane/tasking_communications.lua
index b922973..01842b4 100644
--- a/unit_tests/scripts/lane/tasking_communications.lua
+++ b/unit_tests/scripts/lane/tasking_communications.lua
@@ -72,7 +72,7 @@ local chunk= function(linda)
72 WR("chunk ", "Lane ends!\n") 72 WR("chunk ", "Lane ends!\n")
73end 73end
74 74
75local linda = lanes_linda("communications") 75local linda = lanes_linda{name = "communications"}
76assert(type(linda) == "userdata" and tostring(linda) == "Linda: communications") 76assert(type(linda) == "userdata" and tostring(linda) == "Linda: communications")
77 -- 77 --
78 -- ["->"] master -> slave 78 -- ["->"] master -> slave
@@ -90,7 +90,7 @@ local b,x,y,z,w = linda:get("<->", 4)
90assert(b == 3 and x == "x" and y == "y" and z == "z" and w == nil) 90assert(b == 3 and x == "x" and y == "y" and z == "z" and w == nil)
91local k, x = linda:receive("<->") 91local k, x = linda:receive("<->")
92assert(k == "<->" and x == "x") 92assert(k == "<->" and x == "x")
93local k,y,z = linda:receive(linda.batched, "<->", 2) 93local k,y,z = linda:receive_batched("<->", 2)
94assert(k == "<->" and y == "y" and z == "z") 94assert(k == "<->" and y == "y" and z == "z")
95linda:set("<->") 95linda:set("<->")
96local b,x,y,z,w = linda:get("<->", 4) 96local b,x,y,z,w = linda:get("<->", 4)
@@ -101,7 +101,7 @@ local function PEEK(...) return linda:get("<-", ...) end
101local function SEND(...) local _res, _err = linda:send("->", ...) assert(_res == true and _err == nil) end 101local function SEND(...) local _res, _err = linda:send("->", ...) assert(_res == true and _err == nil) end
102local function RECEIVE() local k,v = linda:receive(1, "<-") return v end 102local function RECEIVE() local k,v = linda:receive(1, "<-") return v end
103 103
104local comms_lane = lanes_gen("io", {gc_cb = gc_cb, name = "auto"}, chunk)(linda) -- prepare & launch 104local comms_lane = lanes_gen("io", { name = 'auto', gc_cb = gc_cb }, chunk)(linda) -- prepare & launch
105 105
106SEND(1); WR("main ", "1 sent\n") 106SEND(1); WR("main ", "1 sent\n")
107SEND(2); WR("main ", "2 sent\n") 107SEND(2); WR("main ", "2 sent\n")
diff --git a/unit_tests/scripts/lane/tasking_error.lua b/unit_tests/scripts/lane/tasking_error.lua
index 1e2347f..26f244b 100644
--- a/unit_tests/scripts/lane/tasking_error.lua
+++ b/unit_tests/scripts/lane/tasking_error.lua
@@ -22,7 +22,7 @@ end
22PRINT("---=== Tasking (error) ===---", "\n\n") 22PRINT("---=== Tasking (error) ===---", "\n\n")
23 23
24-- a lane that throws immediately the error value it received 24-- a lane that throws immediately the error value it received
25local g = lanes_gen("", {gc_cb = gc_cb}, error) 25local g = lanes_gen("", { name = 'auto', gc_cb = gc_cb }, error)
26local errmsg = "ERROR!" 26local errmsg = "ERROR!"
27 27
28if true then 28if true then
diff --git a/unit_tests/scripts/lane/tasking_join_test.lua b/unit_tests/scripts/lane/tasking_join_test.lua
index 8f2d4db..495a709 100644
--- a/unit_tests/scripts/lane/tasking_join_test.lua
+++ b/unit_tests/scripts/lane/tasking_join_test.lua
@@ -30,14 +30,19 @@ end
30 30
31PRINT("---=== :join test ===---", "\n\n") 31PRINT("---=== :join test ===---", "\n\n")
32 32
33-- a lane body that returns nothing is successfully joined with true, nil
34local r, ret = lanes_gen(function() end)():join()
35assert(r == true and ret == nil)
36
33-- NOTE: 'unpack()' cannot be used on the lane handle; it will always return nil 37-- NOTE: 'unpack()' cannot be used on the lane handle; it will always return nil
34-- (unless [1..n] has been read earlier, in which case it would seemingly 38-- (unless [1..n] has been read earlier, in which case it would seemingly
35-- work). 39-- work).
36 40
37local S= lanes_gen("table", {gc_cb = gc_cb}, 41local S = lanes_gen("table", { name = 'auto', gc_cb = gc_cb },
38 function(arg) 42 function(arg)
39 lane_threadname "join test lane" 43 lane_threadname "join test lane"
40 set_finalizer(function() end) 44 set_finalizer(function() end)
45 -- take arg table, reverse its contents in aux, then return the unpacked result
41 local aux= {} 46 local aux= {}
42 for i, v in ipairs(arg) do 47 for i, v in ipairs(arg) do
43 table.insert(aux, 1, v) 48 table.insert(aux, 1, v)
@@ -46,15 +51,16 @@ local S= lanes_gen("table", {gc_cb = gc_cb},
46 return (unpack or table.unpack)(aux) 51 return (unpack or table.unpack)(aux)
47end) 52end)
48 53
49h= S { 12, 13, 14 } -- execution starts, h[1..3] will get the return values 54local h = S { 12, 13, 14 } -- execution starts, h[1..3] will get the return values
50-- wait a bit so that the lane has a chance to set its debug name 55-- wait a bit so that the lane has a chance to set its debug name
51SLEEP(0.5) 56SLEEP(0.5)
52print("joining with '" .. h:get_threadname() .. "'") 57print("joining with '" .. h:get_threadname() .. "'")
53local a,b,c,d= h:join() 58local r, a, b, c, d = h:join()
54if h.status == "error" then 59if h.status == "error" then
55 print(h:get_threadname(), "error: " , a, b, c, d) 60 print(h:get_threadname(), "error: " , r, a, b, c, d)
56else 61else
57 print(h:get_threadname(), a,b,c,d) 62 print(h:get_threadname(), r, a, b, c, d)
63 assert(r==true, "r == " .. tostring(r))
58 assert(a==14, "a == " .. tostring(a)) 64 assert(a==14, "a == " .. tostring(a))
59 assert(b==13, "b == " .. tostring(b)) 65 assert(b==13, "b == " .. tostring(b))
60 assert(c==12, "c == " .. tostring(c)) 66 assert(c==12, "c == " .. tostring(c))
diff --git a/unit_tests/scripts/lane/tasking_send_receive_code.lua b/unit_tests/scripts/lane/tasking_send_receive_code.lua
index 77a4b12..fdc2602 100644
--- a/unit_tests/scripts/lane/tasking_send_receive_code.lua
+++ b/unit_tests/scripts/lane/tasking_send_receive_code.lua
@@ -53,28 +53,26 @@ local function chunk2(linda)
53 assert(info.linedefined == 32, "bad linedefined") -- start of 'chunk2' 53 assert(info.linedefined == 32, "bad linedefined") -- start of 'chunk2'
54 assert(config.strip_functions and info.currentline==-1 or info.currentline > info.linedefined, "bad currentline") -- line of 'debug.getinfo' 54 assert(config.strip_functions and info.currentline==-1 or info.currentline > info.linedefined, "bad currentline") -- line of 'debug.getinfo'
55 assert(info.lastlinedefined > info.currentline, "bad lastlinedefined") -- end of 'chunk2' 55 assert(info.lastlinedefined > info.currentline, "bad lastlinedefined") -- end of 'chunk2'
56 local k,func= linda:receive("down") 56 assert(linda:count("down") == 2, "bad linda contents") -- function, "ok"
57 assert(type(func)=="function", "not a function") 57 local k,func,str= linda:receive_batched("down", 2)
58 assert(k=="down") 58 assert(k=="down")
59 assert(type(func)=="function", "not a function")
60 assert(str=="ok", "bad receive result: " .. tostring(k) .. " -> ".. tostring(str))
61 assert(linda:count("down") == 0, "bad linda contents") -- nothing
59 62
60 func(linda) 63 func(linda)
61
62 local k,str= linda:receive("down")
63 assert(str=="ok", "bad receive result")
64
65 linda:send("up", function() return ":)" end, "ok2") 64 linda:send("up", function() return ":)" end, "ok2")
66end 65end
67 66
68local linda = lanes_linda("auto") 67local linda = lanes_linda{name = "auto"}
69local t2= lanes_gen("debug,package,string,io", {gc_cb = gc_cb}, chunk2)(linda) -- prepare & launch 68local t2= lanes_gen("debug,package,string,io", { name = 'auto', gc_cb = gc_cb }, chunk2)(linda) -- prepare & launch
70linda:send("down", function(linda) linda:send("up", "ready!") end, 69linda:send("down", function(linda) linda:send("up", "ready!") end, "ok")
71 "ok")
72-- wait to see if the tiny function gets executed 70-- wait to see if the tiny function gets executed
73-- 71--
74local k,s= linda:receive(1, "up") 72local k,s= linda:receive(1, "up")
75if t2.status == "error" then 73if t2.status == "error" then
76 PRINT("t2 error: " , t2:join()) 74 local n,err,s = t2:join()
77 assert(false) 75 assert(false, "t2 error: " .. err)
78end 76end
79PRINT(s) 77PRINT(s)
80assert(s=="ready!", s .. " is not 'ready!'") 78assert(s=="ready!", s .. " is not 'ready!'")
diff --git a/unit_tests/scripts/lane/uncooperative_shutdown.lua b/unit_tests/scripts/lane/uncooperative_shutdown.lua
index 56c936b..eb89ed3 100644
--- a/unit_tests/scripts/lane/uncooperative_shutdown.lua
+++ b/unit_tests/scripts/lane/uncooperative_shutdown.lua
@@ -8,11 +8,11 @@ local lanes = require "lanes".configure{shutdown_timeout = 0.001, on_state_creat
8-- launch lanes that blocks forever 8-- launch lanes that blocks forever
9local lane = function() 9local lane = function()
10 local fixture = require "fixture" 10 local fixture = require "fixture"
11 fixture.forever() 11 fixture.block_for()
12end 12end
13 13
14-- the generator 14-- the generator
15local g1 = lanes.gen("*", {name = "auto"}, lane) 15local g1 = lanes.gen("*", { name = 'auto' }, lane)
16 16
17-- launch lane 17-- launch lane
18local h1 = g1() 18local h1 = g1()
@@ -20,5 +20,5 @@ local h1 = g1()
20-- wait until the lane is running 20-- wait until the lane is running
21repeat until h1.status == "running" 21repeat until h1.status == "running"
22 22
23-- let the script end, Lanes should throw std::logic_error because the lane did not gracefully terminate 23-- this finalizer returns an error string that telling Universe::__gc will use to raise an error when it detects the uncooperative lane
24lanes.finally(fixture.throwing_finalizer) 24lanes.finally(fixture.throwing_finalizer)
diff --git a/unit_tests/scripts/linda/multiple_keepers.lua b/unit_tests/scripts/linda/multiple_keepers.lua
index 8733087..267d874 100644
--- a/unit_tests/scripts/linda/multiple_keepers.lua
+++ b/unit_tests/scripts/linda/multiple_keepers.lua
@@ -2,9 +2,9 @@
2local require_lanes_result_1, require_lanes_result_2 = require "lanes".configure{nb_user_keepers = 3, keepers_gc_threshold = 500} 2local require_lanes_result_1, require_lanes_result_2 = require "lanes".configure{nb_user_keepers = 3, keepers_gc_threshold = 500}
3local lanes = require_lanes_result_1 3local lanes = require_lanes_result_1
4 4
5local a = lanes.linda("A", 1) 5local a = lanes.linda{name = "A", group = 1}
6local b = lanes.linda("B", 2) 6local b = lanes.linda{name = "B", group = 2}
7local c = lanes.linda("C", 3) 7local c = lanes.linda{name = "C", group = 3}
8 8
9-- store each linda in the other 2 9-- store each linda in the other 2
10do 10do
diff --git a/unit_tests/scripts/linda/send_receive_func_and_string.lua b/unit_tests/scripts/linda/send_receive_func_and_string.lua
new file mode 100644
index 0000000..188cfcd
--- /dev/null
+++ b/unit_tests/scripts/linda/send_receive_func_and_string.lua
@@ -0,0 +1,13 @@
1local lanes = require "lanes"
2
3-- a newly created linda doesn't contain anything
4local l = lanes.linda()
5
6-- send a function and a string, make sure that's what we read back
7l:send("k", function() end, "str")
8local c = l:count("k")
9assert(c == 2, "got " .. c)
10local k, v1, v2 = l:receive_batched("k", 2)
11local tv1, tv2 = type(v1), type(v2)
12assert(k == "k" and tv1 == "function" and tv2 == "string", "got " .. tv1 .. " " .. tv2)
13assert(l:count("k") == 0)
diff --git a/unit_tests/scripts/linda/send_registered_userdata.lua b/unit_tests/scripts/linda/send_registered_userdata.lua
index 2c0195a..90c05c9 100644
--- a/unit_tests/scripts/linda/send_registered_userdata.lua
+++ b/unit_tests/scripts/linda/send_registered_userdata.lua
@@ -1,5 +1,5 @@
1local lanes = require 'lanes'.configure{with_timers = false} 1local lanes = require 'lanes'.configure{with_timers = false}
2local l = lanes.linda'gleh' 2local l = lanes.linda{name = 'gleh'}
3l:set('yo', io.stdin) 3l:set('yo', io.stdin)
4local n, stdin_out = l:get('yo') 4local n, stdin_out = l:get('yo')
5assert(n == 1 and stdin_out == io.stdin, tostring(stdin_out) .. " ~= " .. tostring(io.stdin)) 5assert(n == 1 and stdin_out == io.stdin, tostring(stdin_out) .. " ~= " .. tostring(io.stdin))
diff --git a/unit_tests/scripts/linda/wake_period.lua b/unit_tests/scripts/linda/wake_period.lua
new file mode 100644
index 0000000..d2dccc3
--- /dev/null
+++ b/unit_tests/scripts/linda/wake_period.lua
@@ -0,0 +1,42 @@
1-- default wake period is 0.5 seconds
2local require_lanes_result_1, require_lanes_result_2 = require "lanes".configure{linda_wake_period = 0.5}
3local lanes = require_lanes_result_1
4
5-- a lane that performs a blocking operation for 2 seconds
6local body = function(linda_)
7 -- a blocking read that lasts longer than the tested wake_period values
8 linda_:receive(2, "empty_slot")
9 return "done"
10end
11
12-- if we don't cancel the lane, we should wait the whole duration
13local function check_wake_duration(linda_, expected_, do_cancel_)
14 local h = lanes.gen(body)(linda_)
15 -- wait until the linda is blocked
16 repeat until h.status == "waiting"
17 local t0 = lanes.now_secs()
18 -- soft cancel, no timeout, no waking
19 if do_cancel_ then
20 local result, reason = h:cancel('soft', 0, false)
21 -- should say there was a timeout, since the lane didn't actually cancel (normal since we did not wake it)
22 assert(result == false and reason == 'timeout', "unexpected cancel result")
23 end
24 -- this should wait until the linda wakes by itself before the actual receive timeout and sees the cancel request
25 local r, ret = h:join()
26 assert(r == true and ret == "done")
27 local t1 = lanes.now_secs()
28 local delta = t1 - t0
29 -- the linda should check for cancellation at about the expected period, not earlier
30 assert(delta >= expected_, tostring(linda_) .. " woke too early:" .. delta)
31 -- the lane shouldn't terminate too long after cancellation was processed
32 assert(delta <= expected_ * 1.1, tostring(linda_) .. " woke too late: " .. delta)
33end
34
35-- legacy behavior: linda waits until operation timeout
36check_wake_duration(lanes.linda{name = "A", wake_period = 'never'}, 2, true)
37-- early wake behavior: linda wakes after the expected time, sees a cancellation requests, and aborts the operation early
38check_wake_duration(lanes.linda{name = "B", wake_period = 0.25}, 0.25, true)
39check_wake_duration(lanes.linda{name = "C"}, 0.5, true) -- wake_period defaults to 0.5 (see above)
40check_wake_duration(lanes.linda{name = "D", wake_period = 1}, 1, true)
41-- even when there is a wake_period, the operation should reach full timeout if not cancelled early
42check_wake_duration(lanes.linda{name = "E", wake_period = 0.1}, 2, false)
diff --git a/unit_tests/scripts/misc/deeptest.lua b/unit_tests/scripts/misc/deeptest.lua
new file mode 100644
index 0000000..542c35b
--- /dev/null
+++ b/unit_tests/scripts/misc/deeptest.lua
@@ -0,0 +1,161 @@
1local fixture = require "fixture"
2local lanes = require("lanes").configure{on_state_create = fixture.on_state_create}
3local l = lanes.linda{name = "my linda"}
4
5local table_unpack = table.unpack or unpack -- Lua 5.1 support
6
7-- we will transfer userdata created by this module, so we need to make Lanes aware of it
8local dt = lanes.require "deep_userdata_example"
9
10-- set DEEP to any non-false value to run the Deep Userdata tests. "gc" selects a special test for debug purposes
11DEEP = DEEP or true
12-- set CLONABLE to any non-false value to run the Clonable Userdata tests
13CLONABLE = CLONABLE or true
14
15-- lua 5.1->5.2 support a single table uservalue
16-- lua 5.3->5.4 supports an arbitrary type uservalue
17local test_uvtype = (_VERSION == "Lua 5.4") and "function" or (_VERSION == "Lua 5.3") and "string" or "table"
18-- lua 5.4 supports multiple uservalues
19local nupvals = _VERSION == "Lua 5.4" and 3 or 1
20
21local makeUserValue = function( obj_)
22 if test_uvtype == "table" then
23 return {"some uservalue"}
24 elseif test_uvtype == "string" then
25 return "some uservalue"
26 elseif test_uvtype == "function" then
27 -- a function that pull the userdata as upvalue
28 local f = function()
29 return "-> '" .. tostring( obj_) .. "'"
30 end
31 return f
32 end
33end
34
35local printDeep = function( prefix_, obj_, t_)
36 print( prefix_, obj_)
37 for uvi = 1, nupvals do
38 local uservalue = obj_:getuv(uvi)
39 print ("uv #" .. uvi, type( uservalue), uservalue, type(uservalue) == "function" and uservalue() or "")
40 end
41 if t_ then
42 local count = 0
43 for k, v in ipairs( t_) do
44 print( "t["..tostring(k).."]", v)
45 count = count + 1
46 end
47 -- we should have only 2 indexed entries with the same value
48 assert(count == 2 and t_[1] == t_[2])
49 end
50 print()
51end
52
53local performTest = function( obj_)
54 -- setup the userdata with some value and a uservalue
55 obj_:set( 666)
56 obj_:setuv( 1, makeUserValue( obj_))
57 if nupvals > 1 then
58 -- keep uv #2 as nil
59 obj_:setuv( 3, "ENDUV")
60 end
61
62 local t =
63 {
64 -- two indices with an identical value: we should also have identical values on the other side (even if not the same as the original ones when they are clonables)
65 obj_,
66 obj_,
67 -- this one won't transfer because we don't support full uservalue as keys
68 [obj_] = "val"
69 }
70
71 -- read back the contents of the object
72 printDeep( "immediate:", obj_, t)
73
74 -- send the object in a linda, get it back out, read the contents
75 l:set( "key", obj_, t)
76 -- when obj_ is a deep userdata, out is the same userdata as obj_ (not another one pointing on the same deep memory block) because of an internal cache table [deep*] -> proxy)
77 -- when obj_ is a clonable userdata, we get a different clone everytime we cross a linda or lane barrier
78 local _n, _val1, _val2 = l:get( "key", 2)
79 assert(_n == (_val2 and 2 or 1))
80 printDeep( "out of linda:", _val1, _val2)
81
82 -- send the object in a lane through argument passing, the lane body returns it as return value, read the contents
83 local g = lanes.gen(
84 "package"
85 , {
86 name = 'auto',
87 required = { "deep_userdata_example"} -- we will transfer userdata created by this module, so we need to make this lane aware of it
88 }
89 , function( arg_, t_)
90 -- read contents inside lane: arg_ and t_ by argument
91 printDeep( "in lane, as arguments:", arg_, t_)
92 -- read contents inside lane: obj_ and t by upvalue
93 printDeep( "in lane, as upvalues:", obj_, t)
94 -- read contents inside lane: in linda
95 local _n, _val1, _val2 = l:get( "key", 2)
96 assert(_n == (_val2 and 2 or 1))
97 printDeep( "in lane, from linda:", _val1, _val2)
98 return arg_, t_
99 end
100 )
101 h = g( obj_, t)
102 -- when obj_ is a deep userdata, from_lane is the same userdata as obj_ (not another one pointing on the same deep memory block) because of an internal cache table [deep*] -> proxy)
103 -- when obj_ is a clonable userdata, we get a different clone everytime we cross a linda or lane barrier
104 printDeep( "from lane:", h[1], h[2])
105end
106
107if DEEP then
108 print "================================================================"
109 print "DEEP"
110 local d = dt.new_deep(nupvals)
111 if type(DEEP) == "string" then
112 local gc_tests = {
113 thrasher = function(repeat_, size_)
114 print "in thrasher"
115 -- result is a table of repeat_ tables, each containing size_ entries
116 local result = {}
117 for i = 1, repeat_ do
118 local batch_values = {}
119 for j = 1, size_ do
120 table.insert(batch_values, j)
121 end
122 table.insert(result, batch_values)
123 end
124 print "thrasher done"
125 return result
126 end,
127 stack_abuser = function(repeat_, size_)
128 print "in stack_abuser"
129 for i = 1, repeat_ do
130 local batch_values = {}
131 for j = 1, size_ do
132 table.insert(batch_values, j)
133 end
134 -- return size_ values
135 local _ = table_unpack(batch_values)
136 end
137 print "stack_abuser done"
138 return result
139 end
140 }
141 -- have the object call the function from inside one of its functions, to detect if it gets collected from there (while in use!)
142 local testf = gc_tests[DEEP]
143 if testf then
144 local r = d:invoke(gc_tests[DEEP], REPEAT or 10, SIZE or 10)
145 print("invoke -> ", tostring(r))
146 else
147 print("unknown test '" .. DEEP .. "'")
148 end
149 else
150 performTest(d)
151 end
152end
153
154if CLONABLE then
155 print "================================================================"
156 print "CLONABLE"
157 performTest( dt.new_clonable(nupvals))
158end
159
160print "================================================================"
161print "TEST OK" \ No newline at end of file
diff --git a/unit_tests/shared.cpp b/unit_tests/shared.cpp
index d139579..9f3b08e 100644
--- a/unit_tests/shared.cpp
+++ b/unit_tests/shared.cpp
@@ -18,42 +18,26 @@ namespace
18 { 18 {
19 STACK_CHECK_START_REL(L_, 0); 19 STACK_CHECK_START_REL(L_, 0);
20 lua_getglobal(L_, "package"); // L_: package 20 lua_getglobal(L_, "package"); // L_: package
21 std::ignore = luaG_getfield(L_, kIdxTop, "preload"); // L_: package package.preload 21 std::ignore = luaW_getfield(L_, kIdxTop, "preload"); // L_: package package.preload
22 lua_pushcfunction(L_, openf_); // L_: package package.preload openf_ 22 lua_pushcfunction(L_, openf_); // L_: package package.preload openf_
23 luaG_setfield(L_, StackIndex{ -2 }, name_); // L_: package package.preload 23 luaW_setfield(L_, StackIndex{ -2 }, name_); // L_: package package.preload
24 lua_pop(L_, 2); 24 lua_pop(L_, 2);
25 STACK_CHECK(L_, 0); 25 STACK_CHECK(L_, 0);
26 } 26 }
27 27
28
29 static std::map<lua_State*, std::atomic_flag> sFinalizerHits; 28 static std::map<lua_State*, std::atomic_flag> sFinalizerHits;
30 static std::mutex sCallCountsLock; 29 static std::mutex sCallCountsLock;
31 30
32 // a finalizer that we can detect even after closing the state 31 // a finalizer that we can detect even after closing the state
33 lua_CFunction sThrowingFinalizer = +[](lua_State* L_) { 32 lua_CFunction sFreezingFinalizer = +[](lua_State* const L_) {
34 std::lock_guard _guard{ sCallCountsLock }; 33 std::lock_guard _guard{ sCallCountsLock };
35 sFinalizerHits[L_].test_and_set(); 34 sFinalizerHits[L_].test_and_set();
36 luaG_pushstring(L_, "throw"); 35 luaW_pushstring(L_, "freeze"); // just freeze the thread in place so that it can be debugged
37 return 1; 36 return 1;
38 }; 37 };
39 38
40 // a finalizer that we can detect even after closing the state
41 lua_CFunction sYieldingFinalizer = +[](lua_State* L_) {
42 std::lock_guard _guard{ sCallCountsLock };
43 sFinalizerHits[L_].test_and_set();
44 return 0;
45 };
46
47 // a function that runs forever
48 lua_CFunction sForever = +[](lua_State* L_) {
49 while (true) {
50 std::this_thread::yield();
51 }
52 return 0;
53 };
54
55 // a function that returns immediately (so that LuaJIT issues a function call for it) 39 // a function that returns immediately (so that LuaJIT issues a function call for it)
56 lua_CFunction sGiveMeBack = +[](lua_State* L_) { 40 lua_CFunction sGiveMeBack = +[](lua_State* const L_) {
57 return lua_gettop(L_); 41 return lua_gettop(L_);
58 }; 42 };
59 43
@@ -63,25 +47,53 @@ namespace
63 }; 47 };
64 48
65 lua_CFunction sNewUserData = +[](lua_State* const L_) { 49 lua_CFunction sNewUserData = +[](lua_State* const L_) {
66 std::ignore = luaG_newuserdatauv<int>(L_, UserValueCount{ 0 }); 50 std::ignore = luaW_newuserdatauv<int>(L_, UserValueCount{ 0 });
67 return 1; 51 return 1;
68 }; 52 };
69 53
70 // a function that enables any lane to require "fixture" 54 // a function that enables any lane to require "fixture" and "deep_userdata_example"
71 lua_CFunction sOnStateCreate = +[](lua_State* const L_) { 55 lua_CFunction sOnStateCreate = +[](lua_State* const L_) {
72 PreloadModule(L_, "fixture", luaopen_fixture); 56 PreloadModule(L_, "fixture", luaopen_fixture);
73 PreloadModule(L_, "deep_userdata_example", luaopen_deep_userdata_example); 57 PreloadModule(L_, "deep_userdata_example", luaopen_deep_userdata_example);
74 return 0; 58 return 0;
75 }; 59 };
76 60
61 // a function that blocks for the specified duration (in seconds) by putting the current thread to sleep
62 lua_CFunction sBlockFor = +[](lua_State* const L_) {
63 std::chrono::time_point<std::chrono::steady_clock> _until{ std::chrono::time_point<std::chrono::steady_clock>::max() };
64 lua_settop(L_, 1);
65 if (luaW_type(L_, kIdxTop) == LuaType::NUMBER) { // we don't want to use lua_isnumber() because of autocoercion
66 lua_Duration const _duration{ lua_tonumber(L_, kIdxTop) };
67 if (_duration.count() >= 0.0) {
68 _until = std::chrono::steady_clock::now() + std::chrono::duration_cast<std::chrono::steady_clock::duration>(_duration);
69 } else {
70 raise_luaL_argerror(L_, kIdxTop, "duration cannot be < 0");
71 }
72
73 } else if (!lua_isnoneornil(L_, 2)) {
74 raise_luaL_argerror(L_, StackIndex{ 2 }, "incorrect duration type");
75 }
76 std::this_thread::sleep_until(_until);
77 return 0;
78 };
79
80 // a finalizer that we can detect even after closing the state
81 lua_CFunction sThrowingFinalizer = +[](lua_State* const L_) {
82 std::lock_guard _guard{ sCallCountsLock };
83 sFinalizerHits[L_].test_and_set();
84 bool const _allLanesTerminated = lua_toboolean(L_, kIdxTop);
85 luaW_pushstring(L_, "Finalizer%s", _allLanesTerminated ? "" : ": Uncooperative lanes detected");
86 return 1;
87 };
88
77 static luaL_Reg const sFixture[] = { 89 static luaL_Reg const sFixture[] = {
78 { "forever", sForever }, 90 { "freezing_finalizer", sFreezingFinalizer },
79 { "give_me_back()", sGiveMeBack }, 91 { "give_me_back", sGiveMeBack },
80 { "newlightuserdata", sNewLightUserData }, 92 { "newlightuserdata", sNewLightUserData },
81 { "newuserdata", sNewUserData }, 93 { "newuserdata", sNewUserData },
82 { "on_state_create", sOnStateCreate }, 94 { "on_state_create", sOnStateCreate },
95 { "block_for", sBlockFor },
83 { "throwing_finalizer", sThrowingFinalizer }, 96 { "throwing_finalizer", sThrowingFinalizer },
84 { "yielding_finalizer", sYieldingFinalizer },
85 { nullptr, nullptr } 97 { nullptr, nullptr }
86 }; 98 };
87 } // namespace local 99 } // namespace local
@@ -91,7 +103,7 @@ namespace
91 int luaopen_fixture(lua_State* L_) 103 int luaopen_fixture(lua_State* L_)
92 { 104 {
93 STACK_CHECK_START_REL(L_, 0); 105 STACK_CHECK_START_REL(L_, 0);
94 luaG_newlib<std::size(local::sFixture)>(L_, local::sFixture); // M 106 luaW_newlib<std::size(local::sFixture)>(L_, local::sFixture); // M
95 STACK_CHECK(L_, 1); 107 STACK_CHECK(L_, 1);
96 return 1; 108 return 1;
97 } 109 }
@@ -234,7 +246,7 @@ LuaError LuaState::doString(std::string_view const& str_) const
234 return _loadErr; 246 return _loadErr;
235 } 247 }
236 LuaError const _callErr{ lua_pcall(L, 0, 1, 0) }; // L: "<msg>"? 248 LuaError const _callErr{ lua_pcall(L, 0, 1, 0) }; // L: "<msg>"?
237 [[maybe_unused]] std::string_view const _out{ luaG_tostring(L, kIdxTop) }; 249 [[maybe_unused]] std::string_view const _out{ luaW_tostring(L, kIdxTop) };
238 STACK_CHECK(L, 1); 250 STACK_CHECK(L, 1);
239 return _callErr; 251 return _callErr;
240} 252}
@@ -245,8 +257,8 @@ std::string_view LuaState::doStringAndRet(std::string_view const& str_) const
245{ 257{
246 lua_settop(L, 0); 258 lua_settop(L, 0);
247 if (str_.empty()) { 259 if (str_.empty()) {
248 luaG_pushstring(L, ""); 260 luaW_pushstring(L, "");
249 return luaG_tostring(L, kIdxTop); 261 return luaW_tostring(L, kIdxTop);
250 } 262 }
251 STACK_CHECK_START_REL(L, 0); 263 STACK_CHECK_START_REL(L, 0);
252 LuaError const _loadErr{ luaL_loadstring(L, str_.data()) }; // L: chunk() 264 LuaError const _loadErr{ luaL_loadstring(L, str_.data()) }; // L: chunk()
@@ -256,7 +268,7 @@ std::string_view LuaState::doStringAndRet(std::string_view const& str_) const
256 } 268 }
257 [[maybe_unused]] LuaError const _callErr{ lua_pcall(L, 0, 1, 0) }; // L: "<msg>"?|retstring 269 [[maybe_unused]] LuaError const _callErr{ lua_pcall(L, 0, 1, 0) }; // L: "<msg>"?|retstring
258 STACK_CHECK(L, 1); 270 STACK_CHECK(L, 1);
259 return luaG_tostring(L, kIdxTop); 271 return luaW_tostring(L, kIdxTop);
260} 272}
261 273
262// ################################################################################################# 274// #################################################################################################
@@ -324,7 +336,7 @@ void LuaState::requireFailure(std::string_view const& script_)
324{ 336{
325 auto const _result{ doString(script_) }; 337 auto const _result{ doString(script_) };
326 if (_result == LuaError::OK) { 338 if (_result == LuaError::OK) {
327 WARN(luaG_tostring(L, kIdxTop)); 339 WARN(luaW_tostring(L, kIdxTop));
328 } 340 }
329 REQUIRE(_result != LuaError::OK); 341 REQUIRE(_result != LuaError::OK);
330 lua_settop(L, 0); 342 lua_settop(L, 0);
@@ -360,7 +372,7 @@ void LuaState::requireSuccess(std::string_view const& script_)
360{ 372{
361 auto const _result{ doString(script_) }; 373 auto const _result{ doString(script_) };
362 if (_result != LuaError::OK) { 374 if (_result != LuaError::OK) {
363 WARN(luaG_tostring(L, kIdxTop)); 375 WARN(luaW_tostring(L, kIdxTop));
364 } 376 }
365 REQUIRE(_result == LuaError::OK); 377 REQUIRE(_result == LuaError::OK);
366 lua_settop(L, 0); 378 lua_settop(L, 0);
@@ -372,7 +384,7 @@ void LuaState::requireSuccess(std::filesystem::path const& root_, std::string_vi
372{ 384{
373 auto const _result{ doFile(root_, path_) }; 385 auto const _result{ doFile(root_, path_) };
374 if (_result != LuaError::OK) { 386 if (_result != LuaError::OK) {
375 WARN(luaG_tostring(L, kIdxTop)); 387 WARN(luaW_tostring(L, kIdxTop));
376 } 388 }
377 REQUIRE(_result == LuaError::OK); 389 REQUIRE(_result == LuaError::OK);
378 lua_settop(L, 0); 390 lua_settop(L, 0);
@@ -395,20 +407,20 @@ TEST_CASE("LuaState.doString")
395{ 407{
396 LuaState _L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } }; 408 LuaState _L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
397 // if the script fails to load, we should find the error message at the top of the stack 409 // if the script fails to load, we should find the error message at the top of the stack
398 REQUIRE([&L = _L]() { std::ignore = L.doString("function end"); return lua_gettop(L) == 1 && luaG_type(L, StackIndex{1}) == LuaType::STRING; }()); 410 REQUIRE([&L = _L]() { std::ignore = L.doString("function end"); return lua_gettop(L) == 1 && luaW_type(L, StackIndex{1}) == LuaType::STRING; }());
399 411
400 // if the script runs, the stack should contain its return value 412 // if the script runs, the stack should contain its return value
401 REQUIRE([&L = _L]() { std::ignore = L.doString("return true"); return lua_gettop(L) == 1 && luaG_type(L, StackIndex{1}) == LuaType::BOOLEAN; }()); 413 REQUIRE([&L = _L]() { std::ignore = L.doString("return true"); return lua_gettop(L) == 1 && luaW_type(L, StackIndex{1}) == LuaType::BOOLEAN; }());
402 REQUIRE([&L = _L]() { std::ignore = L.doString("return 'hello'"); return lua_gettop(L) == 1 && luaG_tostring(L, StackIndex{1}) == "hello"; }()); 414 REQUIRE([&L = _L]() { std::ignore = L.doString("return 'hello'"); return lua_gettop(L) == 1 && luaW_tostring(L, StackIndex{1}) == "hello"; }());
403 // or nil if it didn't return anything 415 // or nil if it didn't return anything
404 REQUIRE([&L = _L]() { std::ignore = L.doString("return"); return lua_gettop(L) == 1 && luaG_type(L, StackIndex{1}) == LuaType::NIL; }()); 416 REQUIRE([&L = _L]() { std::ignore = L.doString("return"); return lua_gettop(L) == 1 && luaW_type(L, StackIndex{1}) == LuaType::NIL; }());
405 417
406 // on failure, doStringAndRet returns "", and the error message is on the stack 418 // on failure, doStringAndRet returns "", and the error message is on the stack
407 REQUIRE([&L = _L]() { return L.doStringAndRet("function end") == "" && lua_gettop(L) == 1 && luaG_type(L, StackIndex{ 1 }) == LuaType::STRING && luaG_tostring(L, StackIndex{ 1 }) != ""; }()); 419 REQUIRE([&L = _L]() { return L.doStringAndRet("function end") == "" && lua_gettop(L) == 1 && luaW_type(L, StackIndex{ 1 }) == LuaType::STRING && luaW_tostring(L, StackIndex{ 1 }) != ""; }());
408 // on success doStringAndRet returns the string returned by the script, that is also at the top of the stack 420 // on success doStringAndRet returns the string returned by the script, that is also at the top of the stack
409 REQUIRE([&L = _L]() { return L.doStringAndRet("return 'hello'") == "hello" && lua_gettop(L) == 1 && luaG_type(L, StackIndex{ 1 }) == LuaType::STRING && luaG_tostring(L, StackIndex{ 1 }) == "hello"; }()); 421 REQUIRE([&L = _L]() { return L.doStringAndRet("return 'hello'") == "hello" && lua_gettop(L) == 1 && luaW_type(L, StackIndex{ 1 }) == LuaType::STRING && luaW_tostring(L, StackIndex{ 1 }) == "hello"; }());
410 // if the returned value is not (convertible to) a string, we should get an empty string out of doStringAndRet 422 // if the returned value is not (convertible to) a string, we should get an empty string out of doStringAndRet
411 REQUIRE([&L = _L]() { return L.doStringAndRet("return function() end") == "" && lua_gettop(L) == 1 && luaG_type(L, StackIndex{ 1 }) == LuaType::FUNCTION && luaG_tostring(L, StackIndex{ 1 }) == ""; }()); 423 REQUIRE([&L = _L]() { return L.doStringAndRet("return function() end") == "" && lua_gettop(L) == 1 && luaW_type(L, StackIndex{ 1 }) == LuaType::FUNCTION && luaW_tostring(L, StackIndex{ 1 }) == ""; }());
412} 424}
413 425
414// ################################################################################################# 426// #################################################################################################
@@ -424,9 +436,9 @@ FileRunner::FileRunner(std::string_view const& where_)
424 // because the VS Test Explorer doesn't appreciate the text output of some scripts, so absorb them 436 // because the VS Test Explorer doesn't appreciate the text output of some scripts, so absorb them
425 if constexpr (1) { 437 if constexpr (1) {
426 auto const _nullprint = +[](lua_State* const L_) { return 0; }; 438 auto const _nullprint = +[](lua_State* const L_) { return 0; };
427 luaG_pushglobaltable(L); 439 luaW_pushglobaltable(L);
428 lua_pushcfunction(L, _nullprint); 440 lua_pushcfunction(L, _nullprint);
429 luaG_setfield(L, StackIndex{ -2 }, std::string_view{ "print" }); 441 luaW_setfield(L, StackIndex{ -2 }, std::string_view{ "print" });
430 lua_pop(L, 1); 442 lua_pop(L, 1);
431 stackCheck(0); 443 stackCheck(0);
432 } 444 }
@@ -448,16 +460,35 @@ FileRunner::FileRunner(std::string_view const& where_)
448 460
449void FileRunner::performTest(FileRunnerParam const& testParam_) 461void FileRunner::performTest(FileRunnerParam const& testParam_)
450{ 462{
463 static constexpr auto _atPanic = [](lua_State* const L_) {
464 throw std::logic_error("panic!");
465 return 0;
466 };
467
468#if LUA_VERSION_NUM >= 504 // // warnings are a Lua 5.4 feature
469 std::string _warnMessage;
470 static constexpr auto _onWarn = [](void* const opaque_, char const* const msg_, int const tocont_) {
471 std::string& _warnMessage = *static_cast<std::string*>(opaque_);
472 _warnMessage += msg_;
473 };
474#endif // LUA_VERSION_NUM
475
451 INFO(testParam_.script); 476 INFO(testParam_.script);
452 switch (testParam_.test) { 477 switch (testParam_.test) {
453 case TestType::AssertNoLuaError: 478 case TestType::AssertNoLuaError:
479 lua_atpanic(L, _atPanic);
454 requireSuccess(root, testParam_.script); 480 requireSuccess(root, testParam_.script);
455 break; 481 break;
456 case TestType::AssertNoThrow: 482
457 REQUIRE_NOTHROW((std::ignore = doFile(root, testParam_.script), close())); 483#if LUA_VERSION_NUM >= 504 // // warnings are a Lua 5.4 feature
458 break; 484 case TestType::AssertWarns:
459 case TestType::AssertThrows: 485 lua_atpanic(L, _atPanic);
460 REQUIRE_THROWS_AS((std::ignore = doFile(root, testParam_.script), close()), std::logic_error); 486 lua_setwarnf(L, _onWarn, &_warnMessage);
487 std::ignore = doFile(root, testParam_.script);
488 close();
489 WARN(_warnMessage);
490 REQUIRE(_warnMessage != std::string_view{});
461 break; 491 break;
492#endif // LUA_VERSION_NUM
462 } 493 }
463} 494}
diff --git a/unit_tests/shared.h b/unit_tests/shared.h
index 8a84a94..c6c3339 100644
--- a/unit_tests/shared.h
+++ b/unit_tests/shared.h
@@ -56,7 +56,7 @@ class LuaState
56 56
57 friend std::ostream& operator<<(std::ostream& os_, LuaState const& s_) 57 friend std::ostream& operator<<(std::ostream& os_, LuaState const& s_)
58 { 58 {
59 os_ << luaG_tostring(s_.L, kIdxTop); 59 os_ << luaW_tostring(s_.L, kIdxTop);
60 return os_; 60 return os_;
61 } 61 }
62}; 62};
@@ -66,8 +66,9 @@ class LuaState
66enum class [[nodiscard]] TestType 66enum class [[nodiscard]] TestType
67{ 67{
68 AssertNoLuaError, 68 AssertNoLuaError,
69 AssertNoThrow, 69#if LUA_VERSION_NUM >= 504 // warnings are a Lua 5.4 feature
70 AssertThrows, 70 AssertWarns,
71#endif // LUA_VERSION_NUM
71}; 72};
72 73
73struct FileRunnerParam 74struct FileRunnerParam