Skip to content

Commit

Permalink
Initial setup
Browse files Browse the repository at this point in the history
  • Loading branch information
SteMat89 committed Nov 7, 2024
1 parent aeabb5b commit ec5275a
Show file tree
Hide file tree
Showing 11 changed files with 8,921 additions and 1 deletion.
12 changes: 12 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
root = true

[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

[*.md]
trim_trailing_whitespace = false
11 changes: 11 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
.DS_Store
.idea
node_modules
typings
app/**/*.js
app/**/*.js.map
test/**/*.js
test/**/*.js.map
coverage
.nyc_output
jest/__snapshots__
17 changes: 17 additions & 0 deletions .nycrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
module.exports = {
extension: [
".ts"
],
exclude: [
"**/*.d.ts",
"test/**",
"/*.js"
],
require: [
"ts-node/register"
],
reporter: [
"html",
"text"
]
}
92 changes: 91 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,92 @@
# workshop-soft-eng
Hands-on workshop on good practices in software engineering

Hands-on workshop on good practices in software engineering. We're going to have a look at TDD, Unit Testing, Refactoring
and CI/CD.

# Gilded Rose Refactoring Kata

Today's workshop is based on a popular refactoring exercise you can find out more about [here](https://github.com/emilybache/GildedRose-Refactoring-Kata/tree/main).

# Setup

We recommend using [Intellij](https://www.jetbrains.com/idea/download/) as the IDE.

You will have to install [Node](https://nodejs.org/en/download/package-manager) v18.20. This should also install `npm`,
which is a Node packet manager

You might also have to install [ts-node](https://www.npmjs.com/package/ts-node#installation), after you get Node.

```
# Locally in your project.
npm install -D typescript
npm install -D ts-node
```

# Getting started

**First, fork this repository and clone it on your device.**

Then, install dependencies

```npm install```

# Run the unit tests from the Command-Line

We are using jest as a testing framework.

To run tests:

```npm run test:jest```

To run all tests in watch mode:

```npm run test:jest:watch```

# Running the app

You can run the application seeing how the `updateQuality()` function works:

```npx ts-node test/golden-master-text-test.ts```

Or with the number of days as args:

```npx ts-node test/golde-master-text-test.ts 10```

# Gilded Rose Requirements Specification

Hi and welcome to team Gilded Rose. As you know, we are a small inn with a prime location in a
prominent city ran by a friendly innkeeper named Allison. We also buy and sell only the finest goods.
Unfortunately, our goods are constantly degrading in `Quality` as they approach their sell by date.

We have a system in place that updates our inventory for us. It was developed by a no-nonsense type named
Leeroy, who has moved on to new adventures. Your task is to add the new feature to our system so that
we can begin selling a new category of items. First an introduction to our system:

- All `items` have a `SellIn` value which denotes the number of days we have to sell the `items`
- All `items` have a `Quality` value which denotes how valuable the item is
- At the end of each day our system lowers both values for every item

Pretty simple, right? Well this is where it gets interesting:

- Once the sell by date has passed, `Quality` degrades twice as fast
- The `Quality` of an item is never negative
- __"Aged Brie"__ actually increases in `Quality` the older it gets
- The `Quality` of an item is never more than `50`
- __"Sulfuras"__, being a legendary item, never has to be sold or decreases in `Quality`
- __"Backstage passes"__, like aged brie, increases in `Quality` as its `SellIn` value approaches;
- `Quality` increases by `2` when there are `10` days or less and by `3` when there are `5` days or less but
- `Quality` drops to `0` after the concert

We have recently signed a supplier of conjured items. This requires an update to our system:

- __"Conjured"__ items degrade in `Quality` twice as fast as normal items

Feel free to make any changes to the `UpdateQuality` method and add any new code as long as everything
still works correctly. However, do not alter the `Item` class or `Items` property as those belong to the
goblin in the corner who will insta-rage and one-shot you as he doesn't believe in shared code
ownership (you can make the `UpdateQuality` method and `Items` property static if you like, we'll cover
for you).

Just for clarification, an item can never have its `Quality` increase above `50`, however __"Sulfuras"__ is a
legendary item and as such its `Quality` is `80` and it never alters.
69 changes: 69 additions & 0 deletions app/gilded-rose.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
export class Item {
name: string;
sellIn: number;
quality: number;

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

export class GildedRose {
items: Array<Item>;

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

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
}
}
}
}

return this.items;
}
}
23 changes: 23 additions & 0 deletions jest.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { pathsToModuleNameMapper } from "ts-jest/utils";
const { compilerOptions } = require("./tsconfig");

export default {
roots: ['<rootDir>/app', '<rootDir>/test/jest'],
collectCoverage: true,
coverageDirectory: 'coverage',
coverageProvider: 'v8',
transform: {
'^.+\\.tsx?$': 'ts-jest',
},
moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths, { prefix: '<rootDir>/' } ),

testPathIgnorePatterns: [
'/node_modules/',
'/dist/', // Ignore the output directory
'/build/', // Ignore any build directory if used
'\\.js$', // Ignore .js test files if they are in the same directories as .ts tests
],

// Optionally specify testMatch to explicitly look for only TypeScript files
testMatch: ["**/?(*.)+(spec|test).ts?(x)"], // Only `.ts` and `.tsx` files
};
Loading

0 comments on commit ec5275a

Please sign in to comment.