diff --git a/js/.gitignore b/js/.gitignore new file mode 100644 index 0000000000..5c843fd1c1 --- /dev/null +++ b/js/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +.nyc_output/ +coverage/ diff --git a/js/README.md b/js/README.md new file mode 100644 index 0000000000..f2c642c4b5 --- /dev/null +++ b/js/README.md @@ -0,0 +1,27 @@ +# Running Tests + +# In the Browser + +open `SpecRunner.html` in your browser + +You can also open `TexttestFixture.html` to see an overview + +# In NodeJS + +Install dependencies + +``` +npm install +``` + +Run tests + +``` +npm test +``` + +To auto-run on change, install `nodemon` and then you can do + +``` +nodemon --exec jasmine +``` diff --git a/js/TexttestFixture.html b/js/TexttestFixture.html index cf45349573..422f37c569 100644 --- a/js/TexttestFixture.html +++ b/js/TexttestFixture.html @@ -1,7 +1,7 @@ - + Gilded Rose Texttest Fixture @@ -12,6 +12,8 @@ $('body').append('

OMGHAI!

'); + var items = []; + items.push(new Item('+5 Dexterity Vest', 10, 20)); items.push(new Item('Aged Brie', 2, 0)); items.push(new Item('Elixir of the Mongoose', 5, 7)); @@ -28,7 +30,7 @@ for (var i = 0; i < days; i++) { showHeaderFor(i); showItemsFor(i); - update_quality(); + items = update_quality(items); } function showHeaderFor(day) { diff --git a/js/package-lock.json b/js/package-lock.json new file mode 100644 index 0000000000..f6e151f77c --- /dev/null +++ b/js/package-lock.json @@ -0,0 +1,112 @@ +{ + "name": "gilded-rose-kata", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "jasmine": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.3.1.tgz", + "integrity": "sha512-/vU3/H7U56XsxIXHwgEuWpCgQ0bRi2iiZeUpx7Nqo8n1TpoDHfZhkPIc7CO8I4pnMzYsi3XaSZEiy8cnTfujng==", + "dev": true, + "requires": { + "glob": "^7.0.6", + "jasmine-core": "~3.3.0" + } + }, + "jasmine-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.3.0.tgz", + "integrity": "sha512-3/xSmG/d35hf80BEN66Y6g9Ca5l/Isdeg/j6zvbTYlTzeKinzmaTM4p9am5kYqOmE05D7s1t8FGjzdSnbUbceA==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } +} diff --git a/js/package.json b/js/package.json new file mode 100644 index 0000000000..c512905b87 --- /dev/null +++ b/js/package.json @@ -0,0 +1,14 @@ +{ + "name": "gilded-rose-kata", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "jasmine" + }, + "author": "CircleCI", + "license": "MIT", + "devDependencies": { + "jasmine": "^3.3.0" + } +} diff --git a/js/runner.js b/js/runner.js new file mode 100644 index 0000000000..45bed0e507 --- /dev/null +++ b/js/runner.js @@ -0,0 +1,35 @@ +const fs = require("fs"); +const path = require("path"); + +const {Item, update_quality} = require('./src/gilded_rose'); + +if (process.argv.length < 3) { + console.warn("Usage: node runner.js "); + process.exit(1); +} + +const inFile = process.argv[2]; +const outFile = process.argv[3]; + +console.warn("Reading from %s, writing to %s", inFile, outFile); + +function parseItem(line) { + var [name, sell_in, quality] = line.split("__"); + return new Item(name, Number(sell_in), Number(quality)); +} +function unparseItem(item) { + return [item.name, item.sell_in, item.quality].join("__"); +} + +const items = fs.readFileSync(inFile, "utf8") + .split("\n") + .map(l => l.trim()) + .filter(l => l && !l.startsWith(";")) + .map(parseItem); + +const output = update_quality(items) + .map(unparseItem) + .join("\n"); + +fs.mkdirSync(path.dirname(outFile), {recursive: true}); +fs.writeFileSync(outFile, output); diff --git a/js/spec/gilded_rose_spec.js b/js/spec/gilded_rose_spec.js index 4b60ad34a3..a6110b566c 100644 --- a/js/spec/gilded_rose_spec.js +++ b/js/spec/gilded_rose_spec.js @@ -1,8 +1,13 @@ +if (typeof require === 'function') { + var gilded_rose = require('../src/gilded_rose.js'); + var Item = gilded_rose.Item; + var update_quality = gilded_rose.update_quality; +} + describe("Gilded Rose", function() { it("should foo", function() { - items = [ new Item("foo", 0, 0) ]; - update_quality(); + var items = update_quality([ new Item("foo", 0, 0) ]); expect(items[0].name).toEqual("fixme"); }); diff --git a/js/spec/support/jasmine.json b/js/spec/support/jasmine.json new file mode 100644 index 0000000000..aca04ab368 --- /dev/null +++ b/js/spec/support/jasmine.json @@ -0,0 +1,11 @@ +{ + "spec_dir": "spec", + "spec_files": [ + "**/*[sS]pec.js" + ], + "helpers": [ + "helpers/**/*.js" + ], + "oneFailurePerSpec": false, + "random": true +} diff --git a/js/src/gilded_rose.js b/js/src/gilded_rose.js index 4d28da895e..3391947326 100644 --- a/js/src/gilded_rose.js +++ b/js/src/gilded_rose.js @@ -4,9 +4,7 @@ function Item(name, sell_in, quality) { this.quality = quality; } -var items = [] - -function update_quality() { +function update_quality(items) { for (var i = 0; i < items.length; i++) { if (items[i].name != 'Aged Brie' && items[i].name != 'Backstage passes to a TAFKAL80ETC concert') { if (items[i].quality > 0) { @@ -52,4 +50,10 @@ function update_quality() { } } } + + return items; +} + +if (typeof module === 'object') { + exports = module.exports = {Item: Item, update_quality: update_quality}; }