public void decoyの別名dを追加()
        {
            var text = @"
            version = 1.1
            document
            {
            id = document0
            title =

            daimon
            {
            id = daimon0
            title =

            chumon
            {
            id = chumon0
            title =
            shuffle = true
            helpId =
            helpId =

            shomon
            {
                id = shomon0
                q = aaa
                c = This is a ball.
                d = apple (an apple)
            }
            }
            }
            }";

            using (var tempFile = new TempFile(text))
            {
                var accessor = new EmpDocumentAccessor1_1();
                var mondaiDocument = accessor.Load(tempFile.Name);

            //				var element = EmpDocument.Load(tempFile.Name);
            //				var mondaiDocument = element.GetMondaiDocument();

                var shomon = (Shomon)mondaiDocument.GetItem("shomon0");
                CollectionAssert.AreEqual(new []
                {
                    new MondaiWord("This"),
                    new MondaiWord("is"),
                    new MondaiWord("a"),
                    new MondaiWord("ball"),
                    new MondaiWord("."),
                    new MondaiWord("apple"),
                    new MondaiWord("an apple"),

                }, shomon.MondaiWords);
            }
        }
        public void コロンに対応させる()
        {
            // They need two kind of support: economic and technical.
            var text = @"
            version = 1.1
            document
            {
            id = document0
            title =

            daimon
            {
            id = daimon0
            title =

            chumon
            {
            id = chumon0
            title =
            shuffle = true
            helpId =
            helpId =

            shomon
            {
                id = shomon0
                q = bbb
                c = They need two kind of support: economic and technical.
            }
            }
            }
            }";

            using (var tempFile = new TempFile(text))
            {
                var accessor = new EmpDocumentAccessor1_1();
                var mondaiDocument = accessor.Load(tempFile.Name);

            //				var element = EmpDocument.Load(tempFile.Name);
            //				var mondaiDocument = element.GetMondaiDocument();

                var shomon = (Shomon)mondaiDocument.GetItem("shomon0");
                Assert.AreEqual("bbb", shomon.Mondaibun);
                CollectionAssert.AreEqual(new []
                {
                    new MondaiWord("They"),
                    new MondaiWord("need"),
                    new MondaiWord("two"),
                    new MondaiWord("kind"),
                    new MondaiWord("of"),
                    new MondaiWord("support"),
                    new MondaiWord(":"),
                    new MondaiWord("economic"),
                    new MondaiWord("and"),
                    new MondaiWord("technical"),
                    new MondaiWord("."),
                }, shomon.MondaiWords);
            }
        }
        public void カード分割機能のデータ構造に対応させる()
        {
            var text = @"
            version = 1.1
            document
            {
            id = document0
            title =

            daimon
            {
            id = daimon0
            title =

            chumon
            {
            id = chumon0
            title =
            shuffle = true
            helpId =
            helpId =

            shomon
            {
                id = shomon0
                mon = 何年前に君のおじさんはニューヨークにいたのですか。
                c = a b/c/d e+f
                w = g
                w = h
            }
            shomon
            {
                id = shomon1
                q = aaa
                c = This+is a+ball.
            }
            }
            }
            }";

            using (var tempFile = new TempFile(text))
            {
                var accessor = new EmpDocumentAccessor1_1();
                var mondaiDocument = accessor.Load(tempFile.Name);

                var shomon = (Shomon)mondaiDocument.GetItem("shomon0");
                Assert.AreEqual("a bcd e f", shomon.CorrectAnswers.First().Text);

                CollectionAssert.AreEquivalent(new []
                {
                    new MondaiWord("a"),
                    new MondaiWord("b", false, true),
                    new MondaiWord("c", true, true),
                    new MondaiWord("d", true, false),
                    new MondaiWord("e f"),
                    new MondaiWord("g"),
                    new MondaiWord("h"),

                }, shomon.MondaiWords);
            }
        }
        public void seiに2個以上の空白が含まれていた場合の処理()
        {
            var text = @"
            version = 1.1
            document
            {
            id = document0
            title =

            daimon
            {
            id = daimon0
            title =

            chumon
            {
            id = chumon0
            title =
            shuffle = true
            helpId =
            helpId =

            shomon
            {
                id = shomon0
                q = aaa
                c = This  is a ball.
            }
            }
            }
            }";

            using (var tempFile = new TempFile(text))
            {
                var accessor = new EmpDocumentAccessor1_1();
                var mondaiDocument = accessor.Load(tempFile.Name);

            //				var element = EmpDocument.Load(tempFile.Name);
            //				var shomonElement = element.Body.GetAllItems().First(x => "shomon" == x.Name);
            //				var mondaiDocument = element.GetMondaiDocument();

                var shomon = mondaiDocument.GetAllItems().OfType<Shomon>().First(x => "shomon0" == x.Id);
                Assert.AreEqual("This is a ball.", shomon.CorrectAnswers.First().Text);
                CollectionAssert.AreEqual
                (
                    new []
                    {
                        new MondaiWord("This"),
                        new MondaiWord("is"),
                        new MondaiWord("a"),
                        new MondaiWord("ball"),
                        new MondaiWord("."),
                    },
                    shomon.MondaiWords
                );
            }
        }
        public void seiが指定されなかったとき例外を送出する()
        {
            var text = @"
            version = 1.1
            document
            {
            id = document0
            title =

            daimon
            {
            id = daimon0
            title =

            chumon
            {
            id = chumon0
            title =
            shuffle = true
            helpId =
            helpId =

            shomon
            {
                id = shomon0
                q = aaa
                c = This is a ball.
                c =
                decoy = apple (an apple)
            }
            }
            }
            }";

            using (var tempFile = new TempFile(text))
            {
            /*				var element = EmpDocument.Load(tempFile.Name);
                Assert.Throws<EmpException>(() =>
                {
                    var mondaiDocument = element.GetMondaiDocument();
                });*/

                var accessor = new EmpDocumentAccessor1_1();
                Assert.Throws<EmpException>(() =>
                {
                    accessor.Load(tempFile.Name);
                });
            }
        }
        public void optionalにtruefalse以外が指定されていたら例外()
        {
            var text =
            @"version = 1.1
            document
            {
            id = document1
            title = documentB

            daimon
            {
            id = id1
            title = ""daimonTitle""

            chumon
            {
            id = chumon2-2
            title = ""chumonTitle""

            shuffle = aaa

            shomon
            {
                id = shomon3
                q
                {
                    Are these cameras?
                }

                c
                {
                    No, they aren't.
                }

                w
                {
                    Yes,
                }
                w
                {
                    they are.
                }
            }
            }
            }
            }
            ";

            using (var tempFile = new TempFile(text))
            {
                var accessor = new EmpDocumentAccessor1_1();
                Assert.Throws<EmpException>(() =>
                {
                    accessor.Load(tempFile.Name);
                });

            /*				var emp = EmpDocument.Load(tempFile.Name);
                Assert.Throws<EmpException>(() =>
                {
                    emp.GetMondaiDocument();
                });*/
            }
        }
        public void LoadingTest()
        {
            var text =
            @"version = 1.1
            document
            {
            id = document1
            title = Document Title 1

            daimon
            {
            id = daimon1
            title = ""Daimon Title 1""

            chumon
            {
            id = chumon1
            title = ""Chumon Title 1""

            shomon
            {
                id = shomon1
                question = Are these cameras?
                correct = No, they aren't.
                words = Yes,
                words = they are.
            }
            }
            chumon
            {
            id = chumon2
            title = ""Chumon Title 2""

            shomon
            {
                id = shomon2
                q = Are these cameras?
                c = No, they aren't.
                w = Yes,
                w = they are.
            }
            }
            }
            daimon
            {
            id = daimon2
            title = ""Daimon Title 2""

            chumon
            {
            id = chumon3
            title = ""Chumon Title 3""

            shomon
            {
                id = shomon3
                q = Are these cameras?
                c = No, they aren't.
                w = Yes,
                w = they are.
            }
            }
            }
            }";

            using (var tempFile = new TempFile(text))
            {
                var accessor = new EmpDocumentAccessor1_1();
                var mondaiDocument = accessor.Load(tempFile.Name);
                var userInfo = new EPuzzleUserInfo();

                Assert.AreEqual("document1", mondaiDocument.Id);

                var daimon = mondaiDocument.Items[0];

                Assert.AreEqual(@"""Daimon Title 1""", daimon.Name);
                Assert.IsNotEmpty(daimon.Id);

                {
                    var chumon = (Chumon)daimon.Items[0];
                    Assert.AreEqual(@"""Chumon Title 1""", chumon.Name);
                    Assert.IsNotEmpty(chumon.Id);

                    Assert.AreEqual(1, chumon.Items.Count());
                    var shomon = (Shomon)chumon.Items[0];
                    Assert.AreEqual("shomon1", shomon.Id);
                    Assert.AreEqual("Are these cameras?", shomon.Mondaibun);
                    Assert.AreEqual("No, they aren't.", shomon.CorrectAnswers.First().Text);
                    CollectionAssert.AreEquivalent(new [] { "No", ",", "they", "aren't", ".", "Yes,", "they are." }, shomon.MondaiWords.Select(x => x.Text).ToArray());

                    Assert.AreEqual(TimeSpan.FromSeconds(6d), chumon.GetTimeLimit(userInfo));
                }
                {
                    var daimon2 = (Daimon)mondaiDocument.Items[1];
                    Assert.AreEqual("daimon2", daimon2.Id);

                    var chumon2 = (Chumon)daimon2.Items[0];
                    Assert.AreEqual("chumon3", chumon2.Id);

                    var shomon = (Shomon)chumon2.Items[0];
                    Assert.AreEqual("shomon3", shomon.Id);
                    Assert.AreEqual("Are these cameras?", shomon.Mondaibun);
                    Assert.AreEqual("No, they aren't.", shomon.CorrectAnswers.First().Text);
                    CollectionAssert.AreEquivalent(new [] { "No", ",", "they", "aren't", ".", "Yes,", "they are." }, shomon.MondaiWords.Select(x => x.Text).ToArray());
                }

            }
        }
        public void 括弧でまとめて指定()
        {
            var text = @"
            version = 1.1
            document
            {
            id = document0
            title =

            daimon
            {
            id = daimon0
            title =

            chumon
            {
            id = chumon0
            title =
            shuffle = true
            helpId =
            helpId =

            shomon
            {
                id = shomon0
                qestion = aaa
                correctAnswer = (This is) (a ball).
            }
            }
            }
            }";

            using (var tempFile = new TempFile(text))
            {
                var accessor = new EmpDocumentAccessor1_1();
                var mondaiDocument = accessor.Load(tempFile.Name);

            //				var element = EmpDocument.Load(tempFile.Name);
            //				var shomonElement = element.Body.GetAllItems().First(x => "shomon" == x.Name);
            //				Assert.AreEqual("(This is) (a ball).", shomonElement.GetValue("sei"));
            //				var mondaiDocument = element.GetMondaiDocument();

                var shomon = mondaiDocument.GetAllItems().OfType<Shomon>().First(x => "shomon0" == x.Id);

                CollectionAssert.AreEqual
                (
                    new []
                    {
                        new MondaiWord("This is"),
                        new MondaiWord("a ball"),
                        new MondaiWord("."),
                    },
                    shomon.MondaiWords
                );
            }
        }
        public void LoadingAndSavingTest()
        {
            var text = @"version = 1.1
            document
            {
            id = document0
            title =
            daimon
            {
            id = daimon0
            title =
            chumon
            {
            id = chumon0
            title =
            shuffle = true
            helpId =
            helpId =
            shomon
            {
                id = shomon0
                display = all
                q = bbb
                c = They need two kind of support: economic and technical.
                sound
                {
                    file = They need two kind of support.wav
                    when = start
                    repeat = true
                }
            }
            shomon
            {
                id = shomon1
                display = all
                q = bbb
                c = They need two kind of support: economic and technical.
                inputMethod = card
                sound
                {
                    file = They need two kind of support.wav
                    when = start
                    numberOfTimes = 2
                }
            }
            shomon
            {
                id = shomon2
                display = all
                inputMethod = typing
                q = bbb
                c = They need two kind of support: economic and technical.
                sound
                {
                    file = They need two kind of support.wav
                    when = userRequest
                    numberOfTimes = 2
                }
            }
            }
            }
            }
            ";

            using (var tempFile = new TempFile(text))
            {
                var accessor = new EmpDocumentAccessor1_1();
                var mondaiDocument = accessor.Load(tempFile.Name);

                var shomons = mondaiDocument.GetAllItems().OfType<Shomon>().ToArray();
                Assert.AreEqual(3, shomons.Length);

                int i = 0;
                {
                    var shomon = shomons[i++];
                    var sound = shomon.Sounds.First();
                    Assert.AreEqual("They need two kind of support.wav", sound.FileName);
                    Assert.AreEqual(SoundIsPlayedWhen.Start, sound.IsPlayedWhen);
                    Assert.True(sound.IsRepeated);
                    Assert.AreEqual(1, sound.NumberOfTimes);
                    Assert.AreEqual(ShomonInputMethod.Card, shomon.InputMethod);
                    Assert.AreEqual("bbb", shomon.Mondaibun);
                    CollectionAssert.AreEqual(new []
                    {
                        new MondaiWord("They"),
                        new MondaiWord("need"),
                        new MondaiWord("two"),
                        new MondaiWord("kind"),
                        new MondaiWord("of"),
                        new MondaiWord("support"),
                        new MondaiWord(":"),
                        new MondaiWord("economic"),
                        new MondaiWord("and"),
                        new MondaiWord("technical"),
                        new MondaiWord("."),
                    }, shomon.MondaiWords);
                }
                {
                    var shomon = shomons[i++];
                    var sound = shomon.Sounds.First();
                    Assert.AreEqual("They need two kind of support.wav", sound.FileName);
                    Assert.AreEqual(SoundIsPlayedWhen.Start, sound.IsPlayedWhen);
                    Assert.False(sound.IsRepeated);
                    Assert.AreEqual(2, sound.NumberOfTimes);
                    Assert.AreEqual(ShomonInputMethod.Card, shomon.InputMethod);
                }
                {
                    var shomon = shomons[i++];
                    var sound = shomon.Sounds.First();
                    Assert.AreEqual("They need two kind of support.wav", sound.FileName);
                    Assert.AreEqual(SoundIsPlayedWhen.UserRequest, sound.IsPlayedWhen);
                    Assert.False(sound.IsRepeated);
                    Assert.AreEqual(2, sound.NumberOfTimes);
                    Assert.AreEqual(ShomonInputMethod.Typing, shomon.InputMethod);

                    // カード部分を取り除くかどうか保留
                    Assert.AreEqual(11, shomon.MondaiWords.Count());
                }

            /*
                using (var actual = new TempFile())
                {
                    accessor.Save(actual.Name, mondaiDocument);
                    TestUtility.CompareWithWinMerge(tempFile.Name, actual.Name);
                    FileAssert.AreEqual(tempFile.Name, actual.Name);
                }*/
            }
        }
        public void LettersThatAreDisplayedOnCardに対応させる()
        {
            var text = @"
            version = 1.1
            document
            {
            id = document0
            title =

            daimon
            {
            id = daimon0
            title =

            chumon
            {
            id = chumon0
            title =
            shuffle = true
            helpId =
            helpId =

            shomon
            {
                id = shomon0
                display = all
                q = bbb
                c = They need two kind of support: economic and technical.
            }
            }
            }
            }";

            using (var tempFile = new TempFile(text))
            {
                var accessor = new EmpDocumentAccessor1_1();
                var mondaiDocument = accessor.Load(tempFile.Name);

            //				var element = EmpDocument.Load(tempFile.Name);
            //				var mondaiDocument = element.GetMondaiDocument();

                var shomon = (Shomon)mondaiDocument.GetItem("shomon0");
                Assert.AreEqual("bbb", shomon.Mondaibun);
                Assert.AreEqual(LettersThatAreDisplayedOnCard.All, shomon.LettersThatAreDisplayedOnCard);
            }
        }
        public void helpIdに空文字を指定されたら無視する()
        {
            var text = @"
            version = 1.1
            document
            {
            id = document0
            title =

            daimon
            {
            id = daimon0
            title =

            chumon
            {
            id = chumon0
            title =
            shuffle = true
            helpId =
            helpId =

            ankimon
            {
                id = ankimon0
                item
                {
                    name =
                    split = a b
                }
                item
                {
                    name =
                    split = c+d e
                }
            }
            }
            }
            }";

            using (var tempFile = new TempFile(text))
            {
                var accessor = new EmpDocumentAccessor1_1();
                var mondaiDocument = accessor.Load(tempFile.Name);
                var chumon = mondaiDocument.GetItem("chumon0");
                Assert.IsEmpty(chumon.HelpIds);
            }
        }
        public void 選択用カード生成テスト()
        {
            var text = @"
            version = 1.1
            document
            {
            id = document1
            title = documentC

            daimon
            {
            id = id1
            title = ""daimonTitle""

            chumon
            {
            id = chumon2-2
            title = ""chumonTitle""

            shomon
            {
                id = shomon1
                q = Are these cameras?
                correct = No, they aren't.
                c = Yes, they are.
            }
            }
            }
            }

            ";
            using (var tempFile = new TempFile(text))
            {
                var accessor = new EmpDocumentAccessor1_1();
                var mondaiDocument = accessor.Load(tempFile.Name);
                var userInfo = new EPuzzleUserInfo();

                Assert.AreEqual("document1", mondaiDocument.Id);

                var daimon = mondaiDocument.Items[0];

                Assert.AreEqual(@"""daimonTitle""", daimon.Name);
                Assert.IsNotEmpty(daimon.Id);

                var chumon = (Chumon)daimon.Items[0];
                Assert.AreEqual(@"""chumonTitle""", chumon.Name);
                Assert.IsNotEmpty(chumon.Id);

                var shomon = (Shomon)chumon.Items[0];
                Assert.AreEqual("shomon1", shomon.Id);
                Assert.AreEqual("Are these cameras?", shomon.Mondaibun);
                Assert.AreEqual("No, they aren't.", shomon.CorrectAnswers[0].Text);
                Assert.AreEqual("Yes, they are.", shomon.CorrectAnswers[1].Text);

                CollectionAssert.AreEquivalent(new [] { "No", ",", "they", "aren't", "Yes", "are", "." }, shomon.MondaiWords.Select(x => x.Text).ToArray());
                Assert.AreEqual(TimeSpan.FromSeconds(6d), chumon.GetTimeLimit(userInfo));
            }
        }
        public void 括弧関連の不具合()
        {
            var text = @"
            version = 1.1
            document
            {
            id = document0
            title =

            daimon
            {
            id = daimon0
            title =

            chumon
            {
            id = chumon0
            title =
            shuffle = true
            helpId =
            helpId =

            shomon
            {
                id = shomon0
                q = bbb
                c = This watch cost me (7,500 yen).
            }
            }
            }
            }";

            using (var tempFile = new TempFile(text))
            {
                var accessor = new EmpDocumentAccessor1_1();
                var mondaiDocument = accessor.Load(tempFile.Name);

            //				var element = EmpDocument.Load(tempFile.Name);
            //				var mondaiDocument = element.GetMondaiDocument();

                var shomon = (Shomon)mondaiDocument.GetItem("shomon0");
                Assert.AreEqual("bbb", shomon.Mondaibun);
                CollectionAssert.AreEqual(new []
                {
                    new MondaiWord("This"),
                    new MondaiWord("watch"),
                    new MondaiWord("cost"),
                    new MondaiWord("me"),
                    new MondaiWord("7,500 yen"),
                    new MondaiWord("."),
                }, shomon.MondaiWords);
            }
        }
        public void 括弧とクォーテーションに対応させる()
        {
            var text = @"
            version = 1.1
            document
            {
            id = document0
            title =

            daimon
            {
            id = daimon0
            title =

            chumon
            {
            id = chumon0
            title =
            shuffle = true
            helpId =
            helpId =

            shomon
            {
                id = shomon0
                q = bbb
                c = Not saying (""thank you"") is rude.
            }
            }
            }
            }";

            using (var tempFile = new TempFile(text))
            {
                var accessor = new EmpDocumentAccessor1_1();
                var mondaiDocument = accessor.Load(tempFile.Name);

            //				var element = EmpDocument.Load(tempFile.Name);
            //				var mondaiDocument = element.GetMondaiDocument();

                var shomon = (Shomon)mondaiDocument.GetItem("shomon0");
                Assert.AreEqual("bbb", shomon.Mondaibun);
                CollectionAssert.AreEqual(new []
                {
                    new MondaiWord("Not"),
                    new MondaiWord("saying"),
                    new MondaiWord(@"""thank you"""),
                    new MondaiWord("is"),
                    new MondaiWord("rude"),
                    new MondaiWord("."),
                }, shomon.MondaiWords);
            }
        }
        public void セミコロンを分割するテスト()
        {
            var text = @"
            version = 1.1
            document
            {
            id = document0
            title =

            daimon
            {
            id = daimon0
            title =

            chumon
            {
            id = chumon0
            title =
            shuffle = true
            helpId =
            helpId =

            shomon
            {
                id = shomon0
                q = bbb
                c = We stopped talking; otherwise
            }
            }
            }
            }";

            using (var tempFile = new TempFile(text))
            {
                var accessor = new EmpDocumentAccessor1_1();
                var mondaiDocument = accessor.Load(tempFile.Name);

            //				var element = EmpDocument.Load(tempFile.Name);
            //				var mondaiDocument = element.GetMondaiDocument();

                var shomon = (Shomon)mondaiDocument.GetItem("shomon0");
                Assert.AreEqual("bbb", shomon.Mondaibun);
                CollectionAssert.AreEqual(new []
                {
                    new MondaiWord("We"),
                    new MondaiWord("stopped"),
                    new MondaiWord("talking"),
                    new MondaiWord(";"),
                    new MondaiWord("otherwise"),
                }, shomon.MondaiWords);
            }
        }
        public void ダブルクォーテーションの不具合()
        {
            var text = @"
            version = 1.1
            document
            {
            id = document0
            title =

            daimon
            {
            id = daimon0
            title =

            chumon
            {
            id = chumon0
            title =
            shuffle = true
            helpId =
            helpId =

            shomon
            {
                id = shomon0
                q = bbb
                c = He said, ""If only she were here.""
            }
            }
            }
            }";

            using (var tempFile = new TempFile(text))
            {
                var accessor = new EmpDocumentAccessor1_1();
                var mondaiDocument = accessor.Load(tempFile.Name);

            //				var element = EmpDocument.Load(tempFile.Name);
            //				var mondaiDocument = element.GetMondaiDocument();

                var shomon = (Shomon)mondaiDocument.GetItem("shomon0");
                Assert.AreEqual("bbb", shomon.Mondaibun);

            /*			foreach (var item in shomon.MondaiWords)
                {
                    Console.WriteLine(item.Text);
                }*/

                Assert.AreEqual(@"He said, ""If only she were here.""", EmpDocument.先頭と末尾のダブルクォーテーションを取り除く(@"He said, ""If only she were here."""));

            //				var t = element.Body.GetAllItems().Where(x => "sei" == x.Name).First().Value;
            //				Assert.AreEqual(@"He said, ""If only she were here.""", t);
                CollectionAssert.AreEqual(new []
                {
                    new MondaiWord("He"),
                    new MondaiWord("said"),
                    new MondaiWord(","),
                    new MondaiWord(@""""),
                    new MondaiWord("If"),
                    new MondaiWord("only"),
                    new MondaiWord("she"),
                    new MondaiWord("were"),
                    new MondaiWord("here"),
                    new MondaiWord("."),
                    new MondaiWord(@""""),
                }, shomon.MondaiWords);
            }
        }
        public void ヴァージョン違い例外()
        {
            var text =
            @"
            version = 1.0

            document
            {}
            ";
            // 正しくは1.1
            var accessor = new EmpDocumentAccessor1_1();
            Assert.Throws<EmpException>(() =>
            {
                using (var tempFile = new TempFile(text))
                {
                    accessor.Load(tempFile.Name);
                }
            });
        }