File: fixtures.lua

package info (click to toggle)
lua-busted 2.3.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 820 kB
  • sloc: sh: 198; makefile: 2
file content (83 lines) | stat: -rw-r--r-- 2,743 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
local pl_path = require 'pl.path'
local pl_utils = require 'pl.utils'

local fixtures = {}

-- returns an absolute path to where the current test file is located.
-- @param sub_path [optional] a relative path to, to be appended
-- @return returns the (normalized) absolute path
function fixtures.path(sub_path)
  if type(sub_path) ~= "string" and type(sub_path) ~= "nil" then
    error("bad argument to 'path' expected a string (relative filename) or nil, got: " .. type(sub_path), 2)
  end

  local info = debug.getinfo(1)
  local myname = info.source -- path to this code file

  local path
  local level = 1
  repeat
    -- other functions in this module call this one as well, so traverse up the
    -- stack until we find the first call from outside this module, that's
    -- the file to use as a baseline for our relative search
    level = level + 1
    info = debug.getinfo(level)
    path = info.source
  until path ~= myname

  if path:sub(1,1) == "@" then
    path = path:sub(2, -1)
  end
  path = pl_path.abspath(path) -- based on PWD
  path = pl_path.splitpath(path) -- drop filename, keep path only
  path = pl_path.join(path, sub_path)
  return pl_path.normpath(path, sub_path)
end


-- reads a file relative from the current test file.
-- @param rel_path (string) the relative path to the file
-- @param is_bin (boolean) whether to load the file as a binary file
-- @return returns the file contents or errors on failure
function fixtures.read(rel_path, is_bin)
  if type(rel_path) ~= "string" then
    error("bad argument to 'read' expected a string (relative filename), got: " .. type(rel_path), 2)
  end

  local fname = fixtures.path(rel_path)

  local contents, err = pl_utils.readfile(fname, is_bin)
  if not contents then
    error(("Error reading file '%s': %s"):format(tostring(fname), tostring(err)), 2)
  end

  return contents
end


-- loads (and executes) a Lua-file relative from the current test file.
-- @param rel_path (string) the relative path to the file
-- @return returns the results of the executed file (similar to a module)
function fixtures.load(rel_path)
  if type(rel_path) ~= "string" then
    error("bad argument to 'load' expected a string (relative filename), got: " .. type(rel_path), 2)
  end
  local extension = "lua"
  if not rel_path:match("%."..extension.."$") then
    rel_path = rel_path .. "." .. extension
  end
  local code, err = fixtures.read(rel_path)
  if not code then
    error(("Error loading file '%s': %s"):format(tostring(rel_path), tostring(err)), 2)
  end

  local func, err = (loadstring or load)(code, rel_path)
  if not func then
    error(("Error loading code from '%s': %s"):format(tostring(rel_path), tostring(err)), 2)
  end

  return func()
end


return fixtures