public void スクロールすると例外が発生する不具合()
 {
     {
         var help = new HelpWithScroll<int>();
         help.Items = new int[0];
         help.NumberOfItemsToBeShown = 1;
         help.ScrollDown();
         help.ScrollUp();
     }
     {
         var help = new HelpWithScroll<int>();
         help.Items = new [] { 1, 2, 3, };
         help.NumberOfItemsToBeShown = 5;
         help.ScrollDown();
         help.ScrollUp();
     }
     {
         var help = new HelpWithScroll<int>();
         help.Items = new [] { 1, 2, 3, };
         help.NumberOfItemsToBeShown = 3;
         help.ScrollDown();
         help.ScrollUp();
     }
 }
        public void Test0()
        {
            var help = new HelpWithScroll<int>();

            Assert.Throws<ArgumentOutOfRangeException>(() =>
            {
                help.NumberOfItemsToBeShown = 0;
            });

            Assert.AreEqual(10, help.NumberOfItemsToBeShown);
            help.NumberOfItemsToBeShown = 1;
            Assert.AreEqual(1, help.NumberOfItemsToBeShown);

            var items = new [] { 1, 2, };
            help.Items = items;

            Assert.AreEqual(0, help.NumberOfUpperItems);
            Assert.AreEqual(1, help.NumberOfLowerItems);
            CollectionAssert.AreEqual(new [] { 1, }, help.GetItemsToBeShown());

            Assert.Throws<ArgumentOutOfRangeException>(() =>
            {
                help.ScrollDown(0);
            });
            Assert.Throws<ArgumentOutOfRangeException>(() =>
            {
                help.ScrollUp(0);
            });

            var count = 0;
            help.UpdateScreen += (sender, e) =>
            {
                count++;
            };
            Assert.AreEqual(0, count);

            help.ScrollDown(10);
            Assert.AreEqual(1, help.NumberOfUpperItems);
            Assert.AreEqual(0, help.NumberOfLowerItems);
            CollectionAssert.AreEqual(new [] { 2, }, help.GetItemsToBeShown());
            Assert.AreEqual(1, count);
            Assert.True(help.NeedToShowButtonToScrollUp);
            Assert.False(help.NeedToShowButtonToScrollDown);

            help.ScrollDown(10);
            Assert.AreEqual(1, help.NumberOfUpperItems);
            Assert.AreEqual(0, help.NumberOfLowerItems);
            CollectionAssert.AreEqual(new [] { 2, }, help.GetItemsToBeShown());
            Assert.AreEqual(1, count);
            Assert.True(help.NeedToShowButtonToScrollUp);
            Assert.False(help.NeedToShowButtonToScrollDown);

            help.ScrollUp(10);
            Assert.AreEqual(0, help.NumberOfUpperItems);
            Assert.AreEqual(1, help.NumberOfLowerItems);
            CollectionAssert.AreEqual(new [] { 1, }, help.GetItemsToBeShown());
            Assert.AreEqual(2, count);
            Assert.False(help.NeedToShowButtonToScrollUp);
            Assert.True(help.NeedToShowButtonToScrollDown);

            help.ScrollUp(10);
            Assert.AreEqual(0, help.NumberOfUpperItems);
            Assert.AreEqual(1, help.NumberOfLowerItems);
            CollectionAssert.AreEqual(new [] { 1, }, help.GetItemsToBeShown());
            Assert.AreEqual(2, count);
            Assert.False(help.NeedToShowButtonToScrollUp);
            Assert.True(help.NeedToShowButtonToScrollDown);

            var help2 = new HelpWithScroll<int>(99);
            Assert.AreEqual(99, help2.NumberOfItemsToBeShown);
        }
        public DaimonState(EPuzzleWindow window, Daimon daimon, int numberOfItemsToBeShown = 16)
            : base(window)
        {
            _helpWithScroll = new HelpWithScroll<Chumon>(numberOfItemsToBeShown);
            Daimon = daimon;
            DrawingObjectRoot.BackColor = EPuzzleColors.DaimonStateBackColor;

            PropertyChanged += (sender, e) =>
            {
                if ("CurrentItem" != e.PropertyName) return;
                var chumonButton = CurrentItem as ChumonButton;
                if (null != chumonButton)
                {
                    _kirokuBox.Chumon = chumonButton.Chumon;
                    _kirokuInfoBox.Chumon = chumonButton.Chumon;
                }
            };
            Action0 += (sender, e) =>
            {
                var chumonButton = CurrentItem as ChumonButton;
                if (null != chumonButton)
                {
                    Chumonを開始する(chumonButton.Chumon, this);
                    return;
                }
                var daimonButton = CurrentItem as DaimonButton;
                if (null != daimonButton)
                {
                    Window.State = FoFi(this, new DaimonState(Window, daimonButton.Daimon));
                    return;
                }
                var button = CurrentItem as EigoTestButtonItem;
                if (null != button)
                {
                    switch (button.Name)
                    {
                        case "upButton" :
                        {
                            _helpWithScroll.ScrollUp();
                            return;
                        }
                        case "downButton" :
                        {
                            _helpWithScroll.ScrollDown();
                            return;
                        }
                    }
                    var chumon = button.Tag as Chumon;
                    if (null != chumon)
                    {
                        Chumonを開始する(chumon, this);
                        return;
                    }
                }
            };
            ActionLeft += (sender, e) =>
            {
                MoveToPreviousDaimon();
            /*				if (null == Daimon.PreviousItem) return;
                Window.State = FoFi(this, new DaimonState(Window, (Daimon)Daimon.PreviousItem));
                */
            };
            ActionRight += (sender, e) =>
            {
                MoveToNextDaimon();
            /*				if (null == Daimon.NextItem) return;
                Window.State = FoFi(this, new DaimonState(Window, (Daimon)Daimon.NextItem));
                */
            };
            ActionUp += (sender, e) =>
            {
                if (null == Daimon.Parent.PreviousItem) return;
                MoveTo((MondaiDocument)Daimon.Parent.PreviousItem);
            };
            ActionDown += (sender, e) =>
            {
                if (null == Daimon.Parent.NextItem) return;
                MoveTo((MondaiDocument)Daimon.Parent.NextItem);
            };
            _helpWithScroll.UpdateScreen += (sender, e) =>
            {
                UpdateItemsToBeDrawn();
            };
            UpdateItemsToBeDrawn();
        }