Skip to content

Commit 284c3bf

Browse files
committed
refactor recursion tests to shared compile and call helpers
1 parent c88475b commit 284c3bf

1 file changed

Lines changed: 14 additions & 80 deletions

File tree

vibes/recursion_test.go

Lines changed: 14 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,15 @@ import (
88
)
99

1010
func TestRecursionLimitExceeded(t *testing.T) {
11-
engine := MustNewEngine(Config{
12-
RecursionLimit: 3,
13-
})
14-
15-
script, err := engine.Compile(`def recurse(n)
11+
script := compileScriptWithConfig(t, Config{RecursionLimit: 3}, `def recurse(n)
1612
if n <= 0
1713
"done"
1814
else
1915
recurse(n - 1)
2016
end
2117
end`)
22-
if err != nil {
23-
t.Fatalf("compile: %v", err)
24-
}
2518

26-
_, err = script.Call(context.Background(), "recurse", []Value{NewInt(5)}, CallOptions{})
27-
if err == nil {
28-
t.Fatalf("expected recursion depth error")
29-
}
19+
err := callScriptErr(t, context.Background(), script, "recurse", []Value{NewInt(5)}, CallOptions{})
3020

3121
var re *RuntimeError
3222
if !errors.As(err, &re) {
@@ -38,57 +28,37 @@ end`)
3828
}
3929

