-
Notifications
You must be signed in to change notification settings - Fork 39
Expand file tree
/
Copy pathsync.ts
More file actions
125 lines (109 loc) · 2.12 KB
/
sync.ts
File metadata and controls
125 lines (109 loc) · 2.12 KB
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/* eslint-disable prefer-const */
import * as assert from 'assert';
import { describe, test } from 'vitest';
import { Parser, Interpreter, Ast } from '../src';
import { NUM, STR, NULL, ARR, OBJ, BOOL, TRUE, FALSE, ERROR ,FN_NATIVE } from '../src/interpreter/value';
import { AiScriptSyntaxError, AiScriptRuntimeError, AiScriptIndexOutOfRangeError } from '../src/error';
import { exeSync, eq } from './testutils';
test.concurrent('Hello, world!', () => {
const res = exeSync('"Hello, world!"');
eq(res, STR('Hello, world!'));
});
test.concurrent('Closure', () => {
const res = exeSync(`
@store(v) {
let state = v
@() {
state
}
}
let s = store("ai")
s()
`);
eq(res, STR('ai'));
});
test.concurrent('Closure (counter)', () => {
const res = exeSync(`
@create_counter() {
var count = 0
{
get_count: @() { count },
count: @() { count = (count + 1) },
}
}
let counter = create_counter()
let get_count = counter.get_count
let count = counter.count
count()
count()
count()
get_count()
`);
eq(res, NUM(3));
});
describe('extra', () => {
test.concurrent('Fizz Buzz', () => {
const res = exeSync(`
let res = []
for (let i = 1, 15) {
let msg =
if (i % 15 == 0) "FizzBuzz"
elif (i % 3 == 0) "Fizz"
elif (i % 5 == 0) "Buzz"
else i
res.push(msg)
}
res
`);
eq(res, ARR([
NUM(1),
NUM(2),
STR('Fizz'),
NUM(4),
STR('Buzz'),
STR('Fizz'),
NUM(7),
NUM(8),
STR('Fizz'),
STR('Buzz'),
NUM(11),
STR('Fizz'),
NUM(13),
NUM(14),
STR('FizzBuzz'),
]));
});
test.concurrent('SKI', () => {
const res = exeSync(`
let s = @(x) { @(y) { @(z) {
//let f = x(z) f(@(a){ let g = y(z) g(a) })
let f = x(z)
f(y(z))
}}}
let k = @(x){ @(y) { x } }
let i = @(x){ x }
// combine
@c(l) {
// extract
@x(v) {
if (Core:type(v) == "arr") { c(v) } else { v }
}
// rec
@r(f, n) {
if (n < l.len) {
r(f(x(l[n])), (n + 1))
} else { f }
}
r(x(l[0]), 1)
}
var result = null
@_print(v) {
result = v
}
let sksik = [s, [k, [s, i]], k]
c([sksik, "foo", _print])
result
`);
eq(res, STR('foo'));
});
});