This repository was archived by the owner on Jan 28, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 109
/
Copy pathsqrt_power_test.go
110 lines (100 loc) · 3.02 KB
/
sqrt_power_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package function
import (
"math"
"testing"
"github.com/src-d/go-mysql-server/sql"
"github.com/src-d/go-mysql-server/sql/expression"
"github.com/stretchr/testify/require"
)
func TestSqrt(t *testing.T) {
f := NewSqrt(
expression.NewGetField(0, sql.Float64, "n", false),
)
testCases := []struct {
name string
row sql.Row
expected interface{}
err bool
}{
{"null input", sql.NewRow(nil), nil, false},
{"invalid string", sql.NewRow("foo"), nil, true},
{"valid string", sql.NewRow("9"), float64(3), false},
{"number is zero", sql.NewRow(0), float64(0), false},
{"positive number", sql.NewRow(8), float64(2.8284271247461903), false},
}
for _, tt := range testCases {
t.Run(tt.name, func(t *testing.T) {
t.Helper()
require := require.New(t)
ctx := sql.NewEmptyContext()
v, err := f.Eval(ctx, tt.row)
if tt.err {
require.Error(err)
} else {
require.NoError(err)
require.Equal(tt.expected, v)
}
})
}
// Test negative number
f = NewSqrt(
expression.NewGetField(0, sql.Float64, "n", false),
)
require := require.New(t)
v, err := f.Eval(sql.NewEmptyContext(), []interface{}{float64(-4)})
require.NoError(err)
require.IsType(float64(0), v)
require.True(math.IsNaN(v.(float64)))
}
func TestPower(t *testing.T) {
testCases := []struct {
name string
rowType sql.Type
row sql.Row
expected interface{}
err bool
}{
{"Base and exp are nil", sql.Float64, sql.NewRow(nil, nil), nil, false},
{"Base is nil", sql.Float64, sql.NewRow(2, nil), nil, false},
{"Exp is nil", sql.Float64, sql.NewRow(nil, 2), nil, false},
{"Base is 0", sql.Float64, sql.NewRow(0, 2), float64(0), false},
{"Base and exp is 0", sql.Float64, sql.NewRow(0, 0), float64(1), false},
{"Exp is 0", sql.Float64, sql.NewRow(2, 0), float64(1), false},
{"Base is negative", sql.Float64, sql.NewRow(-2, 2), float64(4), false},
{"Exp is negative", sql.Float64, sql.NewRow(2, -2), float64(0.25), false},
{"Base and exp are invalid strings", sql.Float64, sql.NewRow("a", "b"), nil, true},
{"Base and exp are valid strings", sql.Float64, sql.NewRow("2", "2"), float64(4), false},
}
for _, tt := range testCases {
f := NewPower(
expression.NewGetField(0, tt.rowType, "", false),
expression.NewGetField(1, tt.rowType, "", false),
)
t.Run(tt.name, func(t *testing.T) {
t.Helper()
require := require.New(t)
ctx := sql.NewEmptyContext()
v, err := f.Eval(ctx, tt.row)
if tt.err {
require.Error(err)
} else {
require.NoError(err)
require.Equal(tt.expected, v)
}
})
}
// Test inf numbers
f := NewPower(
expression.NewGetField(0, sql.Float64, "", false),
expression.NewGetField(1, sql.Float64, "", false),
)
require := require.New(t)
v, err := f.Eval(sql.NewEmptyContext(), sql.NewRow(2, math.Inf(1)))
require.NoError(err)
require.IsType(float64(0), v)
require.True(math.IsInf(v.(float64), 1))
v, err = f.Eval(sql.NewEmptyContext(), sql.NewRow(math.Inf(1), 2))
require.NoError(err)
require.IsType(float64(0), v)
require.True(math.IsInf(v.(float64), 1))
}