public void XmlCodeSnippetSourceTest()
        {
            var xmlBlock = new XmlBlock
            {
                Name = XmlBlockTestName,
                Syntax = XmlBlockTestSyntax,
                Tags = XmlBlockTestTags,
                Description = XmlBlockTestDescription,
                Prerequisites = XmlBlockTestPrerequisites,
                Blocks = new[]
                {
                    new XmlBlock
                    {
                        Name = XmlSubBlockTestName,
                        Tags = XmlSubBlockTestTags,
                        Prerequisites = XmlSubBlockTestPrerequisites,
                        CodeSnippets = new[]
                        {
                            new XmlCode
                            {
                                Tags = XmlSubItem1TestTags,
                                Code = XmlSubItem1TestCode
                            },
                            new XmlCode
                            {
                                Tags = XmlSubItem2TestTags,
                                Code = XmlSubItem2TestCode
                            }
                        }
                    }
                }
            };

            var xmlCodeSnippetSource = new XmlCodeSnippetSource(xmlBlock, XmlBlockPath);
            var result = xmlCodeSnippetSource.Search(new SortedSet<string>(new[] {"now"}));
            Assert.AreEqual(result.Count, 1);
            Assert.AreEqual(result[0].Code, "datetime.now()");
            Assert.AreEqual(result[0].Syntax, "python");
            Assert.AreEqual(result[0].SpecificTags, new SortedSet<string>(new[] {"now"}));
            Assert.AreEqual(result[0].AllTags, new SortedSet<string>(new[] {"datetime", "now", "pandas", "python"}));
            Assert.AreEqual(result[0].Context.Name, "Date and Time Data Types and Tools");
            Assert.AreEqual(result[0].Context.Prerequisites, "from datatime import datetime");
            Assert.AreEqual(result[0].Context.Description, string.Empty);
            Assert.AreEqual(result[0].Context.Syntax, "python");
            Assert.AreEqual(result[0].Context.SpecificTags, new SortedSet<string>(new[] {"datetime"}));
            Assert.AreEqual(result[0].Context.AllTags, new SortedSet<string>(new[] {"datetime", "pandas", "python"}));
        }
        public void CompositeCodeSnippetSourceTest()
        {
            var xmlBlock1 = new XmlBlock
                {
                    Name = XmlBlockTestName,
                    Syntax = XmlBlockTestSyntax,
                    Tags = XmlBlockTestTags,
                    Description = XmlBlockTestDescription,
                    Prerequisites = XmlBlockTestPrerequisites,
                    CodeSnippets = new[]
                        {
                            new XmlCode
                                {
                                    Tags = XmlSubItem1TestTags,
                                    Code = XmlSubItem1TestCode
                                }
                        }
                };

            var xmlBlock2 = new XmlBlock
                {
                    Name = XmlBlockTestName,
                    Syntax = XmlBlockTestSyntax,
                    Tags = XmlBlockTestTags,
                    Description = XmlBlockTestDescription,
                    Prerequisites = XmlBlockTestPrerequisites,
                    CodeSnippets = new[]
                        {
                            new XmlCode
                                {
                                    Tags = XmlSubItem2TestTags,
                                    Code = XmlSubItem2TestCode
                                }
                        }
                };

            var xmlCodeSnippetSource1 = new XmlCodeSnippetSource(xmlBlock1);
            var xmlCodeSnippetSource2 = new XmlCodeSnippetSource(xmlBlock2);
            var compositeCodeSnippetSource = new CompositeCodeSnippetSource(
                new List<CodeSnippetSourceBase>
                    {
                        xmlCodeSnippetSource1,
                        xmlCodeSnippetSource2
                    });

            var result = compositeCodeSnippetSource.Search(new SortedSet<string>(new[] {"constructor"}));
            Assert.AreEqual(result.Count, 1);
            Assert.AreEqual(result[0].Code, "datetime(2013, 5, 7, 12, 0, 0, 0)");
            Assert.AreEqual(result[0].Syntax, "python");
            Assert.AreEqual(result[0].SpecificTags, new SortedSet<string>(new[] { "constructor" }));
            Assert.AreEqual(result[0].AllTags, new SortedSet<string>(new[] { "constructor", "datetime", "python" }));
            Assert.AreEqual(result[0].Context.Name, "Date and Time Data Types and Tools");
            Assert.AreEqual(result[0].Context.Prerequisites, "from datatime import datetime");
            Assert.AreEqual(result[0].Context.Description, "http://pandas.pydata.org/");
            Assert.AreEqual(result[0].Context.Syntax, "python");
            Assert.AreEqual(result[0].Context.SpecificTags, new SortedSet<string>(new[] { "datetime", "python" }));
            Assert.AreEqual(result[0].Context.AllTags, new SortedSet<string>(new[] { "datetime", "python" }));
        }