Merge branch 'jsonlist' into 'master'
Add jsonlist task See merge request slon/shad-go-private!28
This commit is contained in:
commit
ce8a26a0ea
3 changed files with 86 additions and 0 deletions
11
jsonlist/README.md
Normal file
11
jsonlist/README.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
# jsonlist
|
||||
|
||||
Обычные функции `json.Marshal` и `json.Unmashal` работают с одним `json` объектом.
|
||||
|
||||
Иногда возникает ситуация, что вместо одного объекта, вам нужно передать последовательность объектов
|
||||
разделённый пробельными символами. Например: `{"A": 1} {"B": 2} {"C": 3}`. Такую последовательность
|
||||
можно прочитать используя `json.Decoder`, и можно записать используя `json.Encoder`.
|
||||
|
||||
Реализуйте функции `Marshal` и `Unmarhsal`, которые работают со слайсом значений, и
|
||||
совершают подобное преобразование. По аналогии с пакетом `json`, функция `Marshal` принимает
|
||||
вторым аргументом слайс, а функция `Unmarshal` - указатель на слайс.
|
13
jsonlist/jsonlist.go
Normal file
13
jsonlist/jsonlist.go
Normal file
|
@ -0,0 +1,13 @@
|
|||
// +build !solution
|
||||
|
||||
package jsonlist
|
||||
|
||||
import "io"
|
||||
|
||||
func Marshal(w io.Writer, slice interface{}) error {
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func Unmarshal(r io.Reader, slice interface{}) error {
|
||||
panic("implement me")
|
||||
}
|
62
jsonlist/jsonlist_test.go
Normal file
62
jsonlist/jsonlist_test.go
Normal file
|
@ -0,0 +1,62 @@
|
|||
package jsonlist
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
type S struct {
|
||||
A string
|
||||
B int
|
||||
C interface{}
|
||||
}
|
||||
|
||||
func TestJsonList(t *testing.T) {
|
||||
for _, test := range []struct {
|
||||
js string
|
||||
value interface{}
|
||||
}{
|
||||
{
|
||||
js: `1 2 3`,
|
||||
value: []int{1, 2, 3},
|
||||
},
|
||||
{
|
||||
js: `"A" "B" "C"`,
|
||||
value: []string{"A", "B", "C"},
|
||||
},
|
||||
{
|
||||
js: `{"A": "A"} {"B": 2} {"C": 0.5}`,
|
||||
value: []S{{A: "A"}, {B: 2}, {C: 0.5}},
|
||||
},
|
||||
{
|
||||
js: `"A" 2`,
|
||||
value: []interface{}{"A", 2.0},
|
||||
},
|
||||
} {
|
||||
t.Run(test.js, func(t *testing.T) {
|
||||
emptySlice := reflect.New(reflect.TypeOf(test.value))
|
||||
|
||||
require.NoError(t, Unmarshal(bytes.NewBufferString(test.js), emptySlice.Interface()))
|
||||
require.Equal(t, test.value, emptySlice.Elem().Interface())
|
||||
|
||||
var buf bytes.Buffer
|
||||
require.NoError(t, Marshal(&buf, test.value))
|
||||
|
||||
emptySlice = reflect.New(reflect.TypeOf(test.value))
|
||||
|
||||
require.NoError(t, Unmarshal(&buf, emptySlice.Interface()))
|
||||
require.Equal(t, test.value, emptySlice.Elem().Interface())
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestErrors(t *testing.T) {
|
||||
var buf bytes.Buffer
|
||||
|
||||
require.Equal(t, &json.UnsupportedTypeError{Type: reflect.TypeOf([]int{})}, Unmarshal(&buf, []int{}))
|
||||
require.Equal(t, &json.UnsupportedTypeError{Type: reflect.TypeOf(1)}, Marshal(&buf, 1))
|
||||
}
|
Loading…
Reference in a new issue