Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 45 additions & 59 deletions app/gilded-rose.ts
Original file line number Diff line number Diff line change
@@ -1,69 +1,55 @@
export class Item {
name: string;
sellIn: number;
quality: number;
name: string;
sellIn: number;
quality: number;

constructor(name, sellIn, quality) {
this.name = name;
this.sellIn = sellIn;
this.quality = quality;
}
constructor(name, sellIn, quality) {
this.name = name;
this.sellIn = sellIn;
this.quality = quality;
}
}

export class GildedRose {
items: Array<Item>;
items: Array<Item>;

constructor(items = [] as Array<Item>) {
this.items = items;
}
constructor(items = [] as Array<Item>) {
this.items = items;
}

updateQuality() {
for (let i = 0; i < this.items.length; i++) {
if (this.items[i].name != "Sulfuras, Hand of Ragnaros") {
let qualityDifference = 1;
if (this.items[i].name.includes("Conjured")) {
qualityDifference = 2;
}
if (this.items[i].sellIn <= 0) {
qualityDifference *= 2;
}

updateQuality() {
for (let i = 0; i < this.items.length; i++) {
if (this.items[i].name != 'Aged Brie' && this.items[i].name != 'Backstage passes to a TAFKAL80ETC concert') {
if (this.items[i].quality > 0) {
if (this.items[i].name != 'Sulfuras, Hand of Ragnaros') {
this.items[i].quality = this.items[i].quality - 1
}
}
} else {
if (this.items[i].quality < 50) {
this.items[i].quality = this.items[i].quality + 1
if (this.items[i].name == 'Backstage passes to a TAFKAL80ETC concert') {
if (this.items[i].sellIn < 11) {
if (this.items[i].quality < 50) {
this.items[i].quality = this.items[i].quality + 1
}
}
if (this.items[i].sellIn < 6) {
if (this.items[i].quality < 50) {
this.items[i].quality = this.items[i].quality + 1
}
}
}
}
}
if (this.items[i].name != 'Sulfuras, Hand of Ragnaros') {
this.items[i].sellIn = this.items[i].sellIn - 1;
}
if (this.items[i].sellIn < 0) {
if (this.items[i].name != 'Aged Brie') {
if (this.items[i].name != 'Backstage passes to a TAFKAL80ETC concert') {
if (this.items[i].quality > 0) {
if (this.items[i].name != 'Sulfuras, Hand of Ragnaros') {
this.items[i].quality = this.items[i].quality - 1
}
}
} else {
this.items[i].quality = this.items[i].quality - this.items[i].quality
}
} else {
if (this.items[i].quality < 50) {
this.items[i].quality = this.items[i].quality + 1
}
}
}
if (this.items[i].name != "Aged Brie" && this.items[i].name != "Backstage passes to a TAFKAL80ETC concert" && this.items[i].quality > 0) {
this.items[i].quality = this.items[i].quality >= qualityDifference ? (this.items[i].quality - qualityDifference) : 0;
}

return this.items;
if (this.items[i].name == "Aged Brie" && this.items[i].quality < 50) {
this.items[i].quality = (this.items[i].quality + qualityDifference) <= 50 ? (this.items[i].quality + qualityDifference) : 50;
}

if (this.items[i].name == "Backstage passes to a TAFKAL80ETC concert" && this.items[i].quality < 50) {
if (this.items[i].sellIn > 10) {
this.items[i].quality += qualityDifference;
} else if (5 < this.items[i].sellIn && this.items[i].sellIn <= 10) {
this.items[i].quality = (this.items[i].quality + 2 * qualityDifference) <= 50 ? (this.items[i].quality + 2 * qualityDifference) : 50;
} else if (0 < this.items[i].sellIn && this.items[i].sellIn <= 5) {
this.items[i].quality = (this.items[i].quality + 3 * qualityDifference) <= 50 ? (this.items[i].quality + 3 * qualityDifference) : 50;
} else {
this.items[i].quality = 0;
}
}
this.items[i].sellIn -= 1;
}
}
}
return this.items;
}
}
175 changes: 157 additions & 18 deletions test/jest/gilded-rose.spec.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,164 @@
import { Item, GildedRose } from '@/gilded-rose';
import { Item, GildedRose } from "@/gilded-rose";

describe('Gilded Rose', () => {
it('should foo', () => {
// Arrange
const gildedRose = new GildedRose([new Item('foo', 0, 0)]);
describe("Gilded Rose", () => {
it("should foo", () => {
// Arrange
const gildedRose = new GildedRose([new Item("foo", 0, 0)]);

// Act
const items = gildedRose.updateQuality();
// Act
const items = gildedRose.updateQuality();

// Assert
expect(items[0].name).toBe('bar');
});
// Assert
expect(items[0].name).toBe("foo");
});

it('sword quality drops by 1', () => {
// Arrange
const gildedRose = new GildedRose([new Item('Sword', 1, 1)]);
it("Sulfuras quality is 80 and it never alters", () => {
// Arrange
const gildedRose = new GildedRose([new Item("Sulfuras, Hand of Ragnaros", 1, 80)]);

// Act
const items = gildedRose.updateQuality();
// Act
const items = gildedRose.updateQuality();

// Assert
expect(items[0].quality).toBe(1);
})
// Assert
expect(items[0].quality).toBe(80);
});

it("Sulfuras SellIn date never alters", () => {
// Arrange
const gildedRose = new GildedRose([new Item("Sulfuras, Hand of Ragnaros", 8, 80)]);

// Act
const items = gildedRose.updateQuality();

// Assert
expect(items[0].sellIn).toBe(8);
});

it("SellIn date for items except Sulfuras decreases by 1", () => {
// Arrange
const gildedRose = new GildedRose([
new Item("Sword", 0, 80),
new Item("Aged Brie", 4, 3),
new Item("Backstage passes to a TAFKAL80ETC concert", 5, 5),
]);

// Act
const items = gildedRose.updateQuality();

// Assert
expect(items[0].sellIn).toBe(-1);
expect(items[1].sellIn).toBe(3);
expect(items[2].sellIn).toBe(4);
});

it("sword quality drops by 1", () => {
// Arrange
const gildedRose = new GildedRose([new Item("Sword", 1, 1)]);

// Act
const items = gildedRose.updateQuality();

// Assert
expect(items[0].quality).toBe(0);
});

it("Aged Brie quality increases", () => {
const gildedRose = new GildedRose([new Item("Aged Brie", 1, 0)]);

const items = gildedRose.updateQuality();

expect(items[0].quality).toBe(1);
});

it("Backstage Pass quality increases by 2 when there are 10 days or less", () => {
const gildedRose = new GildedRose([
new Item("Backstage passes to a TAFKAL80ETC concert", 10, 5),
new Item("Backstage passes to a TAFKAL80ETC concert", 7, 5),
]);

const items = gildedRose.updateQuality();

expect(items[0].quality).toBe(7);
expect(items[1].quality).toBe(7);
});

it("Backstage Pass quality increases by 3 when there are 5 days or less", () => {
const gildedRose = new GildedRose([
new Item("Backstage passes to a TAFKAL80ETC concert", 5, 5),
new Item("Backstage passes to a TAFKAL80ETC concert", 3, 5),
]);

const items = gildedRose.updateQuality();

expect(items[0].quality).toBe(8);
expect(items[1].quality).toBe(8);
});

it("Backstage Pass item quality drops to 0 after the concert", () => {
const gildedRose = new GildedRose([
new Item("Backstage passes to a TAFKAL80ETC concert", 0, 5),
]);

const items = gildedRose.updateQuality();

expect(items[0].sellIn).toBe(-1);
expect(items[0].quality).toBe(0);
});

it("quality is never negative", () => {
const gildedRose = new GildedRose([
new Item("Sword", 1, 0),
new Item("Conjured Mana Cake", -3, 0),
]);

const items = gildedRose.updateQuality();

expect(items[0].quality).toBe(0);
expect(items[1].quality).toBe(0);
});

it("Aged Brie quality and Backstage Pass quality are never more than 50", () => {
const gildedRose = new GildedRose([
new Item("Aged Brie", 1, 50),
new Item("Backstage passes to a TAFKAL80ETC concert", 1, 50),
]);

const items = gildedRose.updateQuality();

expect(items[0].quality).toBe(50);
expect(items[1].quality).toBe(50);
});

it("Once the sell by date has passed, Quality degrades twice as fast.", () => {
const gildedRose = new GildedRose([
new Item("Aged Brie", -2, 6),
new Item("Sword", 0, 2),
new Item("Sword", 0, 3),
new Item("Sword", -1, 1),
]);

const items = gildedRose.updateQuality();

expect(items[0].quality).toBe(8);
expect(items[1].quality).toBe(0);
expect(items[2].quality).toBe(1);
expect(items[3].quality).toBe(0);
});

it('"Conjured" items degrade in Quality twice as fast as normal items.', () => {
const gildedRose = new GildedRose([
new Item("Conjured Mana Cake", 3, 6),
new Item("Conjured Mana Cake", 0, 4),
new Item("Conjured Mana Cake", -3, 3),
]);

const items = gildedRose.updateQuality();

expect(items[0].sellIn).toBe(2);
expect(items[0].quality).toBe(4);
expect(items[1].sellIn).toBe(-1);
expect(items[1].quality).toBe(0);
expect(items[2].sellIn).toBe(-4);
expect(items[2].quality).toBe(0);
});
});