File: setup_windows_test.go

package info (click to toggle)
elvish 0.21.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 6,372 kB
  • sloc: javascript: 236; sh: 130; python: 104; makefile: 88; xml: 9
file content (64 lines) | stat: -rw-r--r-- 1,699 bytes parent folder | download | duplicates (2)
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
package term

import (
	"os"
	"testing"

	"golang.org/x/sys/windows"
)

func TestSetupForEval(t *testing.T) {
	// open CONOUT$ manually because os.Stdout is redirected during testing
	out := openFile(t, "CONOUT$", os.O_RDWR, 0)
	defer out.Close()

	// Start with ENABLE_VIRTUAL_TERMINAL_PROCESSING
	initialOutMode := getConsoleMode(t, out) | windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING
	setConsoleMode(t, out, initialOutMode)

	// Clear ENABLE_VIRTUAL_TERMINAL_PROCESSING
	modifiedOutMode := initialOutMode &^ windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING
	setConsoleMode(t, out, modifiedOutMode)

	// Check that SetupForEval sets ENABLE_VIRTUAL_TERMINAL_PROCESSING without
	// changing other bits
	restore := setupForEval(nil, out)
	if got := getConsoleMode(t, out); got != initialOutMode {
		t.Errorf("got console mode %v, want %v", got, initialOutMode)
	}

	// Check that restore is a no-op
	setConsoleMode(t, out, modifiedOutMode)

	restore()
	if got := getConsoleMode(t, out); got != modifiedOutMode {
		t.Errorf("got console mode %v, want %v", got, modifiedOutMode)
	}
}

func openFile(t *testing.T, name string, flag int, perm os.FileMode) *os.File {
	t.Helper()
	out, err := os.OpenFile(name, flag, perm)
	if err != nil {
		t.Fatalf("open %s: %v", name, err)
	}
	return out
}

func setConsoleMode(t *testing.T, file *os.File, mode uint32) {
	t.Helper()
	err := windows.SetConsoleMode(windows.Handle(file.Fd()), mode)
	if err != nil {
		t.Fatal("SetConsoleMode:", err)
	}
}

func getConsoleMode(t *testing.T, file *os.File) uint32 {
	t.Helper()
	var mode uint32
	err := windows.GetConsoleMode(windows.Handle(file.Fd()), &mode)
	if err != nil {
		t.Fatal("GetConsoleMode:", err)
	}
	return mode
}