// Copyright (c) Umbraco. // See LICENSE for more details. using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data; using System.Data.Common; using NUnit.Framework; using Umbraco.Cms.Persistence.SqlServer.Services; namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Persistence; /// /// Unit tests for . /// /// /// Borrowed from Microsoft: /// See: https://blogs.msdn.microsoft.com/anthonybloesch/2013/01/23/bulk-loading-data-with-idatareader-and-sqlbulkcopy/ /// [TestFixture] public class BulkDataReaderTests { /// /// The schema name. /// private const string TestSchemaName = "TestSchema"; /// /// The table name. /// private const string TestTableName = "TestTable"; /// /// The test UDT schema name. /// private const string TestUdtSchemaName = "UdtSchema"; /// /// The test UDT name. /// private const string TestUdtName = "TestUdt"; /// /// The test XML schema collection database name. /// private const string TestXmlSchemaCollectionDatabaseName = "XmlDatabase"; /// /// The test XML schema collection owning schema name. /// private const string TestXmlSchemaCollectionSchemaName = "XmlSchema"; /// /// The test XML schema collection name. /// private const string TestXmlSchemaCollectionName = "Xml"; /// /// Test that is functioning correctly. /// /// [Test] public void ColumnMappingsTest() { using (var testReader = new BulkDataReaderSubclass()) { var columnMappings = testReader.ColumnMappings; Assert.IsTrue(columnMappings.Count > 0); Assert.AreEqual(columnMappings.Count, testReader.FieldCount); foreach (var columnMapping in columnMappings) { Assert.AreEqual(columnMapping.SourceColumn, columnMapping.DestinationColumn); } } } /// /// Test that is functioning correctly. /// /// [Test] public void GetDataTypeNameTest() { using (var testReader = new BulkDataReaderSubclass()) { Assert.IsTrue(testReader.FieldCount > 0); for (var currentColumn = 0; currentColumn < testReader.FieldCount; currentColumn++) { var schemaTable = testReader.GetSchemaTable(); Assert.IsNotNull(schemaTable); Assert.AreEqual( testReader.GetDataTypeName(currentColumn), ((Type)schemaTable.Rows[currentColumn][SchemaTableColumn.DataType]).Name); } } } /// /// Test that is functioning correctly. /// /// [Test] public void GetFieldTypeTest() { using (var testReader = new BulkDataReaderSubclass()) { Assert.IsTrue(testReader.FieldCount > 0); for (var currentColumn = 0; currentColumn < testReader.FieldCount; currentColumn++) { var schemaTable = testReader.GetSchemaTable(); Assert.IsNotNull(schemaTable); Assert.AreEqual( testReader.GetFieldType(currentColumn), schemaTable.Rows[currentColumn][SchemaTableColumn.DataType]); } } } /// /// Test that is functioning correctly. /// /// [Test] public void GetOrdinalTest() { using (var testReader = new BulkDataReaderSubclass()) { Assert.IsTrue(testReader.FieldCount > 0); for (var currentColumn = 0; currentColumn < testReader.FieldCount; currentColumn++) { Assert.AreEqual(testReader.GetOrdinal(testReader.GetName(currentColumn)), currentColumn); Assert.AreEqual( testReader.GetOrdinal(testReader.GetName(currentColumn).ToUpperInvariant()), currentColumn); } } } /// /// Test that functions correctly. /// /// /// uses to test legal schema combinations. /// /// [Test] public void GetSchemaTableTest() { using (var testReader = new BulkDataReaderSubclass()) { var schemaTable = testReader.GetSchemaTable(); Assert.IsNotNull(schemaTable); Assert.IsTrue(schemaTable.Rows.Count > 0); Assert.AreEqual(schemaTable.Rows.Count, BulkDataReaderSubclass.ExpectedResultSet.Count); } } /// /// Test that /// /// throws a for null column names. /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowNullColumnNameTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = null; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.BigInt; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for empty column names. /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowEmptyColumnNameTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = string.Empty; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.BigInt; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for nonpositive column sizes. /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowNonpositiveColumnSizeTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = 0; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.NVarChar; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for nonpositive numeric precision. /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowNonpositiveNumericPrecisionTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = 0; testReader.NumericScale = 0; testReader.ProviderType = SqlDbType.Decimal; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for negative numeric scale. /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowNegativeNumericScaleTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = 5; testReader.NumericScale = -1; testReader.ProviderType = SqlDbType.Decimal; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for binary column without a column size. /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowBinaryWithoutSizeTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.Binary; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for binary column with a column size that is too large (>8000). /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowBinaryWithTooLargeSizeTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = 8001; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.Binary; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for char column without a column size. /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowCharWithoutSizeTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.Char; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for char column with a column size that is too large (>8000). /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowCharWithTooLargeSizeTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = 8001; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.Char; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for decimal column without a column precision. /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowDecimalWithoutPrecisionTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = 5; testReader.ProviderType = SqlDbType.Decimal; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for decimal column without a column scale. /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowDecimalWithoutScaleTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = 20; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.Decimal; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for decimal column with a column precision that is too large /// (>38). /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowDecimalWithTooLargePrecisionTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = 39; testReader.NumericScale = 5; testReader.ProviderType = SqlDbType.Decimal; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for decimal column with a column scale that is larger than the /// column precision. /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowDecimalWithTooLargeScaleTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = 20; testReader.NumericScale = 21; testReader.ProviderType = SqlDbType.Decimal; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for datetime2 column with a column size that has a precision /// that is too large (>7). /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowDateTime2WithTooLargePrecisionTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = 8; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.DateTime2; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for datetimeoffset column with a column size that has a /// precision that is too large (>7). /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowDateTimeOffsetWithTooLargePrecisionTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = 8; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.DateTimeOffset; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for nchar column without a precision. /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowFloatWithoutPrecisionTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.Float; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for float column with a column precision that is too large /// (>53). /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowFloatWithTooLargePrecisionTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = 54; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.Float; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for nchar column without a column size. /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowNCharWithoutSizeTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.NChar; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for nchar column with a column size that is too large (>4000). /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowNCharWithTooLargeSizeTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = 4001; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.NChar; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for nvarchar column with a column size that is too large /// (>4000). /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowNVarCharWithTooLargeSizeTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = 4001; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.NVarChar; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for time column with a column precision that is too large (>7). /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowTimeWithTooLargePrecisionTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = 8; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.Time; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for missing UDT schema name. /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowUdtMissingSchemaNameTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.Udt; testReader.UdtSchema = null; testReader.UdtType = "Type"; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for empty UDT schema name. /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowUdtEmptySchemaNameTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.Udt; testReader.UdtSchema = string.Empty; testReader.UdtType = "Type"; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for missing UDT name. /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowUdtMissingNameTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.Udt; testReader.UdtSchema = "Schema"; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for empty UDT name. /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowUdtEmptyNameTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.Udt; testReader.UdtSchema = "Schema"; testReader.UdtType = string.Empty; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for varbinary column with a column size that is too large /// (>8000). /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowVarBinaryWithTooLargeSizeTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = 8001; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.VarBinary; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for varchar column with a column size that is too large /// (>8000). /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowVarCharWithTooLargeSizeTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = 8001; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.VarChar; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for null xml collection name but with a name for the database. /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowXmlNullNameWithDatabaseNameTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.Xml; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = "Database"; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for null xml collection name. /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowXmlNullNameWithOwningSchemaNameTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.Xml; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = "Schema"; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for empty xml collection database name. /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowXmlEmptyDatabaseNameTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.Xml; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = string.Empty; testReader.XmlSchemaCollectionOwningSchema = "Schema"; testReader.XmlSchemaCollectionName = "Xml"; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for empty xml collection owning schema name. /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowXmlEmptyOwningSchemaNameTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.Xml; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = "Database"; testReader.XmlSchemaCollectionOwningSchema = string.Empty; testReader.XmlSchemaCollectionName = "Xml"; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for empty xml collection name. /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowXmlEmptyNameTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.Xml; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = "Database"; testReader.XmlSchemaCollectionOwningSchema = "Schema"; testReader.XmlSchemaCollectionName = string.Empty; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for a structured column (which is illegal). /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowStructuredTypeTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.Structured; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws a for a timestamp column (which is illegal). /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowTimestampTypeTest() { using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.ProviderType = SqlDbType.Timestamp; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; Assert.Throws(() => { var unused = testReader.GetSchemaTable(); }); } } /// /// Test that /// /// throws an for a column with an unallowed optional column set. /// /// /// Uses to test the illegal schema combination. /// /// [Test] public void AddSchemaTableRowUnallowedOptionalColumnTest() { // Column size set using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = 5; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; foreach (var dbtype in new List { SqlDbType.BigInt, SqlDbType.Bit, SqlDbType.Date, SqlDbType.DateTime, SqlDbType.DateTime2, SqlDbType.DateTimeOffset, SqlDbType.Image, SqlDbType.Int, SqlDbType.Money, SqlDbType.Real, SqlDbType.SmallDateTime, SqlDbType.SmallInt, SqlDbType.SmallMoney, SqlDbType.Structured, SqlDbType.Text, SqlDbType.Time, SqlDbType.Timestamp, SqlDbType.TinyInt, SqlDbType.Udt, SqlDbType.UniqueIdentifier, SqlDbType.Variant, SqlDbType.Xml, }) { testReader.ProviderType = dbtype; try { var unused = testReader.GetSchemaTable(); Assert.Fail(); } catch (ArgumentException) { } } } // Numeric precision set using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = 5; testReader.NumericScale = null; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; foreach (var dbtype in new List { SqlDbType.BigInt, SqlDbType.Binary, SqlDbType.Bit, SqlDbType.Char, SqlDbType.Date, SqlDbType.DateTime, SqlDbType.Image, SqlDbType.Int, SqlDbType.Money, SqlDbType.NChar, SqlDbType.NText, SqlDbType.NVarChar, SqlDbType.Real, SqlDbType.SmallDateTime, SqlDbType.SmallInt, SqlDbType.SmallMoney, SqlDbType.Structured, SqlDbType.Text, SqlDbType.Timestamp, SqlDbType.TinyInt, SqlDbType.Udt, SqlDbType.UniqueIdentifier, SqlDbType.VarBinary, SqlDbType.VarChar, SqlDbType.Variant, SqlDbType.Xml, }) { testReader.ProviderType = dbtype; try { var unused = testReader.GetSchemaTable(); Assert.Fail(); } catch (ArgumentException) { } } } // Numeric scale set using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = 5; testReader.NumericScale = 3; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; foreach (var dbtype in new List { SqlDbType.BigInt, SqlDbType.Binary, SqlDbType.Bit, SqlDbType.Char, SqlDbType.Date, SqlDbType.DateTime, SqlDbType.DateTime2, SqlDbType.DateTimeOffset, SqlDbType.Image, SqlDbType.Int, SqlDbType.Money, SqlDbType.NChar, SqlDbType.NText, SqlDbType.NVarChar, SqlDbType.Real, SqlDbType.SmallDateTime, SqlDbType.SmallInt, SqlDbType.SmallMoney, SqlDbType.Structured, SqlDbType.Text, SqlDbType.Time, SqlDbType.Timestamp, SqlDbType.TinyInt, SqlDbType.Udt, SqlDbType.UniqueIdentifier, SqlDbType.VarBinary, SqlDbType.VarChar, SqlDbType.Variant, SqlDbType.Xml, }) { testReader.ProviderType = dbtype; try { var unused = testReader.GetSchemaTable(); Assert.Fail(); } catch (ArgumentException) { } } } // Numeric scale set using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = 5; testReader.NumericScale = 3; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; foreach (var dbtype in new List { SqlDbType.BigInt, SqlDbType.Binary, SqlDbType.Bit, SqlDbType.Char, SqlDbType.Date, SqlDbType.DateTime, SqlDbType.DateTime2, SqlDbType.DateTimeOffset, SqlDbType.Image, SqlDbType.Int, SqlDbType.Money, SqlDbType.NChar, SqlDbType.NText, SqlDbType.NVarChar, SqlDbType.Real, SqlDbType.SmallDateTime, SqlDbType.SmallInt, SqlDbType.SmallMoney, SqlDbType.Structured, SqlDbType.Text, SqlDbType.Time, SqlDbType.Timestamp, SqlDbType.TinyInt, SqlDbType.Udt, SqlDbType.UniqueIdentifier, SqlDbType.VarBinary, SqlDbType.VarChar, SqlDbType.Variant, SqlDbType.Xml, }) { testReader.ProviderType = dbtype; try { var unused = testReader.GetSchemaTable(); Assert.Fail(); } catch (ArgumentException) { } } } // UDT type name set using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.UdtSchema = null; testReader.UdtType = "Type"; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; foreach (var dbtype in new List { SqlDbType.BigInt, SqlDbType.Binary, SqlDbType.Bit, SqlDbType.Char, SqlDbType.Date, SqlDbType.DateTime, SqlDbType.DateTime2, SqlDbType.DateTimeOffset, SqlDbType.Decimal, SqlDbType.Float, SqlDbType.Image, SqlDbType.Int, SqlDbType.Money, SqlDbType.NChar, SqlDbType.NText, SqlDbType.NVarChar, SqlDbType.Real, SqlDbType.SmallDateTime, SqlDbType.SmallInt, SqlDbType.SmallMoney, SqlDbType.Structured, SqlDbType.Text, SqlDbType.Time, SqlDbType.Timestamp, SqlDbType.TinyInt, SqlDbType.UniqueIdentifier, SqlDbType.VarBinary, SqlDbType.VarChar, SqlDbType.Variant, SqlDbType.Xml, }) { testReader.ProviderType = dbtype; try { var unused = testReader.GetSchemaTable(); Assert.Fail(); } catch (ArgumentException) { } } } // UDT schema and type name set using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.UdtSchema = "Schema"; testReader.UdtType = "Type"; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = null; foreach (var dbtype in new List { SqlDbType.BigInt, SqlDbType.Binary, SqlDbType.Bit, SqlDbType.Char, SqlDbType.Date, SqlDbType.DateTime, SqlDbType.DateTime2, SqlDbType.DateTimeOffset, SqlDbType.Decimal, SqlDbType.Float, SqlDbType.Image, SqlDbType.Int, SqlDbType.Money, SqlDbType.NChar, SqlDbType.NText, SqlDbType.NVarChar, SqlDbType.Real, SqlDbType.SmallDateTime, SqlDbType.SmallInt, SqlDbType.SmallMoney, SqlDbType.Structured, SqlDbType.Text, SqlDbType.Time, SqlDbType.Timestamp, SqlDbType.TinyInt, SqlDbType.UniqueIdentifier, SqlDbType.VarBinary, SqlDbType.VarChar, SqlDbType.Variant, SqlDbType.Xml, }) { testReader.ProviderType = dbtype; try { var unused = testReader.GetSchemaTable(); Assert.Fail(); } catch (ArgumentException) { } } } // XML type name set using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = null; testReader.XmlSchemaCollectionName = "Name"; foreach (var dbtype in new List { SqlDbType.BigInt, SqlDbType.Binary, SqlDbType.Bit, SqlDbType.Char, SqlDbType.Date, SqlDbType.DateTime, SqlDbType.DateTime2, SqlDbType.DateTimeOffset, SqlDbType.Decimal, SqlDbType.Float, SqlDbType.Image, SqlDbType.Int, SqlDbType.Money, SqlDbType.NChar, SqlDbType.NText, SqlDbType.NVarChar, SqlDbType.Real, SqlDbType.SmallDateTime, SqlDbType.SmallInt, SqlDbType.SmallMoney, SqlDbType.Structured, SqlDbType.Text, SqlDbType.Time, SqlDbType.Timestamp, SqlDbType.TinyInt, SqlDbType.UniqueIdentifier, SqlDbType.VarBinary, SqlDbType.VarChar, SqlDbType.Variant, SqlDbType.Udt, }) { testReader.ProviderType = dbtype; try { var unused = testReader.GetSchemaTable(); Assert.Fail(); } catch (ArgumentException) { } } } // XML owning schema and type name set using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = null; testReader.XmlSchemaCollectionOwningSchema = "Schema"; testReader.XmlSchemaCollectionName = "Name"; foreach (var dbtype in new List { SqlDbType.BigInt, SqlDbType.Binary, SqlDbType.Bit, SqlDbType.Char, SqlDbType.Date, SqlDbType.DateTime, SqlDbType.DateTime2, SqlDbType.DateTimeOffset, SqlDbType.Decimal, SqlDbType.Float, SqlDbType.Image, SqlDbType.Int, SqlDbType.Money, SqlDbType.NChar, SqlDbType.NText, SqlDbType.NVarChar, SqlDbType.Real, SqlDbType.SmallDateTime, SqlDbType.SmallInt, SqlDbType.SmallMoney, SqlDbType.Structured, SqlDbType.Text, SqlDbType.Time, SqlDbType.Timestamp, SqlDbType.TinyInt, SqlDbType.UniqueIdentifier, SqlDbType.VarBinary, SqlDbType.VarChar, SqlDbType.Variant, SqlDbType.Udt, }) { testReader.ProviderType = dbtype; try { var unused = testReader.GetSchemaTable(); Assert.Fail(); } catch (ArgumentException) { } } } // XML database, owning schema and type name set using (var testReader = new BulkDataReaderSchemaTest()) { testReader.AllowDBNull = false; testReader.ColumnName = "Name"; testReader.ColumnSize = null; testReader.IsKey = false; testReader.IsUnique = false; testReader.NumericPrecision = null; testReader.NumericScale = null; testReader.UdtSchema = null; testReader.UdtType = null; testReader.XmlSchemaCollectionDatabase = "Database"; testReader.XmlSchemaCollectionOwningSchema = "Schema"; testReader.XmlSchemaCollectionName = "Name"; foreach (var dbtype in new List { SqlDbType.BigInt, SqlDbType.Binary, SqlDbType.Bit, SqlDbType.Char, SqlDbType.Date, SqlDbType.DateTime, SqlDbType.DateTime2, SqlDbType.DateTimeOffset, SqlDbType.Decimal, SqlDbType.Float, SqlDbType.Image, SqlDbType.Int, SqlDbType.Money, SqlDbType.NChar, SqlDbType.NText, SqlDbType.NVarChar, SqlDbType.Real, SqlDbType.SmallDateTime, SqlDbType.SmallInt, SqlDbType.SmallMoney, SqlDbType.Structured, SqlDbType.Text, SqlDbType.Time, SqlDbType.Timestamp, SqlDbType.TinyInt, SqlDbType.UniqueIdentifier, SqlDbType.VarBinary, SqlDbType.VarChar, SqlDbType.Variant, SqlDbType.Udt, }) { testReader.ProviderType = dbtype; try { var unused = testReader.GetSchemaTable(); Assert.Fail(); } catch (ArgumentException) { } } } } /// /// Test that is functioning correctly. /// /// [Test] public void CloseTest() { var testReader = new BulkDataReaderSubclass(); testReader.Close(); Assert.IsTrue(testReader.IsClosed); } /// /// Test that is functioning correctly. /// /// /// Because nested row sets are not supported, this should always return 0; /// /// [Test] public void DepthTest() { using (var testReader = new BulkDataReaderSubclass()) { Assert.IsTrue(testReader.Read()); Assert.AreEqual(0, testReader.Depth); } } /// /// Test that is functioning correctly. /// /// /// Because nested row sets are not supported, this should always return null; /// /// [Test] public void GetDataTest() { using (var testReader = new BulkDataReaderSubclass()) { Assert.IsTrue(testReader.Read()); Assert.IsTrue(testReader.FieldCount > 0); Assert.IsNull(testReader.GetData(0)); } } /// /// Test and related functions. /// /// /// Uses to test legal schema combinations. /// [Test] public void GetValueTest() { using (var testReader = new BulkDataReaderSubclass()) { Assert.IsTrue(testReader.Read()); // this[int] for (var column = 0; column < BulkDataReaderSubclass.ExpectedResultSet.Count; column++) { Assert.AreEqual(testReader[column], BulkDataReaderSubclass.ExpectedResultSet[column]); } // this[string] for (var column = 0; column < BulkDataReaderSubclass.ExpectedResultSet.Count; column++) { Assert.AreEqual( testReader[testReader.GetName(column)], BulkDataReaderSubclass.ExpectedResultSet[column]); Assert.AreEqual( testReader[testReader.GetName(column).ToUpperInvariant()], BulkDataReaderSubclass.ExpectedResultSet[column]); } // GetValues { var values = new object[BulkDataReaderSubclass.ExpectedResultSet.Count]; var expectedValues = new object[BulkDataReaderSubclass.ExpectedResultSet.Count]; Assert.AreEqual(testReader.GetValues(values), values.Length); BulkDataReaderSubclass.ExpectedResultSet.CopyTo(expectedValues, 0); Assert.IsTrue(ArraysMatch(values, expectedValues)); } // Typed getters { var currentColumn = 0; Assert.AreEqual( testReader.GetInt64(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; { var expectedResult = (byte[])BulkDataReaderSubclass.ExpectedResultSet[currentColumn]; var expectedLength = expectedResult.Length; var buffer = new byte[expectedLength]; Assert.AreEqual(testReader.GetBytes(currentColumn, 0, buffer, 0, expectedLength), expectedLength); Assert.IsTrue(ArraysMatch(buffer, expectedResult)); } currentColumn++; Assert.AreEqual( testReader.GetBoolean(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.IsDBNull(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn] == null); currentColumn++; Assert.AreEqual( testReader.GetChar(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetChar(currentColumn), ((char[])BulkDataReaderSubclass.ExpectedResultSet[currentColumn])[0]); currentColumn++; Assert.AreEqual( testReader.GetChar(currentColumn), ((string)BulkDataReaderSubclass.ExpectedResultSet[currentColumn])[0]); currentColumn++; Assert.AreEqual( testReader.GetString(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); { var expectedResult = ((string)BulkDataReaderSubclass.ExpectedResultSet[currentColumn]).ToCharArray(); var expectedLength = expectedResult.Length; var buffer = new char[expectedLength]; Assert.AreEqual(testReader.GetChars(currentColumn, 0, buffer, 0, expectedLength), expectedLength); Assert.IsTrue(ArraysMatch(buffer, expectedResult)); } currentColumn++; Assert.AreEqual( testReader.GetDateTime(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetDateTime(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetDateTime(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetDateTime(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetDateTimeOffset(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetDateTimeOffset(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetDecimal(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetDouble(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; { var expectedResult = (byte[])BulkDataReaderSubclass.ExpectedResultSet[currentColumn]; var expectedLength = expectedResult.Length; var buffer = new byte[expectedLength]; Assert.AreEqual(testReader.GetBytes(currentColumn, 0, buffer, 0, expectedLength), expectedLength); Assert.IsTrue(ArraysMatch(buffer, expectedResult)); } currentColumn++; Assert.AreEqual( testReader.GetInt32(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetDecimal(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetString(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetString(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetString(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetString(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetFloat(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetDateTime(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetInt16(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetDecimal(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetString(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetTimeSpan(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetTimeSpan(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetByte(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetValue(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetGuid(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; { var expectedResult = (byte[])BulkDataReaderSubclass.ExpectedResultSet[currentColumn]; var expectedLength = expectedResult.Length; var buffer = new byte[expectedLength]; Assert.AreEqual(testReader.GetBytes(currentColumn, 0, buffer, 0, expectedLength), expectedLength); Assert.IsTrue(ArraysMatch(buffer, expectedResult)); } currentColumn++; { var expectedResult = (byte[])BulkDataReaderSubclass.ExpectedResultSet[currentColumn]; var expectedLength = expectedResult.Length; var buffer = new byte[expectedLength]; Assert.AreEqual(testReader.GetBytes(currentColumn, 0, buffer, 0, expectedLength), expectedLength); Assert.IsTrue(ArraysMatch(buffer, expectedResult)); } currentColumn++; Assert.AreEqual( testReader.GetString(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetString(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetValue(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetString(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetString(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetString(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetString(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); currentColumn++; Assert.AreEqual( testReader.GetString(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn]); } } } /// /// Test throws a when /// the index is too small. /// /// /// Uses to test the method. /// /// [Test] public void GetValueIndexTooSmallTest() { using (var testReader = new BulkDataReaderSubclass()) { Assert.IsTrue(testReader.Read()); Assert.Throws(() => { var unused = testReader.GetValue(-1); }); } } /// /// Test throws a when /// the index is too large. /// /// /// Uses to test the method. /// /// [Test] public void GetValueIndexTooLargeTest() { using (var testReader = new BulkDataReaderSubclass()) { Assert.IsTrue(testReader.Read()); Assert.Throws(() => { var unused = testReader.GetValue(testReader.FieldCount); }); } } /// /// Test throws a when /// the index is too small. /// /// /// Uses to test the method. /// /// [Test] public void GetDataIndexTooSmallTest() { using (var testReader = new BulkDataReaderSubclass()) { Assert.IsTrue(testReader.Read()); Assert.Throws(() => { var unused = testReader.GetData(-1); }); } } /// /// Test throws a when /// the index is too large. /// /// /// Uses to test the method. /// [Test] public void GetDataIndexTooLargeTest() { using (var testReader = new BulkDataReaderSubclass()) { Assert.IsTrue(testReader.Read()); Assert.Throws(() => { var unused = testReader.GetData(testReader.FieldCount); }); } } /// /// Test that functions correctly. /// /// [Test] public void IsDbNullTest() { using (var testReader = new BulkDataReaderSubclass()) { for (var currentColumn = 0; currentColumn < testReader.FieldCount; currentColumn++) { Assert.AreEqual( testReader.IsDBNull(currentColumn), BulkDataReaderSubclass.ExpectedResultSet[currentColumn] == null); } } } /// /// Test that is functioning correctly. /// /// /// Because this is a single row set, this should always return false; /// /// [Test] public void NextResultTest() { using (var testReader = new BulkDataReaderSubclass()) { Assert.IsFalse(testReader.NextResult()); } } /// /// Test that is functioning correctly. /// /// /// Because this row set represents a data source, this should always return -1; /// /// [Test] public void RecordsAffectedTest() { using (var testReader = new BulkDataReaderSubclass()) { Assert.IsTrue(testReader.Read()); Assert.AreEqual(-1, testReader.RecordsAffected); } } /// /// Test that the interface is functioning correctly. /// /// /// [Test] public void DisposableTest() { // Test the Dispose method { var testReader = new BulkDataReaderSubclass(); testReader.Dispose(); Assert.IsTrue(testReader.IsClosed); } // Test the finalizer method { var testReader = new BulkDataReaderSubclass(); testReader = null; GC.Collect(); GC.WaitForPendingFinalizers(); } } /// /// Do the two arrays match exactly? /// /// /// The type of the array elements. /// /// /// The first array. /// /// /// The second array. /// /// /// True if the arrays have the same length and contents. /// private static bool ArraysMatch(TElementType[] left, TElementType[] right) { if (left == null) { throw new ArgumentNullException("left"); } if (right == null) { throw new ArgumentNullException("left"); } var result = true; if (left.Length != right.Length) { result = false; } else { for (var currentIndex = 0; currentIndex < left.Length; currentIndex++) { result &= Equals(left[currentIndex], right[currentIndex]); } } return result; } /// /// A subclass of used for testing its utility functions. /// private class BulkDataReaderSubclass : BulkDataReader { /// /// The result set returned by the . /// public static readonly ReadOnlyCollection ExpectedResultSet = new(new List { 10L, new byte[20], true, null, 'c', new[] { 'c' }, "c", "char 20", DateTime.UtcNow, DateTime.UtcNow, DateTime.UtcNow, DateTime.UtcNow, DateTimeOffset.UtcNow, DateTimeOffset.UtcNow, 10.5M, 10.5, new byte[20], 10, 10.5M, "nchar 20", "ntext", "nvarchar 20", "nvarchar max", 10.5F, DateTime.UtcNow, (short)10, 10.5M, "text", DateTime.UtcNow.TimeOfDay, DateTime.UtcNow.TimeOfDay, (byte)10, new(), Guid.NewGuid(), new byte[20], new byte[20], "varchar 20", "varchar max", 10, @"", @"", @"", @"", @"", }); /// /// The number of rows read. /// private int _readCount; /// /// Constructor. /// public BulkDataReaderSubclass() { } /// /// See . /// /// /// Returns . /// protected override string SchemaName => TestSchemaName; /// /// See . /// /// /// Returns . /// protected override string TableName => TestTableName; /// /// See /// /// /// Creates a schema row for the various values. /// protected override void AddSchemaTableRows() { AddSchemaTableRow("BigInt", null, null, null, true, false, false, SqlDbType.BigInt, null, null, null, null, null); AddSchemaTableRow("Binary_20", 20, null, null, false, true, false, SqlDbType.Binary, null, null, null, null, null); AddSchemaTableRow("Bit", null, null, null, false, false, true, SqlDbType.Bit, null, null, null, null, null); AddSchemaTableRow("Bit_null", null, null, null, false, false, true, SqlDbType.Bit, null, null, null, null, null); AddSchemaTableRow("Char_Char", 1, null, null, false, false, false, SqlDbType.Char, null, null, null, null, null); AddSchemaTableRow("Char_Char_Array", 1, null, null, false, false, false, SqlDbType.Char, null, null, null, null, null); AddSchemaTableRow("Char_String", 1, null, null, false, false, false, SqlDbType.Char, null, null, null, null, null); AddSchemaTableRow("Char_20_String", 20, null, null, false, false, false, SqlDbType.Char, null, null, null, null, null); AddSchemaTableRow("Date", null, null, null, false, false, false, SqlDbType.Date, null, null, null, null, null); AddSchemaTableRow("DateTime", null, null, null, false, false, false, SqlDbType.DateTime, null, null, null, null, null); AddSchemaTableRow("DateTime2", null, null, null, false, false, false, SqlDbType.DateTime2, null, null, null, null, null); AddSchemaTableRow("DateTime2_5", null, 5, null, false, false, false, SqlDbType.DateTime2, null, null, null, null, null); AddSchemaTableRow("DateTimeOffset", null, null, null, false, false, false, SqlDbType.DateTimeOffset, null, null, null, null, null); AddSchemaTableRow("DateTimeOffset_5", null, 5, null, false, false, false, SqlDbType.DateTimeOffset, null, null, null, null, null); AddSchemaTableRow("Decimal_20_10", null, 20, 10, false, false, false, SqlDbType.Decimal, null, null, null, null, null); AddSchemaTableRow("Float_50", null, 50, null, false, false, false, SqlDbType.Float, null, null, null, null, null); AddSchemaTableRow("Image", null, null, null, false, false, false, SqlDbType.Image, null, null, null, null, null); AddSchemaTableRow("Int", null, null, null, false, false, false, SqlDbType.Int, null, null, null, null, null); AddSchemaTableRow("Money", null, null, null, false, false, false, SqlDbType.Money, null, null, null, null, null); AddSchemaTableRow("NChar_20", 20, null, null, false, false, false, SqlDbType.NChar, null, null, null, null, null); AddSchemaTableRow("NText", null, null, null, false, false, false, SqlDbType.NText, null, null, null, null, null); AddSchemaTableRow("NVarChar_20", 20, null, null, false, false, false, SqlDbType.NVarChar, null, null, null, null, null); AddSchemaTableRow("NVarChar_Max", null, null, null, false, false, false, SqlDbType.NVarChar, null, null, null, null, null); AddSchemaTableRow("Real", null, null, null, false, false, false, SqlDbType.Real, null, null, null, null, null); AddSchemaTableRow("SmallDateTime", null, null, null, false, false, false, SqlDbType.SmallDateTime, null, null, null, null, null); AddSchemaTableRow("SmallInt", null, null, null, false, false, false, SqlDbType.SmallInt, null, null, null, null, null); AddSchemaTableRow("SmallMoney", null, null, null, false, false, false, SqlDbType.SmallMoney, null, null, null, null, null); AddSchemaTableRow("Text", null, null, null, false, false, false, SqlDbType.Text, null, null, null, null, null); AddSchemaTableRow("Time", null, null, null, false, false, false, SqlDbType.Time, null, null, null, null, null); AddSchemaTableRow("Time_5", null, 5, null, false, false, false, SqlDbType.Time, null, null, null, null, null); AddSchemaTableRow("TinyInt", null, null, null, false, false, false, SqlDbType.TinyInt, null, null, null, null, null); AddSchemaTableRow("Udt", null, null, null, false, false, false, SqlDbType.Udt, TestUdtSchemaName, TestUdtName, null, null, null); AddSchemaTableRow("UniqueIdentifier", null, null, null, false, false, false, SqlDbType.UniqueIdentifier, null, null, null, null, null); AddSchemaTableRow("VarBinary_20", 20, null, null, false, false, false, SqlDbType.VarBinary, null, null, null, null, null); AddSchemaTableRow("VarBinary_Max", null, null, null, false, false, false, SqlDbType.VarBinary, null, null, null, null, null); AddSchemaTableRow("VarChar_20", 20, null, null, false, false, false, SqlDbType.VarChar, null, null, null, null, null); AddSchemaTableRow("VarChar_Max", null, null, null, false, false, false, SqlDbType.VarChar, null, null, null, null, null); AddSchemaTableRow("Variant", null, null, null, false, false, false, SqlDbType.Variant, null, null, null, null, null); AddSchemaTableRow("Xml_Database", null, null, null, false, false, false, SqlDbType.Xml, null, null, TestXmlSchemaCollectionDatabaseName, TestXmlSchemaCollectionSchemaName, TestXmlSchemaCollectionName); AddSchemaTableRow("Xml_Database_XML", null, null, null, false, false, false, SqlDbType.Xml, null, null, TestXmlSchemaCollectionDatabaseName, TestXmlSchemaCollectionSchemaName, TestXmlSchemaCollectionName); AddSchemaTableRow("Xml_Schema", null, null, null, false, false, false, SqlDbType.Xml, null, null, null, TestXmlSchemaCollectionSchemaName, TestXmlSchemaCollectionName); AddSchemaTableRow("Xml_Xml", null, null, null, false, false, false, SqlDbType.Xml, null, null, null, null, TestXmlSchemaCollectionName); AddSchemaTableRow("Xml", null, null, null, false, false, false, SqlDbType.Xml, null, null, null, null, null); } /// /// See /// /// /// The zero-based column ordinal. /// /// /// The value of the column in . /// /// public override object GetValue(int i) => ExpectedResultSet[i]; /// /// See /// /// /// True if there are more rows; otherwise, false. /// /// public override bool Read() => _readCount++ < 1; } private class BulkDataReaderSchemaTest : BulkDataReader { /// /// Constructor. /// public BulkDataReaderSchemaTest() { } /// /// Gets or sets a value indicating whether the column is nullable (i.e. optional). /// public bool AllowDBNull { get; set; } /// /// Gets or sets the name of the column. /// public string ColumnName { get; set; } /// /// Gets or sets the size of the column which may be null if not applicable. /// public int? ColumnSize { get; set; } /// /// Gets or sets a value indicating whether the column part of the primary key. /// public bool IsKey { get; set; } /// /// Gets or sets a value indicating whether the column values are unique (i.e. never duplicated). /// public bool IsUnique { get; set; } /// /// Gets or sets the precision of the column which may be null if not applicable. /// public short? NumericPrecision { get; set; } /// /// Gets or sets the scale of the column which may be null if not applicable. /// public short? NumericScale { get; set; } /// /// Gets or sets the corresponding . /// public SqlDbType ProviderType { get; set; } /// /// Gets or sets the schema name of the UDT. /// public string UdtSchema { get; set; } /// /// Gets or sets the type name of the UDT. /// public string UdtType { get; set; } /// /// Gets or sets the schema collection's database name for XML columns. Otherwise, null. /// public string XmlSchemaCollectionDatabase { get; set; } /// /// Gets or sets the schema collection's name for XML columns. Otherwise, null. /// public string XmlSchemaCollectionName { get; set; } /// /// Gets or sets the schema collection's scheme name for XML columns. Otherwise, null. /// public string XmlSchemaCollectionOwningSchema { get; set; } /// /// See . /// /// /// Returns . /// protected override string SchemaName => TestSchemaName; /// /// See . /// /// /// Returns . /// protected override string TableName => TestTableName; /// /// See /// /// /// Creates a schema row for the various values. /// protected override void AddSchemaTableRows() => AddSchemaTableRow( ColumnName, ColumnSize, NumericPrecision, NumericScale, IsUnique, IsKey, AllowDBNull, ProviderType, UdtSchema, UdtType, XmlSchemaCollectionDatabase, XmlSchemaCollectionOwningSchema, XmlSchemaCollectionName); /// /// See /// /// /// The test stub is only for testing schema functionality and behaves as if it has no rows. /// /// /// The zero-based column ordinal. /// /// /// Never returns. /// /// public override object GetValue(int i) => throw new InvalidOperationException("No data."); /// /// See /// /// /// False. /// /// public override bool Read() => false; } }