Created
October 30, 2013 08:16
-
-
Save ntk1000/7228852 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using Microsoft.VisualStudio.TestTools.UnitTesting; | |
using System.Collections.Generic; | |
using System.Linq; | |
namespace Test | |
{ | |
[TestClass] | |
public class BootDayTest | |
{ | |
#region privatemember | |
private DateTime now = DateTime.Now; | |
private DateTime today = DateTime.Today; | |
private int mon = 1; | |
private int tue = 2; | |
private int wed = 4; | |
private int thu = 8; | |
private int fri = 16; | |
private int sat = 32; | |
private int sun = 64; | |
#endregion | |
private enum WDBit | |
{ | |
Monday = 1, | |
Tuesday = 2, | |
Wednesday = 4, | |
Thursday = 8, | |
Friday = 16, | |
Saturday = 32, | |
Sunday = 64 | |
} | |
#region property | |
/// <summary> | |
/// t_exe_controlのboot_daysを想定 | |
/// Test用 | |
/// </summary> | |
public int BootDays { get; private set; } | |
/// <summary> | |
/// DateTime.Now.DayOfWeekを想定 | |
/// Test用 | |
/// </summary> | |
public DayOfWeek NowDOW { get; private set; } | |
/// <summary> | |
/// DateTime.Nowを想定 | |
/// Test用 | |
/// </summary> | |
public DateTime NowDate { get; private set; } | |
/// <summary> | |
/// ロジックで判断された直近の曜日 | |
/// </summary> | |
public DayOfWeek TargetDOW { get; private set; } | |
/// <summary> | |
/// ロジックで判断された直近の起動日時 | |
/// </summary> | |
public DateTime TargetDate { get; private set; } | |
#endregion | |
/// <summary> | |
/// Extract Method | |
/// </summary> | |
public void WD2Bit2WD() | |
{ | |
//指定曜日以降でソートし直す | |
var TommorowList = Enum.GetValues(typeof(DayOfWeek)) | |
.OfType<DayOfWeek>() | |
.OrderBy(x => x <= NowDOW) | |
.ToList(); | |
//指定曜日以降でループ | |
foreach (var weekday in TommorowList) | |
{ | |
var bit = (int)(WDBit)Enum.Parse(typeof(WDBit),weekday.ToString()); | |
if ((BootDays & bit) == bit) | |
{ | |
//見つかればループ抜ける | |
TargetDOW = weekday; | |
break; | |
}; | |
} | |
this.ExtractRecentDay(); | |
} | |
/// <summary> | |
/// 直近の指定曜日日付を取得する | |
/// http://d.hatena.ne.jp/fyts/20071023/date | |
/// </summary> | |
public void ExtractRecentDay() | |
{ | |
TargetDate = NowDate.AddDays( | |
((int)(DayOfWeek.Saturday - NowDate.DayOfWeek + TargetDOW) % 7) + 1); | |
} | |
[TestMethod] | |
public void WD2Bit2WDTest() | |
{ | |
//今日を金曜と仮定する | |
NowDOW = DayOfWeek.Friday; | |
NowDate = DateTime.Parse("2013/10/25"); | |
//金曜のみ起動 | |
//次の金曜がターゲット | |
BootDays = 16; | |
this.WD2Bit2WD(); | |
Assert.AreEqual(DayOfWeek.Friday, TargetDOW); | |
Assert.AreEqual(DateTime.Parse("2013/11/1"), TargetDate); | |
//金土 | |
BootDays = 48; | |
this.WD2Bit2WD(); | |
Assert.AreEqual(DayOfWeek.Saturday, TargetDOW); | |
Assert.AreEqual(DateTime.Parse("2013/10/26"), TargetDate); | |
//金日 | |
BootDays = 80; | |
this.WD2Bit2WD(); | |
Assert.AreEqual(DayOfWeek.Sunday, TargetDOW); | |
Assert.AreEqual(DateTime.Parse("2013/10/27"), TargetDate); | |
//金月 | |
BootDays = 17; | |
this.WD2Bit2WD(); | |
Assert.AreEqual(DayOfWeek.Monday, TargetDOW); | |
Assert.AreEqual(DateTime.Parse("2013/10/28"), TargetDate); | |
//金月火 | |
BootDays = 19; | |
this.WD2Bit2WD(); | |
Assert.AreEqual(DayOfWeek.Monday, TargetDOW); | |
Assert.AreEqual(DateTime.Parse("2013/10/28"), TargetDate); | |
} | |
/// <summary> | |
/// 指定曜日でDayOfWeekのループをずらしたいやつのテスト | |
/// </summary> | |
[TestMethod] | |
public void DayOfWeekRollingTest() | |
{ | |
//デフォルトからループする例:Sunday | |
var List = Enum.GetValues(typeof(DayOfWeek)) | |
.OfType<DayOfWeek>() | |
.ToList(); | |
//var dow = DateTime.Now.DayOfWeek; | |
var dow = DayOfWeek.Friday; | |
//今日からループする例( <= 指定曜日) | |
var TodayList = Enum.GetValues(typeof(DayOfWeek)) | |
.OfType<DayOfWeek>() | |
.OrderBy(x => x < dow) | |
.ToList(); | |
//明日からループする例( < 指定曜日) | |
var TommorowList = Enum.GetValues(typeof(DayOfWeek)) | |
.OfType<DayOfWeek>() | |
.OrderBy(x => x <= dow) | |
.ToList(); | |
} | |
/// <summary> | |
/// DayOfWeekからbitへの変換と | |
/// 論理演算のテスト | |
/// </summary> | |
[TestMethod] | |
public void WeekDayTobitTest() | |
{ | |
var dow = DayOfWeek.Friday; | |
var wdbit = (int)(WDBit)Enum.Parse(typeof(WDBit), dow.ToString()); | |
var flg0 = 16; | |
Assert.IsTrue((flg0 & wdbit) == wdbit); | |
var flg1 = 127; | |
Assert.IsTrue((flg1 & wdbit) == wdbit); | |
var flg2 = 31; | |
Assert.IsTrue((flg2 & wdbit) == wdbit); | |
var flg3 = 111; | |
Assert.IsFalse((flg3 & wdbit) == wdbit); | |
} | |
/// <summary> | |
/// bitflgの考え方、に載っている例が通るかどうかのテスト | |
/// </summary> | |
[TestMethod] | |
public void BitFlgTest() | |
{ | |
Assert.AreEqual(mon, (int)WDBit.Monday); | |
Assert.AreEqual(mon & 1, 1); | |
Assert.AreEqual(mon & 3, 1); | |
Assert.AreEqual(mon & 5, 1); | |
Assert.AreEqual(mon & 7, 1); | |
Assert.AreNotEqual(3 & 1, 3); | |
Assert.AreEqual(3 & 3, 3); | |
Assert.AreNotEqual(3 & 5, 3); | |
Assert.AreEqual(3 & 7, 3); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment