developer's diary

最近はc#のエントリが多いです

C# (dotnetcore)で標準出力を利用して進行中のスピナーを作る (2)

前回の記事

mitsugeek.net

前回は、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を設定できてしまう。

その場合、不整合が生じるので、対策が必要ですね。

ひとまず。ここまで。続きは次回。

mitsugeek.net