From 3792d690223a903fea8b4bcd1c50b7d9c68f912a Mon Sep 17 00:00:00 2001 From: Xavier Levaux Date: Sat, 26 Sep 2020 10:48:54 +0200 Subject: [PATCH] Implemented quality update for "Conjured" item with Cucumber tests --- Java/build.gradle | 5 +++ .../gildedrose/ConjuredQualityUpdater.java | 30 ++++++++++++++++++ .../main/java/com/gildedrose/GildedRose.java | 2 +- .../ItemQualityUpdateStrategyFactory.java | 1 + .../ItemQualityUpdateStrategyFactoryTest.java | 1 + .../gildedrose/QualityUpdaterStepdefs.java | 31 +++++++++++++++++++ .../java/com/gildedrose/RunCucumberTest.java | 13 ++++++++ .../conjured_quality_update.feature | 14 +++++++++ Java/src/test/resources/cucumber.properties | 1 + 9 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 Java/src/main/java/com/gildedrose/ConjuredQualityUpdater.java create mode 100644 Java/src/test/java/com/gildedrose/QualityUpdaterStepdefs.java create mode 100644 Java/src/test/java/com/gildedrose/RunCucumberTest.java create mode 100644 Java/src/test/resources/com/gildedrose/conjured_quality_update.feature create mode 100644 Java/src/test/resources/cucumber.properties diff --git a/Java/build.gradle b/Java/build.gradle index a693c89d..9fa40f64 100644 --- a/Java/build.gradle +++ b/Java/build.gradle @@ -12,6 +12,8 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.7.0' testImplementation 'com.approvaltests:approvaltests:9.3.0' testCompile group: 'org.assertj', name: 'assertj-core', version: '3.17.2' + compile group: 'io.cucumber', name: 'cucumber-java', version: '6.7.0' + testCompile group: 'io.cucumber', name: 'cucumber-junit', version: '6.7.0' } group = 'com.gildedrose' @@ -19,5 +21,8 @@ version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' test { + testLogging { + events "passed", "skipped", "failed", "standardOut", "standardError" + } useJUnitPlatform() } diff --git a/Java/src/main/java/com/gildedrose/ConjuredQualityUpdater.java b/Java/src/main/java/com/gildedrose/ConjuredQualityUpdater.java new file mode 100644 index 00000000..81ccab3f --- /dev/null +++ b/Java/src/main/java/com/gildedrose/ConjuredQualityUpdater.java @@ -0,0 +1,30 @@ +package com.gildedrose; + +public class ConjuredQualityUpdater implements ItemQualityUpdater { + + private final Item item; + private final int normalDailyQualityDegradation = 2; + + public ConjuredQualityUpdater(Item item) { + this.item = item; + } + + + @Override + public void updateQuality() { + decreaseQuality(normalDailyQualityDegradation); + + item.sellIn = item.sellIn - 1; + + if (item.sellIn < 0) { + decreaseQuality(normalDailyQualityDegradation); + } + } + + void decreaseQuality(int decrementValue) { + item.quality = item.quality - decrementValue; + if (item.quality < 0) { + item.quality = 0; + } + } +} diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index eabd2eea..243e2455 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -4,7 +4,7 @@ import static com.gildedrose.ItemQualityUpdateStrategyFactory.itemQualityUpdater import java.util.Arrays; -class GildedRose { +public class GildedRose { Item[] items; diff --git a/Java/src/main/java/com/gildedrose/ItemQualityUpdateStrategyFactory.java b/Java/src/main/java/com/gildedrose/ItemQualityUpdateStrategyFactory.java index 2d32e207..6b66083d 100644 --- a/Java/src/main/java/com/gildedrose/ItemQualityUpdateStrategyFactory.java +++ b/Java/src/main/java/com/gildedrose/ItemQualityUpdateStrategyFactory.java @@ -6,6 +6,7 @@ public class ItemQualityUpdateStrategyFactory { case "Sulfuras, Hand of Ragnaros": return new SulfrasQualityUpdater(item); case "Aged Brie": return new AgedBrieQualityUpdater(item); case "Backstage passes to a TAFKAL80ETC concert": return new BackstageBrieQualityUpdater(item); + case "Conjured": return new ConjuredQualityUpdater(item); default: return new DefaultQualityUpdater(item); } } diff --git a/Java/src/test/java/com/gildedrose/ItemQualityUpdateStrategyFactoryTest.java b/Java/src/test/java/com/gildedrose/ItemQualityUpdateStrategyFactoryTest.java index 9a2404e3..edf36d25 100644 --- a/Java/src/test/java/com/gildedrose/ItemQualityUpdateStrategyFactoryTest.java +++ b/Java/src/test/java/com/gildedrose/ItemQualityUpdateStrategyFactoryTest.java @@ -12,6 +12,7 @@ class ItemQualityUpdateStrategyFactoryTest { testFactoryFor("Aged Brie", AgedBrieQualityUpdater.class); testFactoryFor("Backstage passes to a TAFKAL80ETC concert", BackstageBrieQualityUpdater.class); testFactoryFor("xyz", DefaultQualityUpdater.class); + testFactoryFor("Conjured", ConjuredQualityUpdater.class); } void testFactoryFor(String name, Class clazz) { diff --git a/Java/src/test/java/com/gildedrose/QualityUpdaterStepdefs.java b/Java/src/test/java/com/gildedrose/QualityUpdaterStepdefs.java new file mode 100644 index 00000000..37defd82 --- /dev/null +++ b/Java/src/test/java/com/gildedrose/QualityUpdaterStepdefs.java @@ -0,0 +1,31 @@ +package com.gildedrose; + +import static org.assertj.core.api.Assertions.assertThat; + +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; +import org.assertj.core.util.Arrays; + +public class QualityUpdaterStepdefs { + + private GildedRose gildedRose; + private Item item; + + @Given("^name is \"([^\"]*)\", quality is \"([^\"]*)\" and sellIn is \"([^\"]*)\"$") + public void nameIsQualityIsAndSellInIs(String name, String quality, String sellIn) { + item = new Item(name, Integer.parseInt(sellIn), Integer.parseInt(quality)); + gildedRose = new GildedRose(Arrays.array(item)); + } + + @When("I calculateQuality") + public void iCalculateQuality() { + gildedRose.updateQuality(); + } + + @Then("I should have new quality {string} and new sellIn {string}") + public void iShouldHaveNewQualityAndNewSellIn(String newQuality, String newSellIn) { + assertThat(item.quality).isEqualTo(Integer.parseInt(newQuality)); + assertThat(item.sellIn).isEqualTo(Integer.parseInt(newSellIn)); + } +} diff --git a/Java/src/test/java/com/gildedrose/RunCucumberTest.java b/Java/src/test/java/com/gildedrose/RunCucumberTest.java new file mode 100644 index 00000000..61333fd0 --- /dev/null +++ b/Java/src/test/java/com/gildedrose/RunCucumberTest.java @@ -0,0 +1,13 @@ +package com.gildedrose; + +import io.cucumber.junit.Cucumber; +import io.cucumber.junit.CucumberOptions; +import org.junit.runner.RunWith; + +@RunWith(Cucumber.class) +@CucumberOptions( + plugin = {"pretty", "html:target/cucumber"} +) +public class RunCucumberTest { + +} \ No newline at end of file diff --git a/Java/src/test/resources/com/gildedrose/conjured_quality_update.feature b/Java/src/test/resources/com/gildedrose/conjured_quality_update.feature new file mode 100644 index 00000000..756756f2 --- /dev/null +++ b/Java/src/test/resources/com/gildedrose/conjured_quality_update.feature @@ -0,0 +1,14 @@ +Feature: Conjured items quality update + + Scenario Outline: Conjured items quality degrades by two each day + Given name is "", quality is "" and sellIn is "" + When I calculateQuality + Then I should have new quality "" and new sellIn "" + + Examples: + | name | quality | sellIn | newQuality | newSellIn | + | Conjured | 8 | 10 | 6 | 9 | + | Conjured | 3 | 2 | 1 | 1 | + | Conjured | 1 | 1 | 0 | 0 | + | Conjured | 6 | 0 | 2 | -1 | + | Conjured | 4 | 0 | 0 | -1 | \ No newline at end of file diff --git a/Java/src/test/resources/cucumber.properties b/Java/src/test/resources/cucumber.properties new file mode 100644 index 00000000..aa51b352 --- /dev/null +++ b/Java/src/test/resources/cucumber.properties @@ -0,0 +1 @@ +cucumber.publish.quiet=true \ No newline at end of file