aboutsummaryrefslogtreecommitdiff
path: root/compiler/byte_test.go
blob: c298501ce2bc25f0bdb813c8c7d56bc991f610b0 (plain) (blame)
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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
package compiler

import "testing"

func TestExcludeByteRangeSequence(t *testing.T) {
	tests := []struct {
		b1       []byteRange
		b2       []byteRange
		excluded [][]byteRange
	}{
		// 1 Byte
		{
			b1: newByteRangeSeq([]byte{0x00}, []byte{0x00}),
			b2: newByteRangeSeq([]byte{0x00}, []byte{0xff}),
			excluded: [][]byteRange{
				newByteRangeSeq([]byte{0x01}, []byte{0xff}),
			},
		},
		{
			b1: newByteRangeSeq([]byte{0xff}, []byte{0xff}),
			b2: newByteRangeSeq([]byte{0x00}, []byte{0xff}),
			excluded: [][]byteRange{
				newByteRangeSeq([]byte{0x00}, []byte{0xfe}),
			},
		},
		{
			b1: newByteRangeSeq([]byte{0xc0}, []byte{0xcf}),
			b2: newByteRangeSeq([]byte{0x00}, []byte{0xff}),
			excluded: [][]byteRange{
				newByteRangeSeq([]byte{0x00}, []byte{0xbf}),
				newByteRangeSeq([]byte{0xd0}, []byte{0xff}),
			},
		},
		{
			b1:       newByteRangeSeq([]byte{0x00}, []byte{0xff}),
			b2:       newByteRangeSeq([]byte{0xc0}, []byte{0xcf}),
			excluded: nil,
		},
		{
			b1:       newByteRangeSeq([]byte{0x00}, []byte{0xff}),
			b2:       newByteRangeSeq([]byte{0x00}, []byte{0xff}),
			excluded: nil,
		},

		// 2 Byte
		{
			b1: newByteRangeSeq([]byte{0x00, 0x00}, []byte{0x00, 0x00}),
			b2: newByteRangeSeq([]byte{0x00, 0x00}, []byte{0xff, 0xff}),
			excluded: [][]byteRange{
				newByteRangeSeq([]byte{0x00, 0x01}, []byte{0x00, 0xff}),
				newByteRangeSeq([]byte{0x01, 0x00}, []byte{0xff, 0xff}),
			},
		},
		{
			b1: newByteRangeSeq([]byte{0xff, 0xff}, []byte{0xff, 0xff}),
			b2: newByteRangeSeq([]byte{0x00, 0x00}, []byte{0xff, 0xff}),
			excluded: [][]byteRange{
				newByteRangeSeq([]byte{0x00, 0x00}, []byte{0xfe, 0xff}),
				newByteRangeSeq([]byte{0xff, 0x00}, []byte{0xff, 0xfe}),
			},
		},
		{
			b1: newByteRangeSeq([]byte{0xc0, 0xc0}, []byte{0xc0, 0xc0}),
			b2: newByteRangeSeq([]byte{0x00, 0x00}, []byte{0xff, 0xff}),
			excluded: [][]byteRange{
				newByteRangeSeq([]byte{0x00, 0x00}, []byte{0xbf, 0xff}),
				newByteRangeSeq([]byte{0xc0, 0x00}, []byte{0xc0, 0xbf}),
				newByteRangeSeq([]byte{0xc0, 0xc1}, []byte{0xc0, 0xff}),
				newByteRangeSeq([]byte{0xc1, 0x00}, []byte{0xff, 0xff}),
			},
		},
		{
			b1: newByteRangeSeq([]byte{0xc0, 0x00}, []byte{0xc0, 0xff}),
			b2: newByteRangeSeq([]byte{0x00, 0x00}, []byte{0xff, 0xff}),
			excluded: [][]byteRange{
				newByteRangeSeq([]byte{0x00, 0x00}, []byte{0xbf, 0xff}),
				newByteRangeSeq([]byte{0xc1, 0x00}, []byte{0xff, 0xff}),
			},
		},
		{
			b1:       newByteRangeSeq([]byte{0x00, 0x00}, []byte{0xff, 0xff}),
			b2:       newByteRangeSeq([]byte{0xc0, 0xc0}, []byte{0xc0, 0xc0}),
			excluded: nil,
		},
		{
			b1:       newByteRangeSeq([]byte{0x00, 0x00}, []byte{0xff, 0xff}),
			b2:       newByteRangeSeq([]byte{0x00, 0x00}, []byte{0xff, 0xff}),
			excluded: nil,
		},

		// 3 Byte
		{
			b1: newByteRangeSeq([]byte{0x00, 0x00, 0x00}, []byte{0x00, 0x00, 0x00}),
			b2: newByteRangeSeq([]byte{0x00, 0x00, 0x00}, []byte{0xff, 0xff, 0xff}),
			excluded: [][]byteRange{
				newByteRangeSeq([]byte{0x00, 0x00, 0x01}, []byte{0x00, 0x00, 0xff}),
				newByteRangeSeq([]byte{0x00, 0x01, 0x00}, []byte{0x00, 0xff, 0xff}),
				newByteRangeSeq([]byte{0x01, 0x00, 0x00}, []byte{0xff, 0xff, 0xff}),
			},
		},
		{
			b1: newByteRangeSeq([]byte{0xff, 0xff, 0xff}, []byte{0xff, 0xff, 0xff}),
			b2: newByteRangeSeq([]byte{0x00, 0x00, 0x00}, []byte{0xff, 0xff, 0xff}),
			excluded: [][]byteRange{
				newByteRangeSeq([]byte{0x00, 0x00, 0x00}, []byte{0xfe, 0xff, 0xff}),
				newByteRangeSeq([]byte{0xff, 0x00, 0x00}, []byte{0xff, 0xfe, 0xff}),
				newByteRangeSeq([]byte{0xff, 0xff, 0x00}, []byte{0xff, 0xff, 0xfe}),
			},
		},
		{
			b1: newByteRangeSeq([]byte{0xc0, 0xc0, 0xc0}, []byte{0xc0, 0xc0, 0xc0}),
			b2: newByteRangeSeq([]byte{0x00, 0x00, 0x00}, []byte{0xff, 0xff, 0xff}),
			excluded: [][]byteRange{
				newByteRangeSeq([]byte{0x00, 0x00, 0x00}, []byte{0xbf, 0xff, 0xff}),
				newByteRangeSeq([]byte{0xc0, 0x00, 0x00}, []byte{0xc0, 0xbf, 0xff}),
				newByteRangeSeq([]byte{0xc0, 0xc0, 0x00}, []byte{0xc0, 0xc0, 0xbf}),
				newByteRangeSeq([]byte{0xc0, 0xc0, 0xc1}, []byte{0xc0, 0xc0, 0xff}),
				newByteRangeSeq([]byte{0xc0, 0xc1, 0x00}, []byte{0xc0, 0xff, 0xff}),
				newByteRangeSeq([]byte{0xc1, 0x00, 0x00}, []byte{0xff, 0xff, 0xff}),
			},
		},
		{
			b1: newByteRangeSeq([]byte{0xc0, 0xc0, 0x00}, []byte{0xc0, 0xc0, 0xff}),
			b2: newByteRangeSeq([]byte{0x00, 0x00, 0x00}, []byte{0xff, 0xff, 0xff}),
			excluded: [][]byteRange{
				newByteRangeSeq([]byte{0x00, 0x00, 0x00}, []byte{0xbf, 0xff, 0xff}),
				newByteRangeSeq([]byte{0xc0, 0x00, 0x00}, []byte{0xc0, 0xbf, 0xff}),
				newByteRangeSeq([]byte{0xc0, 0xc1, 0x00}, []byte{0xc0, 0xff, 0xff}),
				newByteRangeSeq([]byte{0xc1, 0x00, 0x00}, []byte{0xff, 0xff, 0xff}),
			},
		},
		{
			b1: newByteRangeSeq([]byte{0xc0, 0x00, 0x00}, []byte{0xc0, 0xff, 0xff}),
			b2: newByteRangeSeq([]byte{0x00, 0x00, 0x00}, []byte{0xff, 0xff, 0xff}),
			excluded: [][]byteRange{
				newByteRangeSeq([]byte{0x00, 0x00, 0x00}, []byte{0xbf, 0xff, 0xff}),
				newByteRangeSeq([]byte{0xc1, 0x00, 0x00}, []byte{0xff, 0xff, 0xff}),
			},
		},
		{
			b1:       newByteRangeSeq([]byte{0x00, 0x00, 0x00}, []byte{0xff, 0xff, 0xff}),
			b2:       newByteRangeSeq([]byte{0xff, 0xff, 0xff}, []byte{0xff, 0xff, 0xff}),
			excluded: nil,
		},
		{
			b1:       newByteRangeSeq([]byte{0x00, 0x00, 0x00}, []byte{0xff, 0xff, 0xff}),
			b2:       newByteRangeSeq([]byte{0x00, 0x00, 0x00}, []byte{0xff, 0xff, 0xff}),
			excluded: nil,
		},

		// 4 Byte
		{
			b1: newByteRangeSeq([]byte{0x00, 0x00, 0x00, 0x00}, []byte{0x00, 0x00, 0x00, 0x00}),
			b2: newByteRangeSeq([]byte{0x00, 0x00, 0x00, 0x00}, []byte{0xff, 0xff, 0xff, 0xff}),
			excluded: [][]byteRange{
				newByteRangeSeq([]byte{0x00, 0x00, 0x00, 0x01}, []byte{0x00, 0x00, 0x00, 0xff}),
				newByteRangeSeq([]byte{0x00, 0x00, 0x01, 0x00}, []byte{0x00, 0x00, 0xff, 0xff}),
				newByteRangeSeq([]byte{0x00, 0x01, 0x00, 0x00}, []byte{0x00, 0xff, 0xff, 0xff}),
				newByteRangeSeq([]byte{0x01, 0x00, 0x00, 0x00}, []byte{0xff, 0xff, 0xff, 0xff}),
			},
		},
		{
			b1: newByteRangeSeq([]byte{0xff, 0xff, 0xff, 0xff}, []byte{0xff, 0xff, 0xff, 0xff}),
			b2: newByteRangeSeq([]byte{0x00, 0x00, 0x00, 0x00}, []byte{0xff, 0xff, 0xff, 0xff}),
			excluded: [][]byteRange{
				newByteRangeSeq([]byte{0x00, 0x00, 0x00, 0x00}, []byte{0xfe, 0xff, 0xff, 0xff}),
				newByteRangeSeq([]byte{0xff, 0x00, 0x00, 0x00}, []byte{0xff, 0xfe, 0xff, 0xff}),
				newByteRangeSeq([]byte{0xff, 0xff, 0x00, 0x00}, []byte{0xff, 0xff, 0xfe, 0xff}),
				newByteRangeSeq([]byte{0xff, 0xff, 0xff, 0x00}, []byte{0xff, 0xff, 0xff, 0xfe}),
			},
		},
		{
			b1: newByteRangeSeq([]byte{0xc0, 0xc0, 0xc0, 0xc0}, []byte{0xc0, 0xc0, 0xc0, 0xc0}),
			b2: newByteRangeSeq([]byte{0x00, 0x00, 0x00, 0x00}, []byte{0xff, 0xff, 0xff, 0xff}),
			excluded: [][]byteRange{
				newByteRangeSeq([]byte{0x00, 0x00, 0x00, 0x00}, []byte{0xbf, 0xff, 0xff, 0xff}),
				newByteRangeSeq([]byte{0xc0, 0x00, 0x00, 0x00}, []byte{0xc0, 0xbf, 0xff, 0xff}),
				newByteRangeSeq([]byte{0xc0, 0xc0, 0x00, 0x00}, []byte{0xc0, 0xc0, 0xbf, 0xff}),
				newByteRangeSeq([]byte{0xc0, 0xc0, 0xc0, 0x00}, []byte{0xc0, 0xc0, 0xc0, 0xbf}),
				newByteRangeSeq([]byte{0xc0, 0xc0, 0xc0, 0xc1}, []byte{0xc0, 0xc0, 0xc0, 0xff}),
				newByteRangeSeq([]byte{0xc0, 0xc0, 0xc1, 0x00}, []byte{0xc0, 0xc0, 0xff, 0xff}),
				newByteRangeSeq([]byte{0xc0, 0xc1, 0x00, 0x00}, []byte{0xc0, 0xff, 0xff, 0xff}),
				newByteRangeSeq([]byte{0xc1, 0x00, 0x00, 0x00}, []byte{0xff, 0xff, 0xff, 0xff}),
			},
		},
		{
			b1: newByteRangeSeq([]byte{0xc0, 0xc0, 0xc0, 0x00}, []byte{0xc0, 0xc0, 0xc0, 0xff}),
			b2: newByteRangeSeq([]byte{0x00, 0x00, 0x00, 0x00}, []byte{0xff, 0xff, 0xff, 0xff}),
			excluded: [][]byteRange{
				newByteRangeSeq([]byte{0x00, 0x00, 0x00, 0x00}, []byte{0xbf, 0xff, 0xff, 0xff}),
				newByteRangeSeq([]byte{0xc0, 0x00, 0x00, 0x00}, []byte{0xc0, 0xbf, 0xff, 0xff}),
				newByteRangeSeq([]byte{0xc0, 0xc0, 0x00, 0x00}, []byte{0xc0, 0xc0, 0xbf, 0xff}),
				newByteRangeSeq([]byte{0xc0, 0xc0, 0xc1, 0x00}, []byte{0xc0, 0xc0, 0xff, 0xff}),
				newByteRangeSeq([]byte{0xc0, 0xc1, 0x00, 0x00}, []byte{0xc0, 0xff, 0xff, 0xff}),
				newByteRangeSeq([]byte{0xc1, 0x00, 0x00, 0x00}, []byte{0xff, 0xff, 0xff, 0xff}),
			},
		},
		{
			b1: newByteRangeSeq([]byte{0xc0, 0xc0, 0x00, 0x00}, []byte{0xc0, 0xc0, 0xff, 0xff}),
			b2: newByteRangeSeq([]byte{0x00, 0x00, 0x00, 0x00}, []byte{0xff, 0xff, 0xff, 0xff}),
			excluded: [][]byteRange{
				newByteRangeSeq([]byte{0x00, 0x00, 0x00, 0x00}, []byte{0xbf, 0xff, 0xff, 0xff}),
				newByteRangeSeq([]byte{0xc0, 0x00, 0x00, 0x00}, []byte{0xc0, 0xbf, 0xff, 0xff}),
				newByteRangeSeq([]byte{0xc0, 0xc1, 0x00, 0x00}, []byte{0xc0, 0xff, 0xff, 0xff}),
				newByteRangeSeq([]byte{0xc1, 0x00, 0x00, 0x00}, []byte{0xff, 0xff, 0xff, 0xff}),
			},
		},
		{
			b1: newByteRangeSeq([]byte{0xc0, 0x00, 0x00, 0x00}, []byte{0xc0, 0xff, 0xff, 0xff}),
			b2: newByteRangeSeq([]byte{0x00, 0x00, 0x00, 0x00}, []byte{0xff, 0xff, 0xff, 0xff}),
			excluded: [][]byteRange{
				newByteRangeSeq([]byte{0x00, 0x00, 0x00, 0x00}, []byte{0xbf, 0xff, 0xff, 0xff}),
				newByteRangeSeq([]byte{0xc1, 0x00, 0x00, 0x00}, []byte{0xff, 0xff, 0xff, 0xff}),
			},
		},
		{
			b1:       newByteRangeSeq([]byte{0x00, 0x00, 0x00, 0x00}, []byte{0xff, 0xff, 0xff, 0xff}),
			b2:       newByteRangeSeq([]byte{0xc0, 0xc0, 0xc0, 0xc0}, []byte{0xc0, 0xc0, 0xc0, 0xc0}),
			excluded: nil,
		},
		{
			b1:       newByteRangeSeq([]byte{0x00, 0x00, 0x00, 0x00}, []byte{0xff, 0xff, 0xff, 0xff}),
			b2:       newByteRangeSeq([]byte{0x00, 0x00, 0x00, 0x00}, []byte{0xff, 0xff, 0xff, 0xff}),
			excluded: nil,
		},
	}
	for _, tt := range tests {
		excluded := excludeByteRangeSequence(tt.b1, tt.b2)
		t.Logf("b1: %v, b2: %v", tt.b1, tt.b2)
		t.Logf("excluded: %+v", excluded)
		if len(excluded) != len(tt.excluded) {
			t.Errorf("unexpected results; expected: %+v, actual: %+v", tt.excluded, excluded)
		}
		for _, expectedSeq := range tt.excluded {
			found := false
			for _, actualSeq := range excluded {
				mismatched := false
				for i := 0; i < len(expectedSeq); i++ {
					if actualSeq[i] != expectedSeq[i] {
						mismatched = true
						break
					}
				}
				if mismatched {
					continue
				}
				found = true
				break
			}
			if !found {
				t.Errorf("an expected byte range sequence was not found: %+v", expectedSeq)
			}
		}
	}
}

func newByteRangeSeq(from, to []byte) []byteRange {
	seq, err := newByteRangeSequence(from, to)
	if err != nil {
		panic(err)
	}
	return seq
}