Source file src/log/slog/level_test.go

     1  // 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  
     5  package slog
     6  
     7  import (
     8  	"flag"
     9  	"strings"
    10  	"testing"
    11  )
    12  
    13  func TestLevelString(t *testing.T) {
    14  	for _, test := range []struct {
    15  		in   Level
    16  		want string
    17  	}{
    18  		{0, "INFO"},
    19  		{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"},
    29  	} {
    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  
    37  func TestLevelVar(t *testing.T) {
    38  	var al LevelVar
    39  	if got, want := al.Level(), LevelInfo; got != want {
    40  		t.Errorf("got %v, want %v", got, want)
    41  	}
    42  	al.Set(LevelWarn)
    43  	if got, want := al.Level(), LevelWarn; got != want {
    44  		t.Errorf("got %v, want %v", got, want)
    45  	}
    46  	al.Set(LevelInfo)
    47  	if got, want := al.Level(), LevelInfo; got != want {
    48  		t.Errorf("got %v, want %v", got, want)
    49  	}
    50  
    51  }
    52  
    53  func 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  
    68  func TestLevelMarshalText(t *testing.T) {
    69  	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  
    83  func 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  
   108  func 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  
   127  func 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  }
   139  
   140  func 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  
   156  func 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  }
   169  
   170  func TestLevelVarString(t *testing.T) {
   171  	var v LevelVar
   172  	v.Set(LevelError)
   173  	got := v.String()
   174  	want := "LevelVar(ERROR)"
   175  	if got != want {
   176  		t.Errorf("got %q, want %q", got, want)
   177  	}
   178  }
   179  

View as plain text