Adds more OleDb tests (dotnet/corefx#37509)
authorMaryam Ariyan <maryam.ariyan@microsoft.com>
Thu, 9 May 2019 11:04:55 +0000 (04:04 -0700)
committerGitHub <noreply@github.com>
Thu, 9 May 2019 11:04:55 +0000 (04:04 -0700)
Commit migrated from https://github.com/dotnet/corefx/commit/3070e0484558aaaaf3547ede2f285544d0a3ed00

src/libraries/System.Data.OleDb/src/System/Data/Common/FieldNameLookup.cs
src/libraries/System.Data.OleDb/tests/Helpers.cs
src/libraries/System.Data.OleDb/tests/OleDbCommandBuilderTests.cs
src/libraries/System.Data.OleDb/tests/OleDbCommandTests.cs
src/libraries/System.Data.OleDb/tests/OleDbConnectionTests.cs
src/libraries/System.Data.OleDb/tests/OleDbDataAdapterTests.cs
src/libraries/System.Data.OleDb/tests/OleDbDataReaderTests.cs
src/libraries/System.Data.OleDb/tests/OleDbParameterTests.cs
src/libraries/System.Data.OleDb/tests/OleDbTestBase.cs

index 9a59e8c..f80e25f 100644 (file)
@@ -23,30 +23,6 @@ namespace System.Data.ProviderBase
         private CompareInfo _compareInfo;
         private int _defaultLocaleID;
 
-        public FieldNameLookup(string[] fieldNames, int defaultLocaleID)
-        { // V1.2.3300
-            if (null == fieldNames)
-            {
-                throw ADP.ArgumentNull("fieldNames");
-            }
-            _fieldNames = fieldNames;
-            _defaultLocaleID = defaultLocaleID;
-        }
-
-        public FieldNameLookup(System.Collections.ObjectModel.ReadOnlyCollection<string> columnNames, int defaultLocaleID)
-        {
-            int length = columnNames.Count;
-            string[] fieldNames = new string[length];
-            for (int i = 0; i < length; ++i)
-            {
-                fieldNames[i] = columnNames[i];
-                Debug.Assert(null != fieldNames[i]);
-            }
-            _fieldNames = fieldNames;
-            _defaultLocaleID = defaultLocaleID;
-            GenerateLookup();
-        }
-
         public FieldNameLookup(IDataRecord reader, int defaultLocaleID)
         { // V1.2.3300
 
index fd2eaa3..19ffdc3 100644 (file)
@@ -1,18 +1,17 @@
 // Licensed to the .NET Foundation under one or more agreements.
 // See the LICENSE file in the project root for more information.
 
-using System;
 using System.Collections.Generic;
-using System.Runtime.InteropServices;
-using Xunit;
 
 namespace System.Data.OleDb.Tests
 {
     public static class Helpers
     {
         public const string IsDriverAvailable = nameof(Helpers) + "." + nameof(GetIsDriverAvailable);
+        public const string IsAceDriverAvailable = nameof(Helpers) + "." + nameof(GetIsAceDriverAvailable);
         private static readonly bool s_skipAllTemporarily = true;  // [ActiveIssue(37538)]
         public static bool GetIsDriverAvailable() => !s_skipAllTemporarily && Nested.IsAvailable;
+        public static bool GetIsAceDriverAvailable() => GetIsDriverAvailable() && !PlatformDetection.Is32BitProcess;
         public static string ProviderName => Nested.ProviderName;
         public static string GetTableName(string memberName) => memberName + ".csv";
 
index 680c953..2c3ad23 100644 (file)
@@ -2,13 +2,9 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
-using Xunit;
-using System.Collections.Generic;
-using System.Data.OleDb;
 using System.IO;
 using System.Runtime.CompilerServices;
-using System.Text.RegularExpressions;
-using System.Transactions;
+using Xunit;
 
 namespace System.Data.OleDb.Tests
 {
@@ -88,6 +84,27 @@ namespace System.Data.OleDb.Tests
 
         [OuterLoop]
         [ConditionalFact(Helpers.IsDriverAvailable)]
+        public void QuoteIdentifier_Null_Throws()
+        {
+            RunTest((command, tableName) => {
+                using (var cmd = (OleDbCommand)OleDbFactory.Instance.CreateCommand())
+                {
+                    cmd.CommandType = CommandType.StoredProcedure;
+                    cmd.CommandText = @"SELECT * FROM " + tableName;  
+                    cmd.Connection = (OleDbConnection)OleDbFactory.Instance.CreateConnection();
+                    cmd.Transaction = transaction;
+                    using (var builder = (OleDbCommandBuilder)OleDbFactory.Instance.CreateCommandBuilder())
+                    {
+                        AssertExtensions.Throws<ArgumentNullException>(
+                            () => builder.QuoteIdentifier(null, cmd.Connection), 
+                            $"Value cannot be null.\r\nParameter name: unquotedIdentifier");
+                    }
+                }
+            });
+        }
+
+        [OuterLoop]
+        [ConditionalFact(Helpers.IsDriverAvailable)]
         public void UnquoteIdentifier_Null_Throws()
         {
             RunTest((command, tableName) => {
@@ -97,29 +114,61 @@ namespace System.Data.OleDb.Tests
                     cmd.CommandText = @"SELECT * FROM " + tableName;  
                     cmd.Connection = (OleDbConnection)OleDbFactory.Instance.CreateConnection();
                     cmd.Transaction = transaction;
-                    var builder = (OleDbCommandBuilder)OleDbFactory.Instance.CreateCommandBuilder();
-                    Assert.Throws<ArgumentNullException>(() => builder.UnquoteIdentifier(null, cmd.Connection));
+                    using (var builder = (OleDbCommandBuilder)OleDbFactory.Instance.CreateCommandBuilder())
+                    {
+                        AssertExtensions.Throws<ArgumentNullException>(
+                            () => builder.UnquoteIdentifier(null, cmd.Connection), 
+                            $"Value cannot be null.\r\nParameter name: quotedIdentifier");
+                    }
                 }
             });
         }
 
         [OuterLoop]
         [ConditionalFact(Helpers.IsDriverAvailable)]
-        public void Ctor_Defaults()
+        public void QuoteUnquote_CustomPrefixSuffix_Success()
         {
             RunTest((command, tableName) => {
                 using (var cmd = (OleDbCommand)OleDbFactory.Instance.CreateCommand())
                 {
+                    cmd.Transaction = transaction;
                     cmd.CommandType = CommandType.StoredProcedure;
                     cmd.CommandText = @"SELECT * FROM " + tableName;  
                     cmd.Connection = (OleDbConnection)OleDbFactory.Instance.CreateConnection();
                     cmd.Connection.ConnectionString = connection.ConnectionString;
-                    cmd.Transaction = transaction;
                     
-                    DataSet ds = new DataSet();
-                    OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
-                    OleDbCommandBuilder commandBuilder = new OleDbCommandBuilder(adapter);
-                    Assert.Equal(adapter, commandBuilder.DataAdapter);
+                    using (var adapter = new OleDbDataAdapter(cmd.CommandText, connection))
+                    using (var builder = new OleDbCommandBuilder(adapter))
+                    {
+                        // Custom prefix & suffix
+                        builder.QuotePrefix = "'";
+                        builder.QuoteSuffix = "'";
+
+                        Assert.Equal(adapter, builder.DataAdapter);
+                        Assert.Equal("'Test'", builder.QuoteIdentifier("Test", connection));
+                        Assert.Equal("'Te''st'", builder.QuoteIdentifier("Te'st", connection));
+                        Assert.Equal("Test", builder.UnquoteIdentifier("'Test'", connection));
+                        Assert.Equal("Te'st", builder.UnquoteIdentifier("'Te''st'", connection));
+                        
+                        // Ensure we don't need active connection:
+                        Assert.Equal("'Test'", builder.QuoteIdentifier("Test", null));
+                        Assert.Equal("Test", builder.UnquoteIdentifier("'Test'", null));
+
+                        builder.QuotePrefix = string.Empty;
+                        string quoteErrMsg = $"{nameof(builder.QuoteIdentifier)} requires open connection when the quote prefix has not been set.";
+                        string unquoteErrMsg = $"{nameof(builder.UnquoteIdentifier)} requires open connection when the quote prefix has not been set.";
+
+                        Assert.Equal("`Test`", builder.QuoteIdentifier("Test", connection));
+                        Assert.Equal("Test", builder.UnquoteIdentifier("`Test`", connection));
+
+                        Assert.NotNull(adapter.SelectCommand.Connection);
+                        Assert.Equal("`Test`", builder.QuoteIdentifier("Test"));
+                        Assert.Equal("Test", builder.UnquoteIdentifier("`Test`"));
+
+                        adapter.SelectCommand.Connection = null;
+                        AssertExtensions.Throws<InvalidOperationException>(() => builder.QuoteIdentifier("Test"), quoteErrMsg);
+                        AssertExtensions.Throws<InvalidOperationException>(() => builder.UnquoteIdentifier("'Test'"), unquoteErrMsg);
+                    }
                 }
             });
         }
@@ -150,4 +199,4 @@ namespace System.Data.OleDb.Tests
             command.ExecuteNonQuery();
         }
     }
-}
\ No newline at end of file
+}
index d20f339..26ef0e1 100644 (file)
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
-using Xunit;
-using System.Collections.Generic;
-using System.Data.OleDb;
+using System.Data;
 using System.IO;
 using System.Runtime.CompilerServices;
