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  }