๐Ÿ“ฆ wagoodman / jotframe

๐Ÿ“„ frame_test_helper.go ยท 89 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89package frame

import (
	"bytes"
	"fmt"
	"os"
	"testing"
)

func suppressOutput(f func()) {
	originalStdOut := os.Stdout
	var err error
	os.Stdout, err = os.OpenFile(os.DevNull, os.O_WRONLY, 0755)
	if err != nil {
		panic(err)
	}
	f()
	os.Stdout = originalStdOut
}

type TestEventHandler struct {
	t      *testing.T
	events []*ScreenEvent
}

func NewTestEventHandler(t *testing.T) *TestEventHandler {
	return &TestEventHandler{
		t:      t,
		events: make([]*ScreenEvent, 0),
	}
}

func (handler *TestEventHandler) onEvent(event *ScreenEvent) {
	handler.events = append(handler.events, event)
}

type drawTestParams struct {
	rows           int
	headers        int
	footers        int
	startRow       int
	policy         PositionPolicy
	terminalHeight int
	events         []ScreenEvent
	errors         []string
}

func validateEvents(t *testing.T, test string, table drawTestParams, errs []error, frame *Frame, handler *TestEventHandler) {
	if len(frame.BodyLines) != table.rows {
		t.Errorf("[case=%s] expected %d rows, got %d", test, table.rows, len(frame.BodyLines))
	}

	if len(table.errors) != len(errs) {
		t.Errorf("[case=%s] expected %d errors, got %d", test, len(table.errors), len(errs))
	} else {
		for idx, err := range errs {
			if err.Error() != table.errors[idx] {
				t.Errorf("[case=%s] unexpected error: %v", test, err)
			}
		}
	}

	if len(table.events) != len(handler.events) {
		t.Errorf("[case=%s] expected %d events, got %d", test, len(table.events), len(handler.events))
	} else {
		for idx, event := range table.events {
			if bytes.Compare(event.value, handler.events[idx].value) != 0 {
				t.Errorf("[case=%s] event=%d: expected value='%v', got '%v'", test, idx, string(event.value), string(handler.events[idx].value))
			}

			if event.row != handler.events[idx].row {
				t.Errorf("[case=%s] event=%d: expected row='%v', got '%v'", test, idx, event.row, handler.events[idx].row)
			}
		}
	}

	if t.Failed() {
		t.Logf("[case=%s] actual events", test)
		for idx, event := range handler.events {
			t.Log(fmt.Sprintf("   event=%d: row=%d value='%s'", idx, event.row, string(event.value)))
		}
		t.Logf("[case=%s] actual errors", test)
		for idx, err := range errs {
			t.Log(fmt.Sprintf("   error=%d: %v", idx, err.Error()))
		}
		t.Fatal("Stopping test")
	}
}