@@ -72,32 +72,157 @@ func TestUpdateSourceMaps2(t *testing.T) {
7272}
7373
7474func TestApplyTextChange (t * testing.T ) {
75- text1 := applyTextChange ("foo\n bar\n baz\n !" , lsp.Range {
76- Start : lsp.Position {Line : 1 , Character : 1 },
77- End : lsp.Position {Line : 2 , Character : 2 },
78- }, "i" )
79- if text1 != "foo\n biz\n !" {
80- t .Error (text1 )
75+ tests := []struct {
76+ InitialText string
77+ Range lsp.Range
78+ Insertion string
79+ Expectation string
80+ Err error
81+ }{
82+ {
83+ "foo\n bar\n baz\n !" ,
84+ lsp.Range {
85+ Start : lsp.Position {Line : 1 , Character : 1 },
86+ End : lsp.Position {Line : 2 , Character : 2 },
87+ },
88+ "i" ,
89+ "foo\n biz\n !" ,
90+ nil ,
91+ },
92+ {
93+ "foo\n bar\n baz\n !" ,
94+ lsp.Range {
95+ Start : lsp.Position {Line : 1 , Character : 1 },
96+ End : lsp.Position {Line : 1 , Character : 2 },
97+ },
98+ "ee" ,
99+ "foo\n beer\n baz\n !" ,
100+ nil ,
101+ },
102+ {
103+ "foo\n bar\n baz\n !" ,
104+ lsp.Range {
105+ Start : lsp.Position {Line : 1 , Character : 1 },
106+ End : lsp.Position {Line : 1 , Character : 1 },
107+ },
108+ "eer from the st" ,
109+ "foo\n beer from the star\n baz\n !" ,
110+ nil ,
111+ },
112+ {
113+ "foo\n bar\n baz\n !" ,
114+ lsp.Range {
115+ Start : lsp.Position {Line : 0 , Character : 10 },
116+ End : lsp.Position {Line : 2 , Character : 20 },
117+ },
118+ "i" ,
119+ "fooi\n !" ,
120+ nil ,
121+ },
122+ {
123+ "foo\n bar\n baz\n !" ,
124+ lsp.Range {
125+ // out of range start offset
126+ Start : lsp.Position {Line : 0 , Character : 100 },
127+ End : lsp.Position {Line : 2 , Character : 0 },
128+ },
129+ "i" ,
130+ "fooibaz\n !" ,
131+ nil ,
132+ },
133+ {
134+ "foo\n bar\n baz\n !" ,
135+ lsp.Range {
136+ // out of range start offset
137+ Start : lsp.Position {Line : 20 , Character : 0 },
138+ End : lsp.Position {Line : 2 , Character : 0 },
139+ },
140+ "i" ,
141+ "" ,
142+ OutOfRangeError {13 , lsp.Position {Line : 20 , Character : 0 }},
143+ },
144+ {
145+ "foo\n bar\n baz\n !" ,
146+ lsp.Range {
147+ // out of range start offset
148+ Start : lsp.Position {Line : 0 , Character : 0 },
149+ End : lsp.Position {Line : 20 , Character : 0 },
150+ },
151+ "i" ,
152+ "" ,
153+ OutOfRangeError {13 , lsp.Position {Line : 20 , Character : 0 }},
154+ },
81155 }
82- text2 := applyTextChange ("foo\n bar\n baz\n !" , lsp.Range {
83- Start : lsp.Position {Line : 1 , Character : 1 },
84- End : lsp.Position {Line : 1 , Character : 2 },
85- }, "ee" )
86- if text2 != "foo\n beer\n baz\n !" {
87- t .Error (text2 )
156+
157+ for _ , test := range tests {
158+ initial := strings .ReplaceAll (test .InitialText , "\n " , "\\ n" )
159+ insertion := strings .ReplaceAll (test .Insertion , "\n " , "\\ n" )
160+ expectation := strings .ReplaceAll (test .Expectation , "\n " , "\\ n" )
161+
162+ t .Logf ("applyTextChange(\" %s\" , %v, \" %s\" ) == \" %s\" " , initial , test .Range , insertion , expectation )
163+ act , err := applyTextChange (test .InitialText , test .Range , test .Insertion )
164+ if act != test .Expectation {
165+ t .Errorf ("applyTextChange(\" %s\" , %v, \" %s\" ) != \" %s\" , got \" %s\" " , initial , test .Range , insertion , expectation , strings .ReplaceAll (act , "\n " , "\\ n" ))
166+ }
167+ if err != test .Err {
168+ t .Errorf ("applyTextChange(\" %s\" , %v, \" %s\" ) error != %v, got %v instead" , initial , test .Range , insertion , test .Err , err )
169+ }
170+ }
171+ }
172+
173+ func TestGetOffset (t * testing.T ) {
174+ tests := []struct {
175+ Text string
176+ Line int
177+ Char int
178+ Exp int
179+ Err error
180+ }{
181+ {"foo\n foobar\n baz" , 0 , 0 , 0 , nil },
182+ {"foo\n foobar\n baz" , 1 , 0 , 4 , nil },
183+ {"foo\n foobar\n baz" , 1 , 3 , 7 , nil },
184+ {"foo\n ba\n r\n baz\n !" , 3 , 0 , 9 , nil },
185+ {"foo\n ba\n r\n baz\n !" , 1 , 10 , 6 , nil },
186+ {"foo\n ba\n r\n baz\n !" , - 1 , 0 , - 1 , OutOfRangeError {14 , lsp.Position {Line : - 1 , Character : 0 }}},
187+ {"foo\n ba\n r\n baz\n !" , 4 , 20 , - 1 , OutOfRangeError {14 , lsp.Position {Line : 4 , Character : 20 }}},
88188 }
89- text3 := applyTextChange ("foo\n bar\n baz\n !" , lsp.Range {
90- Start : lsp.Position {Line : 1 , Character : 1 },
91- End : lsp.Position {Line : 1 , Character : 1 },
92- }, "eer from the st" )
93- if text3 != "foo\n beer from the star\n baz\n !" {
94- t .Error (text3 )
189+
190+ for _ , test := range tests {
191+ st := strings .Replace (test .Text , "\n " , "\\ n" , - 1 )
192+
193+ t .Logf ("getOffset(\" %s\" , {Line: %d, Character: %d}) == %d" , st , test .Line , test .Char , test .Exp )
194+ act , err := getOffset (test .Text , lsp.Position {Line : test .Line , Character : test .Char })
195+ if act != test .Exp {
196+ t .Errorf ("getOffset(\" %s\" , {Line: %d, Character: %d}) != %d, got %d instead" , st , test .Line , test .Char , test .Exp , act )
197+ }
198+ if err != test .Err {
199+ t .Errorf ("getOffset(\" %s\" , {Line: %d, Character: %d}) error != %v, got %v instead" , st , test .Line , test .Char , test .Err , err )
200+ }
95201 }
96202}
97203
98204func TestGetLineOffset (t * testing.T ) {
99- offset := getLineOffset ("foo\n ba\n r\n baz\n !" , 3 )
100- if offset != 9 {
101- t .Error (offset )
205+ tests := []struct {
206+ Text string
207+ Line int
208+ Offset int
209+ }{
210+ {"foo\n foobar\n baz" , 0 , 0 },
211+ {"foo\n foobar\n baz" , 1 , 4 },
212+ {"foo\n foobar\n baz" , 2 , 11 },
213+ {"foo\n foobar\n baz" , 3 , - 1 },
214+ {"foo\n ba\n r\n baz\n !" , 3 , 9 },
215+ {"foo\n ba\n r\n baz\n !" , - 1 , - 1 },
216+ {"foo\n ba\n r\n baz\n !" , 20 , - 1 },
217+ }
218+
219+ for _ , test := range tests {
220+ st := strings .Replace (test .Text , "\n " , "\\ n" , - 1 )
221+
222+ t .Logf ("getLineOffset(\" %s\" , %d) == %d" , st , test .Line , test .Offset )
223+ act := getLineOffset (test .Text , test .Line )
224+ if act != test .Offset {
225+ t .Errorf ("getLineOffset(\" %s\" , %d) != %d, got %d instead" , st , test .Line , test .Offset , act )
226+ }
102227 }
103228}
0 commit comments