Skip to content

Instantly share code, notes, and snippets.

@ntk1000
Created October 30, 2013 08:16
Show Gist options
  • Save ntk1000/7228852 to your computer and use it in GitHub Desktop.
Save ntk1000/7228852 to your computer and use it in GitHub Desktop.
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