File Coverage

inc/Marpa/R3/Lua/Test/Builder.pm
Criterion Covered Total %
statement 11 11 100.0
branch n/a
condition n/a
subroutine 4 4 100.0
pod n/a
total 15 15 100.0


line stmt bran cond sub pod time code
1              
2             # This file was autogenerated by inc/Marpa/R3/Lua/Test/Builder.PL
3             # IF YOU EDIT THIS FILE, YOUR CHANGES WILL BE LOST
4             # This is not a source file. For license information,
5             # consult the source files.
6              
7              
8             package Marpa::R3::Lua::Test::Builder;
9              
10 1     1   20 use 5.010001;
  1         5  
11 1     1   7 use warnings;
  1         3  
  1         40  
12 1     1   9 use strict;
  1         3  
  1         48  
13              
14 1     1   7 use vars qw($VERSION $STRING_VERSION);
  1         3  
  1         280  
15             $VERSION = '4.001_024';
16             $STRING_VERSION = $VERSION;
17             $VERSION = eval $VERSION;
18              
19             $Marpa::R3::Lua::Test::Builder::loader = <<'END_OF_LUA';
20              
21             --
22             -- lua-TestMore :
23             --
24              
25             local debug = require 'debug'
26             local io = require 'io'
27             local os = require 'os'
28             local error = error
29             local gsub = require 'string'.gsub
30             local match = require 'string'.match
31             local pairs = pairs
32             local pcall = pcall
33             local print = print
34             local rawget = rawget
35             local setmetatable = setmetatable
36             local tconcat = require 'table'.concat
37             local tonumber = tonumber
38             local tostring = tostring
39             local type = type
40              
41             _ENV = nil
42             local m = {}
43              
44             local testout = io and io.stdout
45             local testerr = io and (io.stderr or io.stdout)
46              
47             function m.puts (f, str)
48             f:write(str)
49             end
50              
51             local function _print_to_fh (self, f, ...)
52             if f then
53             local msg = tconcat({...})
54             gsub(msg, "\n", "\n" .. self.indent)
55             m.puts(f, self.indent .. msg .. "\n")
56             else
57             print(self.indent, ...)
58             end
59             end
60              
61             local function _print (self, ...)
62             _print_to_fh(self, self:output(), ...)
63             end
64              
65             local function print_comment (self, f, ...)
66             local arg = {...}
67             for k, v in pairs(arg) do
68             arg[k] = tostring(v)
69             end
70             local msg = tconcat(arg)
71             msg = gsub(msg, "\n", "\n# ")
72             msg = gsub(msg, "\n# \n", "\n#\n")
73             msg = gsub(msg, "\n# $", '')
74             _print_to_fh(self, f, "# ", msg)
75             end
76              
77             function m.create ()
78             local o = {
79             data = setmetatable({}, { __index = m }),
80             }
81             setmetatable(o, {
82             __index = function (t, k)
83             return rawget(t, 'data')[k]
84             end,
85             __newindex = function (t, k, v)
86             rawget(t, 'data')[k] = v
87             end,
88             })
89             o:reset()
90             return o
91             end
92              
93             local test
94             function m.new ()
95             test = test or m.create()
96             return test
97             end
98              
99             local function in_todo (self)
100             return self.todo_upto >= self.curr_test
101             end
102              
103             function m:child (name)
104             if self.child_name then
105             error("You already have a child named (" .. self.child_name .. " running")
106             end
107             local child = m.create()
108             child.indent = self.indent .. ' '
109             child.out_file = self.out_file
110             child.fail_file = in_todo(self) and self.todo_file or self.fail_file
111             child.todo_file = self.todo_file
112             child.parent = self
113             self.child_name = name
114             return child
115             end
116              
117             local function plan_handled (self)
118             return self.have_plan or self.no_plan or self._skip_all
119             end
120              
121             function m:subtest (name, func)
122             if type(func) ~= 'function' then
123             error("subtest()'s second argument must be a function")
124             end
125             self:diag('Subtest: ' .. name)
126             local child = self:child(name)
127             local parent = self.data
128             self.data = child.data
129             local r, msg = pcall(func)
130             child.data = self.data
131             self.data = parent
132             if not r and not child._skip_all then
133             error(msg, 0)
134             end
135             if not plan_handled(child) then
136             child:done_testing()
137             end
138             child:finalize()
139             end
140              
141             function m:finalize ()
142             if not self.parent then
143             return
144             end
145             if self.child_name then
146             error("Can't call finalize() with child (" .. self.child_name .. " active")
147             end
148             local parent = self.parent
149             local name = parent.child_name
150             parent.child_name = nil
151             if self._skip_all then
152             parent:skip(self._skip_all)
153             elseif self.curr_test == 0 then
154             parent:ok(false, "No tests run for subtest \"" .. name .. "\"", 2)
155             else
156             parent:ok(self.is_passing, name, 2)
157             end
158             self.parent = nil
159             end
160              
161             function m:reset ()
162             self.curr_test = 0
163             self._done_testing = false
164             self.expected_tests = 0
165             self.is_passing = true
166             self.todo_upto = -1
167             self.todo_reason = nil
168             self.have_plan = false
169             self.no_plan = false
170             self._skip_all = false
171             self.have_output_plan = false
172             self.indent = ''
173             self.parent = false
174             self.child_name = false
175             self:reset_outputs()
176             end
177              
178             local function _output_plan (self, max, directive, reason)
179             if self.have_output_plan then
180             error("The plan was already output")
181             end
182             local out = "1.." .. tostring(max)
183             if directive then
184             out = out .. " # " .. directive
185             end
186             if reason then
187             out = out .. " " .. reason
188             end
189             _print(self, out)
190             self.have_output_plan = true
191             end
192              
193             function m:plan (arg)
194             if self.have_plan then
195             error("You tried to plan twice")
196             end
197             if type(arg) == 'string' and arg == 'no_plan' then
198             self.have_plan = true
199             self.no_plan = true
200             return true
201             elseif type(arg) ~= 'number' then
202             error("Need a number of tests")
203             elseif arg < 0 then
204             error("Number of tests must be a positive integer. You gave it '" .. tostring(arg) .."'.")
205             else
206             self.expected_tests = arg
207             self.have_plan = true
208             _output_plan(self, arg)
209             return arg
210             end
211             end
212              
213             function m:done_testing (num_tests)
214             if num_tests then
215             self.no_plan = false
216             end
217             num_tests = num_tests or self.curr_test
218             if self._done_testing then
219             self:ok(false, "done_testing() was already called")
220             return
221             end
222             self._done_testing = true
223             if self.expected_tests > 0 and num_tests ~= self.expected_tests then
224             self:ok(false, "planned to run " .. self.expected_tests
225             .. " but done_testing() expects " .. num_tests)
226             else
227             self.expected_tests = num_tests
228             end
229             if not self.have_output_plan then
230             _output_plan(self, num_tests)
231             end
232             self.have_plan = true
233             -- The wrong number of tests were run
234             if self.expected_tests ~= self.curr_test then
235             self.is_passing = false
236             end
237             -- No tests were run
238             if self.curr_test == 0 then
239             self.is_passing = false
240             end
241             end
242              
243             function m:has_plan ()
244             if self.expected_tests > 0 then
245             return self.expected_tests
246             end
247             if self.no_plan then
248             return 'no_plan'
249             end
250             return nil
251             end
252              
253             function m:skip_all (reason)
254             if self.have_plan then
255             error("You tried to plan twice")
256             end
257             self._skip_all = reason
258             _output_plan(self, 0, 'SKIP', reason)
259             if self.parent then
260             error("skip_all in child", 0)
261             end
262             os.exit(0)
263             end
264              
265             local function _check_is_passing_plan (self)
266             local plan = self:has_plan()
267             if not plan or not tonumber(plan) then
268             return
269             end
270             if plan < self.curr_test then
271             self.is_passing = false
272             end
273             end
274              
275             function m:ok (test, name, level)
276             if self.child_name then
277             name = name or 'unnamed test'
278             self.is_passing = false
279             error("Cannot run test (" .. name .. ") with active children")
280             end
281             name = name or ''
282             level = level or 0
283             self.curr_test = self.curr_test + 1
284             name = tostring(name)
285             if match(name, '^[%d%s]+$') then
286             self:diag(" You named your test '" .. name .."'. You shouldn't use numbers for your test names."
287             .. "\n Very confusing.")
288             end
289             local out = ''
290             if not test then
291             out = "not "
292             end
293             out = out .. "ok " .. tostring(self.curr_test)
294             if name ~= '' then
295             out = out .. " - " .. name
296             end
297             if self.todo_reason and in_todo(self) then
298             out = out .. " # TODO " .. self.todo_reason
299             end
300             _print(self, out)
301             if not test then
302             local msg = in_todo(self) and "Failed (TODO)" or "Failed"
303             local info = debug and debug.getinfo(3 + level)
304             if info then
305             local file = info.short_src
306             local line = info.currentline
307             self:diag(" " .. msg .. " test (" .. file .. " at line " .. tostring(line) .. ")")
308             else
309             self:diag(" " .. msg .. " test")
310             end
311             end
312             if not test and not in_todo(self) then
313             self.is_passing = false
314             end
315             _check_is_passing_plan(self)
316             end
317              
318             function m:BAIL_OUT (reason)
319             local out = "Bail out!"
320             if reason then
321             out = out .. " " .. reason
322             end
323             _print(self, out)
324             os.exit(255)
325             end
326              
327             function m:current_test (num)
328             if num then
329             self.curr_test = num
330             end
331             return self.curr_test
332             end
333              
334             function m:todo (reason, count)
335             count = count or 1
336             self.todo_upto = self.curr_test + count
337             self.todo_reason = reason
338             end
339              
340             function m:skip (reason)
341             local name = "# skip"
342             if reason then
343             name = name .. " " .. reason
344             end
345             self:ok(true, name, 1)
346             end
347              
348             function m:todo_skip (reason)
349             local name = "# TODO & SKIP"
350             if reason then
351             name = name .. " " .. reason
352             end
353             self:ok(false, name, 1)
354             end
355              
356             function m:skip_rest (reason)
357             for _ = self.curr_test + 1, self.expected_tests do
358             self:skip(reason)
359             end
360             end
361              
362             local function diag_file (self)
363             if in_todo(self) then
364             return self:todo_output()
365             else
366             return self:failure_output()
367             end
368             end
369              
370             function m:diag (...)
371             print_comment(self, diag_file(self), ...)
372             end
373              
374             function m:note (...)
375             print_comment(self, self:output(), ...)
376             end
377              
378             function m:output (f)
379             if f then
380             self.out_file = f
381             end
382             return self.out_file
383             end
384              
385             function m:failure_output (f)
386             if f then
387             self.fail_file = f
388             end
389             return self.fail_file
390             end
391              
392             function m:todo_output (f)
393             if f then
394             self.todo_file = f
395             end
396             return self.todo_file
397             end
398              
399             function m:reset_outputs ()
400             self:output(testout)
401             self:failure_output(testerr)
402             self:todo_output(testout)
403             end
404              
405             return m
406             --
407             -- Copyright (c) 2009-2015 Francois Perrad
408             --
409             -- This library is licensed under the terms of the MIT/X11 license,
410             -- like Lua itself.
411             --
412             END_OF_LUA
413              
414             1;