mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-14 22:21:20 +00:00
97 lines
2.1 KiB
Go
97 lines
2.1 KiB
Go
package gildedrose
|
|
|
|
import (
|
|
"github.com/emilybache/gildedrose-refactoring-kata/gildedrose/domain"
|
|
)
|
|
|
|
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) {
|
|
if item.Name == Sulfuras {
|
|
if item.Quality != SulfurasQuality {
|
|
item.Quality = SulfurasQuality
|
|
}
|
|
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)
|
|
}
|
|
}
|