blob: 16c4daffbc6e7e0b21b5f8807218d0c547a5d5cb [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package arrow
import (
"testing"
)
func TestTypeEquals(t *testing.T) {
tests := []struct {
left, right DataType
want bool
checkMetadata bool
}{
{
nil, nil, false, false,
},
{
nil, PrimitiveTypes.Uint8, false, false,
},
{
PrimitiveTypes.Float32, nil, false, false,
},
{
PrimitiveTypes.Float64, PrimitiveTypes.Int32, false, false,
},
{
Null, Null, true, false,
},
{
&Time32Type{Unit: Second}, &Time32Type{Unit: Second}, true, false,
},
{
&Time32Type{Unit: Millisecond}, &Time32Type{Unit: Second}, false, false,
},
{
&Time64Type{Unit: Nanosecond}, &Time64Type{Unit: Nanosecond}, true, false,
},
{
&Time64Type{Unit: Nanosecond}, &Time64Type{Unit: Microsecond}, false, false,
},
{
&TimestampType{Unit: Second, TimeZone: "UTC"}, &TimestampType{Unit: Second, TimeZone: "UTC"}, true, false,
},
{
&TimestampType{Unit: Microsecond, TimeZone: "UTC"}, &TimestampType{Unit: Millisecond, TimeZone: "UTC"}, false, false,
},
{
&TimestampType{Unit: Second, TimeZone: "UTC"}, &TimestampType{Unit: Second, TimeZone: "CET"}, false, false,
},
{
&TimestampType{Unit: Second, TimeZone: "UTC"}, &TimestampType{Unit: Nanosecond, TimeZone: "CET"}, false, false,
},
{
&ListType{PrimitiveTypes.Uint64}, &ListType{PrimitiveTypes.Uint64}, true, false,
},
{
&ListType{PrimitiveTypes.Uint64}, &ListType{PrimitiveTypes.Uint32}, false, false,
},
{
&ListType{&Time32Type{Unit: Millisecond}}, &ListType{&Time32Type{Unit: Millisecond}}, true, false,
},
{
&ListType{&Time32Type{Unit: Millisecond}}, &ListType{&Time32Type{Unit: Second}}, false, false,
},
{
&ListType{&ListType{PrimitiveTypes.Uint16}}, &ListType{&ListType{PrimitiveTypes.Uint16}}, true, false,
},
{
&ListType{&ListType{PrimitiveTypes.Uint16}}, &ListType{&ListType{PrimitiveTypes.Uint8}}, false, false,
},
{
&ListType{&ListType{&ListType{PrimitiveTypes.Uint16}}}, &ListType{&ListType{PrimitiveTypes.Uint8}}, false, false,
},
{
&StructType{
fields: []Field{
Field{Name: "f1", Type: PrimitiveTypes.Uint16, Nullable: true},
},
index: map[string]int{"f1": 0},
},
&StructType{
fields: []Field{
Field{Name: "f1", Type: PrimitiveTypes.Uint32, Nullable: true},
},
index: map[string]int{"f1": 0},
},
false, true,
},
{
&StructType{
fields: []Field{
Field{Name: "f1", Type: PrimitiveTypes.Uint32, Nullable: false},
},
index: map[string]int{"f1": 0},
},
&StructType{
fields: []Field{
Field{Name: "f1", Type: PrimitiveTypes.Uint32, Nullable: true},
},
index: map[string]int{"f1": 0},
},
false, false,
},
{
&StructType{
fields: []Field{
Field{Name: "f0", Type: PrimitiveTypes.Uint32, Nullable: true},
},
index: map[string]int{"f0": 0},
},
&StructType{
fields: []Field{
Field{Name: "f1", Type: PrimitiveTypes.Uint32, Nullable: true},
},
index: map[string]int{"f1": 0},
},
false, false,
},
{
&StructType{
fields: []Field{
Field{Name: "f1", Type: PrimitiveTypes.Uint32, Nullable: true},
},
index: map[string]int{"f1": 0},
},
&StructType{
fields: []Field{
Field{Name: "f1", Type: PrimitiveTypes.Uint32, Nullable: true},
Field{Name: "f2", Type: PrimitiveTypes.Uint32, Nullable: true},
},
index: map[string]int{"f1": 0, "f2": 0},
},
false, true,
},
{
&StructType{
fields: []Field{
Field{Name: "f1", Type: PrimitiveTypes.Uint16, Nullable: true},
Field{Name: "f2", Type: PrimitiveTypes.Float32, Nullable: false},
},
index: map[string]int{"f1": 0, "f2": 1},
},
&StructType{
fields: []Field{
Field{Name: "f1", Type: PrimitiveTypes.Uint16, Nullable: true},
Field{Name: "f2", Type: PrimitiveTypes.Float32, Nullable: false},
},
index: map[string]int{"f1": 0, "f2": 1},
},
true, false,
},
{
&StructType{
fields: []Field{
Field{Name: "f1", Type: PrimitiveTypes.Uint16, Nullable: true},
Field{Name: "f2", Type: PrimitiveTypes.Float32, Nullable: false},
},
index: map[string]int{"f1": 0, "f2": 1},
},
&StructType{
fields: []Field{
Field{Name: "f1", Type: PrimitiveTypes.Uint16, Nullable: true},
Field{Name: "f2", Type: PrimitiveTypes.Float32, Nullable: false},
},
index: map[string]int{"f1": 0, "f2": 1},
},
true, false,
},
{
&StructType{
fields: []Field{
Field{Name: "f1", Type: PrimitiveTypes.Uint16, Nullable: true},
Field{Name: "f2", Type: PrimitiveTypes.Float32, Nullable: false},
},
index: map[string]int{"f1": 0, "f2": 1},
meta: MetadataFrom(map[string]string{"k1": "v1"}),
},
&StructType{
fields: []Field{
Field{Name: "f1", Type: PrimitiveTypes.Uint16, Nullable: true},
Field{Name: "f2", Type: PrimitiveTypes.Float32, Nullable: false},
},
index: map[string]int{"f1": 0, "f2": 1},
meta: MetadataFrom(map[string]string{"k1": "v1"}),
},
true, true,
},
{
&StructType{
fields: []Field{
Field{Name: "f1", Type: PrimitiveTypes.Uint32, Nullable: true},
},
index: map[string]int{"f1": 0},
meta: MetadataFrom(map[string]string{"k1": "v1"}),
},
&StructType{
fields: []Field{
Field{Name: "f1", Type: PrimitiveTypes.Uint32, Nullable: true},
},
index: map[string]int{"f1": 0},
meta: MetadataFrom(map[string]string{"k1": "v2"}),
},
true, false,
},
{
&StructType{
fields: []Field{
Field{Name: "f1", Type: PrimitiveTypes.Uint16, Nullable: true, Metadata: MetadataFrom(map[string]string{"k1": "v1"})},
Field{Name: "f2", Type: PrimitiveTypes.Float32, Nullable: false},
},
index: map[string]int{"f1": 0, "f2": 1},
},
&StructType{
fields: []Field{
Field{Name: "f1", Type: PrimitiveTypes.Uint16, Nullable: true, Metadata: MetadataFrom(map[string]string{"k1": "v2"})},
Field{Name: "f2", Type: PrimitiveTypes.Float32, Nullable: false},
},
index: map[string]int{"f1": 0, "f2": 1},
},
false, true,
},
}
for _, test := range tests {
t.Run("", func(t *testing.T) {
var got bool
if test.checkMetadata {
got = TypeEquals(test.left, test.right, CheckMetadata())
} else {
got = TypeEquals(test.left, test.right)
}
if got != test.want {
t.Fatalf("TypeEquals(%v, %v, %v): got=%v, want=%v", test.left, test.right, test.checkMetadata, got, test.want)
}
})
}
}