-using System.Text.RegularExpressions;
+using Xunit;
 
 namespace System.Data.OleDb.Tests
 {
     public class OleDbCommandTests : OleDbTestBase
     {
         [ConditionalFact(Helpers.IsDriverAvailable)]
+        public void UpdatedRowSource_SetInvalidValue_Throws()
+        {
+            const int InvalidValue = 50;
+            using (var cmd = (OleDbCommand)OleDbFactory.Instance.CreateCommand())
+            {
+                Assert.Equal(UpdateRowSource.Both, cmd.UpdatedRowSource);
+                cmd.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord;
+                Assert.Equal(UpdateRowSource.FirstReturnedRecord, cmd.UpdatedRowSource);
+                AssertExtensions.Throws<ArgumentOutOfRangeException>(
+                    () => cmd.UpdatedRowSource = (UpdateRowSource)InvalidValue, 
+                    $"The {nameof(UpdateRowSource)} enumeration value, {InvalidValue}, is invalid.\r\nParameter name: {nameof(UpdateRowSource)}"
+                );
+            }
+        }
+
+        [ConditionalFact(Helpers.IsDriverAvailable)]
+        public void CommandTimeout_SetInvalidValue_Throws()
+        {
+            const int InvalidValue = -1;
+            using (var cmd = new OleDbCommand(default, connection, transaction))
+            {
+                AssertExtensions.Throws<ArgumentException>(
+                    () => cmd.CommandTimeout = InvalidValue, 
+                    $"Invalid CommandTimeout value {InvalidValue}; the value must be >= 0.\r\nParameter name: {nameof(cmd.CommandTimeout)}"
+                );
+            }
+        }
+
+        [ConditionalFact(Helpers.IsDriverAvailable)]
+        public void ResetCommandTimeout_ResetsToDefault()
+        {
+            using (var cmd = new OleDbCommand(default, connection, transaction))
+            {
+                const int DefaultValue = 30;
+                Assert.Equal(DefaultValue, cmd.CommandTimeout);
+                cmd.CommandTimeout = DefaultValue + 50;
+                Assert.Equal(DefaultValue + 50, cmd.CommandTimeout);
+                cmd.ResetCommandTimeout();
+                Assert.Equal(DefaultValue, cmd.CommandTimeout);
+            }
+        }
+
+        [ConditionalFact(Helpers.IsDriverAvailable)]
         public void CommandType_SetInvalidValue_Throws()
         {
+            const int InvalidValue = 0;
             using (var cmd = (OleDbCommand)OleDbFactory.Instance.CreateCommand())
             {
                 AssertExtensions.Throws<ArgumentOutOfRangeException>(
-                    () => cmd.CommandType = (CommandType)0
-                    $"The CommandType enumeration value, 0, is invalid.\r\nParameter name: {nameof(cmd.CommandType)}"
+                    () => cmd.CommandType = (CommandType)InvalidValue
+                    $"The CommandType enumeration value, {InvalidValue}, is invalid.\r\nParameter name: {nameof(cmd.CommandType)}"
                 );
             }
         }
 
         [OuterLoop]
         [ConditionalFact(Helpers.IsDriverAvailable)]
+        public void Prepare_ClosedConnection_Throws()
+        {
+            RunTest((command, tableName) => {
+                command.CommandText = @"SELECT * FROM " + tableName;
+                var currentConnection = command.Connection;
+                var oleDbConnection = new OleDbConnection(ConnectionString);
+                oleDbConnection.Open();
+                command.Connection = oleDbConnection;
+                oleDbConnection.Close();
+                AssertExtensions.Throws<InvalidOperationException>(
+                    () => command.Prepare(), 
+                    $"{nameof(command.Prepare)} requires an open and available Connection. The connection's current state is closed."
+                );
+                command.Connection = currentConnection;
+            });
+        }
+
+        [OuterLoop]
+        [ConditionalFact(Helpers.IsDriverAvailable)]
+        public void Prepare_MultipleCases_ThrowsForInvalidQuery()
+        {
+            RunTest((command, tableName) => {
+                Assert.Equal(ConnectionState.Open, connection.State);
+                command.CommandText = "INVALID_STATEMENT";
+                AssertExtensions.Throws<OleDbException>(
+                    () => command.Prepare(), 
+                    "Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'."
+                );
+                command.CommandText = @"UPDATE " + tableName + " SET NumPlants ? WHERE Firstname = ?";
+                AssertExtensions.Throws<OleDbException>(
+                    () => command.Prepare(), 
+                    $"Syntax error in UPDATE statement."
+                );
+            });
+        }
+
+        [OuterLoop]
+        [ConditionalFact(Helpers.IsDriverAvailable)]
+        public void Prepare_InsertMultipleItems_UseTableDirectToVerify()
+        {
+            RunTest((command, tableName) => {
+                command.CommandText = @"INSERT INTO " + tableName + " (Firstname, NumPlants) VALUES (?, ?)";
+                command.Prepare(); // Good to use when command used multiple times
+
+                command.Parameters.Add(command.CreateParameter());
+                command.Parameters.Add(command.CreateParameter());
+                
+                object[] newItems = new object[] {
+                    new { Firstname = "John", NumPlants = 7 },
+                    new { Firstname = "Mark", NumPlants = 12 },
+                    new { Firstname = "Nick", NumPlants = 6 }
+                };
+                foreach (dynamic item in newItems)
+                {    
+                    command.Parameters[0].Value = item.Firstname;
+                    command.Parameters[1].Value = item.NumPlants;
+                    command.ExecuteNonQuery();
+                }
+                var currentCommandType = command.CommandType;
+                command.CommandType = CommandType.TableDirect;
+                command.CommandText = tableName;
+                using (OleDbDataReader reader = command.ExecuteReader())
+                {
+                    Assert.True(reader.Read(), "skip existing row");
+                    Assert.True(reader.Read(), "skip existing row");
+                    foreach (dynamic item in newItems)
+                    {
+                        Assert.True(reader.Read(), "validate new row");
+                        Assert.Equal(item.Firstname, reader["Firstname"]);
+                        Assert.Equal(item.NumPlants, reader["NumPlants"]);
+                    }
+                    object x;
+                    AssertExtensions.Throws<IndexOutOfRangeException>(() => x = reader["MissingColumn"], "MissingColumn");
+                }
+                command.CommandType = currentCommandType;
+            });
+        }
+
+        [OuterLoop]
+        [ConditionalFact(Helpers.IsDriverAvailable)]
+        public void Parameters_AddNullParameter_Throws()
+        {
+            RunTest((command, tableName) => {
+                AssertExtensions.Throws<ArgumentNullException>(
+                    () => command.Parameters.Add(null), 
+                    $"The {nameof(OleDbParameterCollection)} only accepts non-null {nameof(OleDbParameter)} type objects.\r\nParameter name: value"
+                );
+                command.CommandText = "SELECT * FROM " + tableName + " WHERE NumPlants = ?";
+                command.Parameters.Add(new OleDbParameter("@p1", 7));
+                using (OleDbDataReader reader = command.ExecuteReader())
+                {
+                    Assert.True(reader.Read());
+                    Assert.Equal("John", reader["Firstname"]);
+                    Assert.Equal(7, reader["NumPlants"]);
+                    Assert.False(reader.Read(), "Expected to find only one item");
+                }
+            });
+        }
+
+        [OuterLoop]
+        [ConditionalFact(Helpers.IsDriverAvailable)]
+        public void ExecuteNonQuery_NullConnection_Throws()
+        {
+            RunTest((command, tableName) => {
+                command.CommandText = @"SELECT * FROM " + tableName;
+                var currentConnection = command.Connection;
+                command.Connection = null;
+                AssertExtensions.Throws<InvalidOperationException>(
+                    () => command.ExecuteNonQuery(), 
+                    $"{nameof(command.ExecuteNonQuery)}: {nameof(command.Connection)} property has not been initialized."
+                );
+                command.Connection = currentConnection;
+            });
+        }
+
+        [OuterLoop]
+        [ConditionalFact(Helpers.IsDriverAvailable)]
         public void CommandType_InvalidType_Throws()
         {
             RunTest((command, tableName) => {
@@ -81,4 +240,4 @@ namespace System.Data.OleDb.Tests
             command.ExecuteNonQuery();
         }
     }
-}
\ No newline at end of file
+}
index 259bdd2..bcdb94e 100644 (file)
@@ -2,13 +2,10 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
-using Xunit;
 using System.Collections.Generic;
 using System.Data.Common;
-using System.Data.OleDb;
 using System.IO;
-using System.Text;
-using System.Text.RegularExpressions;
+using Xunit;
 
 namespace System.Data.OleDb.Tests
 {
@@ -94,6 +91,22 @@ namespace System.Data.OleDb.Tests
         }
         
         [ConditionalFact(Helpers.IsDriverAvailable)]
+        public void StateChange_ChangeState_TriggersEvent()
+        {
+            int timesCalled = 0;
+            Action<object, StateChangeEventArgs> OnStateChange = (sender, args) => {
+                timesCalled++;
+            };
+            using (var oleDbConnection = new OleDbConnection(ConnectionString))
+            {
+                oleDbConnection.StateChange += new StateChangeEventHandler(OnStateChange);  
+                oleDbConnection.Open();
+                oleDbConnection.Close();
+                Assert.Equal(2, timesCalled);
+            }
+        }
+        
+        [ConditionalFact(Helpers.IsDriverAvailable)]
         public void BeginTransaction_InvalidIsolationLevel_Throws()
         {
             using (var oleDbConnection = new OleDbConnection(ConnectionString))
@@ -103,6 +116,77 @@ namespace System.Data.OleDb.Tests
             }
         }
 
