process-table
Version:
JavaScript 流程管理机制
428 lines (402 loc) • 15.7 kB
HTML
<html>
<head>
<meta charset="utf-8">
<title>test process</title>
</head>
<body>
<div id="container"></div>
<script src="es6-promise.min.js"></script>
<script src="../dist/process.js"></script>
<script>
(function() {
var container = document.getElementById('container')
var scope = 1
window.describe = function(name, test) {
var title = document.createElement('h' + scope)
title.innerHTML = name
container.appendChild(title)
scope += 1
test()
scope -= 1
}
window.it = function(describe, test) {
var p = document.createElement('p')
p.innerHTML = describe + ':\n'
test(function() {})
}
window.assert = {
equal: function(left, right) {
var p = document.createElement('p')
p.innerHTML = left == right
container.appendChild(p)
},
notEqual: function(left, right) {
var p = document.createElement('p')
p.innerHTML = left != right
container.appendChild(p)
},
deepEqual: function(left, right) {
for (var key in left) {
if (left.hasOwnProperty(key)) {
this.equal(left[key], right[key])
}
}
}
}
})()
describe('Process', function() {
describe('#extend(...sources)', function() {
it('should "以构造函数参数形式,合并到属性中"', function() {
var source = {
a: 1,
b: 2,
c: 3
}
var process = new Process(source)
for (var key in source) {
assert.equal(process[key], source[key])
}
})
it('should "调用 extend 方法,合并到属性中"', function() {
var process = new Process()
var source = {
a: 1,
b: 2,
c: 3
}
process.extend(source)
for (var key in source) {
assert.equal(process[key], source[key])
}
})
it('should "调用 extend 方法,合并多个对象到属性中"', function() {
var process = new Process()
var source1 = {
a: 1,
b: 2,
c: 3
}
var source2 = {
d: 4,
e: 5,
f: 6
}
process.extend(source1, source2)
for (var key in source1) {
assert.equal(process[key], source1[key])
}
for (var key in source2) {
assert.equal(process[key], source2[key])
}
})
})
describe('#resolve(eventName, value)', function() {
it('should "同步传值-无跳转"', function() {
var add = function(num) {
return num + 1
}
var process = new Process({
add4: [add, add, add, add]
})
assert.equal(process.resolve('add4', 0), 4)
assert.equal(process.resolve('add4', -4), 0)
})
it('should "同步传值-字符串跳转"', function() {
var add = function(num) {
return num + 1
}
var minus = function(num) {
return num - 1
}
var process = new Process({
add0: [add, add, add, 'minus3'],
minus3: [minus, add, minus, minus, minus]
})
assert.equal(process.resolve('add0', 0), 0)
})
it('should "同步传值-调度器跳转"', function() {
var add = function(num) {
return num + 1
}
var minus = function(num) {
return num - 1
}
var dispatcher = {
goTo: function() {
return 'minus3'
}
}
var process = new Process({
add0: [add, add, add, dispatcher],
minus3: [minus, minus, minus]
})
assert.equal(process.resolve('add0', 0), 0)
})
it('should "同步传值-复合跳转"', function() {
var add = function(num) {
return num + 1
}
var minus = function(num) {
return num - 1
}
var dispatcher = {
target: 'minus',
goTo: function() {
return this.target
}
}
var process = new Process({
add0: [add, add, add, 'minus3'],
minus: minus,
minus3: [dispatcher, dispatcher, dispatcher]
})
assert.equal(process.resolve('add0', 0), 0)
})
it('should "异步传值-promise风格"', function(done) {
var add = function(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num + 1)
}, 1)
})
}
var process = new Process({
add4: [add, add, add, add]
})
process.resolve('add4', 0).then(function(result) {
assert.equal(result, 4)
done()
})
})
it('should "中断传值"', function() {
var add = function(num) {
return num + 1
}
var stop = function() {
return null
}
var process = new Process({
add3: [add, add, add, stop, function() {
throw new Error('如果未中断,抛出错误;中断后,返回null')
}]
})
assert.equal(process.resolve('add3', 0), null)
})
it('should "中断传值-分组模式"', function() {
var add = function(num) {
return num + 1
}
var stop = function() {
return null
}
var process = new Process({
add4: [add, add, add, [add, stop, function() {
throw new Error('如果未中断,抛出错误;中断后,返回null')
}]]
})
assert.equal(process.resolve('add4', 0), null)
})
it('should "中断异步传值"', function(done) {
var add = function(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num + 1)
}, 1)
})
}
var stop = function() {
return null
}
var process = new Process({
add4: [add, add, add, add, stop, function() {
throw new Error('如果未中断,抛出错误;中断后,返回null')
}]
})
process.resolve('add4', 0).then(function(result) {
assert.equal(result, null)
done()
})
})
it('should "调度器之忽略非法调度"', function() {
var add = function(num) {
return num + 1
}
var dispatcher = {
goTo: function() {
return 'eventName which is not existed'
}
}
var process = new Process({
add4: [add, add, dispatcher, add, dispatcher, add]
})
assert.equal(process.resolve('add4', -4), 0)
})
it('should "调度器之事件循环"', function() {
var add = function(num) {
return num + 1
}
var dispatcher = {
goTo: function(value) {
return value < 100 ? 'toHundred' : null
}
}
var process = new Process({
toHundred: [add, add, dispatcher]
})
assert.equal(process.resolve('toHundred', 0), 100)
})
it('should "调度器之异步事件循环"', function(done) {
var add = function(num) {
return num + 1
}
var asyncAdd = function(num) {
return new Promise(function(resolve) {
resolve(add(num))
})
}
var dispatcher = {
goTo: function(value) {
return value < 100 ? 'toHundred' : null
}
}
var process = new Process({
toHundred: [add, asyncAdd, dispatcher]
})
process.resolve('toHundred', 0).then(function(result) {
assert.equal(result, 100)
done()
})
})
it('should "普通队列里的 promise 异步处理器"', function(done) {
var factory = function() {
return new Promise(function(resolve) {
resolve(function(num) {
return num + 1
})
})
}
var process = new Process({
add3: [factory(), factory(), factory()]
})
process.resolve('add3', 0).then(function(result) {
assert.equal(result, 3)
done()
})
})
it('should "调度器里的 promise 异步处理器"', function(done) {
var add = function(num) {
return num + 1
}
var dispatcher = {
goTo: function(value) {
return new Promise(function(resolve) {
resolve(value < 100 ? 'add' : value)
})
}
}
var process = new Process({
add: [add, dispatcher]
})
process.resolve('add', 12).then(function(result) {
assert.equal(result, 100)
done()
})
})
})
describe('#willResolve(eventName)', function() {
it('should "输入 eventName,返回只接受 value 参数的 resolve 函数"', function() {
var process = new Process({
add: function(num) {
return num + 10
}
})
var willAdd = process.willResolve('add')
assert.equal(willAdd(1), 11)
})
})
describe('#reject(errorName, value)', function() {
it('should "进入错误处理进程"', function() {
var process = new Process({
error: {
"404": function(value) {
return value + ' is not found'
}
}
})
assert.equal(process.reject('404', 123), '123 is not found')
})
it('should "异步的错误处理进程"', function(done) {
var process = new Process({
error: {
"404": function(value) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(value + ' is not found')
}, 2)
})
}
}
})
process.reject('404', 123).then(function(result) {
assert.equal(result, '123 is not found')
done()
})
})
})
describe('#willReject(errorName, value)', function() {
it('should "输入 errorName, 返回只接受 value 参数的 reject 函数', function() {
var process = new Process({
error: {
"404": function(value) {
return value + ' is not found'
}
}
})
var willNotFound = process.willReject('404')
assert.equal(willNotFound(123), '123 is not found')
})
})
describe('嵌套 Process 实例', function() {
it('should "从父 process 同步传值到子 process"', function() {
var child = new Process({
add: function(num) {
return num + 1
}
})
var parent = new Process({
add: [child.willResolve('add'), function(num) {
return num + 2
}]
})
assert.equal(parent.resolve('add', 1), 4)
})
it('should "从父 process 异步传值到子 process"', function(done) {
var child = new Process({
add: function(num) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(num + 1)
}, 2)
})
}
})
var parent = new Process({
add: [child.willResolve('add'), function(num) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(num + 2)
}, 2)
})
}]
})
parent.resolve('add', 1).then(function(result) {
assert.equal(result, 4)
done()
})
})
})
})
</script>
</body>
</html>