Refactor gildedrose and agit remote -v

de unit tests.
This commit is contained in:
MarFor9 2024-05-21 09:44:42 +02:00
parent c7e0b4a8d9
commit fc2b330435
6 changed files with 228 additions and 60 deletions

View File

@ -0,0 +1,6 @@
package domain
type Item struct {
Name string
SellIn, Quality int
}

View File

@ -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)
}
} }

View File

@ -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])
})
} }
} }

View File

@ -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
View 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=

View File

@ -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},