blob: 00e0420e97bbacbe776feb3e2a03920d877ab051 [file] [log] [blame]
/*
* 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.
*/
/**
* @file TestManager loads and runs test cases
* @author Wenli Zhang
*/
define(function (require) {
var factory = require('./testFactory');
/**
* test manager
*
* @param {number[]} amounts test case amount array
* @param {string[]} caseNames test case name array
*/
function TestManager(amounts, caseNames) {
this.caseNames = caseNames;
this.amounts = amounts;
this.init();
}
/**
* init before running a test
*/
TestManager.prototype.init = function () {
this.times = [];
this.totalAmounts = 0;
for (var i = 0; i < this.amounts.length; ++i) {
this.totalAmounts += this.amounts[i];
}
this.totalAmounts *= this.caseNames.length;
this.ranAmounts = 0;
};
/**
* run a test case
*
* @param {number} cid case name id
* @param {number} aid amount id
* @return {Object} case name, case id, amount id, and run time
*/
TestManager.prototype.run = function (cid, aid) {
// cancel if last test time of the same caseName is larger than 5
var test = factory.create(this.caseNames[cid], this.amounts[aid]);
var time = Math.floor(test.runTime(50));
if (!this.times[aid]) {
this.times[aid] = [];
}
this.times[aid][cid] = time;
this.ranAmounts += this.amounts[aid];
return {
caseName: this.caseNames[cid],
caseId: cid,
amountId: aid,
time: time
};
};
/**
* get current progress
*
* @return {number} progress from 0 to 1
*/
TestManager.prototype.getProgress = function () {
return this.ranAmounts / this.totalAmounts;
};
/**
* draw report with ECharts chart
*
* @param {Object} container DOM element to draw on
*/
TestManager.prototype.drawReport = function (container) {
var chart = echarts.init(container);
var that = this;
chart.setOption({
series: (function () {
var series = [];
for (var cid = 0; cid < that.caseNames.length; ++cid) {
var data = [];
for (var aid = 0; aid < that.amounts.length; ++aid) {
data.push([that.amounts[aid], that.times[aid][cid]]);
}
series.push({
type: 'line',
data: data,
name: that.caseNames[cid]
});
}
return series;
})(),
xAxis: {
name: 'Data Amount',
// type: 'log',
axisLabel: {
formatter: function (v) {
return Math.floor(v);
}
}
},
yAxis: {
name: 'Run Time (milliseconds)',
// type: 'log',
axisLabel: {
formatter: function (v) {
return Math.floor(v);
}
}
},
legend: {
show: true,
data: this.caseNames
},
tooltip: {
show: true,
trigger: 'axis'
}
});
};
/**
* get test result in json string
*
* @return {string} json string of result
*/
TestManager.prototype.exportResult = function () {
var obj = {
caseNames: this.caseNames,
amounts: this.amounts,
times: this.times
};
return JSON.stringify(obj, null, ' ');
};
return TestManager;
});