mirror of
https://github.com/google/blockly.git
synced 2026-01-04 15:40:08 +01:00
187 lines
5.5 KiB
JavaScript
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();
|
|
}
|