Files
blockly/tests/screenshot/gen_screenshots.js
2019-07-22 14:22:49 -07:00

187 lines
5.5 KiB
JavaScript

/**
* @license
* Visual Blocks Editor
*
* Copyright 2019 Google Inc.
* https://developers.google.com/blockly/
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @fileoverview Node.js script to generate screenshots in Chrome, via webdriver.
*/
var webdriverio = require('webdriverio');
var fs = require('fs');
module.exports = genScreenshots;
var isCollapsed = false;
var filterText = '';
var isInsertionMarker = false;
var isRtl = false;
var inlineInputs = false;
var externalInputs = false;
function processArgs() {
var args = process.argv;
for (var i = 0; i < args.length; i++) {
var arg = args[i];
if (arg === '--collapsed') {
isCollapsed = true;
} else if (arg === '--name') {
filterText = args[i + 1];
} else if (arg === '--insertionMarker') {
isInsertionMarker = true;
} else if (arg === '--rtl') {
isRtl = true;
} else if (arg === '--inlineInputs') {
inlineInputs = true
} else if (arg === '--externalInputs') {
externalInputs = true
}
}
}
function checkAndCreateDir(dirname) {
if (!fs.existsSync(dirname)){
fs.mkdirSync(dirname);
}
};
/**
* Opens two different webdriverio browsers. One uses the hosted version of
* blockly_compressed.js; the other uses the local blockly_uncompressed.js.
*
* Each playground is a minimal Blockly instance. This loads the same XML in
* both playgrounds and saves a screenshot of each.
*/
async function genScreenshots() {
var output_url = 'tests/screenshot/outputs'
processArgs();
checkAndCreateDir(output_url)
checkAndCreateDir(output_url + '/old');
checkAndCreateDir(output_url + '/new');
var url_prefix = 'file://' + __dirname + '/playground';
var browser_new = await buildBrowser(url_prefix + '_new.html', isRtl);
var browser_old = await buildBrowser(url_prefix + '_old.html', isRtl);
var test_list = getTestList();
for (var i = 0, testName; testName = test_list[i]; i++) {
await genSingleScreenshot(browser_new, 'new', testName, isCollapsed, isInsertionMarker, inlineInputs, externalInputs);
if (!fs.existsSync(output_url + '/old/' + testName)) {
await genSingleScreenshot(browser_old, 'old', testName, isCollapsed, isInsertionMarker, inlineInputs, externalInputs);
}
}
await cleanUp(browser_new, browser_old);
return 0;
}
function getTestList() {
var file = fs.readFileSync('tests/screenshot/test_cases/test_cases.json');
var json = JSON.parse(file);
var testSpecArr = json.tests;
var testList = [];
for (var i = 0, testSpec; testSpec = testSpecArr[i]; i++) {
if (!testSpec.skip && testSpec.title.includes(filterText)) {
testList.push(testSpec.title);
}
}
return testList;
}
async function cleanUp(browser_new, browser_old) {
await browser_new.deleteSession();
await browser_old.deleteSession();
}
async function buildBrowser(url, isRtl) {
var options = {
capabilities: {
browserName: 'chrome'
},
logLevel: 'warn'
};
console.log('Starting webdriverio...');
const browser = await webdriverio.remote(options);
var injectBlockly = function(isRtl) {
workspace = Blockly.inject('blocklyDiv',
{
comments: true,
collapse: true,
disable: true,
horizontalLayout: false,
maxBlocks: Infinity,
maxInstances: {'test_basic_limit_instances': 3},
media: '../../media/',
oneBasedIndex: true,
readOnly: false,
rtl: isRtl,
move: {
scrollbars: false,
drag: true,
wheel: false,
},
toolboxPosition: 'start',
zoom:
{
controls: false,
wheel: true,
startScale: 2.0,
maxScale: 4,
minScale: 0.25,
scaleSpeed: 1.1
}
});
}
await browser.setWindowSize(500, 500);
console.log('Initialized.\nLoading url: ' + url);
await browser.url(url);
await browser.execute(injectBlockly, isRtl);
return browser;
}
async function genSingleScreenshot(browser, dir, test_name, isCollapsed, isInsertionMarker, inlineInputs, externalInputs) {
var prefix = './tests/screenshot/';
var xml_url = prefix + 'test_cases/' + test_name;
var xml = fs.readFileSync(xml_url, 'utf8');
var loadXmlFn = function(xml_text, isCollapsed, isInsertionMarker, inlineInputs, externalInputs) {
workspace.clear();
var xml = Blockly.Xml.textToDom(xml_text);
Blockly.Xml.domToWorkspace(xml, workspace);
if (isCollapsed || isInsertionMarker || inlineInputs || externalInputs) {
var blocks = workspace.getAllBlocks();
for (var i = 0, block; block = blocks[i]; i++) {
block.setCollapsed(isCollapsed);
block.setInsertionMarker(isInsertionMarker);
if (inlineInputs) {
block.setInputsInline(true);
} else if (externalInputs) {
block.setInputsInline(false);
}
}
}
};
await browser.execute(loadXmlFn, xml, isCollapsed, isInsertionMarker, inlineInputs, externalInputs);
await browser.saveScreenshot(prefix + '/outputs/' + dir + '/' + test_name + '.png');
}
if (require.main === module) {
genScreenshots();
}