// Code generated by type_traits_numeric.gen_test.go.tmpl. DO NOT EDIT.

// 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_test

import (
	"reflect"
	"testing"

	"github.com/apache/arrow/go/arrow"
)

func TestInt64Traits(t *testing.T) {
	const N = 10
	b1 := arrow.Int64Traits.CastToBytes([]int64{
		0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
	})

	b2 := make([]byte, arrow.Int64Traits.BytesRequired(N))
	for i := 0; i < N; i++ {
		beg := i * arrow.Int64SizeBytes
		end := (i + 1) * arrow.Int64SizeBytes
		arrow.Int64Traits.PutValue(b2[beg:end], int64(i))
	}

	if !reflect.DeepEqual(b1, b2) {
		v1 := arrow.Int64Traits.CastFromBytes(b1)
		v2 := arrow.Int64Traits.CastFromBytes(b2)
		t.Fatalf("invalid values:\nb1=%v\nb2=%v\nv1=%v\nv2=%v\n", b1, b2, v1, v2)
	}

	v1 := arrow.Int64Traits.CastFromBytes(b1)
	for i, v := range v1 {
		if got, want := v, int64(i); got != want {
			t.Fatalf("invalid value[%d]. got=%v, want=%v", i, got, want)
		}
	}

	v2 := make([]int64, N)
	arrow.Int64Traits.Copy(v2, v1)

	if !reflect.DeepEqual(v1, v2) {
		t.Fatalf("invalid values:\nv1=%v\nv2=%v\n", v1, v2)
	}
}

func TestUint64Traits(t *testing.T) {
	const N = 10
	b1 := arrow.Uint64Traits.CastToBytes([]uint64{
		0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
	})

	b2 := make([]byte, arrow.Uint64Traits.BytesRequired(N))
	for i := 0; i < N; i++ {
		beg := i * arrow.Uint64SizeBytes
		end := (i + 1) * arrow.Uint64SizeBytes
		arrow.Uint64Traits.PutValue(b2[beg:end], uint64(i))
	}

	if !reflect.DeepEqual(b1, b2) {
		v1 := arrow.Uint64Traits.CastFromBytes(b1)
		v2 := arrow.Uint64Traits.CastFromBytes(b2)
		t.Fatalf("invalid values:\nb1=%v\nb2=%v\nv1=%v\nv2=%v\n", b1, b2, v1, v2)
	}

	v1 := arrow.Uint64Traits.CastFromBytes(b1)
	for i, v := range v1 {
		if got, want := v, uint64(i); got != want {
			t.Fatalf("invalid value[%d]. got=%v, want=%v", i, got, want)
		}
	}

	v2 := make([]uint64, N)
	arrow.Uint64Traits.Copy(v2, v1)

	if !reflect.DeepEqual(v1, v2) {
		t.Fatalf("invalid values:\nv1=%v\nv2=%v\n", v1, v2)
	}
}

func TestFloat64Traits(t *testing.T) {
	const N = 10
	b1 := arrow.Float64Traits.CastToBytes([]float64{
		0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
	})

	b2 := make([]byte, arrow.Float64Traits.BytesRequired(N))
	for i := 0; i < N; i++ {
		beg := i * arrow.Float64SizeBytes
		end := (i + 1) * arrow.Float64SizeBytes
		arrow.Float64Traits.PutValue(b2[beg:end], float64(i))
	}

	if !reflect.DeepEqual(b1, b2) {
		v1 := arrow.Float64Traits.CastFromBytes(b1)
		v2 := arrow.Float64Traits.CastFromBytes(b2)
		t.Fatalf("invalid values:\nb1=%v\nb2=%v\nv1=%v\nv2=%v\n", b1, b2, v1, v2)
	}

	v1 := arrow.Float64Traits.CastFromBytes(b1)
	for i, v := range v1 {
		if got, want := v, float64(i); got != want {
			t.Fatalf("invalid value[%d]. got=%v, want=%v", i, got, want)
		}
	}

	v2 := make([]float64, N)
	arrow.Float64Traits.Copy(v2, v1)

	if !reflect.DeepEqual(v1, v2) {
		t.Fatalf("invalid values:\nv1=%v\nv2=%v\n", v1, v2)
	}
}