+        [ConditionalFact(Helpers.IsAceDriverAvailable)]
+        public void BeginTransaction_CallTwice_Throws()
+        {
+            using (var conn = new OleDbConnection(ConnectionString))
+            {
+                conn.Open();
+                using (var tx = conn.BeginTransaction())
+                {
+                    var cmd = conn.CreateCommand();
+                    cmd.CommandText = "CREATE TABLE table_x.csv (column_y NVARCHAR(40));";
+                    cmd.Transaction = tx;
+                    cmd.ExecuteNonQuery();
+                    AssertExtensions.Throws<InvalidOperationException>(
+                        () => conn.BeginTransaction(),
+                        $"{nameof(OleDbConnection)} does not support parallel transactions."
+                    );
+                }
+                conn.Close();
+            }
+        }
+
+        [ConditionalFact(Helpers.IsAceDriverAvailable)]
+        public void CommitTransaction_AfterConnectionClosed_Throws()
+        {
+            using (var conn = new OleDbConnection(ConnectionString))
+            {
+                conn.Open();
+                using (var tx = conn.BeginTransaction())
+                {
+                    var cmd = conn.CreateCommand();
+                    cmd.CommandText = "CREATE TABLE table_x.csv (column_y NVARCHAR(40));";
+                    cmd.Transaction = tx;
+                    cmd.ExecuteNonQuery();
+                    conn.Close();
+                    AssertExtensions.Throws<InvalidOperationException>(
+                        () => tx.Commit(),
+                        $"This {nameof(OleDbTransaction)} has completed; it is no longer usable."
+                    );
+                }
+            }
+        }
+        
+        [ConditionalFact(Helpers.IsDriverAvailable)]
+        public void GetDefaults_AnyGivenState_DoesNotThrow()
+        {
+            const int DefaultTimeout = 15;
+            Action<OleDbConnection> VerifyDefaults = (conn) => {
+                Assert.Equal(DefaultTimeout, conn.ConnectionTimeout);
+                Assert.Contains(conn.DataSource, TestDirectory);
+                Assert.Empty(conn.Database);
+            };
+            using (var oleDbConnection = new OleDbConnection())
+            {
+                VerifyDefaults(oleDbConnection);
+                oleDbConnection.ConnectionString = ConnectionString;
+                oleDbConnection.Open();
+                VerifyDefaults(oleDbConnection);
+                oleDbConnection.Close();
+                VerifyDefaults(oleDbConnection);
+            }
+        }
+        
+        [ConditionalFact(Helpers.IsDriverAvailable)]
+        public void CreateCommand_AsDbConnection_IsOleDb()
+        {
+            DbConnection dbConnection = connection as DbConnection;
+            DbCommand dbCommand = dbConnection.CreateCommand();
+            Assert.NotNull(dbCommand);
+            Assert.IsType<OleDbCommand>(dbCommand);
+        }
+
         [ConditionalFact(Helpers.IsDriverAvailable)]
         public void Provider_SetProperlyFromCtor()
         {
@@ -113,6 +197,27 @@ namespace System.Data.OleDb.Tests
             }
         }
 
