-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathtest.ty
More file actions
99 lines (80 loc) · 3.13 KB
/
test.ty
File metadata and controls
99 lines (80 loc) · 3.13 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
import chalk (chalk, hsl-gradient)
import math (log)
import os (..)
import path (Path)
import sh (sh)
import time
import tp (ThreadPool, Future)
import ty
let COLUMNS = min(terminal-size().?cols ?? 64, 64)
let pass = Atomic(0)
let fail = Atomic(0)
let slow = Atomic(0)
const TY_CMD = getenv('TY_PATH') ?? ty.executable
const TY_OPTS = ['-q' if ty.q, '-j' if !ty.jit].unwords()
fn log-scale(lo: Float, hi: Float) -> (Float -> Float) {
let lo = log(lo)
let hi = log(hi)
t -> ((log(t) - lo) / (hi - lo)).clamp(0.0, 1.0)
}
const time-grad = hsl-gradient((0.33, 0.0, 0.25), (0.0, 1.0, 0.6))
. log-scale(0.01, 1.5)
fn show-time(dt: Float) {
const color = time-grad(dt)
(dt < 0.1) ? chalk"[{color}]({dt * 1000:d}ms)[/]"
: chalk"[{color}]({dt:.2}s)[/]"
}
fn run(p: Path) {
let t0 = time.now()
let _, details = sh("{TY_CMD} --test {TY_OPTS} {p}", timeoutMs=5000)
let (color, result) = match details {
nil => do {
slow += 1
('', chalk"[b bright magenta]TIMEOUT[/]")
},
{status: 0, signal: nil, *} => do {
pass += 1
('#635d56', chalk"[bright green bold]PASS[/] {show-time(time.now() - t0)}")
},
{status, signal, stdout, stderr, *} => do {
fail += 1
let parts = [
chalk"[b bright red]FAIL[/]",
chalk" [bright magenta](exit status: {status})[/]" if status != 0,
chalk" [blue](SIG{signame(signal).upper()})[/]" if signal != nil,
chalk"\n[magenta]──────────────── [yellow]STDOUT[/] ────────────────────────────────────[/]\n",
stdout,
chalk"\n[magenta]──────────────── [yellow]STDERR[/] ────────────────────────────────────[/]\n",
stderr,
chalk"\n[magenta]────────────────────────────────────────────────────────────[/]\n",
]
('#c53535', parts.join())
}
}
let name = chalk"[{color}]{p.stem:24}[/]"
let dots = chalk"[#444]...[/]"
return "{name} {dots} {result}"
}
let pool = ThreadPool(ncpu(), run)
let t0 = time.now()
for (dir, _, files) in Path('tests').walk() {
let group = chalk"[#bd892d]{dir}[/]"
let pad = chalk"[#333]─[/]"
let tests = files.filter(/\.ty$/)
print("{" {group} {pad}{pad}":{pad}>{COLUMNS}}")
for Future.iter(tests.map(pool.submit@(dir / _))) {
print(it)
}
}
let t1 = time.now()
let summary = [
chalk"[green b]{pass}[/] passed" if pass > 0,
chalk"[red b]{fail}[/] failed" if fail > 0,
chalk"[magenta b]{slow}[/] timed out" if slow > 0,
chalk"[#ccc b]{(t1 - t0):.2}s[/] elapsed"
]
print()
print(chalk"[#333]{'─' * COLUMNS}[/]")
print(chalk"[#666]{summary.join(', ')}[/]")
print(chalk"[#333]{'─' * COLUMNS}[/]")
exit(int(fail > 0 || slow > 0))