|
| 1 | +using System.Data.Common; |
1 | 2 | using static Microsoft.VisualStudio.TestTools.UnitTesting.Assert; |
2 | 3 |
|
3 | 4 | namespace SqlServerSimulator.Storage; |
@@ -168,4 +169,113 @@ public void CoerceTo_BigIntToInt32_OutOfRangeOverflows() => |
168 | 169 | [TestMethod] |
169 | 170 | public void CoerceTo_BetweenStringAndInt_NotSupported() => |
170 | 171 | Throws<NotSupportedException>(() => SqlValue.FromVarchar("42").CoerceTo(SqlType.Int32)); |
| 172 | + |
| 173 | + [TestMethod] |
| 174 | + public void FromDate_RoundTripsViaAsDate() |
| 175 | + { |
| 176 | + var v = SqlValue.FromDate(new DateOnly(2026, 5, 4)); |
| 177 | + IsFalse(v.IsNull); |
| 178 | + AreSame(SqlType.Date, v.Type); |
| 179 | + AreEqual(new DateOnly(2026, 5, 4), v.AsDate); |
| 180 | + } |
| 181 | + |
| 182 | + [TestMethod] |
| 183 | + [DataRow(1, 1, 1)] // 0001-01-01: minimum |
| 184 | + [DataRow(9999, 12, 31)] // 9999-12-31: maximum |
| 185 | + [DataRow(2026, 5, 4)] |
| 186 | + [DataRow(1900, 1, 1)] |
| 187 | + public void FromDate_PreservesAcrossSupportedRange(int year, int month, int day) |
| 188 | + { |
| 189 | + var d = new DateOnly(year, month, day); |
| 190 | + AreEqual(d, SqlValue.FromDate(d).AsDate); |
| 191 | + } |
| 192 | + |
| 193 | + [TestMethod] |
| 194 | + public void Date_Equals_ComparesDayValue() |
| 195 | + { |
| 196 | + AreEqual(SqlValue.FromDate(new DateOnly(2026, 5, 4)), SqlValue.FromDate(new DateOnly(2026, 5, 4))); |
| 197 | + AreNotEqual(SqlValue.FromDate(new DateOnly(2026, 5, 4)), SqlValue.FromDate(new DateOnly(2026, 5, 5))); |
| 198 | + } |
| 199 | + |
| 200 | + [TestMethod] |
| 201 | + public void Date_CompareTo_OrdersChronologically() |
| 202 | + { |
| 203 | + var earlier = SqlValue.FromDate(new DateOnly(2024, 1, 1)); |
| 204 | + var later = SqlValue.FromDate(new DateOnly(2026, 12, 31)); |
| 205 | + IsTrue(earlier.CompareTo(later) < 0); |
| 206 | + IsTrue(later.CompareTo(earlier) > 0); |
| 207 | + AreEqual(0, earlier.CompareTo(earlier)); |
| 208 | + } |
| 209 | + |
| 210 | + [TestMethod] |
| 211 | + public void Date_ToObject_ReturnsDateTimeAtMidnight() |
| 212 | + { |
| 213 | + var v = SqlValue.FromDate(new DateOnly(2026, 5, 4)); |
| 214 | + var obj = v.ToObject(); |
| 215 | + var dt = IsInstanceOfType<DateTime>(obj); |
| 216 | + AreEqual(new DateTime(2026, 5, 4, 0, 0, 0), dt); |
| 217 | + } |
| 218 | + |
| 219 | + [TestMethod] |
| 220 | + public void Date_NullToObject_ReturnsNull() |
| 221 | + { |
| 222 | + var v = SqlValue.Null(SqlType.Date); |
| 223 | + IsNull(v.ToObject()); |
| 224 | + } |
| 225 | + |
| 226 | + [TestMethod] |
| 227 | + public void Date_AsDate_OnNull_Throws() => |
| 228 | + Throws<InvalidOperationException>(() => SqlValue.Null(SqlType.Date).AsDate); |
| 229 | + |
| 230 | + [TestMethod] |
| 231 | + public void Date_AsDate_OnWrongType_Throws() => |
| 232 | + Throws<InvalidOperationException>(() => SqlValue.FromInt32(1).AsDate); |
| 233 | + |
| 234 | + [TestMethod] |
| 235 | + [DataRow("2026-05-04", 2026, 5, 4)] |
| 236 | + [DataRow("20260504", 2026, 5, 4)] |
| 237 | + [DataRow("2026-05-04T13:45:30", 2026, 5, 4)] |
| 238 | + [DataRow("2026-05-04T13:45:30.1234567", 2026, 5, 4)] |
| 239 | + [DataRow("0001-01-01", 1, 1, 1)] |
| 240 | + [DataRow("9999-12-31", 9999, 12, 31)] |
| 241 | + public void CoerceTo_VarcharToDate_ParsesIsoForms(string text, int year, int month, int day) |
| 242 | + { |
| 243 | + var coerced = SqlValue.FromVarchar(text).CoerceTo(SqlType.Date); |
| 244 | + AreSame(SqlType.Date, coerced.Type); |
| 245 | + AreEqual(new DateOnly(year, month, day), coerced.AsDate); |
| 246 | + } |
| 247 | + |
| 248 | + [TestMethod] |
| 249 | + public void CoerceTo_NVarcharToDate_ParsesIsoForms() |
| 250 | + { |
| 251 | + var coerced = SqlValue.FromNVarchar("2026-05-04").CoerceTo(SqlType.Date); |
| 252 | + AreEqual(new DateOnly(2026, 5, 4), coerced.AsDate); |
| 253 | + } |
| 254 | + |
| 255 | + [TestMethod] |
| 256 | + [DataRow("not a date")] |
| 257 | + [DataRow("")] |
| 258 | + [DataRow("2026-13-01")] // invalid month |
| 259 | + [DataRow("Jan 15, 2026")] // locale-sensitive form not handled |
| 260 | + public void CoerceTo_BadStringToDate_RaisesConversionFailed(string text) |
| 261 | + { |
| 262 | + var ex = Throws<DbException>(() => SqlValue.FromVarchar(text).CoerceTo(SqlType.Date)); |
| 263 | + AreEqual("Conversion failed when converting date and/or time from character string.", ex.Message); |
| 264 | + } |
| 265 | + |
| 266 | + [TestMethod] |
| 267 | + public void CoerceTo_DateToVarchar_FormatsIso() |
| 268 | + { |
| 269 | + var coerced = SqlValue.FromDate(new DateOnly(2026, 5, 4)).CoerceTo(SqlType.Varchar); |
| 270 | + AreSame(SqlType.Varchar, coerced.Type); |
| 271 | + AreEqual("2026-05-04", coerced.AsString); |
| 272 | + } |
| 273 | + |
| 274 | + [TestMethod] |
| 275 | + public void CoerceTo_DateToNVarchar_FormatsIso() |
| 276 | + { |
| 277 | + var coerced = SqlValue.FromDate(new DateOnly(2026, 5, 4)).CoerceTo(SqlType.NVarchar); |
| 278 | + AreSame(SqlType.NVarchar, coerced.Type); |
| 279 | + AreEqual("2026-05-04", coerced.AsString); |
| 280 | + } |
171 | 281 | } |
0 commit comments