C# (dotnetcore)で標準出力を利用して進行中のスピナーを作る (2)
前回の記事
前回は、Minimumプロパティの実装まで実施しました。
Maximumプロパティの実装
ProgressBar.Maximum を参考に。
ひとまずは、Minimumと似たような実装で大丈夫そうです。 違いは既定値が100というところ。
private int maximum = 100;
/// <summary>コントロールの範囲の最大値を取得または設定します。</summary>
public int Maximum {
get
{
return maximum;
}
set
{
if ((value < 0))
throw new ArgumentException("プロパティに対して指定された値が 0 未満です。");
maximum = value;
}
}
テストを実装
[Fact]
public void MaximumDefaultTest()
{
ConsoleProgressSpiner c = new ConsoleProgressSpiner();
Assert.Equal(100, c.Maximum);
}
[Fact]
public void MaximumSetterArgumentExceptionTest()
{
ConsoleProgressSpiner c = new ConsoleProgressSpiner();
var ex = Assert.Throws<ArgumentException>(() =>
{
c.Maximum = -1;
});
Assert.IsType<ArgumentException>(ex);
Assert.Equal("プロパティに対して指定された値が 0 未満です。", ex.Message);
}
Valueプロパティの実装
ProgressBar.Value を参考に
既定値は 0 です。 例外は、ArgumentExceptionで、Minimum〜Maximumの範囲外だと例外をスローする。
valueという値は、予約後なんですが、set メソッド内だけで特別な意味を持ちます。 今回は、thisキーワードを利用することで、問題なく利用できています。
private int value = 0; /// <summary>プログレス バーの現在位置を取得または設定します。</summary> public int Value { get { return this.value; } set { if (value < this.Minimum) throw new ArgumentException("指定された値が Minimum プロパティの値未満です。"); if (value > this.Maximum) throw new ArgumentException("指定された値が Maximum プロパティの値を超えます。"); this.value = value; } }
テストを実装
[Fact]
public void ValueDefaultTest()
{
ConsoleProgressSpiner c = new ConsoleProgressSpiner();
Assert.Equal(0, c.Value);
}
[Fact]
public void ValueSetterMinArgumentExceptionTest()
{
ConsoleProgressSpiner c = new ConsoleProgressSpiner();
var ex = Assert.Throws<ArgumentException>(() =>
{
c.Value = -1;
});
Assert.IsType<ArgumentException>(ex);
Assert.Equal("指定された値が Minimum プロパティの値未満です。", ex.Message);
}
[Fact]
public void ValueSetterMaxArgumentExceptionTest()
{
ConsoleProgressSpiner c = new ConsoleProgressSpiner();
var ex = Assert.Throws<ArgumentException>(() =>
{
c.Value = 101;
});
Assert.IsType<ArgumentException>(ex);
Assert.Equal("指定された値が Maximum プロパティの値を超えます。", ex.Message);
}
value設定後に、Maximum、Minimumに値を設定すると矛盾が生じる
valueに50を設定後に、Minimumに60を設定できてしまう。
または、Maximumに40を設定できてしまう。
その場合、不整合が生じるので、対策が必要ですね。
ひとまず。ここまで。続きは次回。