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