From 197061644308873b67a23f6626f788e93eb06910 Mon Sep 17 00:00:00 2001 From: Colin McLeod Date: Tue, 1 Sep 2015 18:36:57 -0700 Subject: [PATCH] Add cargo hatch priority and status to be included in detailed export --- app/js/service-serializer.js | 22 ++++++++++--------- app/js/shipyard/factory-ship.js | 12 +++++----- app/js/shipyard/service-components.js | 2 +- app/schemas/ship-loadout/2.json | 9 +++++++- ... => anaconda-test-detailed-export-v2.json} | 8 +++++-- test/tests/test-controller-import.js | 22 +++++++++++++++---- test/tests/test-service-serializer.js | 13 +++-------- 7 files changed, 54 insertions(+), 34 deletions(-) rename test/fixtures/{anaconda-test-detailed-export.json => anaconda-test-detailed-export-v2.json} (97%) diff --git a/app/js/service-serializer.js b/app/js/service-serializer.js index e1a11f63..6dd5a41d 100755 --- a/app/js/service-serializer.js +++ b/app/js/service-serializer.js @@ -10,8 +10,8 @@ angular.module('app').service('Serializer', ['lodash', 'GroupMap', 'MountMap', ' */ this.fromShip = function(ship) { var power = { - enabled: [ship.cargoScoop.enabled ? 1 : 0], - priorities: [ship.cargoScoop.priority] + enabled: [ship.cargoHatch.enabled ? 1 : 0], + priorities: [ship.cargoHatch.priority] }; var data = [ @@ -84,6 +84,7 @@ angular.module('app').service('Serializer', ['lodash', 'GroupMap', 'MountMap', ' components: { standard: { bulkheads: ship.bulkheads.c.name, + cargoHatch: { enabled: Boolean(ship.cargoHatch.enabled), priority: ship.cargoHatch.priority + 1 }, powerPlant: { class: standard[0].c.class, rating: standard[0].c.rating, enabled: Boolean(standard[0].enabled), priority: standard[0].priority + 1 }, thrusters: { class: standard[1].c.class, rating: standard[1].c.rating, enabled: Boolean(standard[1].enabled), priority: standard[1].priority + 1 }, frameShiftDrive: { class: standard[2].c.class, rating: standard[2].c.rating, enabled: Boolean(standard[2].enabled), priority: standard[2].priority + 1 }, @@ -116,25 +117,26 @@ angular.module('app').service('Serializer', ['lodash', 'GroupMap', 'MountMap', ' } var comps = detailedBuild.components; - var priorities = [ 0 ]; // cargoScoop - var enabled = [ true ]; // assume cargoScoop enabled + var standard = comps.standard; + var priorities = [ standard.cargoHatch && standard.cargoHatch.priority !== undefined ? standard.cargoHatch.priority - 1 : 0 ]; + var enabled = [ standard.cargoHatch && standard.cargoHatch.enabled !== undefined ? standard.cargoHatch.enabled : true ]; var shipData = ShipsDB[shipId]; var ship = new Ship(shipId, shipData.properties, shipData.slots); - var bulkheads = Components.bulkheadIndex(comps.standard.bulkheads); + var bulkheads = Components.bulkheadIndex(standard.bulkheads); if (bulkheads < 0) { - throw 'Invalid bulkheads: ' + comps.standard.bulkheads; + throw 'Invalid bulkheads: ' + standard.bulkheads; } var common = _.map( ['powerPlant', 'thrusters', 'frameShiftDrive', 'lifeSupport', 'powerDistributor', 'sensors', 'fuelTank'], function(c) { - if (!comps.standard[c].class || !comps.standard[c].rating) { + if (!standard[c].class || !standard[c].rating) { throw 'Invalid value for ' + c; } - priorities.push(comps.standard[c].priority === undefined ? 0 : comps.standard[c].priority - 1); - enabled.push(comps.standard[c].enabled === undefined ? true : comps.standard[c].enabled); - return comps.standard[c].class + comps.standard[c].rating; + priorities.push(standard[c].priority === undefined ? 0 : standard[c].priority - 1); + enabled.push(standard[c].enabled === undefined ? true : standard[c].enabled); + return standard[c].class + standard[c].rating; } ); diff --git a/app/js/shipyard/factory-ship.js b/app/js/shipyard/factory-ship.js index 907627e9..80156f23 100755 --- a/app/js/shipyard/factory-ship.js +++ b/app/js/shipyard/factory-ship.js @@ -27,7 +27,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength', */ function Ship(id, properties, slots) { this.id = id; - this.cargoScoop = { c: Components.cargoScoop(), type: 'SYS' }; + this.cargoHatch = { c: Components.cargoHatch(), type: 'SYS' }; this.bulkheads = { incCost: true, maxClass: 8 }; for (var p in properties) { this[p] = properties[p]; } // Copy all base properties from shipData @@ -51,7 +51,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength', this.costList.unshift(this.c); // Add the ship itself to the list this.powerList = _.union(this.internal, this.hardpoints); - this.powerList.unshift(this.cargoScoop); + this.powerList.unshift(this.cargoHatch); this.powerList.unshift(this.common[1]); // Add Thrusters this.powerList.unshift(this.common[5]); // Add Sensors this.powerList.unshift(this.common[4]); // Add Power Distributor @@ -96,8 +96,8 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength', this.bulkheads.c = null; this.useBulkhead(comps && comps.bulkheads ? comps.bulkheads : 0, true); - this.cargoScoop.priority = priorities ? priorities[0] * 1 : 0; - this.cargoScoop.enabled = enabled ? enabled[0] * 1 : true; + this.cargoHatch.priority = priorities ? priorities[0] * 1 : 0; + this.cargoHatch.enabled = enabled ? enabled[0] * 1 : true; for (i = 0, l = this.priorityBands.length; i < l; i++) { this.priorityBands[i].deployed = 0; @@ -105,8 +105,8 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength', this.priorityBands[i].retOnly = 0; } - if (this.cargoScoop.enabled) { - bands[this.cargoScoop.priority].retracted += this.cargoScoop.c.power; + if (this.cargoHatch.enabled) { + bands[this.cargoHatch.priority].retracted += this.cargoHatch.c.power; } for (i = 0; i < cl; i++) { diff --git a/app/js/shipyard/service-components.js b/app/js/shipyard/service-components.js index 4876fa19..97afbe65 100755 --- a/app/js/shipyard/service-components.js +++ b/app/js/shipyard/service-components.js @@ -6,7 +6,7 @@ angular.module('shipyard').service('Components', ['lodash', 'ComponentsDB', 'Shi GrpNameToCodeMap[GroupMap[grp]] = grp; } - this.cargoScoop = function() { + this.cargoHatch = function() { return { name: 'Cargo Hatch', class: 1, rating: 'H', power: 0.6 }; }; diff --git a/app/schemas/ship-loadout/2.json b/app/schemas/ship-loadout/2.json index 3420eef7..f1a3fa54 100644 --- a/app/schemas/ship-loadout/2.json +++ b/app/schemas/ship-loadout/2.json @@ -49,11 +49,18 @@ "description": "The set of standard components across all ships", "type": "object", "additionalProperties": false, - "required": ["bulkheads", "powerPlant", "thrusters", "frameShiftDrive", "lifeSupport", "powerDistributor", "sensors", "fuelTank"], + "required": ["bulkheads", "powerPlant", "thrusters", "frameShiftDrive", "lifeSupport", "powerDistributor", "sensors", "fuelTank", "cargoHatch"], "properties": { "bulkheads": { "enum": ["Lightweight Alloy", "Reinforced Alloy", "Military Grade Composite", "Mirrored Surface Composite", "Reactive Surface Composite"] }, + "cargoHatch": { + "required": ["enabled", "priority"], + "properties": { + "enabled": { "type": "boolean" }, + "priority": { "type": "integer", "minimum": 1, "maximum": 5 } + } + }, "powerPlant": { "required": ["class", "rating", "enabled", "priority"], "properties": { diff --git a/test/fixtures/anaconda-test-detailed-export.json b/test/fixtures/anaconda-test-detailed-export-v2.json similarity index 97% rename from test/fixtures/anaconda-test-detailed-export.json rename to test/fixtures/anaconda-test-detailed-export-v2.json index 748b8b46..0e0a41f5 100644 --- a/test/fixtures/anaconda-test-detailed-export.json +++ b/test/fixtures/anaconda-test-detailed-export-v2.json @@ -13,6 +13,10 @@ "components": { "standard": { "bulkheads": "Reactive Surface Composite", + "cargoHatch": { + "enabled": false, + "priority": 5 + }, "powerPlant": { "class": 8, "rating": "A", @@ -269,8 +273,8 @@ "unladenMass": 1179.2, "totalDps": 29, "powerAvailable": 36, - "powerRetracted": 23.93, - "powerDeployed": 35.36, + "powerRetracted": 23.33, + "powerDeployed": 34.76, "unladenRange": 18.49, "fullTankRange": 18.12, "ladenRange": 16.39, diff --git a/test/tests/test-controller-import.js b/test/tests/test-controller-import.js index 2a373559..2c169691 100644 --- a/test/tests/test-controller-import.js +++ b/test/tests/test-controller-import.js @@ -98,8 +98,8 @@ describe('Import Controller', function() { describe('Import Detailed Build', function() { - it('imports a valid build', function() { - var importData = __json__['fixtures/anaconda-test-detailed-export']; + it('imports a valid v1 build', function() { + var importData = __json__['fixtures/anaconda-test-detailed-export-v1']; scope.importString = angular.toJson(importData); scope.validateImport(); expect(scope.importValid).toBeTruthy(); @@ -108,12 +108,26 @@ describe('Import Controller', function() { expect(scope.processed).toBeTruthy(); scope.import(); expect(angular.fromJson(localStorage.getItem('builds'))).toEqual({ - anaconda: { 'Test': '48A6A6A5A8A8A5C2c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04--0303326b.Iw18QDBNA===.AwhMJBGaei+JCyyiA===' } + anaconda: { 'Test': '48A6A6A5A8A8A5C2c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04--0303326b.Iw18ZlA=.Aw18ZlA=' } + }); + }); + + it('imports a valid v2 build', function() { + var importData = __json__['fixtures/anaconda-test-detailed-export-v2']; + scope.importString = angular.toJson(importData); + scope.validateImport(); + expect(scope.importValid).toBeTruthy(); + expect(scope.errorMsg).toEqual(null); + scope.process(); + expect(scope.processed).toBeTruthy(); + scope.import(); + expect(angular.fromJson(localStorage.getItem('builds'))).toEqual({ + anaconda: { 'Test': '48A6A6A5A8A8A5C2c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04--0303326b.AwRj4zNKqA==.CwBhCYzBGW9qCTSqs5xA' } }); }); it('catches an invalid build', function() { - var importData = __json__['fixtures/anaconda-test-detailed-export']; + var importData = __json__['fixtures/anaconda-test-detailed-export-v2']; scope.importString = angular.toJson(importData).replace('components', 'comps'); scope.validateImport(); expect(scope.importValid).toBeFalsy(); diff --git a/test/tests/test-service-serializer.js b/test/tests/test-service-serializer.js index 2380d159..1fe8b1ab 100644 --- a/test/tests/test-service-serializer.js +++ b/test/tests/test-service-serializer.js @@ -3,7 +3,7 @@ describe("Serializer Service", function() { var Ship, Serializer, - code = '48A6A6A5A8A8A5C2c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04--0303326b.Iw18QDBNA===.AwhMJBGaei+JCyyiA===', + code = '48A6A6A5A8A8A5C2c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04--0303326b.AwRj4zNKqA==.CwBhCYzBGW9qCTSqs5xA', anaconda = DB.ships['anaconda'], testBuild, exportData; @@ -21,13 +21,6 @@ describe("Serializer Service", function() { exportData = Serializer.toDetailedBuild('Test', testBuild, code); }); - it("conforms to the v1 ship-loadout schema", function() { - var shipLoadoutSchema = __json__['schemas/ship-loadout/1']; - var validate = jsen(shipLoadoutSchema); - var valid = validate(exportData); - expect(valid).toBeTruthy(); - }); - it("conforms to the v2 ship-loadout schema", function() { var shipLoadoutSchema = __json__['schemas/ship-loadout/2']; var validate = jsen(shipLoadoutSchema); @@ -36,7 +29,7 @@ describe("Serializer Service", function() { }); it("contains the correct components and stats", function() { - var anacondaTestExport = __json__['fixtures/anaconda-test-detailed-export']; + var anacondaTestExport = __json__['fixtures/anaconda-test-detailed-export-v2']; expect(exportData.components).toEqual(anacondaTestExport.components); expect(exportData.stats).toEqual(anacondaTestExport.stats); expect(exportData.ship).toEqual(anacondaTestExport.ship); @@ -48,7 +41,7 @@ describe("Serializer Service", function() { describe("From Detailed Build", function() { it("builds the ship correctly", function() { - var anacondaTestExport = __json__['fixtures/anaconda-test-detailed-export']; + var anacondaTestExport = __json__['fixtures/anaconda-test-detailed-export-v2']; testBuildA = new Ship('anaconda', anaconda.properties, anaconda.slots); Serializer.toShip(testBuildA, code); testBuildB = Serializer.fromDetailedBuild(anacondaTestExport);