From 3337257fe24b67871406217e98862d34647dd725 Mon Sep 17 00:00:00 2001
From: Flu0r1ne <flur01ne@flu0r1ne.net>
Date: Fri, 13 Aug 2021 16:31:04 -0500
Subject: Add colorized output and build traces

---
 cmd/planr/sub/cli.go      | 89 +++++++++++++++++++++++++++++++++++++++++++++++
 cmd/planr/sub/evaluate.go | 40 +++++++--------------
 2 files changed, 102 insertions(+), 27 deletions(-)
 create mode 100644 cmd/planr/sub/cli.go

(limited to 'cmd/planr/sub')

diff --git a/cmd/planr/sub/cli.go b/cmd/planr/sub/cli.go
new file mode 100644
index 0000000..42d1c81
--- /dev/null
+++ b/cmd/planr/sub/cli.go
@@ -0,0 +1,89 @@
+package sub
+
+import (
+	"github.com/fatih/color"
+	"golang.flu0r1ne.net/planr"
+        "fmt"
+)
+
+var (
+  col_pass = color.New(color.FgGreen)
+  col_fail = color.New(color.FgRed)
+  col_title = color.New(color.FgHiWhite)
+  col_label = color.New(color.FgCyan)
+);
+
+func tcTitle(tc planr.TestCase) string {
+  title := tc.Cname
+
+  if tc.Config.Title != nil {
+    title = *tc.Config.Title
+  }
+
+  return title
+}
+
+func tcStatus(tc planr.TestCase) string {
+    status := "SILENT"
+
+    if tc.Result != nil {
+      if tc.Result.Status == planr.PASSING {
+        status = "PASS"
+      } else {
+        status = "FAIL"
+      }
+    }
+
+    return status
+}
+
+func pprintLabeled(label, value string) {
+  col_label.Printf("  %s: ", label)
+  fmt.Println(value)
+}
+
+func tcStatusLine(tc planr.TestCase) {
+  title  := tcTitle(tc)
+  status := tcStatus(tc)
+
+  if status == "PASS" {
+    col_pass.Printf("[%s] ", status);
+  } else {
+    col_fail.Printf("[%s] ", status);
+  }
+
+  col_title.Println(title);  
+}
+
+func tcPprint(tc planr.TestCase) {
+  tcStatusLine(tc)
+
+  if tc.Config.Points != nil {
+    points := fmt.Sprintf("%.1f", *tc.Config.Points)
+    pprintLabeled("points", points)
+  }
+
+  if tc.Config.Description != nil {
+    pprintLabeled("description", *tc.Config.Description)
+  }
+
+  if tc.Result.DebugOutput != "" {
+    pprintLabeled("debug output", tc.Result.DebugOutput)
+  }
+
+  if tc.Result.FailureMsg != "" {
+    pprintLabeled("failure", tc.Result.FailureMsg);
+  }
+
+  fmt.Println()
+}
+
+func printResults(passed, tc_total int, earned, points_total float64) {
+  col_title.Println("Final Results:")
+  
+  pprintLabeled("passed", fmt.Sprintf("%d/%d", passed, tc_total));
+
+  pprintLabeled("score", fmt.Sprintf(
+    "%.2f/%.2f ~= %.1f%%", earned, points_total, earned / points_total * 100,
+  ));
+}
diff --git a/cmd/planr/sub/evaluate.go b/cmd/planr/sub/evaluate.go
index 1174b3f..8ce4d81 100644
--- a/cmd/planr/sub/evaluate.go
+++ b/cmd/planr/sub/evaluate.go
@@ -1,7 +1,6 @@
 package sub
 
 import (
-  "fmt"
   "golang.flu0r1ne.net/planr"
 )
 
@@ -10,43 +9,30 @@ func Evaluate(params []string) {
 
   tcs := Runner().Evaluate(rd)
 
-  fmt.Printf("\n\nREPORT:\n=======\n\n")
-
   earned := 0.0
   total  := 0.0
+  passed := 0
   for _, tc := range tcs {
     cfg := tc.Config
-  
-    name := tc.Cname
-    if cfg.Title != nil {
-      name = *cfg.Title
-    }
 
-    var points float64 =  0.0
     if cfg.Points != nil {
-      points = float64(*cfg.Points)
-    }
+      points := float64(*cfg.Points)
+
+      total += points
 
-    status := "SILENT"
-    if tc.Result != nil {
-      if tc.Result.Pass {
-        status = "PASS"
+      if tc.Result.Status == planr.PASSING {
         earned += points
-      } else {
-        status = "FAIL"
+        passed++
       }
     }
 
-    total += points
-
-    fmt.Printf("[%s] %s (%f)\n", status, name, points)
-
-    if cfg.Description != nil {
-      fmt.Printf("> %s\n", *cfg.Description)
-    }
-
-    fmt.Println()
+    tcPprint(tc)
   }
 
-  fmt.Printf("Score: %f (%f%%)\n", earned, (earned / total) * 100)
+  printResults(
+    passed,
+    len(tcs),
+    earned,
+    total,
+  );
 }
-- 
cgit v1.2.3