Added test cases and updated imports for JUnit 5

This commit is contained in:
Matt Decker 2022-07-01 22:09:10 -05:00
parent 0610ce9f85
commit a84fedf91e
9 changed files with 603 additions and 32 deletions

View File

@ -1,9 +1,10 @@
package com.gildedrose;
class GildedRose {
Item[] items;
public GildedRose(Item[] items) {
private Item[] items;
public GildedRose(Item... items) {
this.items = items;
}
@ -59,4 +60,8 @@ class GildedRose {
}
}
}
public Item[] getItems() {
return items;
}
}

View File

@ -0,0 +1,35 @@
package com.gildedrose;
import org.junit.jupiter.api.Test;
import static com.gildedrose.ItemTestHelper.assertItemEquals;
public class AgedBrieTest {
@Test
public void item_AgedBrie_increasesInQuality() {
GildedRose app = new GildedRose(new Item("Aged Brie", 2, 2));
app.updateQuality();
assertItemEquals(app.getItems()[0], new Item("Aged Brie", 1, 3));
}
@Test
public void item_AgedBrie_increasesInQuality_DoublesWhenOff() {
GildedRose app = new GildedRose(new Item("Aged Brie", 0, 2));
app.updateQuality();
assertItemEquals(app.getItems()[0], new Item("Aged Brie", -1, 4));
}
@Test
public void item_AgedBrie_cannotGoOver50Quality() {
GildedRose app = new GildedRose(new Item("Aged Brie", 2, 50));
app.updateQuality();
assertItemEquals(app.getItems()[0], new Item("Aged Brie", 1, 50));
}
}

View File

@ -0,0 +1,44 @@
package com.gildedrose;
import org.junit.jupiter.api.Test;
import static com.gildedrose.ItemTestHelper.assertItemEquals;
public class BackStagePassesTest {
@Test
public void item_BackStagePasses_increasesInQuality_byOneOutside10Days() {
GildedRose app = new GildedRose(new Item("Backstage passes to a TAFKAL80ETC concert", 20, 2));
app.updateQuality();
assertItemEquals(app.getItems()[0], new Item("Backstage passes to a TAFKAL80ETC concert", 19, 3));
}
@Test
public void item_BackStagePasses_increasesInQuality_byTwoInside10Days() {
GildedRose app = new GildedRose(new Item("Backstage passes to a TAFKAL80ETC concert", 10, 2));
app.updateQuality();
assertItemEquals(app.getItems()[0], new Item("Backstage passes to a TAFKAL80ETC concert", 9, 4));
}
@Test
public void item_BackStagePasses_increasesInQuality_byThreeInside5Days() {
GildedRose app = new GildedRose(new Item("Backstage passes to a TAFKAL80ETC concert", 5, 2));
app.updateQuality();
assertItemEquals(app.getItems()[0], new Item("Backstage passes to a TAFKAL80ETC concert", 4, 5));
}
@Test
public void item_BackStagePasses_increasesInQuality_goesToZeroWhenSellInExpires() {
GildedRose app = new GildedRose(new Item("Backstage passes to a TAFKAL80ETC concert", 0, 20));
app.updateQuality();
assertItemEquals(app.getItems()[0], new Item("Backstage passes to a TAFKAL80ETC concert", -1, 0));
}
}

View File

@ -0,0 +1,26 @@
package com.gildedrose;
import org.junit.jupiter.api.Test;
import static com.gildedrose.ItemTestHelper.assertItemEquals;
public class ConjureditemTestHelper {
@Test
public void item_conjured_decreasesInQuality_twiceTheSpeed() {
GildedRose app = new GildedRose(new Item("Conjured Mana Cake", 3, 6));
app.updateQuality();
assertItemEquals(app.getItems()[0], new Item("Conjured Mana Cake", 2, 4));
}
@Test
public void item_conjured_decreasesInQuality_twiceTheSpeed_alsoWhenSellInExpired() {
GildedRose app = new GildedRose(new Item("Conjured Mana Cake", 0, 6));
app.updateQuality();
assertItemEquals(app.getItems()[0], new Item("Conjured Mana Cake", -1, 2));
}
}

View File