func TestInt32Traits(t *testing.T) {
	const N = 10
	b1 := arrow.Int32Traits.CastToBytes([]int32{
		0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
	})

	b2 := make([]byte, arrow.Int32Traits.BytesRequired(N))
	for i := 0; i < N; i++ {
		beg := i * arrow.Int32SizeBytes
		end := (i + 1) * arrow.Int32SizeBytes
		arrow.Int32Traits.PutValue(b2[beg:end], int32(i))
	}

	if !reflect.DeepEqual(b1, b2) {
		v1 := arrow.Int32Traits.CastFromBytes(b1)
		v2 := arrow.Int32Traits.CastFromBytes(b2)
		t.Fatalf("invalid values:\nb1=%v\nb2=%v\nv1=%v\nv2=%v\n", b1, b2, v1, v2)
	}

	v1 := arrow.Int32Traits.CastFromBytes(b1)
	for i, v := range v1 {
		if got, want := v, int32(i); got != want {
			t.Fatalf("invalid value[%d]. got=%v, want=%v", i, got, want)
		}
	}

	v2 := make([]int32, N)
	arrow.Int32Traits.Copy(v2, v1)

	if !reflect.DeepEqual(v1, v2) {
		t.Fatalf("invalid values:\nv1=%v\nv2=%v\n", v1, v2)
	}
}

func TestUint32Traits(t *testing.T) {
	const N = 10
	b1 := arrow.Uint32Traits.CastToBytes([]uint32{
		0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
	})

	b2 := make([]byte, arrow.Uint32Traits.BytesRequired(N))
	for i := 0; i < N; i++ {
		beg := i * arrow.Uint32SizeBytes
		end := (i + 1) * arrow.Uint32SizeBytes
		arrow.Uint32Traits.PutValue(b2[beg:end], uint32(i))
	}

	if !reflect.DeepEqual(b1, b2) {
		v1 := arrow.Uint32Traits.CastFromBytes(b1)
		v2 := arrow.Uint32Traits.CastFromBytes(b2)
		t.Fatalf("invalid values:\nb1=%v\nb2=%v\nv1=%v\nv2=%v\n", b1, b2, v1, v2)
	}

	v1 := arrow.Uint32Traits.CastFromBytes(b1)
	for i, v := range v1 {
		if got, want := v, uint32(i); got != want {
			t.Fatalf("invalid value[%d]. got=%v, want=%v", i, got, want)
		}
	}

	v2 := make([]uint32, N)
	arrow.Uint32Traits.Copy(v2, v1)

	if !reflect.DeepEqual(v1, v2) {
		t.Fatalf("invalid values:\nv1=%v\nv2=%v\n", v1, v2)
	}
}

func TestFloat32Traits(t *testing.T) {
	const N = 10
	b1 := arrow.Float32Traits.CastToBytes([]float32{
		0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
	})

	b2 := make([]byte, arrow.Float32Traits.BytesRequired(N))
	for i := 0; i < N; i++ {
		beg := i * arrow.Float32SizeBytes
		end := (i + 1) * arrow.Float32SizeBytes
		arrow.Float32Traits.PutValue(b2[beg:end], float32(i))
	}

	if !reflect.DeepEqual(b1, b2) {
		v1 := arrow.Float32Traits.CastFromBytes(b1)
		v2 := arrow.Float32Traits.CastFromBytes(b2)
		t.Fatalf("invalid values:\nb1=%v\nb2=%v\nv1=%v\nv2=%v\n", b1, b2, v1, v2)
	}

	v1 := arrow.Float32Traits.CastFromBytes(b1)
	for i, v := range v1 {
		if got, want := v, float32(i); got != want {
			t.Fatalf("invalid value[%d]. got=%v, want=%v", i, got, want)
		}
	}

	v2 := make([]float32, N)
	arrow.Float32Traits.Copy(v2, v1)

	if !reflect.DeepEqual(v1, v2) {
		t.Fatalf("invalid values:\nv1=%v\nv2=%v\n", v1, v2)
	}
}

