From cdddfe6e30e6bffc5e3ee8438f14cfc8cd714f73 Mon Sep 17 00:00:00 2001 From: Danielv123 Date: Wed, 22 Nov 2017 18:03:20 +0100 Subject: [PATCH] #61 Completed chunkStore for now, time to work on filling it --- lib/chunkStore.js | 51 +++++++++++++++++++++++++++++------------- lib/chunkStore.spec.js | 29 +++++++++++++++++++----- 2 files changed, 59 insertions(+), 21 deletions(-) diff --git a/lib/chunkStore.js b/lib/chunkStore.js index 61166b50..bcfa9b25 100644 --- a/lib/chunkStore.js +++ b/lib/chunkStore.js @@ -1,8 +1,9 @@ var mkdirp = require("mkdirp-promise"); var mkdirpSync = require("mkdirp").sync; var fs = require("fs"); +var objectOps = require("./objectOps"); -let allowLogging = true; +let allowLogging = false; let log = string => (allowLogging)? console.log(string):"" module.exports = class chunkStore { @@ -14,12 +15,13 @@ module.exports = class chunkStore { } setEntity(x, y, newEntity){ return new Promise((resolve, reject) => { - localX = Math.round(x % this.chunkSize); + var localX = Math.round(x % this.chunkSize); x = Math.floor(Math.round(x)/this.chunkSize); - localY = Math.round(y % this.chunkSize); + var localY = Math.round(y % this.chunkSize); y = Math.floor(Math.round(y)/this.chunkSize); this.getChunk(x,y).then(chunk => { + log("Setentity") if(!chunk.dataObject[localX]) chunk.dataObject[localX] = {}; if(!chunk.dataObject[localX][localY]) chunk.dataObject[localX][localY] = {}; @@ -30,10 +32,11 @@ module.exports = class chunkStore { entity.name = newEntity.name; } else { log("Deleting entry at "+localX+", "+localY); - entity.name = undefined; + chunk.dataObject[localX][localY] = undefined; } this.setChunk(x, y, chunk).then(()=>{ log("Successfully saved chunk!"); + this.getChunk(x,y).then(chunk => resolve(chunk)); }); }); }); @@ -41,8 +44,8 @@ module.exports = class chunkStore { setChunk(x, y, chunk){ return new Promise((resolve, reject) => { mkdirp(this.path+this.name+"/"+x).then(() => { - fs.writeFile(y, JSON.stringify(chunk), function(){ - + fs.writeFile(this.path+this.name+"/"+x+"/"+y, JSON.stringify(chunk), function(){ + resolve(); }); }); }); @@ -54,19 +57,37 @@ module.exports = class chunkStore { dataObject: {}, position:{x,y}, // fancy ES6 feature that generates to {x:x, y:y} chunkSize:this.chunkSize, + get: function(x, y){ + if(this.dataObject[Math.round(x)] && this.dataObject[Math.round(x)][Math.round(y)]){ + return this.dataObject[Math.round(x)][Math.round(y)]; + } else { + return undefined; + } + }, }; - try { - fs.readdir(this.path+this.name, chunkFiles => { - log(chunkFiles); - if(chunkFiles == undefined) { + fs.readFile(this.path+this.name+"/"+x+"/"+y, (err, chunkFile) => { + + if(err){ + log(err) + resolve(chunk); + } else { + if(objectOps.isJSON(chunkFile)) { + log("returned from file") + let chunk = JSON.parse(chunkFile); + chunk.get = function(x, y){ + if(this.dataObject[Math.round(x)] && this.dataObject[Math.round(x)][Math.round(y)]){ + return this.dataObject[Math.round(x)][Math.round(y)]; + } else { + return undefined; + } + } resolve(chunk); } else { - + log("file failed") + resolve(chunk); } - }); // add x and y values as well and we are done? - } catch (e){ - resolve(chunk); - } + } + }); // add x and y values as well and we are done? }); } } \ No newline at end of file diff --git a/lib/chunkStore.spec.js b/lib/chunkStore.spec.js index 3bdbeec6..75ca332b 100644 --- a/lib/chunkStore.spec.js +++ b/lib/chunkStore.spec.js @@ -3,6 +3,11 @@ var assert = require("assert"); var chunkStore = require("./chunkStore.js"); describe("chunkStore.js", () => { + // define some values for our test + const inserterX = 14.5; + const inserterY = -7.5; + const inserterName = "inserter"; + let store // make our store elevated it("is a constructor", ()=>{ assert.equal(typeof chunkStore, "function"); @@ -10,14 +15,26 @@ describe("chunkStore.js", () => { store = new chunkStore("910239"/* instanceID, use defaults for the rest */); assert.equal(store.name, "910239"); }); - it("returns items located in a chunk", done => { - store.getChunk(1,0).then(chunkData => { + it("allows you to store the locations of entities in a chunk divided database", () => { + return store.setEntity(inserterX, inserterY, {name:inserterName}).then(() => { + // nothing to do here really + }); + }); + it("returns items located in a chunk", () => { + // We return the promise to mocha as it supports promises natively, works a lot better than calling done() manually. + let x = 0; + let y = -1 + return store.getChunk(x,y).then(chunkData => { // console.log(chunkData); assert.equal(typeof chunkData, "object"); - assert(chunkData.dataArray); - assert.equal(chunkData.position.x, 1); - assert.equal(chunkData.position.y, 0); - done(); + assert.equal(chunkData.get(inserterX, inserterY).name, inserterName); + assert.equal(chunkData.position.x, x); + assert.equal(chunkData.position.y, y); + }); + }); + it("deletes entities when not provided with an object as 3rd arg", () => { + return store.setEntity(inserterX, inserterY).then((chunk)=>{ + assert(!chunk.get(inserterX, inserterY)); }); }); }); \ No newline at end of file