github.com/apache/arrow/go/v16@v16.1.0/arrow/array/binarybuilder_test.go (about) 1 // Licensed to the Apache Software Foundation (ASF) under one 2 // or more contributor license agreements. See the NOTICE file 3 // distributed with this work for additional information 4 // regarding copyright ownership. The ASF licenses this file 5 // to you under the Apache License, Version 2.0 (the 6 // "License"); you may not use this file except in compliance 7 // with the License. You may obtain a copy of the License at 8 // 9 // http://www.apache.org/licenses/LICENSE-2.0 10 // 11 // Unless required by applicable law or agreed to in writing, software 12 // distributed under the License is distributed on an "AS IS" BASIS, 13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 // See the License for the specific language governing permissions and 15 // limitations under the License. 16 17 package array_test 18 19 import ( 20 "bytes" 21 "testing" 22 23 "github.com/apache/arrow/go/v16/arrow" 24 "github.com/apache/arrow/go/v16/arrow/array" 25 "github.com/apache/arrow/go/v16/arrow/memory" 26 "github.com/stretchr/testify/assert" 27 ) 28 29 func TestBinaryBuilder(t *testing.T) { 30 mem := memory.NewCheckedAllocator(memory.NewGoAllocator()) 31 defer mem.AssertSize(t, 0) 32 33 ab := array.NewBinaryBuilder(mem, arrow.BinaryTypes.Binary) 34 35 exp := [][]byte{[]byte("foo"), []byte("bar"), nil, []byte("sydney"), []byte("cameron")} 36 for _, v := range exp { 37 if v == nil { 38 ab.AppendNull() 39 } else { 40 ab.Append(v) 41 } 42 } 43 44 assert.Equal(t, len(exp), ab.Len(), "unexpected Len()") 45 assert.Equal(t, 1, ab.NullN(), "unexpected NullN()") 46 47 for i, v := range exp { 48 if v == nil { 49 v = []byte{} 50 } 51 assert.Equal(t, v, ab.Value(i), "unexpected BinaryArrayBuilder.Value(%d)", i) 52 } 53 // Zm9v is foo in base64 54 assert.NoError(t, ab.AppendValueFromString("Zm9v")) 55 56 ar := ab.NewBinaryArray() 57 assert.Equal(t, "Zm9v", ar.ValueStr(5)) 58 59 ab.Release() 60 ar.Release() 61 62 // check state of builder after NewBinaryArray 63 assert.Zero(t, ab.Len(), "unexpected ArrayBuilder.Len(), NewBinaryArray did not reset state") 64 assert.Zero(t, ab.Cap(), "unexpected ArrayBuilder.Cap(), NewBinaryArray did not reset state") 65 assert.Zero(t, ab.NullN(), "unexpected ArrayBuilder.NullN(), NewBinaryArray did not reset state") 66 } 67 68 func TestBinaryBuilder_ReserveData(t *testing.T) { 69 mem := memory.NewCheckedAllocator(memory.NewGoAllocator()) 70 defer mem.AssertSize(t, 0) 71 72 ab := array.NewBinaryBuilder(mem, arrow.BinaryTypes.Binary) 73 74 // call ReserveData and ensure the capacity doesn't change 75 // when appending entries until that count. 76 ab.ReserveData(256) 77 expCap := ab.DataCap() 78 for i := 0; i < 256/8; i++ { 79 ab.Append(bytes.Repeat([]byte("a"), 8)) 80 } 81 assert.Equal(t, expCap, ab.DataCap(), "unexpected BinaryArrayBuilder.DataCap()") 82 83 ar := ab.NewBinaryArray() 84 ab.Release() 85 ar.Release() 86 87 // check state of builder after NewBinaryArray 88 assert.Zero(t, ab.Len(), "unexpected ArrayBuilder.Len(), NewBinaryArray did not reset state") 89 assert.Zero(t, ab.Cap(), "unexpected ArrayBuilder.Cap(), NewBinaryArray did not reset state") 90 assert.Zero(t, ab.NullN(), "unexpected ArrayBuilder.NullN(), NewBinaryArray did not reset state") 91 } 92 93 func TestBinaryBuilderLarge(t *testing.T) { 94 mem := memory.NewCheckedAllocator(memory.NewGoAllocator()) 95 defer mem.AssertSize(t, 0) 96 97 ab := array.NewBinaryBuilder(mem, arrow.BinaryTypes.LargeBinary) 98 99 exp := [][]byte{[]byte("foo"), []byte("bar"), nil, []byte("sydney"), []byte("cameron")} 100 for _, v := range exp { 101 if v == nil { 102 ab.AppendNull() 103 } else { 104 ab.Append(v) 105 } 106 } 107 108 assert.Equal(t, len(exp), ab.Len(), "unexpected Len()") 109 assert.Equal(t, 1, ab.NullN(), "unexpected NullN()") 110 111 for i, v := range exp { 112 if v == nil { 113 v = []byte{} 114 } 115 assert.Equal(t, v, ab.Value(i), "unexpected BinaryArrayBuilder.Value(%d)", i) 116 } 117 118 ar := ab.NewLargeBinaryArray() 119 ab.Release() 120 ar.Release() 121 122 // check state of builder after NewBinaryArray 123 assert.Zero(t, ab.Len(), "unexpected ArrayBuilder.Len(), NewBinaryArray did not reset state") 124 assert.Zero(t, ab.Cap(), "unexpected ArrayBuilder.Cap(), NewBinaryArray did not reset state") 125 assert.Zero(t, ab.NullN(), "unexpected ArrayBuilder.NullN(), NewBinaryArray did not reset state") 126 } 127 128 func TestBinaryBuilderLarge_ReserveData(t *testing.T) { 129 mem := memory.NewCheckedAllocator(memory.NewGoAllocator()) 130 defer mem.AssertSize(t, 0) 131 132 ab := array.NewBinaryBuilder(mem, arrow.BinaryTypes.LargeBinary) 133 134 // call ReserveData and ensure the capacity doesn't change 135 // when appending entries until that count. 136 ab.ReserveData(256) 137 expCap := ab.DataCap() 138 for i := 0; i < 256/8; i++ { 139 ab.Append(bytes.Repeat([]byte("a"), 8)) 140 } 141 assert.Equal(t, expCap, ab.DataCap(), "unexpected BinaryArrayBuilder.DataCap()") 142 143 ar := ab.NewLargeBinaryArray() 144 ab.Release() 145 ar.Release() 146 147 // check state of builder after NewBinaryArray 148 assert.Zero(t, ab.Len(), "unexpected ArrayBuilder.Len(), NewBinaryArray did not reset state") 149 assert.Zero(t, ab.Cap(), "unexpected ArrayBuilder.Cap(), NewBinaryArray did not reset state") 150 assert.Zero(t, ab.NullN(), "unexpected ArrayBuilder.NullN(), NewBinaryArray did not reset state") 151 }