Mercurial > pub > bltoolkit
diff UnitTests/Linq/DateTimeFunctions.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/UnitTests/Linq/DateTimeFunctions.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,601 @@ +using System; +using System.Linq; + +using NUnit.Framework; + +using BLToolkit.Data.DataProvider; +using BLToolkit.Data.Linq; + +namespace Data.Linq +{ + [TestFixture] + public class DateTimeFunctions : TestBase + { + [Test] + public void GetDate() + { + ForEachProvider(db => + { + var q = from p in db.Person where p.ID == 1 select new { Now = Sql.AsSql(Sql.GetDate()) }; + Assert.AreEqual(DateTime.Now.Year, q.ToList().First().Now.Year); + }); + } + + [Test] + public void CurrentTimestamp() + { + ForEachProvider(db => + { + var q = from p in db.Person where p.ID == 1 select new { Now = Sql.CurrentTimestamp }; + Assert.AreEqual(DateTime.Now.Year, q.ToList().First().Now.Year); + }); + } + + [Test] + public void Now() + { + ForEachProvider(db => + { + var q = from p in db.Person where p.ID == 1 select new { DateTime.Now }; + Assert.AreEqual(DateTime.Now.Year, q.ToList().First().Now.Year); + }); + } + + [Test] + public void Parse1() + { + ForEachProvider(db => AreEqual( + from d in from t in Types select DateTime.Parse(Sql.ConvertTo<string>.From(t.DateTimeValue)) where d.Day > 0 select d.Date, + from d in from t in db.Types select DateTime.Parse(Sql.ConvertTo<string>.From(t.DateTimeValue)) where d.Day > 0 select d.Date)); + } + + [Test] + public void Parse2() + { + ForEachProvider(db => AreEqual( + from d in from t in Types select DateTime.Parse(t.DateTimeValue.Year + "-02-24 00:00:00") where d.Day > 0 select d, + from d in from t in db.Types select Sql.AsSql(DateTime.Parse(t.DateTimeValue.Year + "-02-24 00:00:00")) where d.Day > 0 select d)); + } + + #region DatePart + + [Test] + public void DatePartYear() + { + ForEachProvider(db => AreEqual( + from t in Types select Sql.DatePart(Sql.DateParts.Year, t.DateTimeValue), + from t in db.Types select Sql.AsSql(Sql.DatePart(Sql.DateParts.Year, t.DateTimeValue)))); + } + + [Test] + public void DatePartQuarter() + { + ForEachProvider(db => AreEqual( + from t in Types select Sql.DatePart(Sql.DateParts.Quarter, t.DateTimeValue), + from t in db.Types select Sql.AsSql(Sql.DatePart(Sql.DateParts.Quarter, t.DateTimeValue)))); + } + + [Test] + public void DatePartMonth() + { + ForEachProvider(db => AreEqual( + from t in Types select Sql.DatePart(Sql.DateParts.Month, t.DateTimeValue), + from t in db.Types select Sql.AsSql(Sql.DatePart(Sql.DateParts.Month, t.DateTimeValue)))); + } + + [Test] + public void DatePartDayOfYear() + { + ForEachProvider(db => AreEqual( + from t in Types select Sql.DatePart(Sql.DateParts.DayOfYear, t.DateTimeValue), + from t in db.Types select Sql.AsSql(Sql.DatePart(Sql.DateParts.DayOfYear, t.DateTimeValue)))); + } + + [Test] + public void DatePartDay() + { + ForEachProvider(db => AreEqual( + from t in Types select Sql.DatePart(Sql.DateParts.Day, t.DateTimeValue), + from t in db.Types select Sql.AsSql(Sql.DatePart(Sql.DateParts.Day, t.DateTimeValue)))); + } + + [Test] + public void DatePartWeek() + { + ForEachProvider(db => + (from t in db.Types select Sql.AsSql(Sql.DatePart(Sql.DateParts.Week, t.DateTimeValue))).ToList()); + } + + [Test] + public void DatePartWeekDay() + { + ForEachProvider(db => AreEqual( + from t in Types select Sql.DatePart(Sql.DateParts.WeekDay, t.DateTimeValue), + from t in db.Types select Sql.AsSql(Sql.DatePart(Sql.DateParts.WeekDay, t.DateTimeValue)))); + } + + [Test] + public void DatePartHour() + { + ForEachProvider(db => AreEqual( + from t in Types select Sql.DatePart(Sql.DateParts.Hour, t.DateTimeValue), + from t in db.Types select Sql.AsSql(Sql.DatePart(Sql.DateParts.Hour, t.DateTimeValue)))); + } + + [Test] + public void DatePartMinute() + { + ForEachProvider(db => AreEqual( + from t in Types select Sql.DatePart(Sql.DateParts.Minute, t.DateTimeValue), + from t in db.Types select Sql.AsSql(Sql.DatePart(Sql.DateParts.Minute, t.DateTimeValue)))); + } + + [Test] + public void DatePartSecond() + { + ForEachProvider(db => AreEqual( + from t in Types select Sql.DatePart(Sql.DateParts.Second, t.DateTimeValue), + from t in db.Types select Sql.AsSql(Sql.DatePart(Sql.DateParts.Second, t.DateTimeValue)))); + } + + [Test] + public void DatePartMillisecond() + { + ForEachProvider(new[] { ProviderName.Informix, ProviderName.MySql, ProviderName.Access }, db => AreEqual( + from t in Types select Sql.DatePart(Sql.DateParts.Millisecond, t.DateTimeValue), + from t in db.Types select Sql.AsSql(Sql.DatePart(Sql.DateParts.Millisecond, t.DateTimeValue)))); + } + + [Test] + public void Year() + { + ForEachProvider(db => AreEqual( + from t in Types select t.DateTimeValue.Year, + from t in db.Types select Sql.AsSql(t.DateTimeValue.Year))); + } + + [Test] + public void Month() + { + ForEachProvider(db => AreEqual( + from t in Types select t.DateTimeValue.Month, + from t in db.Types select Sql.AsSql(t.DateTimeValue.Month))); + } + + [Test] + public void DayOfYear() + { + ForEachProvider(db => AreEqual( + from t in Types select t.DateTimeValue.DayOfYear, + from t in db.Types select Sql.AsSql(t.DateTimeValue.DayOfYear))); + } + + [Test] + public void Day() + { + ForEachProvider(db => AreEqual( + from t in Types select t.DateTimeValue.Day, + from t in db.Types select Sql.AsSql(t.DateTimeValue.Day))); + } + + [Test] + public void DayOfWeek() + { + ForEachProvider(db => AreEqual( + from t in Types select t.DateTimeValue.DayOfWeek, + from t in db.Types select Sql.AsSql(t.DateTimeValue.DayOfWeek))); + } + + [Test] + public void Hour() + { + ForEachProvider(db => AreEqual( + from t in Types select t.DateTimeValue.Hour, + from t in db.Types select Sql.AsSql(t.DateTimeValue.Hour))); + } + + [Test] + public void Minute() + { + ForEachProvider(db => AreEqual( + from t in Types select t.DateTimeValue.Minute, + from t in db.Types select Sql.AsSql(t.DateTimeValue.Minute))); + } + + [Test] + public void Second() + { + ForEachProvider(db => AreEqual( + from t in Types select t.DateTimeValue.Second, + from t in db.Types select Sql.AsSql(t.DateTimeValue.Second))); + } + + [Test] + public void Millisecond() + { + ForEachProvider(new[] { ProviderName.Informix, ProviderName.MySql, ProviderName.Access }, db => AreEqual( + from t in Types select t.DateTimeValue.Millisecond, + from t in db.Types select Sql.AsSql(t.DateTimeValue.Millisecond))); + } + + [Test] + public void Date() + { + ForEachProvider(db => AreEqual( + from t in Types select Sql.AsSql(t.DateTimeValue.Date), + from t in db.Types select Sql.AsSql(t.DateTimeValue.Date))); + } + + static TimeSpan TruncMiliseconds(TimeSpan ts) + { + return new TimeSpan(ts.Hours, ts.Minutes, ts.Seconds); + } + + [Test] + public void TimeOfDay([DataContexts] string context) + { + using (var db = GetDataContext(context)) + { + AreEqual( + from t in Types select TruncMiliseconds(Sql.AsSql(t.DateTimeValue.TimeOfDay)), + from t in db.Types select TruncMiliseconds(Sql.AsSql(t.DateTimeValue.TimeOfDay))); + } + } + + #endregion + + #region DateAdd + + [Test] + public void DateAddYear() + { + ForEachProvider(db => AreEqual( + from t in Types select Sql.DateAdd(Sql.DateParts.Year, 1, t.DateTimeValue). Value.Date, + from t in db.Types select Sql.AsSql(Sql.DateAdd(Sql.DateParts.Year, 1, t.DateTimeValue)).Value.Date)); + } + + [Test] + public void DateAddQuarter() + { + ForEachProvider(db => AreEqual( + from t in Types select Sql.DateAdd(Sql.DateParts.Quarter, -1, t.DateTimeValue). Value.Date, + from t in db.Types select Sql.AsSql(Sql.DateAdd(Sql.DateParts.Quarter, -1, t.DateTimeValue)).Value.Date)); + } + + [Test] + public void DateAddMonth() + { + ForEachProvider(db => AreEqual( + from t in Types select Sql.DateAdd(Sql.DateParts.Month, 2, t.DateTimeValue). Value.Date, + from t in db.Types select Sql.AsSql(Sql.DateAdd(Sql.DateParts.Month, 2, t.DateTimeValue)).Value.Date)); + } + + [Test] + public void DateAddDayOfYear() + { + ForEachProvider(db => AreEqual( + from t in Types select Sql.DateAdd(Sql.DateParts.DayOfYear, 3, t.DateTimeValue). Value.Date, + from t in db.Types select Sql.AsSql(Sql.DateAdd(Sql.DateParts.DayOfYear, 3, t.DateTimeValue)).Value.Date)); + } + + [Test] + public void DateAddDay() + { + ForEachProvider(db => AreEqual( + from t in Types select Sql.DateAdd(Sql.DateParts.Day, 5, t.DateTimeValue). Value.Date, + from t in db.Types select Sql.AsSql(Sql.DateAdd(Sql.DateParts.Day, 5, t.DateTimeValue)).Value.Date)); + } + + [Test] + public void DateAddWeek() + { + ForEachProvider(db => AreEqual( + from t in Types select Sql.DateAdd(Sql.DateParts.Week, -1, t.DateTimeValue). Value.Date, + from t in db.Types select Sql.AsSql(Sql.DateAdd(Sql.DateParts.Week, -1, t.DateTimeValue)).Value.Date)); + } + + [Test] + public void DateAddWeekDay() + { + ForEachProvider(db => AreEqual( + from t in Types select Sql.DateAdd(Sql.DateParts.WeekDay, 1, t.DateTimeValue). Value.Date, + from t in db.Types select Sql.AsSql(Sql.DateAdd(Sql.DateParts.WeekDay, 1, t.DateTimeValue)).Value.Date)); + } + + [Test] + public void DateAddHour() + { + ForEachProvider(db => AreEqual( + from t in Types select Sql.DateAdd(Sql.DateParts.Hour, 1, t.DateTimeValue). Value.Hour, + from t in db.Types select Sql.AsSql(Sql.DateAdd(Sql.DateParts.Hour, 1, t.DateTimeValue)).Value.Hour)); + } + + [Test] + public void DateAddMinute() + { + ForEachProvider(db => AreEqual( + from t in Types select Sql.DateAdd(Sql.DateParts.Minute, 5, t.DateTimeValue). Value.Minute, + from t in db.Types select Sql.AsSql(Sql.DateAdd(Sql.DateParts.Minute, 5, t.DateTimeValue)).Value.Minute)); + } + + [Test] + public void DateAddSecond() + { + ForEachProvider(db => AreEqual( + from t in Types select Sql.DateAdd(Sql.DateParts.Second, 41, t.DateTimeValue). Value.Second, + from t in db.Types select Sql.AsSql(Sql.DateAdd(Sql.DateParts.Second, 41, t.DateTimeValue)).Value.Second)); + } + + [Test] + public void DateAddMillisecond() + { + ForEachProvider(new[] { ProviderName.Informix, ProviderName.MySql, ProviderName.Access }, + db => (from t in db.Types select Sql.AsSql(Sql.DateAdd(Sql.DateParts.Millisecond, 41, t.DateTimeValue))).ToList()); + } + + [Test] + public void AddYears() + { + ForEachProvider(db => AreEqual( + from t in Types select t.DateTimeValue.AddYears(1). Date, + from t in db.Types select Sql.AsSql(t.DateTimeValue.AddYears(1)).Date)); + } + + [Test] + public void AddMonths() + { + ForEachProvider(db => AreEqual( + from t in Types select t.DateTimeValue.AddMonths(-2). Date, + from t in db.Types select Sql.AsSql(t.DateTimeValue.AddMonths(-2)).Date)); + } + + [Test] + public void AddDays() + { + ForEachProvider(db => AreEqual( + from t in Types select t.DateTimeValue.AddDays(5). Date, + from t in db.Types select Sql.AsSql(t.DateTimeValue.AddDays(5)).Date)); + } + + [Test] + public void AddHours() + { + ForEachProvider(db => AreEqual( + from t in Types select t.DateTimeValue.AddHours(22). Hour, + from t in db.Types select Sql.AsSql(t.DateTimeValue.AddHours(22)).Hour)); + } + + [Test] + public void AddMinutes() + { + ForEachProvider(db => AreEqual( + from t in Types select t.DateTimeValue.AddMinutes(-8). Minute, + from t in db.Types select Sql.AsSql(t.DateTimeValue.AddMinutes(-8)).Minute)); + } + + [Test] + public void AddSeconds() + { + ForEachProvider(db => AreEqual( + from t in Types select t.DateTimeValue.AddSeconds(-35). Second, + from t in db.Types select Sql.AsSql(t.DateTimeValue.AddSeconds(-35)).Second)); + } + + [Test] + public void AddMilliseconds() + { + ForEachProvider(new[] { ProviderName.Informix, ProviderName.MySql, ProviderName.Access }, + db => (from t in db.Types select Sql.AsSql(t.DateTimeValue.AddMilliseconds(221))).ToList()); + } + + #endregion + + #region DateDiff + + [Test] + public void SubDateDay() + { + ForEachProvider( + new[] { ProviderName.Informix, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access }, + db => AreEqual( + from t in Types select (int)(t.DateTimeValue.AddHours(100) - t.DateTimeValue).TotalDays, + from t in db.Types select (int)Sql.AsSql((t.DateTimeValue.AddHours(100) - t.DateTimeValue).TotalDays))); + } + + [Test] + public void DateDiffDay() + { + ForEachProvider( + new[] { ProviderName.Informix, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access }, + db => AreEqual( + from t in Types select Sql.DateDiff(Sql.DateParts.Day, t.DateTimeValue, t.DateTimeValue.AddHours(100)), + from t in db.Types select Sql.AsSql(Sql.DateDiff(Sql.DateParts.Day, t.DateTimeValue, t.DateTimeValue.AddHours(100))))); + } + + [Test] + public void SubDateHour() + { + ForEachProvider( + new[] { ProviderName.Informix, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access }, + db => AreEqual( + from t in Types select (int)(t.DateTimeValue.AddHours(100) - t.DateTimeValue).TotalHours, + from t in db.Types select (int)Sql.AsSql((t.DateTimeValue.AddHours(100) - t.DateTimeValue).TotalHours))); + } + + [Test] + public void DateDiffHour() + { + ForEachProvider( + new[] { ProviderName.Informix, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access }, + db => AreEqual( + from t in Types select Sql.DateDiff(Sql.DateParts.Hour, t.DateTimeValue, t.DateTimeValue.AddHours(100)), + from t in db.Types select Sql.AsSql(Sql.DateDiff(Sql.DateParts.Hour, t.DateTimeValue, t.DateTimeValue.AddHours(100))))); + } + + [Test] + public void SubDateMinute() + { + ForEachProvider( + new[] { ProviderName.Informix, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access }, + db => AreEqual( + from t in Types select (int)(t.DateTimeValue.AddMinutes(100) - t.DateTimeValue).TotalMinutes, + from t in db.Types select (int)Sql.AsSql((t.DateTimeValue.AddMinutes(100) - t.DateTimeValue).TotalMinutes))); + } + + [Test] + public void DateDiffMinute() + { + ForEachProvider( + new[] { ProviderName.Informix, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access }, + db => AreEqual( + from t in Types select Sql.DateDiff(Sql.DateParts.Minute, t.DateTimeValue, t.DateTimeValue.AddMinutes(100)), + from t in db.Types select Sql.AsSql(Sql.DateDiff(Sql.DateParts.Minute, t.DateTimeValue, t.DateTimeValue.AddMinutes(100))))); + } + + [Test] + public void SubDateSecond() + { + ForEachProvider( + new[] { ProviderName.Informix, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access }, + db => AreEqual( + from t in Types select (int)(t.DateTimeValue.AddMinutes(100) - t.DateTimeValue).TotalSeconds, + from t in db.Types select (int)Sql.AsSql((t.DateTimeValue.AddMinutes(100) - t.DateTimeValue).TotalSeconds))); + } + + [Test] + public void DateDiffSecond() + { + ForEachProvider( + new[] { ProviderName.Informix, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access }, + db => AreEqual( + from t in Types select Sql.DateDiff(Sql.DateParts.Second, t.DateTimeValue, t.DateTimeValue.AddMinutes(100)), + from t in db.Types select Sql.AsSql(Sql.DateDiff(Sql.DateParts.Second, t.DateTimeValue, t.DateTimeValue.AddMinutes(100))))); + } + + [Test] + public void SubDateMillisecond() + { + ForEachProvider( + new[] { ProviderName.Informix, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access }, + db => AreEqual( + from t in Types select (int)(t.DateTimeValue.AddSeconds(1) - t.DateTimeValue).TotalMilliseconds, + from t in db.Types select (int)Sql.AsSql((t.DateTimeValue.AddSeconds(1) - t.DateTimeValue).TotalMilliseconds))); + } + + [Test] + public void DateDiffMillisecond() + { + ForEachProvider( + new[] { ProviderName.Informix, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access }, + db => AreEqual( + from t in Types select Sql.DateDiff(Sql.DateParts.Millisecond, t.DateTimeValue, t.DateTimeValue.AddSeconds(1)), + from t in db.Types select Sql.AsSql(Sql.DateDiff(Sql.DateParts.Millisecond, t.DateTimeValue, t.DateTimeValue.AddSeconds(1))))); + } + + #endregion + + #region MakeDateTime + + [Test] + public void MakeDateTime() + { + ForEachProvider(db => AreEqual( + from t in from p in Types select Sql.MakeDateTime(2010, p.ID, 1) where t.Value.Year == 2010 select t, + from t in from p in db.Types select Sql.MakeDateTime(2010, p.ID, 1) where t.Value.Year == 2010 select t)); + } + + [Test] + public void NewDateTime1() + { + ForEachProvider(db => AreEqual( + from t in from p in Types select new DateTime(p.DateTimeValue.Year, 10, 1) where t.Month == 10 select t, + from t in from p in db.Types select new DateTime(p.DateTimeValue.Year, 10, 1) where t.Month == 10 select t)); + } + + [Test] + public void NewDateTime2() + { + ForEachProvider(db => AreEqual( + from p in Types select new DateTime(p.DateTimeValue.Year, 10, 1), + from p in db.Types select new DateTime(p.DateTimeValue.Year, 10, 1))); + } + + [Test] + public void MakeDateTime2() + { + ForEachProvider(db => AreEqual( + from t in from p in Types select Sql.MakeDateTime(2010, p.ID, 1, 20, 35, 44) where t.Value.Year == 2010 select t, + from t in from p in db.Types select Sql.MakeDateTime(2010, p.ID, 1, 20, 35, 44) where t.Value.Year == 2010 select t)); + } + + [Test] + public void NewDateTime3() + { + ForEachProvider(db => AreEqual( + from t in from p in Types select new DateTime(p.DateTimeValue.Year, 10, 1, 20, 35, 44) where t.Month == 10 select t, + from t in from p in db.Types select new DateTime(p.DateTimeValue.Year, 10, 1, 20, 35, 44) where t.Month == 10 select t)); + } + + [Test] + public void NewDateTime4() + { + ForEachProvider(db => AreEqual( + from p in Types select new DateTime(p.DateTimeValue.Year, 10, 1, 20, 35, 44), + from p in db.Types select new DateTime(p.DateTimeValue.Year, 10, 1, 20, 35, 44))); + } + + [Test] + public void NewDateTime5() + { + ForEachProvider(db => AreEqual( + from t in from p in Types select new DateTime(p.DateTimeValue.Year + 1, 10, 1) where t.Month == 10 select t, + from t in from p in db.Types select new DateTime(p.DateTimeValue.Year + 1, 10, 1) where t.Month == 10 select t)); + } + + #endregion + + [Test] + public void GetDateTest1() + { + ForEachProvider( + new[] { ProviderName.PostgreSQL }, + db => + { + var dates = + from v in db.Parent + join s in db.Child on v.ParentID equals s.ParentID + where v.Value1 > 0 + select Sql.GetDate().Date; + + var countByDates = + from v in dates + group v by v into g + select new { g.Key, Count = g.Count() }; + + countByDates.Take(5).ToList(); + }); + } + + [Test] + public void GetDateTest2() + { + ForEachProvider( + //new[] { ProviderName.PostgreSQL }, + db => + { + var dates = + from v in db.Parent + join s in db.Child on v.ParentID equals s.ParentID + where v.Value1 > 0 + select Sql.CurrentTimestamp.Date; + + var countByDates = + from v in dates + group v by v into g + select new { g.Key, Count = g.Count() }; + + countByDates.Take(5).ToList(); + }); + } + } +}