summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'cmd')
-rw-r--r--cmd/planr/main.go13
-rw-r--r--cmd/planr/sub/cli.go122
-rw-r--r--cmd/planr/sub/evaluate.go40
3 files changed, 144 insertions, 31 deletions
diff --git a/cmd/planr/main.go b/cmd/planr/main.go
index c65edb1..54c3d60 100644
--- a/cmd/planr/main.go
+++ b/cmd/planr/main.go
@@ -1,14 +1,16 @@
package main
import (
- "os"
- "io"
"fmt"
+ "io"
+ "log"
+ "os"
+
"golang.flu0r1ne.net/planr/cmd/planr/sub"
)
const (
- VERSION = "0.0.1"
+ VERSION = "0.0.2"
)
func printUsage(w io.Writer) {
@@ -26,6 +28,9 @@ func dieUsage() {
func main() {
+ log.SetFlags(log.Llongfile | log.Lmsgprefix)
+ log.SetPrefix("planr: ")
+
if len(os.Args) < 2 {
dieUsage()
}
@@ -38,7 +43,7 @@ func main() {
fmt.Printf("%s\n", VERSION)
case "build":
sub.Build(subargs)
- case "evaluate":
+ case "evaluate","eval":
sub.Evaluate(subargs)
case "help", "-h", "-help", "--help":
printUsage(os.Stdout)
diff --git a/cmd/planr/sub/cli.go b/cmd/planr/sub/cli.go
new file mode 100644
index 0000000..0e6a942
--- /dev/null
+++ b/cmd/planr/sub/cli.go
@@ -0,0 +1,122 @@
+package sub
+
+import (
+ "github.com/fatih/color"
+ "golang.flu0r1ne.net/planr"
+ "fmt"
+ "strings"
+)
+
+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)
+}
+
+const (
+ FENCE_WIDTH = 78
+)
+
+func pprintFenced(title, value string) {
+ wingWidth := FENCE_WIDTH - len(title) - 2
+ wing := strings.Repeat("-", wingWidth / 2)
+ fence := strings.Repeat("-", FENCE_WIDTH)
+
+ fmt.Printf(" %s %s %s\n", wing, title, wing)
+
+ fmt.Print(" " + strings.ReplaceAll(value, "\n", "\n "))
+
+ fmt.Println(fence)
+}
+
+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)
+
+ pprintLabeled("id", tc.Cname)
+
+ 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)
+ }
+
+ res := tc.Result
+
+ if res.Status == planr.COMPILATION_FAILURE {
+
+ if res.DebugOutput != "" {
+ fmt.Println()
+ pprintFenced("compilation output", tc.Result.DebugOutput);
+ } else {
+ fmt.Println("WARN: No debug output provided")
+ }
+
+ } else if res.Status == planr.RUNTIME_FAILURE {
+
+ if tc.Result.TestOutput != "" {
+ fmt.Println()
+ pprintFenced("test output", tc.Result.TestOutput);
+ }
+
+ }
+
+ 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));
+
+ percent := earned / points_total * 100
+
+ pprintLabeled("score", fmt.Sprintf(
+ "%.2f/%.2f ~= %.1f%%", earned, points_total, percent,
+ ));
+}
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,
+ );
}