Skip to content

Commit

Permalink
Copy from upstream/06_puppy/patrickmarabeas
Browse files Browse the repository at this point in the history
Lab 07 (anz-bank#589)
  • Loading branch information
patrickmarabeas committed Aug 19, 2019
1 parent a0f8dbd commit 1358c73
Show file tree
Hide file tree
Showing 6 changed files with 247 additions and 0 deletions.
5 changes: 5 additions & 0 deletions 07_errors/patrickmarabeas/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package main

func main() {

}
25 changes: 25 additions & 0 deletions 07_errors/patrickmarabeas/main_test.go
Original file line number Diff line number Diff line change
@@ -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)
}
}
51 changes: 51 additions & 0 deletions 07_errors/patrickmarabeas/mapStore.go
Original file line number Diff line number Diff line change
@@ -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
}
87 changes: 87 additions & 0 deletions 07_errors/patrickmarabeas/store_test.go
Original file line number Diff line number Diff line change
@@ -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()})
}
50 changes: 50 additions & 0 deletions 07_errors/patrickmarabeas/syncStore.go
Original file line number Diff line number Diff line change
@@ -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
}
29 changes: 29 additions & 0 deletions 07_errors/patrickmarabeas/types.go
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit 1358c73

Please sign in to comment.