+        [ConditionalFact(Helpers.IsDriverAvailable)]
+        public void GetSchema_NoArgs_ReturnsMetaDataCollections()
+        {
+            if (PlatformDetection.IsWindows7)
+            {
+                return; // [ActiveIssue(37438)]
+            }
+
+            DataTable t1 = connection.GetSchema();
+            DataTable t2 = connection.GetSchema(DbMetaDataCollectionNames.MetaDataCollections);
+            Assert.Equal(t1.Rows.Count, t2.Rows.Count);
+
+            foreach (DataColumn dc in t1.Columns)
+            {
+                for (int i = 0; i < t1.Rows.Count; i++)
+                {
+                    Assert.Equal(t1.Rows[i][dc.ColumnName], t2.Rows[i][dc.ColumnName]);
+                }
+            }
+        }
+
         [ConditionalTheory(Helpers.IsDriverAvailable)]
         [InlineData(nameof(DbMetaDataCollectionNames.MetaDataCollections), "CollectionName")]
         [InlineData(nameof(DbMetaDataCollectionNames.DataSourceInformation), "CompositeIdentifierSeparatorPattern")]
@@ -139,13 +244,45 @@ namespace System.Data.OleDb.Tests
                 $"Column '{MissingColumn}' does not belong to table {tableName}.");
         }
 
