From 1358c73e4e4381e0aaf235d4287e114a1386303b Mon Sep 17 00:00:00 2001 From: Patrick Marabeas Date: Mon, 19 Aug 2019 15:34:20 +1000 Subject: [PATCH] Copy from upstream/06_puppy/patrickmarabeas Lab 07 (#589) --- 07_errors/patrickmarabeas/main.go | 5 ++ 07_errors/patrickmarabeas/main_test.go | 25 +++++++ 07_errors/patrickmarabeas/mapStore.go | 51 +++++++++++++++ 07_errors/patrickmarabeas/store_test.go | 87 +++++++++++++++++++++++++ 07_errors/patrickmarabeas/syncStore.go | 50 ++++++++++++++ 07_errors/patrickmarabeas/types.go | 29 +++++++++ 6 files changed, 247 insertions(+) create mode 100644 07_errors/patrickmarabeas/main.go create mode 100644 07_errors/patrickmarabeas/main_test.go create mode 100644 07_errors/patrickmarabeas/mapStore.go create mode 100644 07_errors/patrickmarabeas/store_test.go create mode 100644 07_errors/patrickmarabeas/syncStore.go create mode 100644 07_errors/patrickmarabeas/types.go diff --git a/07_errors/patrickmarabeas/main.go b/07_errors/patrickmarabeas/main.go new file mode 100644 index 000000000..790580777 --- /dev/null +++ b/07_errors/patrickmarabeas/main.go @@ -0,0 +1,5 @@ +package main + +func main() { + +} diff --git a/07_errors/patrickmarabeas/main_test.go b/07_errors/patrickmarabeas/main_test.go new file mode 100644 index 000000000..c98b5b046 --- /dev/null +++ b/07_errors/patrickmarabeas/main_test.go @@ -0,0 +1,25 @@ +package main + +import ( + "bytes" + "io" + "os" + "testing" +) + +var out io.Writer = os.Stdout + +func TestMainOutput(t *testing.T) { + var buf bytes.Buffer + out = &buf + + main() + + expected := "" + + got := buf.String() + + if expected != got { + t.Errorf("\nExpected: %s\nGot: %s", expected, got) + } +} diff --git a/07_errors/patrickmarabeas/mapStore.go b/07_errors/patrickmarabeas/mapStore.go new file mode 100644 index 000000000..187bb55d3 --- /dev/null +++ b/07_errors/patrickmarabeas/mapStore.go @@ -0,0 +1,51 @@ +package main + +// NewMapStore returns a pointer to a new instance of the MapStore struct which implements the Storer interface. +func NewMapStore() Storer { + return &MapStore{ + uuid: 0, + store: map[int]Puppy{}, + } +} + +// Create increments the uuid and adds the provided Puppy struct to the store with this identifier. +func (store *MapStore) Create(puppy Puppy) int { + puppy.ID = store.uuid + store.store[puppy.ID] = puppy + store.uuid++ + + return puppy.ID +} + +// Read returns the puppy matching the provided uuid. +// An empty Puppy struct is returned if the identifier does not exist. +func (store *MapStore) Read(id int) Puppy { + if _, ok := store.store[id]; ok { + return store.store[id] + } + + return Puppy{} +} + +// Update modifies the puppy matching the provided uuid in the store with the provided Puppy struct. +// It returns a bool whether a matching identifier was modified or not. +func (store *MapStore) Update(id int, puppy Puppy) bool { + if _, ok := store.store[id]; !ok { + return false + } + + puppy.ID = id + store.store[id] = puppy + return true +} + +// Destroy removes the puppy matching the provided uuid from the store. +// It returns a bool whether a matching identifier was deleted or not. +func (store *MapStore) Destroy(id int) bool { + if _, ok := store.store[id]; !ok { + return false + } + + delete(store.store, id) + return true +} diff --git a/07_errors/patrickmarabeas/store_test.go b/07_errors/patrickmarabeas/store_test.go new file mode 100644 index 000000000..bb9899ed1 --- /dev/null +++ b/07_errors/patrickmarabeas/store_test.go @@ -0,0 +1,87 @@ +package main + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" +) + +type StoreSuite struct { + suite.Suite + store Storer +} + +func (suite *StoreSuite) TestCreate() { + a := assert.New(suite.T()) + id := suite.store.Create(Puppy{Breed: "Wolf", Color: "Grey", Value: "450"}) + + a.Equal(id, 0) +} + +func (suite *StoreSuite) TestCreateSecond() { + a := assert.New(suite.T()) + id := suite.store.Create(Puppy{Breed: "Boxer", Color: "Brown", Value: "300"}) + + a.Equal(id, 1) +} + +func (suite *StoreSuite) TestRead() { + a := assert.New(suite.T()) + data := suite.store.Read(0) + + a.Equal(data, Puppy{ID: 0, Breed: "Wolf", Color: "Grey", Value: "450"}) +} + +func (suite *StoreSuite) TestReadNonExistent() { + a := assert.New(suite.T()) + success := suite.store.Read(100) + + a.Equal(success, Puppy{}) +} + +func (suite *StoreSuite) TestUpdate() { + a := assert.New(suite.T()) + success := suite.store.Update(0, Puppy{Breed: "Doberman", Color: "Black", Value: "500"}) + data := suite.store.Read(0) + + a.Equal(success, true) + a.Equal(data, Puppy{ID: 0, Breed: "Doberman", Color: "Black", Value: "500"}) +} + +func (suite *StoreSuite) TestUpdateNonExistent() { + a := assert.New(suite.T()) + success := suite.store.Update(100, Puppy{Breed: "Doberman", Color: "Black", Value: "500"}) + + a.Equal(success, false) +} + +func (suite *StoreSuite) TestDestroy() { + a := assert.New(suite.T()) + success := suite.store.Destroy(1) + data := suite.store.Read(1) + + a.Equal(success, true) + a.Equal(data, Puppy{}) +} + +func (suite *StoreSuite) TestDestroyNonExistent() { + a := assert.New(suite.T()) + success := suite.store.Destroy(100) + + a.Equal(success, false) +} + +func (suite *StoreSuite) TestIdIncrementOnDelete() { + a := assert.New(suite.T()) + id := suite.store.Create(Puppy{Breed: "Greyhound", Color: "Light Brown", Value: "700"}) + suite.store.Destroy(id) + newID := suite.store.Create(Puppy{Breed: "Greyhound", Color: "Light Brown", Value: "700"}) + + a.Equal(newID, 3) +} + +func TestStore(t *testing.T) { + suite.Run(t, &StoreSuite{store: NewMapStore()}) + suite.Run(t, &StoreSuite{store: NewSyncStore()}) +} diff --git a/07_errors/patrickmarabeas/syncStore.go b/07_errors/patrickmarabeas/syncStore.go new file mode 100644 index 000000000..47dc770f5 --- /dev/null +++ b/07_errors/patrickmarabeas/syncStore.go @@ -0,0 +1,50 @@ +package main + +// NewSyncStore returns a pointer to a new instance of the SyncStore struct which implements the Storer interface. +func NewSyncStore() Storer { + return &SyncStore{ + uuid: 0, + } +} + +// Create increments the uuid and adds the provided Puppy struct to the store with this identifier. +func (store *SyncStore) Create(puppy Puppy) int { + puppy.ID = store.uuid + store.Store(puppy.ID, puppy) + store.uuid++ + + return puppy.ID +} + +// Read returns the puppy matching the provided uuid. +// An empty Puppy struct is returned if the identifier does not exist. +func (store *SyncStore) Read(id int) Puppy { + if value, ok := store.Load(id); ok { + return value.(Puppy) + } + + return Puppy{} +} + +// Update modifies the puppy matching the provided uuid in the store with the provided Puppy struct. +// It returns a bool whether a matching identifier was modified or not. +func (store *SyncStore) Update(id int, puppy Puppy) bool { + if _, ok := store.Load(id); !ok { + return false + } + + puppy.ID = id + store.Store(id, puppy) + return true +} + +// Destroy removes the puppy matching the provided uuid from the store. +// It returns a bool whether a matching identifier was deleted or not. +func (store *SyncStore) Destroy(id int) bool { + if _, ok := store.Load(id); !ok { + return false + } + + store.Delete(id) + return true +} diff --git a/07_errors/patrickmarabeas/types.go b/07_errors/patrickmarabeas/types.go new file mode 100644 index 000000000..bbf6907be --- /dev/null +++ b/07_errors/patrickmarabeas/types.go @@ -0,0 +1,29 @@ +package main + +import ( + "sync" +) + +type Puppy struct { + ID int + Breed string + Color string + Value string +} + +type Storer interface { + Create(puppy Puppy) int + Read(ID int) Puppy + Update(ID int, puppy Puppy) bool + Destroy(ID int) bool +} + +type MapStore struct { + uuid int + store map[int]Puppy +} + +type SyncStore struct { + uuid int + sync.Map +}