func TestInt16Traits(t *testing.T) {
	const N = 10
	b1 := arrow.Int16Traits.CastToBytes([]int16{
		0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
	})

	b2 := make([]byte, arrow.Int16Traits.BytesRequired(N))
	for i := 0; i < N; i++ {
		beg := i * arrow.Int16SizeBytes
		end := (i + 1) * arrow.Int16SizeBytes
		arrow.Int16Traits.PutValue(b2[beg:end], int16(i))
	}

	if !reflect.DeepEqual(b1, b2) {
		v1 := arrow.Int16Traits.CastFromBytes(b1)
		v2 := arrow.Int16Traits.CastFromBytes(b2)
		t.Fatalf("invalid values:\nb1=%v\nb2=%v\nv1=%v\nv2=%v\n", b1, b2, v1, v2)
	}

	v1 := arrow.Int16Traits.CastFromBytes(b1)
	for i, v := range v1 {
		if got, want := v, int16(i); got != want {
			t.Fatalf("invalid value[%d]. got=%v, want=%v", i, got, want)
		}
	}

	v2 := make([]int16, N)
	arrow.Int16Traits.Copy(v2, v1)

	if !reflect.DeepEqual(v1, v2) {
		t.Fatalf("invalid values:\nv1=%v\nv2=%v\n", v1, v2)
	}
}

func TestUint16Traits(t *testing.T) {
	const N = 10
	b1 := arrow.Uint16Traits.CastToBytes([]uint16{
		0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
	})

	b2 := make([]byte, arrow.Uint16Traits.BytesRequired(N))
	for i := 0; i < N; i++ {
		beg := i * arrow.Uint16SizeBytes
		end := (i + 1) * arrow.Uint16SizeBytes
		arrow.Uint16Traits.PutValue(b2[beg:end], uint16(i))
	}

	if !reflect.DeepEqual(b1, b2) {
		v1 := arrow.Uint16Traits.CastFromBytes(b1)
		v2 := arrow.Uint16Traits.CastFromBytes(b2)
		t.Fatalf("invalid values:\nb1=%v\nb2=%v\nv1=%v\nv2=%v\n", b1, b2, v1, v2)
	}

	v1 := arrow.Uint16Traits.CastFromBytes(b1)
	for i, v := range v1 {
		if got, want := v, uint16(i); got != want {
			t.Fatalf("invalid value[%d]. got=%v, want=%v", i, got, want)
		}
	}

	v2 := make([]uint16, N)
	arrow.Uint16Traits.Copy(v2, v1)

	if !reflect.DeepEqual(v1, v2) {
		t.Fatalf("invalid values:\nv1=%v\nv2=%v\n", v1, v2)
	}
}

func TestInt8Traits(t *testing.T) {
	const N = 10
	b1 := arrow.Int8Traits.CastToBytes([]int8{
		0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
	})

	b2 := make([]byte, arrow.Int8Traits.BytesRequired(N))
	for i := 0; i < N; i++ {
		beg := i * arrow.Int8SizeBytes
		end := (i + 1) * arrow.Int8SizeBytes
		arrow.Int8Traits.PutValue(b2[beg:end], int8(i))
	}

	if !reflect.DeepEqual(b1, b2) {
		v1 := arrow.Int8Traits.CastFromBytes(b1)
		v2 := arrow.Int8Traits.CastFromBytes(b2)
		t.Fatalf("invalid values:\nb1=%v\nb2=%v\nv1=%v\nv2=%v\n", b1, b2, v1, v2)
	}

	v1 := arrow.Int8Traits.CastFromBytes(b1)
	for i, v := range v1 {
		if got, want := v, int8(i); got != want {
			t.Fatalf("invalid value[%d]. got=%v, want=%v", i, got, want)
		}
	}

	v2 := make([]int8, N)
	arrow.Int8Traits.Copy(v2, v1)

	if !reflect.DeepEqual(v1, v2) {
		t.Fatalf("invalid values:\nv1=%v\nv2=%v\n", v1, v2)
	}
}

func TestUint8Traits(t *testing.T) {
	const N = 10
	b1 := arrow.Uint8Traits.CastToBytes([]uint8{
		0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
	})

	b2 := make([]byte, arrow.Uint8Traits.BytesRequired(N))
	for i := 0; i < N; i++ {
		beg := i * arrow.Uint8SizeBytes
		end := (i + 1) * arrow.Uint8SizeBytes
		arrow.Uint8Traits.PutValue(b2[beg:end], uint8(i))
	}

	if !reflect.DeepEqual(b1, b2) {
		v1 := arrow.Uint8Traits.CastFromBytes(b1)
		v2 := arrow.Uint8Traits.CastFromBytes(b2)
		t.Fatalf("invalid values:\nb1=%v\nb2=%v\nv1=%v\nv2=%v\n", b1, b2, v1, v2)
	}

	v1 := arrow.Uint8Traits.CastFromBytes(b1)
	for i, v := range v1 {
		if got, want := v, uint8(i); got != want {
			t.Fatalf("invalid value[%d]. got=%v, want=%v", i, got, want)
		}
	}

	v2 := make([]uint8, N)
	arrow.Uint8Traits.Copy(v2, v1)

	if !reflect.DeepEqual(v1, v2) {
		t.Fatalf("invalid values:\nv1=%v\nv2=%v\n", v1, v2)
	}
}