+        [OuterLoop]
         [ConditionalFact(Helpers.IsDriverAvailable)]
+        public void GetOleDbSchemaTable_ReturnsTableInfo()
+        {
+            string tableName = Helpers.GetTableName(nameof(GetOleDbSchemaTable_ReturnsTableInfo));
+            command.CommandText = @"CREATE TABLE t1.csv (CustomerName NVARCHAR(40));";
+            command.ExecuteNonQuery();
+            command.CommandText = @"CREATE TABLE t2.csv (CustomerName NVARCHAR(40));";
+            command.ExecuteNonQuery();
+            DataTable listedTables = connection.GetOleDbSchemaTable(
+                OleDbSchemaGuid.Tables, new object[] {null, null, null, "Table"});
+
+            Assert.NotNull(listedTables);
+            Assert.Equal(2, listedTables.Rows.Count);
+            Assert.Equal("t1#csv", listedTables.Rows[0][2].ToString());
+            Assert.Equal("t2#csv", listedTables.Rows[1][2].ToString());
+
+            command.CommandText = @"DROP TABLE t1.csv";
+            command.ExecuteNonQuery();
+            command.CommandText = @"DROP TABLE t2.csv";
+            command.ExecuteNonQuery();
+        }
+
+        [ConditionalFact(Helpers.IsAceDriverAvailable)]
         public void ChangeDatabase_EmptyDatabase_Throws()
         {
             using (var oleDbConnection = new OleDbConnection(ConnectionString))
             {
                 oleDbConnection.Open();
+                Assert.Throws<ArgumentException>(() => oleDbConnection.ChangeDatabase(null));
+                Assert.Throws<ArgumentException>(() => oleDbConnection.ChangeDatabase(" "));
                 Assert.Throws<ArgumentException>(() => oleDbConnection.ChangeDatabase(string.Empty));
+                AssertExtensions.Throws<InvalidOperationException>(
+                    () => oleDbConnection.ChangeDatabase("ReadOnlyShouldThrow"), 
+                    "The 'current catalog' property was read-only, or the consumer attempted to set values of properties " + 
+                    "in the Initialization property group after the data source object was initialized. " + 
+                    "Consumers can set the value of a read-only property to its current value. " + 
+                    "This status is also returned if a settable column property could not be set for the particular column."
+                );
             }
         }
 
