55io.stdout :setvbuf (" no" )
66io.stderr :setvbuf (" no" )
77
8+ local ppChunk = assert (loadfile " preprocess.lua" )
89local results = {}
910
1011local function doTest (description , f , ...)
5960addLabel (" Preprocessor code" )
6061
6162doTest (" Inline block with simple expression" , function ()
62- local pp = assert ( loadfile " preprocess.lua " ) ()
63+ local pp = ppChunk ()
6364 local luaIn = [[
6465 local x = !(1+2*3)
6566 ]]
@@ -69,7 +70,7 @@ doTest("Inline block with simple expression", function()
6970end )
7071
7172doTest (" Static branch" , function ()
72- local pp = assert ( loadfile " preprocess.lua " ) ()
73+ local pp = ppChunk ()
7374 local luaIn = [[
7475 !if FLAG then
7576 print("Yes")
@@ -88,7 +89,7 @@ doTest("Static branch", function()
8889end )
8990
9091doTest (" Output value from metaprogram" , function ()
91- local pp = assert ( loadfile " preprocess.lua " ) ()
92+ local pp = ppChunk ()
9293 local luaIn = [[
9394 !local t = {
9495 z = 99,
@@ -103,7 +104,7 @@ doTest("Output value from metaprogram", function()
103104end )
104105
105106doTest (" Generate code" , function ()
106- local pp = assert ( loadfile " preprocess.lua " ) ()
107+ local pp = ppChunk ()
107108 local luaIn = [[
108109 !(
109110 outputLua("local s = ")
@@ -116,7 +117,7 @@ doTest("Generate code", function()
116117end )
117118
118119doTest (" Parsing extended preprocessor line" , function ()
119- local pp = assert ( loadfile " preprocess.lua " ) ()
120+ local pp = ppChunk ()
120121 local luaIn = [[
121122 !local str = "foo\
122123 "; local arr = {
@@ -136,7 +137,7 @@ doTest("Parsing extended preprocessor line", function()
136137end )
137138
138139doTest (" Dual code" , function ()
139- local pp = assert ( loadfile " preprocess.lua " ) ()
140+ local pp = ppChunk ()
140141
141142 local luaOut = assert (pp .processString { code = [[
142143 !local one = 1
@@ -152,7 +153,7 @@ doTest("Dual code", function()
152153end )
153154
154155doTest (" Expression or not?" , function ()
155- local pp = assert ( loadfile " preprocess.lua " ) ()
156+ local pp = ppChunk ()
156157
157158 local luaOut = assert (pp .processString { code = [[
158159 foo(!( math.floor(1.5) ))
@@ -171,7 +172,7 @@ doTest("Expression or not?", function()
171172end )
172173
173174doTest (" Output values of different types" , function ()
174- local pp = assert ( loadfile " preprocess.lua " ) ()
175+ local pp = ppChunk ()
175176
176177 -- Valid: Numbers, strings, tables, booleans, nil.
177178
@@ -195,7 +196,7 @@ doTest("Output values of different types", function()
195196end )
196197
197198doTest (" Preprocessor keywords" , function ()
198- local pp = assert ( loadfile " preprocess.lua " ) ()
199+ local pp = ppChunk ()
199200
200201 local luaOut = assert (pp .processString { code = [[ filename = @file ]] })
201202 assertCodeOutput (luaOut , [[ filename = "<code>"]] ) -- Note: The dummy value when we have no real path may change in the future.
@@ -207,68 +208,133 @@ doTest("Preprocessor keywords", function()
207208 assertCodeOutput (luaOut , [[ lnStr = "<code>".. 1 .. 1 .."<code>"]] )
208209
209210 local luaOut = assert (pp .processString {
210- code = [[
211- v = @insert "foo"
212- ]] ,
213- onInsert = function (name )
214- return ' "bar"'
215- end ,
211+ code = [[ v = @insert "foo" ]] ,
212+ onInsert = function (name ) return name end ,
216213 })
217- assertCodeOutput (luaOut , [[ v = "bar"]] )
214+ assertCodeOutput (luaOut , [[ v = foo]] )
215+
216+ local luaOut = assert (pp .processString {
217+ code = [[ v = @@"foo" ]] ,
218+ onInsert = function (name ) return name end ,
219+ })
220+ assertCodeOutput (luaOut , [[ v = foo]] )
221+
222+ -- Invalid: Bad keyword.
223+ assert (not pp .processString { code = [[ @bad ]] })
224+
225+ -- Invalid: Bad insert value.
226+ assert (not pp .processString { code = [[ @insert 1 ]] })
227+ assert (not pp .processString { code = [[ @insert {} ]] })
228+ assert (not pp .processString { code = [[ @insert (1) ]] })
229+ assert (not pp .processString { code = [[ @insert nil ]] })
230+ end )
231+
232+ doTest (" Macros" , function ()
233+ local pp = ppChunk ()
218234
219235 local luaOut = assert (pp .processString { code = [[
220- !function join (ident1, ident2) return ident1..ident2 end
221- v = @insert join (foo, bar)
236+ !function JOIN (ident1, ident2) return ident1..ident2 end
237+ v = @insert JOIN (foo, bar)
222238 ]] })
223239 assertCodeOutput (luaOut , [[ v = foobar]] )
224240
225241 local luaOut = assert (pp .processString { code = [[
226- !function echo(v) return v end
227- s = @insert echo""
242+ !function JOIN(ident1, ident2) return ident1..ident2 end
243+ v = @@JOIN(foo, bar)
244+ ]] })
245+ assertCodeOutput (luaOut , [[ v = foobar]] )
246+
247+ -- Macro variants.
248+ local luaOut = assert (pp .processString { code = [[
249+ !function ECHO(v) return v end
250+ s = @@ECHO""
228251 ]] })
229252 assertCodeOutput (luaOut , [[ s = ""]] )
230253
231254 local luaOut = assert (pp .processString { backtickStrings = true , code = [[
232- !function echo (v) return v end
233- s = @insert echo ``
255+ !function ECHO (v) return v end
256+ s = @@ECHO ``
234257 ]] })
235258 assertCodeOutput (luaOut , [[ s = ""]] )
236259
237260 local luaOut = assert (pp .processString { code = [[
238- !function echo (v) return v end
239- t = @insert echo {}
261+ !function ECHO (v) return v end
262+ t = @@ECHO {}
240263 ]] })
241264 assertCodeOutput (luaOut , [[ t = {}]] )
242265
266+ -- Function as an argument.
243267 local luaOut = assert (pp .processString { code = [[
244- !function echo (v) return v end
245- f = @insert echo (function() return a,b end)
268+ !function ECHO (v) return v end
269+ f = @@ECHO (function() return a,b end)
246270 ]] })
247271 assertCodeOutput (luaOut , [[ f = function() return a,b end]] )
248272
249273 local luaOut = assert (pp .processString { backtickStrings = true , code = [[
250- !function echo (v) return v end
251- f = @insert echo (function() return a,`b` end)
274+ !function ECHO (v) return v end
275+ f = @@ECHO (function() return a,`b` end)
252276 ]] })
253277 assertCodeOutput (luaOut , [[ f = function() return a,"b" end]] )
254278
255- -- Invalid: Bad keyword.
256- assert (not pp .processString { code = [[ @bad ]] })
279+ -- Nested macros.
280+ local luaOut = assert (pp .processString { code = [[
281+ !function DOUBLE(ident) return ident.."_"..ident end
282+ v = @@DOUBLE(@@DOUBLE(@@DOUBLE(woof)))
283+ ]] })
284+ assertCodeOutput (luaOut , [[ v = woof_woof_woof_woof_woof_woof_woof_woof]] )
285+
286+ -- Code blocks in macros.
287+ assertCodeOutput (assert (pp .processString { code = [[ !(function ECHO(v) return v end) n = @@ECHO( !( 1 ) ) ]] }), [[ n = 1]] )
288+ assertCodeOutput (assert (pp .processString { code = [[ !(function ECHO(v) return v end) n = @@ECHO( !!("1") ) ]] }), [[ n = 1]] )
289+ assertCodeOutput (assert (pp .processString { code = [[ !(function ECHO(v) return v end) n = @@ECHO{ !( 1 ) } ]] }), [[ n = { 1 }]] )
290+ assertCodeOutput (assert (pp .processString { code = [[ !(function ECHO(v) return v end) n = @@ECHO{ !!("1") } ]] }), [[ n = { 1 }]] )
291+ assertCodeOutput (assert (pp .processString { code = [[ !(function ECHO(v) return v end) n = @@ECHO( !( 1 ) + 2 ) ]] }), [[ n = 1 + 2]] )
292+ assertCodeOutput (assert (pp .processString { code = [[ !(function ECHO(v) return v end) n = @@ECHO( !!("1") + 2 ) ]] }), [[ n = 1 + 2]] )
293+ assertCodeOutput (assert (pp .processString { code = [[ !(function ECHO(v) return v end) n = @@ECHO{ !( 1 ) + 2 } ]] }), [[ n = { 1 + 2 }]] )
294+ assertCodeOutput (assert (pp .processString { code = [[ !(function ECHO(v) return v end) n = @@ECHO{ !!("1") + 2 } ]] }), [[ n = { 1 + 2 }]] )
295+ assertCodeOutput (assert (pp .processString { code = [[ !(function ECHO(v) return v end) n = @@ECHO( 1 + !( 2 ) ) ]] }), [[ n = 1 + 2]] )
296+ assertCodeOutput (assert (pp .processString { code = [[ !(function ECHO(v) return v end) n = @@ECHO( 1 + !!("2") ) ]] }), [[ n = 1 + 2]] )
297+ assertCodeOutput (assert (pp .processString { code = [[ !(function ECHO(v) return v end) n = @@ECHO{ 1 + !( 2 ) } ]] }), [[ n = { 1 + 2 }]] )
298+ assertCodeOutput (assert (pp .processString { code = [[ !(function ECHO(v) return v end) n = @@ECHO{ 1 + !!("2") } ]] }), [[ n = { 1 + 2 }]] )
299+ assertCodeOutput (assert (pp .processString { code = [[ !(function ECHO(v) return v end) n = @@ECHO( 1 + !( 2 ) + 3 ) ]] }), [[ n = 1 + 2 + 3]] )
300+ assertCodeOutput (assert (pp .processString { code = [[ !(function ECHO(v) return v end) n = @@ECHO( 1 + !!("2") + 3 ) ]] }), [[ n = 1 + 2 + 3]] )
301+ assertCodeOutput (assert (pp .processString { code = [[ !(function ECHO(v) return v end) n = @@ECHO{ 1 + !( 2 ) + 3 } ]] }), [[ n = { 1 + 2 + 3 }]] )
302+ assertCodeOutput (assert (pp .processString { code = [[ !(function ECHO(v) return v end) n = @@ECHO{ 1 + !!("2") + 3 } ]] }), [[ n = { 1 + 2 + 3 }]] )
303+ assertCodeOutput (assert (pp .processString { code = [[ !(function ECHO(v) return v end) n = @@ECHO( !!("1")!!("+")!!("2") ) ]] }), [[ n = 1+2]] )
304+ assertCodeOutput (assert (pp .processString { code = [[ !(function ECHO(v) return v end) n = @@ECHO{ !!("1")!!("+")!!("2") } ]] }), [[ n = { 1+2 }]] )
257305
258306 -- Invalid: Ambiguous syntax.
259307 assert (not pp .processString { code = [[
260- !function void () return "" end
261- v = @insert void
262- ()
308+ !function VOID () return "" end
309+ v = @@VOID
310+ () 1
263311 ]] })
312+
313+ -- Invalid: Bad macro arguments format.
314+ assert (not pp .processString { code = [[ @insert type[] ]] })
315+ assert (not pp .processString { code = [[ @insert type + 1 ]] })
316+
317+ -- Invalid: Non-expression code block in macro.
318+ assert (not pp .processString { code = [[ !(function ECHO(v) return v end) v = @@ECHO(!(do end)) ]] })
319+ assert (not pp .processString { code = [[ !(function ECHO(v) return v end) v = @@ECHO{!(do end)} ]] })
320+ assert (not pp .processString { code = [[ !(function ECHO(v) return v end) v = @@ECHO(!( )) ]] })
321+ assert (not pp .processString { code = [[ !(function ECHO(v) return v end) v = @@ECHO{!( )} ]] })
322+ assert (not pp .processString { code = [[ !(function ECHO(v) return v end) v = @@ECHO(!!( )) ]] })
323+ assert (not pp .processString { code = [[ !(function ECHO(v) return v end) v = @@ECHO{!!( )} ]] })
324+
325+ -- Invalid: Invalid value from code block in macro.
326+ assert (not pp .processString { code = [[ !(function ECHO(v) return v end) v = @@ECHO(!!(1)) ]] })
327+
328+ -- Invalid: Nested code block in macro.
329+ assert (not pp .processString { code = [[ !(function ECHO(v) return v end) v = @@ECHO( !!( !(1) ) ) ]] })
264330end )
265331
266332
267333
268334addLabel (" Library API" )
269335
270336doTest (" Get useful tokens" , function ()
271- local pp = assert ( loadfile " preprocess.lua " ) ()
337+ local pp = ppChunk ()
272338 local tokens = pp .tokenize [[ local x = 5 -- Foo!]]
273339
274340 pp .removeUselessTokens (tokens )
@@ -285,7 +351,7 @@ doTest("Get useful tokens", function()
285351end )
286352
287353doTest (" Serialize" , function ()
288- local pp = assert ( loadfile " preprocess.lua " ) ()
354+ local pp = ppChunk ()
289355
290356 local t = {
291357 z = 99 ,
0 commit comments