379 lines
10 KiB
JavaScript
379 lines
10 KiB
JavaScript
/**
|
|
* Forge Tasks Test
|
|
*
|
|
* @author David I. Lehn <dlehn@digitalbazaar.com>
|
|
*
|
|
* Copyright (c) 2009-2010 Digital Bazaar, Inc. All rights reserved.
|
|
*/
|
|
jQuery(function($)
|
|
{
|
|
var cat = 'forge.tests.tasks';
|
|
|
|
var tests = [];
|
|
var passed = 0;
|
|
var failed = 0;
|
|
|
|
var init = function() {
|
|
passed = failed = 0;
|
|
$('.ready,.testing,.pass,.fail')
|
|
.removeClass('ready testing pass fail');
|
|
$('#status')
|
|
.text('Ready.')
|
|
.addClass('ready');
|
|
$('#total').text(tests.length);
|
|
$('#pass').text(passed);
|
|
$('#fail').text(failed);
|
|
$('.expect').empty();
|
|
$('.result').empty();
|
|
$('.time').empty();
|
|
$('#start').removeAttr('disabled');
|
|
};
|
|
|
|
var start = function()
|
|
{
|
|
$('#start').attr('disabled', 'disabled');
|
|
// meta! use tasks to run the task tests
|
|
forge.task.start({
|
|
type: 'test',
|
|
run: function(task) {
|
|
task.next('starting', function(task) {
|
|
forge.log.debug(cat, 'start');
|
|
$('#status')
|
|
.text('Testing...')
|
|
.addClass('testing')
|
|
.removeClass('idle');
|
|
});
|
|
$.each(tests, function(i, test) {
|
|
task.next('test', function(task) {
|
|
var title = $('li:first', test.container);
|
|
if($('#scroll:checked').length === 1)
|
|
{
|
|
$('html,body').animate({scrollTop: title.offset().top});
|
|
}
|
|
title.addClass('testing');
|
|
test.run(task, test);
|
|
});
|
|
task.next('test', function(task) {
|
|
$('li:first', test.container).removeClass('testing');
|
|
});
|
|
});
|
|
task.next('success', function(task) {
|
|
forge.log.debug(cat, 'done');
|
|
if(failed === 0) {
|
|
$('#status')
|
|
.text('PASS')
|
|
.addClass('pass')
|
|
.removeClass('testing');
|
|
} else {
|
|
// FIXME: should just be hitting failure() below
|
|
$('#status')
|
|
.text('FAIL')
|
|
.addClass('fail')
|
|
.removeClass('testing');
|
|
}
|
|
});
|
|
},
|
|
failure: function() {
|
|
$('#status')
|
|
.text('FAIL')
|
|
.addClass('fail')
|
|
.removeClass('testing');
|
|
}
|
|
});
|
|
};
|
|
|
|
$('#start').click(function() {
|
|
start();
|
|
});
|
|
|
|
$('#reset').click(function() {
|
|
init();
|
|
});
|
|
|
|
var addTest = function(name, run)
|
|
{
|
|
var container = $('<ul><li>Test ' + name + '</li><ul/></ul>');
|
|
var expect = $('<li>Expect: <span class="expect"/></li>');
|
|
var result = $('<li>Result: <span class="result"/></li>');
|
|
var time = $('<li>Time: <span class="time"/></li>');
|
|
$('ul', container).append(expect).append(result).append(time);
|
|
$('#tests').append(container);
|
|
var test = {
|
|
container: container,
|
|
startTime: null,
|
|
run: function(task, test) {
|
|
test.startTime = new Date();
|
|
run(task, test);
|
|
},
|
|
expect: $('span', expect),
|
|
result: $('span', result),
|
|
check: function() {
|
|
var e = test.expect.text();
|
|
var r = test.result.text();
|
|
(e == r) ? test.pass() : test.fail();
|
|
},
|
|
pass: function() {
|
|
passed += 1;
|
|
$('#pass').text(passed);
|
|
$('li:first', container).addClass('pass');
|
|
var dt = new Date() - test.startTime;
|
|
$('span.time', container).html(dt);
|
|
},
|
|
fail: function() {
|
|
failed += 1;
|
|
$('#fail').text(failed);
|
|
$('li:first', container).addClass('fail');
|
|
var dt = new Date() - test.startTime;
|
|
$('span.time', container).html(dt);
|
|
}
|
|
};
|
|
tests.push(test);
|
|
};
|
|
|
|
addTest('pass', function(task, test) {
|
|
test.pass();
|
|
});
|
|
|
|
addTest('check', function(task, test) {
|
|
test.check();
|
|
});
|
|
|
|
addTest('task 1', function(task, test) {
|
|
task.next(function(task) {
|
|
test.pass();
|
|
});
|
|
});
|
|
|
|
addTest('task check()', function(task, test) {
|
|
test.expect.append('check');
|
|
task.next(function(task) {
|
|
test.result.append('check');
|
|
});
|
|
task.next(function(task) {
|
|
test.check();
|
|
});
|
|
});
|
|
|
|
addTest('serial 20', function(task, test) {
|
|
// total
|
|
var n = 20;
|
|
// counter used in the tasks
|
|
var taskn = 0;
|
|
for(var i = 0; i < n; ++i) {
|
|
test.expect.append(i + ' ');
|
|
task.next(function(task) {
|
|
test.result.append(taskn++ + ' ');
|
|
});
|
|
}
|
|
task.next(function(task) {
|
|
test.check();
|
|
});
|
|
});
|
|
|
|
addTest('ajax block', function(task, test) {
|
|
test.expect.append('.');
|
|
task.next(function(task) {
|
|
task.parent.block();
|
|
$.ajax({
|
|
type: 'GET',
|
|
url: 'tasks.html',
|
|
success: function() {
|
|
test.result.append('.');
|
|
task.parent.unblock();
|
|
}
|
|
});
|
|
});
|
|
task.next(function(task) {
|
|
test.check();
|
|
});
|
|
});
|
|
|
|
addTest('serial ajax', function(task, test) {
|
|
var n = 10;
|
|
for(var i = 0; i < n; ++i)
|
|
{
|
|
test.expect.append(i + ' ');
|
|
}
|
|
task.next(function(task) {
|
|
// create parallel functions
|
|
task.parent.block(n);
|
|
for(var i = 0; i < n; ++i)
|
|
{
|
|
// pass value into closure
|
|
(function(i)
|
|
{
|
|
// serial tasks
|
|
task.next(function(ajaxTask)
|
|
{
|
|
$.ajax({
|
|
type: 'GET',
|
|
url: 'tasks.html',
|
|
success: function() {
|
|
// results use top level task
|
|
test.result.append(i + ' ');
|
|
task.parent.unblock();
|
|
}
|
|
});
|
|
});
|
|
})(i);
|
|
}
|
|
});
|
|
task.next(function(task) {
|
|
test.check();
|
|
});
|
|
});
|
|
|
|
addTest('parallel ajax', function(task, test) {
|
|
task.next(function(task) {
|
|
var n = 10;
|
|
// create parallel functions
|
|
var tasks = [];
|
|
for(var i = 0; i < n; ++i)
|
|
{
|
|
// pass value into closure
|
|
(function(i)
|
|
{
|
|
tasks.push(function(ajaxTask)
|
|
{
|
|
$.ajax({
|
|
type: 'GET',
|
|
url: 'tasks.html',
|
|
success: function() {
|
|
// results use top level task
|
|
test.result.append(i + ' ');
|
|
}
|
|
});
|
|
});
|
|
})(i);
|
|
}
|
|
// launch in parallel
|
|
task.parallel(tasks);
|
|
});
|
|
task.next(function(task) {
|
|
test.pass();
|
|
});
|
|
});
|
|
|
|
addTest('linear empty tasks rate', function(task, test) {
|
|
test.expect.append('-');
|
|
// total
|
|
var n = 100;
|
|
var start = new Date();
|
|
for(var i = 0; i < n; ++i) {
|
|
// empty task
|
|
task.next(function(task) {});
|
|
}
|
|
task.next(function(task) {
|
|
var dt = (new Date() - start) / 1000;
|
|
var res = $('<ul/>')
|
|
.append('<li>Tasks: ' + n + '</li>')
|
|
.append('<li>Time: ' + dt + 's</li>')
|
|
.append('<li>Rate: ' + n/dt + ' tasks/s</li>')
|
|
.append('<li>Task Time: ' + 1000*dt/n + ' ms/tasks</li>');
|
|
test.result.html(res);
|
|
test.pass();
|
|
});
|
|
});
|
|
|
|
addTest('sleep', function(task, test) {
|
|
test.expect.append('-');
|
|
var st = 1000;
|
|
var start = new Date();
|
|
task.next(function(task) {
|
|
task.sleep(st);
|
|
});
|
|
task.next(function(task) {
|
|
var dt = new Date() - start;
|
|
var res = $('<ul/>')
|
|
.append('<li>Sleep Time : ' + st + 'ms</li>')
|
|
.append('<li>Real Time: ' + dt + 'ms</li>')
|
|
.append('<li>Diff: ' + (dt-st) + 'ms</li>');
|
|
test.result.html(res);
|
|
test.pass();
|
|
});
|
|
});
|
|
|
|
addTest('serial 20 + sleep', function(task, test) {
|
|
// total
|
|
var n = 20;
|
|
// counter used in the tasks
|
|
var taskn = 0;
|
|
for(var i = 0; i < n; ++i) {
|
|
test.expect.append(i + ' ');
|
|
task.next(function(task) {
|
|
task.sleep(20);
|
|
test.result.append(taskn++ + ' ');
|
|
});
|
|
}
|
|
task.next(function(task) {
|
|
test.check();
|
|
});
|
|
});
|
|
|
|
addTest('concurrent tasks', function(task, test)
|
|
{
|
|
var colors = [
|
|
'red',
|
|
'green',
|
|
'blue',
|
|
'black',
|
|
'purple',
|
|
'goldenrod',
|
|
'maroon',
|
|
'gray',
|
|
'teal',
|
|
'magenta'
|
|
];
|
|
var count = colors.length;
|
|
task.next(function(task)
|
|
{
|
|
var main = task;
|
|
task.block(count);
|
|
|
|
var tasks = [];
|
|
for(var i = 0; i < count; ++i)
|
|
{
|
|
var makefunction = function(index)
|
|
{
|
|
return function(task)
|
|
{
|
|
// total
|
|
var n = 20;
|
|
// counter used in the tasks
|
|
var taskn = 0;
|
|
for(var j = 0; j < n; j++)
|
|
{
|
|
task.next(function(task)
|
|
{
|
|
test.result.append(
|
|
'<span style=\"color:' + colors[index] + ';\">' +
|
|
taskn++ + '</span> ');
|
|
});
|
|
}
|
|
task.next(function(task)
|
|
{
|
|
main.unblock();
|
|
});
|
|
};
|
|
};
|
|
tasks.push(
|
|
{
|
|
type: 'concurrent' + i,
|
|
run: makefunction(i)
|
|
});
|
|
}
|
|
|
|
for(var i = 0; i < count; ++i)
|
|
{
|
|
forge.task.start(tasks[i]);
|
|
}
|
|
});
|
|
|
|
task.next(function(task) {
|
|
test.pass();
|
|
});
|
|
});
|
|
|
|
init();
|
|
});
|