public void DrawingObjectの位置交換()
        {
            var window = new EPuzzleWindow();
            var state = new WindowState(window);
            window.State = state;

            var container0 = new DrawingObjectContainer()
            {
                Position = DrawingObjectPosition.Relative,
                MarginLeft = 1f, MarginTop = 10f,
                Height = 100,
            };
            state.Items.Add(container0);
            var container1 = new DrawingObjectContainer()
            {
                Position = DrawingObjectPosition.Relative,
                MarginLeft = 1f, MarginTop = 10f,
                Height = 100,
            };
            state.Items.Add(container1);

            var a = new EigoTestLabelItem()
            {
                Position = DrawingObjectPosition.Absolute,
                Width = 10, Height = 100,
                Name = "a",
            };
            container0.Items.Add(a);
            var b = new EigoTestLabelItem()
            {
                Position = DrawingObjectPosition.Absolute,
                Left = 0, Top = 0,
                Width = 20, Height = 100,
                Name = "b",
            };
            container1.Items.Add(b);
            var c = new EigoTestLabelItem()
            {
                Position = DrawingObjectPosition.Absolute,
                Left = 21, Top = 0,
                Width = 10, Height = 100,
                Name = "c",
            };
            container1.Items.Add(c);

            // container0
            Assert.AreEqual(1, container0.BorderLeft);
            Assert.AreEqual(10, container0.BorderTop);
            Assert.AreEqual(100, container0.Height);
            CollectionAssert.AreEqual(new [] { a, }, container0.Items);

            // container1
            Assert.AreEqual(1, container1.BorderLeft);
            Assert.AreEqual(120, container1.BorderTop);
            Assert.AreEqual(100, container1.Height);
            CollectionAssert.AreEqual(new [] { b, c, }, container1.Items);

            // a
            Assert.AreEqual("a", a.Name);
            Assert.AreEqual(1, a.OuterLeft);
            Assert.AreEqual(10, a.OuterTop);
            Assert.AreEqual(11, a.OuterRight);
            Assert.AreEqual(110, a.OuterBottom);

            // b
            Assert.AreEqual("b", b.Name);
            Assert.AreEqual(1, b.OuterLeft);
            Assert.AreEqual(120, b.OuterTop);
            Assert.AreEqual(21, b.OuterRight);
            Assert.AreEqual(220, b.OuterBottom);

            // c
            Assert.AreEqual("c", c.Name);
            Assert.AreEqual(22, c.OuterLeft);
            Assert.AreEqual(120, c.OuterTop);
            Assert.AreEqual(32, c.OuterRight);
            Assert.AreEqual(220, c.OuterBottom);

            WindowState.NowObject = new TestNowObject();
            WindowState.NowObject.Now = DateTime.MinValue;

            var idouJikan = TimeSpan.FromSeconds(1d);
            state.場所の入れ換え(a, c, idouJikan);

            var aa = state.Items.Single(x => "a" == x.Name);
            var cc = state.Items.Single(x => "c" == x.Name);

            Assert.False(a.IsClickable);
            Assert.False(a.IsVisible);
            Assert.False(c.IsClickable);
            Assert.False(c.IsVisible);

            Assert.False(aa.IsClickable);
            Assert.True(aa.IsVisible);
            Assert.AreEqual(DrawingObjectPosition.Absolute, aa.Position);
            Assert.AreSame(state.DrawingObjectRoot, aa.Parent);
            Assert.AreEqual(a.OuterLeft, aa.OuterLeft);
            Assert.AreEqual(a.OuterTop, aa.OuterTop);
            Assert.AreEqual(a.OuterWidth, aa.OuterWidth);

            Assert.False(cc.IsClickable);
            Assert.True(cc.IsVisible);
            Assert.AreEqual(DrawingObjectPosition.Absolute, cc.Position);
            Assert.AreSame(state.DrawingObjectRoot, cc.Parent);
            Assert.AreEqual(c.OuterLeft, cc.OuterLeft);
            Assert.AreEqual(c.OuterTop, cc.OuterTop);
            Assert.AreEqual(c.OuterWidth, cc.OuterWidth);

            // 移動中
            WindowState.NowObject.Now += TimeSpan.FromTicks((int)Math.Round(idouJikan.Ticks * 0.5f));
            window.Tick();

            Assert.AreEqual(c.OuterLeft + (a.OuterLeft - c.OuterLeft) * 0.5f, cc.OuterLeft, 0.1f);
            Assert.AreEqual(c.OuterTop + (a.OuterTop - c.OuterTop) * 0.5f, cc.OuterTop, 0.1f);
            Assert.AreEqual(c.Width + (a.Width - c.Width) * 0.5f, c.Width, 0.1f);

            Assert.AreEqual(a.OuterLeft + (c.OuterLeft - a.OuterLeft) * 0.5f, aa.OuterLeft, 0.1f);
            Assert.AreEqual(a.OuterTop + (c.OuterTop - a.OuterTop) * 0.5f, aa.OuterTop, 0.1f);
            Assert.AreEqual(a.Width + (c.Width - a.Width) * 0.5f, a.Width, 0.1f);

            // 場所の入れ換え完了
            WindowState.NowObject.Now += idouJikan;
            window.Tick();

            CollectionAssert.DoesNotContain(state.GetAllItems(), a);
            CollectionAssert.DoesNotContain(state.GetAllItems(), c);
            Assert.Null(a.Parent);
            Assert.Null(c.Parent);
            CollectionAssert.AreEqual(new [] { cc, }, container0.Items);
            CollectionAssert.AreEqual(new [] { b, aa }, container1.Items);
            Assert.True(aa.IsClickable);
            Assert.True(aa.IsVisible);
            Assert.True(cc.IsClickable);
            Assert.True(cc.IsVisible);

            // cc
            Assert.AreEqual("c", cc.Name);
            Assert.AreEqual(1, cc.OuterLeft);
            Assert.AreEqual(10, cc.OuterTop);
            Assert.AreEqual(11, cc.OuterRight);
            Assert.AreEqual(110, cc.OuterBottom);

            // aa
            Assert.AreEqual("a", aa.Name);
            Assert.AreEqual(22, aa.OuterLeft);
            Assert.AreEqual(120, aa.OuterTop);
            Assert.AreEqual(32, aa.OuterRight);
            Assert.AreEqual(220, aa.OuterBottom);
        }
        public void AnkimonStateへの遷移()
        {
            EPuzzleWindow window = null;
            using (var tempDirectory = new TempDirectory(true))
            {
                tempDirectory.AddFile(@"mondai\MondaiDocument.xml", TestResources.Mondai03);
                tempDirectory.AddFile(@"help\HelpDocument.xml", TestResources.HelpDocumentXml);

                var ePuzzleData = EPuzzleData.Create(tempDirectory.Name);
                var data = ePuzzleData;
                var userInfo = ePuzzleData.CurrentUserInfo;
                WindowState.NowObject = new TestNowObject();

                var t0 = new DateTime(2013, 8, 22, 0, 0, 0); // UTC
                WindowState.NowObject.Now = t0;
                window = new EPuzzleWindow(ePuzzleData);

                var a = new Fish.eigotest.TestState(window);
                a.MoveToStartGameState();

                Assert.IsInstanceOf<FadeoutState>(window.State);
                EPuzzleTime.Now += TimeSpan.FromSeconds(5d);
                window.Tick();
                Assert.IsInstanceOf<FadeinState>(window.State);
                EPuzzleTime.Now += TimeSpan.FromSeconds(5d);
                window.Tick();

                userInfo.SetLastDaimonInfo(new LastDaimonInfo(data.CurrentMondaiDocument.Id, "daimon3", t0));
                userInfo.MondaiResults.AddNew("3-1", t0, TimeSpan.FromSeconds(1d));
                userInfo.MondaiResults.AddNew("3-2", t0, TimeSpan.FromSeconds(1d));

                // ゲームスタート画面
                Assert.IsInstanceOf<StartGameState>(window.State);
                {
                    var item = window.State.Items.First(x => x.Name == "StartGameButton");
                    item.OnClick(new MouseEventInfo(MouseButtons.Left));
                }
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();

                Assert.IsInstanceOf<MondaiDocumentMenuState>(window.State);
                {
                    var button = window.State.GetAllItems().Where(x => x.Tag is MondaiDocument).First();
                    window.State.CurrentItem = button;
                    window.State.OnAction0();
                }
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();

                var daimonState = (DaimonState)window.State;
                Assert.IsInstanceOf<DaimonState>(daimonState);
                Assert.AreEqual("daimon3", daimonState.Daimon.Id);

                var chumonButton = daimonState.GetAllItems().OfType<ChumonButton>().Single(x => "3-3" == x.Chumon.Id);
                window.State.CurrentItem = chumonButton;
                window.State.OnAction0();
                window.Tick();

                Assert.IsInstanceOf<ClickDeKaishiState>(window.State);
                window.State.OnAction0();
                window.Tick();

                Assert.IsInstanceOf<AnkimonState>(window.State);
                var ankimonState = (AnkimonState)window.State;
                var ankimonRowContainer0 = ankimonState.GetAllItems().OfType<AnkimonRowContainer>().First();
                var ankimonRowContainer1 = ankimonState.GetAllItems().OfType<AnkimonRowContainer>().ElementAt(1);
                Assert.False(ankimonState.正解判定());

                // Action3でエスケープステートに
                window.State.OnAction3();
                Assert.IsInstanceOf<PauseState>(window.State);
                window.State.OnAction3();
                Assert.IsInstanceOf<AnkimonState>(window.State);

                var wordCards = ankimonRowContainer0.GetAllItems().Concat(ankimonRowContainer1.GetAllItems()).
                    Where(x => x is WordCard).ToArray();

                ankimonRowContainer0.WordCardContainer.Items.Clear();
                ankimonRowContainer1.WordCardContainer.Items.Clear();

                Assert.False(ankimonState.正解判定());
                ankimonRowContainer0.WordCardContainer.Items.Add(wordCards.First(x => x.Text == "swim"));
                ankimonRowContainer0.WordCardContainer.Items.Add(wordCards.First(x => x.Text == "swam"));
                ankimonRowContainer0.WordCardContainer.Items.Add(wordCards.First(x => x.Text == "swum"));
                ankimonRowContainer1.WordCardContainer.Items.Add(wordCards.First(x => x.Text == "run"));
                ankimonRowContainer1.WordCardContainer.Items.Add(wordCards.First(x => x.Text == "ran"));
                ankimonRowContainer1.WordCardContainer.Items.Add(wordCards.Where(x => x.Text == "run").ElementAt(1));
                Assert.True(ankimonState.正解判定());

                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();

                Assert.IsInstanceOf<ShomonState>(window.State);
                window.Tick();

                var shomonState = (ShomonState)window.State;
                var wordCard0 = shomonState.GetAllItems().First(x => "This is" == x.Text);
                Assert.NotNull(wordCard0);
                var wordCard1 = shomonState.GetAllItems().First(x => "a ball." == x.Text);
                Assert.NotNull(wordCard1);

                window.State.CurrentItem = wordCard0;
                window.State.OnAction0();
                window.Tick();
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();

                window.State.CurrentItem = wordCard1;
                window.State.OnAction0();
                window.Tick();
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();
                window.Tick();

                var kaitouBox = (CardBox)shomonState.GetAllItems().First(x => "kaitouBox" == x.Name);
                Assert.AreEqual("This is a ball.", MondaiWord.Join(kaitouBox.GetAllItems().OfType<WordCard>().Select(x => x.MondaiWord).ToArray()));

                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();

                Assert.IsInstanceOf<AnkimonState>(window.State);
            }
        }
        public void CurrentItemTest()
        {
            var window = new EPuzzleWindow();
            var testState1 = new Fish.eigotest.TestState(window);
            Assert.Null(testState1.CurrentItem);

            var button = new EigoTestButtonItem()
            {
                Left = 100,
                Top = 100,
                Width = 100,
                Height = 100,
            };
            testState1.Items.Add(button);
            window.State = testState1;
            Assert.AreSame(button, testState1.CurrentItem);

            var label = new EigoTestLabelItem();
            testState1.Items.Add(label);
            Assert.Throws<ArgumentException>(() =>
            {
                testState1.CurrentItem = label;
            });
            var button3 = new EigoTestButtonItem()
            {
                Left = 300,
                Top = 300,
                Width = 10,
                Height = 10,
            };
            window.State.Items.Add(button3);

            Assert.AreSame(button, testState1.CurrentItem);
            window.MouseMove(button3.BorderLeft, button3.BorderTop);
            window.Tick();
            Assert.AreSame(button3, testState1.CurrentItem);
        }
        public void Test2()
        {
            MondaiDocument doc = null;
            using (var tempFile = new TempFile(TestResources.Mondai03))
            {
                doc = MondaiDocument.Load(tempFile.FileName);
            }
            var window = new EPuzzleWindow();
            var ankimon = (Ankimon)doc.GetAllItems().First(x => "3-3-1" == x.Id);
            CollectionAssert.AreEqual(new [] { "swim", "swam", "swum", "run", "ran", "run" }, ankimon.GetMondaiWords().Select(x => x.Text));

            var ankimonState = new AnkimonState(window, ankimon);
            Assert.AreSame(ankimon, ankimonState.Ankimon);

            WindowState.NowObject = new TestNowObject();
            var t0 = new DateTime(2013, 8, 22, 0, 0, 0); // UTC
            WindowState.NowObject.Now = t0;

            window.State = ankimonState;

            var xxx = window.State.GetAllItems().OfType<WordCard>().ToArray();
            var a = xxx[0];
            var b = xxx[3];
            var parentOfA = a.Parent;
            var parentOfB = b.Parent;
            Assert.AreSame(a.Parent, xxx[1].Parent);
            Assert.AreNotSame(parentOfA, parentOfB);
            Assert.AreSame(window.State.CurrentItem, a);
            /*
            WindowState.NowObject.Now += TimeSpan.FromSeconds(0.1d);
            window.Tick();
            */

            // WordCardにAction0で選択
            window.State.OnAction0();
            Assert.True(a.IsSelected);
            Assert.AreSame(a, window.State.GetAllItems().Single(x => x.IsSelected));

            // WordCardにAction0で選択、2回目
            window.State.OnAction0();
            Assert.True(a.IsSelected);
            Assert.AreSame(a, window.State.GetAllItems().Single(x => x.IsSelected));

            // Action1で選択解除
            window.State.OnAction1();
            Assert.False(window.State.GetAllItems().Any(x => x.IsSelected));

            // WordCardにAction0で選択
            window.State.OnAction0();
            Assert.True(a.IsSelected);
            Assert.AreSame(a, window.State.GetAllItems().Single(x => x.IsSelected));

            // カード交換開始
            window.State.CurrentItem = b;
            if ("run" == b.Text)
            {
                Assert.Pass("'run', 'run'は交換しないのでテストはここで終了");
            }
            window.State.OnAction0();
            Assert.False(window.State.GetAllItems().OfType<WordCard>().Where(x => x.IsSelected).Any());

            // カード交換完了
            WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
            window.Tick();

            // カード交換で正解した場合は、次へ遷移してしまうのでここでエラー

            var xxxx = window.State.GetAllItems().OfType<WordCard>().ToArray();
            Assert.False(xxxx.Any(x => x.IsSelected));
            Assert.AreEqual(6, xxxx.Count());
            var aa = xxxx[0];
            var bb = xxxx[3];
            Assert.AreEqual(a.Text, bb.Text);
            Assert.AreEqual(b.Text, aa.Text);

            // マウスクリックテスト
            window.MouseMove(aa.BorderLeft, aa.BorderTop);
            window.Tick();
            Assert.AreSame(aa, window.State.CurrentItem);
            window.MouseUp(aa.BorderLeft, aa.BorderTop, MouseButtons.Left);
            Assert.True(aa.IsSelected);

            // 右クリックで選択を全解除
            window.State.CurrentItem = bb;
            window.MouseUp(0f, 0f, MouseButtons.Right);
            Assert.False(window.State.GetAllItems().Any(x => x.IsSelected));
        }
        public void 状態遷移テスト正常ケース()
        {
            using (var tempDirectory = new TempDirectory(true))
            {
                tempDirectory.AddFile(@"mondai\MondaiDocument.xml", TestResources.Mondai02);
                tempDirectory.AddFile(@"help\HelpDocument.xml", TestResources.HelpDocumentXml);

                var ePuzzleData = EPuzzleData.Create(tempDirectory.Name);
                var userInfo = ePuzzleData.CurrentUserInfo;
                WindowState.NowObject = new TestNowObject();

                var t0 = new DateTime(2013, 8, 22, 0, 0, 0); // UTC
                EPuzzleTime.Now = t0;

                var window = new EPuzzleWindow(ePuzzleData);
                window.State = WindowState.Fi(new StartGameState(window), EPuzzleConstants.画面切替時間);

                Assert.IsInstanceOf<FadeinState>(window.State);
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();

                // ゲームスタート画面
                Assert.IsInstanceOf<StartGameState>(window.State);
                {
                    var item = window.State.Items.First(x => x.Name == "StartGameButton");
                    item.OnClick(new MouseEventInfo(MouseButtons.Left));
                }

                Assert.IsInstanceOf<FadeoutState>(window.State);
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();
                Assert.IsInstanceOf<FadeinState>(window.State);
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();

                Assert.IsInstanceOf<MondaiDocumentMenuState>(window.State);
                {
                    var button = window.State.GetAllItems().Where(x => x.Tag is MondaiDocument).First();
                    window.State.CurrentItem = button;
                    window.State.OnAction0();
                }
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();

                Assert.IsInstanceOf<DaimonState>(window.State);
                Assert.AreEqual("基礎I", ((DaimonState)window.State).Daimon.Name);

                // 最初のボタンがCurrentItemになっているべき
                Assert.AreSame(window.State.GetAllItems().OfType<ChumonButton>().First(), window.State.CurrentItem);

                // LastDaimonIdが保存される
                {
                    var daimonState = (DaimonState)window.State;
                    Assert.AreEqual(daimonState.Daimon.Id, userInfo.GetLastDaimonId(daimonState.Daimon.Parent.Id));
                }

                // 結果の保存の確認
                {
                    var daimonState = (DaimonState)window.State;
                    var data2 = EPuzzleData.Create(tempDirectory.DirectoryName);
                    Assert.AreEqual(((DaimonState)window.State).Daimon.Id, data2.CurrentUserInfo.GetLastDaimonId(daimonState.Daimon.Parent.Id));
                }

                {
                    {
                        var daimonState = (DaimonState)window.State;
                        var daimon = daimonState.Daimon;
                        var c1 = (ChumonButton)daimonState.GetAllItems().Where(x => x is ChumonButton).First();
                        var c2 = (ChumonButton)daimonState.GetAllItems().Where(x => x is ChumonButton).Skip(1).First();
                        var c3 = (ChumonButton)daimonState.GetAllItems().Where(x => x is ChumonButton).Skip(2).FirstOrDefault();
                        var nextButton = daimonState.GetAllItems().OfType<NextButton>().First();

                        Assert.AreNotSame(c1, c2);
                        Assert.Null(c3);
                        Assert.AreEqual("This is a pen.", c1.Text);
                        Assert.AreEqual("I'm a policeman.", c2.Text);

                        Assert.False(c1.Chumon.IsLocked(userInfo));
                        Assert.True(c2.Chumon.IsLocked(userInfo));
                        Assert.True(c1.IsVisible);
                        Assert.True(c1.IsClickable);
                        Assert.True(c2.IsVisible);
                        Assert.False(c2.IsClickable);
                        Assert.False(nextButton.IsVisible);
                        Assert.False(nextButton.IsClickable);

                        // マウス座標とCurrentItemのボタン座標が一致していなければ押したことにはならない
                        window.MouseUp(0f, 0f, MouseButtons.Left);
                        Assert.IsInstanceOf<DaimonState>(window.State);

                        // c1
                        window.MouseUp(c1.BorderLeft, c1.BorderTop, MouseButtons.Left);
                        window.Tick();
                    }

                    Assert.IsInstanceOf<ClickDeKaishiState>(window.State);
                    WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
            //					window.MouseUp(100f, 100f, MouseButtons.Left);
            //					window.KeyDown(Keys.NumPad5);
                    window.State.OnAction0();
                    window.Tick();
                    Assert.IsInstanceOf<ShomonState>(window.State);

                    {
                        var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "This is");
                        window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                    }
                    {
                        var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "a notebook");
                        window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                    }
                    {
                        var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == ".");
                        window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                    }
                    WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                    window.Tick();
                    window.Tick();

                    Assert.IsInstanceOf<FadeoutState>(window.State);
                    WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                    window.Tick();
                    Assert.IsInstanceOf<FadeinState>(window.State);
                    WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                    window.Tick();

                    Assert.IsInstanceOf<ShomonState>(window.State);
                    Assert.AreEqual("[英訳] これはボールです。", ((ShomonState)window.State).Shomon.Mondaibun);

                    {
                        var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "This");
                        window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                    }
                    {
                        var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "is");
                        window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                    }
                    {
                        var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "a");
                        window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                    }
                    {
                        var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "ball");
                        window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                    }
                    {
                        var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == ".");
                        window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                    }
                    WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                    window.Tick();
                    window.Tick();

                    Assert.IsInstanceOf<FadeoutState>(window.State);
                    WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                    window.Tick();
                    Assert.IsInstanceOf<FadeinState>(window.State);
                    WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                    window.Tick();

                    Assert.IsInstanceOf<ChumonResultState>(window.State);
            /*					window.MouseUp(0f, 0f, MouseButtons.Left);
                    Assert.IsInstanceOf<ChumonResultState>(window.State);
                    */

                    WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                    window.Tick();
                    window.MouseUp(0f, 0f, MouseButtons.Left);

                    Assert.IsInstanceOf<FadeoutState>(window.State);
                    WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                    window.Tick();
                    Assert.IsInstanceOf<FadeinState>(window.State);
                    WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                    window.Tick();

                    // CurrentItemは次の問題のボタンになる
                    Assert.IsInstanceOf<DaimonState>(window.State);
                    Assert.IsInstanceOf<ChumonButton>(window.State.CurrentItem);
                    Assert.AreEqual("d1_chumon2", ((ChumonButton)window.State.CurrentItem).Chumon.Id);

                    {
                        var daimonState = (DaimonState)window.State;
                        var daimon = daimonState.Daimon;
                        var c1 = (ChumonButton)daimonState.GetAllItems().Where(x => x is ChumonButton).First();
                        var c2 = (ChumonButton)daimonState.GetAllItems().Where(x => x is ChumonButton).Skip(1).First();
                        var c3 = (ChumonButton)daimonState.GetAllItems().Where(x => x is ChumonButton).Skip(2).FirstOrDefault();
                        var nextButton = daimonState.GetAllItems().First(x => x is NextButton);

                        Assert.False(c1.Chumon.IsLocked(userInfo));
                        Assert.False(c2.Chumon.IsLocked(userInfo));
                        Assert.True(c1.IsVisible);
                        Assert.True(c1.IsClickable);
                        Assert.True(c2.IsVisible);
                        Assert.True(c2.IsClickable);
                        Assert.False(nextButton.IsVisible);
                        Assert.False(nextButton.IsClickable);

                        // c2
                        window.MouseMove(c2.BorderLeft, c2.BorderTop);
                        window.Tick();
                        window.MouseUp(c2.BorderLeft, c2.BorderTop, MouseButtons.Left);
                        window.Tick();
                    }
                    Assert.IsInstanceOf<ClickDeKaishiState>(window.State);
                    WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                    window.Tick();
                    window.MouseUp(100f, 100f, MouseButtons.Left);

                    {
                        Assert.IsInstanceOf<ShomonState>(window.State);
                        Assert.AreEqual("[英訳] 私は警官です。", ((ShomonState)window.State).Shomon.Mondaibun);

                        {
                            var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "I'm");
                            window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                        }
                        {
                            var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "a");
                            window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                        }
                        {
                            var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "policeman");
                            window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                        }
                        {
                            var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == ".");
                            window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                        }
                        WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                        window.Tick();
                        window.Tick();

                        Assert.IsInstanceOf<FadeoutState>(window.State);
                        WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                        window.Tick();
                        Assert.IsInstanceOf<FadeinState>(window.State);
                        WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                        window.Tick();
                    }
                    {
                        Assert.IsInstanceOf<ShomonState>(window.State);
                        Assert.AreEqual("[英訳] あなたは看護婦ではありません。", ((ShomonState)window.State).Shomon.Mondaibun);

                        {
                            var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "You");
                            window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                        }
                        {
                            var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "are");
                            window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                        }
                        {
                            var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "not");
                            window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                        }
                        {
                            var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "a");
                            window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                        }
                        {
                            var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "nurse");
                            window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                        }
                        {
                            var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == ".");
                            window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                        }
                        WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                        window.Tick();
                        window.Tick();

                        Assert.IsInstanceOf<FadeoutState>(window.State);
                        WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                        window.Tick();
                        Assert.IsInstanceOf<FadeinState>(window.State);
                        WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                        window.Tick();
                    }
                    {
                        Assert.IsInstanceOf<ShomonState>(window.State);
                        Assert.AreEqual("[英訳] ジャックは学生です。", ((ShomonState)window.State).Shomon.Mondaibun);

                        {
                            var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "Jack");
                            window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                        }
                        {
                            var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "is");
                            window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                        }
                        {
                            var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "a");
                            window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                        }
                        {
                            var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "student");
                            window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                        }
                        {
                            var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == ".");
                            window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                        }
                        WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                        window.Tick();
                        window.Tick();

                        Assert.IsInstanceOf<FadeoutState>(window.State);
                        WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                        window.Tick();
                        Assert.IsInstanceOf<FadeinState>(window.State);
                        WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                        window.Tick();
                    }

                    Assert.IsInstanceOf<ChumonResultState>(window.State);
            //					window.MouseUp(0f, 0f, MouseButtons.Left);
                    WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                    window.MouseUp(0f, 0f, MouseButtons.Left);
                    window.Tick();
                }

                Assert.IsInstanceOf<FadeoutState>(window.State);
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();
                Assert.IsInstanceOf<FadeinState>(window.State);
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();

                Assert.IsInstanceOf<DaimonState>(window.State);
                Assert.AreEqual("基礎II", ((DaimonState)window.State).Daimon.Name);

                {
                    var item = window.State.Items.First(x => x.GetType() == typeof(PreviousButton));
                    window.MouseUp(item.BorderLeft, item.BorderTop, MouseButtons.Left);
            //					item.OnClick(new MouseEventInfo(MouseButtons.Left));
                }

                Assert.IsInstanceOf<FadeoutState>(window.State);
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();
                Assert.IsInstanceOf<FadeinState>(window.State);
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();

                {
                    Assert.IsInstanceOf<DaimonState>(window.State);
                    var daimonState = (DaimonState)window.State;
                    var daimon = daimonState.Daimon;

                    /*
                    foreach (var item in daimon.Items)
                    {
                        item.GradeProcessor = GradeProcessorA.Instance;
                    }
                    */
                    userInfo.GradeProcessor = GradeProcessorA.Instance;

                    Assert.AreEqual("基礎I", daimon.Name);

                    {
                        var mondaiResults = userInfo.MondaiResults.GetItems("d1_chumon1").ToArray();
                        Assert.AreEqual(1, mondaiResults.Count());
                        Assert.AreEqual(TimeSpan.FromSeconds(2d), mondaiResults[0].所要時間);
                        Assert.AreEqual("S", daimon.Items[0].GetGradeString(userInfo));
                    }
                    {
                        var mondaiResults = userInfo.MondaiResults.GetItems("d1_chumon2").ToArray();
                        Assert.AreEqual(1, mondaiResults.Count());
                        Assert.AreEqual(TimeSpan.FromSeconds(3d), mondaiResults[0].所要時間);
                        Assert.AreEqual("S", daimon.Items[1].GetGradeString(userInfo));
                    }
                    Assert.False(daimon.Items[0].IsLocked(userInfo));
                    Assert.False(daimon.Items[1].IsLocked(userInfo));

                    Assert.IsInstanceOf<ChumonButton>(daimonState.CurrentItem);
                    Assert.AreEqual("d1_chumon1", ((ChumonButton)daimonState.CurrentItem).Chumon.Id);

            //					var kirokuBox = (KirokuBox)daimonState.GetAllItems().First(x => x is KirokuBox);
            //					Assert.AreEqual(1, kirokuBox.GetPoints().Count());
                }
                {
                    var item = window.State.Items.First(x => x.Name == "タイトル画面に戻る");
                    item.OnClick(new MouseEventInfo(MouseButtons.Left));
                }

                Assert.IsInstanceOf<FadeoutState>(window.State);
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();
                Assert.IsInstanceOf<FadeinState>(window.State);
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();

                Assert.IsInstanceOf<StartGameState>(window.State);
            }
        }
        public void Chumon遷移テスト()
        {
            EPuzzleWindow window = null;
            using (var tempDirectory = new TempDirectory(true))
            {
                tempDirectory.AddFile(@"mondai\MondaiDocument.xml", TestResources.Mondai02);
                tempDirectory.AddFile(@"help\HelpDocument.xml", TestResources.HelpDocumentXml);

                var ePuzzleData = EPuzzleData.Create(tempDirectory.Name);
                WindowState.NowObject = new TestNowObject();
                var t0 = new DateTime(2013, 8, 22, 0, 0, 0); // UTC
                EPuzzleTime.Now = t0;
                window = new EPuzzleWindow(ePuzzleData);
                window.State = WindowState.Fi(new StartGameState(window), EPuzzleConstants.画面切替時間);

                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();

                // ゲームスタート画面
                Assert.IsInstanceOf<StartGameState>(window.State);
                {
                    var item = window.State.Items.First(x => x.Name == "StartGameButton");
                    item.OnClick(new MouseEventInfo(MouseButtons.Left));
                }

                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();

                Assert.IsInstanceOf<MondaiDocumentMenuState>(window.State);
                {
                    var button = window.State.GetAllItems().Where(x => x.Tag is MondaiDocument).First();
                    window.State.CurrentItem = button;
                    window.State.OnAction0();
                }
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();

                Assert.IsInstanceOf<DaimonState>(window.State);
                Assert.AreEqual("基礎I", ((DaimonState)window.State).Daimon.Name);

                {
                    var item = window.State.GetAllItems().First(x => x.Text == "This is a pen.");
                    Assert.IsInstanceOf<EigoTestButtonItem>(item);
                    window.MouseMove(item.BorderLeft, item.BorderTop);
                    window.Tick();
                    window.MouseUp(item.BorderLeft, item.BorderTop, MouseButtons.Left);
                }

            /*
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();
                */

                Assert.IsInstanceOf<ClickDeKaishiState>(window.State);
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();
                window.MouseUp(100f, 100f, MouseButtons.Left);
                Assert.IsInstanceOf<ShomonState>(window.State);
                Assert.AreEqual("[英訳] これはノートです。", ((ShomonState)window.State).Shomon.Mondaibun);

                var mondaiId = ((ShomonState)window.State).Shomon.Parent.Id;
                Assert.AreEqual("d1_chumon1", mondaiId);

                var startTime = WindowState.NowObject.Now;
                Assert.AreEqual(startTime, window.ChumonResult.StartTime);

                {
                    var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "This is");
                    window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                }
                {
                    var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "a notebook");
                    window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                }
                {
                    var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == ".");
                    window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                }
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();
                window.Tick();

                Assert.IsInstanceOf<FadeoutState>(window.State);
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();
                Assert.IsInstanceOf<FadeinState>(window.State);
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();

                Assert.IsInstanceOf<ShomonState>(window.State);
                Assert.AreEqual("[英訳] これはボールです。", ((ShomonState)window.State).Shomon.Mondaibun);

                // エスケープ画面では時間が経過しない
                window.State.OnAction3();
                Assert.IsInstanceOf<PauseState>(window.State);
                WindowState.NowObject.Now += TimeSpan.FromHours(10d);
                window.State.OnAction3();
                Assert.IsInstanceOf<ShomonState>(window.State);
                Assert.AreEqual("[英訳] これはボールです。", ((ShomonState)window.State).Shomon.Mondaibun);

                {
                    var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "This");
                    window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                }
                {
                    var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "is");
                    window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                }
                {
                    var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "a");
                    window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                }
                {
                    var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "ball");
                    window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                }
                {
                    var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == ".");
                    window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                }
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();
                window.Tick();

                Assert.IsInstanceOf<FadeoutState>(window.State);
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();
                Assert.IsInstanceOf<FadeinState>(window.State);
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();

                Assert.IsInstanceOf<ChumonResultState>(window.State);
            /*				window.MouseUp(0f, 0f, MouseButtons.Left);
                Assert.IsInstanceOf<ChumonResultState>(window.State);
            */
                // 結果を記録
                Assert.AreEqual(1, window.EPuzzleData.CurrentUserInfo.MondaiResults.Count());
                var mondaiResult = window.EPuzzleData.CurrentUserInfo.MondaiResults.First();
                Assert.AreEqual(mondaiId, mondaiResult.MondaiId);

                var s0 = TimeSpan.FromSeconds(20d);
                Assert.AreEqual(s0, mondaiResult.所要時間);

                // 結果の保存の確認
                {
                    var data2 = EPuzzleData.Create(tempDirectory.DirectoryName);
                    var mr = data2.CurrentUserInfo.MondaiResults.First();
                    Assert.AreEqual("d1_chumon1", mr.MondaiId);
                    Assert.AreEqual(s0, mr.所要時間);
                }

                // 画面エフェクトが終了してからマウス入力を受け付ける
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.MouseUp(0f, 0f, MouseButtons.Left);

                Assert.IsInstanceOf<FadeoutState>(window.State);
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();
                Assert.IsInstanceOf<FadeinState>(window.State);
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();

                // 問題メニューに戻る
                Assert.IsInstanceOf<DaimonState>(window.State);
                Assert.AreEqual("基礎I", ((DaimonState)window.State).Daimon.Name);
            }
        }
        public void D評価なら次のDaimonに遷移しない()
        {
            EPuzzleWindow window = null;
            using (var tempDirectory = new TempDirectory(true))
            {
                tempDirectory.AddFile(@"mondai\MondaiDocument.xml", TestResources.Mondai02);
                tempDirectory.AddFile(@"help\HelpDocument.xml", TestResources.HelpDocumentXml);

                var ePuzzleData = EPuzzleData.Create(tempDirectory.Name);
                var userInfo = ePuzzleData.CurrentUserInfo;
                WindowState.NowObject = new TestNowObject();
                var t0 = new DateTime(2013, 8, 22, 0, 0, 0); // UTC
                EPuzzleTime.Now = t0;
                window = new EPuzzleWindow(ePuzzleData);
                window.State = WindowState.Fi(new StartGameState(window), EPuzzleConstants.画面切替時間);

                userInfo.MondaiResults.AddNew("d1_chumon1", t0, TimeSpan.FromSeconds(10d));

                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();

                // ゲームスタート画面
                Assert.IsInstanceOf<StartGameState>(window.State);
                {
                    var item = window.State.Items.First(x => x.Name == "StartGameButton");
                    item.OnClick(new MouseEventInfo(MouseButtons.Left));
                }
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();

                Assert.IsInstanceOf<MondaiDocumentMenuState>(window.State);
                {
                    var button = window.State.GetAllItems().Where(x => x.Tag is MondaiDocument).First();
                    window.State.CurrentItem = button;
                    window.State.OnAction0();
                }
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();

                Assert.IsInstanceOf<DaimonState>(window.State);
                Assert.AreEqual("基礎I", ((DaimonState)window.State).Daimon.Name);

                {
                    var item = window.State.GetAllItems().First(x => x.Text == "I'm a policeman.");
                    Assert.IsInstanceOf<EigoTestButtonItem>(item);
                    window.MouseMove(item.BorderLeft, item.BorderTop);
                    window.Tick();
                    window.MouseUp(item.BorderLeft, item.BorderTop, MouseButtons.Left);
                }

                Assert.IsInstanceOf<ClickDeKaishiState>(window.State);
                WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                window.Tick();
                window.MouseUp(100f, 100f, MouseButtons.Left);

                {
                    Assert.IsInstanceOf<ShomonState>(window.State);
                    Assert.AreEqual("[英訳] 私は警官です。", ((ShomonState)window.State).Shomon.Mondaibun);

                    {
                        var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "I'm");
                        window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                    }
                    {
                        var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "a");
                        window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                    }
                    {
                        var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "policeman");
                        window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                    }
                    {
                        var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == ".");
                        window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                    }
                    WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                    window.Tick();
                    window.Tick();

                    Assert.IsInstanceOf<FadeoutState>(window.State);
                    WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                    window.Tick();
                    Assert.IsInstanceOf<FadeinState>(window.State);
                    WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                    window.Tick();
                }
                {
                    Assert.IsInstanceOf<ShomonState>(window.State);
                    Assert.AreEqual("[英訳] あなたは看護婦ではありません。", ((ShomonState)window.State).Shomon.Mondaibun);

                    {
                        var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "You");
                        window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                    }
                    {
                        var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "are");
                        window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                    }
                    {
                        var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "not");
                        window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                    }
                    {
                        var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "a");
                        window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                    }
                    {
                        var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "nurse");
                        window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                    }
                    {
                        var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == ".");
                        window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                    }
                    WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                    window.Tick();
                    window.Tick();

                    Assert.IsInstanceOf<FadeoutState>(window.State);
                    WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                    window.Tick();
                    Assert.IsInstanceOf<FadeinState>(window.State);
                    WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                    window.Tick();
                }
                {
                    Assert.IsInstanceOf<ShomonState>(window.State);
                    Assert.AreEqual("[英訳] ジャックは学生です。", ((ShomonState)window.State).Shomon.Mondaibun);

                    {
                        var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "Jack");
                        window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                    }
                    {
                        var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "is");
                        window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                    }
                    {
                        var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "a");
                        window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                    }
                    {
                        var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == "student");
                        window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                    }
                    {
                        var wordCard = window.State.GetAllItems().First(x => x is WordCard && x.Text == ".");
                        window.MouseUp(wordCard.BorderLeft, wordCard.BorderTop, MouseButtons.Left);
                    }
                    // 10時間
                    WindowState.NowObject.Now += TimeSpan.FromHours(10d);
                    window.Tick();
                    window.Tick();

                    Assert.IsInstanceOf<FadeoutState>(window.State);
                    WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                    window.Tick();
                    Assert.IsInstanceOf<FadeinState>(window.State);
                    WindowState.NowObject.Now += TimeSpan.FromSeconds(1d);
                    window.Tick();
                }

                Assert.IsInstanceOf<ChumonResultState>(window.State);
                window.MouseUp(0f, 0f, MouseButtons.Left);
            /*				WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.MouseUp(0f, 0f, MouseButtons.Left);
                window.Tick();*/

                Assert.IsInstanceOf<FadeoutState>(window.State);
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();
                Assert.IsInstanceOf<FadeinState>(window.State);
                WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                window.Tick();

                Assert.IsInstanceOf<DaimonState>(window.State);
                Assert.AreEqual("基礎I", ((DaimonState)window.State).Daimon.Name);
                Assert.AreEqual("daimon1", ((DaimonState)window.State).Daimon.Id);
            }
        }
        public void Test1()
        {
            WindowState.NowObject = new TestNowObject();
            WindowState.NowObject.Now = DateTime.MinValue;

            using (var tempDirectory = new TempDirectory(true))
            {
                tempDirectory.AddFile(@"mondai\MondaiDocument.xml", TestResources.Mondai02);
                tempDirectory.AddFile(@"mondai\MondaiDocument2.xml", TestResources.Mondai03);

                {
                    var data56 = EPuzzleData.Create(tempDirectory.Name);
                    data56.Save();
                }

                var data = EPuzzleData.Create(tempDirectory.Name);
                var userInfo = data.CurrentUserInfo;
                var window = new EPuzzleWindow(data);

                Assert.AreEqual("DocumentA", data.MondaiDocuments[0].Name);
                Assert.AreEqual("DocumentB", data.MondaiDocuments[1].Name);

                var mondaiDocumentMenuState = new MondaiDocumentMenuState(window, data.MondaiDocuments);
                window.State = mondaiDocumentMenuState;

                {
                    var buttons = mondaiDocumentMenuState.GetAllItems().Where(x => x is EigoTestButtonItem && x.Tag is MondaiDocument).ToArray();
                    Assert.AreEqual(2, buttons.Count());

                    Assert.AreEqual("DocumentA", buttons[0].Text);
                    Assert.AreSame(data.MondaiDocuments[0], buttons[0].Tag);

                    Assert.AreEqual("DocumentB", buttons[1].Text);
                    Assert.AreSame(data.MondaiDocuments[1], buttons[1].Tag);
                }

                var daimonA1 = (Daimon)data.MondaiDocuments[0].Items[1];
                var daimonB1 = (Daimon)data.MondaiDocuments[1].Items[1];

                Assert.AreEqual("daimon2", daimonA1.Id);
                Assert.AreSame(data.MondaiDocuments[0], daimonA1.Parent);
                Assert.AreEqual("daimon2", daimonB1.Id);
                Assert.AreSame(data.MondaiDocuments[1], daimonB1.Parent);

                userInfo.SetLastDaimonInfo(daimonA1);
                userInfo.SetLastDaimonInfo(daimonB1);

                // button[0]
                {
                    var buttons = mondaiDocumentMenuState.GetAllItems().Where(x => x is EigoTestButtonItem && x.Tag is MondaiDocument).ToArray();
                    window.State.CurrentItem = buttons[0];
                    window.State.OnAction0();

                    Assert.AreSame(data.MondaiDocuments[0], window.EPuzzleData.CurrentMondaiDocument);

                    Assert.IsInstanceOf<FadeoutState>(window.State);
                    WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                    window.Tick();
                    Assert.IsInstanceOf<FadeinState>(window.State);
                    WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                    window.Tick();

                    Assert.IsInstanceOf<DaimonState>(window.State);
                    Assert.AreSame(daimonA1, ((DaimonState)window.State).Daimon);
                }

                // button[1]
                {
                    window.State = mondaiDocumentMenuState;
                    var buttons = mondaiDocumentMenuState.GetAllItems().Where(x => x is EigoTestButtonItem && x.Tag is MondaiDocument).ToArray();

                    window.State.CurrentItem = buttons[1];
                    window.State.OnAction0();

                    Assert.AreSame(data.MondaiDocuments[1], window.EPuzzleData.CurrentMondaiDocument);

                    Assert.IsInstanceOf<FadeoutState>(window.State);
                    WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                    window.Tick();
                    Assert.IsInstanceOf<FadeinState>(window.State);
                    WindowState.NowObject.Now += TimeSpan.FromSeconds(10d);
                    window.Tick();

                    Assert.IsInstanceOf<DaimonState>(window.State);
                    Assert.AreSame(daimonB1, ((DaimonState)window.State).Daimon);
                }

                // マウスクリックで遷移テスト
                {
                    window.State = mondaiDocumentMenuState;
                    var buttons = mondaiDocumentMenuState.GetAllItems().Where(x => x is EigoTestButtonItem && x.Tag is MondaiDocument).ToArray();
                    var button = buttons[0];
                    Assert.IsInstanceOf<MondaiDocumentMenuState>(window.State);
                    window.State.CurrentItem = button;
                    Assert.True(window.State.CurrentItem.Contains(button.BorderLeft, button.BorderTop));
                    window.MouseUp(button.BorderLeft, button.BorderTop, MouseButtons.Left);

                    Assert.AreSame(data.MondaiDocuments[0], window.EPuzzleData.CurrentMondaiDocument);
                    Assert.IsInstanceOf<FadeoutState>(window.State);
                }
            }
        }