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  }