From a270d1ed876750d08ae58d6bd08494cfa5cbf30e Mon Sep 17 00:00:00 2001 From: Fedor Korotkiy Date: Wed, 15 Apr 2020 23:52:59 +0300 Subject: [PATCH 1/2] Add jsonlist task --- jsonlist/README.md | 11 ++++++++ jsonlist/jsonlist.go | 13 ++++++++++ jsonlist/jsonlist_test.go | 54 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 jsonlist/README.md create mode 100644 jsonlist/jsonlist.go create mode 100644 jsonlist/jsonlist_test.go diff --git a/jsonlist/README.md b/jsonlist/README.md new file mode 100644 index 0000000..d419281 --- /dev/null +++ b/jsonlist/README.md @@ -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` - указатель на слайс. diff --git a/jsonlist/jsonlist.go b/jsonlist/jsonlist.go new file mode 100644 index 0000000..d4ffeb5 --- /dev/null +++ b/jsonlist/jsonlist.go @@ -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") +} diff --git a/jsonlist/jsonlist_test.go b/jsonlist/jsonlist_test.go new file mode 100644 index 0000000..81418f2 --- /dev/null +++ b/jsonlist/jsonlist_test.go @@ -0,0 +1,54 @@ +package jsonlist + +import ( + "bytes" + "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(bytes.NewBufferString(test.js), emptySlice.Interface())) + require.Equal(t, test.value, emptySlice.Elem().Interface()) + }) + } +} From 63272619d90d354c5c52f3c9160237cf7d0dd218 Mon Sep 17 00:00:00 2001 From: Fedor Korotkiy Date: Thu, 16 Apr 2020 15:14:19 +0300 Subject: [PATCH 2/2] Check errors --- jsonlist/jsonlist_test.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/jsonlist/jsonlist_test.go b/jsonlist/jsonlist_test.go index 81418f2..e9d9a02 100644 --- a/jsonlist/jsonlist_test.go +++ b/jsonlist/jsonlist_test.go @@ -2,6 +2,7 @@ package jsonlist import ( "bytes" + "encoding/json" "reflect" "testing" @@ -47,8 +48,15 @@ func TestJsonList(t *testing.T) { emptySlice = reflect.New(reflect.TypeOf(test.value)) - require.NoError(t, Unmarshal(bytes.NewBufferString(test.js), emptySlice.Interface())) + 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)) +}