Enabling unit testing
This commit is contained in:
parent
d6958291fb
commit
35a76ae752
|
@ -41,47 +41,51 @@ func (parser *CsvParser) Init() {
|
||||||
parser.Delimiter = " \t"
|
parser.Delimiter = " \t"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (parser *CsvParser) ExtractEnclosedFieldValue(line string, endChar byte) (string, error) {
|
func (parser *CsvParser) ExtractEnclosedFieldValue(endChar byte) error {
|
||||||
lineLen := len(line)
|
lineLen := len(parser.Line)
|
||||||
for i := 1; i < lineLen; i++ {
|
for i := 1; i < lineLen; i++ {
|
||||||
if line[i] == endChar && line[i-1] != '\\' {
|
if parser.Line[i] == endChar && parser.Line[i-1] != '\\' {
|
||||||
parser.Fields = append(parser.Fields, line[1:i])
|
parser.Fields = append(parser.Fields, parser.Line[0:i])
|
||||||
return line[i+1:], nil
|
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
|
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
|
break
|
||||||
}
|
}
|
||||||
// Search for an encloser
|
// Search for an encloser
|
||||||
encloserId := None
|
encloserId := None
|
||||||
for _, id := range parser.Enclosers {
|
for _, id := range parser.Enclosers {
|
||||||
if line[0] == EnclosersRunes[id].Open {
|
if parser.Line[0] == EnclosersRunes[id].Open {
|
||||||
encloserId = id
|
encloserId = id
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if encloserId != None {
|
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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
nextSpace := strings.IndexAny(line, parser.Delimiter)
|
nextSpace := strings.IndexAny(parser.Line, parser.Delimiter)
|
||||||
if nextSpace != -1 {
|
if nextSpace != -1 {
|
||||||
parser.Fields = append(parser.Fields, line[:nextSpace])
|
parser.Fields = append(parser.Fields, parser.Line[:nextSpace])
|
||||||
line = line[nextSpace:]
|
parser.Line = parser.Line[nextSpace:]
|
||||||
} else {
|
} else {
|
||||||
parser.Fields = append(parser.Fields, line)
|
parser.Fields = append(parser.Fields, parser.Line)
|
||||||
line = ""
|
parser.Line = ""
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue