15 func (s kv) String() string {
16 return fmt.Sprintf("{k:%q v:%q}", s.k, s.v)
19 func TestDecoder_scan(t *testing.T) {
25 {"\n\n", [][]kv{nil, nil}},
26 {`x= `, [][]kv{{{[]byte("x"), nil}}}},
27 {`y=`, [][]kv{{{[]byte("y"), nil}}}},
28 {`y`, [][]kv{{{[]byte("y"), nil}}}},
29 {`y=f`, [][]kv{{{[]byte("y"), []byte("f")}}}},
30 {"y=\"\\tf\"", [][]kv{{{[]byte("y"), []byte("\tf")}}}},
31 {"a=1\n", [][]kv{{{[]byte("a"), []byte("1")}}}},
33 `a=1 b="bar" ƒ=2h3s r="esc\t" d x=sf `,
35 {[]byte("a"), []byte("1")},
36 {[]byte("b"), []byte("bar")},
37 {[]byte("ƒ"), []byte("2h3s")},
38 {[]byte("r"), []byte("esc\t")},
40 {[]byte("x"), []byte("sf")},
46 {{[]byte("y"), []byte("f")}},
47 {{[]byte("y"), []byte("g")}},
53 {{[]byte("y"), []byte("f")}},
54 {{[]byte("y"), []byte("g")}},
62 {[]byte("y"), []byte("g")},
68 {{[]byte("y"), []byte("f")}},
69 {{[]byte("y"), []byte("g")}},
75 {[]byte("y"), []byte("f\n")},
76 {[]byte("y"), []byte("g")},
81 for _, test := range tests {
83 dec := NewDecoder(strings.NewReader(test.data))
85 for dec.ScanRecord() {
87 for dec.ScanKeyval() {
91 kvs = append(kvs, kv{k, v})
94 got = append(got, kvs)
96 if err := dec.Err(); err != nil {
97 t.Errorf("got err: %v", err)
99 if !reflect.DeepEqual(got, test.want) {
100 t.Errorf("\n in: %q\n got: %+v\nwant: %+v", test.data, got, test.want)
105 func TestDecoder_errors(t *testing.T) {
110 {"a=1\n=bar", &SyntaxError{Msg: "unexpected '='", Line: 2, Pos: 1}},
111 {"a=1\n\"k\"=bar", &SyntaxError{Msg: "unexpected '\"'", Line: 2, Pos: 1}},
112 {"a=1\nk\"ey=bar", &SyntaxError{Msg: "unexpected '\"'", Line: 2, Pos: 2}},
113 {"a=1\nk=b\"ar", &SyntaxError{Msg: "unexpected '\"'", Line: 2, Pos: 4}},
114 {"a=1\nk=b =ar", &SyntaxError{Msg: "unexpected '='", Line: 2, Pos: 5}},
115 {"a==", &SyntaxError{Msg: "unexpected '='", Line: 1, Pos: 3}},
116 {"a=1\nk=b=ar", &SyntaxError{Msg: "unexpected '='", Line: 2, Pos: 4}},
117 {"a=\"1", &SyntaxError{Msg: "unterminated quoted value", Line: 1, Pos: 5}},
118 {"a=\"1\\", &SyntaxError{Msg: "unterminated quoted value", Line: 1, Pos: 6}},
119 {"a=\"\\t1", &SyntaxError{Msg: "unterminated quoted value", Line: 1, Pos: 7}},
120 {"a=\"\\u1\"", &SyntaxError{Msg: "invalid quoted value", Line: 1, Pos: 8}},
121 {"a\ufffd=bar", &SyntaxError{Msg: "invalid key", Line: 1, Pos: 5}},
122 {"\x80=bar", &SyntaxError{Msg: "invalid key", Line: 1, Pos: 2}},
123 {"\x80", &SyntaxError{Msg: "invalid key", Line: 1, Pos: 2}},
126 for _, test := range tests {
127 dec := NewDecoder(strings.NewReader(test.data))
129 for dec.ScanRecord() {
130 for dec.ScanKeyval() {
133 if got, want := dec.Err(), test.want; !reflect.DeepEqual(got, want) {
134 t.Errorf("got: %v, want: %v", got, want)
139 func TestDecoder_decode_encode(t *testing.T) {
151 "a=1 b=\"bar\" ƒ=2h3s r=\"esc\\t\" d x=sf ",
152 "a=1 b=bar ƒ=2h3s r=\"esc\\t\" d= x=sf\n",
156 for _, test := range tests {
157 dec := NewDecoder(strings.NewReader(test.in))
158 buf := bytes.Buffer{}
159 enc := NewEncoder(&buf)
163 for dec.ScanRecord() && err == nil {
164 for dec.ScanKeyval() {
165 if dec.Key() == nil {
168 if err = enc.EncodeKeyval(dec.Key(), dec.Value()); err != nil {
178 t.Errorf("got err: %v", err)
180 if got, want := buf.String(), test.out; got != want {
181 t.Errorf("\n got: %q\nwant: %q", got, want)