forked from anz-bank/go-course
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Copy from upstream/06_puppy/patrickmarabeas
Lab 07 (anz-bank#589)
- Loading branch information
1 parent
a0f8dbd
commit 1358c73
Showing
6 changed files
with
247 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
package main | ||
|
||
func main() { | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()}) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |