describe("Core htmx perf Tests", function() { var HTMX_HISTORY_CACHE_NAME = "htmx-history-cache"; beforeEach(function () { this.server = makeServer(); clearWorkArea(); localStorage.removeItem(HTMX_HISTORY_CACHE_NAME); }); afterEach(function () { this.server.restore(); clearWorkArea(); localStorage.removeItem(HTMX_HISTORY_CACHE_NAME); }); function stringRepeat(str, num) { num = Number(num); var result = ''; while (true) { if (num & 1) { // (1) result += str; } num >>>= 1; // (2) if (num <= 0) break; str += str; } return result; } it("history implementation should be fast", function(){ // create an entry with a large content string (256k) and see how fast we can write and read it // to local storage as a single entry var entry = {url: stringRepeat("x", 32), content:stringRepeat("x", 256*1024)} var array = []; for (var i = 0; i < 10; i++) { array.push(entry); } var start = performance.now(); var string = JSON.stringify(array); localStorage.setItem(HTMX_HISTORY_CACHE_NAME, string); var reReadString = localStorage.getItem(HTMX_HISTORY_CACHE_NAME); var finalJson = JSON.parse(reReadString); var end = performance.now(); var timeInMs = end - start; chai.assert(timeInMs < 300, "Should take less than 300ms on most platforms"); }) it("history snapshot cleaning should be fast", function(){ // var workArea = getWorkArea(); var html = "
\n"; html = stringRepeat(html, 5 * 1024); // ~350K in size, about the size of CNN's body tag :p workArea.insertAdjacentHTML("beforeend", html) var start = performance.now(); htmx._("cleanInnerHtmlForHistory")(workArea); var end = performance.now(); var timeInMs = end - start; chai.assert(timeInMs < 50, "Should take less than 50ms on most platforms"); }) })