github.com/m3db/m3@v1.5.1-0.20231129193456-75a402aa583b/src/m3ninx/index/segment/fst/encoding/encoding_test.go (about)

     1  // Copyright (c) 2018 Uber Technologies, Inc.
     2  //
     3  // Permission is hereby granted, free of charge, to any person obtaining a copy
     4  // of this software and associated documentation files (the "Software"), to deal
     5  // in the Software without restriction, including without limitation the rights
     6  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     7  // copies of the Software, and to permit persons to whom the Software is
     8  // furnished to do so, subject to the following conditions:
     9  //
    10  // The above copyright notice and this permission notice shall be included in
    11  // all copies or substantial portions of the Software.
    12  //
    13  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    14  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    15  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    16  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    17  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    18  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    19  // THE SOFTWARE.
    20  
    21  package encoding
    22  
    23  import (
    24  	"fmt"
    25  	"math"
    26  	"testing"
    27  
    28  	"github.com/stretchr/testify/require"
    29  )
    30  
    31  func TestUint32(t *testing.T) {
    32  	tests := []struct {
    33  		x uint32
    34  	}{
    35  		{
    36  			x: 0,
    37  		},
    38  		{
    39  			x: 42,
    40  		},
    41  		{
    42  			x: math.MaxUint32,
    43  		},
    44  	}
    45  
    46  	for _, test := range tests {
    47  		name := fmt.Sprintf("Encode and Decode %d", test.x)
    48  		t.Run(name, func(t *testing.T) {
    49  			enc := NewEncoder(1024)
    50  			n := enc.PutUint32(test.x)
    51  			require.Equal(t, 4, n)
    52  
    53  			dec := NewDecoder(enc.Bytes())
    54  			actual, err := dec.Uint32()
    55  
    56  			require.NoError(t, err)
    57  			require.Equal(t, test.x, actual)
    58  		})
    59  	}
    60  }
    61  
    62  func TestUint64(t *testing.T) {
    63  	tests := []struct {
    64  		x uint64
    65  	}{
    66  		{
    67  			x: 0,
    68  		},
    69  		{
    70  			x: 42,
    71  		},
    72  		{
    73  			x: math.MaxUint64,
    74  		},
    75  	}
    76  
    77  	for _, test := range tests {
    78  		name := fmt.Sprintf("Encode and Decode %d", test.x)
    79  		t.Run(name, func(t *testing.T) {
    80  			enc := NewEncoder(1024)
    81  			n := enc.PutUint64(test.x)
    82  			require.Equal(t, 8, n)
    83  
    84  			dec := NewDecoder(enc.Bytes())
    85  			actual, err := dec.Uint64()
    86  
    87  			require.NoError(t, err)
    88  			require.Equal(t, test.x, actual)
    89  		})
    90  	}
    91  }
    92  
    93  func TestUvarint(t *testing.T) {
    94  	tests := []struct {
    95  		x uint64
    96  		n int
    97  	}{
    98  		{
    99  			x: 0,
   100  			n: 1,
   101  		},
   102  		{
   103  			x: 42,
   104  			n: 1,
   105  		},
   106  		{
   107  			x: math.MaxUint64,
   108  			n: 10,
   109  		},
   110  	}
   111  
   112  	for _, test := range tests {
   113  		name := fmt.Sprintf("Encode and Decode %d", test.n)
   114  		t.Run(name, func(t *testing.T) {
   115  			enc := NewEncoder(1024)
   116  			n := enc.PutUvarint(test.x)
   117  			require.Equal(t, test.n, n)
   118  
   119  			dec := NewDecoder(enc.Bytes())
   120  			actual, err := dec.Uvarint()
   121  
   122  			require.NoError(t, err)
   123  			require.Equal(t, test.x, actual)
   124  		})
   125  	}
   126  }
   127  
   128  func TestBytes(t *testing.T) {
   129  	tests := []struct {
   130  		name string
   131  		b    []byte
   132  		n    int
   133  	}{
   134  		{
   135  			name: "Encode and Decode Empty Byte Slice",
   136  			b:    []byte(""),
   137  			n:    1,
   138  		},
   139  		{
   140  			name: "Encode and Decode Non-Empty Byte Slice",
   141  			b:    []byte("foo bar baz"),
   142  			n:    12,
   143  		},
   144  	}
   145  
   146  	for _, test := range tests {
   147  		t.Run(test.name, func(t *testing.T) {
   148  			enc := NewEncoder(1024)
   149  			n := enc.PutBytes(test.b)
   150  			require.Equal(t, test.n, n)
   151  
   152  			dec := NewDecoder(enc.Bytes())
   153  			actual, err := dec.Bytes()
   154  
   155  			require.NoError(t, err)
   156  			require.Equal(t, test.b, actual)
   157  		})
   158  	}
   159  }
   160  
   161  func TestEncoderLen(t *testing.T) {
   162  	enc := NewEncoder(1024)
   163  
   164  	enc.PutUint32(42)
   165  	require.Equal(t, 4, enc.Len())
   166  
   167  	enc.PutUint64(42)
   168  	require.Equal(t, 4+8, enc.Len())
   169  
   170  	enc.PutUvarint(42)
   171  	require.Equal(t, 4+8+1, enc.Len())
   172  
   173  	enc.PutBytes([]byte("42"))
   174  	require.Equal(t, 4+8+1+3, enc.Len())
   175  }
   176  
   177  func TestEncoderReset(t *testing.T) {
   178  	enc := NewEncoder(1024)
   179  	enc.PutUint32(42)
   180  	enc.Reset()
   181  
   182  	b := enc.Bytes()
   183  	require.Equal(t, 0, len(b))
   184  }
   185  
   186  func TestDecoderReset(t *testing.T) {
   187  	enc := NewEncoder(1024)
   188  	enc.PutUint32(42)
   189  	b := enc.Bytes()
   190  
   191  	dec := NewDecoder(nil)
   192  	dec.Reset(b)
   193  
   194  	require.Equal(t, b, dec.buf)
   195  }