/** @babel */ import path from 'path' import fs from 'fs' import {TextEditor, TextBuffer} from 'atom' const SIZES_IN_KB = [ 512, 1024, 2048 ] const REPEATED_TEXT = fs.readFileSync(path.join(__dirname, '..', 'spec', 'fixtures', 'sample.js'), 'utf8').replace(/\n/g, '') const TEXT = REPEATED_TEXT.repeat(Math.ceil(SIZES_IN_KB[SIZES_IN_KB.length - 1] * 1024 / REPEATED_TEXT.length)) export default async function ({test}) { const data = [] const workspaceElement = atom.workspace.getElement() document.body.appendChild(workspaceElement) atom.packages.loadPackages() await atom.packages.activate() console.log(atom.getLoadSettings().resourcePath); for (let pane of atom.workspace.getPanes()) { pane.destroy() } for (const sizeInKB of SIZES_IN_KB) { const text = TEXT.slice(0, sizeInKB * 1024) console.log(text.length / 1024) let t0 = window.performance.now() const buffer = new TextBuffer({text}) const editor = new TextEditor({buffer, largeFileMode: true}) editor.setGrammar(atom.grammars.grammarForScopeName('source.js')) atom.workspace.getActivePane().activateItem(editor) let t1 = window.performance.now() data.push({ name: 'Opening a large single-line file', x: sizeInKB, duration: t1 - t0 }) const tickDurations = [] for (let i = 0; i < 20; i++) { await timeout(50) t0 = window.performance.now() await timeout(0) t1 = window.performance.now() tickDurations[i] = t1 - t0 } data.push({ name: 'Max time event loop was blocked after opening a large single-line file', x: sizeInKB, duration: Math.max(...tickDurations) }) t0 = window.performance.now() editor.setCursorScreenPosition(editor.element.screenPositionForPixelPosition({ top: 100, left: 30 })) t1 = window.performance.now() data.push({ name: 'Clicking the editor after opening a large single-line file', x: sizeInKB, duration: t1 - t0 }) t0 = window.performance.now() editor.element.setScrollTop(editor.element.getScrollTop() + 100) t1 = window.performance.now() data.push({ name: 'Scrolling down after opening a large single-line file', x: sizeInKB, duration: t1 - t0 }) editor.destroy() buffer.destroy() await timeout(10000) } workspaceElement.remove() return data } function timeout (duration) { return new Promise((resolve) => setTimeout(resolve, duration)) }