aboutsummaryrefslogtreecommitdiffhomepage
path: root/hst/enablement_test.go
blob: 82059aa914121544ce348a2efa3edae51ec2d14e (plain)
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package hst_test

import (
	"encoding/json"
	"errors"
	"syscall"
	"testing"

	"hakurei.app/hst"
)

func TestEnablementString(t *testing.T) {
	testCases := []struct {
		flags hst.Enablement
		want  string
	}{
		{0, "(no enablements)"},
		{hst.EWayland, "wayland"},
		{hst.EX11, "x11"},
		{hst.EDBus, "dbus"},
		{hst.EPulse, "pulseaudio"},
		{hst.EWayland | hst.EX11, "wayland, x11"},
		{hst.EWayland | hst.EDBus, "wayland, dbus"},
		{hst.EWayland | hst.EPulse, "wayland, pulseaudio"},
		{hst.EX11 | hst.EDBus, "x11, dbus"},
		{hst.EX11 | hst.EPulse, "x11, pulseaudio"},
		{hst.EDBus | hst.EPulse, "dbus, pulseaudio"},
		{hst.EWayland | hst.EX11 | hst.EDBus, "wayland, x11, dbus"},
		{hst.EWayland | hst.EX11 | hst.EPulse, "wayland, x11, pulseaudio"},
		{hst.EWayland | hst.EDBus | hst.EPulse, "wayland, dbus, pulseaudio"},
		{hst.EX11 | hst.EDBus | hst.EPulse, "x11, dbus, pulseaudio"},
		{hst.EWayland | hst.EX11 | hst.EDBus | hst.EPulse, "wayland, x11, dbus, pulseaudio"},

		{1 << 5, "e20"},
		{1 << 6, "e40"},
		{1 << 7, "e80"},
	}

	for _, tc := range testCases {
		t.Run(tc.want, func(t *testing.T) {
			if got := tc.flags.String(); got != tc.want {
				t.Errorf("String: %q, want %q", got, tc.want)
			}
		})
	}
}

func TestEnablements(t *testing.T) {
	testCases := []struct {
		name  string
		e     *hst.Enablements
		data  string
		sData string
	}{
		{"nil", nil, "null", `{"value":null,"magic":3236757504}`},
		{"zero", hst.NewEnablements(0), `{}`, `{"value":{},"magic":3236757504}`},
		{"wayland", hst.NewEnablements(hst.EWayland), `{"wayland":true}`, `{"value":{"wayland":true},"magic":3236757504}`},
		{"x11", hst.NewEnablements(hst.EX11), `{"x11":true}`, `{"value":{"x11":true},"magic":3236757504}`},
		{"dbus", hst.NewEnablements(hst.EDBus), `{"dbus":true}`, `{"value":{"dbus":true},"magic":3236757504}`},
		{"pulse", hst.NewEnablements(hst.EPulse), `{"pulse":true}`, `{"value":{"pulse":true},"magic":3236757504}`},
		{"all", hst.NewEnablements(hst.EWayland | hst.EX11 | hst.EDBus | hst.EPulse), `{"wayland":true,"x11":true,"dbus":true,"pulse":true}`, `{"value":{"wayland":true,"x11":true,"dbus":true,"pulse":true},"magic":3236757504}`},
	}

	for _, tc := range testCases {
		t.Run(tc.name, func(t *testing.T) {
			t.Run("marshal", func(t *testing.T) {
				if got, err := json.Marshal(tc.e); err != nil {
					t.Fatalf("Marshal: error = %v", err)
				} else if string(got) != tc.data {
					t.Errorf("Marshal:\n%s, want\n%s", string(got), tc.data)
				}

				if got, err := json.Marshal(struct {
					Value *hst.Enablements `json:"value"`
					Magic int              `json:"magic"`
				}{tc.e, syscall.MS_MGC_VAL}); err != nil {
					t.Fatalf("Marshal: error = %v", err)
				} else if string(got) != tc.sData {
					t.Errorf("Marshal:\n%s, want\n%s", string(got), tc.sData)
				}
			})

			t.Run("unmarshal", func(t *testing.T) {
				{
					got := new(hst.Enablements)
					if err := json.Unmarshal([]byte(tc.data), &got); err != nil {
						t.Fatalf("Unmarshal: error = %v", err)
					}
					if tc.e == nil {
						if got != nil {
							t.Errorf("Unmarshal: %v", got)
						}
					} else if *got != *tc.e {
						t.Errorf("Unmarshal: %v, want %v", got, tc.e)
					}
				}

				{
					got := *(new(struct {
						Value *hst.Enablements `json:"value"`
						Magic int              `json:"magic"`
					}))
					if err := json.Unmarshal([]byte(tc.sData), &got); err != nil {
						t.Fatalf("Unmarshal: error = %v", err)
					}
					if tc.e == nil {
						if got.Value != nil {
							t.Errorf("Unmarshal: %v", got)
						}
					} else if *got.Value != *tc.e {
						t.Errorf("Unmarshal: %v, want %v", got.Value, tc.e)
					}
				}
			})
		})
	}

	t.Run("unwrap", func(t *testing.T) {
		t.Run("nil", func(t *testing.T) {
			if got := (*hst.Enablements)(nil).Unwrap(); got != 0 {
				t.Errorf("Unwrap: %v", got)
			}
		})

		t.Run("val", func(t *testing.T) {
			if got := hst.NewEnablements(hst.EWayland | hst.EPulse).Unwrap(); got != hst.EWayland|hst.EPulse {
				t.Errorf("Unwrap: %v", got)
			}
		})
	})

	t.Run("passthrough", func(t *testing.T) {
		if _, err := (*hst.Enablements)(nil).MarshalJSON(); !errors.Is(err, syscall.EINVAL) {
			t.Errorf("MarshalJSON: error = %v", err)
		}
		if err := (*hst.Enablements)(nil).UnmarshalJSON(nil); !errors.Is(err, syscall.EINVAL) {
			t.Errorf("UnmarshalJSON: error = %v", err)
		}
		if err := new(hst.Enablements).UnmarshalJSON([]byte{}); err == nil {
			t.Errorf("UnmarshalJSON: error = %v", err)
		}
	})
}