/*
|
* 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;
|
|
});
|