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を設定できてしまう。
その場合、不整合が生じるので、対策が必要ですね。
ひとまず。ここまで。続きは次回。