blob: dd3ffde97f7b1ee3e778c971fb244726dd3bd18d [file] [log] [blame]
/**
* 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();
});