github.com/seeker-insurance/kit@v0.0.13/db/null/bool_test.go (about)

     1  package null
     2  
     3  import (
     4  	"encoding/json"
     5  	"testing"
     6  )
     7  
     8  var (
     9  	boolJSON     = []byte(`true`)
    10  	falseJSON    = []byte(`false`)
    11  	nullBoolJSON = []byte(`{"Bool":true,"Valid":true}`)
    12  )
    13  
    14  func TestBoolFrom(t *testing.T) {
    15  	b := BoolFrom(true)
    16  	assertBool(t, b, "BoolFrom()")
    17  
    18  	zero := BoolFrom(false)
    19  	if !zero.Valid {
    20  		t.Error("BoolFrom(false)", "is invalid, but should be valid")
    21  	}
    22  }
    23  
    24  func TestBoolFromPtr(t *testing.T) {
    25  	n := true
    26  	bptr := &n
    27  	b := BoolFromPtr(bptr)
    28  	assertBool(t, b, "BoolFromPtr()")
    29  
    30  	null := BoolFromPtr(nil)
    31  	assertNullBool(t, null, "BoolFromPtr(nil)")
    32  }
    33  
    34  func TestUnmarshalBool(t *testing.T) {
    35  	var b Bool
    36  	err := json.Unmarshal(boolJSON, &b)
    37  	maybePanic(err)
    38  	assertBool(t, b, "bool json")
    39  
    40  	var nb Bool
    41  	err = json.Unmarshal(nullBoolJSON, &nb)
    42  	maybePanic(err)
    43  	assertBool(t, nb, "sq.NullBool json")
    44  
    45  	var null Bool
    46  	err = json.Unmarshal(nullJSON, &null)
    47  	maybePanic(err)
    48  	assertNullBool(t, null, "null json")
    49  
    50  	var badType Bool
    51  	err = json.Unmarshal(intJSON, &badType)
    52  	if err == nil {
    53  		panic("err should not be nil")
    54  	}
    55  	assertNullBool(t, badType, "wrong type json")
    56  
    57  	var invalid Bool
    58  	err = invalid.UnmarshalJSON(invalidJSON)
    59  	if _, ok := err.(*json.SyntaxError); !ok {
    60  		t.Errorf("expected json.SyntaxError, not %T", err)
    61  	}
    62  }
    63  
    64  func TestTextUnmarshalBool(t *testing.T) {
    65  	var b Bool
    66  	err := b.UnmarshalText([]byte("true"))
    67  	maybePanic(err)
    68  	assertBool(t, b, "UnmarshalText() bool")
    69  
    70  	var zero Bool
    71  	err = zero.UnmarshalText([]byte("false"))
    72  	maybePanic(err)
    73  	assertFalseBool(t, zero, "UnmarshalText() false")
    74  
    75  	var blank Bool
    76  	err = blank.UnmarshalText([]byte(""))
    77  	maybePanic(err)
    78  	assertNullBool(t, blank, "UnmarshalText() empty bool")
    79  
    80  	var null Bool
    81  	err = null.UnmarshalText([]byte("null"))
    82  	maybePanic(err)
    83  	assertNullBool(t, null, `UnmarshalText() "null"`)
    84  
    85  	var invalid Bool
    86  	err = invalid.UnmarshalText([]byte(":D"))
    87  	if err == nil {
    88  		panic("err should not be nil")
    89  	}
    90  	assertNullBool(t, invalid, "invalid json")
    91  }
    92  
    93  func TestMarshalBool(t *testing.T) {
    94  	b := BoolFrom(true)
    95  	data, err := json.Marshal(b)
    96  	maybePanic(err)
    97  	assertJSONEquals(t, data, "true", "non-empty json marshal")
    98  
    99  	zero := NewBool(false, true)
   100  	data, err = json.Marshal(zero)
   101  	maybePanic(err)
   102  	assertJSONEquals(t, data, "false", "zero json marshal")
   103  
   104  	// invalid values should be encoded as null
   105  	null := NewBool(false, false)
   106  	data, err = json.Marshal(null)
   107  	maybePanic(err)
   108  	assertJSONEquals(t, data, "null", "null json marshal")
   109  }
   110  
   111  func TestMarshalBoolText(t *testing.T) {
   112  	b := BoolFrom(true)
   113  	data, err := b.MarshalText()
   114  	maybePanic(err)
   115  	assertJSONEquals(t, data, "true", "non-empty text marshal")
   116  
   117  	zero := NewBool(false, true)
   118  	data, err = zero.MarshalText()
   119  	maybePanic(err)
   120  	assertJSONEquals(t, data, "false", "zero text marshal")
   121  
   122  	// invalid values should be encoded as null
   123  	null := NewBool(false, false)
   124  	data, err = null.MarshalText()
   125  	maybePanic(err)
   126  	assertJSONEquals(t, data, "", "null text marshal")
   127  }
   128  
   129  func TestBoolPointer(t *testing.T) {
   130  	b := BoolFrom(true)
   131  	ptr := b.Ptr()
   132  	if *ptr != true {
   133  		t.Errorf("bad %s bool: %#v ≠ %v\n", "pointer", ptr, true)
   134  	}
   135  
   136  	null := NewBool(false, false)
   137  	ptr = null.Ptr()
   138  	if ptr != nil {
   139  		t.Errorf("bad %s bool: %#v ≠ %s\n", "nil pointer", ptr, "nil")
   140  	}
   141  }
   142  
   143  func TestBoolIsZero(t *testing.T) {
   144  	b := BoolFrom(true)
   145  	if b.IsZero() {
   146  		t.Errorf("IsZero() should be false")
   147  	}
   148  
   149  	null := NewBool(false, false)
   150  	if !null.IsZero() {
   151  		t.Errorf("IsZero() should be true")
   152  	}
   153  
   154  	zero := NewBool(false, true)
   155  	if zero.IsZero() {
   156  		t.Errorf("IsZero() should be false")
   157  	}
   158  }
   159  
   160  func TestBoolSetValid(t *testing.T) {
   161  	change := NewBool(false, false)
   162  	assertNullBool(t, change, "SetValid()")
   163  	change.SetValid(true)
   164  	assertBool(t, change, "SetValid()")
   165  }
   166  
   167  func TestBoolScan(t *testing.T) {
   168  	var b Bool
   169  	err := b.Scan(true)
   170  	maybePanic(err)
   171  	assertBool(t, b, "scanned bool")
   172  
   173  	var null Bool
   174  	err = null.Scan(nil)
   175  	maybePanic(err)
   176  	assertNullBool(t, null, "scanned null")
   177  }
   178  
   179  func TestBoolValueOrZero(t *testing.T) {
   180  	valid := NewBool(true, true)
   181  	if valid.ValueOrZero() != true {
   182  		t.Error("unexpected ValueOrZero", valid.ValueOrZero())
   183  	}
   184  
   185  	invalid := NewBool(true, false)
   186  	if invalid.ValueOrZero() != false {
   187  		t.Error("unexpected ValueOrZero", invalid.ValueOrZero())
   188  	}
   189  }
   190  
   191  func assertBool(t *testing.T, b Bool, from string) {
   192  	if b.Bool != true {
   193  		t.Errorf("bad %s bool: %v ≠ %v\n", from, b.Bool, true)
   194  	}
   195  	if !b.Valid {
   196  		t.Error(from, "is invalid, but should be valid")
   197  	}
   198  }
   199  
   200  func assertFalseBool(t *testing.T, b Bool, from string) {
   201  	if b.Bool != false {
   202  		t.Errorf("bad %s bool: %v ≠ %v\n", from, b.Bool, false)
   203  	}
   204  	if !b.Valid {
   205  		t.Error(from, "is invalid, but should be valid")
   206  	}
   207  }
   208  
   209  func assertNullBool(t *testing.T, b Bool, from string) {
   210  	if b.Valid {
   211  		t.Error(from, "is valid, but should be invalid")
   212  	}
   213  }