func TestTimestampTraits(t *testing.T) {
	const N = 10
	b1 := arrow.TimestampTraits.CastToBytes([]arrow.Timestamp{
		0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
	})

	b2 := make([]byte, arrow.TimestampTraits.BytesRequired(N))
	for i := 0; i < N; i++ {
		beg := i * arrow.TimestampSizeBytes
		end := (i + 1) * arrow.TimestampSizeBytes
		arrow.TimestampTraits.PutValue(b2[beg:end], arrow.Timestamp(i))
	}

	if !reflect.DeepEqual(b1, b2) {
		v1 := arrow.TimestampTraits.CastFromBytes(b1)
		v2 := arrow.TimestampTraits.CastFromBytes(b2)
		t.Fatalf("invalid values:\nb1=%v\nb2=%v\nv1=%v\nv2=%v\n", b1, b2, v1, v2)
	}

	v1 := arrow.TimestampTraits.CastFromBytes(b1)
	for i, v := range v1 {
		if got, want := v, arrow.Timestamp(i); got != want {
			t.Fatalf("invalid value[%d]. got=%v, want=%v", i, got, want)
		}
	}

	v2 := make([]arrow.Timestamp, N)
	arrow.TimestampTraits.Copy(v2, v1)

	if !reflect.DeepEqual(v1, v2) {
		t.Fatalf("invalid values:\nv1=%v\nv2=%v\n", v1, v2)
	}
}

func TestTime32Traits(t *testing.T) {
	const N = 10
	b1 := arrow.Time32Traits.CastToBytes([]arrow.Time32{
		0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
	})

	b2 := make([]byte, arrow.Time32Traits.BytesRequired(N))
	for i := 0; i < N; i++ {
		beg := i * arrow.Time32SizeBytes
		end := (i + 1) * arrow.Time32SizeBytes
		arrow.Time32Traits.PutValue(b2[beg:end], arrow.Time32(i))
	}

	if !reflect.DeepEqual(b1, b2) {
		v1 := arrow.Time32Traits.CastFromBytes(b1)
		v2 := arrow.Time32Traits.CastFromBytes(b2)
		t.Fatalf("invalid values:\nb1=%v\nb2=%v\nv1=%v\nv2=%v\n", b1, b2, v1, v2)
	}

	v1 := arrow.Time32Traits.CastFromBytes(b1)
	for i, v := range v1 {
		if got, want := v, arrow.Time32(i); got != want {
			t.Fatalf("invalid value[%d]. got=%v, want=%v", i, got, want)
		}
	}

	v2 := make([]arrow.Time32, N)
	arrow.Time32Traits.Copy(v2, v1)

	if !reflect.DeepEqual(v1, v2) {
		t.Fatalf("invalid values:\nv1=%v\nv2=%v\n", v1, v2)
	}
}

func TestTime64Traits(t *testing.T) {
	const N = 10
	b1 := arrow.Time64Traits.CastToBytes([]arrow.Time64{
		0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
	})

	b2 := make([]byte, arrow.Time64Traits.BytesRequired(N))
	for i := 0; i < N; i++ {
		beg := i * arrow.Time64SizeBytes
		end := (i + 1) * arrow.Time64SizeBytes
		arrow.Time64Traits.PutValue(b2[beg:end], arrow.Time64(i))
	}

	if !reflect.DeepEqual(b1, b2) {
		v1 := arrow.Time64Traits.CastFromBytes(b1)
		v2 := arrow.Time64Traits.CastFromBytes(b2)
		t.Fatalf("invalid values:\nb1=%v\nb2=%v\nv1=%v\nv2=%v\n", b1, b2, v1, v2)
	}

	v1 := arrow.Time64Traits.CastFromBytes(b1)
	for i, v := range v1 {
		if got, want := v, arrow.Time64(i); got != want {
			t.Fatalf("invalid value[%d]. got=%v, want=%v", i, got, want)
		}
	}

	v2 := make([]arrow.Time64, N)
	arrow.Time64Traits.Copy(v2, v1)

	if !reflect.DeepEqual(v1, v2) {
		t.Fatalf("invalid values:\nv1=%v\nv2=%v\n", v1, v2)
	}
}

