Passed
Push — main ( add42e...815f74 )
by Rushan
02:28 queued 12s
created

generic.TestNewNumber   A

Complexity

Conditions 4

Size

Total Lines 34
Code Lines 31

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 31
dl 0
loc 34
c 0
b 0
f 0
rs 9.1359
nop 1
1
package generic
2
3
import (
4
	"testing"
5
6
	"github.com/stretchr/testify/assert"
7
)
8
9
func TestNewNumber(t *testing.T) {
10
	tests := []struct {
11
		name     string
12
		value    interface{}
13
		expected Number
14
	}{
15
		{"uint", uint(123), Number{int: 123, float: 123, isInt: true}},
16
		{"uint8", uint8(123), Number{int: 123, float: 123, isInt: true}},
17
		{"uint16", uint16(123), Number{int: 123, float: 123, isInt: true}},
18
		{"uint32", uint32(123), Number{int: 123, float: 123, isInt: true}},
19
		{"uint64", uint64(123), Number{int: 123, float: 123, isInt: true}},
20
		{"int", 123, Number{int: 123, float: 123, isInt: true}},
21
		{"int8", int8(123), Number{int: 123, float: 123, isInt: true}},
22
		{"int16", int16(123), Number{int: 123, float: 123, isInt: true}},
23
		{"int32", int32(123), Number{int: 123, float: 123, isInt: true}},
24
		{"int64", int64(123), Number{int: 123, float: 123, isInt: true}},
25
		{"float32 as int", float32(123), Number{int: 123, float: 123, isInt: true}},
26
		{"float64 as int", float64(123), Number{int: 123, float: 123, isInt: true}},
27
		{"float32", float32(123.123), Number{int: 123, float: 123.12300109863281, isInt: false}},
28
		{"float64", float64(123.123), Number{int: 123, float: 123.123, isInt: false}},
29
		{"uint pointer", uintPointer(123), Number{int: 123, float: 123, isInt: true}},
30
		{"int pointer", intPointer(123), Number{int: 123, float: 123, isInt: true}},
31
		{"float64 pointer", floatPointer(123.123), Number{int: 123, float: 123.123, isInt: false}},
32
		{"nil uint pointer", nilUint, Number{isNil: true}},
33
		{"nil int pointer", nilInt, Number{isNil: true}},
34
		{"nil float64 pointer", nilFloat, Number{isNil: true}},
35
	}
36
	for _, test := range tests {
37
		t.Run(test.name, func(t *testing.T) {
38
			n, err := NewNumber(test.value)
39
40
			assert.NoError(t, err)
41
			if assert.NotNil(t, n) {
42
				assert.Equal(t, test.expected, *n)
43
			}
44
		})
45
	}
46
}
47
48
func TestNewNumberFromInt(t *testing.T) {
49
	n := NewNumberFromInt(1)
50
51
	assert.Equal(t, int64(1), n.int)
52
	assert.Equal(t, float64(1), n.float)
53
	assert.True(t, n.isInt)
54
}
55
56
func TestNewNumberFromFloat(t *testing.T) {
57
	n := NewNumberFromFloat(1.5)
58
59
	assert.Equal(t, int64(1), n.int)
60
	assert.Equal(t, 1.5, n.float)
61
	assert.False(t, n.isInt)
62
}
63
64
func TestNumber_String_WhenNumberFromInt_ExpectInt(t *testing.T) {
65
	n := NewNumberFromInt(123)
66
67
	s := n.String()
68
69
	assert.Equal(t, "123", s)
70
}
71
72
func TestNumber_String_WhenNumberFromFloat_ExpectFloat(t *testing.T) {
73
	n := NewNumberFromFloat(123.123)
74
75
	s := n.String()
76
77
	assert.Equal(t, "123.123", s)
78
}
79
80
func TestNewNumber_WhenNotNumeric_ExpectError(t *testing.T) {
81
	n, err := NewNumber(struct{}{})
82
83
	assert.Nil(t, n)
84
	assert.EqualError(t, err, "value of type struct is not numeric")
85
}
86
87
func TestMustNewNumber_WhenNotNumeric_ExpectPanic(t *testing.T) {
88
	assert.Panics(t, func() {
89
		MustNewNumber(struct{}{})
90
	})
91
}
92
93
func TestNumber_IsNil_WhenIsNil_ExpectTrue(t *testing.T) {
94
	n := MustNewNumber(nilInt)
95
96
	assert.True(t, n.IsNil())
97
}
98
99
func TestNumber_IsZero(t *testing.T) {
100
	tests := []struct {
101
		name   string
102
		n      Number
103
		isZero bool
104
	}{
105
		{"nil value is not zero", MustNewNumber(nilInt), false},
106
		{"zero int is zero", MustNewNumber(0), true},
107
		{"zero float is zero", MustNewNumber(0.0), true},
108
		{"float less than 1.0 is not zero", MustNewNumber(0.0123), false},
109
	}
110
	for _, test := range tests {
111
		t.Run(test.name, func(t *testing.T) {
112
			isZero := test.n.IsZero()
113
114
			assert.Equal(t, test.isZero, isZero)
115
		})
116
	}
117
}
118
119
func TestCompareNumbers(t *testing.T) {
120
	tests := []struct {
121
		name     string
122
		result   bool
123
		expected bool
124
	}{
125
		{"int equal to int", MustNewNumber(123).IsEqualTo(MustNewNumber(123)), true},
126
		{"int not equal to int", MustNewNumber(123).IsEqualTo(MustNewNumber(124)), false},
127
		{"nil not equal to any", MustNewNumber(nilInt).IsEqualTo(MustNewNumber(123)), false},
128
		{"any not equal to nil", MustNewNumber(123).IsEqualTo(MustNewNumber(nilInt)), false},
129
		{"float equal to float", MustNewNumber(123.123).IsEqualTo(MustNewNumber(123.123)), true},
130
		{"float not equal to float", MustNewNumber(123.123).IsEqualTo(MustNewNumber(123.124)), false},
131
		{"float equal to int", MustNewNumber(floatPointer(123)).IsEqualTo(MustNewNumber(123)), true},
132
		{"int greater than int", MustNewNumber(123).IsGreaterThan(MustNewNumber(122)), true},
133
		{"int not greater than int", MustNewNumber(123).IsGreaterThan(MustNewNumber(123)), false},
134
		{"nil not greater than any", MustNewNumber(nilInt).IsGreaterThan(MustNewNumber(123)), false},
135
		{"any not greater than nil", MustNewNumber(123).IsGreaterThan(MustNewNumber(nilInt)), false},
136
		{"float greater than float", MustNewNumber(123.123).IsGreaterThan(MustNewNumber(123.122)), true},
137
		{"float not greater than float", MustNewNumber(123.123).IsGreaterThan(MustNewNumber(123.123)), false},
138
		{"float greater than int", MustNewNumber(floatPointer(123.01)).IsGreaterThan(MustNewNumber(123)), true},
139
		{"int less than int", MustNewNumber(123).IsLessThan(MustNewNumber(124)), true},
140
		{"int not less than int", MustNewNumber(123).IsLessThan(MustNewNumber(123)), false},
141
		{"nil not less than any", MustNewNumber(nilInt).IsLessThan(MustNewNumber(123)), false},
142
		{"any not less than nil", MustNewNumber(123).IsLessThan(MustNewNumber(nilInt)), false},
143
		{"float less than float", MustNewNumber(123.123).IsLessThan(MustNewNumber(123.124)), true},
144
		{"float not less than float", MustNewNumber(123.123).IsLessThan(MustNewNumber(123.123)), false},
145
		{"float less than int", MustNewNumber(floatPointer(122.99)).IsLessThan(MustNewNumber(123)), true},
146
	}
147
	for _, test := range tests {
148
		t.Run(test.name, func(t *testing.T) {
149
			assert.Equal(t, test.expected, test.result)
150
		})
151
	}
152
}
153