@@ -301,4 +438,4 @@ namespace System.Data.OleDb.Tests
             Assert.Empty(connectionStringBuilder.Provider);
         }
     }
-}
\ No newline at end of file
+}
index d564a81..3719543 100644 (file)
@@ -2,13 +2,9 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
-using Xunit;
-using System.Collections.Generic;
-using System.Data.OleDb;
 using System.IO;
 using System.Runtime.CompilerServices;
-using System.Text.RegularExpressions;
-using System.Transactions;
+using Xunit;
 
 namespace System.Data.OleDb.Tests
 {
@@ -178,4 +174,4 @@ namespace System.Data.OleDb.Tests
             command.ExecuteNonQuery();
         }
     }
-}
\ No newline at end of file
+}
index ca8ef44..426ed09 100644 (file)
@@ -2,17 +2,26 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
-using Xunit;
-using System.Collections.Generic;
-using System.Data.OleDb;
 using System.IO;
 using System.Runtime.CompilerServices;
-using System.Text.RegularExpressions;
+using Xunit;
 
 namespace System.Data.OleDb.Tests
 {
     public class OleDbDataReaderTests : OleDbTestBase
     {
+        [OuterLoop]
+        [ConditionalFact(Helpers.IsDriverAvailable)]
+        public void FieldCount_NoMetadata_ReturnsZero()
+        {
+            command.CommandText = @"CREATE TABLE sample.csv;";
+            using (OleDbDataReader reader = command.ExecuteReader())
+            {
+                Assert.Equal(0, reader.FieldCount);
+                Assert.Equal(0, reader.VisibleFieldCount);
+            }
+        }
+
         [ConditionalFact(Helpers.IsDriverAvailable)]
         public void ExecuteNonQuery_TableNameWithoutCsvExtension_Throws()
         {
@@ -31,9 +40,9 @@ namespace System.Data.OleDb.Tests
                 reader.Read();
                 Assert.True(reader.HasRows);
                 DataTable schema = reader.GetSchemaTable();
-                Assert.Equal(4, schema.Rows.Count);
+                Assert.Equal(5, schema.Rows.Count);
                 AssertExtensions.Throws<IndexOutOfRangeException>(
-                    () => reader.GetString(5), 
+                    () => reader.GetString(6), 
                     "Index was outside the bounds of the array.");
             });
         }
