Skip to content

Commit f5c418b

Browse files
committed
test: improve parse coverage
1 parent 33bd6db commit f5c418b

File tree

3 files changed

+87
-9
lines changed

3 files changed

+87
-9
lines changed

include_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,17 @@ func TestIncludeUnbalanced(t *testing.T) {
3333
t.Fatal(err)
3434
}
3535
}
36+
37+
func TestIncludeNonExistant(t *testing.T) {
38+
_, err := ParseLedgerFile("testdata/ledgerRootNonExist.dat")
39+
if err.Error() != "testdata/ledgerRootNonExist.dat:3: Unable to include file(ledger-xxxxx.dat): not found" {
40+
t.Fatal(err)
41+
}
42+
}
43+
44+
func TestNonExistant(t *testing.T) {
45+
_, err := ParseLedgerFile("testdata/ledger-xxxxx.dat")
46+
if err.Error() != "open testdata/ledger-xxxxx.dat: no such file or directory" {
47+
t.Fatal(err)
48+
}
49+
}

parse.go

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package ledger
22

33
import (
44
"bufio"
5+
"errors"
56
"fmt"
67
"io"
78
"os"
@@ -69,6 +70,8 @@ func ParseLedgerAsync(ledgerReader io.Reader) (c chan *Transaction, e chan error
6970
})
7071

7172
e <- nil
73+
close(c)
74+
close(e)
7275
}()
7376
return c, e
7477
}
@@ -128,17 +131,13 @@ func parseLedger(filename string, ledgerReader io.Reader, callback func(t *Trans
128131
case "account":
129132
lp.parseAccount(after)
130133
case "include":
131-
paths, perr := filepath.Glob(filepath.Join(filepath.Dir(lp.filename), after))
132-
if perr != nil {
133-
callback(nil, fmt.Errorf("%s:%d: Unable to parse include directive: %w", lp.filename, lp.lineCount, perr))
134-
return
134+
paths, _ := filepath.Glob(filepath.Join(filepath.Dir(lp.filename), after))
135+
if len(paths) < 1 {
136+
callback(nil, fmt.Errorf("%s:%d: Unable to include file(%s): %w", lp.filename, lp.lineCount, after, errors.New("not found")))
137+
return true
135138
}
136139
for _, incpath := range paths {
137-
ifile, ierr := os.Open(incpath)
138-
if ierr != nil {
139-
callback(nil, fmt.Errorf("%s:%d: Unable to include file(%s): %w", lp.filename, lp.lineCount, incpath, ierr))
140-
return true
141-
}
140+
ifile, _ := os.Open(incpath)
142141
defer ifile.Close()
143142
if parseLedger(incpath, ifile, callback) {
144143
return true

parse_test.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"bytes"
55
"encoding/json"
66
"errors"
7+
"sync"
78
"testing"
89
"time"
910

@@ -42,6 +43,24 @@ var testCases = []testCase{
4243
},
4344
nil,
4445
},
46+
{
47+
"bad payee line",
48+
`1970/01/01Payee
49+
Expense/test (123 * 3)
50+
Assets 123
51+
`,
52+
nil,
53+
errors.New(":1: Unable to parse transaction: Unable to parse payee line: 1970/01/01Payee"),
54+
},
55+
{
56+
"bad payee date",
57+
`1970/02/31 Payee
58+
Expense/test (123 * 3)
59+
Assets 123
60+
`,
61+
nil,
62+
errors.New(`:1: Unable to parse transaction: Unable to parse date(1970/02/31): parsing time "1970/02/31": extra text: "1970/02/31"`),
63+
},
4564
{
4665
"unbalanced error",
4766
`1970/01/01 Payee
@@ -452,6 +471,52 @@ func TestParseLedger(t *testing.T) {
452471
}
453472
}
454473

474+
func TestParseLedgerAsync(t *testing.T) {
475+
buf := bytes.NewBufferString(`; test
476+
account bam:bam
477+
subacc line ; sub comment
478+
another subacc line
479+
480+
1970/01/01 Payee
481+
Assets 50
482+
Expenses
483+
484+
1970/02/30 Error ; oops
485+
Assets 30
486+
Expenses
487+
488+
1970/01/01bbafafdaf;bad comment
489+
Assets 20
490+
Expenses
491+
492+
account endofledger`)
493+
494+
tc, ec := ParseLedgerAsync(buf)
495+
496+
var trans []*Transaction
497+
var errors []error
498+
499+
var wg sync.WaitGroup
500+
wg.Add(2)
501+
go func() {
502+
for t := range tc {
503+
trans = append(trans, t)
504+
}
505+
wg.Done()
506+
}()
507+
go func() {
508+
for e := range ec {
509+
errors = append(errors, e)
510+
}
511+
wg.Done()
512+
}()
513+
wg.Wait()
514+
515+
if len(trans) < 1 || len(errors) < 1 {
516+
t.Error("async parse failed")
517+
}
518+
}
519+
455520
func BenchmarkParseLedger(b *testing.B) {
456521
for n := 0; n < b.N; n++ {
457522
_, _ = ParseLedgerFile("testdata/ledgerBench.dat")

0 commit comments

Comments
 (0)