4030
func TestRecursionLimitAllowsWithinBound(t *testing.T) {
41-
engine := MustNewEngine(Config{
42-
RecursionLimit: 5,
43-
})
44-
45-
script, err := engine.Compile(`def recurse(n)
31+
script := compileScriptWithConfig(t, Config{RecursionLimit: 5}, `def recurse(n)
4632
if n <= 0
4733
0
4834
else
4935
recurse(n - 1) + 1
5036
end
5137
end`)
52-
if err != nil {
53-
t.Fatalf("compile: %v", err)
54-
}
5538

56-
result, err := script.Call(context.Background(), "recurse", []Value{NewInt(4)}, CallOptions{})
57-
if err != nil {
58-
t.Fatalf("unexpected error: %v", err)
59-
}
39+
result := callScript(t, context.Background(), script, "recurse", []Value{NewInt(4)}, CallOptions{})
6040
if result.Kind() != KindInt || result.Int() != 4 {
6141
t.Fatalf("unexpected result: %v", result)
6242
}
6343
}
6444

6545
func TestRecursionLimitDefaultApplies(t *testing.T) {
66-
engine := MustNewEngine(Config{})
67-
68-
script, err := engine.Compile(`def recurse(n)
46+
script := compileScriptDefault(t, `def recurse(n)
6947
if n <= 0
7048
"done"
7149
else
7250
recurse(n - 1)
7351
end
7452
end`)
75-
if err != nil {
76-
t.Fatalf("compile: %v", err)
77-
}
7853

79-
_, err = script.Call(context.Background(), "recurse", []Value{NewInt(100)}, CallOptions{})
80-
if err == nil {
81-
t.Fatalf("expected recursion depth error at default limit")
82-
}
54+
err := callScriptErr(t, context.Background(), script, "recurse", []Value{NewInt(100)}, CallOptions{})
8355
if !strings.Contains(err.Error(), "recursion depth exceeded") {
8456
t.Fatalf("unexpected error: %v", err)
8557
}
8658
}
8759

8860
func TestMutualRecursionRespectsLimit(t *testing.T) {
89-
engine := MustNewEngine(Config{RecursionLimit: 4})
90-
91-
script, err := engine.Compile(`def a(n)
61+
script := compileScriptWithConfig(t, Config{RecursionLimit: 4}, `def a(n)
9262
if n <= 0
9363
"done"
9464
else
@@ -103,92 +73,56 @@ def b(n)
10373
a(n - 1)
10474
end
10575
end`)
106-
if err != nil {
107-
t.Fatalf("compile: %v", err)
108-
}
10976

110-
_, err = script.Call(context.Background(), "a", []Value{NewInt(10)}, CallOptions{})
111-
if err == nil {
112-
t.Fatalf("expected recursion depth error")
113-
}
77+
err := callScriptErr(t, context.Background(), script, "a", []Value{NewInt(10)}, CallOptions{})
11478
if !strings.Contains(err.Error(), "recursion depth exceeded") {
11579
t.Fatalf("unexpected error: %v", err)
11680
}
11781
}
11882

11983
func TestRecursionLimitWinsOverStepQuota(t *testing.T) {
120-
engine := MustNewEngine(Config{
121-
RecursionLimit: 3,
122-
StepQuota: 1_000_000,
123-
})
124-
125-
script, err := engine.Compile(`def spin(n)
84+
script := compileScriptWithConfig(t, Config{RecursionLimit: 3, StepQuota: 1_000_000}, `def spin(n)
12685
if n <= 0
12786
0
12887
else
12988
1 + spin(n - 1)
13089
end
13190
end`)
132-
if err != nil {
133-
t.Fatalf("compile: %v", err)
134-
}
13591

136-
_, err = script.Call(context.Background(), "spin", []Value{NewInt(50)}, CallOptions{})
137-
if err == nil {
138-
t.Fatalf("expected recursion depth error")
139-
}
92+
err := callScriptErr(t, context.Background(), script, "spin", []Value{NewInt(50)}, CallOptions{})
14093
if !strings.Contains(err.Error(), "recursion depth exceeded (limit 3)") {
14194
t.Fatalf("unexpected error: %v", err)
14295
}
14396
}
14497

14598
func TestRecursionLimitNoLeakAfterError(t *testing.T) {
146-
engine := MustNewEngine(Config{RecursionLimit: 4})
147-
148-
script, err := engine.Compile(`def ping(n)
99+
script := compileScriptWithConfig(t, Config{RecursionLimit: 4}, `def ping(n)
149100
if n <= 0
150101
"ok"
151102
else
152103
ping(n - 1)
153104
end
154105
end`)
155-
if err != nil {
156-
t.Fatalf("compile: %v", err)
157-
}
158106

159107
// First call exceeds the limit.
160108
_, _ = script.Call(context.Background(), "ping", []Value{NewInt(10)}, CallOptions{})
161109

162110
// Second call within the limit should still succeed.
163-
result, err := script.Call(context.Background(), "ping", []Value{NewInt(3)}, CallOptions{})
164-
if err != nil {
165-
t.Fatalf("unexpected error on second call: %v", err)
166-
}
111+
result := callScript(t, context.Background(), script, "ping", []Value{NewInt(3)}, CallOptions{})
167112
if result.Kind() != KindString || result.String() != "ok" {
168113
t.Fatalf("unexpected result: %v", result)
169114
}
170115
}
171116

172117
func TestRecursionLimitWithWhileLoopFrames(t *testing.T) {
173-
engine := MustNewEngine(Config{
174-
RecursionLimit: 4,
175-
StepQuota: 1_000_000,
176-
})
177-
178-
script, err := engine.Compile(`def recurse(n)
118+
script := compileScriptWithConfig(t, Config{RecursionLimit: 4, StepQuota: 1_000_000}, `def recurse(n)
179119
while n > 0
180120
n = n - 1
181121
end
182122
recurse(1)
183123
end`)
184-
if err != nil {
185-
t.Fatalf("compile: %v", err)
186-
}
187124

188-
_, err = script.Call(context.Background(), "recurse", []Value{NewInt(3)}, CallOptions{})
189-
if err == nil {
190-
t.Fatalf("expected recursion depth error")
191-
}
125+
err := callScriptErr(t, context.Background(), script, "recurse", []Value{NewInt(3)}, CallOptions{})
192126
if !strings.Contains(err.Error(), "recursion depth exceeded (limit 4)") {
193127
t.Fatalf("unexpected error: %v", err)
194128
}

0 commit comments

Comments
 (0)