blob: 4aa5eb6b4d7ed81ad3774502a337509f1e0f8df3 [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.Runtime.InteropServices;
using Apache.Arrow.C;
using Apache.Arrow.Types;
using Xunit;
namespace Apache.Arrow.Tests
{
public class CDataSchemaTest
{
[Fact]
public unsafe void InitializeZeroed()
{
CArrowSchema* cSchema = CArrowSchema.Create();
Assert.True(cSchema->format == null);
Assert.True(cSchema->name == null);
Assert.True(cSchema->metadata == null);
Assert.Equal(0, cSchema->flags);
Assert.Equal(0, cSchema->n_children);
Assert.True(cSchema->children == null);
Assert.True(cSchema->dictionary == null);
Assert.True(cSchema->release == default);
Assert.True(cSchema->private_data == null);
CArrowSchema.Free(cSchema);
}
[Fact]
public unsafe void FlagsSet()
{
// Non-nullable field
{
var nonNullField = new Field("non_null", Int32Type.Default, false);
CArrowSchema* cSchema = CArrowSchema.Create();
CArrowSchemaExporter.ExportField(nonNullField, cSchema);
Assert.False(cSchema->GetFlag(CArrowSchema.ArrowFlagNullable));
CArrowSchema.Free(cSchema);
}
// Nullable field
{
var nullableField = new Field("nullable", Int32Type.Default, true);
CArrowSchema* cSchema = CArrowSchema.Create();
CArrowSchemaExporter.ExportField(nullableField, cSchema);
Assert.True(cSchema->GetFlag(CArrowSchema.ArrowFlagNullable));
CArrowSchema.Free(cSchema);
}
// dictionary ordered
{
var orderedDictionary = new DictionaryType(Int32Type.Default, StringType.Default, true);
CArrowSchema* cSchema = CArrowSchema.Create();
CArrowSchemaExporter.ExportType(orderedDictionary, cSchema);
Assert.True(cSchema->GetFlag(CArrowSchema.ArrowFlagDictionaryOrdered));
CArrowSchema.Free(cSchema);
}
// dictionary unordered
{
var unorderedDictionary = new DictionaryType(Int32Type.Default, StringType.Default, false);
CArrowSchema* cSchema = CArrowSchema.Create();
CArrowSchemaExporter.ExportType(unorderedDictionary, cSchema);
Assert.False(cSchema->GetFlag(CArrowSchema.ArrowFlagDictionaryOrdered));
CArrowSchema.Free(cSchema);
}
}
[Fact]
public unsafe void CallsReleaseForValid()
{
CArrowSchema* cSchema = CArrowSchema.Create();
CArrowSchemaExporter.ExportType(Int32Type.Default, cSchema);
Assert.False(cSchema->release == default);
CArrowSchemaImporter.ImportType(cSchema);
Assert.True(cSchema->release == default);
CArrowSchema.Free(cSchema);
}
#if NET5_0_OR_GREATER // can't round-trip marshaled delegate
[Fact]
public unsafe void CallsReleaseForInvalid()
{
// Make sure we call release callback, even if the imported schema
// is invalid.
CArrowSchema* cSchema = CArrowSchema.Create();
bool wasCalled = false;
var releaseCallback = (CArrowSchema* cSchema) =>
{
wasCalled = true;
cSchema->release = default;
};
cSchema->release = (delegate* unmanaged<CArrowSchema*, void>)Marshal.GetFunctionPointerForDelegate(
releaseCallback);
Assert.Throws<NullReferenceException>(() =>
{
CArrowSchemaImporter.ImportType(cSchema);
});
Assert.True(wasCalled);
CArrowSchema.Free(cSchema);
GC.KeepAlive(releaseCallback);
}
#endif
}
}