pkg.re/essentialkaos/ek.v11@v12.41.0+incompatible/csv/csv_test.go (about) 1 package csv 2 3 // ////////////////////////////////////////////////////////////////////////////////// // 4 // // 5 // Copyright (c) 2022 ESSENTIAL KAOS // 6 // Apache License, Version 2.0 <https://www.apache.org/licenses/LICENSE-2.0> // 7 // // 8 // ////////////////////////////////////////////////////////////////////////////////// // 9 10 import ( 11 "io" 12 "io/ioutil" 13 "os" 14 "testing" 15 16 . "pkg.re/essentialkaos/check.v1" 17 ) 18 19 // ////////////////////////////////////////////////////////////////////////////////// // 20 21 const _DATA = `123,ABC,A_C,A C, 22 123,ABC, 23 123,ABC,A_C,A C,123,ABC,A_C,A C 24 ` 25 26 // ////////////////////////////////////////////////////////////////////////////////// // 27 28 func Test(t *testing.T) { TestingT(t) } 29 30 type CSVSuite struct { 31 dataFile string 32 } 33 34 // ////////////////////////////////////////////////////////////////////////////////// // 35 36 var _ = Suite(&CSVSuite{}) 37 38 // ////////////////////////////////////////////////////////////////////////////////// // 39 40 func (s *CSVSuite) SetUpSuite(c *C) { 41 tmpDir := c.MkDir() 42 43 s.dataFile = tmpDir + "/data.csv" 44 45 err := ioutil.WriteFile(s.dataFile, []byte(_DATA), 0644) 46 47 if err != nil { 48 c.Fatal(err.Error()) 49 } 50 } 51 52 func (s *CSVSuite) TestRead(c *C) { 53 fd, err := os.Open(s.dataFile) 54 55 c.Assert(err, IsNil) 56 c.Assert(fd, NotNil) 57 58 defer fd.Close() 59 60 reader := NewReader(fd) 61 reader.Comma = ',' 62 63 count := 0 64 65 for { 66 rec, err := reader.Read() 67 68 if err == io.EOF { 69 break 70 } 71 72 switch count { 73 case 0: 74 c.Assert(rec, HasLen, 5) 75 c.Assert(rec, DeepEquals, []string{"123", "ABC", "A_C", "A C", ""}) 76 case 1: 77 c.Assert(rec, HasLen, 3) 78 c.Assert(rec, DeepEquals, []string{"123", "ABC", ""}) 79 case 2: 80 c.Assert(rec, HasLen, 8) 81 c.Assert(rec, DeepEquals, []string{"123", "ABC", "A_C", "A C", "123", "ABC", "A_C", "A C"}) 82 } 83 84 count++ 85 } 86 } 87 88 func (s *CSVSuite) TestReadTo(c *C) { 89 fd, err := os.Open(s.dataFile) 90 91 c.Assert(err, IsNil) 92 c.Assert(fd, NotNil) 93 94 defer fd.Close() 95 96 reader := NewReader(fd) 97 reader.Comma = ',' 98 99 count := 0 100 101 var rec []string 102 103 for { 104 err := reader.ReadTo(rec) 105 106 if rec == nil { 107 c.Assert(err, NotNil) 108 rec = make([]string, 8) 109 continue 110 } 111 112 if err == io.EOF { 113 break 114 } 115 116 switch count { 117 case 0: 118 c.Assert(rec, DeepEquals, []string{"123", "ABC", "A_C", "A C", "", "", "", ""}) 119 case 1: 120 c.Assert(rec, DeepEquals, []string{"123", "ABC", "", "", "", "", "", ""}) 121 case 2: 122 c.Assert(rec, DeepEquals, []string{"123", "ABC", "A_C", "A C", "123", "ABC", "A_C", "A C"}) 123 } 124 125 count++ 126 } 127 } 128 129 func (s *CSVSuite) TestLineParser(c *C) { 130 data := make([]string, 2) 131 132 parseAndFill("ABCD", data, ";") 133 c.Assert(data, DeepEquals, []string{"ABCD", ""}) 134 135 parseAndFill("", data, ";") 136 c.Assert(data, DeepEquals, []string{"", ""}) 137 138 parseAndFill("A;B;C;D;E", data, ";") 139 c.Assert(data, DeepEquals, []string{"A", "B"}) 140 } 141 142 func (s *CSVSuite) BenchmarkRead(c *C) { 143 fd, _ := os.Open(s.dataFile) 144 145 for i := 0; i < c.N; i++ { 146 reader := NewReader(fd) 147 reader.Comma = ',' 148 149 for { 150 _, err := reader.Read() 151 152 if err == io.EOF { 153 break 154 } 155 } 156 } 157 158 fd.Close() 159 } 160 161 func (s *CSVSuite) BenchmarkReadTo(c *C) { 162 fd, _ := os.Open(s.dataFile) 163 164 for i := 0; i < c.N; i++ { 165 reader := NewReader(fd) 166 reader.Comma = ',' 167 168 k := make([]string, 10) 169 170 for { 171 err := reader.ReadTo(k) 172 173 if err == io.EOF { 174 break 175 } 176 } 177 } 178 179 fd.Close() 180 }