diff --git a/internal/runner/runner.go b/internal/runner/runner.go index f24adcf..625ff26 100644 --- a/internal/runner/runner.go +++ b/internal/runner/runner.go @@ -5,6 +5,7 @@ import ( "encoding/json" "errors" "fmt" + "io" "log/slog" "strings" "time" @@ -312,6 +313,25 @@ func Run(ctx context.Context, options Options) (Summary, error) { return summary, nil } +// RenderSummary writes the human-facing run summary: step count, each violation +// record, and any unsupported verbs. The wall-clock duration is excluded so the +// output is deterministic and snapshot-testable; the CLI prints it separately. +func RenderSummary(w io.Writer, summary Summary, platform string) { + fmt.Fprintf(w, "\nrun complete: %d steps\n", summary.Steps) + if len(summary.Violations) == 0 { + fmt.Fprintln(w, "no violations.") + } else { + fmt.Fprintf(w, "%d violation record(s):\n", len(summary.Violations)) + for _, violation := range summary.Violations { + fmt.Fprintf(w, " step %d: %v\n", violation.StepIndex, violation.Properties) + } + } + if len(summary.UnsupportedVerbs) > 0 { + fmt.Fprintf(w, "unsupported on %s: %s\n", + platform, strings.Join(summary.UnsupportedVerbs, ", ")) + } +} + func validate(options Options) error { if options.Driver == nil { return errors.New("runner: Driver is required") diff --git a/internal/testrun/testrun.go b/internal/testrun/testrun.go index 37c1b00..f2c26f8 100644 --- a/internal/testrun/testrun.go +++ b/internal/testrun/testrun.go @@ -7,7 +7,6 @@ import ( "os" "path/filepath" "strconv" - "strings" "time" "github.com/priyanshujain/sanderling/internal/android" @@ -166,19 +165,8 @@ func Execute(ctx context.Context, options Options, stdout io.Writer) error { return fmt.Errorf("runner: %w", err) } - fmt.Fprintf(stdout, "\nrun complete: %d steps in %s\n", summary.Steps, summary.EndTime.Sub(summary.StartTime).Round(time.Millisecond)) - if len(summary.Violations) == 0 { - fmt.Fprintln(stdout, "no violations.") - } else { - fmt.Fprintf(stdout, "%d violation record(s):\n", len(summary.Violations)) - for _, violation := range summary.Violations { - fmt.Fprintf(stdout, " step %d: %v\n", violation.StepIndex, violation.Properties) - } - } - if len(summary.UnsupportedVerbs) > 0 { - fmt.Fprintf(stdout, "unsupported on %s: %s\n", - options.Platform, strings.Join(summary.UnsupportedVerbs, ", ")) - } + fmt.Fprintf(stdout, "\nelapsed: %s\n", summary.EndTime.Sub(summary.StartTime).Round(time.Millisecond)) + runner.RenderSummary(stdout, summary, options.Platform) return nil }