1package zint
2
3import (
4	"encoding"
5	"encoding/json"
6	"fmt"
7	"testing"
8)
9
10var (
11	_ encoding.TextUnmarshaler = new(Bitflag8)
12	_ json.Unmarshaler         = new(Bitflag8)
13)
14
15func TestBitflag(t *testing.T) {
16	const (
17		Foo Bitflag8 = 1 << iota
18		Bar
19		FooBar
20	)
21
22	var d Bitflag8
23	test := func(want string) {
24		got := fmt.Sprint(d.Has(Foo), d.Has(Bar), d.Has(FooBar))
25		if got != want {
26			t.Errorf("\ngot:  %s\nwant: %s", got, want)
27		}
28	}
29
30	test("false false false")
31
32	d.Set(Foo)
33	d.Toggle(FooBar)
34	test("true false true")
35
36	d.Clear(FooBar)
37	test("true false false")
38
39	t.Run("json", func(t *testing.T) {
40		f := Foo | Bar
41		j, err := json.Marshal(f)
42		if err != nil {
43			t.Fatal(err)
44		}
45		if string(j) != "3" {
46			t.Errorf(string(j))
47		}
48
49		var nf Bitflag8
50		err = json.Unmarshal(j, &nf)
51		if err != nil {
52			t.Fatal(err)
53		}
54
55		if uint8(nf) != 3 {
56			t.Error(nf)
57		}
58	})
59}
60