const fs = require("fs"); const path = require("path"); const webdriver = require("selenium-webdriver"); const Until = webdriver.until; const By = webdriver.By; import { readVimrc, writeVimrc } from "./_vimrc"; jest.setTimeout(40000) export const pagesDir = path.resolve(path.join("tests", "pages")); export const extensionDir = path.resolve("target"); export function getNewestFileMatching(directory: string, pattern: string | RegExp) { return new Promise((resolve, reject) => { fs.readdir(directory, (err: Error, filenames: string[]) => { if (err) { return reject(err); } return resolve(filenames); }) // Keep only files matching pattern }).then((names: string[]) => names.filter(name => name.match(pattern))) // Get their stat struct .then(names => Promise.all(names.map(name => new Promise((resolve, reject) => { const fpath = path.join(directory, name) fs.stat(fpath, (err: Error, stats: { path: string, mtime: number }) => { if (err) { reject(err); } stats.path = fpath; return resolve(stats); }) })))) // Sort by most recent and keep first .then((stats: any[]) => (stats.sort((stat1, stat2) => stat2.mtime - stat1.mtime)[0] || {}).path) } const keyDelay = 50; function sendKeys(driver: any, keys: any[]) { return keys.reduce((prom, key) => prom .then((action: any) => action.sendKeys(key)) .then((action: any) => action.pause(keyDelay)) , Promise.resolve(driver.actions())).then((action: any) => action.perform()); } function loadLocalPage(driver: any, page: string) { return driver.get("file://" + path.join(pagesDir, page)) .then(() => driver.executeScript("document.documentElement.focus()")); } export async function testModifiers(driver: any) { await loadLocalPage(driver, "simple.html"); console.log("Locating textarea…"); const input = await driver.wait(Until.elementLocated(By.id("content-input"))); await driver.executeScript("arguments[0].scrollIntoView(true);", input); console.log("Clicking on input…"); await driver.actions().click(input).perform(); console.log("Waiting for span to be created…"); const span = await driver.wait(Until.elementLocated(By.css("body > span:nth-child(2)"))); await driver.sleep(500); console.log("Typing …"); await driver.actions() .keyDown("a") .keyUp("a") .pause(keyDelay) .keyDown(webdriver.Key.CONTROL) .keyDown("v") .keyUp("v") .pause(keyDelay) .keyDown("a") .keyUp("a") .pause(keyDelay) .keyDown("v") .keyUp("v") .keyUp(webdriver.Key.CONTROL) .pause(keyDelay) .keyDown(webdriver.Key.ALT) .keyDown("a") .keyUp("a") .keyUp(webdriver.Key.ALT) .pause(keyDelay) .keyDown(webdriver.Key.CONTROL) .keyDown("v") .keyUp("v") .keyUp(webdriver.Key.CONTROL) .pause(keyDelay) .keyDown(webdriver.Key.COMMAND) .keyDown("a") .keyUp("a") .keyUp(webdriver.Key.COMMAND) .pause(keyDelay) .perform(); await driver.sleep(500); console.log("Writing keycodes."); await sendKeys(driver, [webdriver.Key.ESCAPE] .concat(":wq!".split("")) .concat(webdriver.Key.ENTER)) console.log("Waiting for span to be removed from page…"); await driver.wait(Until.stalenessOf(span)); console.log("Waiting for value update…"); await driver.wait(async () => ["\u0011", "\u0001"].includes(await input.getAttribute("value"))); } export async function testCodemirror(driver: any) { await loadLocalPage(driver, "codemirror.html"); console.log("Looking for codemirror div…"); const input = await driver.wait(Until.elementLocated(By.css("div.CodeMirror"))); await driver.executeScript("arguments[0].scrollIntoView(true);", input); console.log("Clicking on input…"); await driver.actions().click(input).perform(); console.log("Waiting for span to be created…"); const span = await driver.wait(Until.elementLocated(By.css("body > span:nth-child(3)"))); await driver.sleep(500); console.log("Typing stuff…"); await sendKeys(driver, "iTest".split("") .concat(webdriver.Key.ESCAPE) .concat(":wq!".split("")) .concat(webdriver.Key.ENTER) ); console.log("Waiting for span to be removed from page…"); await driver.wait(Until.stalenessOf(span)); console.log("Waiting for value update…"); await driver.wait(async () => /Test