blob: 33b20fdb68b41feac46134657280de336b49a6c8 [file] [log] [blame]
Jonathan Amsterdam5c2e9b42022-08-29 08:01:47 -04001// Copyright 2022 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package slog
6
7import (
Jonathan Amsterdama67bb562023-01-24 11:16:11 -05008 "flag"
9 "strings"
Jonathan Amsterdam5c2e9b42022-08-29 08:01:47 -040010 "testing"
11)
12
13func TestLevelString(t *testing.T) {
14 for _, test := range []struct {
15 in Level
16 want string
17 }{
Jonathan Amsterdamdf6207c2022-09-27 21:40:01 -040018 {0, "INFO"},
Jonathan Amsterdamfae10dd2022-12-11 09:07:42 -050019 {LevelError, "ERROR"},
20 {LevelError + 2, "ERROR+2"},
21 {LevelError - 2, "WARN+2"},
22 {LevelWarn, "WARN"},
23 {LevelWarn - 1, "INFO+3"},
24 {LevelInfo, "INFO"},
25 {LevelInfo + 1, "INFO+1"},
26 {LevelInfo - 3, "DEBUG+1"},
27 {LevelDebug, "DEBUG"},
28 {LevelDebug - 2, "DEBUG-2"},
Jonathan Amsterdam5c2e9b42022-08-29 08:01:47 -040029 } {
30 got := test.in.String()
31 if got != test.want {
32 t.Errorf("%d: got %s, want %s", test.in, got, test.want)
33 }
34 }
35}
36
Jonathan Amsterdam05cedab2022-10-30 07:00:43 -040037func TestLevelVar(t *testing.T) {
38 var al LevelVar
Jonathan Amsterdamfae10dd2022-12-11 09:07:42 -050039 if got, want := al.Level(), LevelInfo; got != want {
Jonathan Amsterdam5c2e9b42022-08-29 08:01:47 -040040 t.Errorf("got %v, want %v", got, want)
41 }
Jonathan Amsterdamfae10dd2022-12-11 09:07:42 -050042 al.Set(LevelWarn)
43 if got, want := al.Level(), LevelWarn; got != want {
Jonathan Amsterdam5c2e9b42022-08-29 08:01:47 -040044 t.Errorf("got %v, want %v", got, want)
45 }
Jonathan Amsterdamfae10dd2022-12-11 09:07:42 -050046 al.Set(LevelInfo)
47 if got, want := al.Level(), LevelInfo; got != want {
Jonathan Amsterdam5c2e9b42022-08-29 08:01:47 -040048 t.Errorf("got %v, want %v", got, want)
49 }
50
51}
Jonathan Amsterdama67bb562023-01-24 11:16:11 -050052
53func TestMarshalJSON(t *testing.T) {
54 want := LevelWarn - 3
55 data, err := want.MarshalJSON()
56 if err != nil {
57 t.Fatal(err)
58 }
59 var got Level
60 if err := got.UnmarshalJSON(data); err != nil {
61 t.Fatal(err)
62 }
63 if got != want {
64 t.Errorf("got %s, want %s", got, want)
65 }
66}
67
Jonathan Amsterdam46f607a2023-02-05 08:19:58 -050068func TestLevelMarshalText(t *testing.T) {
Jonathan Amsterdama67bb562023-01-24 11:16:11 -050069 want := LevelWarn - 3
70 data, err := want.MarshalText()
71 if err != nil {
72 t.Fatal(err)
73 }
74 var got Level
75 if err := got.UnmarshalText(data); err != nil {
76 t.Fatal(err)
77 }
78 if got != want {
79 t.Errorf("got %s, want %s", got, want)
80 }
81}
82
83func TestLevelParse(t *testing.T) {
84 for _, test := range []struct {
85 in string
86 want Level
87 }{
88 {"DEBUG", LevelDebug},
89 {"INFO", LevelInfo},
90 {"WARN", LevelWarn},
91 {"ERROR", LevelError},
92 {"debug", LevelDebug},
93 {"iNfo", LevelInfo},
94 {"INFO+87", LevelInfo + 87},
95 {"Error-18", LevelError - 18},
96 {"Error-8", LevelInfo},
97 } {
98 var got Level
99 if err := got.parse(test.in); err != nil {
100 t.Fatalf("%q: %v", test.in, err)
101 }
102 if got != test.want {
103 t.Errorf("%q: got %s, want %s", test.in, got, test.want)
104 }
105 }
106}
107
108func TestLevelParseError(t *testing.T) {
109 for _, test := range []struct {
110 in string
111 want string // error string should contain this
112 }{
113 {"", "unknown name"},
114 {"dbg", "unknown name"},
115 {"INFO+", "invalid syntax"},
116 {"INFO-", "invalid syntax"},
117 {"ERROR+23x", "invalid syntax"},
118 } {
119 var l Level
120 err := l.parse(test.in)
121 if err == nil || !strings.Contains(err.Error(), test.want) {
122 t.Errorf("%q: got %v, want string containing %q", test.in, err, test.want)
123 }
124 }
125}
126
127func TestLevelFlag(t *testing.T) {
128 fs := flag.NewFlagSet("test", flag.ContinueOnError)
129 lf := LevelInfo
130 fs.TextVar(&lf, "level", lf, "set level")
131 err := fs.Parse([]string{"-level", "WARN+3"})
132 if err != nil {
133 t.Fatal(err)
134 }
135 if g, w := lf, LevelWarn+3; g != w {
136 t.Errorf("got %v, want %v", g, w)
137 }
138}
Jonathan Amsterdam46f607a2023-02-05 08:19:58 -0500139
140func TestLevelVarMarshalText(t *testing.T) {
141 var v LevelVar
142 v.Set(LevelWarn)
143 data, err := v.MarshalText()
144 if err != nil {
145 t.Fatal(err)
146 }
147 var v2 LevelVar
148 if err := v2.UnmarshalText(data); err != nil {
149 t.Fatal(err)
150 }
151 if g, w := v2.Level(), LevelWarn; g != w {
152 t.Errorf("got %s, want %s", g, w)
153 }
154}
155
156func TestLevelVarFlag(t *testing.T) {
157 fs := flag.NewFlagSet("test", flag.ContinueOnError)
158 v := &LevelVar{}
159 v.Set(LevelWarn + 3)
160 fs.TextVar(v, "level", v, "set level")
161 err := fs.Parse([]string{"-level", "WARN+3"})
162 if err != nil {
163 t.Fatal(err)
164 }
165 if g, w := v.Level(), LevelWarn+3; g != w {
166 t.Errorf("got %v, want %v", g, w)
167 }
168}