mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-15 06:21:29 +00:00
Refactor gildedrose and agit remote -v
de unit tests.
This commit is contained in:
parent
c7e0b4a8d9
commit
fc2b330435
6
go/gildedrose/domain/Item.go
Normal file
6
go/gildedrose/domain/Item.go
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
package domain
|
||||||
|
|
||||||
|
type Item struct {
|
||||||
|
Name string
|
||||||
|
SellIn, Quality int
|
||||||
|
}
|
||||||
@ -1,58 +1,96 @@
|
|||||||
package gildedrose
|
package gildedrose
|
||||||
|
|
||||||
type Item struct {
|
import (
|
||||||
Name string
|
"github.com/emilybache/gildedrose-refactoring-kata/gildedrose/domain"
|
||||||
SellIn, Quality int
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
AgedBrie = "Aged Brie"
|
||||||
|
BackstagePasses = "Backstage passes to a TAFKAL80ETC concert"
|
||||||
|
Sulfuras = "Sulfuras, Hand of Ragnaros"
|
||||||
|
Conjured = "Conjured Mana Cake"
|
||||||
|
MaxQuality = 50
|
||||||
|
MinQuality = 0
|
||||||
|
SulfurasQuality = 80
|
||||||
|
Expired = 0
|
||||||
|
Backstage10Days = 10
|
||||||
|
Backstage5Days = 5
|
||||||
|
NormalDegradeRate = 1
|
||||||
|
ConjuredDegradeRate = 2
|
||||||
|
)
|
||||||
|
|
||||||
|
func UpdateQuality(items []*domain.Item) {
|
||||||
|
for _, item := range items {
|
||||||
|
updateItem(item)
|
||||||
|
validateQuality(item)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
func validateQuality(item *domain.Item) {
|
||||||
func UpdateQuality(items []*Item) {
|
if item.Name == Sulfuras {
|
||||||
for i := 0; i < len(items); i++ {
|
if item.Quality != SulfurasQuality {
|
||||||
|
item.Quality = SulfurasQuality
|
||||||
if items[i].Name != "Aged Brie" && items[i].Name != "Backstage passes to a TAFKAL80ETC concert" {
|
|
||||||
if items[i].Quality > 0 {
|
|
||||||
if items[i].Name != "Sulfuras, Hand of Ragnaros" {
|
|
||||||
items[i].Quality = items[i].Quality - 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if items[i].Quality < 50 {
|
|
||||||
items[i].Quality = items[i].Quality + 1
|
|
||||||
if items[i].Name == "Backstage passes to a TAFKAL80ETC concert" {
|
|
||||||
if items[i].SellIn < 11 {
|
|
||||||
if items[i].Quality < 50 {
|
|
||||||
items[i].Quality = items[i].Quality + 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if items[i].SellIn < 6 {
|
|
||||||
if items[i].Quality < 50 {
|
|
||||||
items[i].Quality = items[i].Quality + 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if items[i].Name != "Sulfuras, Hand of Ragnaros" {
|
|
||||||
items[i].SellIn = items[i].SellIn - 1
|
|
||||||
}
|
|
||||||
|
|
||||||
if items[i].SellIn < 0 {
|
|
||||||
if items[i].Name != "Aged Brie" {
|
|
||||||
if items[i].Name != "Backstage passes to a TAFKAL80ETC concert" {
|
|
||||||
if items[i].Quality > 0 {
|
|
||||||
if items[i].Name != "Sulfuras, Hand of Ragnaros" {
|
|
||||||
items[i].Quality = items[i].Quality - 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
items[i].Quality = items[i].Quality - items[i].Quality
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if items[i].Quality < 50 {
|
|
||||||
items[i].Quality = items[i].Quality + 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if item.Quality > MaxQuality || item.Quality < MinQuality {
|
||||||
|
item.Quality = MinQuality
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func updateItem(item *domain.Item) {
|
||||||
|
switch item.Name {
|
||||||
|
case AgedBrie:
|
||||||
|
incrementQuality(item)
|
||||||
|
case BackstagePasses:
|
||||||
|
updateBackstagePasses(item)
|
||||||
|
case Sulfuras:
|
||||||
|
// Sulfuras does not change in quality or sell-in
|
||||||
|
case Conjured:
|
||||||
|
degradeQuality(item, ConjuredDegradeRate)
|
||||||
|
default:
|
||||||
|
degradeQuality(item, NormalDegradeRate)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if item.Name != Sulfuras {
|
||||||
|
item.SellIn--
|
||||||
|
}
|
||||||
|
|
||||||
|
if item.SellIn < Expired {
|
||||||
|
handleExpiredItem(item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func incrementQuality(item *domain.Item) {
|
||||||
|
if item.Quality < MaxQuality {
|
||||||
|
item.Quality++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func updateBackstagePasses(item *domain.Item) {
|
||||||
|
incrementQuality(item)
|
||||||
|
if item.SellIn <= Backstage10Days && item.Quality < MaxQuality {
|
||||||
|
item.Quality++
|
||||||
|
}
|
||||||
|
if item.SellIn <= Backstage5Days && item.Quality < MaxQuality {
|
||||||
|
item.Quality++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func degradeQuality(item *domain.Item, degradeRate int) {
|
||||||
|
if item.Quality > MinQuality {
|
||||||
|
item.Quality -= degradeRate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleExpiredItem(item *domain.Item) {
|
||||||
|
switch item.Name {
|
||||||
|
case AgedBrie:
|
||||||
|
incrementQuality(item)
|
||||||
|
case BackstagePasses:
|
||||||
|
item.Quality = MinQuality
|
||||||
|
case Conjured:
|
||||||
|
degradeQuality(item, ConjuredDegradeRate)
|
||||||
|
case Sulfuras:
|
||||||
|
// Sulfuras does not change in quality or sell-in
|
||||||
|
default:
|
||||||
|
degradeQuality(item, NormalDegradeRate)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,19 +1,126 @@
|
|||||||
package gildedrose_test
|
package gildedrose_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/emilybache/gildedrose-refactoring-kata/gildedrose"
|
"github.com/emilybache/gildedrose-refactoring-kata/gildedrose"
|
||||||
|
"github.com/emilybache/gildedrose-refactoring-kata/gildedrose/domain"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Test_Foo(t *testing.T) {
|
func Test_UpdateQuality(t *testing.T) {
|
||||||
var items = []*gildedrose.Item{
|
|
||||||
{"foo", 0, 0},
|
type TestConfig struct {
|
||||||
|
name string
|
||||||
|
testData []*domain.Item
|
||||||
|
expected domain.Item
|
||||||
}
|
}
|
||||||
|
|
||||||
gildedrose.UpdateQuality(items)
|
for _, tc := range []TestConfig{
|
||||||
|
{
|
||||||
|
name: "Quality of an item is never less than 0",
|
||||||
|
testData: []*domain.Item{{Name: "Normal Item", SellIn: 10, Quality: 0}},
|
||||||
|
expected: domain.Item{Name: "Normal Item", SellIn: 9, Quality: 0},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Quality of an item degrade twice as sellIn date passed",
|
||||||
|
testData: []*domain.Item{{Name: "Normal Item", SellIn: 0, Quality: 10}},
|
||||||
|
expected: domain.Item{Name: "Normal Item", SellIn: -1, Quality: 8},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Quality of an item degrade once as sellIn date not passed",
|
||||||
|
testData: []*domain.Item{{Name: "Normal Item", SellIn: 10, Quality: 10}},
|
||||||
|
expected: domain.Item{Name: "Normal Item", SellIn: 9, Quality: 9},
|
||||||
|
},
|
||||||
|
|
||||||
if items[0].Name != "fixme" {
|
{
|
||||||
t.Errorf("Name: Expected %s but got %s ", "fixme", items[0].Name)
|
name: "Sell by date not passed, increase AgedBrie quality by 1",
|
||||||
|
testData: []*domain.Item{{Name: gildedrose.AgedBrie, SellIn: 3, Quality: 40}},
|
||||||
|
expected: domain.Item{Name: gildedrose.AgedBrie, SellIn: 2, Quality: 41},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Quality of an AgedBrie is never more than 50",
|
||||||
|
testData: []*domain.Item{{Name: gildedrose.AgedBrie, SellIn: 10, Quality: 50}},
|
||||||
|
expected: domain.Item{Name: gildedrose.AgedBrie, SellIn: 9, Quality: 50},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Quality of an item upgrade twice as sellIn date passed - AgedBrie",
|
||||||
|
testData: []*domain.Item{{Name: gildedrose.AgedBrie, SellIn: 0, Quality: 40}},
|
||||||
|
expected: domain.Item{Name: gildedrose.AgedBrie, SellIn: -1, Quality: 42},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "BackstagePasses increase in quality as SellIn approaches - 15 days",
|
||||||
|
testData: []*domain.Item{{Name: gildedrose.BackstagePasses, SellIn: 15, Quality: 20}},
|
||||||
|
expected: domain.Item{Name: gildedrose.BackstagePasses, SellIn: 14, Quality: 21},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "BackstagePasses increase in quality by 2 when SellIn <= 10",
|
||||||
|
testData: []*domain.Item{{Name: gildedrose.BackstagePasses, SellIn: 10, Quality: 20}},
|
||||||
|
expected: domain.Item{Name: gildedrose.BackstagePasses, SellIn: 9, Quality: 22},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "BackstagePasses increase in quality by 3 when SellIn <= 5",
|
||||||
|
testData: []*domain.Item{{Name: gildedrose.BackstagePasses, SellIn: 5, Quality: 20}},
|
||||||
|
expected: domain.Item{Name: gildedrose.BackstagePasses, SellIn: 4, Quality: 23},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "BackstagePasses increase in quality by 3 when SellIn <= 5, quality 49",
|
||||||
|
testData: []*domain.Item{{Name: gildedrose.BackstagePasses, SellIn: 5, Quality: 49}},
|
||||||
|
expected: domain.Item{Name: gildedrose.BackstagePasses, SellIn: 4, Quality: 50},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "BackstagePasses drop to 0 quality after concert",
|
||||||
|
testData: []*domain.Item{{Name: gildedrose.BackstagePasses, SellIn: 0, Quality: 20}},
|
||||||
|
expected: domain.Item{Name: gildedrose.BackstagePasses, SellIn: -1, Quality: 0},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Sulfuras never decreases in quality or SellIn, SellIn positive",
|
||||||
|
testData: []*domain.Item{{Name: gildedrose.Sulfuras, SellIn: 10, Quality: 80}},
|
||||||
|
expected: domain.Item{Name: gildedrose.Sulfuras, SellIn: 10, Quality: 80},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Sulfuras never decreases in quality or SellIn, SellIn negative",
|
||||||
|
testData: []*domain.Item{{Name: gildedrose.Sulfuras, SellIn: -1, Quality: 80}},
|
||||||
|
expected: domain.Item{Name: gildedrose.Sulfuras, SellIn: -1, Quality: 80},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Create Sulfuras item with quality different than 80",
|
||||||
|
testData: []*domain.Item{{Name: gildedrose.Sulfuras, SellIn: 10, Quality: 1000}},
|
||||||
|
expected: domain.Item{Name: gildedrose.Sulfuras, SellIn: 10, Quality: 80},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Conjured items degrade in quality twice as fast - before sell-by date - initial quality 6",
|
||||||
|
testData: []*domain.Item{{Name: gildedrose.Conjured, SellIn: 3, Quality: 6}},
|
||||||
|
expected: domain.Item{Name: gildedrose.Conjured, SellIn: 2, Quality: 4},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Conjured items degrade in quality twice as fast - before sell-by date - initial quality 1",
|
||||||
|
testData: []*domain.Item{{Name: gildedrose.Conjured, SellIn: 3, Quality: 1}},
|
||||||
|
expected: domain.Item{Name: gildedrose.Conjured, SellIn: 2, Quality: 0},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Conjured items degrade in quality twice as fast - before sell-by date - initial quality 0",
|
||||||
|
testData: []*domain.Item{{Name: gildedrose.Conjured, SellIn: -3, Quality: 0}},
|
||||||
|
expected: domain.Item{Name: gildedrose.Conjured, SellIn: -4, Quality: 0},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Conjured items degrade in quality twice as fast - after sell-by date",
|
||||||
|
testData: []*domain.Item{{Name: gildedrose.Conjured, SellIn: 0, Quality: 6}},
|
||||||
|
expected: domain.Item{Name: gildedrose.Conjured, SellIn: -1, Quality: 2},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Create item with quality bigger than 50",
|
||||||
|
testData: []*domain.Item{{Name: gildedrose.Conjured, SellIn: 10, Quality: 100}},
|
||||||
|
expected: domain.Item{Name: gildedrose.Conjured, SellIn: 9, Quality: 0},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Create item with quality less than 0",
|
||||||
|
testData: []*domain.Item{{Name: gildedrose.Conjured, SellIn: 10, Quality: -100}},
|
||||||
|
expected: domain.Item{Name: gildedrose.Conjured, SellIn: 9, Quality: 0},
|
||||||
|
},
|
||||||
|
} {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
gildedrose.UpdateQuality(tc.testData)
|
||||||
|
require.Equal(t, tc.expected, *tc.testData[0])
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,3 +1,10 @@
|
|||||||
module github.com/emilybache/gildedrose-refactoring-kata
|
module github.com/emilybache/gildedrose-refactoring-kata
|
||||||
|
|
||||||
go 1.18
|
go 1.18
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
|
github.com/stretchr/testify v1.9.0 // indirect
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
|
)
|
||||||
|
|||||||
9
go/go.sum
Normal file
9
go/go.sum
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
||||||
|
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
@ -2,6 +2,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/emilybache/gildedrose-refactoring-kata/gildedrose/domain"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
@ -11,7 +12,7 @@ import (
|
|||||||
func main() {
|
func main() {
|
||||||
fmt.Println("OMGHAI!")
|
fmt.Println("OMGHAI!")
|
||||||
|
|
||||||
var items = []*gildedrose.Item{
|
var items = []*domain.Item{
|
||||||
{"+5 Dexterity Vest", 10, 20},
|
{"+5 Dexterity Vest", 10, 20},
|
||||||
{"Aged Brie", 2, 0},
|
{"Aged Brie", 2, 0},
|
||||||
{"Elixir of the Mongoose", 5, 7},
|
{"Elixir of the Mongoose", 5, 7},
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user