github.com/attic-labs/noms@v0.0.0-20210827224422-e5fa29d95e8b/samples/go/nomdex/query_range_test.go (about)

     1  // Copyright 2016 Attic Labs, Inc. All rights reserved.
     2  // Licensed under the Apache License, version 2.0:
     3  // http://www.apache.org/licenses/LICENSE-2.0
     4  
     5  package main
     6  
     7  import (
     8  	"testing"
     9  
    10  	"github.com/attic-labs/noms/go/types"
    11  	"github.com/stretchr/testify/assert"
    12  )
    13  
    14  const nilHolder = -1000000
    15  
    16  var (
    17  	r1  = qr(2, true, 5, true)
    18  	r2  = qr(0, true, 8, true)
    19  	r3  = qr(0, true, 3, true)
    20  	r4  = qr(3, true, 8, true)
    21  	r5  = qr(0, true, 1, true)
    22  	r6  = qr(6, true, 10, true)
    23  	r7  = qr(nilHolder, true, 10, true)
    24  	r8  = qr(3, true, nilHolder, true)
    25  	r10 = qr(2, true, 5, false)
    26  	r11 = qr(5, true, 10, true)
    27  )
    28  
    29  func newBound(i int, include bool, infinity int) bound {
    30  	var v types.Value
    31  	if i != nilHolder {
    32  		v = types.Number(i)
    33  	}
    34  	return bound{value: v, include: include, infinity: int8(infinity)}
    35  }
    36  
    37  func qr(lower int, lowerIncl bool, upper int, upperIncl bool) queryRange {
    38  	lowerInf := 0
    39  	if lower == nilHolder {
    40  		lowerInf = -1
    41  	}
    42  	upperInf := 0
    43  	if upper == nilHolder {
    44  		upperInf = 1
    45  	}
    46  	return queryRange{newBound(lower, lowerIncl, lowerInf), newBound(upper, upperIncl, upperInf)}
    47  }
    48  
    49  func TestRangeIntersects(t *testing.T) {
    50  	assert := assert.New(t)
    51  
    52  	assert.True(r1.intersects(r2))
    53  	assert.True(r1.intersects(r3))
    54  	assert.True(r1.intersects(r4))
    55  	assert.True(r2.intersects(r1))
    56  	assert.True(r1.intersects(r7))
    57  	assert.True(r1.intersects(r8))
    58  	assert.True(r3.intersects(r4))
    59  	assert.True(r3.intersects(r4))
    60  
    61  	assert.False(r1.intersects(r5))
    62  	assert.False(r1.intersects(r6))
    63  	assert.False(r10.intersects(r11))
    64  }
    65  
    66  func TestRangeAnd(t *testing.T) {
    67  	assert := assert.New(t)
    68  
    69  	assert.Empty(r1.and(r5))
    70  	assert.Empty(r1.and(r6))
    71  
    72  	assert.Equal(r1, r1.and(r2)[0])
    73  	assert.Equal(r1, r2.and(r1)[0])
    74  
    75  	expected := qr(3, true, 5, true)
    76  	assert.Equal(expected, r1.and(r4)[0])
    77  }
    78  
    79  func TestRangeOr(t *testing.T) {
    80  	assert := assert.New(t)
    81  
    82  	assert.Equal(r2, r1.or(r2)[0])
    83  
    84  	expected := qr(0, true, 5, true)
    85  	assert.Equal(expected, r1.or(r3)[0])
    86  
    87  	expectedSlice := queryRangeSlice{r5, r1}
    88  	assert.Equal(expectedSlice, r1.or(r5))
    89  	assert.Equal(expectedSlice, r5.or(r1))
    90  }
    91  
    92  func TestIsLessThan(t *testing.T) {
    93  	assert := assert.New(t)
    94  
    95  	assert.True(newBound(1, true, 0).isLessThanOrEqual(newBound(2, true, 0)))
    96  	assert.False(newBound(2, true, 0).isLessThanOrEqual(newBound(1, true, 0)))
    97  	assert.True(newBound(1, true, 0).isLessThanOrEqual(newBound(1, true, 0)))
    98  
    99  	assert.True(newBound(1, false, 0).isLessThanOrEqual(newBound(2, false, 0)))
   100  	assert.False(newBound(2, false, 0).isLessThanOrEqual(newBound(1, false, 0)))
   101  	assert.True(newBound(1, false, 0).isLessThanOrEqual(newBound(1, false, 0)))
   102  
   103  	assert.False(newBound(1, true, 0).isLessThanOrEqual(newBound(1, false, 0)))
   104  	assert.True(newBound(1, false, 0).isLessThanOrEqual(newBound(1, true, 0)))
   105  
   106  	assert.True(newBound(nilHolder, true, -1).isLessThanOrEqual(newBound(1, true, 0)))
   107  	assert.False(newBound(1, false, 0).isLessThanOrEqual(newBound(nilHolder, true, -1)))
   108  }
   109  
   110  func TestIsGreaterThan(t *testing.T) {
   111  	assert := assert.New(t)
   112  
   113  	assert.True(newBound(2, true, 0).isGreaterThanOrEqual(newBound(1, true, 0)))
   114  	assert.False(newBound(1, true, 0).isGreaterThanOrEqual(newBound(2, true, 0)))
   115  	assert.True(newBound(1, true, 0).isGreaterThanOrEqual(newBound(1, true, 0)))
   116  
   117  	assert.True(newBound(2, false, 0).isGreaterThanOrEqual(newBound(1, false, 0)))
   118  	assert.False(newBound(1, false, 0).isGreaterThanOrEqual(newBound(2, false, 0)))
   119  	assert.True(newBound(1, false, 0).isGreaterThanOrEqual(newBound(1, false, 0)))
   120  
   121  	assert.True(newBound(1, true, 0).isGreaterThanOrEqual(newBound(1, false, 0)))
   122  	assert.False(newBound(1, false, 0).isGreaterThanOrEqual(newBound(2, true, 0)))
   123  
   124  	assert.True(newBound(nilHolder, true, 1).isGreaterThanOrEqual(newBound(1, true, 0)))
   125  	assert.False(newBound(1, true, 0).isGreaterThanOrEqual(newBound(nilHolder, true, 1)))
   126  }
   127  
   128  func TestMinValue(t *testing.T) {
   129  	assert := assert.New(t)
   130  	ve1 := newBound(5, false, 0)
   131  	ve2 := newBound(5, true, 0)
   132  	ve3 := newBound(nilHolder, true, -1)
   133  	ve4 := newBound(nilHolder, true, 1)
   134  
   135  	assert.Equal(ve1, ve1.minValue(ve2))
   136  	assert.Equal(ve3, ve1.minValue(ve3))
   137  	assert.Equal(ve1, ve1.minValue(ve4))
   138  }
   139  
   140  func TestMaxValue(t *testing.T) {
   141  	assert := assert.New(t)
   142  	ve1 := newBound(5, false, 0)
   143  	ve2 := newBound(5, true, 0)
   144  	ve3 := newBound(nilHolder, true, -1)
   145  	ve4 := newBound(nilHolder, true, 1)
   146  
   147  	assert.Equal(ve2, ve1.maxValue(ve2))
   148  	assert.Equal(ve1, ve1.maxValue(ve3))
   149  	assert.Equal(ve4, ve1.maxValue(ve4))
   150  }