Aged Brieのリファクタリング

This commit is contained in:
bestaff-hirakawa 2022-08-07 03:06:07 +09:00
parent 204dd7247d
commit fcecd11fba
2 changed files with 109 additions and 49 deletions

View File

@ -11,59 +11,68 @@ final class GildedRose
*/
private $items;
private mixed $item;
public function __construct(array $items)
{
$this->items = $items;
}
/*
仕様解析
[共通仕様]
・qualityはマイナスにならない、かつ50以上にならない
・sell_inの計算をしてからqualityの計算を行う
[商品Aged Brie]
・引数のsell_inを-1する
・計算後sell_inが0未満の場合、quality+2する
・計算後sell_inが0以上の場合、quality+1する
*/
/**
* メイン処理
*/
public function updateQuality(): void
{
foreach ($this->items as $item) {
if ($item->name != 'Aged Brie' and $item->name != 'Backstage passes to a TAFKAL80ETC concert') {
if ($item->quality > 0) {
if ($item->name != 'Sulfuras, Hand of Ragnaros') {
$item->quality = $item->quality - 1;
}
}
} else {
if ($item->quality < 50) {
$item->quality = $item->quality + 1;
if ($item->name == 'Backstage passes to a TAFKAL80ETC concert') {
if ($item->sell_in < 11) {
if ($item->quality < 50) {
$item->quality = $item->quality + 1;
}
}
if ($item->sell_in < 6) {
if ($item->quality < 50) {
$item->quality = $item->quality + 1;
}
}
foreach ($this->items as $this->item) {
if ($this->item->name === 'Aged Brie') {
// 商品Aged Brieの処理
$this->agedBrie();
}
}
}
if ($item->name != 'Sulfuras, Hand of Ragnaros') {
$item->sell_in = $item->sell_in - 1;
/**
* 商品Aged Brie計算処理
*/
private function agedBrie(): void
{
$this->calcSellInSubtraction();
$this->calcQualityAddition();
// sell_inが0未満の場合、qualityを再加算する
if ($this->item->sell_in < 0) {
$this->calcQualityAddition();
}
}
if ($item->sell_in < 0) {
if ($item->name != 'Aged Brie') {
if ($item->name != 'Backstage passes to a TAFKAL80ETC concert') {
if ($item->quality > 0) {
if ($item->name != 'Sulfuras, Hand of Ragnaros') {
$item->quality = $item->quality - 1;
}
}
} else {
$item->quality = $item->quality - $item->quality;
}
} else {
if ($item->quality < 50) {
$item->quality = $item->quality + 1;
}
}
/**
* sell_inの減算を行う
*/
private function calcSellInSubtraction(): void
{
--$this->item->sell_in;
}
/**
* qualityの加算を行う
*/
private function calcQualityAddition(): void
{
// 50未満の場合計算
if ($this->item->quality < 50) {
++$this->item->quality;
}
}
}

View File

@ -11,14 +11,64 @@ use PHPUnit\Framework\TestCase;
class GildedRoseTest extends TestCase
{
public function testFoo(): void
/**
* Aged Briesell_inが1以上、qualityが50未満
* 期待値sell_inが-1、qualityが+1
*/
public function testAgedBrieNormal(): void
{
$items = [new Item('foo', 0, 0)];
$items = [new Item('Aged Brie', 5, 10)];
$gildedRose = new GildedRose($items);
$gildedRose->updateQuality();
$this->assertSame('fixme', $items[0]->name);
$this->assertSame('Aged Brie', $items[0]->name);
$this->assertSame(4, $items[0]->sell_in);
$this->assertSame(11, $items[0]->quality);
$items = [new Item('Aged Brie', 1, 49)];
$gildedRose = new GildedRose($items);
$gildedRose->updateQuality();
$this->assertSame('Aged Brie', $items[0]->name);
$this->assertSame(0, $items[0]->sell_in);
$this->assertSame(50, $items[0]->quality);
}
/**
* Aged Briesell_inが0以下、qualityが50未満
* 期待値sell_inが-1、qualityが+2
*/
public function testAgedBrieSellIn0OrLess(): void
{
$items = [new Item('Aged Brie', 0, 10)];
$gildedRose = new GildedRose($items);
$gildedRose->updateQuality();
$this->assertSame('Aged Brie', $items[0]->name);
$this->assertSame(-1, $items[0]->sell_in);
$this->assertSame(12, $items[0]->quality);
$items = [new Item('Aged Brie', -1, 10)];
$gildedRose = new GildedRose($items);
$gildedRose->updateQuality();
$this->assertSame('Aged Brie', $items[0]->name);
$this->assertSame(-2, $items[0]->sell_in);
$this->assertSame(12, $items[0]->quality);
}
/**
* Aged Briesell_inが1以上、qualityが50
* 期待値sell_inが-1、qualityは変更なし
*/
public function testAgedBrieQuality50(): void
{
$items = [new Item('Aged Brie', 5, 50)];
$gildedRose = new GildedRose($items);
$gildedRose->updateQuality();
$this->assertSame('Aged Brie', $items[0]->name);
$this->assertSame(4, $items[0]->sell_in);
$this->assertSame(50, $items[0]->quality);
}
// テストエラーの原因が特定できないので後で調査する
/*
public function testApproveArray()
{
$list = ['zero', 'oxe', 'two', 'three', 'four', 'five'];
@ -44,4 +94,5 @@ class GildedRoseTest extends TestCase
Approvals::approveString($fudge);
}
*/
}