func TestDate32Traits(t *testing.T) {
	const N = 10
	b1 := arrow.Date32Traits.CastToBytes([]arrow.Date32{
		0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
	})

	b2 := make([]byte, arrow.Date32Traits.BytesRequired(N))
	for i := 0; i < N; i++ {
		beg := i * arrow.Date32SizeBytes
		end := (i + 1) * arrow.Date32SizeBytes
		arrow.Date32Traits.PutValue(b2[beg:end], arrow.Date32(i))
	}

	if !reflect.DeepEqual(b1, b2) {
		v1 := arrow.Date32Traits.CastFromBytes(b1)
		v2 := arrow.Date32Traits.CastFromBytes(b2)
		t.Fatalf("invalid values:\nb1=%v\nb2=%v\nv1=%v\nv2=%v\n", b1, b2, v1, v2)
	}

	v1 := arrow.Date32Traits.CastFromBytes(b1)
	for i, v := range v1 {
		if got, want := v, arrow.Date32(i); got != want {
			t.Fatalf("invalid value[%d]. got=%v, want=%v", i, got, want)
		}
	}

	v2 := make([]arrow.Date32, N)
	arrow.Date32Traits.Copy(v2, v1)

	if !reflect.DeepEqual(v1, v2) {
		t.Fatalf("invalid values:\nv1=%v\nv2=%v\n", v1, v2)
	}
}

func TestDate64Traits(t *testing.T) {
	const N = 10
	b1 := arrow.Date64Traits.CastToBytes([]arrow.Date64{
		0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
	})

	b2 := make([]byte, arrow.Date64Traits.BytesRequired(N))
	for i := 0; i < N; i++ {
		beg := i * arrow.Date64SizeBytes
		end := (i + 1) * arrow.Date64SizeBytes
		arrow.Date64Traits.PutValue(b2[beg:end], arrow.Date64(i))
	}

	if !reflect.DeepEqual(b1, b2) {
		v1 := arrow.Date64Traits.CastFromBytes(b1)
		v2 := arrow.Date64Traits.CastFromBytes(b2)
		t.Fatalf("invalid values:\nb1=%v\nb2=%v\nv1=%v\nv2=%v\n", b1, b2, v1, v2)
	}

	v1 := arrow.Date64Traits.CastFromBytes(b1)
	for i, v := range v1 {
		if got, want := v, arrow.Date64(i); got != want {
			t.Fatalf("invalid value[%d]. got=%v, want=%v", i, got, want)
		}
	}

	v2 := make([]arrow.Date64, N)
	arrow.Date64Traits.Copy(v2, v1)

	if !reflect.DeepEqual(v1, v2) {
		t.Fatalf("invalid values:\nv1=%v\nv2=%v\n", v1, v2)
	}
}

func TestDurationTraits(t *testing.T) {
	const N = 10
	b1 := arrow.DurationTraits.CastToBytes([]arrow.Duration{
		0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
	})

	b2 := make([]byte, arrow.DurationTraits.BytesRequired(N))
	for i := 0; i < N; i++ {
		beg := i * arrow.DurationSizeBytes
		end := (i + 1) * arrow.DurationSizeBytes
		arrow.DurationTraits.PutValue(b2[beg:end], arrow.Duration(i))
	}

	if !reflect.DeepEqual(b1, b2) {
		v1 := arrow.DurationTraits.CastFromBytes(b1)
		v2 := arrow.DurationTraits.CastFromBytes(b2)
		t.Fatalf("invalid values:\nb1=%v\nb2=%v\nv1=%v\nv2=%v\n", b1, b2, v1, v2)
	}

	v1 := arrow.DurationTraits.CastFromBytes(b1)
	for i, v := range v1 {
		if got, want := v, arrow.Duration(i); got != want {
			t.Fatalf("invalid value[%d]. got=%v, want=%v", i, got, want)
		}
	}

	v2 := make([]arrow.Duration, N)
	arrow.DurationTraits.Copy(v2, v1)

	if !reflect.DeepEqual(v1, v2) {
		t.Fatalf("invalid values:\nv1=%v\nv2=%v\n", v1, v2)
	}
}
