Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit 01ee1e9

Browse files
RemiBousaurabh500
authored andcommitted
Improve SqlDataRecord test coverage (#27424)
* first unit test on SqlDatRecord * SqlDataRecord GetDataTypeName tests added * added getfieldtype test * first test for GetValues * Finished tests for getvalues * added tests for GetOrdinal * Added tests for GetChar * formating added test for invalid cast error in GetXXX methods * added test for good usage of GetXX methods * some code formating
1 parent 2ee63c6 commit 01ee1e9

File tree

1 file changed

+256
-0
lines changed

1 file changed

+256
-0
lines changed

src/System.Data.SqlClient/tests/FunctionalTests/SqlDataRecordTest.cs

Lines changed: 256 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
// See the LICENSE file in the project root for more information.
44

55

6+
using System.Collections;
7+
using System.Collections.Generic;
68
using System.Data.SqlTypes;
79
using Microsoft.SqlServer.Server;
810
using Xunit;
@@ -136,6 +138,260 @@ public void SqlRecordFillTest()
136138
Assert.Equal(DBNull.Value, record.GetValue(i));
137139
}
138140
}
141+
[Fact]
142+
public void GetDataTypeName_ReturnsMetaDataTypeIfUdtType()
143+
{
144+
SqlMetaData[] metaData = new SqlMetaData[]
145+
{
146+
new SqlMetaData("col1", SqlDbType.Udt, typeof(TestUdt), "sql_TestUdt")
147+
};
148+
149+
SqlDataRecord record = new SqlDataRecord(metaData);
150+
151+
Assert.Equal("System.Data.SqlClient.Tests.TestUdt", record.GetDataTypeName(0));
152+
}
153+
154+
[Fact]
155+
public void GetDataTypeName_ReturnsTypeFromMetaTypeIfNotUdt()
156+
{
157+
SqlMetaData[] metaData = new SqlMetaData[]
158+
{
159+
new SqlMetaData("col1", SqlDbType.NVarChar, 50)
160+
};
161+
162+
SqlDataRecord record = new SqlDataRecord(metaData);
163+
164+
Assert.Equal("nvarchar", record.GetDataTypeName(0));
165+
}
166+
[Fact]
167+
public void GetFieldType_ReturnMetaTypeClassType()
168+
{
169+
SqlMetaData[] metaData = new SqlMetaData[]
170+
{
171+
new SqlMetaData("col1", SqlDbType.NVarChar, 50)
172+
};
173+
174+
SqlDataRecord record = new SqlDataRecord(metaData);
175+
176+
Assert.Equal(typeof(string), record.GetFieldType(0));
177+
}
178+
179+
[Fact]
180+
public void GetValues_ThrowsIfNull()
181+
{
182+
SqlMetaData[] metaData = new SqlMetaData[]
183+
{
184+
new SqlMetaData("col1", SqlDbType.NVarChar, 50)
185+
};
186+
187+
SqlDataRecord record = new SqlDataRecord(metaData);
188+
189+
Assert.Throws<ArgumentNullException>(() => record.GetValues(null));
190+
}
191+
192+
[Fact]
193+
public void GetValues_IfValuesBiggerThanColumnCount_LastArrayItemKeptEmpty()
194+
{
195+
SqlMetaData[] metaData = new SqlMetaData[]
196+
{
197+
new SqlMetaData("col1", SqlDbType.NVarChar, 50),
198+
new SqlMetaData("col2", SqlDbType.Int)
199+
};
200+
SqlDataRecord record = new SqlDataRecord(metaData);
201+
record.SetString(0, "test");
202+
record.SetSqlInt32(1, 2);
203+
204+
object[] values = new object[5];
205+
int columnCount = record.GetValues(values);
206+
207+
for (int i = 2; i < 5; i++)
208+
{
209+
Assert.Null(values[i]);
210+
}
211+
Assert.Equal(2, columnCount);
212+
}
213+
214+
[Fact]
215+
public void GetValues_IfValuesShorterThanColumnCount_FillOnlyFirstColumn()
216+
{
217+
SqlMetaData[] metaData = new SqlMetaData[]
218+
{
219+
new SqlMetaData("col1", SqlDbType.NVarChar, 50),
220+
new SqlMetaData("col2", SqlDbType.Int)
221+
};
222+
SqlDataRecord record = new SqlDataRecord(metaData);
223+
record.SetString(0, "test");
224+
record.SetSqlInt32(1, 2);
225+
226+
object[] values = new object[1];
227+
int columnCount = record.GetValues(values);
228+
229+
Assert.Equal("test", values[0]);
230+
Assert.Equal(1, columnCount);
231+
}
232+
233+
[Fact]
234+
public void GetValues_FillsArrayAndRespectColumnOrder()
235+
{
236+
SqlMetaData[] metaData = new SqlMetaData[]
237+
{
238+
new SqlMetaData("col1", SqlDbType.NVarChar, 50),
239+
new SqlMetaData("col2", SqlDbType.Int)
240+
};
241+
SqlDataRecord record = new SqlDataRecord(metaData);
242+
record.SetString(0, "test");
243+
record.SetSqlInt32(1, 2);
244+
245+
object[] values = new object[2];
246+
int columnCount = record.GetValues(values);
247+
248+
Assert.Equal("test", values[0]);
249+
Assert.Equal(2, values[1]);
250+
Assert.Equal(2, columnCount);
251+
}
252+
253+
[Fact]
254+
public void GetOrdinal_ThrowsAgumentNull_IfNameIsNull()
255+
{
256+
SqlMetaData[] metaData = new SqlMetaData[]
257+
{
258+
new SqlMetaData("col1", SqlDbType.NVarChar, 50),
259+
new SqlMetaData("col2", SqlDbType.Int)
260+
};
261+
SqlDataRecord record = new SqlDataRecord(metaData);
262+
263+
Assert.Throws<ArgumentNullException>(() => record.GetOrdinal(null));
264+
}
265+
266+
[Fact]
267+
public void GetOrdinal_ThrowsOutOfRange_IfNameIsNotAColumn()
268+
{
269+
SqlMetaData[] metaData = new SqlMetaData[]
270+
{
271+
new SqlMetaData("col1", SqlDbType.NVarChar, 50),
272+
new SqlMetaData("col2", SqlDbType.Int)
273+
};
274+
SqlDataRecord record = new SqlDataRecord(metaData);
275+
276+
277+
Assert.Throws<IndexOutOfRangeException>(() => record.GetOrdinal("outofrange"));
278+
279+
Assert.Throws<IndexOutOfRangeException>(() => record.GetOrdinal("col1 "));
280+
281+
}
282+
283+
[Fact]
284+
public void GetOrdinal_ReturnsIndexOfColumn()
285+
{
286+
SqlMetaData[] metaData = new SqlMetaData[]
287+
{
288+
new SqlMetaData("col1", SqlDbType.NVarChar, 50),
289+
new SqlMetaData("col2", SqlDbType.Int)
290+
};
291+
SqlDataRecord record = new SqlDataRecord(metaData);
292+
293+
Assert.Equal(1, record.GetOrdinal("col2"));
294+
}
295+
[Fact]
296+
public void GetOrdinal_ReturnsIndexOfColumn_CaseInsensitive()
297+
{
298+
SqlMetaData[] metaData = new SqlMetaData[]
299+
{
300+
new SqlMetaData("col1", SqlDbType.NVarChar, 50),
301+
new SqlMetaData("col2", SqlDbType.Int)
302+
};
303+
SqlDataRecord record = new SqlDataRecord(metaData);
304+
305+
Assert.Equal(1, record.GetOrdinal("Col2"));
306+
}
307+
308+
[Fact]
309+
public void GetChar_ThrowsNotSupported()
310+
{
311+
SqlMetaData[] metaData = new SqlMetaData[]
312+
{
313+
new SqlMetaData("col1", SqlDbType.Char, 100)
314+
};
315+
SqlDataRecord record = new SqlDataRecord(metaData);
316+
record.SetValue(0, 'c');
317+
Assert.Throws<NotSupportedException>(() => record.GetChar(0));
318+
}
319+
320+
[Theory]
321+
[ClassData(typeof(GetXXXBadTypeTestData))]
322+
public void GetXXX_ThrowsIfBadType(Func<SqlDataRecord, object> getXXX)
323+
{
324+
SqlMetaData[] metaData = new SqlMetaData[]
325+
{
326+
new SqlMetaData("col1", SqlDbType.NVarChar, 1)
327+
};
328+
SqlDataRecord record = new SqlDataRecord(metaData);
329+
record.SetValue(0, "a");
330+
Assert.Throws<InvalidCastException>(() => getXXX(record));
331+
332+
}
333+
334+
[Theory]
335+
[ClassData(typeof(GetXXXCheckValueTestData))]
336+
public void GetXXX_ReturnValue(SqlDbType dbType, object value, Func<SqlDataRecord, object> getXXX)
337+
{
338+
SqlMetaData[] metaData = new SqlMetaData[]
339+
{
340+
new SqlMetaData("col1", dbType)
341+
};
342+
SqlDataRecord record = new SqlDataRecord(metaData);
343+
record.SetValue(0, value);
344+
Assert.Equal(value, getXXX(record));
345+
346+
}
347+
}
348+
349+
public class GetXXXBadTypeTestData : IEnumerable<object[]>
350+
{
351+
public IEnumerator<object[]> GetEnumerator()
352+
{
353+
yield return new object[] { new Func<SqlDataRecord, object>(r => r.GetGuid(0)) };
354+
yield return new object[] { new Func<SqlDataRecord, object>(r => r.GetInt16(0)) };
355+
yield return new object[] { new Func<SqlDataRecord, object>(r => r.GetInt32(0)) };
356+
yield return new object[] { new Func<SqlDataRecord, object>(r => r.GetInt64(0)) };
357+
yield return new object[] { new Func<SqlDataRecord, object>(r => r.GetFloat(0)) };
358+
yield return new object[] { new Func<SqlDataRecord, object>(r => r.GetDouble(0)) };
359+
yield return new object[] { new Func<SqlDataRecord, object>(r => r.GetDecimal(0)) };
360+
yield return new object[] { new Func<SqlDataRecord, object>(r => r.GetDateTime(0)) };
361+
yield return new object[] { new Func<SqlDataRecord, object>(r => r.GetDateTimeOffset(0)) };
362+
yield return new object[] { new Func<SqlDataRecord, object>(r => r.GetTimeSpan(0)) };
363+
}
364+
365+
IEnumerator IEnumerable.GetEnumerator()
366+
{
367+
return GetEnumerator();
368+
}
369+
}
370+
371+
public class GetXXXCheckValueTestData : IEnumerable<object[]>
372+
{
373+
public IEnumerator<object[]> GetEnumerator()
374+
{
375+
yield return new object[] { SqlDbType.UniqueIdentifier, Guid.NewGuid(), new Func<SqlDataRecord, object>(r => r.GetGuid(0)) };
376+
yield return new object[] { SqlDbType.SmallInt, (Int16)123, new Func<SqlDataRecord, object>(r => r.GetInt16(0)) };
377+
yield return new object[] { SqlDbType.Int, 123456, new Func<SqlDataRecord, object>(r => r.GetInt32(0)) };
378+
yield return new object[] { SqlDbType.BigInt, (Int64)123456789, new Func<SqlDataRecord, object>(r => r.GetInt64(0)) };
379+
yield return new object[] { SqlDbType.Float, (Double)1.2, new Func<SqlDataRecord, object>(r => r.GetDouble(0)) };
380+
yield return new object[] { SqlDbType.Real, (Single)1.2, new Func<SqlDataRecord, object>(r => r.GetFloat(0)) };
381+
yield return new object[] { SqlDbType.Decimal, 1.2m, new Func<SqlDataRecord, object>(r => r.GetDecimal(0)) };
382+
yield return new object[] { SqlDbType.DateTime, DateTime.Now, new Func<SqlDataRecord, object>(r => r.GetDateTime(0)) };
383+
yield return new object[] { SqlDbType.DateTimeOffset, new DateTimeOffset(DateTime.Now), new Func<SqlDataRecord, object>(r => r.GetDateTimeOffset(0)) };
384+
yield return new object[] { SqlDbType.Time, TimeSpan.FromHours(1), new Func<SqlDataRecord, object>(r => r.GetTimeSpan(0)) };
385+
}
386+
387+
IEnumerator IEnumerable.GetEnumerator()
388+
{
389+
return GetEnumerator();
390+
}
391+
}
392+
[SqlUserDefinedType(Format.UserDefined)]
393+
public class TestUdt
394+
{
139395

140396
}
141397
}

0 commit comments

Comments
 (0)