aboutsummaryrefslogtreecommitdiff
path: root/tests/programs/capture.zc
blob: 34d03a6380aeb54bfa4e639aa4d5c2c4ee3418f8 (plain) (blame)
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
namespace;
include rt, std;

// capture.start() sends everything the program writes into a string instead of
// the terminal, and capture.end(buf) stops it and terminates the string. nothing may
// be printed during a capture, or it lands in the buffer too.
include std;

fn main() {
	let buf = std.capture.start();
	rt.put_s("hello world!");
	rt.put_n(42);
	rt.put_c(10);
	std.capture.end(buf);		// stops the capture and terminates the string

	// the capture is off again, so these go to the terminal
	rt.put_n(rt.outmode); rt.put_c(10);			// 0
	rt.put_n(rt.outbuf == 0); rt.put_c(10);		// 1, the buffer is handed over
	rt.put_n(rt.len_w(buf)); rt.put_c(10);		// 15
	rt.put_s(buf);					// hello world!42

	// a second capture does not disturb the first, and both read back
	let two = std.capture.start();
	rt.put_s("second");
	std.capture.end(two);
	rt.put_n(rt.eq_w(buf, "hello world!42\n")); rt.put_c(10);	// 1
	rt.put_n(rt.eq_w(two, "second")); rt.put_c(10);		// 1

	// capture_stdin returns an empty string, so an unused capture is empty
	let three = std.capture.start();
	std.capture.end(three);
	rt.put_n(rt.len_w(three)); rt.put_c(10);		// 0
	return 0;
}