@ -2,16 +2,35 @@ package com.gildedrose;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static com.gildedrose.ItemTestHelper.assertItemEquals;
class GildedRoseTest {
public class GildedRoseTest {
@Test
void foo() {
Item[] items = new Item[] { new Item("foo", 0, 0) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals("foo", app.items[0].name);
}
@Test
public void sellInDateDecreases_butQualityCannotBeNegative() {
GildedRose app = new GildedRose(new Item("foo", 0, 0));
app.updateQuality();
assertItemEquals(app.getItems()[0], new Item("foo", -1, 0));
}
@Test
public void qualityDecreases() {
GildedRose app = new GildedRose(new Item("foo", 10, 10));
app.updateQuality();
assertItemEquals(app.getItems()[0], new Item("foo", 9, 9));
}
@Test
public void qualityDecreasesFasterAfterSellInDateExpired() {
GildedRose app = new GildedRose(new Item("foo", 0, 10));
app.updateQuality();
assertItemEquals(app.getItems()[0], new Item("foo", -1, 8));
}
}

View File

@ -0,0 +1,16 @@
package com.gildedrose;
import com.gildedrose.Item;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Assertions;
public class ItemTestHelper {
public static void assertItemEquals(Item actual, Item expected) {
assertEquals(expected.name, actual.name);
assertEquals(expected.quality, actual.quality);
assertEquals(expected.sellIn, actual.sellIn);
}
}

View File

@ -0,0 +1,17 @@
package com.gildedrose;
import org.junit.jupiter.api.Test;
import static com.gildedrose.ItemTestHelper.assertItemEquals;
public class SulfurasTest {
@Test
public void item_Sulfuras_neverChanges() {
GildedRose app = new GildedRose(new Item("Sulfuras, Hand of Ragnaros", 100, 100));
app.updateQuality();
assertItemEquals(app.getItems()[0], new Item("Sulfuras, Hand of Ragnaros", 100, 100));
}
}

View File

@ -1,37 +1,63 @@
package com.gildedrose;
public class TexttestFixture {
public static void main(String[] args) {
System.out.println("OMGHAI!");
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
Item[] items = new Item[] {
new Item("+5 Dexterity Vest", 10, 20), //
new Item("Aged Brie", 2, 0), //
new Item("Elixir of the Mongoose", 5, 7), //
new Item("Sulfuras, Hand of Ragnaros", 0, 80), //
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import static java.lang.String.format;
public class TexttestFixture {
@Test
public void checkAllIsGold() throws IOException {
String gold = new String(Files.readAllBytes(Paths.get("src/test/resources/gold.txt")));
String current = buildGold().toString();
Assertions.assertEquals(trimEachLine(gold +"\n"), trimEachLine(current));
}
private String trimEachLine(String string) {
return string.replaceAll("(?m)[\\s+&&[^\\n]]+$", "");
}
public static void main(String[] args) throws IOException {
StringBuilder builder = buildGold();
Files.write(Paths.get("src/test/resources/gold.txt"), builder.toString().getBytes());
}
private static StringBuilder buildGold() {
Item[] items = new Item[]{
new Item("+5 Dexterity Vest", 10, 20),
new Item("Aged Brie", 2, 0),
new Item("Elixir of the Mongoose", 5, 7),
new Item("Sulfuras, Hand of Ragnaros", 0, 80),
new Item("Sulfuras, Hand of Ragnaros", -1, 80),
new Item("Backstage passes to a TAFKAL80ETC concert", 15, 20),
new Item("Backstage passes to a TAFKAL80ETC concert", 10, 49),
new Item("Backstage passes to a TAFKAL80ETC concert", 5, 49),
// this conjured item does not work properly yet
new Item("Conjured Mana Cake", 3, 6) };
new Item("Conjured Mana Cake", 3, 6)
};
StringBuilder builder = new StringBuilder();
GildedRose app = new GildedRose(items);
int days = 2;
if (args.length > 0) {
days = Integer.parseInt(args[0]) + 1;
}
for (int i = 0; i < days; i++) {
System.out.println("-------- day " + i + " --------");
System.out.println("name, sellIn, quality");
for (int i = 0; i < 32; i++) {
builder.append(format("------------------------- day %s -------------------------- %n", i));
builder.append(format("%42s %6s %-8s %n", "NAME", "SELLIN", "QUALITY"));
for (Item item : items) {
System.out.println(item);
builder.append(format("%42s %6s %-8s %n", item.name, item.sellIn, item.quality));
}
System.out.println();
builder.append(format("%n"));
app.updateQuality();
}
return builder;
}
}

View File

@ -0,0 +1,383 @@
------------------------- day 0 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest 10 20
Aged Brie 2 0
Elixir of the Mongoose 5 7
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert 15 20
Backstage passes to a TAFKAL80ETC concert 10 49
Backstage passes to a TAFKAL80ETC concert 5 49
Conjured Mana Cake 3 6
------------------------- day 1 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest 9 19
Aged Brie 1 1
Elixir of the Mongoose 4 6
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert 14 21
Backstage passes to a TAFKAL80ETC concert 9 50
Backstage passes to a TAFKAL80ETC concert 4 50
Conjured Mana Cake 2 4
------------------------- day 2 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest 8 18
Aged Brie 0 2
Elixir of the Mongoose 3 5
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert 13 22
Backstage passes to a TAFKAL80ETC concert 8 50
Backstage passes to a TAFKAL80ETC concert 3 50
Conjured Mana Cake 1 2
------------------------- day 3 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest 7 17
Aged Brie -1 4
Elixir of the Mongoose 2 4
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert 12 23
Backstage passes to a TAFKAL80ETC concert 7 50
Backstage passes to a TAFKAL80ETC concert 2 50
Conjured Mana Cake 0 0
------------------------- day 4 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest 6 16
Aged Brie -2 6
Elixir of the Mongoose 1 3
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert 11 24
Backstage passes to a TAFKAL80ETC concert 6 50
Backstage passes to a TAFKAL80ETC concert 1 50
Conjured Mana Cake -1 0
------------------------- day 5 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest 5 15
Aged Brie -3 8
Elixir of the Mongoose 0 2
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert 10 25
Backstage passes to a TAFKAL80ETC concert 5 50
Backstage passes to a TAFKAL80ETC concert 0 50
Conjured Mana Cake -2 0
------------------------- day 6 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest 4 14
Aged Brie -4 10
Elixir of the Mongoose -1 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert 9 27
Backstage passes to a TAFKAL80ETC concert 4 50
Backstage passes to a TAFKAL80ETC concert -1 0
Conjured Mana Cake -3 0
------------------------- day 7 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest 3 13
Aged Brie -5 12
Elixir of the Mongoose -2 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert 8 29
Backstage passes to a TAFKAL80ETC concert 3 50
Backstage passes to a TAFKAL80ETC concert -2 0
Conjured Mana Cake -4 0
------------------------- day 8 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest 2 12
Aged Brie -6 14
Elixir of the Mongoose -3 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert 7 31
Backstage passes to a TAFKAL80ETC concert 2 50
Backstage passes to a TAFKAL80ETC concert -3 0
Conjured Mana Cake -5 0
------------------------- day 9 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest 1 11
Aged Brie -7 16
Elixir of the Mongoose -4 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert 6 33
Backstage passes to a TAFKAL80ETC concert 1 50
Backstage passes to a TAFKAL80ETC concert -4 0
Conjured Mana Cake -6 0
------------------------- day 10 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest 0 10
Aged Brie -8 18
Elixir of the Mongoose -5 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert 5 35
Backstage passes to a TAFKAL80ETC concert 0 50
Backstage passes to a TAFKAL80ETC concert -5 0
Conjured Mana Cake -7 0
------------------------- day 11 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest -1 8
Aged Brie -9 20
Elixir of the Mongoose -6 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert 4 38
Backstage passes to a TAFKAL80ETC concert -1 0
Backstage passes to a TAFKAL80ETC concert -6 0
Conjured Mana Cake -8 0
------------------------- day 12 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest -2 6
Aged Brie -10 22
Elixir of the Mongoose -7 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert 3 41
Backstage passes to a TAFKAL80ETC concert -2 0
Backstage passes to a TAFKAL80ETC concert -7 0
Conjured Mana Cake -9 0
------------------------- day 13 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest -3 4
Aged Brie -11 24
Elixir of the Mongoose -8 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert 2 44
Backstage passes to a TAFKAL80ETC concert -3 0
Backstage passes to a TAFKAL80ETC concert -8 0
Conjured Mana Cake -10 0
------------------------- day 14 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest -4 2
Aged Brie -12 26
Elixir of the Mongoose -9 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert 1 47
Backstage passes to a TAFKAL80ETC concert -4 0
Backstage passes to a TAFKAL80ETC concert -9 0
Conjured Mana Cake -11 0
------------------------- day 15 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest -5 0
Aged Brie -13 28
Elixir of the Mongoose -10 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert 0 50
Backstage passes to a TAFKAL80ETC concert -5 0
Backstage passes to a TAFKAL80ETC concert -10 0
Conjured Mana Cake -12 0
------------------------- day 16 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest -6 0
Aged Brie -14 30
Elixir of the Mongoose -11 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert -1 0
Backstage passes to a TAFKAL80ETC concert -6 0
Backstage passes to a TAFKAL80ETC concert -11 0
Conjured Mana Cake -13 0
------------------------- day 17 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest -7 0
Aged Brie -15 32
Elixir of the Mongoose -12 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert -2 0
Backstage passes to a TAFKAL80ETC concert -7 0
Backstage passes to a TAFKAL80ETC concert -12 0
Conjured Mana Cake -14 0
------------------------- day 18 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest -8 0
Aged Brie -16 34
Elixir of the Mongoose -13 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert -3 0
Backstage passes to a TAFKAL80ETC concert -8 0
Backstage passes to a TAFKAL80ETC concert -13 0
Conjured Mana Cake -15 0
------------------------- day 19 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest -9 0
Aged Brie -17 36
Elixir of the Mongoose -14 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert -4 0
Backstage passes to a TAFKAL80ETC concert -9 0
Backstage passes to a TAFKAL80ETC concert -14 0
Conjured Mana Cake -16 0
------------------------- day 20 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest -10 0
Aged Brie -18 38
Elixir of the Mongoose -15 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert -5 0
Backstage passes to a TAFKAL80ETC concert -10 0
Backstage passes to a TAFKAL80ETC concert -15 0
Conjured Mana Cake -17 0
------------------------- day 21 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest -11 0
Aged Brie -19 40
Elixir of the Mongoose -16 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert -6 0
Backstage passes to a TAFKAL80ETC concert -11 0
Backstage passes to a TAFKAL80ETC concert -16 0
Conjured Mana Cake -18 0
------------------------- day 22 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest -12 0
Aged Brie -20 42
Elixir of the Mongoose -17 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert -7 0
Backstage passes to a TAFKAL80ETC concert -12 0
Backstage passes to a TAFKAL80ETC concert -17 0
Conjured Mana Cake -19 0
------------------------- day 23 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest -13 0
Aged Brie -21 44
Elixir of the Mongoose -18 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert -8 0
Backstage passes to a TAFKAL80ETC concert -13 0
Backstage passes to a TAFKAL80ETC concert -18 0
Conjured Mana Cake -20 0
------------------------- day 24 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest -14 0
Aged Brie -22 46
Elixir of the Mongoose -19 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert -9 0
Backstage passes to a TAFKAL80ETC concert -14 0
Backstage passes to a TAFKAL80ETC concert -19 0
Conjured Mana Cake -21 0
------------------------- day 25 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest -15 0
Aged Brie -23 48
Elixir of the Mongoose -20 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert -10 0
Backstage passes to a TAFKAL80ETC concert -15 0
Backstage passes to a TAFKAL80ETC concert -20 0
Conjured Mana Cake -22 0
------------------------- day 26 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest -16 0
Aged Brie -24 50
Elixir of the Mongoose -21 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert -11 0
Backstage passes to a TAFKAL80ETC concert -16 0
Backstage passes to a TAFKAL80ETC concert -21 0
Conjured Mana Cake -23 0
------------------------- day 27 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest -17 0
Aged Brie -25 50
Elixir of the Mongoose -22 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert -12 0
Backstage passes to a TAFKAL80ETC concert -17 0
Backstage passes to a TAFKAL80ETC concert -22 0
Conjured Mana Cake -24 0
------------------------- day 28 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest -18 0
Aged Brie -26 50
Elixir of the Mongoose -23 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert -13 0
Backstage passes to a TAFKAL80ETC concert -18 0
Backstage passes to a TAFKAL80ETC concert -23 0
Conjured Mana Cake -25 0
------------------------- day 29 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest -19 0
Aged Brie -27 50
Elixir of the Mongoose -24 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert -14 0
Backstage passes to a TAFKAL80ETC concert -19 0
Backstage passes to a TAFKAL80ETC concert -24 0
Conjured Mana Cake -26 0
------------------------- day 30 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest -20 0
Aged Brie -28 50
Elixir of the Mongoose -25 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert -15 0
Backstage passes to a TAFKAL80ETC concert -20 0
Backstage passes to a TAFKAL80ETC concert -25 0
Conjured Mana Cake -27 0
------------------------- day 31 --------------------------
NAME SELLIN QUALITY
+5 Dexterity Vest -21 0
Aged Brie -29 50
Elixir of the Mongoose -26 0
Sulfuras, Hand of Ragnaros 0 80
Sulfuras, Hand of Ragnaros -1 80
Backstage passes to a TAFKAL80ETC concert -16 0
Backstage passes to a TAFKAL80ETC concert -21 0
Backstage passes to a TAFKAL80ETC concert -26 0
Conjured Mana Cake -28 0