-
Notifications
You must be signed in to change notification settings - Fork 0
/
ctx_test.go
208 lines (188 loc) · 3.53 KB
/
ctx_test.go
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
package ctxerr
import (
"fmt"
"os"
"testing"
)
func init() {
NoColor = true
}
func ExampleNew() {
fmt.Println(New("source code containing error", Range(1, 24, 1, 28)))
// Output:
// 1:24-28:
// 1 | source code containing error
// | ^^^^^
}
func ExamplePoint() {
fmt.Println(New("00100", Point(1, 3)))
// Output:
// 1:3:
// 1 | 00100
// | ^
}
func ExampleRange() {
fmt.Println(New("01110", Range(1, 2, 1, 4)))
// Output:
// 1:2-4:
// 1 | 01110
// | ^^^
}
func ExampleRange_multiline() {
fmt.Println(New("00001\n11110", Range(1, 5, 2, 4)))
// Output:
// 1:5-2:4:
// 1 | 00001
// | ^
// 2 | 11110
// | ^^^^
}
func ExampleCtx_Error_hint() {
ctx := New("010101102110", Point(1, 9))
ctx.Hint = "don't worry, bender"
fmt.Println(ctx)
// Output:
// 1:9:
// 1 | 010101102110
// | ^ don't worry, bender
}
func ExampleCtx_Error_contextLimited() {
in := `1st
2nd
3rd has an error
4th
5th`
ctx := New(in, Point(3, 12))
ctx.Context = 1
fmt.Println(ctx)
// Output:
// 3:12:
// 2 | 2nd
// 3 | 3rd has an error
// | ^
// 4 | 4th
}
func ExampleCtx_Error_contextLimitedMultiline() {
in := `1st
2nd
3rd has an error
4th still has an error
5th`
ctx := New(in, Range(3, 1, 4, 22))
ctx.Context = 1
fmt.Println(ctx)
// Output:
// 3:1-4:22:
// 2 | 2nd
// 3 | 3rd has an error
// | ^^^^^^^^^^^^^^^^
// 4 | 4th still has an error
// | ^^^^^^^^^^^^^^^^^^^^^^
// 5 | 5th
}
func ExampleCtx_Error_contextAll() {
in := `1st
2nd
3rd has an error
4th
5th`
ctx := New(in, Point(3, 12))
ctx.Context = -1
fmt.Println(ctx)
// Output:
// 3:12:
// 1 | 1st
// 2 | 2nd
// 3 | 3rd has an error
// | ^
// 4 | 4th
// 5 | 5th
}
func ExampleCtx_Error_path() {
ctx := New("42", Point(1, 1))
ctx.Path = "/tmp/ctxerr/answer.txt"
fmt.Println(ctx)
// Output:
// /tmp/ctxerr/answer.txt:1:1:
// 1 | 42
// | ^
}
func ExampleCtx_Error() {
err := New("ab!cd", Point(1, 3))
err.Err = fmt.Errorf("not a letter")
fmt.Println(err)
// Output:
// not a letter
// 1:3:
// 1 | ab!cd
// | ^
}
func ExampleCtx_Error_tabwidth() {
in := "\tfoo\tbar"
ctx := New(in, Point(1, 5))
fmt.Println(ctx)
// Output:
// 1:5:
// 1 | foo bar
// | ^^^^
}
func ExampleNewFromPath() {
cerr, err := NewFromPath("LICENSE", Range(1, 1, 1, 3))
if err != nil {
fmt.Println(err)
return
}
cerr.Context = 0
fmt.Println(cerr)
// Output:
// LICENSE:1:1-3:
// 1 | MIT License
// | ^^^
}
func ExampleCtx_ErrorLine() {
ctx := New("foo", Point(1, 1))
ctx.Err = fmt.Errorf("something went wrong")
ctx.Path = "bar.txt"
fmt.Println(ctx.ErrorLine())
// Output:
// bar.txt:1:1: something went wrong
}
func TestNewFromPath_NoSuchFile(t *testing.T) {
_, err := NewFromPath("foo.txt", Point(1, 1))
if err == nil {
t.Error("expected error, got nil")
}
if !os.IsNotExist(err) {
t.Errorf("expected %#v, got %#v", os.ErrNotExist.Error(), err.Error())
}
}
func testCmp(t *testing.T, exp, act string) {
if exp != act {
t.Errorf("expected %#v, got %#v", exp, act)
}
}
func TestCtx_Error_contextBoundaries(t *testing.T) {
ctx := New("x", Point(1, 1))
ctx.Context = 42
exp := `1:1:
1 | x
| ^
`
testCmp(t, exp, ctx.Error())
}
func TestCtx_Error_pointsOutside(t *testing.T) {
ctx := New("'who needs closing quotes?", Point(1, 27))
exp := `1:27:
1 | 'who needs closing quotes?
| ^
`
testCmp(t, exp, ctx.Error())
}
func TestCtx_Error_nilColumn(t *testing.T) {
ctx := New("foo", Point(1, 0))
exp := `1:
1 | foo
| ^^^
`
testCmp(t, exp, ctx.Error())
}