@@ -63,6 +72,7 @@ namespace System.Data.OleDb.Tests
                 Assert.Equal("XYZ", values[1]);
                 Assert.Equal(42.2, values[2]);
                 Assert.Equal(48.3f, values[3]);
+                Assert.Equal(new DateTime(2015, 1, 11, 12, 54, 1), values[4]);
             });
         }
 
@@ -86,7 +96,7 @@ namespace System.Data.OleDb.Tests
         {
             RunTest((reader) => {
                 DataTable schema = reader.GetSchemaTable();
-                Assert.Equal(4, schema.Rows.Count);  
+                Assert.Equal(5, schema.Rows.Count);  
                 Assert.Equal("CustomerName", schema.Rows[1].Field<String>("ColumnName"));
                 Assert.Equal(typeof(string), schema.Rows[1].Field<Type>("DataType"));
                 Assert.Equal(40, schema.Rows[1].Field<int>("ColumnSize"));
@@ -99,11 +109,12 @@ namespace System.Data.OleDb.Tests
         {
             RunTest((reader) => {
                 DataTable schema = reader.GetSchemaTable();
-                Assert.Equal(4, schema.Rows.Count);  
+                Assert.Equal(5, schema.Rows.Count);  
                 Assert.Equal("CustomerID", schema.Rows[0].Field<String>("ColumnName"));
                 Assert.Equal("CustomerName", schema.Rows[1].Field<String>("ColumnName"));
                 Assert.Equal("SingleAmount", schema.Rows[2].Field<String>("ColumnName"));
                 Assert.Equal("RealAmount", schema.Rows[3].Field<String>("ColumnName"));
+                Assert.Equal("DateChecked", schema.Rows[4].Field<String>("ColumnName"));
             });
         }
 
@@ -113,11 +124,12 @@ namespace System.Data.OleDb.Tests
         {
             RunTest((reader) => {
                 DataTable schema = reader.GetSchemaTable();
-                Assert.Equal(4, schema.Rows.Count);
+                Assert.Equal(5, schema.Rows.Count);
                 Assert.Equal(typeof(int), schema.Rows[0].Field<Type>("DataType"));
                 Assert.Equal(typeof(string), schema.Rows[1].Field<Type>("DataType"));
                 Assert.Equal(typeof(double), schema.Rows[2].Field<Type>("DataType"));
                 Assert.Equal(typeof(float), schema.Rows[3].Field<Type>("DataType"));
+                Assert.Equal(typeof(DateTime), schema.Rows[4].Field<Type>("DataType"));
             });
         }
 
@@ -170,6 +182,18 @@ namespace System.Data.OleDb.Tests
         }
 
         [OuterLoop]
+        [ConditionalFact(Helpers.IsDriverAvailable)]
+        public void Read_GetDateTime_Success()
+        {
+            RunTest((reader) => {
+                Assert.True(reader.HasRows);
+                reader.Read();
+                Assert.Throws<InvalidCastException>(() => reader.GetFloat(2));
+                Assert.Equal(new DateTime(2015, 1, 11, 12, 54, 1), reader.GetDateTime(4));
+            });
+        }
+
+        [OuterLoop]
         [ConditionalTheory(Helpers.IsDriverAvailable)]
         [InlineData(0)]
         [InlineData(1)]
@@ -204,6 +228,18 @@ namespace System.Data.OleDb.Tests
             });
         }
 
