xref: /aosp_15_r20/external/spdx-tools/tvloader/reader/reader_test.go (revision ba677afa8f67bb56cbc794f4d0e378e0da058e16)
1*ba677afaSXin Li// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
2*ba677afaSXin Lipackage reader
3*ba677afaSXin Li
4*ba677afaSXin Liimport (
5*ba677afaSXin Li	"strings"
6*ba677afaSXin Li	"testing"
7*ba677afaSXin Li)
8*ba677afaSXin Li
9*ba677afaSXin Lifunc TestCanReadTagValues(t *testing.T) {
10*ba677afaSXin Li	sText := `
11*ba677afaSXin LiTag1: Value1
12*ba677afaSXin LiTag2:    Value2
13*ba677afaSXin Li
14*ba677afaSXin LiTag3: <text>line 1
15*ba677afaSXin Li   line 2</text>
16*ba677afaSXin Li# Comment
17*ba677afaSXin LiTag4: Value4
18*ba677afaSXin LiTag5: Value 5
19*ba677afaSXin Li`
20*ba677afaSXin Li	sReader := strings.NewReader(sText)
21*ba677afaSXin Li
22*ba677afaSXin Li	tvPairList, err := ReadTagValues(sReader)
23*ba677afaSXin Li	if err != nil {
24*ba677afaSXin Li		t.Errorf("got error when calling ReadTagValues: %v", err)
25*ba677afaSXin Li	}
26*ba677afaSXin Li	if len(tvPairList) != 5 {
27*ba677afaSXin Li		t.Fatalf("expected len(tvPairList) to be 5, got %d", len(tvPairList))
28*ba677afaSXin Li	}
29*ba677afaSXin Li	if tvPairList[0].Tag != "Tag1" {
30*ba677afaSXin Li		t.Errorf("expected tvPairList[0].Tag to be Tag1, got %s", tvPairList[0].Tag)
31*ba677afaSXin Li	}
32*ba677afaSXin Li	if tvPairList[0].Value != "Value1" {
33*ba677afaSXin Li		t.Errorf("expected tvPairList[0].Value to be Value1, got %s", tvPairList[0].Value)
34*ba677afaSXin Li	}
35*ba677afaSXin Li	if tvPairList[1].Tag != "Tag2" {
36*ba677afaSXin Li		t.Errorf("expected tvPairList[1].Tag to be Tag2, got %s", tvPairList[1].Tag)
37*ba677afaSXin Li	}
38*ba677afaSXin Li	if tvPairList[1].Value != "Value2" {
39*ba677afaSXin Li		t.Errorf("expected tvPairList[1].Value to be Value2, got %s", tvPairList[1].Value)
40*ba677afaSXin Li	}
41*ba677afaSXin Li	if tvPairList[2].Tag != "Tag3" {
42*ba677afaSXin Li		t.Errorf("expected tvPairList[2].Tag to be Tag3, got %s", tvPairList[2].Tag)
43*ba677afaSXin Li	}
44*ba677afaSXin Li	if tvPairList[2].Value != "line 1\n   line 2" {
45*ba677afaSXin Li		t.Errorf("expected tvPairList[2].Value to be line 1\n   line 2, got %s", tvPairList[2].Value)
46*ba677afaSXin Li	}
47*ba677afaSXin Li	if tvPairList[3].Tag != "Tag4" {
48*ba677afaSXin Li		t.Errorf("expected tvPairList[3].Tag to be Tag4, got %s", tvPairList[3].Tag)
49*ba677afaSXin Li	}
50*ba677afaSXin Li	if tvPairList[3].Value != "Value4" {
51*ba677afaSXin Li		t.Errorf("expected tvPairList[3].Value to be Value4, got %s", tvPairList[3].Value)
52*ba677afaSXin Li	}
53*ba677afaSXin Li	if tvPairList[4].Tag != "Tag5" {
54*ba677afaSXin Li		t.Errorf("expected tvPairList[4].Tag to be Tag5, got %s", tvPairList[4].Tag)
55*ba677afaSXin Li	}
56*ba677afaSXin Li	if tvPairList[4].Value != "Value 5" {
57*ba677afaSXin Li		t.Errorf("expected tvPairList[4].Value to be Value 5, got %s", tvPairList[4].Value)
58*ba677afaSXin Li	}
59*ba677afaSXin Li}
60*ba677afaSXin Li
61*ba677afaSXin Lifunc TestCanGetTVListWithFinalize(t *testing.T) {
62*ba677afaSXin Li	reader := &tvReader{}
63*ba677afaSXin Li	err := reader.readNextLine("Tag:value")
64*ba677afaSXin Li	if err != nil {
65*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
66*ba677afaSXin Li	}
67*ba677afaSXin Li	tvList, err := reader.finalize()
68*ba677afaSXin Li	if err != nil {
69*ba677afaSXin Li		t.Errorf("got error when calling finalize: %v", err)
70*ba677afaSXin Li	}
71*ba677afaSXin Li	if len(tvList) != 1 || tvList[0].tag != "Tag" || tvList[0].value != "value" {
72*ba677afaSXin Li		t.Errorf("got invalid tag/value list: %v", tvList)
73*ba677afaSXin Li	}
74*ba677afaSXin Li}
75*ba677afaSXin Li
76*ba677afaSXin Lifunc TestCanGetTVListIncludingMultilineWithFinalize(t *testing.T) {
77*ba677afaSXin Li	reader := &tvReader{}
78*ba677afaSXin Li	err := reader.readNextLine("Tag:<text>value")
79*ba677afaSXin Li	if err != nil {
80*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
81*ba677afaSXin Li	}
82*ba677afaSXin Li	err = reader.readNextLine("rest of value</text>")
83*ba677afaSXin Li	if err != nil {
84*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
85*ba677afaSXin Li	}
86*ba677afaSXin Li	tvList, err := reader.finalize()
87*ba677afaSXin Li	if err != nil {
88*ba677afaSXin Li		t.Errorf("got error when calling finalize: %v", err)
89*ba677afaSXin Li	}
90*ba677afaSXin Li	if len(tvList) != 1 || tvList[0].tag != "Tag" || tvList[0].value != "value\nrest of value" {
91*ba677afaSXin Li		t.Errorf("got invalid tag/value list: %v", tvList)
92*ba677afaSXin Li	}
93*ba677afaSXin Li}
94*ba677afaSXin Li
95*ba677afaSXin Lifunc TestCannotFinalizeIfInMidtextState(t *testing.T) {
96*ba677afaSXin Li	reader := &tvReader{}
97*ba677afaSXin Li	err := reader.readNextLine("Tag:<text>value")
98*ba677afaSXin Li	if err != nil {
99*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
100*ba677afaSXin Li	}
101*ba677afaSXin Li	_, err = reader.finalize()
102*ba677afaSXin Li	if err == nil {
103*ba677afaSXin Li		t.Errorf("should have gotten error when calling finalize midtext")
104*ba677afaSXin Li	}
105*ba677afaSXin Li}
106*ba677afaSXin Li
107*ba677afaSXin Lifunc TestCurrentLineIncreasesOnEachReadCall(t *testing.T) {
108*ba677afaSXin Li	reader := &tvReader{}
109*ba677afaSXin Li	err := reader.readNextLine("Tag:value")
110*ba677afaSXin Li	if err != nil {
111*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
112*ba677afaSXin Li	}
113*ba677afaSXin Li	if reader.currentLine != 1 {
114*ba677afaSXin Li		t.Errorf("expected %d for currentLine, got %d", 1, reader.currentLine)
115*ba677afaSXin Li	}
116*ba677afaSXin Li
117*ba677afaSXin Li	reader.currentLine = 23
118*ba677afaSXin Li	err = reader.readNextLine("Tag:value")
119*ba677afaSXin Li	if err != nil {
120*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
121*ba677afaSXin Li	}
122*ba677afaSXin Li	if reader.currentLine != 24 {
123*ba677afaSXin Li		t.Errorf("expected %d for currentLine, got %d", 23, reader.currentLine)
124*ba677afaSXin Li	}
125*ba677afaSXin Li}
126*ba677afaSXin Li
127*ba677afaSXin Lifunc TestReadyCanReadSingleTagValue(t *testing.T) {
128*ba677afaSXin Li	reader := &tvReader{}
129*ba677afaSXin Li	err := reader.readNextLine("Tag:value")
130*ba677afaSXin Li	if err != nil {
131*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
132*ba677afaSXin Li	}
133*ba677afaSXin Li	if len(reader.tvList) != 1 || reader.tvList[0].tag != "Tag" || reader.tvList[0].value != "value" {
134*ba677afaSXin Li		t.Errorf("got invalid tag/value list: %v", reader.tvList)
135*ba677afaSXin Li	}
136*ba677afaSXin Li	if reader.currentLine != 1 {
137*ba677afaSXin Li		t.Errorf("expected %d for currentLine, got %d", 1, reader.currentLine)
138*ba677afaSXin Li	}
139*ba677afaSXin Li	if reader.currentTag != "" {
140*ba677afaSXin Li		t.Errorf("expected empty string for currentTag, got %s", reader.currentTag)
141*ba677afaSXin Li	}
142*ba677afaSXin Li	if reader.currentValue != "" {
143*ba677afaSXin Li		t.Errorf("expected empty string for currentValue, got %s", reader.currentValue)
144*ba677afaSXin Li	}
145*ba677afaSXin Li}
146*ba677afaSXin Li
147*ba677afaSXin Lifunc TestReadyCanStripWhitespaceFromValue(t *testing.T) {
148*ba677afaSXin Li	reader := &tvReader{}
149*ba677afaSXin Li	err := reader.readNextLine("Tag:   value	  	 ")
150*ba677afaSXin Li	if err != nil {
151*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
152*ba677afaSXin Li	}
153*ba677afaSXin Li	if len(reader.tvList) != 1 || reader.tvList[0].tag != "Tag" || reader.tvList[0].value != "value" {
154*ba677afaSXin Li		t.Errorf("got invalid tag/value list: %v", reader.tvList)
155*ba677afaSXin Li	}
156*ba677afaSXin Li}
157*ba677afaSXin Li
158*ba677afaSXin Lifunc TestReadyCannotReadLineWithNoColon(t *testing.T) {
159*ba677afaSXin Li	reader := &tvReader{}
160*ba677afaSXin Li	err := reader.readNextLine("No colon should be an error")
161*ba677afaSXin Li	if err == nil {
162*ba677afaSXin Li		t.Errorf("should have gotten error when calling readNextLine")
163*ba677afaSXin Li	}
164*ba677afaSXin Li}
165*ba677afaSXin Li
166*ba677afaSXin Lifunc TestReadyTextTagSwitchesToMidtext(t *testing.T) {
167*ba677afaSXin Li	reader := &tvReader{}
168*ba677afaSXin Li	err := reader.readNextLine("Tag: <text>This begins a multiline value")
169*ba677afaSXin Li	if err != nil {
170*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
171*ba677afaSXin Li	}
172*ba677afaSXin Li	if len(reader.tvList) != 0 {
173*ba677afaSXin Li		t.Errorf("expected empty tag/value list, got %v", reader.tvList)
174*ba677afaSXin Li	}
175*ba677afaSXin Li	if !reader.midtext {
176*ba677afaSXin Li		t.Errorf("expected midtext to be true, got false")
177*ba677afaSXin Li	}
178*ba677afaSXin Li	if reader.currentLine != 1 {
179*ba677afaSXin Li		t.Errorf("expected %d for currentLine, got %d", 1, reader.currentLine)
180*ba677afaSXin Li	}
181*ba677afaSXin Li	if reader.currentTag != "Tag" {
182*ba677afaSXin Li		t.Errorf("expected %s for currentTag, got %s", "Tag", reader.currentTag)
183*ba677afaSXin Li	}
184*ba677afaSXin Li	if reader.currentValue != "This begins a multiline value\n" {
185*ba677afaSXin Li		t.Errorf("expected %s for currentValue, got %s", "This begins a multiline value\n", reader.currentValue)
186*ba677afaSXin Li	}
187*ba677afaSXin Li}
188*ba677afaSXin Li
189*ba677afaSXin Lifunc TestReadyTextTagAndClosingTagInOneLineFinishesRead(t *testing.T) {
190*ba677afaSXin Li	reader := &tvReader{}
191*ba677afaSXin Li	err := reader.readNextLine("Tag: <text>Just one line</text>")
192*ba677afaSXin Li	if err != nil {
193*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
194*ba677afaSXin Li	}
195*ba677afaSXin Li	if len(reader.tvList) != 1 || reader.tvList[0].tag != "Tag" || reader.tvList[0].value != "Just one line" {
196*ba677afaSXin Li		t.Errorf("got invalid tag/value list: %v", reader.tvList)
197*ba677afaSXin Li	}
198*ba677afaSXin Li	if reader.midtext {
199*ba677afaSXin Li		t.Errorf("expected midtext to be false, got true")
200*ba677afaSXin Li	}
201*ba677afaSXin Li	if reader.currentLine != 1 {
202*ba677afaSXin Li		t.Errorf("expected %d for currentLine, got %d", 1, reader.currentLine)
203*ba677afaSXin Li	}
204*ba677afaSXin Li	if reader.currentTag != "" {
205*ba677afaSXin Li		t.Errorf("expected empty string for currentTag, got %s", reader.currentTag)
206*ba677afaSXin Li	}
207*ba677afaSXin Li	if reader.currentValue != "" {
208*ba677afaSXin Li		t.Errorf("expected empty string for currentValue, got %s", reader.currentValue)
209*ba677afaSXin Li	}
210*ba677afaSXin Li}
211*ba677afaSXin Li
212*ba677afaSXin Lifunc TestCanReadMultilineTextAcrossThreeLines(t *testing.T) {
213*ba677afaSXin Li	reader := &tvReader{}
214*ba677afaSXin Li	err := reader.readNextLine("Tag: <text>This value")
215*ba677afaSXin Li	if err != nil {
216*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
217*ba677afaSXin Li	}
218*ba677afaSXin Li	err = reader.readNextLine("is three")
219*ba677afaSXin Li	if err != nil {
220*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
221*ba677afaSXin Li	}
222*ba677afaSXin Li	err = reader.readNextLine("lines long</text>")
223*ba677afaSXin Li	if err != nil {
224*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
225*ba677afaSXin Li	}
226*ba677afaSXin Li
227*ba677afaSXin Li	if len(reader.tvList) != 1 || reader.tvList[0].tag != "Tag" || reader.tvList[0].value != "This value\nis three\nlines long" {
228*ba677afaSXin Li		t.Errorf("got invalid tag/value list: %v", reader.tvList)
229*ba677afaSXin Li	}
230*ba677afaSXin Li	if reader.midtext {
231*ba677afaSXin Li		t.Errorf("expected midtext to be false, got true")
232*ba677afaSXin Li	}
233*ba677afaSXin Li	if reader.currentLine != 3 {
234*ba677afaSXin Li		t.Errorf("expected %d for currentLine, got %d", 3, reader.currentLine)
235*ba677afaSXin Li	}
236*ba677afaSXin Li	if reader.currentTag != "" {
237*ba677afaSXin Li		t.Errorf("expected empty string for currentTag, got %s", reader.currentTag)
238*ba677afaSXin Li	}
239*ba677afaSXin Li	if reader.currentValue != "" {
240*ba677afaSXin Li		t.Errorf("expected empty string for currentValue, got %s", reader.currentValue)
241*ba677afaSXin Li	}
242*ba677afaSXin Li}
243*ba677afaSXin Li
244*ba677afaSXin Lifunc TestMidtextContinuesIfNoClosingText(t *testing.T) {
245*ba677afaSXin Li	reader := &tvReader{}
246*ba677afaSXin Li	reader.midtext = true
247*ba677afaSXin Li	reader.currentLine = 1
248*ba677afaSXin Li	reader.currentTag = "Multiline"
249*ba677afaSXin Li	reader.currentValue = "First line\n"
250*ba677afaSXin Li
251*ba677afaSXin Li	err := reader.readNextLine("Second line")
252*ba677afaSXin Li	if err != nil {
253*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
254*ba677afaSXin Li	}
255*ba677afaSXin Li
256*ba677afaSXin Li	if len(reader.tvList) != 0 {
257*ba677afaSXin Li		t.Errorf("expected empty tag/value list, got %v", reader.tvList)
258*ba677afaSXin Li	}
259*ba677afaSXin Li	if !reader.midtext {
260*ba677afaSXin Li		t.Errorf("expected midtext to be true, got false")
261*ba677afaSXin Li	}
262*ba677afaSXin Li	if reader.currentLine != 2 {
263*ba677afaSXin Li		t.Errorf("expected %d for currentLine, got %d", 2, reader.currentLine)
264*ba677afaSXin Li	}
265*ba677afaSXin Li	if reader.currentTag != "Multiline" {
266*ba677afaSXin Li		t.Errorf("expected %s for currentTag, got %s", "Multiline", reader.currentTag)
267*ba677afaSXin Li	}
268*ba677afaSXin Li	if reader.currentValue != "First line\nSecond line\n" {
269*ba677afaSXin Li		t.Errorf("expected %s for currentValue, got %s", "First line\nSecond line\n", reader.currentValue)
270*ba677afaSXin Li	}
271*ba677afaSXin Li}
272*ba677afaSXin Li
273*ba677afaSXin Lifunc TestMidtextFinishesIfReachingClosingText(t *testing.T) {
274*ba677afaSXin Li	reader := &tvReader{}
275*ba677afaSXin Li	reader.midtext = true
276*ba677afaSXin Li	reader.currentLine = 1
277*ba677afaSXin Li	reader.currentTag = "Multiline"
278*ba677afaSXin Li	reader.currentValue = "First line\n"
279*ba677afaSXin Li
280*ba677afaSXin Li	err := reader.readNextLine("Second line</text>")
281*ba677afaSXin Li	if err != nil {
282*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
283*ba677afaSXin Li	}
284*ba677afaSXin Li
285*ba677afaSXin Li	if len(reader.tvList) != 1 || reader.tvList[0].tag != "Multiline" || reader.tvList[0].value != "First line\nSecond line" {
286*ba677afaSXin Li		t.Errorf("got invalid tag/value list: %v", reader.tvList)
287*ba677afaSXin Li	}
288*ba677afaSXin Li	if reader.midtext {
289*ba677afaSXin Li		t.Errorf("expected midtext to be false, got true")
290*ba677afaSXin Li	}
291*ba677afaSXin Li	if reader.currentLine != 2 {
292*ba677afaSXin Li		t.Errorf("expected %d for currentLine, got %d", 2, reader.currentLine)
293*ba677afaSXin Li	}
294*ba677afaSXin Li	if reader.currentTag != "" {
295*ba677afaSXin Li		t.Errorf("expected empty string for currentTag, got %s", reader.currentTag)
296*ba677afaSXin Li	}
297*ba677afaSXin Li	if reader.currentValue != "" {
298*ba677afaSXin Li		t.Errorf("expected empty string for currentValue, got %s", reader.currentValue)
299*ba677afaSXin Li	}
300*ba677afaSXin Li}
301*ba677afaSXin Li
302*ba677afaSXin Lifunc TestReadyIgnoresCommentLines(t *testing.T) {
303*ba677afaSXin Li	reader := &tvReader{}
304*ba677afaSXin Li	err := reader.readNextLine("# this is a comment")
305*ba677afaSXin Li	if err != nil {
306*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
307*ba677afaSXin Li	}
308*ba677afaSXin Li
309*ba677afaSXin Li	if len(reader.tvList) != 0 {
310*ba677afaSXin Li		t.Errorf("expected empty tag/value list, got %v", reader.tvList)
311*ba677afaSXin Li	}
312*ba677afaSXin Li	if reader.midtext {
313*ba677afaSXin Li		t.Errorf("expected midtext to be false, got true")
314*ba677afaSXin Li	}
315*ba677afaSXin Li	if reader.currentLine != 1 {
316*ba677afaSXin Li		t.Errorf("expected %d for currentLine, got %d", 1, reader.currentLine)
317*ba677afaSXin Li	}
318*ba677afaSXin Li	if reader.currentTag != "" {
319*ba677afaSXin Li		t.Errorf("expected empty string for currentTag, got %s", reader.currentTag)
320*ba677afaSXin Li	}
321*ba677afaSXin Li	if reader.currentValue != "" {
322*ba677afaSXin Li		t.Errorf("expected empty string for currentValue, got %s", reader.currentValue)
323*ba677afaSXin Li	}
324*ba677afaSXin Li}
325*ba677afaSXin Li
326*ba677afaSXin Lifunc TestMidtextIncludesCommentLines(t *testing.T) {
327*ba677afaSXin Li	reader := &tvReader{}
328*ba677afaSXin Li	reader.midtext = true
329*ba677afaSXin Li	reader.currentLine = 1
330*ba677afaSXin Li	reader.currentTag = "Multiline"
331*ba677afaSXin Li	reader.currentValue = "First line\n"
332*ba677afaSXin Li
333*ba677afaSXin Li	err := reader.readNextLine("# This is part of multiline text")
334*ba677afaSXin Li	if err != nil {
335*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
336*ba677afaSXin Li	}
337*ba677afaSXin Li
338*ba677afaSXin Li	if len(reader.tvList) != 0 {
339*ba677afaSXin Li		t.Errorf("expected empty tag/value list, got %v", reader.tvList)
340*ba677afaSXin Li	}
341*ba677afaSXin Li	if !reader.midtext {
342*ba677afaSXin Li		t.Errorf("expected midtext to be true, got false")
343*ba677afaSXin Li	}
344*ba677afaSXin Li	if reader.currentLine != 2 {
345*ba677afaSXin Li		t.Errorf("expected %d for currentLine, got %d", 2, reader.currentLine)
346*ba677afaSXin Li	}
347*ba677afaSXin Li	if reader.currentTag != "Multiline" {
348*ba677afaSXin Li		t.Errorf("expected %s for currentTag, got %s", "Multiline", reader.currentTag)
349*ba677afaSXin Li	}
350*ba677afaSXin Li	if reader.currentValue != "First line\n# This is part of multiline text\n" {
351*ba677afaSXin Li		t.Errorf("expected %s for currentValue, got %s", "First line\n# This is part of multiline text\n", reader.currentValue)
352*ba677afaSXin Li	}
353*ba677afaSXin Li}
354*ba677afaSXin Li
355*ba677afaSXin Lifunc TestReadyIgnoresEmptyLines(t *testing.T) {
356*ba677afaSXin Li	reader := &tvReader{}
357*ba677afaSXin Li	err := reader.readNextLine("")
358*ba677afaSXin Li	if err != nil {
359*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
360*ba677afaSXin Li	}
361*ba677afaSXin Li
362*ba677afaSXin Li	if len(reader.tvList) != 0 {
363*ba677afaSXin Li		t.Errorf("expected empty tag/value list, got %v", reader.tvList)
364*ba677afaSXin Li	}
365*ba677afaSXin Li	if reader.midtext {
366*ba677afaSXin Li		t.Errorf("expected midtext to be false, got true")
367*ba677afaSXin Li	}
368*ba677afaSXin Li	if reader.currentLine != 1 {
369*ba677afaSXin Li		t.Errorf("expected %d for currentLine, got %d", 1, reader.currentLine)
370*ba677afaSXin Li	}
371*ba677afaSXin Li	if reader.currentTag != "" {
372*ba677afaSXin Li		t.Errorf("expected empty string for currentTag, got %s", reader.currentTag)
373*ba677afaSXin Li	}
374*ba677afaSXin Li	if reader.currentValue != "" {
375*ba677afaSXin Li		t.Errorf("expected empty string for currentValue, got %s", reader.currentValue)
376*ba677afaSXin Li	}
377*ba677afaSXin Li}
378*ba677afaSXin Li
379*ba677afaSXin Lifunc TestMidtextIncludesEmptyLines(t *testing.T) {
380*ba677afaSXin Li	reader := &tvReader{}
381*ba677afaSXin Li	reader.midtext = true
382*ba677afaSXin Li	reader.currentLine = 1
383*ba677afaSXin Li	reader.currentTag = "Multiline"
384*ba677afaSXin Li	reader.currentValue = "First line\n"
385*ba677afaSXin Li
386*ba677afaSXin Li	err := reader.readNextLine("")
387*ba677afaSXin Li	if err != nil {
388*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
389*ba677afaSXin Li	}
390*ba677afaSXin Li
391*ba677afaSXin Li	if len(reader.tvList) != 0 {
392*ba677afaSXin Li		t.Errorf("expected empty tag/value list, got %v", reader.tvList)
393*ba677afaSXin Li	}
394*ba677afaSXin Li	if !reader.midtext {
395*ba677afaSXin Li		t.Errorf("expected midtext to be true, got false")
396*ba677afaSXin Li	}
397*ba677afaSXin Li	if reader.currentLine != 2 {
398*ba677afaSXin Li		t.Errorf("expected %d for currentLine, got %d", 2, reader.currentLine)
399*ba677afaSXin Li	}
400*ba677afaSXin Li	if reader.currentTag != "Multiline" {
401*ba677afaSXin Li		t.Errorf("expected %s for currentTag, got %s", "Multiline", reader.currentTag)
402*ba677afaSXin Li	}
403*ba677afaSXin Li	if reader.currentValue != "First line\n\n" {
404*ba677afaSXin Li		t.Errorf("expected %s for currentValue, got %s", "First line\n\n", reader.currentValue)
405*ba677afaSXin Li	}
406*ba677afaSXin Li}
407*ba677afaSXin Li
408*ba677afaSXin Lifunc TestReadyIgnoresWhitespaceOnlyLines(t *testing.T) {
409*ba677afaSXin Li	reader := &tvReader{}
410*ba677afaSXin Li	err := reader.readNextLine("   \t\t\t ")
411*ba677afaSXin Li	if err != nil {
412*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
413*ba677afaSXin Li	}
414*ba677afaSXin Li
415*ba677afaSXin Li	if len(reader.tvList) != 0 {
416*ba677afaSXin Li		t.Errorf("expected empty tag/value list, got %v", reader.tvList)
417*ba677afaSXin Li	}
418*ba677afaSXin Li	if reader.midtext {
419*ba677afaSXin Li		t.Errorf("expected midtext to be false, got true")
420*ba677afaSXin Li	}
421*ba677afaSXin Li	if reader.currentLine != 1 {
422*ba677afaSXin Li		t.Errorf("expected %d for currentLine, got %d", 1, reader.currentLine)
423*ba677afaSXin Li	}
424*ba677afaSXin Li	if reader.currentTag != "" {
425*ba677afaSXin Li		t.Errorf("expected empty string for currentTag, got %s", reader.currentTag)
426*ba677afaSXin Li	}
427*ba677afaSXin Li	if reader.currentValue != "" {
428*ba677afaSXin Li		t.Errorf("expected empty string for currentValue, got %s", reader.currentValue)
429*ba677afaSXin Li	}
430*ba677afaSXin Li}
431*ba677afaSXin Li
432*ba677afaSXin Lifunc TestMidtextIncludesWhitespaceOnlyLines(t *testing.T) {
433*ba677afaSXin Li	reader := &tvReader{}
434*ba677afaSXin Li	reader.midtext = true
435*ba677afaSXin Li	reader.currentLine = 1
436*ba677afaSXin Li	reader.currentTag = "Multiline"
437*ba677afaSXin Li	reader.currentValue = "First line\n"
438*ba677afaSXin Li
439*ba677afaSXin Li	err := reader.readNextLine("     \t\t ")
440*ba677afaSXin Li	if err != nil {
441*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
442*ba677afaSXin Li	}
443*ba677afaSXin Li
444*ba677afaSXin Li	if len(reader.tvList) != 0 {
445*ba677afaSXin Li		t.Errorf("expected empty tag/value list, got %v", reader.tvList)
446*ba677afaSXin Li	}
447*ba677afaSXin Li	if !reader.midtext {
448*ba677afaSXin Li		t.Errorf("expected midtext to be true, got false")
449*ba677afaSXin Li	}
450*ba677afaSXin Li	if reader.currentLine != 2 {
451*ba677afaSXin Li		t.Errorf("expected %d for currentLine, got %d", 2, reader.currentLine)
452*ba677afaSXin Li	}
453*ba677afaSXin Li	if reader.currentTag != "Multiline" {
454*ba677afaSXin Li		t.Errorf("expected %s for currentTag, got %s", "Multiline", reader.currentTag)
455*ba677afaSXin Li	}
456*ba677afaSXin Li	if reader.currentValue != "First line\n     \t\t \n" {
457*ba677afaSXin Li		t.Errorf("expected %s for currentValue, got %s", "First line\n     \t\t \n", reader.currentValue)
458*ba677afaSXin Li	}
459*ba677afaSXin Li}
460*ba677afaSXin Li
461*ba677afaSXin Lifunc TestReadyIgnoresSpacesBeforeTag(t *testing.T) {
462*ba677afaSXin Li	reader := &tvReader{}
463*ba677afaSXin Li	err := reader.readNextLine("    \t Tag:value")
464*ba677afaSXin Li	if err != nil {
465*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
466*ba677afaSXin Li	}
467*ba677afaSXin Li	if len(reader.tvList) != 1 || reader.tvList[0].tag != "Tag" || reader.tvList[0].value != "value" {
468*ba677afaSXin Li		t.Errorf("got invalid tag/value list: %v", reader.tvList)
469*ba677afaSXin Li	}
470*ba677afaSXin Li	if reader.currentLine != 1 {
471*ba677afaSXin Li		t.Errorf("expected %d for currentLine, got %d", 1, reader.currentLine)
472*ba677afaSXin Li	}
473*ba677afaSXin Li	if reader.currentTag != "" {
474*ba677afaSXin Li		t.Errorf("expected empty string for currentTag, got %s", reader.currentTag)
475*ba677afaSXin Li	}
476*ba677afaSXin Li	if reader.currentValue != "" {
477*ba677afaSXin Li		t.Errorf("expected empty string for currentValue, got %s", reader.currentValue)
478*ba677afaSXin Li	}
479*ba677afaSXin Li}
480*ba677afaSXin Li
481*ba677afaSXin Lifunc TestReadyIgnoresSpacesBeforeCommentLines(t *testing.T) {
482*ba677afaSXin Li	reader := &tvReader{}
483*ba677afaSXin Li	err := reader.readNextLine("     \t\t  # this is a comment")
484*ba677afaSXin Li	if err != nil {
485*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
486*ba677afaSXin Li	}
487*ba677afaSXin Li
488*ba677afaSXin Li	if len(reader.tvList) != 0 {
489*ba677afaSXin Li		t.Errorf("expected empty tag/value list, got %v", reader.tvList)
490*ba677afaSXin Li	}
491*ba677afaSXin Li	if reader.midtext {
492*ba677afaSXin Li		t.Errorf("expected midtext to be false, got true")
493*ba677afaSXin Li	}
494*ba677afaSXin Li	if reader.currentLine != 1 {
495*ba677afaSXin Li		t.Errorf("expected %d for currentLine, got %d", 1, reader.currentLine)
496*ba677afaSXin Li	}
497*ba677afaSXin Li	if reader.currentTag != "" {
498*ba677afaSXin Li		t.Errorf("expected empty string for currentTag, got %s", reader.currentTag)
499*ba677afaSXin Li	}
500*ba677afaSXin Li	if reader.currentValue != "" {
501*ba677afaSXin Li		t.Errorf("expected empty string for currentValue, got %s", reader.currentValue)
502*ba677afaSXin Li	}
503*ba677afaSXin Li}
504*ba677afaSXin Li
505*ba677afaSXin Lifunc TestReadyIgnoresSpacesBetweenTagAndColon(t *testing.T) {
506*ba677afaSXin Li	reader := &tvReader{}
507*ba677afaSXin Li	err := reader.readNextLine("Tag   \t :value")
508*ba677afaSXin Li	if err != nil {
509*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
510*ba677afaSXin Li	}
511*ba677afaSXin Li	if len(reader.tvList) != 1 || reader.tvList[0].tag != "Tag" || reader.tvList[0].value != "value" {
512*ba677afaSXin Li		t.Errorf("got invalid tag/value list: %v", reader.tvList)
513*ba677afaSXin Li	}
514*ba677afaSXin Li	if reader.currentLine != 1 {
515*ba677afaSXin Li		t.Errorf("expected %d for currentLine, got %d", 1, reader.currentLine)
516*ba677afaSXin Li	}
517*ba677afaSXin Li	if reader.currentTag != "" {
518*ba677afaSXin Li		t.Errorf("expected empty string for currentTag, got %s", reader.currentTag)
519*ba677afaSXin Li	}
520*ba677afaSXin Li	if reader.currentValue != "" {
521*ba677afaSXin Li		t.Errorf("expected empty string for currentValue, got %s", reader.currentValue)
522*ba677afaSXin Li	}
523*ba677afaSXin Li}
524*ba677afaSXin Li
525*ba677afaSXin Lifunc TestReadyIgnoresSpacesBetweenColonAndValue(t *testing.T) {
526*ba677afaSXin Li	reader := &tvReader{}
527*ba677afaSXin Li	err := reader.readNextLine("Tag:    \t value")
528*ba677afaSXin Li	if err != nil {
529*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
530*ba677afaSXin Li	}
531*ba677afaSXin Li	if len(reader.tvList) != 1 || reader.tvList[0].tag != "Tag" || reader.tvList[0].value != "value" {
532*ba677afaSXin Li		t.Errorf("got invalid tag/value list: %v", reader.tvList)
533*ba677afaSXin Li	}
534*ba677afaSXin Li	if reader.currentLine != 1 {
535*ba677afaSXin Li		t.Errorf("expected %d for currentLine, got %d", 1, reader.currentLine)
536*ba677afaSXin Li	}
537*ba677afaSXin Li	if reader.currentTag != "" {
538*ba677afaSXin Li		t.Errorf("expected empty string for currentTag, got %s", reader.currentTag)
539*ba677afaSXin Li	}
540*ba677afaSXin Li	if reader.currentValue != "" {
541*ba677afaSXin Li		t.Errorf("expected empty string for currentValue, got %s", reader.currentValue)
542*ba677afaSXin Li	}
543*ba677afaSXin Li}
544*ba677afaSXin Li
545*ba677afaSXin Lifunc TestReadyIgnoresSpacesAfterEndOfValue(t *testing.T) {
546*ba677afaSXin Li	reader := &tvReader{}
547*ba677afaSXin Li	err := reader.readNextLine("Tag:value   \t  ")
548*ba677afaSXin Li	if err != nil {
549*ba677afaSXin Li		t.Errorf("got error when calling readNextLine: %v", err)
550*ba677afaSXin Li	}
551*ba677afaSXin Li	if len(reader.tvList) != 1 || reader.tvList[0].tag != "Tag" || reader.tvList[0].value != "value" {
552*ba677afaSXin Li		t.Errorf("got invalid tag/value list: %v", reader.tvList)
553*ba677afaSXin Li	}
554*ba677afaSXin Li	if reader.currentLine != 1 {
555*ba677afaSXin Li		t.Errorf("expected %d for currentLine, got %d", 1, reader.currentLine)
556*ba677afaSXin Li	}
557*ba677afaSXin Li	if reader.currentTag != "" {
558*ba677afaSXin Li		t.Errorf("expected empty string for currentTag, got %s", reader.currentTag)
559*ba677afaSXin Li	}
560*ba677afaSXin Li	if reader.currentValue != "" {
561*ba677afaSXin Li		t.Errorf("expected empty string for currentValue, got %s", reader.currentValue)
562*ba677afaSXin Li	}
563*ba677afaSXin Li}
564