diff --git a/test/buddy/TravisReporter.hx b/test/buddy/TravisReporter.hx index e070a6f..da52100 100644 --- a/test/buddy/TravisReporter.hx +++ b/test/buddy/TravisReporter.hx @@ -1,8 +1,12 @@ package buddy; import buddy.BuddySuite.Suite; +import buddy.BuddySuite.Spec; +import buddy.reporting.Reporter; import buddy.reporting.ConsoleReporter; import buddy.BuddySuite.TestStatus; +import promhx.Promise; +import promhx.Deferred; using Lambda; using StringTools; @@ -23,29 +27,121 @@ typedef Sys = Flash; * ... * @author deep */ -class TravisReporter extends ConsoleReporter +class TravisReporter implements Reporter { - override public function done(suites:Iterable) + #if php + var cli : Bool; + #end + + public function new() {} + + public function start() { - var res = super.done(suites); + #if php + cli = (untyped __call__("php_sapi_name")) == 'cli'; + if(!cli) Sys.println("
");
+        #end
         
-        function successSuite(s : Suite):Bool {
+        return resolveImmediately(true);
+    }
+    
+    public function progress(spec : Spec)
+    {
+        Sys.print(switch(spec.status) {
+            case TestStatus.Failed: "X";
+            case TestStatus.Passed: ".";
+            case TestStatus.Pending: "P";
+            case TestStatus.Unknown: "?";
+        });
+
+        return resolveImmediately(spec);
+    }
+    
+    public function done(suites:Iterable) 
+    {
+        Sys.println("");
+
+        var total = 0;
+        var failures = 0;
+        var pending = 0;
+
+        var countTests : Suite -> Void = null;
+        var printTests : Suite -> Int -> Void = null;
+
+        countTests = function(s : Suite) {
             for (sp in s.steps) switch sp {
-                case TSpec(sp) if (sp.status == TestStatus.Failed): return false;
-                case TSuite(s) if (!successSuite(s)): return false;
-                case _:
+                case TSpec(sp):
+                    total++;
+                    if (sp.status == TestStatus.Failed) failures++;
+                    else if (sp.status == TestStatus.Pending) pending++;
+                case TSuite(s):
+                    countTests(s);
             }
-            return true;
         };
-        var success = suites.foreach(successSuite);
+
+        suites.iter(countTests);
+
+        printTests = function(s : Suite, indentLevel : Int)
+        {
+            var print = function(str : String) Sys.println(str.lpad(" ", str.length + indentLevel * 2));
+
+            print(s.name);
+            for (step in s.steps) switch step
+            {
+                case TSpec(sp):
+                    if (sp.status == TestStatus.Failed)
+                    {
+                        print("  " + sp.description + " (FAILED: " + sp.error + ")");
+
+                        printTraces(sp);
+
+                        if (sp.stack == null || sp.stack.length == 0) continue;
+
+                        // Display the exception stack
+                        for (s in sp.stack) switch s {
+                            case FilePos(_, file, line) if (file.indexOf("buddy/internal/") != 0):
+                                print('    @ $file:$line');
+                            case _:
+                        }
+                    }
+                    else
+                    {
+                        print("  " + sp.description + " (" + sp.status + ")");
+                        printTraces(sp);
+                    }
+                case TSuite(s):
+                    printTests(s, indentLevel+1);
+            }
+        };
+
+        suites.iter(printTests.bind(_, 0));
+
+        Sys.println('$total specs, $failures failures, $pending pending');
+        Sys.println('success: ${failures <= 0}'); // #if travis 
         
-        Sys.println('success: ${success}');
-        
-        return res;
+        #if php
+		if(!cli) Sys.println("
"); + #end + + return resolveImmediately(suites); + } + + function printTraces(spec : Spec) + { + for (t in spec.traces) + Sys.println(" " + t); + } + + private function resolveImmediately(o : T) : Promise + { + var def = new Deferred(); + var pr = def.promise(); + def.resolve(o); + return pr; } } -#if js +#if js // && travis) class Js {