+        [OuterLoop]
+        [ConditionalFact(Helpers.IsDriverAvailable)]
+        public void InnerReader_OpenReaderExists_Throws()
+        {
+            RunTest((reader) => {
+                AssertExtensions.Throws<InvalidOperationException>(
+                    () => command.ExecuteReader(),
+                    "There is already an open DataReader associated with this Command which must be closed first."
+                );
+            });
+        }
+
         [ConditionalFact(Helpers.IsDriverAvailable)]
         public void GetEnumerator_BadType_Throws()
         {
@@ -219,7 +255,8 @@ namespace System.Data.OleDb.Tests
                     CustomerID INT,
                     CustomerName NVARCHAR(40), 
                     SingleAmount FLOAT, 
-                    RealAmount REAL);";
+                    RealAmount REAL,
+                    DateChecked DATETIME);";
             command.ExecuteNonQuery();
             Assert.True(File.Exists(Path.Combine(TestDirectory, tableName)));
 
@@ -230,8 +267,9 @@ namespace System.Data.OleDb.Tests
                         CustomerID,
                         CustomerName, 
                         SingleAmount, 
-                        RealAmount)
-                    VALUES ( 123, 'XYZ', @value, @realValue );";
+                        RealAmount,
+                        DateChecked)
+                    VALUES ( 123, 'XYZ', @value, @realValue, '01/11/2015 12:54:01' );";
 #pragma warning disable 612,618
                 command.Parameters.Add("@value", 42.2);
                 command.Parameters.Add("@realValue", 48.3);
@@ -239,7 +277,7 @@ namespace System.Data.OleDb.Tests
                 command.ExecuteNonQuery();
             }
 
-            command.CommandText = "SELECT CustomerID, CustomerName, SingleAmount, RealAmount FROM " + tableName;
+            command.CommandText = "SELECT CustomerID, CustomerName, SingleAmount, RealAmount, DateChecked FROM " + tableName;
             using (OleDbDataReader reader = schemaOnly ? command.ExecuteReader(CommandBehavior.SchemaOnly) : command.ExecuteReader())
             {
                 testAction(reader);
@@ -248,4 +286,4 @@ namespace System.Data.OleDb.Tests
             command.ExecuteNonQuery();
         }
     }
-}
\ No newline at end of file
+}
index 76ef529..3200969 100644 (file)
@@ -2,12 +2,9 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
-using Xunit;
 using System.Collections.Generic;
-using System.Data.OleDb;
-using System.IO;
 using System.Linq;
-using System.Text.RegularExpressions;
+using Xunit;
 
 namespace System.Data.OleDb.Tests
 {
@@ -284,4 +281,4 @@ namespace System.Data.OleDb.Tests
             }
         }
     }
-}
\ No newline at end of file
+}
index ef0353c..4dee954 100644 (file)
@@ -2,9 +2,8 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
-using Xunit;
-using System.Data.OleDb;
 using System.IO;
+using Xunit;
 
 namespace System.Data.OleDb.Tests
 {