@@ -45,26 +45,73 @@ func (f *mockFile) Read(p []byte) (int, error) {
4545 }
4646}
4747
48+ func collectLines (linechan chan string ) []string {
49+ lines := []string {}
50+ for {
51+ select {
52+ case line := <- linechan :
53+ lines = append (lines , line )
54+ default :
55+ return lines
56+ }
57+ }
58+ }
59+
4860func TestLineReader (t * testing.T ) {
49- file := NewMockFile ("This is l" , "ine 1\n " , "This is line two\n This is line three\n " , "This " , "is " , "line 4" , "\n " , "\n " )
50- reader := NewBufferedLineReader ()
51-
52- lines , err := reader .ReadAvailableLines (file )
53- expectEmpty (t , lines , err )
54- lines , err = reader .ReadAvailableLines (file )
55- expectLines (t , lines , err , "This is line 1" )
56- lines , err = reader .ReadAvailableLines (file )
57- expectLines (t , lines , err , "This is line two" , "This is line three" )
58- lines , err = reader .ReadAvailableLines (file ) // This
59- expectEmpty (t , lines , err )
60- lines , err = reader .ReadAvailableLines (file ) // is
61- expectEmpty (t , lines , err )
62- lines , err = reader .ReadAvailableLines (file ) // line 4
63- expectEmpty (t , lines , err )
64- lines , err = reader .ReadAvailableLines (file ) // \n
65- expectLines (t , lines , err , "This is line 4" )
66- lines , err = reader .ReadAvailableLines (file ) // \n
67- expectLines (t , lines , err , "" )
61+ file := NewMockFile ("This is l" , "ine 1\n " , "This is line two\n This is line three\n " , "This " , "is " , "line 4" , "\n " , "\n " , "\n " )
62+
63+ done := make (chan struct {})
64+ linechan := make (chan string , 20 )
65+
66+ reader := NewBufferedLineReader (linechan , done )
67+
68+ finished , err := reader .ReadAvailableLines (file )
69+ expectEmpty (t , collectLines (linechan ), err )
70+ expectNotFinished (t , finished )
71+
72+ finished , err = reader .ReadAvailableLines (file )
73+ expectLines (t , collectLines (linechan ), err , "This is line 1" )
74+ expectNotFinished (t , finished )
75+
76+ finished , err = reader .ReadAvailableLines (file )
77+ expectLines (t , collectLines (linechan ), err , "This is line two" , "This is line three" )
78+ expectNotFinished (t , finished )
79+
80+ finished , err = reader .ReadAvailableLines (file ) // This
81+ expectEmpty (t , collectLines (linechan ), err )
82+ expectNotFinished (t , finished )
83+
84+ finished , err = reader .ReadAvailableLines (file ) // is
85+ expectEmpty (t , collectLines (linechan ), err )
86+ expectNotFinished (t , finished )
87+
88+ finished , err = reader .ReadAvailableLines (file ) // line 4
89+ expectEmpty (t , collectLines (linechan ), err )
90+ expectNotFinished (t , finished )
91+
92+ finished , err = reader .ReadAvailableLines (file ) // \n
93+ expectLines (t , collectLines (linechan ), err , "This is line 4" )
94+ expectNotFinished (t , finished )
95+
96+ finished , err = reader .ReadAvailableLines (file ) // \n
97+ expectLines (t , collectLines (linechan ), err , "" )
98+ expectNotFinished (t , finished )
99+
100+ close (done )
101+ finished , err = reader .ReadAvailableLines (file ) // \n
102+ expectFinished (t , finished )
103+ }
104+
105+ func expectNotFinished (t * testing.T , finished bool ) {
106+ if finished {
107+ t .Error ("expected to be not finished, but finished" )
108+ }
109+ }
110+
111+ func expectFinished (t * testing.T , finished bool ) {
112+ if ! finished {
113+ t .Error ("expected to be finished, but not finished" )
114+ }
68115}
69116
70117func expectEmpty (t * testing.T , lines []string , err error ) {
0 commit comments