blob: 2691e20d442ba63eaff5ceaffe851567dad9c014 [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.
using System;
using System.Collections.Generic;
using System.Linq;
using Apache.Arrow.Types;
using Xunit;
using Xunit.Sdk;
namespace Apache.Arrow.Tests
{
public class SchemaBuilderTests
{
public class Build
{
[Fact]
public void FieldsAreNullableByDefault()
{
var schema = new Schema.Builder()
.Field(f => f.Name("f0").DataType(Int32Type.Default))
.Build();
Assert.True(schema.FieldsList[0].IsNullable);
}
[Fact]
public void FieldsHaveNullTypeByDefault()
{
var schema = new Schema.Builder()
.Field(f => f.Name("f0"))
.Build();
Assert.Equal(typeof(NullType), schema.FieldsList[0].DataType.GetType());
}
[Fact]
public void FieldNameIsRequired()
{
Assert.Throws<ArgumentNullException>(() =>
{
var schema = new Schema.Builder()
.Field(f => f.DataType(Int32Type.Default))
.Build();
});
}
[Fact]
public void FieldNamesAreCaseSensitive()
{
var schema = new Schema.Builder()
.Field(f => f.Name("f0").DataType(Int32Type.Default))
.Field(f => f.Name("F0").DataType(Int8Type.Default))
.Build();
Assert.Equal(2, schema.FieldsList.Count);
}
[Fact]
public void FieldNamesCanBeTheSame()
{
var schema = new Schema.Builder()
.Field(f => f.Name("f0").DataType(Int32Type.Default))
.Field(f => f.Name("f0").DataType(Int8Type.Default))
.Build();
Assert.Equal(2, schema.FieldsList.Count);
}
[Fact]
public void GetFieldIndex()
{
var schema = new Schema.Builder()
.Field(f => f.Name("f0").DataType(Int32Type.Default))
.Field(f => f.Name("f1").DataType(Int8Type.Default))
.Build();
Assert.Equal(0, schema.GetFieldIndex("f0"));
Assert.Equal(1, schema.GetFieldIndex("f1"));
}
[Fact]
public void GetFieldIndexIsCaseSensitive()
{
var schema = new Schema.Builder()
.Field(f => f.Name("f0").DataType(Int32Type.Default))
.Field(f => f.Name("F0").DataType(Int8Type.Default))
.Build();
Assert.Equal(0, schema.GetFieldIndex("f0"));
Assert.Equal(1, schema.GetFieldIndex("F0"));
}
[Fact]
public void GetFieldIndexGetsFirstMatch()
{
var schema = new Schema.Builder()
.Field(f => f.Name("f0").DataType(Int32Type.Default))
.Field(f => f.Name("f0").DataType(Int8Type.Default))
.Field(f => f.Name("f1").DataType(Int32Type.Default))
.Field(f => f.Name("f1").DataType(Int8Type.Default))
.Build();
Assert.Equal(0, schema.GetFieldIndex("f0"));
Assert.Equal(2, schema.GetFieldIndex("f1"));
}
[Fact]
public void GetFieldByName()
{
Field f0 = new Field.Builder().Name("f0").DataType(Int32Type.Default).Build();
Field f1 = new Field.Builder().Name("f1").DataType(Int8Type.Default).Build();
var schema = new Schema.Builder()
.Field(f0)
.Field(f1)
.Build();
Assert.Equal(f0, schema.GetFieldByName("f0"));
Assert.Equal(f1, schema.GetFieldByName("f1"));
}
[Fact]
public void GetFieldByNameIsCaseSensitive()
{
var f0 = new Field.Builder().Name("f0").DataType(Int32Type.Default).Build();
var f0Uppercase = new Field.Builder().Name("F0").DataType(Int8Type.Default).Build();
var schema = new Schema.Builder()
.Field(f0)
.Field(f0Uppercase)
.Build();
Assert.Equal(f0, schema.GetFieldByName("f0"));
Assert.Equal(f0Uppercase, schema.GetFieldByName("F0"));
}
[Fact]
public void GetFieldByNameGetsFirstMatch()
{
var f0First = new Field.Builder().Name("f0").DataType(Int32Type.Default).Build();
var f0Second = new Field.Builder().Name("f0").DataType(Int8Type.Default).Build();
var f1First = new Field.Builder().Name("f1").DataType(Int32Type.Default).Build();
var f1Second = new Field.Builder().Name("f1").DataType(Int8Type.Default).Build();
var schema = new Schema.Builder()
.Field(f0First)
.Field(f0Second)
.Field(f1First)
.Field(f1Second)
.Build();
Assert.Equal(f0First, schema.GetFieldByName("f0"));
Assert.Equal(f1First, schema.GetFieldByName("f1"));
}
[Fact]
public void GetFieldByNameReturnsNullWhenSchemaIsEmpty()
{
var schema = new Schema.Builder()
.Build();
Assert.Null(schema.GetFieldByName("f0"));
}
[Fact]
public void GetFieldByNameReturnsNullWhenFieldDoesNotExist()
{
var schema = new Schema.Builder()
.Field(f => f.Name("f0").DataType(Int32Type.Default))
.Build();
Assert.Null(schema.GetFieldByName("f1"));
}
[Fact]
public void SquareBracketOperatorWithStringReturnsGetFieldByName()
{
Field f0 = new Field.Builder().Name("f0").DataType(Int32Type.Default).Build();
Field f1 = new Field.Builder().Name("f1").DataType(Int8Type.Default).Build();
var schema = new Schema.Builder()
.Field(f0)
.Field(f1)
.Build();
Assert.Equal(schema.GetFieldByName("f0"), schema["f0"]);
Assert.Equal(schema.GetFieldByName("f1"), schema["f1"]);
}
[Fact]
public void SquareBracketOperatorWithIntReturnsGetFieldByIndex()
{
Field f0 = new Field.Builder().Name("f0").DataType(Int32Type.Default).Build();
Field f1 = new Field.Builder().Name("f1").DataType(Int8Type.Default).Build();
var schema = new Schema.Builder()
.Field(f0)
.Field(f1)
.Build();
Assert.Equal(schema.GetFieldByIndex(0), schema[0]);
Assert.Equal(schema.GetFieldByIndex(1), schema[1]);
}
[Fact]
public void MetadataConstruction()
{
var metadata0 = new Dictionary<string, string> { { "foo", "bar" }, { "bizz", "buzz" } };
var metadata1 = new Dictionary<string, string> { { "foo", "bar" } };
var metadata0Copy = new Dictionary<string, string>(metadata0);
var metadata1Copy = new Dictionary<string, string>(metadata1);
Field f0 = new Field.Builder().Name("f0").DataType(Int32Type.Default).Build();
Field f1 = new Field.Builder().Name("f1").DataType(UInt8Type.Default).Nullable(false).Build();
Field f2 = new Field.Builder().Name("f2").DataType(StringType.Default).Build();
Field f3 = new Field.Builder().Name("f2").DataType(StringType.Default).Metadata(metadata1Copy).Build();
var schema0 = new Schema.Builder()
.Field(f0)
.Field(f1)
.Field(f2)
.Metadata(metadata0)
.Build();
var schema1 = new Schema.Builder()
.Field(f0)
.Field(f1)
.Field(f2)
.Metadata(metadata1)
.Build();
var schema2 = new Schema.Builder()
.Field(f0)
.Field(f1)
.Field(f2)
.Metadata(metadata0Copy)
.Build();
var schema3 = new Schema.Builder()
.Field(f0)
.Field(f1)
.Field(f3)
.Metadata(metadata0Copy)
.Build();
Assert.True(metadata0.Keys.SequenceEqual(schema0.Metadata.Keys) && metadata0.Values.SequenceEqual(schema0.Metadata.Values));
Assert.True(metadata1.Keys.SequenceEqual(schema1.Metadata.Keys) && metadata1.Values.SequenceEqual(schema1.Metadata.Values));
Assert.True(metadata0.Keys.SequenceEqual(schema2.Metadata.Keys) && metadata0.Values.SequenceEqual(schema2.Metadata.Values));
SchemaComparer.Compare(schema0, schema2);
Assert.Throws<EqualException>(() => SchemaComparer.Compare(schema0, schema1));
Assert.Throws<EqualException>(() => SchemaComparer.Compare(schema2, schema1));
Assert.Throws<EqualException>(() => SchemaComparer.Compare(schema2, schema3));
}
[Theory]
[MemberData(nameof(SampleSchema1))]
public void FieldsHaveExpectedValues(string name, IArrowType type, bool nullable)
{
var schema = new Schema.Builder()
.Field(f => f.Name(name).DataType(type).Nullable(nullable))
.Build();
var field = schema.FieldsList[0];
Assert.Equal(name, field.Name);
Assert.Equal(type.Name, field.DataType.Name);
Assert.Equal(nullable, field.IsNullable);
}
public static IEnumerable<object[]> SampleSchema1()
{
yield return new object[] { "f0", Int32Type.Default, true };
yield return new object[] { "f1", DoubleType.Default, true };
yield return new object[] { "f2", Int64Type.Default, false };
}
}
}
}