blob: 3c618c94e00072f0d1e37c67626380ce58847704 [file] [log] [blame]
#!/usr/bin/env node
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
const nodeFS = require('fs');
const assert = require('assert');
const nodePath = require('path');
const commander = require('commander');
const chalk = require('chalk');
const testDir = nodePath.resolve(__dirname, '..');
const testTplPath = nodePath.resolve(__dirname, 'mktest-tpl.html');
const tplSegmentDelimiter = '<!-- TPL_SEGMENT_DELIMITER -->';
const tagDomId = /{{TPL_DOM_ID}}/g;
const tagDomPlace = '<!-- TPL_DOM_PLACE -->';
const tagJSPlace = '<!-- TPL_JS_PLACE -->';
const manualText = `
${chalk.cyan.dim('Usage:')}
# Make a file named "bar-action.html" in directory "echarts/test" with 1 initial chart.
${chalk.green('npm run mktest bar-action')}
# or
${chalk.green('npm run mktest bar-action.html')}
# or
${chalk.green('node ./test/build/mktest bar-action')}
# Make a file named "bar-action.html" in directory "echarts/test" with 5 initial charts.
${chalk.green('npm run mktest bar-action 5')}
# or
${chalk.green('node ./test/build/mktest bar-action 5')}
`;
function run() {
let opt = prepareOpt();
if (!opt) {
return;
}
if (nodeFS.existsSync(opt.testFilePath)) {
printError(`The file ${opt.testFilePath} exists! Please chose another name.`);
printError('Please chose another name.');
console.log(manualText);
return;
}
const testTplContent = nodeFS.readFileSync(testTplPath, {encoding: 'utf8'});
const testFileContent = makeTestFileContent(opt, testTplContent);
nodeFS.writeFileSync(opt.testFilePath, testFileContent, {encoding: 'utf8'});
console.log(`A test file has been added in: \n${chalk.green(opt.testFilePath)}`);
console.log();
}
function prepareOpt() {
commander
.usage('test-file-name [chart-number]')
.description(manualText)
.parse(process.argv);
let args = commander.args || [];
let testFileName = args[0];
let testCaseNumber = args[1];
if (isNaN(testCaseNumber)) {
testCaseNumber = 1;
}
if (!testFileName) {
printError('Must input a file name!');
console.log(manualText);
return;
}
testFileName = normalizeInputExt(testFileName);
let testFilePath = nodePath.resolve(testDir, testFileName);
return {
testFileName: testFileName,
testFilePath: testFilePath,
testCaseNumber: testCaseNumber
};
}
function makeTestFileContent(opt, testTplContent) {
const testTplSegments = testTplContent.split(tplSegmentDelimiter);
const tplSegMain = testTplSegments[0];
const tplSegDom = testTplSegments[1];
const tplSegJS = testTplSegments[2];
assert(tplSegMain && tplSegDom && tplSegJS);
let segDomList = [];
let segJSList = [];
for (let i = 0; i < opt.testCaseNumber; i++) {
let domId = 'main' + i;
segDomList.push(tplSegDom.replace(tagDomId, domId));
segJSList.push(tplSegJS.replace(tagDomId, domId));
}
let htmlContent = tplSegMain
.replace(tagDomPlace, segDomList.join('\n'))
.replace(tagJSPlace, segJSList.join('\n'));
return htmlContent;
}
function normalizeInputExt(testFileName) {
if (hasExt(testFileName, '.html')) {
return testFileName;
}
else if (hasExt(testFileName, '.htm')) {
return testFileName + 'l';
}
else {
return testFileName + '.html';
}
function hasExt(fileName, ext) {
let idx = fileName.lastIndexOf(ext);
return idx >= 0 && idx === fileName.length - ext.length;
}
}
function printError(msg) {
console.error(chalk.red('[ERROR]: ' + msg));
}
run();