github.com/matrixorigin/matrixone@v0.7.0/pkg/vectorize/round/round_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 round 16 17 import ( 18 "math" 19 "testing" 20 21 "github.com/stretchr/testify/assert" 22 "github.com/stretchr/testify/require" 23 ) 24 25 func TestRoundUint8(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 := roundUint8(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 := roundUint8(nums, res, -1) 34 correctResMinus1 := []uint8{0, 0, 0, 10, 10, 10, 20, 30, 60, 90, 140, 230} 35 for i := range resMinus1 { 36 require.Equal(t, correctResMinus1[i], resMinus1[i]) 37 } 38 resMinus2 := roundUint8(nums, res, -2) 39 correctResMinus2 := []uint8{0, 0, 0, 0, 0, 0, 0, 0, 100, 100, 100} 40 for i := 0; i < len(resMinus2)-1; i++ { // roundUint8(233, 2) here will cause integer overflow and the result is undefined, so this test is skipped 41 require.Equal(t, correctResMinus2[i], resMinus1[i]) 42 } 43 } 44 45 func TestRoundUint16(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 := roundUint16(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 := roundUint16(nums, res, -1) 54 correctResMinus1 := []uint16{0, 0, 0, 10, 10, 10, 20, 30, 60, 90, 140, 230, 380, 610, 990, 1600, 2580, 4180, 6770, 10950, 17710, 28660, 46370} 55 for i := range resMinus1 { 56 require.Equal(t, correctResMinus1[i], resMinus1[i]) 57 } 58 resMinus2 := roundUint16(nums, res, -2) 59 correctResMinus2 := []uint16{0, 0, 0, 0, 0, 0, 0, 0, 100, 100, 100, 200, 400, 600, 1000, 1600, 2600, 4200, 6800, 10900, 17700, 28700, 46400} 60 for i := range resMinus2 { 61 require.Equal(t, correctResMinus2[i], resMinus2[i]) 62 } 63 } 64 65 func TestRoundUint32(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 := roundUint32(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 := roundUint32(nums, res, -1) 74 correctResMinus1 := []uint32{0, 0, 0, 10, 10, 10, 20, 30, 60, 90, 140, 230, 380, 610, 990, 1600, 2580, 4180, 6770, 10950, 17710, 28660, 46370, 75030, 121390, 196420, 317810} 75 for i := range res0 { 76 require.Equal(t, resMinus1[i], correctResMinus1[i]) 77 } 78 resMinus2 := roundUint32(nums, res, -2) 79 correctResMinus2 := []uint32{0, 0, 0, 0, 0, 0, 0, 0, 100, 100, 100, 200, 400, 600, 1000, 1600, 2600, 4200, 6800, 10900, 17700, 28700, 46400, 75000, 121400, 196400, 317800} 80 for i := range res0 { 81 require.Equal(t, resMinus2[i], correctResMinus2[i]) 82 } 83 } 84 85 func TestRoundUint64(t *testing.T) { 86 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} 87 res := make([]uint64, len(nums)) 88 res0 := roundUint64(nums, res, 0) 89 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} 90 for i := range res0 { 91 require.Equal(t, correctRes0[i], res0[i]) 92 } 93 resMinus1 := roundUint64(nums, res, -1) 94 correctResMinus1 := []uint64{0, 0, 0, 10, 10, 10, 20, 30, 60, 90, 140, 230, 380, 610, 990, 1600, 2580, 4180, 6770, 10950, 17710, 28660, 46370, 75030, 121390, 196420, 317810} 95 for i := range res0 { 96 require.Equal(t, correctResMinus1[i], resMinus1[i]) 97 } 98 resMinus2 := roundUint64(nums, res, -2) 99 correctResMinus2 := []uint64{0, 0, 0, 0, 0, 0, 0, 0, 100, 100, 100, 200, 400, 600, 1000, 1600, 2600, 4200, 6800, 10900, 17700, 28700, 46400, 75000, 121400, 196400, 317800} 100 for i := range res0 { 101 require.Equal(t, correctResMinus2[i], resMinus2[i]) 102 } 103 } 104 105 func TestRoundInt8(t *testing.T) { 106 nums := []int8{1, 2, 3, 5, 8, 13, 21, 34, 55, 89, -1, -2, -3, -5, -8, -13, -21, -34, -55, -89} 107 res := make([]int8, len(nums)) 108 res0 := roundInt8(nums, res, 0) 109 correctRes0 := []int8{1, 2, 3, 5, 8, 13, 21, 34, 55, 89, -1, -2, -3, -5, -8, -13, -21, -34, -55, -89} 110 for i := range res0 { 111 require.Equal(t, correctRes0[i], res0[i]) 112 } 113 resMinus1 := roundInt8(nums, res, -1) 114 correctResMinus1 := []int8{0, 0, 0, 10, 10, 10, 20, 30, 60, 90, 0, 0, 0, -10, -10, -10, -20, -30, -60, -90} 115 for i := range res0 { 116 require.Equal(t, correctResMinus1[i], resMinus1[i]) 117 } 118 } 119 120 func TestRoundInt16(t *testing.T) { 121 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} 122 res := make([]int16, len(nums)) 123 res0 := roundInt16(nums, res, 0) 124 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} 125 for i := range res0 { 126 require.Equal(t, correctRes0[i], res0[i]) 127 } 128 resMinus1 := roundInt16(nums, res, -1) 129 correctResMinus1 := []int16{0, 0, 0, 10, 10, 10, 20, 30, 60, 90, 140, 230, 380, 610, 990, 1600, 2580, 4180, 0, 0, 0, -10, -10, -10, -20, -30, -60, -90, -140, -230, -380, -610, -990, -1600, -2580, -4180} 130 for i := range res0 { 131 require.Equal(t, correctResMinus1[i], resMinus1[i]) 132 } 133 } 134 135 func TestRoundInt32(t *testing.T) { 136 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, 32768} 137 res := make([]int32, len(nums)) 138 res0 := roundInt32(nums, res, 0) 139 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, 32768} 140 for i := range res0 { 141 require.Equal(t, correctRes0[i], res0[i]) 142 } 143 resMinus1 := roundInt32(nums, res, -1) 144 correctResMinus1 := []int32{0, 0, 0, 10, 10, 10, 20, 30, 60, 90, 140, 230, 380, 610, 990, 1600, 2580, 4180, 0, 0, 0, -10, -10, -10, -20, -30, -60, -90, -140, -230, -380, -610, -990, -1600, -2580, -4180, 32770} 145 for i := range res0 { 146 require.Equal(t, correctResMinus1[i], resMinus1[i]) 147 } 148 } 149 150 func TestRoundInt64(t *testing.T) { 151 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, 32768, 1234567} 152 res := make([]int32, len(nums)) 153 res0 := roundInt32(nums, res, 0) 154 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, 32768, 1234567} 155 for i := range res0 { 156 require.Equal(t, correctRes0[i], res0[i]) 157 } 158 resMinus1 := roundInt32(nums, res, -1) 159 correctResMinus1 := []int32{0, 0, 0, 10, 10, 10, 20, 30, 60, 90, 140, 230, 380, 610, 990, 1600, 2580, 4180, 0, 0, 0, -10, -10, -10, -20, -30, -60, -90, -140, -230, -380, -610, -990, -1600, -2580, -4180, 32770, 1234570} 160 for i := range res0 { 161 require.Equal(t, correctResMinus1[i], resMinus1[i]) 162 } 163 } 164 165 const tolerance = .00001 166 167 func floatCompare(x, y float64) bool { 168 diff := math.Abs(x - y) 169 mean := math.Abs(x + y) 170 if math.IsNaN(diff / mean) { 171 return true 172 } 173 return (diff / mean) < tolerance 174 } 175 176 func TestRoundFloat32(t *testing.T) { 177 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} 178 res := make([]float32, len(nums)) 179 res0 := roundFloat32(nums, res, 0) 180 correctRes0 := []float32{2, -2, 2, -2, 1, 12, 123, 1234, 12346, 1235, -1, -12, -123, -1234, -12346} 181 for i := range nums { 182 assert.True(t, floatCompare(float64(correctRes0[i]), float64(res0[i]))) 183 } 184 resMinus1 := roundFloat32(nums, res, -1) 185 correctResMinus1 := []float32{0, 0, 0, 0, 0, 10, 120, 1230, 12350, 1230, 0, -10, -120, -1230, -12350} 186 for i := range nums { 187 assert.True(t, floatCompare(float64(correctResMinus1[i]), float64(resMinus1[i]))) 188 } 189 res1 := roundFloat32(nums, res, 1) 190 correctRes1 := []float32{1.5, -1.5, 2.5, -2.5, 1.2, 12.3, 123.4, 1234.5, 12345.6, 1234.6, -1.2, -12.3, -123.4, -1234.5, -12345.6} 191 for i := range res1 { 192 assert.True(t, floatCompare(float64(correctRes1[i]), float64(res1[i]))) 193 } 194 } 195 196 func TestRoundFloat64(t *testing.T) { 197 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} 198 res := make([]float64, len(nums)) 199 res0 := roundFloat64(nums, res, 0) 200 correctRes0 := []float64{2, -2, 2, -2, 1, 12, 123, 1234, 12346, 1235, -1, -12, -123, -1234, -12346} 201 for i := range nums { 202 assert.True(t, floatCompare(correctRes0[i], res0[i])) 203 } 204 resMinus1 := roundFloat64(nums, res, -1) 205 correctResMinus1 := []float64{0, 0, 0, 0, 0, 10, 120, 1230, 12350, 1230, 0, -10, -120, -1230, -12350} 206 for i := range nums { 207 assert.True(t, floatCompare(correctResMinus1[i], resMinus1[i])) 208 } 209 nums = []float64{1.5, -1.5, 2.5, -2.5, 1.23, 12.34, 123.45, 1234.56, 123.456, 1234.567, -1.2, -12.3, -1234, -123.45, -12345.6} 210 res1 := roundFloat64(nums, res, 1) 211 correctRes1 := []float64{1.5, -1.5, 2.5, -2.5, 1.2, 12.3, 123.4, 1234.6, 123.5, 1234.6, -1.2, -12.3, -1234, -123.4, -12345.6} 212 for i := range nums { 213 assert.True(t, floatCompare(correctRes1[i], res1[i])) 214 } 215 }