From 50b47dce4b3f881f69c3287b868e7b1d98d77bc1 Mon Sep 17 00:00:00 2001 From: Emir Pasic Date: Mon, 6 Mar 2017 01:28:09 +0100 Subject: [PATCH] - JSON serialization for all sets --- sets/hashset/hashset_test.go | 26 ++++++++++++++++++++++++++ sets/hashset/serialization.go | 31 +++++++++++++++++++++++++++++++ sets/treeset/serialization.go | 31 +++++++++++++++++++++++++++++++ sets/treeset/treeset_test.go | 26 ++++++++++++++++++++++++++ 4 files changed, 114 insertions(+) create mode 100644 sets/hashset/serialization.go create mode 100644 sets/treeset/serialization.go diff --git a/sets/hashset/hashset_test.go b/sets/hashset/hashset_test.go index b868631..280a6b3 100644 --- a/sets/hashset/hashset_test.go +++ b/sets/hashset/hashset_test.go @@ -62,6 +62,32 @@ func TestSetRemove(t *testing.T) { } } +func TestSetSerialization(t *testing.T) { + set := New() + set.Add("a", "b", "c") + + var err error + assert := func() { + if actualValue, expectedValue := set.Size(), 3; actualValue != expectedValue { + t.Errorf("Got %v expected %v", actualValue, expectedValue) + } + if actualValue := set.Contains("a", "b", "c"); actualValue != true { + t.Errorf("Got %v expected %v", actualValue, true) + } + if err != nil { + t.Errorf("Got error %v", err) + } + } + + assert() + + json, err := set.ToJSON() + assert() + + err = set.FromJSON(json) + assert() +} + func benchmarkContains(b *testing.B, set *Set, size int) { for i := 0; i < b.N; i++ { for n := 0; n < size; n++ { diff --git a/sets/hashset/serialization.go b/sets/hashset/serialization.go new file mode 100644 index 0000000..af7bfe8 --- /dev/null +++ b/sets/hashset/serialization.go @@ -0,0 +1,31 @@ +// Copyright (c) 2015, Emir Pasic. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package hashset + +import ( + "encoding/json" + "github.com/emirpasic/gods/containers" +) + +func assertSerializationImplementation() { + var _ containers.JSONSerializer = (*Set)(nil) + var _ containers.JSONDeserializer = (*Set)(nil) +} + +// ToJSON outputs the JSON representation of list's elements. +func (set *Set) ToJSON() ([]byte, error) { + return json.Marshal(set.Values()) +} + +// FromJSON populates list's elements from the input JSON representation. +func (set *Set) FromJSON(data []byte) error { + elements := []interface{}{} + err := json.Unmarshal(data, &elements) + if err == nil { + set.Clear() + set.Add(elements...) + } + return err +} diff --git a/sets/treeset/serialization.go b/sets/treeset/serialization.go new file mode 100644 index 0000000..10b1599 --- /dev/null +++ b/sets/treeset/serialization.go @@ -0,0 +1,31 @@ +// Copyright (c) 2015, Emir Pasic. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package treeset + +import ( + "encoding/json" + "github.com/emirpasic/gods/containers" +) + +func assertSerializationImplementation() { + var _ containers.JSONSerializer = (*Set)(nil) + var _ containers.JSONDeserializer = (*Set)(nil) +} + +// ToJSON outputs the JSON representation of list's elements. +func (set *Set) ToJSON() ([]byte, error) { + return json.Marshal(set.Values()) +} + +// FromJSON populates list's elements from the input JSON representation. +func (set *Set) FromJSON(data []byte) error { + elements := []interface{}{} + err := json.Unmarshal(data, &elements) + if err == nil { + set.Clear() + set.Add(elements...) + } + return err +} diff --git a/sets/treeset/treeset_test.go b/sets/treeset/treeset_test.go index 881adc2..0f4b667 100644 --- a/sets/treeset/treeset_test.go +++ b/sets/treeset/treeset_test.go @@ -327,6 +327,32 @@ func TestSetIteratorLast(t *testing.T) { } } +func TestSetSerialization(t *testing.T) { + set := NewWithStringComparator() + set.Add("a", "b", "c") + + var err error + assert := func() { + if actualValue, expectedValue := set.Size(), 3; actualValue != expectedValue { + t.Errorf("Got %v expected %v", actualValue, expectedValue) + } + if actualValue := set.Contains("a", "b", "c"); actualValue != true { + t.Errorf("Got %v expected %v", actualValue, true) + } + if err != nil { + t.Errorf("Got error %v", err) + } + } + + assert() + + json, err := set.ToJSON() + assert() + + err = set.FromJSON(json) + assert() +} + func benchmarkContains(b *testing.B, set *Set, size int) { for i := 0; i < b.N; i++ { for n := 0; n < size; n++ {