1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
import Constant, Scope, Op, Tag from require 'alv'
import Copilot from require 'alv.copilot.base'
import Module, StringModule from require 'alv.module'
import Logger from require 'alv.logger'
import Error from require 'alv.error'
import RTNode from require 'alv.rtnode'
busted = require "busted"
Logger\init 'error'
os.time = do
t = 0
->
t += 1
t
export COPILOT
class TestPilot extends Copilot
new: (code='', @preamble='') =>
super!
COPILOT = @
if code.__class == Module
@active_module = code
@last_modules.__root = @active_module
else
@active_module = StringModule 'main', @preamble .. code
@last_modules.__root = @active_module
@tick!
begin_eval: => @active_module.registry\begin_eval!
end_eval: => @active_module.registry\end_eval!
next_tick: => @T += 1
eval_once: (code) =>
@active_module\spit @preamble .. code
ok, err = pcall @tick, @
if not ok
if (type err) == 'table' and err.__class == Error and err.kind == 'assertion'
busted.fail err, 0
error err, 0
@active_module.root
--- poll for changes and tick.
tick: =>
return unless @last_modules.__root
@T += 1
ok, err = @poll!
if not ok
error err
root = @last_modules.__root
if root and root.root
L\set_time 'run'
ok, error = Error.try "updating", ->
root.root\poll_io!
root.root\tick!
if not ok
error
require: (name) =>
Error.wrap "loading module '#{name}'", ->
ok, result = pcall require, "alv-lib.#{name}"
if ok
result = RTNode :result unless result.__class == RTNode
result
else
error Error 'import', "module not found"
{
:TestPilot
do_setup: ->
TestPilot Module!
COPILOT\begin_eval!
do_teardown: ->
COPILOT\end_eval!
invoke_op: (op, tail, scope=Scope!) ->
import op_invoke from require 'alv.invoke'
fake_cell =
head: -> 'test_op'
tail: -> tail
tag: Tag.blank!
op_invoke\eval_cell fake_cell, Scope!, Constant.wrap op
}
|