github.com/matrixorigin/matrixone@v0.7.0/pkg/vectorize/floor/floor_test.go (about) 1 // Copyright 2021 Matrix Origin 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package floor 16 17 import ( 18 "math" 19 "testing" 20 21 "github.com/stretchr/testify/assert" 22 "github.com/stretchr/testify/require" 23 ) 24 25 func TestFloorUint8(t *testing.T) { 26 nums := []uint8{1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233} 27 res := make([]uint8, len(nums)) 28 res0 := floorUint8(nums, res, 0) 29 correctRes0 := []uint8{1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233} 30 for i := range res0 { 31 require.Equal(t, res0[i], correctRes0[i]) 32 } 33 resMinus1 := floorUint8(nums, res, -1) 34 correctResMinus1 := []uint8{0, 0, 0, 0, 0, 10, 20, 30, 50, 80, 140, 230} 35 for i := range resMinus1 { 36 require.Equal(t, correctResMinus1[i], resMinus1[i]) 37 } 38 resMinus2 := floorUint8(nums, res, -2) 39 correctResMinus2 := []uint8{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 200} 40 for i := range resMinus2 { 41 require.Equal(t, correctResMinus2[i], resMinus2[i]) 42 } 43 } 44 45 func TestFloorUint16(t *testing.T) { 46 nums := []uint16{1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368} 47 res := make([]uint16, len(nums)) 48 res0 := floorUint16(nums, res, 0) 49 correctRes0 := []uint16{1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368} 50 for i := range res0 { 51 require.Equal(t, correctRes0[i], res0[i]) 52 } 53 resMinus1 := floorUint16(nums, res, -1) 54 correctResMinus1 := []uint16{0, 0, 0, 0, 0, 10, 20, 30, 50, 80, 140, 230, 370, 610, 980, 1590, 2580, 4180, 6760, 10940, 17710, 28650, 46360} 55 for i := range resMinus1 { 56 require.Equal(t, correctResMinus1[i], resMinus1[i]) 57 } 58 resMinus2 := floorUint16(nums, res, -2) 59 correctResMinus2 := []uint16{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 200, 300, 600, 900, 1500, 2500, 4100, 6700, 10900, 17700, 28600, 46300} 60 for i := range resMinus2 { 61 require.Equal(t, correctResMinus2[i], resMinus2[i]) 62 } 63 } 64 65 func TestFloorUint32(t *testing.T) { 66 nums := []uint32{1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811} 67 res := make([]uint32, len(nums)) 68 res0 := floorUint32(nums, res, 0) 69 correctRes0 := []uint32{1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811} 70 for i := range res0 { 71 require.Equal(t, res0[i], correctRes0[i]) 72 } 73 resMinus1 := floorUint32(nums, res, -1) 74 correctResMinus1 := []uint32{0, 0, 0, 0, 0, 10, 20, 30, 50, 80, 140, 230, 370, 610, 980, 1590, 2580, 4180, 6760, 10940, 17710, 28650, 46360, 75020, 121390, 196410, 317810} 75 for i := range res0 { 76 require.Equal(t, resMinus1[i], correctResMinus1[i]) 77 } 78 resMinus2 := floorUint32(nums, res, -2) 79 80 correctResMinus2 := []uint32{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 200, 300, 600, 900, 1500, 2500, 4100, 6700, 10900, 17700, 28600, 46300, 75000, 121300, 196400, 317800} 81 for i := range res0 { 82 require.Equal(t, resMinus2[i], correctResMinus2[i]) 83 } 84 } 85 86 func TestFloorUint64(t *testing.T) { 87 nums := []uint64{1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811} 88 res := make([]uint64, len(nums)) 89 res0 := floorUint64(nums, res, 0) 90 correctRes0 := []uint64{1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811} 91 for i := range res0 { 92 require.Equal(t, correctRes0[i], res0[i]) 93 } 94 resMinus1 := floorUint64(nums, res, -1) 95 correctResMinus1 := []uint64{0, 0, 0, 0, 0, 10, 20, 30, 50, 80, 140, 230, 370, 610, 980, 1590, 2580, 4180, 6760, 10940, 17710, 28650, 46360, 75020, 121390, 196410, 317810} 96 for i := range res0 { 97 require.Equal(t, correctResMinus1[i], resMinus1[i]) 98 } 99 resMinus2 := floorUint64(nums, res, -2) 100 correctResMinus2 := []uint64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 200, 300, 600, 900, 1500, 2500, 4100, 6700, 10900, 17700, 28600, 46300, 75000, 121300, 196400, 317800} 101 for i := range res0 { 102 require.Equal(t, correctResMinus2[i], resMinus2[i]) 103 } 104 } 105 106 func TestFloorInt8(t *testing.T) { 107 nums := []int8{1, 2, 3, 5, 8, 13, 21, 34, 55, 89, -1, -2, -3, -5, -8, -13, -21, -34, -55, -89} 108 res := make([]int8, len(nums)) 109 res0 := floorInt8(nums, res, 0) 110 correctRes0 := []int8{1, 2, 3, 5, 8, 13, 21, 34, 55, 89, -1, -2, -3, -5, -8, -13, -21, -34, -55, -89} 111 for i := range res0 { 112 require.Equal(t, correctRes0[i], res0[i]) 113 } 114 resMinus1 := floorInt8(nums, res, -1) 115 correctResMinus1 := []int8{0, 0, 0, 0, 0, 10, 20, 30, 50, 80, -10, -10, -10, -10, -10, -20, -30, -40, -60, -90} 116 for i := range res0 { 117 require.Equal(t, correctResMinus1[i], resMinus1[i]) 118 } 119 } 120 121 func TestFloorInt16(t *testing.T) { 122 nums := []int16{1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, -1, -2, -3, -5, -8, -13, -21, -34, -55, -89, -144, -233, -377, -610, -987, -1597, -2584, -4181} 123 res := make([]int16, len(nums)) 124 res0 := floorInt16(nums, res, 0) 125 correctRes0 := []int16{1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, -1, -2, -3, -5, -8, -13, -21, -34, -55, -89, -144, -233, -377, -610, -987, -1597, -2584, -4181} 126 for i := range res0 { 127 require.Equal(t, correctRes0[i], res0[i]) 128 } 129 resMinus1 := floorInt16(nums, res, -1) 130 131 correctResMinus1 := []int16{0, 0, 0, 0, 0, 10, 20, 30, 50, 80, 140, 230, 370, 610, 980, 1590, 2580, 4180, -10, -10, -10, -10, -10, -20, -30, -40, -60, -90, -150, -240, -380, -610, -990, -1600, -2590, -4190} 132 for i := range res0 { 133 require.Equal(t, correctResMinus1[i], resMinus1[i]) 134 } 135 } 136 137 func TestFloorInt32(t *testing.T) { 138 nums := []int32{1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, -1, -2, -3, -5, -8, -13, -21, -34, -55, -89, -144, -233, -377, -610, -987, -1597, -2584, -4181} 139 res := make([]int32, len(nums)) 140 res0 := floorInt32(nums, res, 0) 141 correctRes0 := []int32{1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, -1, -2, -3, -5, -8, -13, -21, -34, -55, -89, -144, -233, -377, -610, -987, -1597, -2584, -4181} 142 for i := range res0 { 143 require.Equal(t, correctRes0[i], res0[i]) 144 } 145 resMinus1 := floorInt32(nums, res, -1) 146 147 correctResMinus1 := []int32{0, 0, 0, 0, 0, 10, 20, 30, 50, 80, 140, 230, 370, 610, 980, 1590, 2580, 4180, -10, -10, -10, -10, -10, -20, -30, -40, -60, -90, -150, -240, -380, -610, -990, -1600, -2590, -4190} 148 for i := range resMinus1 { 149 require.Equal(t, correctResMinus1[i], resMinus1[i]) 150 } 151 } 152 153 func TestFloorInt64(t *testing.T) { 154 nums := []int64{1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, -1, -2, -3, -5, -8, -13, -21, -34, -55, -89, -144, -233, -377, -610, -987, -1597, -2584, -4181, 32768, 1234567} 155 res := make([]int64, len(nums)) 156 res0 := floorInt64(nums, res, 0) 157 correctRes0 := []int64{1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, -1, -2, -3, -5, -8, -13, -21, -34, -55, -89, -144, -233, -377, -610, -987, -1597, -2584, -4181, 32768, 1234567} 158 for i := range res0 { 159 require.Equal(t, correctRes0[i], res0[i]) 160 } 161 resMinus1 := floorInt64(nums, res, -1) 162 correctResMinus1 := []int64{0, 0, 0, 0, 0, 10, 20, 30, 50, 80, 140, 230, 370, 610, 980, 1590, 2580, 4180, -10, -10, -10, -10, -10, -20, -30, -40, -60, -90, -150, -240, -380, -610, -990, -1600, -2590, -4190, 32760, 1234560} 163 for i := range resMinus1 { 164 require.Equal(t, correctResMinus1[i], resMinus1[i]) 165 } 166 } 167 168 const tolerance = .00001 169 170 func floatCompare(x, y float64) bool { 171 diff := math.Abs(x - y) 172 mean := math.Abs(x + y) 173 if math.IsNaN(diff / mean) { 174 return true 175 } 176 return (diff / mean) < tolerance 177 } 178 179 func TestFloorFloat32(t *testing.T) { 180 nums := []float32{1.5, -1.5, 2.5, -2.5, 1.2, 12.3, 123.4, 1234.5, 12345.6, 1234.567, -1.2, -12.3, -123.4, -1234.5, -12345.6} 181 res := make([]float32, len(nums)) 182 res0 := floorFloat32(nums, res, 0) 183 correctRes0 := []float32{1, -2, 2, -3, 1, 12, 123, 1234, 12345, 1234, -2, -13, -124, -1235, -12346} 184 for i := range nums { 185 assert.True(t, floatCompare(float64(correctRes0[i]), float64(res0[i]))) 186 } 187 resMinus1 := floorFloat32(nums, res, -1) 188 correctResMinus1 := []float32{0, -10, 0, -10, 0, 10, 120, 1230, 12340, 1230, -10, -20, -130, -1240, -12350} 189 for i := range nums { 190 assert.True(t, floatCompare(float64(correctResMinus1[i]), float64(resMinus1[i]))) 191 } 192 res1 := floorFloat32(nums, res, 1) 193 correctRes1 := []float32{1.5, -1.5, 2.5, -2.5, 1.2, 12.3, 123.4, 1234.5, 12345.6, 1234.5, -1.2, -12.3, -123.4, -1234.5, -12345.6} 194 for i := range res1 { 195 assert.True(t, floatCompare(float64(correctRes1[i]), float64(res1[i]))) 196 } 197 } 198 199 func TestFloorFloat64(t *testing.T) { 200 nums := []float64{1.5, -1.5, 2.5, -2.5, 1.2, 12.3, 123.4, 1234.5, 12345.6, 1234.567, -1.2, -12.3, -123.4, -1234.5, -12345.6} 201 res := make([]float64, len(nums)) 202 res0 := floorFloat64(nums, res, 0) 203 correctRes0 := []float64{1, -2, 2, -3, 1, 12, 123, 1234, 12345, 1234, -2, -13, -124, -1235, -12346} 204 for i := range nums { 205 assert.True(t, floatCompare(correctRes0[i], res0[i])) 206 } 207 resMinus1 := floorFloat64(nums, res, -1) 208 correctResMinus1 := []float64{0, -10, 0, -10, 0, 10, 120, 1230, 12340, 1230, -10, -20, -130, -1240, -12350} 209 for i := range nums { 210 assert.True(t, floatCompare(correctResMinus1[i], resMinus1[i])) 211 } 212 res1 := floorFloat64(nums, res, 1) 213 correctRes1 := []float64{1.5, -1.5, 2.5, -2.5, 1.2, 12.3, 123.4, 1234.5, 12345.6, 1234.5, -1.2, -12.3, -123.4, -1234.5, -12345.6} 214 for i := range res1 { 215 assert.True(t, floatCompare(correctRes1[i], res1[i])) 216 } 217 }