commit 87a79ecb14a0aecf597cc6804f31feec8ee756a0
parent 37a617f5f2faa5dc934567a3124739da93711614
Author: Richard Ipsum <richardipsum@vx21.xyz>
Date:   Sat, 30 Nov 2019 04:12:28 +0000
Improve progress reporting and test summary
Diffstat:
| M | tyarn.c | | | 2 | +- | 
| M | tyarn.in | | | 69 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- | 
2 files changed, 61 insertions(+), 10 deletions(-)
diff --git a/tyarn.c b/tyarn.c
@@ -472,7 +472,7 @@ static int tyarn_parse_args(lua_State *L)
     lua_setfield(L, -2, "help");
     lua_pushstring(L, tmpdir);
     lua_setfield(L, -2, "tmpdir");
-    lua_pushinteger(L, verbose);
+    lua_pushboolean(L, verbose);
     lua_setfield(L, -2, "verbose");
     lua_pushstring(L, shell);
     lua_setfield(L, -2, "shell");
diff --git a/tyarn.in b/tyarn.in
@@ -391,10 +391,35 @@ function fs_quote(s)
     return s:gsub("[ /'\"()]", "_"):lower()
 end
 
+local maxline = 0
+
+function write_progress(s)
+    local ws = ''
+
+    if parsed_args["verbose"] or parsed_args["debug"] or DEBUG then
+        print(s)
+        return
+    end
+
+    if string.len(s) > maxline then
+        maxline = string.len(s)
+    end
+
+    io.stderr:write(s .. string.rep(' ', maxline - string.len(s)) .. '\r')
+end
+
+function write_progress_final(s)
+    write_progress(s)
+    if parsed_args["verbose"] or parsed_args["debug"] or DEBUG then
+        return
+    end
+    print('')
+end
+
 function run_scenario(scenarios, implementations, scenario_key, shell_lib_path)
-    print('Running', scenario_key)
-    scenario = scenarios[scenario_key]
-    tmpdir = nil
+    local scenario = scenarios[scenario_key]
+    local tmpdir = nil
+    local failed_step = nil
 
     debug('parsed_args["tmpdir"]', parsed_args["tmpdir"])
 
@@ -446,7 +471,7 @@ function run_scenario(scenarios, implementations, scenario_key, shell_lib_path)
 
     scenario_passed = true
     for n, step in ipairs(scenario) do
-        if parsed_args['verbose'] > 0 then
+        if parsed_args['verbose'] then
             print('Running step', step)
         end
         success, skip_scenario = run_step(scenario_dir, datadir, implementations,
@@ -454,6 +479,7 @@ function run_scenario(scenarios, implementations, scenario_key, shell_lib_path)
 
         if not success then
             scenario_passed = false
+            failed_step = step
             break
         end
 
@@ -478,7 +504,7 @@ function run_scenario(scenarios, implementations, scenario_key, shell_lib_path)
     end
 
 
-    return scenario_passed
+    return scenario_passed, failed_step
 end
 
 parsed_args, parsed_env = tyarn.parse_args(arg)
@@ -509,6 +535,8 @@ scenario_list, scenarios = parse_scenarios(parsed_args[1])
 
 implementations = {}
 seen = {}
+failed = {}
+nfailed = 0
 
 for i = 2, #parsed_args do
     parse_implementations(parsed_args[i], implementations)
@@ -523,11 +551,18 @@ for _, scenario_name in ipairs(scenario_list) do
     seen[scenario_name] = true
 end
 
-for _, scenario_name in ipairs(scenario_list) do
-    passed = run_scenario(scenarios, implementations, scenario_name, parsed_args['shell_lib'])
+for n, scenario_name in ipairs(scenario_list) do
+    write_progress(string.format("%d/%d: %s", n, #scenario_list, scenario_name))
+    passed, failed_step = run_scenario(scenarios, implementations, scenario_name, parsed_args['shell_lib'])
 
-    if not passed and parsed_args["exit_early"] then
-        os.exit(1)
+    if not passed then
+        if parsed_args["exit_early"] then
+            print(string.format("%d/%d: %s: FAILED", n, #scenario_list, scenario_name))
+            os.exit(1)
+        end
+
+        failed[scenario_name] = failed_step
+        nfailed = nfailed + 1
     end
 
     seen_scenario = true
@@ -537,3 +572,19 @@ if not seen_scenario then
     io.stderr:write("No scenarios\n")
     os.exit(1)
 end
+
+if nfailed > 0 then
+    write_progress_final("Failed scenarios:")
+    for scenario, step in pairs(failed) do
+        print(string.format("    - %s", scenario))
+    end
+    if nfailed > 1 then
+        print(string.format("ERROR: Test suite FAILED in %d scenarios", nfailed))
+    else
+        print(string.format("ERROR: Test suite FAILED in %d scenario", nfailed))
+    end
+    os.exit(1)
+end
+
+write_progress_final('Scenario test suite PASS')
+os.exit(0)