1package beanstalk
2
3import (
4	"fmt"
5	"io"
6	"strings"
7)
8
9type mockError struct {
10	exp []byte
11	got []byte
12}
13
14func (e mockError) Error() string {
15	return fmt.Sprintf(
16		"mock error: exp %#v, got %#v",
17		string(e.exp),
18		string(e.got),
19	)
20}
21
22type mockIO struct {
23	recv *strings.Reader
24	send *strings.Reader
25}
26
27func mock(recv, send string) io.ReadWriteCloser {
28	return &mockIO{strings.NewReader(recv), strings.NewReader(send)}
29}
30
31func (m mockIO) Read(b []byte) (int, error) {
32	return m.send.Read(b)
33}
34
35func (m mockIO) Write(got []byte) (n int, err error) {
36	exp := make([]byte, len(got))
37	n, err = m.recv.Read(exp)
38	if err != nil {
39		return n, err
40	}
41	exp = exp[:n]
42	for i := range exp {
43		if exp[i] != got[i] {
44			return i, mockError{exp, got}
45		}
46	}
47	if n != len(got) {
48		return n, mockError{exp, got}
49	}
50	return n, err
51}
52
53func (m mockIO) Close() error {
54	if m.recv.Len() == 0 && m.send.Len() == 0 {
55		return nil
56	}
57	if m.recv.Len() > 0 {
58		b := make([]byte, m.recv.Len())
59		m.recv.Read(b)
60		return mockError{b, nil}
61	}
62	b := make([]byte, m.send.Len())
63	m.send.Read(b)
64	return mockError{b, nil}
65}
66