summaryrefslogtreecommitdiff
path: root/Data/Libraries/Penlight/tests/test-utils3.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Data/Libraries/Penlight/tests/test-utils3.lua')
-rw-r--r--Data/Libraries/Penlight/tests/test-utils3.lua76
1 files changed, 76 insertions, 0 deletions
diff --git a/Data/Libraries/Penlight/tests/test-utils3.lua b/Data/Libraries/Penlight/tests/test-utils3.lua
new file mode 100644
index 0000000..a635de5
--- /dev/null
+++ b/Data/Libraries/Penlight/tests/test-utils3.lua
@@ -0,0 +1,76 @@
+--- testing Lua 5.1/5.2 compatibility functions
+-- these are global side-effects of pl.utils
+local utils = require 'pl.utils'
+local test = require 'pl.test'
+local asserteq = test.asserteq
+local _,lua = require 'pl.app'. lua()
+local setfenv,getfenv = utils.setfenv, utils.getfenv
+
+-- utils.execute is a compromise between 5.1 and 5.2 for os.execute changes
+-- can we call Lua ?
+local ok,code = utils.execute(lua..' -v')
+asserteq(ok,true)
+asserteq(code,0)
+-- does it return false when it fails ?
+asserteq(utils.execute('most-likely-nonexistent-command'),false)
+
+-- table.pack is defined for 5.1
+local t = table.pack(1,nil,'hello')
+asserteq(t.n,3)
+assert(t[1] == 1 and t[3] == 'hello')
+
+-- unpack is not globally available for 5.2 unless in compat mode.
+-- But utils.unpack is always defined.
+local a,b = utils.unpack{10,'wow'}
+assert(a == 10 and b == 'wow')
+
+-- utils.load() is Lua 5.2 style
+chunk = utils.load('return x+y','tmp','t',{x=1,y=2})
+asserteq(chunk(),3)
+
+-- can only load a binary chunk if the mode permits!
+local f = string.dump(function() end)
+local res,err = utils.load(f,'tmp','t')
+test.assertmatch(err,'attempt to load')
+
+-- package.searchpath for Lua 5.1
+-- nota bene: depends on ./?.lua being in the package.path!
+-- So we hack it if not found
+if not package.path:find '.[/\\]%?' then
+ package.path = './?.lua;'..package.path
+end
+
+asserteq(
+ package.searchpath('tests.test-utils3',package.path):gsub('\\','/'),
+ './tests/test-utils3.lua'
+)
+
+-- testing getfenv and setfenv for both interpreters
+
+function test()
+ return X + Y + Z
+end
+
+t = {X = 1, Y = 2, Z = 3}
+
+setfenv(test,t)
+
+assert(test(),6)
+
+t.X = 10
+
+assert(test(),15)
+
+local getfenv,_G = getfenv,_G
+
+function test2()
+ local env = {x=2}
+ setfenv(1,env)
+ asserteq(getfenv(1),env)
+ asserteq(x,2)
+end
+
+test2()
+
+
+