File: combinator_test.go

package info (click to toggle)
golang-github-muesli-combinator 0.3.0-1.1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 96 kB
  • sloc: makefile: 3
file content (169 lines) | stat: -rw-r--r-- 3,127 bytes parent folder | download
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
package combinator

import (
	"testing"
)

func TestCombinator(t *testing.T) {
	type Data struct {
		Color   string
		Number  int
		Enabled bool

		// DataTests ignore this field
		Untouched bool
	}

	type DataTests struct {
		Color   []string
		Number  []int
		Enabled []bool

		// DataTests ignore this field
		Untouched []bool
	}

	td := DataTests{
		Color:   []string{"red", "green", "blue"},
		Number:  []int{0, 1},
		Enabled: []bool{false, true},

		// DataTests ignore this field
		Untouched: []bool{},
	}
	tdl := len(td.Color) * len(td.Number) * len(td.Enabled)

	// initialize check matrix
	matrix := map[string]map[int]map[bool]bool{}
	for ci := 0; ci < len(td.Color); ci++ {
		matrix[td.Color[ci]] = map[int]map[bool]bool{}

		for ni := 0; ni < len(td.Number); ni++ {
			matrix[td.Color[ci]][td.Number[ni]] = map[bool]bool{}

			for bi := 0; bi < len(td.Enabled); bi++ {
				matrix[td.Color[ci]][td.Number[ni]][td.Enabled[bi]] = false
			}
		}
	}

	var data []Data
	err := Generate(&data, td)
	if err != nil {
		t.Fatalf("unexpected error: %v", err)
	}

	if len(data) != tdl {
		t.Errorf("expected %d permutations, got %d", tdl, len(data))
	}
	for _, v := range data {
		// fmt.Println(i, v)

		cmatrix, ok := matrix[v.Color]
		if !ok {
			t.Errorf("unexpected value %s", v.Color)
			continue
		}
		nmatrix, ok := cmatrix[v.Number]
		if !ok {
			t.Errorf("unexpected value %s %d", v.Color, v.Number)
			continue
		}
		_, ok = nmatrix[v.Enabled]
		if !ok {
			t.Errorf("unexpected value %s %d %v", v.Color, v.Number, v.Enabled)
			continue
		}

		// flag combination as found
		matrix[v.Color][v.Number][v.Enabled] = true
	}

	// check all combinations have been found
	for ck, cv := range matrix {
		for nk, nv := range cv {
			for bk, bv := range nv {
				if !bv {
					t.Errorf("combination not found: %s %d %v", ck, nk, bk)
				}
			}
		}
	}
}

func TestConstValue(t *testing.T) {
	type Data struct {
		Number  int
		Enabled bool
	}

	type DataTests struct {
		Number  []int
		Enabled bool
	}

	td := DataTests{
		Number:  []int{0, 1},
		Enabled: true,
	}

	var data []Data
	err := Generate(&data, td)
	if err != nil {
		t.Fatalf("unexpected error: %v", err)
	}

	for _, v := range data {
		if !v.Enabled {
			t.Fatalf("expected enabled to be set to true")
		}
	}
}

func TestUnmatchedField(t *testing.T) {
	type Data struct {
		Number int
	}

	type DataTests struct {
		Number []int

		// Data does not actually contain this field
		Unmatched []bool
	}

	td := DataTests{
		Number: []int{0, 1},

		// Data does not actually contain this field
		Unmatched: []bool{false},
	}

	var data []Data
	err := Generate(&data, td)
	if err == nil {
		t.Errorf("expected error for unmatched fields in data, got nil")
	}
}

func TestInvalidType(t *testing.T) {
	td := struct {
		Number []int
	}{}

	var s string
	err := Generate(s, td)
	if err == nil {
		t.Errorf("expected error for non-pointer type, got nil")
	}

	err = Generate(&s, td)
	if err == nil {
		t.Errorf("expected error for invalid type, got nil")
	}

	err = Generate(&[]string{}, "")
	if err == nil {
		t.Errorf("expected error for invalid type, got nil")
	}
}