"use strict"; var KEY_PREFIX = "__LOCAL_STORAGE_TEST__"; var EDITS_QUEUE_KEY = "esriEditsQueue"; var REDO_STACK_KEY = "esriRedoStack"; var EXECUTE_LONG_TESTS = true; describe("Internal Methods", function() { describe("Serialize/Deserialize Graphics", function() { describe("Sanity Check", function() { it("validate geometry objects", function() { // sanity checks on test data expect(typeof(g_test)).toBe("object"); // geometry expect(typeof(g_test.point)).toBe("object"); expect(g_test.point.declaredClass).toBe("esri.geometry.Point"); expect(g_test.point.type).toBe("point"); expect(g_test.point.spatialReference.wkid).toEqual(4326); expect(typeof(g_test.line)).toBe("object"); expect(g_test.line.declaredClass).toBe("esri.geometry.Polyline"); expect(g_test.line.type).toBe("polyline"); expect(g_test.line.spatialReference.wkid).toEqual(4326); expect(typeof(g_test.polygon)).toBe("object"); expect(g_test.polygon.declaredClass).toBe("esri.geometry.Polygon"); expect(g_test.polygon.type).toBe("polygon"); expect(g_test.polygon.spatialReference.wkid).toEqual(4326); }); it("validate symbols", function() { // symbols expect(typeof(g_test.pointSymbol)).toBe("object"); expect(g_test.pointSymbol.declaredClass).toBe("esri.symbol.SimpleMarkerSymbol"); expect(g_test.pointSymbol.style).toBe("circle"); expect(typeof(g_test.lineSymbol)).toBe("object"); expect(g_test.lineSymbol.declaredClass).toBe("esri.symbol.SimpleLineSymbol"); expect(g_test.lineSymbol.style).toBe("dot"); expect(typeof(g_test.polygonSymbol)).toBe("object"); expect(g_test.polygonSymbol.declaredClass).toBe("esri.symbol.SimpleFillSymbol"); expect(g_test.polygonSymbol.style).toBe("solid"); }); it("validate features", function() { // features expect(typeof(g_test.pointFeature)).toBe("object"); expect(g_test.pointFeature.declaredClass).toBe("esri.Graphic"); expect(g_test.pointFeature.geometry).toEqual(g_test.point); expect(g_test.pointFeature.symbol).toEqual(g_test.pointSymbol); expect(typeof(g_test.pointFeature.attributes)).toBe("object"); expect(typeof(g_test.lineFeature)).toBe("object"); expect(g_test.lineFeature.declaredClass).toBe("esri.Graphic"); expect(g_test.lineFeature.geometry).toEqual(g_test.line); expect(g_test.lineFeature.symbol).toEqual(g_test.lineSymbol); expect(typeof(g_test.lineFeature.attributes)).toBe("object"); expect(typeof(g_test.polygonFeature)).toBe("object"); expect(g_test.polygonFeature.declaredClass).toBe("esri.Graphic"); expect(g_test.polygonFeature.geometry).toEqual(g_test.polygon); expect(g_test.polygonFeature.symbol).toEqual(g_test.polygonSymbol); expect(typeof(g_test.polygonFeature.attributes)).toBe("object"); }); }); describe("Serialize/Deserialize Point", function() { var str, graphic; it("serialize", function() { str = g_editsStore._serialize(g_test.pointFeature); expect(typeof(str)).toBe("string"); }); it("deserialize", function() { graphic = g_editsStore._deserialize(str); expect(typeof(graphic)).toBe("object"); expect(graphic.declaredClass).toEqual("esri.Graphic"); }); it("deserialize - attributes", function() { expect(graphic.attributes).toEqual(g_test.pointFeature.attributes); }); it("deserialize - geometry", function() { expect(graphic.geometry).toEqual(g_test.pointFeature.geometry); }); it("deserialize - symbol should be null", function() { expect(graphic.symbol).toBeNull(); }); it("deserialize - infoTemplate should be null", function() { expect(graphic.infoTemplate).toBeNull(); }); }); describe("Serialize/Deserialize Polyline", function() { var str, graphic; it("serialize", function() { str = g_editsStore._serialize(g_test.lineFeature); expect(typeof(str)).toBe("string"); }); it("deserialize", function() { graphic = g_editsStore._deserialize(str); expect(typeof(graphic)).toBe("object"); expect(graphic.declaredClass).toEqual("esri.Graphic"); }); it("deserialize - attributes", function() { expect(graphic.attributes).toEqual(g_test.lineFeature.attributes); }); it("deserialize - geometry", function() { expect(graphic.geometry).toEqual(g_test.lineFeature.geometry); }); it("deserialize - symbol should be null", function() { expect(graphic.symbol).toBeNull(); }); it("deserialize - infoTemplate should be null", function() { expect(graphic.infoTemplate).toBeNull(); }); }); describe("Serialize/Deserialize Polygon", function() { var str, graphic; it("serialize", function() { str = g_editsStore._serialize(g_test.polygonFeature); expect(typeof(str)).toBe("string"); }); it("deserialize", function() { graphic = g_editsStore._deserialize(str); expect(typeof(graphic)).toBe("object"); expect(graphic.declaredClass).toEqual("esri.Graphic"); }); it("deserialize - attributes", function() { expect(graphic.attributes).toEqual(g_test.polygonFeature.attributes); }); it("deserialize - geometry", function() { expect(graphic.geometry).toEqual(g_test.polygonFeature.geometry); }); it("deserialize - symbol should be null", function() { expect(graphic.symbol).toBeNull(); }); it("deserialize - infoTemplate should be null", function() { expect(graphic.infoTemplate).toBeNull(); }); }); }); describe("Pack/Unpack array of edits",function() { // TODO }); }); describe("Public Interface", function() { describe("Support detection", function() { it("detect local storage support", function() { expect(g_editsStore.isSupported()).toBeTruthy(); }) }); describe("Edit queue management", function() { describe("Normal edits", function() { it("reset edits queue", function() { for( var key in window.localStorage ) { if( key.indexOf(KEY_PREFIX)==0 ) window.localStorage.removeItem(key); } g_editsStore.resetEditsQueue(); expect(g_editsStore.pendingEditsCount()).toBe(0); }); it("add edits to edits queue", function() { var result; result = g_editsStore.pushEdit(g_editsStore.ADD, 6, g_test.pointFeature); expect(result.success).toBeTruthy(); expect(g_editsStore.pendingEditsCount()).toBe(1); result = g_editsStore.pushEdit(g_editsStore.UPDATE, 3, g_test.polygonFeature); expect(result.success).toBeTruthy(); expect(g_editsStore.pendingEditsCount()).toBe(2); result = g_editsStore.pushEdit(g_editsStore.DELETE, 2, g_test.lineFeature); expect(result.success).toBeTruthy(); expect(g_editsStore.pendingEditsCount()).toBe(3); }); it("pending edits", function() { expect(g_editsStore.hasPendingEdits()).toBeTruthy(); }); it("pop edit from edits queue - 1", function() { var firstEdit = g_editsStore.popFirstEdit(); expect(g_editsStore.pendingEditsCount()).toBe(2); expect(typeof(firstEdit)).toBe("object"); expect(firstEdit.operation).toBe(g_editsStore.ADD); expect(firstEdit.layer).toBe(6); expect(firstEdit.graphic.attributes).toEqual(g_test.pointFeature.attributes); expect(firstEdit.graphic.geometry).toEqual(g_test.pointFeature.geometry); expect(firstEdit.graphic.symbol).toEqual(null); }); it("pop edit from edits queue - 2", function() { var secondEdit = g_editsStore.popFirstEdit(); expect(g_editsStore.pendingEditsCount()).toBe(1); expect(typeof(secondEdit)).toBe("object"); expect(secondEdit.operation).toBe(g_editsStore.UPDATE); expect(secondEdit.layer).toBe(3); expect(secondEdit.graphic.attributes).toEqual(g_test.polygonFeature.attributes); expect(secondEdit.graphic.geometry).toEqual(g_test.polygonFeature.geometry); expect(secondEdit.graphic.symbol).toEqual(null); }); it("pop edit from edits queue - 3", function() { var thirdEdit = g_editsStore.popFirstEdit(); expect(g_editsStore.pendingEditsCount()).toBe(0); expect(typeof(thirdEdit)).toBe("object"); expect(thirdEdit.operation).toBe(g_editsStore.DELETE); expect(thirdEdit.layer).toBe(2); expect(thirdEdit.graphic.attributes).toEqual(g_test.lineFeature.attributes); expect(thirdEdit.graphic.geometry).toEqual(g_test.lineFeature.geometry); expect(thirdEdit.graphic.symbol).toEqual(null); }); it("pending edits", function() { expect(g_editsStore.hasPendingEdits()).toBeFalsy(); }); }); }); describe("Local Storage size", function() { var usedBytes, totalBytes; it("reset edits queue", function() { g_editsStore.resetEditsQueue(); expect(g_editsStore.pendingEditsCount()).toBe(0); }); it("add edits", function() { var result; result = g_editsStore.pushEdit(g_editsStore.ADD, 6, g_test.pointFeature); expect(g_editsStore.pendingEditsCount()).toBe(1); expect(result.success).toBeTruthy(); expect(result.error).toBeUndefined(); result = g_editsStore.pushEdit(g_editsStore.UPDATE, 3, g_test.polygonFeature); expect(result.success).toBeTruthy(); expect(result.error).toBeUndefined(); expect(g_editsStore.pendingEditsCount()).toBe(2); }); it("report edit store size", function() { usedBytes = g_editsStore.getEditsStoreSizeBytes(); expect(usedBytes).toBe(505); }); it("report total local storage size", function() { totalBytes = g_editsStore.getLocalStorageSizeBytes(); expect(usedBytes).not.toBeGreaterThan(totalBytes); }); it("report edit store size when uninitalized", function() { window.localStorage.removeItem( EDITS_QUEUE_KEY ); window.localStorage.removeItem( REDO_STACK_KEY ); var usedBytes = g_editsStore.getEditsStoreSizeBytes(); expect(usedBytes).toBe(0); }); if( EXECUTE_LONG_TESTS ) { it("exhaust localStorage capacity", function() { window.localStorage.clear(); console.log("this will take some time"); // clean everything before for( var key in window.localStorage ) { if( key.indexOf(KEY_PREFIX)==0 ) window.localStorage.removeItem(key); } var sizeBefore = g_editsStore.getLocalStorageSizeBytes(); if( sizeBefore == 0) { // if not initialized, create the empty elements window.localStorage.setItem( EDITS_QUEUE_KEY, ""); window.localStorage.setItem( REDO_STACK_KEY, ""); sizeBefore = g_editsStore.getLocalStorageSizeBytes(); } // first, fill localStorage up to max capacity var error = null; try { var index = 0; var value = "0123456789"; var value8 = value + value + value + value + value + value + value + value; while(true) { var key = KEY_PREFIX + index; window.localStorage.setItem(key, value8 + value8 + value8 + value8); index += 1; if( index % 1000 == 0) console.log(index, g_editsStore.getLocalStorageSizeBytes()); } } catch(err) { console.log(err); error = err; } expect(error).not.toBe(null); // now, try to push one edit var result = g_editsStore.pushEdit(g_editsStore.ADD, 20, g_test.polygonFeature); expect(result.success).toBeFalsy(); expect(result.error.code).toEqual(1000); expect(result.error.description).toEqual(g_editsStore.ERROR_LOCALSTORAGE_FULL); // clean everything for( var key in window.localStorage ) { if( key.indexOf(KEY_PREFIX)==0 ) window.localStorage.removeItem(key); } var sizeAfter = g_editsStore.getLocalStorageSizeBytes(); expect(sizeBefore).toEqual(sizeAfter); }); } else { it("exhaust localStorage capacity - LONG TEST NOT EXECUTED", function() { }); } }) }); describe("Reset store", function() { it("reset the store", function() { g_editsStore.resetEditsQueue(); }) });