Enabling unit testing

This commit is contained in:
laurentu 2022-03-25 11:31:15 +01:00
parent d6958291fb
commit 35a76ae752
2 changed files with 90 additions and 18 deletions

View File

@ -41,47 +41,51 @@ func (parser *CsvParser) Init() {
parser.Delimiter = " \t"
}
func (parser *CsvParser) ExtractEnclosedFieldValue(line string, endChar byte) (string, error) {
lineLen := len(line)
func (parser *CsvParser) ExtractEnclosedFieldValue(endChar byte) error {
lineLen := len(parser.Line)
for i := 1; i < lineLen; i++ {
if line[i] == endChar && line[i-1] != '\\' {
parser.Fields = append(parser.Fields, line[1:i])
return line[i+1:], nil
if parser.Line[i] == endChar && parser.Line[i-1] != '\\' {
parser.Fields = append(parser.Fields, parser.Line[0:i])
parser.Line = parser.Line[i+1:]
return nil
}
}
return line, errors.New("Encloser close not found")
return errors.New("Encloser close not found")
}
func (parser *CsvParser) Parse(line string) error {
func (parser *CsvParser) Parse(CsvLine string) error {
var err error = nil
for len(line) > 0 {
line = strings.TrimLeft(line, parser.Delimiter)
line = strings.TrimRight(line, parser.Delimiter)
if len(line) == 0 {
parser.Fields = make([]string,0)
parser.Line = CsvLine
for len(parser.Line) > 0 {
parser.Line = strings.TrimLeft(parser.Line, parser.Delimiter)
parser.Line = strings.TrimRight(parser.Line, parser.Delimiter)
if len(parser.Line) == 0 {
break
}
// Search for an encloser
encloserId := None
for _, id := range parser.Enclosers {
if line[0] == EnclosersRunes[id].Open {
if parser.Line[0] == EnclosersRunes[id].Open {
encloserId = id
break
}
}
if encloserId != None {
line, err = parser.ExtractEnclosedFieldValue(line, EnclosersRunes[encloserId].Close)
parser.Line = parser.Line[1:]
err = parser.ExtractEnclosedFieldValue(EnclosersRunes[encloserId].Close)
if err != nil {
return err
}
} else {
nextSpace := strings.IndexAny(line, parser.Delimiter)
nextSpace := strings.IndexAny(parser.Line, parser.Delimiter)
if nextSpace != -1 {
parser.Fields = append(parser.Fields, line[:nextSpace])
line = line[nextSpace:]
parser.Fields = append(parser.Fields, parser.Line[:nextSpace])
parser.Line = parser.Line[nextSpace:]
} else {
parser.Fields = append(parser.Fields, line)
line = ""
parser.Fields = append(parser.Fields, parser.Line)
parser.Line = ""
break
}

68
csv-parser_test.go Normal file
View File

@ -0,0 +1,68 @@
package csvparser
import(
"testing"
)
func TestParse(t *testing.T) {
var parser CsvParser
var CsvTestValues = [...]string {
"field1 field2 field3", // standard CSV
" field1 field2 field3 ", // Space or multiple spaces as delimiters
" field1 field2 field3 ", // Spaces + tabs as delimiters
" \"field1\" field2 field3 ", // Enclosed fields
" \"field1\" field2 [field3] ", // Enclosed fields
}
var CsvExpectedValues = [...]string {
"field1",
"field2",
"field3",
}
parser.Init()
for _, v := range CsvTestValues {
err := parser.Parse(v)
if err != nil {
t.Error("Parse error:", err, " in ", v)
}
if len(parser.Fields) != len(CsvExpectedValues) {
t.Error("Extracted field number does not match expected", parser.Fields)
}
for i,val := range CsvExpectedValues {
if parser.Fields[i] != val {
t.Error("Field values do not match", i, " ", val, " ", parser.Fields[i])
}
}
}
}
func TestParseWithEscape(t *testing.T) {
var parser CsvParser
var CsvTestValues = [...]string {
"\"\\\"field1\" field2 [\\[field3] ", // Enclosed fields
}
var CsvExpectedValues = [...]string {
"\"field1",
"field2",
"[field3",
}
parser.Init()
for _, v := range CsvTestValues {
err := parser.Parse(v)
if err != nil {
t.Error("Parse error:", err, " in ", v)
}
if len(parser.Fields) != len(CsvExpectedValues) {
t.Error("Extracted field number does not match expected", parser.Fields)
}
for i,val := range CsvExpectedValues {
if parser.Fields[i] != val {
t.Error("Field values do not match", i, " ", val, " ", parser.Fields[i])
}
}
}
}