1package cpuset
2
3import (
4	"testing"
5
6	"github.com/stretchr/testify/require"
7)
8
9func TestCPUSet_Size(t *testing.T) {
10	set := New(0, 1, 2, 3)
11	require.Equal(t, 4, set.Size())
12	require.Equal(t, 0, New().Size())
13}
14
15func TestCPUSet_ToSlice(t *testing.T) {
16	cases := []struct {
17		desc string
18		in   CPUSet
19		out  []uint16
20	}{
21		{
22			"empty cpuset",
23			New(),
24			[]uint16{},
25		},
26		{
27			"in order",
28			New(0, 1, 2, 3, 4, 5, 6, 7),
29			[]uint16{0, 1, 2, 3, 4, 5, 6, 7},
30		},
31		{
32			"out of order",
33			New(3, 1, 2, 0),
34			[]uint16{0, 1, 2, 3},
35		},
36	}
37
38	for _, c := range cases {
39		require.Exactly(t, c.out, c.in.ToSlice(), c.desc)
40	}
41}
42
43func TestCPUSet_Equals(t *testing.T) {
44	cases := []struct {
45		a           CPUSet
46		b           CPUSet
47		shouldEqual bool
48	}{
49		{New(), New(), true},
50		{New(5), New(5), true},
51		{New(1, 2, 3, 4, 5), New(1, 2, 3, 4, 5), true},
52
53		{New(), New(5), false},
54		{New(5), New(), false},
55		{New(), New(1, 2, 3, 4, 5), false},
56		{New(1, 2, 3, 4, 5), New(), false},
57		{New(5), New(1, 2, 3, 4, 5), false},
58		{New(1, 2, 3, 4, 5), New(5), false},
59	}
60
61	for _, c := range cases {
62		require.Equal(t, c.shouldEqual, c.a.Equals(c.b))
63	}
64}
65
66func TestCPUSet_Union(t *testing.T) {
67	cases := []struct {
68		a        CPUSet
69		b        CPUSet
70		expected CPUSet
71	}{
72		{New(), New(), New()},
73
74		{New(), New(0), New(0)},
75		{New(0), New(), New(0)},
76		{New(0), New(0), New(0)},
77
78		{New(), New(0, 1, 2, 3), New(0, 1, 2, 3)},
79		{New(0, 1), New(0, 1, 2, 3), New(0, 1, 2, 3)},
80		{New(2, 3), New(4, 5), New(2, 3, 4, 5)},
81		{New(3, 4), New(0, 1, 2, 3), New(0, 1, 2, 3, 4)},
82	}
83
84	for _, c := range cases {
85		require.Exactly(t, c.expected.ToSlice(), c.a.Union(c.b).ToSlice())
86	}
87}
88
89func TestCPUSet_Difference(t *testing.T) {
90	cases := []struct {
91		a        CPUSet
92		b        CPUSet
93		expected CPUSet
94	}{
95		{New(), New(), New()},
96
97		{New(), New(0), New()},
98		{New(0), New(), New(0)},
99		{New(0), New(0), New()},
100
101		{New(0, 1), New(0, 1, 2, 3), New()},
102		{New(2, 3), New(4, 5), New(2, 3)},
103		{New(3, 4), New(0, 1, 2, 3), New(4)},
104	}
105
106	for _, c := range cases {
107		require.Exactly(t, c.expected.ToSlice(), c.a.Difference(c.b).ToSlice())
108	}
109}
110
111func TestCPUSet_IsSubsetOf(t *testing.T) {
112	cases := []struct {
113		a        CPUSet
114		b        CPUSet
115		isSubset bool
116	}{
117		{New(0), New(0), true},
118		{New(), New(0), true},
119		{New(0), New(), false},
120		{New(1, 2), New(0, 1, 2, 3), true},
121		{New(2, 1), New(0, 1, 2, 3), true},
122		{New(3, 4), New(0, 1, 2, 3), false},
123	}
124
125	for _, c := range cases {
126		require.Equal(t, c.isSubset, c.a.IsSubsetOf(c.b))
127	}
128}
129
130func TestCPUSet_IsSupersetOf(t *testing.T) {
131	cases := []struct {
132		a          CPUSet
133		b          CPUSet
134		isSuperset bool
135	}{
136		{New(0), New(0), true},
137		{New(0), New(), true},
138		{New(), New(0), false},
139		{New(0, 1, 2, 3), New(0), true},
140		{New(0, 1, 2, 3), New(2, 3), true},
141		{New(0, 1, 2, 3), New(2, 3, 4), false},
142	}
143
144	for _, c := range cases {
145		require.Equal(t, c.isSuperset, c.a.IsSupersetOf(c.b))
146	}
147}
148
149func TestCPUSet_ContainsAny(t *testing.T) {
150	cases := []struct {
151		a           CPUSet
152		b           CPUSet
153		containsAny bool
154	}{
155		{New(0), New(0), true},
156		{New(0), New(), false},
157		{New(), New(0), false},
158		{New(0, 1, 2, 3), New(0), true},
159		{New(0, 1, 2, 3), New(2, 3), true},
160		{New(0, 1, 2, 3), New(2, 3, 4), true},
161	}
162
163	for _, c := range cases {
164		require.Equal(t, c.containsAny, c.a.ContainsAny(c.b))
165	}
166}
167
168func TestParse(t *testing.T) {
169	cases := []struct {
170		cpuset   string
171		expected CPUSet
172	}{
173		{"", New()},
174		{"\n", New()},
175		{"1", New(1)},
176		{"1\n", New(1)},
177		{"0,1,2,3", New(0, 1, 2, 3)},
178		{"0-3", New(0, 1, 2, 3)},
179		{"0,2-3,5", New(0, 2, 3, 5)},
180	}
181
182	for _, c := range cases {
183		result, err := Parse(c.cpuset)
184		require.NoError(t, err)
185		require.True(t, result.Equals(c.expected))
186	}
187}
188
189func TestCPUSet_String(t *testing.T) {
190	cases := []struct {
191		cpuset   CPUSet
192		expected string
193	}{
194		{New(), ""},
195		{New(0, 1, 2, 3), "0-3"},
196		{New(1, 3), "1,3"},
197		{New(0, 2, 3, 5), "0,2-3,5"},
198	}
199
200	for _, c := range cases {
201		require.Equal(t, c.expected, c.cpuset.String())
202	}
203}
204