From a82d04af1ac3f2fa998ea5f4572e0d1568291019 Mon Sep 17 00:00:00 2001 From: Is Isilon Date: Wed, 24 Feb 2016 17:12:08 +0800 Subject: [PATCH] Added some tests --- .eslintrc | 78 +++++++++++ css/style.css | 3 + css/ui-grid.css | 4 +- fonts/ui-grid.eot | Bin 0 -> 8728 bytes fonts/ui-grid.svg | 34 +++++ fonts/ui-grid.ttf | Bin 0 -> 8564 bytes fonts/ui-grid.woff | Bin 0 -> 4792 bytes index.html | 4 +- js/app.js | 256 ++++++++++++++++++++--------------- js/detector/detector.js | 35 ++--- js/game.js | 131 ++++++++++++------ js/helpers.js | 173 +++++++++++------------ json/elements.json | 142 ++++++++----------- package.json | 41 ++++++ test/e2e/scenarios.js | 101 ++++++++++++++ test/karma.conf.js | 101 ++++++++++++++ test/protractor-conf.js | 22 +++ test/unit/controllersSpec.js | 53 ++++++++ test/unit/directivesSpec.js | 7 + test/unit/filtersSpec.js | 53 ++++++++ test/unit/servicesSpec.js | 27 ++++ 21 files changed, 926 insertions(+), 339 deletions(-) create mode 100644 .eslintrc create mode 100644 fonts/ui-grid.eot create mode 100644 fonts/ui-grid.svg create mode 100644 fonts/ui-grid.ttf create mode 100644 fonts/ui-grid.woff create mode 100644 package.json create mode 100644 test/e2e/scenarios.js create mode 100644 test/karma.conf.js create mode 100644 test/protractor-conf.js create mode 100644 test/unit/controllersSpec.js create mode 100644 test/unit/directivesSpec.js create mode 100644 test/unit/filtersSpec.js create mode 100644 test/unit/servicesSpec.js diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..dd48533 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,78 @@ +{ + "rules": { + # "indent": [ + # 2, + # 4 + # ], + # "linebreak-style": [ + # 2, + # "unix" + # ], + "semi": [ + 2, + "always" + ], + "angular/angularelement": 1, + "angular/controller-as": 2, + "angular/controller-as-route": 2, + "angular/controller-as-vm": [2, "vm"], + "angular/controller-name": [2, "/[A-Z].*Controller$/"], + "angular/deferred": 0, + "angular/definedundefined": 0, + "angular/di": [2, "function"], + "angular/di-order": [0, true], + "angular/directive-name": 0, + "angular/directive-restrict": [0, {"restrict": "AE", "explicit": "never"}], + "angular/component-limit": [0, 1], + "angular/document-service": 2, + "angular/empty-controller": 0, + "angular/file-name": 0, + "angular/filter-name": 0, + "angular/foreach": 0, + "angular/function-type": 0, + "angular/interval-service": 2, + "angular/json-functions": 2, + "angular/log": 0, + "angular/module-dependency-order": [0, {"grouped": true, "prefix": null}], + "angular/module-getter": 0, + "angular/module-name": 0, + "angular/module-setter": 2, + "angular/no-angular-mock": 0, + "angular/no-controller": 0, + "angular/no-cookiestore": 2, + "angular/no-digest": 2, + "angular/no-http-callback": 2, + "angular/no-inline-template": [0, {"allowSimple": true}], + "angular/no-jquery-angularelement": 2, + "angular/no-private-call": 2, + "angular/no-run-logic": [0, {"allowParams": true}], + "angular/no-service-method": 2, + "angular/no-services": [2, ["$http", "$resource", "Restangular"]], + "angular/on-watch": 2, + "angular/one-dependency-per-line": 0, + "angular/rest-service": 0, + "angular/service-name": 2, + "angular/timeout-service": 2, + "angular/typecheck-array": 2, + "angular/typecheck-date": 2, + "angular/typecheck-function": 2, + "angular/typecheck-number": 2, + "angular/typecheck-object": 2, + "angular/typecheck-regexp": 2, + "angular/typecheck-string": 2, + "angular/watchers-execution": [0, "$digest"], + "angular/window-service": 2 + }, + "env": { + "browser": true, + "jquery": true, + "jasmine": true, + "protractor": true, + "node": true, + }, + "globals": { + "window": true, + + }, + "extends": "angular" +} diff --git a/css/style.css b/css/style.css index 798a6de..8a413fc 100644 --- a/css/style.css +++ b/css/style.css @@ -372,6 +372,9 @@ h1 br { .Paired .q10-12{color:rgb(255,255,153)} .Paired .q11-12{color:rgb(177,89,40)} +.Red {color:red;} +.Black {color:black;} + /* ui grid */ .observations-grid { diff --git a/css/ui-grid.css b/css/ui-grid.css index 7da12b1..c893dac 100644 --- a/css/ui-grid.css +++ b/css/ui-grid.css @@ -579,8 +579,8 @@ input[type="text"].ui-grid-filter-input:hover { } @font-face { font-family: 'ui-grid'; - src: url('ui-grid.eot'); - src: url('ui-grid.eot#iefix') format('embedded-opentype'), url('ui-grid.woff') format('woff'), url('ui-grid.ttf?') format('truetype'), url('ui-grid.svg?#ui-grid') format('svg'); + src: url('../fonts/ui-grid.eot'); + src: url('../fonts/ui-grid.eot#iefix') format('embedded-opentype'), url('../fonts/ui-grid.woff') format('woff'), url('../fonts/ui-grid.ttf?') format('truetype'), url('../fonts/ui-grid.svg?#ui-grid') format('svg'); font-weight: normal; font-style: normal; } diff --git a/fonts/ui-grid.eot b/fonts/ui-grid.eot new file mode 100644 index 0000000000000000000000000000000000000000..7c3e956d6760373db38af6e838c0e6365e35fcdc GIT binary patch literal 8728 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 literal 0 HcmV?d00001 diff --git a/fonts/ui-grid.svg b/fonts/ui-grid.svg new file mode 100644 index 0000000..3556111 --- /dev/null +++ b/fonts/ui-grid.svg @@ -0,0 +1,34 @@ + + + +Copyright (C) 2016 by original authors @ fontello.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonts/ui-grid.ttf b/fonts/ui-grid.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9cee108e137a3636a318b8bf176400ad2b6a1605 GIT binary patch literal 8564 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 SwCOEA|7}b84sM4X?7sp24kgh5 literal 0 HcmV?d00001 diff --git a/fonts/ui-grid.woff b/fonts/ui-grid.woff new file mode 100644 index 0000000000000000000000000000000000000000..fbbbb4e09ef041ab4437a986a071b8dc05496560 GIT binary patch literal 4792 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html index ad45356..3c30343 100644 --- a/index.html +++ b/index.html @@ -94,7 +94,7 @@
0) { - UI.showUpdateValue("#update-data", -cost); - UI.showUpdateValue("#update-reputation", item.state.reputation); - } - }; - vs.showInfo = function (r) { - UI.showModal(r.name, r.getInfo()); - UI.showLevels(r.state.level); - }; - }]); + }; - app.controller('DetectorController', ['$scope', 'game', 'detector', function ($scope, game, detector) { + + function DetectorController($scope, game, detector, lab) { var vm = this; vm.elements = detector.elements; vm.dropOptions = { @@ -137,12 +140,12 @@ var app = (function () { vm.onDrop = function (event, ui) { var result = detector.onDrop(event, ui, game); if (result) - game.lab.observe(result); + lab.observe(result); }; vm.click = function () { - game.lab.clickDetector(); + lab.clickDetector(); detector.addEvent(); - UI.showUpdateValue("#update-data", game.lab.state.detector); + UI.showUpdateValue("#update-data", lab.state.detector); game.elements.addKnownToStore(); return false; }; @@ -152,100 +155,135 @@ var app = (function () { }; vm.clearAll = function () { detector.clearAll(game); - } - }]); + }; + }; + DetectorController.$inject = ['$scope', 'game', 'detector', 'lab']; + app.controller('DetectorController', DetectorController); - app.controller('LabController', ['$interval', 'game', 'detector', function ($interval, game, detector) { - this.lab = game.lab; - this.showDetectorInfo = function () { - if (!this._detectorInfo) { - this._detectorInfo = Helpers.loadFile('html/detector.html'); + + function LabController($interval, game, detector, lab) { + // todo give workers instead of game + var vm = this; + vm.lab = lab; + vm.showDetectorInfo = function () { + if (!vm._detectorInfo) { + vm._detectorInfo = Helpers.loadFile('html/detector.html'); } - UI.showModal('Detector', this._detectorInfo); + UI.showModal('Detector', vm._detectorInfo); }; $interval(function () { // one tick - var grant = game.lab.getGrant(); + var grant = lab.getGrant(); UI.showUpdateValue("#update-funding", grant); var sum = 0; for (var i = 0; i < game.workers.length; i++) { sum += game.workers[i].state.hired * game.workers[i].state.rate; } if (sum > 0) { - game.lab.acquireData(sum); + lab.acquireData(sum); UI.showUpdateValue("#update-data", sum); detector.addEventExternal(game.workers.map(function (w) { return w.state.hired; }).reduce(function (a, b) { - return a + b + return a + b; }, 0)); } }, 1000); - }]); + }; + LabController.$inject = ['$interval', 'game', 'detector', 'lab']; + app.controller('LabController', LabController); - app.controller('ObservationsController', ['$scope', 'game', function ($scope, game) { + + function ObservationsController($scope, game, lab) { var vm = this; - vm.observations = game.lab.state.observations; + vm.observations = lab.state.observations; vm.gridOptions = { enableFiltering: true, - columnDefs: [ - { field: 'inputs', filter:{}, visible:true}, - { field: 'reactants', visible:false}, - { field: 'results', visible:true, sort: { direction: 'asc' }}, - { field: 'catalysts', visible:false}, - { field: 'conditions', visible:false}, - ], + columnDefs: [{ + field: 'inputs', + filter: {}, + visible: true + }, { + field: 'reactants', + visible: false + }, { + field: 'results', + visible: true, + sort: { + direction: 'asc' + } + }, { + field: 'catalysts', + visible: false + }, { + field: 'conditions', + visible: false + }, ], data: vm.observations }; - }]); + }; + ObservationsController.$inject = ['$scope', 'game', 'lab']; + app.controller('ObservationsController', ObservationsController); - app.controller('UpgradesController', ['$scope', 'game', function ($scope, game) { - this.upgrades = game.upgrades; - this.isVisible = function (upgrade) { - return upgrade.isVisible(game.lab, game.allObjects); + function UpgradesController($scope, game, lab) { + var vm = this; + vm.upgrades = game.upgrades; + vm.isVisible = function (upgrade) { + return upgrade.isVisible(lab, game.allObjects); }; - this.isAvailable = function (upgrade) { - return upgrade.isAvailable(game.lab, game.allObjects); + vm.isAvailable = function (upgrade) { + return upgrade.isAvailable(lab, game.allObjects); }; - this.upgrade = function (upgrade) { - if (upgrade.buy(game.lab, game.allObjects)) { + vm.upgrade = function (upgrade) { + if (upgrade.buy(lab, game.allObjects)) { UI.showUpdateValue("#update-funding", upgrade.cost); } - } - }]); + }; + }; + UpgradesController.$inject = ['$scope', 'game', 'lab']; + app.controller('UpgradesController', UpgradesController); - app.controller('AchievementsController', function ($scope, game) { - $scope.achievements = game.achievements; - $scope.progress = function () { + function AchievementsController($scope, game, lab) { + var vm = this; + vm.achievements = game.achievements; + vm.progress = function () { return game.achievements.filter(function (a) { - return a.validate(game.lab, game.allObjects, game.lastSaved); + return a.validate(lab, game.allObjects, game.lastSaved); }).length; }; - }); + }; + AchievementsController.$inject = ['$scope', 'game', 'lab']; + app.controller('AchievementsController', AchievementsController); - app.controller('SaveController', ['$scope', '$interval', 'game', function ($scope, $interval, game) { + function SaveController($scope, $interval, $window, game, lab) { + var vm = this; game.lastSaved = new Date().getTime(); - $scope.lastSaved = game.lastSaved; - $scope.saveNow = function () { + vm.lastSaved = game.lastSaved; + vm.saveNow = function () { var saveTime = new Date().getTime(); - game.lab.state.time += saveTime - game.lastSaved; + lab.state.time += saveTime - game.lastSaved; game.save(); game.lastSaved = saveTime; - $scope.lastSaved = game.lastSaved; + vm.lastSaved = game.lastSaved; }; - $scope.restart = function () { - if (window.confirm( + vm.restart = function () { + if ($window.confirm( 'Do you really want to restart the game? All progress will be lost.' )) { ObjectStorage.clear(); - window.location.reload(true); + $window.location.reload(true); } }; - $interval($scope.saveNow, 10000); - }]); + $interval(vm.saveNow, 10000); + }; + SaveController.$inject = ['$scope', '$interval', '$window', 'game', 'lab']; + app.controller('SaveController', SaveController); - app.controller('StatsController', ['$scope', 'game', function ($scope, game) { - $scope.lab = game.lab; - }]); + function StatsController($scope, lab) { + var vm = this; + vm.lab = lab; + }; + StatsController.$inject = ['$scope', 'lab']; + app.controller('StatsController', StatsController); analytics.init(); analytics.sendScreen(analytics.screens.main); diff --git a/js/detector/detector.js b/js/detector/detector.js index ca789db..97282ba 100644 --- a/js/detector/detector.js +++ b/js/detector/detector.js @@ -6,8 +6,8 @@ var Detector = function(){ return { core: { - canvas: null, - ctx: null + // canvas: null, + // ctx: null }, // // events: @@ -19,8 +19,8 @@ var Detector = function(){ flame: { - canvas: null, - ctx: null + // canvas: null, + // ctx: null }, elements: new GameObjects.ElementStores(), @@ -39,15 +39,15 @@ var Detector = function(){ init: function(baseSize,element) { // get canvas - this.core.canvas = document.getElementById('detector-core'); - if (!this.core.canvas) { - this.core.canvas=$(''); - $(element).append(this.core.canvas); - } - this.core.ctx = this.core.canvas.getContext('2d'); - - this.flame.canvas = document.getElementById('detector-flame'); - this.flame.ctx = this.flame.canvas.getContext('2d'); + // this.core.canvas = document.getElementById('detector-core'); + // if (!this.core.canvas) { + // this.core.canvas=$(''); + // $(element).append(this.core.canvas); + // } + // this.core.ctx = this.core.canvas.getContext('2d'); + // + // this.flame.canvas = document.getElementById('detector-flame'); + // this.flame.ctx = this.flame.canvas.getContext('2d'); this.initBubbles(); this.initFlame(); @@ -130,8 +130,8 @@ var Detector = function(){ }, /** Clear an element back to element Store **/ - storeElementByHashKey: function(hashKey,game){ - var i = this.elements.findIndexByHashKey(hashKey); + storeElementBy: function(qObject,game){ + var i = _.findIndex(this.elements,qObject); var removedElement = this.elements.splice(i,1)[0]; return game.elements.get(removedElement.key).state.amount+=1; }, @@ -139,7 +139,7 @@ var Detector = function(){ clearAll: function(game){ var hashKeys = this.elements.map(function(e){return e.$$hashKey;}); for (var i = 0; i < hashKeys.length; i++) { - this.storeElementByHashKey(hashKeys[i], game); + this.storeElementBy({'$$hashKey': hashKeys[i]}, game); } }, @@ -231,7 +231,8 @@ var Detector = function(){ for (var i = 0; i < reactants.length; i++) { // get the uuid from inputs var ingredient = inputs.filter(function(e){return e.key===reactants[i];})[0]; - this.elements.findIndexByHashKey(ingredient.uuid); + var j = _.findIndex(this.elements,{uuid:ingredient.uuid}); + var removed = this.elements.slice(j,1); } // TODO use angular effects to remove in puff of fade diff --git a/js/game.js b/js/game.js index 979954e..912b27a 100644 --- a/js/game.js +++ b/js/game.js @@ -5,19 +5,20 @@ var Game = (function (Helpers, GameObjects, ObjectStorage) { 'use strict'; var Game = function () { - this.lab = new GameObjects.Lab(); + // this.lab = new GameObjects.Lab(); this.elements = null; this.workers = null; this.upgrades = null; this.achievements = null; this.allObjects = { - lab: this.lab + // lab: this.lab }; this.loaded = false; this.rules = null; }; - Game.prototype.load = function () { + Game.prototype.load = function ($http, $q) { + var self = this; if (this.loaded) { return; } @@ -27,50 +28,94 @@ var Game = (function (Helpers, GameObjects, ObjectStorage) { // make it work with Angular. If you know a way, let me know, and I'll // give you a beer. - Kevin this.elements = Helpers.loadFile('json/elements.json'); - this.workers = Helpers.loadFile('json/workers.json'); - this.upgrades = Helpers.loadFile('json/upgrades.json'); - this.achievements = Helpers.loadFile('json/achievements.json'); - this.keywords = Helpers.loadFile('json/keywords.json'); + this.workers = Helpers.loadFile('/json/workers.json'); + this.upgrades = Helpers.loadFile('./json/upgrades.json'); + this.achievements = Helpers.loadFile('./json/achievements.json'); + this.keywords = Helpers.loadFile('./json/keywords.json'); - // Turn JSON files into actual game objects and fill map of all objects - var _this = this; - var makeGameObject = function (type, object) { - // It's okay to define this function here since load is only called - // once anyway... - var o = new type(object); - _this.allObjects[o.key] = o; - return o; - }; - this.elements = this.elements.slice(0,20).map( - function (r) { - return makeGameObject(GameObjects.ElementStore, r); - }); - this.workers = this.workers.map( - function (w) { - return makeGameObject(GameObjects.Worker, w); - }); - this.upgrades = this.upgrades.map( - function (u) { - return makeGameObject(GameObjects.Upgrade, u); - }); - this.achievements = this.achievements.map( - function (a) { - return makeGameObject(GameObjects.Achievement, a); - }); - // Load states from local store - for (var key in this.allObjects) { - var o = this.allObjects[key]; - o.loadState(ObjectStorage.load(key)); - } + // function successCallback(response) { + // return angular.fromJson(response.data); + // } + // + // function errorCallback(response) { + // return console.error('Could not get url', response.statusText, response); + // } + // return $q.all( + // $http.get('json/elements.json', { + // transformResponse: angular.fromJson + // }) + // .then(function (response) { + // return self.elements = response.data; + // }), + // $http.get('json/workers.json', { + // transformResponse: angular.fromJson + // }) + // .then(function (response) { + // return self.workers = response.data; + // }), + // $http.get('json/upgrades.json', { + // transformResponse: angular.fromJson + // }) + // .then( + // function (response) { + // return self.upgrades = response.data; + // }), + // $http.get('json/achievements.json', { + // transformResponse: angular.fromJson + // }) + // .then( + // function (response) { + // return self.achievements = response.data; + // }), + // $http.get('json/keywords.json', { + // transformResponse: angular.fromJson + // }) + // .then( + // function (response) { + // return self.keywords = response.data; + // }) + // ).then(function () { - // put elements in extended array with utility methods - this.elementStore = new GameObjects.ElementStores(); - this.elementStore.push.apply(this.elementStore, this.elements); - this.elements = this.elementStore; + // Turn JSON files into actual game objects and fill map of all objects + var makeGameObject = function (type, object) { + // It's okay to define this function here since load is only called + // once anyway... + var o = new type(object); + self.allObjects[o.key] = o; + return o; + }; + self.elements = self.elements.slice(0, 20).map( + function (r) { + return makeGameObject(GameObjects.ElementStore, r); + }); + self.workers = self.workers.map( + function (w) { + return makeGameObject(GameObjects.Worker, w); + }); + self.upgrades = self.upgrades.map( + function (u) { + return makeGameObject(GameObjects.Upgrade, u); + }); + self.achievements = self.achievements.map( + function (a) { + return makeGameObject(GameObjects.Achievement, a); + }); + // Load states from local store + for (var key in self.allObjects) { + var o = self.allObjects[key]; + o.loadState(ObjectStorage.load(key)); + } - this.rules = this.generateRules(); + // put elements in extended array with utility methods + self.elementStore = new GameObjects.ElementStores(); + self.elementStore.push.apply(self.elementStore, self.elements); + self.elements = self.elementStore; - this.loaded = true; + self.rules = self.generateRules(); + + self.loaded = true; + return self; + // }); }; /** Generate rules between runes **/ diff --git a/js/helpers.js b/js/helpers.js index f2ba604..a903ba4 100644 --- a/js/helpers.js +++ b/js/helpers.js @@ -2,95 +2,102 @@ * Define some useful helpers that are used throughout the game. */ var Helpers = (function () { - 'use strict'; - /** Load a file (usually JSON). - */ - var loadFile = function (filename) { - var res; - $.ajax({ - async: false, - url : filename, - success : function(data) { - res = data; - } - }); - return res; - }; + 'use strict'; + /** Load a file (usually JSON). + */ + var loadFile = function (filename) { + var res; + $.ajax({ + async: false, + url: filename, + success: function (data) { + res = data; + } + }); + return res; + }; - var makeGameObject = function(type, object) { - // It's okay to define this function here since load is only called - // once anyway... - var o = new type(object); - _this.allObjects[o.key] = o; - return o; - }; + /** Format a number with proper postfix. + */ + var formatNumberPostfix = function (number) { + if (typeof number !== "number") { + return 0; + } - /** Format a number with proper postfix. - */ - var formatNumberPostfix = function (number) { - if (typeof number !== "number") { - return 0; + var prefixes = [{ + magnitude: 1e24, + label: 'Y' + }, { + magnitude: 1e21, + label: 'Z' + }, { + magnitude: 1e18, + label: 'E' + }, { + magnitude: 1e15, + label: 'P' + }, { + magnitude: 1e12, + label: 'T' + }, { + magnitude: 1e9, + label: 'B' + }, { + magnitude: 1e6, + label: 'M' + }, { + magnitude: 1e3, + label: 'k' + }]; + + var abs = Math.abs(number); + for (var i = 0; i < prefixes.length; i++) { + if (abs >= prefixes[i].magnitude) { + return (number / prefixes[i].magnitude).toFixed(1) + prefixes[i].label; + } + } + return number; } - var prefixes = [ - { magnitude: 1e24, label: 'Y' }, - { magnitude: 1e21, label: 'Z' }, - { magnitude: 1e18, label: 'E' }, - { magnitude: 1e15, label: 'P' }, - { magnitude: 1e12, label: 'T' }, - { magnitude: 1e9, label: 'B' }, - { magnitude: 1e6, label: 'M' }, - { magnitude: 1e3, label: 'k' } - ]; + var formatTime = function (msec) { + var totals = Math.ceil(msec / 1000); + var days = Math.floor(totals / (24 * 60 * 60)); + var hours = Math.floor((totals % (24 * 60 * 60)) / (60 * 60)); + var totalmin = (totals % (24 * 60 * 60)) % (60 * 60); + var mins = Math.floor(totalmin / 60); + var secs = totalmin % 60; - var abs = Math.abs(number); - for (var i = 0; i < prefixes.length; i++) { - if (abs >= prefixes[i].magnitude) { - return (number / prefixes[i].magnitude).toFixed(1) + prefixes[i].label; - } - } - return number; - } + var str = []; + if (days > 0) { + str.push(days + ' day' + (days % 100 == 1 ? '' : 's')); + } + if (hours > 0) { + str.push(hours + ' h'); + } + if (mins > 0) { + str.push(mins + ' min'); + } + if (secs > 0) { + str.push(secs + ' s'); + } - var formatTime = function (msec) { - var totals = Math.ceil(msec / 1000); - var days = Math.floor(totals / (24 * 60 * 60)); - var hours = Math.floor((totals % (24 * 60 * 60)) / (60 * 60)); - var totalmin = (totals % (24 * 60 * 60)) % (60 * 60); - var mins = Math.floor(totalmin / 60); - var secs = totalmin % 60; + return str.join(', '); + }; - var str = []; - if (days > 0) { - str.push(days + ' day' + (days % 100 == 1 ? '' : 's')); - } - if (hours > 0) { - str.push(hours + ' h'); - } - if (mins > 0) { - str.push(mins + ' min'); - } - if (secs > 0) { - str.push(secs + ' s'); - } + var saveVersion = '1.0'; + var validateSaveVersion = function () { + var ver = ObjectStorage.load('saveVersion'); + if (typeof ver === 'undefined' || ver != saveVersion) { + ObjectStorage.clear(); + ObjectStorage.save('saveVersion', saveVersion); + } + }; - return str.join(', '); - }; - - var saveVersion = '1.0'; - var validateSaveVersion = function () { - var ver = ObjectStorage.load('saveVersion'); - if (typeof ver === 'undefined' || ver != saveVersion) { - ObjectStorage.clear(); - ObjectStorage.save('saveVersion', saveVersion); - } - }; - - return { - loadFile: loadFile, - formatNumberPostfix: formatNumberPostfix, - formatTime: formatTime, - validateSaveVersion: validateSaveVersion, - analytics: '' - }; + return { + loadFile: loadFile, + formatNumberPostfix: formatNumberPostfix, + formatTime: formatTime, + validateSaveVersion: validateSaveVersion, + analytics: '' + }; })(); diff --git a/json/elements.json b/json/elements.json index bc51132..b2655f8 100644 --- a/json/elements.json +++ b/json/elements.json @@ -1,83 +1,59 @@ -[ - {"key":"ᚠ"}, - {"key":"ᚡ"}, - {"key":"ᚢ"}, - {"key":"ᚣ"}, - {"key":"ᚤ"}, - {"key":"ᚥ"}, - {"key":"ᚦ"}, - {"key":"ᚧ"}, - {"key":"ᚨ"}, - {"key":"ᚩ"}, - {"key":"ᚪ"}, - {"key":"ᚫ"}, - {"key":"ᚬ"}, - {"key":"ᚭ"}, - {"key":"ᚮ"}, - {"key":"ᚯ"}, - {"key":"ᚰ"}, - {"key":"ᚱ"}, - {"key":"ᚲ"}, - {"key":"ᚳ"}, - {"key":"ᚴ"}, - {"key":"ᚵ"}, - {"key":"ᚶ"}, - {"key":"ᚷ"}, - {"key":"ᚸ"}, - {"key":"ᚹ"}, - {"key":"ᚺ"}, - {"key":"ᚻ"}, - {"key":"ᚼ"}, - {"key":"ᚽ"}, - {"key":"ᚾ"}, - {"key":"ᚿ"}, - {"key":"ᛀ"}, - {"key":"ᛁ"}, - {"key":"ᛂ"}, - {"key":"ᛃ"}, - {"key":"ᛄ"}, - {"key":"ᛅ"}, - {"key":"ᛆ"}, - {"key":"ᛇ"}, - {"key":"ᛈ"}, - {"key":"ᛉ"}, - {"key":"ᛊ"}, - {"key":"ᛋ"}, - {"key":"ᛌ"}, - {"key":"ᛍ"}, - {"key":"ᛎ"}, - {"key":"ᛏ"}, - {"key":"ᛐ"}, - {"key":"ᛑ"}, - {"key":"ᛒ"}, - {"key":"ᛓ"}, - {"key":"ᛔ"}, - {"key":"ᛕ"}, - {"key":"ᛖ"}, - {"key":"ᛗ"}, - {"key":"ᛘ"}, - {"key":"ᛙ"}, - {"key":"ᛚ"}, - {"key":"ᛛ"}, - {"key":"ᛜ"}, - {"key":"ᛝ"}, - {"key":"ᛞ"}, - {"key":"ᛟ"}, - {"key":"ᛠ"}, - {"key":"ᛡ"}, - {"key":"ᛢ"}, - {"key":"ᛣ"}, - {"key":"ᛤ"}, - {"key":"ᛥ"}, - {"key":"ᛦ"}, - {"key":"ᛧ"}, - {"key":"ᛨ"}, - {"key":"ᛩ"}, - {"key":"ᛪ"}, - {"key":"᛫"}, - {"key":"᛬"}, - {"key":"᛭"}, - {"key":"ᛮ"}, - {"key":"ᛯ"}, - {"key":"ᛰ"} -] +[{"key": "🂡","name":"Ace","value":"1","suite":"Spades","color":"Black","royal":"false","face":"false","number":"false"}, +{"key": "🂢","name":"Two","value":"2","suite":"Spades","color":"Black","royal":"false","face":"false","number":"true"}, +{"key": "🂣","name":"Three","value":"3","suite":"Spades","color":"Black","royal":"false","face":"false","number":"true"}, +{"key": "🂤","name":"Four","value":"4","suite":"Spades","color":"Black","royal":"false","face":"false","number":"true"}, +{"key": "🂥","name":"Five","value":"5","suite":"Spades","color":"Black","royal":"false","face":"false","number":"true"}, +{"key": "🂦","name":"Six","value":"6","suite":"Spades","color":"Black","royal":"false","face":"false","number":"true"}, +{"key": "🂧","name":"Seven","value":"7","suite":"Spades","color":"Black","royal":"false","face":"false","number":"true"}, +{"key": "🂨","name":"Eight","value":"8","suite":"Spades","color":"Black","royal":"false","face":"false","number":"true"}, +{"key": "🂩","name":"Nine","value":"9","suite":"Spades","color":"Black","royal":"false","face":"false","number":"true"}, +{"key": "🂪","name":"Ten","value":"10","suite":"Spades","color":"Black","royal":"false","face":"true","number":"true"}, +{"key": "🂫","name":"Jack","value":"11","suite":"Spades","color":"Black","royal":"true","face":"true","number":"false"}, +{"key": "🂬","name":"Knight","value":"12","suite":"Spades","color":"Black","royal":"true","face":"true","number":"false"}, +{"key": "🂭","name":"Queen","value":"13","suite":"Spades","color":"Black","royal":"true","face":"true","number":"false"}, +{"key": "🂮","name":"King","value":"14","suite":"Spades","color":"Black","royal":"true","face":"true","number":"false"}, +{"key": "🂱","name":"Ace","value":"1","suite":"Hearts","color":"Red","royal":"false","face":"false","number":"false"}, +{"key": "🂲","name":"Two","value":"2","suite":"Hearts","color":"Red","royal":"false","face":"false","number":"true"}, +{"key": "🂳","name":"Three","value":"3","suite":"Hearts","color":"Red","royal":"false","face":"false","number":"true"}, +{"key": "🂴","name":"Four","value":"4","suite":"Hearts","color":"Red","royal":"false","face":"false","number":"true"}, +{"key": "🂵","name":"Five","value":"5","suite":"Hearts","color":"Red","royal":"false","face":"false","number":"true"}, +{"key": "🂶","name":"Six","value":"6","suite":"Hearts","color":"Red","royal":"false","face":"false","number":"true"}, +{"key": "🂷","name":"Seven","value":"7","suite":"Hearts","color":"Red","royal":"false","face":"false","number":"true"}, +{"key": "🂸","name":"Eight","value":"8","suite":"Hearts","color":"Red","royal":"false","face":"false","number":"true"}, +{"key": "🂹","name":"Nine","value":"9","suite":"Hearts","color":"Red","royal":"false","face":"false","number":"true"}, +{"key": "🂺","name":"Ten","value":"10","suite":"Hearts","color":"Red","royal":"false","face":"true","number":"true"}, +{"key": "🂻","name":"Jack","value":"11","suite":"Hearts","color":"Red","royal":"true","face":"true","number":"false"}, +{"key": "🂼","name":"Knight","value":"12","suite":"Hearts","color":"Red","royal":"true","face":"true","number":"false"}, +{"key": "🂽","name":"Queen","value":"13","suite":"Hearts","color":"Red","royal":"true","face":"true","number":"false"}, +{"key": "🂾","name":"King","value":"14","suite":"Hearts","color":"Red","royal":"true","face":"true","number":"false"}, +{"key": "🃁","name":"Ace","value":"1","suite":"Diamonds","color":"Red","royal":"false","face":"false","number":"false"}, +{"key": "🃂","name":"Two","value":"2","suite":"Diamonds","color":"Red","royal":"false","face":"false","number":"true"}, +{"key": "🃃","name":"Three","value":"3","suite":"Diamonds","color":"Red","royal":"false","face":"false","number":"true"}, +{"key": "🃄","name":"Four","value":"4","suite":"Diamonds","color":"Red","royal":"false","face":"false","number":"true"}, +{"key": "🃅","name":"Five","value":"5","suite":"Diamonds","color":"Red","royal":"false","face":"false","number":"true"}, +{"key": "🃆","name":"Six","value":"6","suite":"Diamonds","color":"Red","royal":"false","face":"false","number":"true"}, +{"key": "🃇","name":"Seven","value":"7","suite":"Diamonds","color":"Red","royal":"false","face":"false","number":"true"}, +{"key": "🃈","name":"Eight","value":"8","suite":"Diamonds","color":"Red","royal":"false","face":"false","number":"true"}, +{"key": "🃉","name":"Nine","value":"9","suite":"Diamonds","color":"Red","royal":"false","face":"false","number":"true"}, +{"key": "🃊","name":"Ten","value":"10","suite":"Diamonds","color":"Red","royal":"false","face":"true","number":"true"}, +{"key": "🃋","name":"Jack","value":"11","suite":"Diamonds","color":"Red","royal":"true","face":"true","number":"false"}, +{"key": "🃌","name":"Knight","value":"12","suite":"Diamonds","color":"Red","royal":"true","face":"true","number":"false"}, +{"key": "🃍","name":"Queen","value":"13","suite":"Diamonds","color":"Red","royal":"true","face":"true","number":"false"}, +{"key": "🃎","name":"King","value":"14","suite":"Diamonds","color":"Red","royal":"true","face":"true","number":"false"}, +{"key": "🃑","name":"Ace","value":"1","suite":"Clubs","color":"Black","royal":"false","face":"false","number":"false"}, +{"key": "🃒","name":"Two","value":"2","suite":"Clubs","color":"Black","royal":"false","face":"false","number":"true"}, +{"key": "🃓","name":"Three","value":"3","suite":"Clubs","color":"Black","royal":"false","face":"false","number":"true"}, +{"key": "🃔","name":"Four","value":"4","suite":"Clubs","color":"Black","royal":"false","face":"false","number":"true"}, +{"key": "🃕","name":"Five","value":"5","suite":"Clubs","color":"Black","royal":"false","face":"false","number":"true"}, +{"key": "🃖","name":"Six","value":"6","suite":"Clubs","color":"Black","royal":"false","face":"false","number":"true"}, +{"key": "🃗","name":"Seven","value":"7","suite":"Clubs","color":"Black","royal":"false","face":"false","number":"true"}, +{"key": "🃘","name":"Eight","value":"8","suite":"Clubs","color":"Black","royal":"false","face":"false","number":"true"}, +{"key": "🃙","name":"Nine","value":"9","suite":"Clubs","color":"Black","royal":"false","face":"false","number":"true"}, +{"key": "🃚","name":"Ten","value":"10","suite":"Clubs","color":"Black","royal":"false","face":"true","number":"true"}, +{"key": "🃛","name":"Jack","value":"11","suite":"Clubs","color":"Black","royal":"true","face":"true","number":"false"}, +{"key": "🃜","name":"Knight","value":"12","suite":"Clubs","color":"Black","royal":"true","face":"true","number":"false"}, +{"key": "🃝","name":"Queen","value":"13","suite":"Clubs","color":"Black","royal":"true","face":"true","number":"false"}, +{"key": "🃞","name":"King","value":"14","suite":"Clubs","color":"Black","royal":"true","face":"true","number":"false"}, +{"key": "🂠","name":"Playing Card","value":"15","suite":"Black","color":"Black","royal":"false","face":"false","number":"false"}, +{"key": "🃏","name":"Joker","value":"16","suite":"Black","color":"Black","royal":"false","face":"true","number":"false"}, +{"key": "🃟","name":"Joker","value":"16","suite":"Red","color":"Red","royal":"false","face":"true","number":"false"}] diff --git a/package.json b/package.json new file mode 100644 index 0000000..0af1108 --- /dev/null +++ b/package.json @@ -0,0 +1,41 @@ +{ + "name": "sciencealchemy", + "version": "0.0.5", + "description": "Science Alchemy", + "main": "js/app.js", + "directories": { + "test": "tests" + }, + "scripts": { + "postinstall": "bower install", + "prestart": "npm install", + "start": "http-server -a 0.0.0.0 -p 8000", + "pretest": "npm install", + "test": "node node_modules/karma/bin/karma start test/karma.conf.js", + "test-single-run": "node node_modules/karma/bin/karma start test/karma.conf.js --single-run", + "preupdate-webdriver": "npm install", + "update-webdriver": "webdriver-manager update", + "preprotractor": "npm run update-webdriver", + "protractor": "protractor test/protractor-conf.js", + "update-index-async": "node -e \"require('shelljs/global'); sed('-i', /\\/\\/@@NG_LOADER_START@@[\\s\\S]*\\/\\/@@NG_LOADER_END@@/, '//@@NG_LOADER_START@@\\n' + cat('bower_components/angular-loader/angular-loader.min.js') + '\\n//@@NG_LOADER_END@@', 'app/index-async.html');\"" + }, + "author": "wassname", + "license": "MIT", + "devDependencies": { + "bower": "^1.7.7", + "eslint": "^2.2.0", + "eslint-config-angular": "^0.4.0", + "eslint-plugin-angular": "^0.15.0", + "http-server": "^0.9.0", + "jasmine": "^2.4.1", + "karma": "^0.13.21", + "karma-chrome-launcher": "^0.2.2", + "karma-firefox-launcher": "^0.1.7", + "karma-jasmine": "^0.3.7", + "ng-html2js": "^2.0.0", + "protractor": "^3.1.1", + "shelljs": "^0.6.0", + "tmp": "0.0.28", + "webdriver": "0.0.1" + } +} diff --git a/test/e2e/scenarios.js b/test/e2e/scenarios.js new file mode 100644 index 0000000..79b5b6e --- /dev/null +++ b/test/e2e/scenarios.js @@ -0,0 +1,101 @@ +'use strict'; + +/* http://docs.angularjs.org/guide/dev_guide.e2e-testing */ + +describe('PhoneCat App', function() { + + it('should redirect index.html to index.html#/phones', function() { + browser.get('app/index.html'); + browser.getLocationAbsUrl().then(function(url) { + expect(url).toEqual('/phones'); + }); + }); + + + describe('Phone list view', function() { + + beforeEach(function() { + browser.get('app/index.html#/phones'); + }); + + + it('should filter the phone list as a user types into the search box', function() { + + var phoneList = element.all(by.repeater('phone in phones')); + var query = element(by.model('query')); + + expect(phoneList.count()).toBe(20); + + query.sendKeys('nexus'); + expect(phoneList.count()).toBe(1); + + query.clear(); + query.sendKeys('motorola'); + expect(phoneList.count()).toBe(8); + }); + + + it('should be possible to control phone order via the drop down select box', function() { + + var phoneNameColumn = element.all(by.repeater('phone in phones').column('phone.name')); + var query = element(by.model('query')); + + function getNames() { + return phoneNameColumn.map(function(elm) { + return elm.getText(); + }); + } + + query.sendKeys('tablet'); //let's narrow the dataset to make the test assertions shorter + + expect(getNames()).toEqual([ + "Motorola XOOM\u2122 with Wi-Fi", + "MOTOROLA XOOM\u2122" + ]); + + element(by.model('orderProp')).element(by.css('option[value="name"]')).click(); + + expect(getNames()).toEqual([ + "MOTOROLA XOOM\u2122", + "Motorola XOOM\u2122 with Wi-Fi" + ]); + }); + + + it('should render phone specific links', function() { + var query = element(by.model('query')); + query.sendKeys('nexus'); + element.all(by.css('.phones li a')).first().click(); + browser.getLocationAbsUrl().then(function(url) { + expect(url).toEqual('/phones/nexus-s'); + }); + }); + }); + + + describe('Phone detail view', function() { + + beforeEach(function() { + browser.get('app/index.html#/phones/nexus-s'); + }); + + + it('should display nexus-s page', function() { + expect(element(by.binding('phone.name')).getText()).toBe('Nexus S'); + }); + + + it('should display the first phone image as the main phone image', function() { + expect(element(by.css('img.phone.active')).getAttribute('src')).toMatch(/img\/phones\/nexus-s.0.jpg/); + }); + + + it('should swap main image if a thumbnail image is clicked on', function() { + element(by.css('.phone-thumbs li:nth-child(3) img')).click(); + expect(element(by.css('img.phone.active')).getAttribute('src')).toMatch(/img\/phones\/nexus-s.2.jpg/); + + element(by.css('.phone-thumbs li:nth-child(1) img')).click(); + expect(element(by.css('img.phone.active')).getAttribute('src')).toMatch(/img\/phones\/nexus-s.0.jpg/); + }); + }); +}); diff --git a/test/karma.conf.js b/test/karma.conf.js new file mode 100644 index 0000000..c0189b6 --- /dev/null +++ b/test/karma.conf.js @@ -0,0 +1,101 @@ +module.exports = function (config) { + config.set({ + + basePath: '../', + port: 9876, + // urlRoot: "/", + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: true, + + // enable / disable colors in the output (reporters and logs) + colors: true, + + frameworks: ['jasmine'], + + browsers: ['Chrome', 'Firefox'], + + plugins: [ + 'karma-chrome-launcher', + 'karma-firefox-launcher', + 'karma-jasmine' + ], + + junitReporter: { + outputFile: 'test_out/unit.xml', + suite: 'unit' + }, + + preprocessors: { + "*.html": ["ng-html2js"] + }, + + // ngHtml2JsPreprocessor: { + // // If your build process changes the path to your templates, + // // use stripPrefix and prependPrefix to adjust it. + // // stripPrefix: "source/path/to/templates/.*/", + // // prependPrefix: "web/path/to/templates/", + // + // // the name of the Angular module to create + // moduleName: "scienceAlchemy.templates" + // }, + + + // use this to fix server 404 errors. Karma server everything at /base + proxies: { + '/json/': '/base/json/' + }, + + + // list of files / patterns to load in the browser + files: [ + + // dependencies + 'bower_components/jquery/dist/jquery.js', + 'bower_components/jquery-ui/jquery-ui.js', + 'bower_components/bootstrap/dist/js/bootstrap.js', + 'bower_components/angular/angular.js', + 'bower_components/angular-route/angular-route.js', + 'bower_components/angular-resource/angular-resource.js', + 'bower_components/angular-animate/angular-animate.js', + 'bower_components/angular-mocks/angular-mocks.js', + 'bower_components/angular-dragdrop/src/angular-dragdrop.js', + 'bower_components/angular-ui-grid/ui-grid.js', + 'bower_components/lodash/dist/lodash.js', + 'js/external/*.js', + + // fixtures + { + pattern: 'index.html', + watched: true, + served: true, + included: false + }, { + pattern: 'json/*.json', + watched: true, + served: true, + included: false + }, + { + pattern: 'css/*.css', + watched: true, + served: true, + included: false + }, + + // files to test + 'js/storage.js', + 'js/helpers.js', + 'js/analytics.js', + 'js/gameobjects.js', + 'js/detector/flame.js', + 'js/detector/bubblr.js', + 'js/detector/event.js', + 'js/detector/detector.js', + 'js/ui.js', + 'js/game.js', + 'js/app.js', + 'test/unit/**/*.js' + ], + }); +}; diff --git a/test/protractor-conf.js b/test/protractor-conf.js new file mode 100644 index 0000000..30c78c8 --- /dev/null +++ b/test/protractor-conf.js @@ -0,0 +1,22 @@ + +exports.config = { + allScriptsTimeout: 11000, + + specs: [ + 'e2e/*.js' + ], + + capabilities: { + 'browserName': 'chrome' + }, + + chromeOnly: true, + + baseUrl: 'http://localhost:8000/', + + framework: 'jasmine', + + jasmineNodeOpts: { + defaultTimeoutInterval: 30000 + } +}; diff --git a/test/unit/controllersSpec.js b/test/unit/controllersSpec.js new file mode 100644 index 0000000..f4a336c --- /dev/null +++ b/test/unit/controllersSpec.js @@ -0,0 +1,53 @@ +'use strict'; + +/* jasmine specs for controllers go here */ +describe('scienceAlchemy controllers', function () { + var $controller; + + beforeEach(function () { + jasmine.addMatchers({ + toEqualData: function(util, customEqualityTesters) { + return { + compare: function(actual, expected) { + var passed = angular.equals(actual, expected); + return { + pass: passed, + message: 'Expected "' + actual + '"' + (passed ? '' : ' not') + ' to angular.equals "' + expected + '"' + }; + } + }; + } + }); + }); + beforeEach(module('scienceAlchemy')); + beforeEach(inject(function (_$controller_) { + // The injector unwraps the underscores (_) from around the parameter names when matching + $controller = _$controller_; + })); + + describe('ElementController', function () { + var $scope, controller; + + beforeEach(function () { + $scope = {}; + controller = $controller('ElementController',{$scope:$scope}); + }); + + it('should have elements', function () { + expect(controller.elements).toBeDefined(); + }); + + it('should be visible', function () { + var item = controller.elements[0]; + expect(controller.isVisible(item)).toBeDefined(); + }); + + it('should be isAvailable', function () { + var item = controller.elements[0]; + expect(controller.isAvailable(item)).toBeDefined(); + }); + + // onDrop + }); + +}); diff --git a/test/unit/directivesSpec.js b/test/unit/directivesSpec.js new file mode 100644 index 0000000..2e5469a --- /dev/null +++ b/test/unit/directivesSpec.js @@ -0,0 +1,7 @@ +'use strict'; + +/* jasmine specs for directives go here */ + +describe('directives', function() { + +}); diff --git a/test/unit/filtersSpec.js b/test/unit/filtersSpec.js new file mode 100644 index 0000000..43a61c7 --- /dev/null +++ b/test/unit/filtersSpec.js @@ -0,0 +1,53 @@ +'use strict'; + +/* jasmine specs for filters go here */ + +describe('filter', function () { + + beforeEach( + module('scienceAlchemy') + ); + + describe('niceNumber', function () { + it('should make numbers human readable', + inject(function (niceNumberFilter) { + expect(niceNumberFilter(100000000)).toBe("100.0M"); + expect(niceNumberFilter(10000)).toBe("10.0k"); + expect(niceNumberFilter(0.000000001)).toBe(1e-9); + + })); + }); + + describe('niceTime', function () { + it('should make time human readable', + inject(function (niceTimeFilter) { + expect(niceTimeFilter(100000000)).toBe("1 day, 3 h, 46 min, 40 s"); + expect(niceTimeFilter(10000)).toBe("10 s"); + expect(niceTimeFilter(0.000000001)).toBe("1 s"); + + })); + }); + + describe('currency', function () { + it('should make currency human readable', + inject(function (currencyFilter) { + expect(currencyFilter(100000000)).toBe("JTN 100.0M"); + expect(currencyFilter(10000)).toBe("JTN 10.0k"); + expect(currencyFilter(0.000000001)).toBe('JTN 1e-9'); + })); + }); + + describe('reverse', function () { + it('should reverse', + inject(function (reverseFilter) { + expect(reverseFilter([1,2,3])[0]).toBe(3); + expect(reverseFilter([1,2,3])[1]).toBe(2); + expect(reverseFilter([1,2,3])[2]).toBe(1); + expect(reverseFilter([]).length).toBe(0); + expect(reverseFilter([{i:1,2:2},{i:2},{i:3}])[0].i).toBe(3); + expect(reverseFilter([{i:1,2:2},{i:2},{i:3}])[1].i).toBe(2); + expect(reverseFilter([{i:1,2:2},{i:2},{i:3}])[2].i).toBe(1); + + })); + }); +}); diff --git a/test/unit/servicesSpec.js b/test/unit/servicesSpec.js new file mode 100644 index 0000000..d6bd752 --- /dev/null +++ b/test/unit/servicesSpec.js @@ -0,0 +1,27 @@ +'use strict'; + +describe('services', function () { + + //load modules + beforeEach(module('scienceAlchemy')); + + // Test service availability + describe('game', function () { + it('should exist', inject(function (game) { + expect(game).toBeDefined(); + })); + }); + + describe('detector', function () { + it('should exist', inject(function (detector) { + expect(detector).toBeDefined(); + })); + }); + + describe('lab', function () { + it('should exist', inject(function (lab) { + expect(lab).toBeDefined(); + })); + }); + +});