public void TestParseIfNested()
        {
            using (var docStream = AssemblyResourceHelper.GetResourceStream(this, "text_in_if_document.xml"))
            {
                doc = XDocument.Load(docStream);

                var expectedRootProcessor = new RootProcessor();
                ITagProcessor expectedIfProcessor = new IfProcessor();

                expectedIfProcessor.AddProcessor(new TextProcessor());
                var expectedIfProcessors = new List<ITagProcessor>(expectedIfProcessor.Processors);
                expectedRootProcessor.AddProcessor(expectedIfProcessor);
                var expectedRootProcessors = new List<ITagProcessor>(expectedRootProcessor.Processors);

                var actualRootProcessor = new RootProcessor();
                generalParser.Parse(actualRootProcessor, doc.Root);

                var actualRootProcessors = new List<ITagProcessor>(actualRootProcessor.Processors);
                Assert.AreEqual(expectedRootProcessors.Count, actualRootProcessors.Count);
                Assert.AreEqual(expectedRootProcessors[0].GetType(), actualRootProcessors[0].GetType());
                var actualIfProcessors = new List<ITagProcessor>(actualRootProcessors[0].Processors);
                Assert.AreEqual(expectedIfProcessors.Count, actualIfProcessors.Count);
                Assert.AreEqual(expectedIfProcessors[0].GetType(), actualIfProcessors[0].GetType());
                Assert.AreEqual(expectedIfProcessors[0].Processors.Count, expectedIfProcessors[0].Processors.Count);
            }
        }
Exemple #2
0
        public void TestParseIfNested()
        {
            using (var docStream = AssemblyResourceHelper.GetResourceStream(this, "text_in_if_document.xml"))
            {
                doc = XDocument.Load(docStream);

                var           expectedRootProcessor = new RootProcessor();
                ITagProcessor expectedIfProcessor   = new IfProcessor();

                expectedIfProcessor.AddProcessor(new TextProcessor());
                var expectedIfProcessors = new List <ITagProcessor>(expectedIfProcessor.Processors);
                expectedRootProcessor.AddProcessor(expectedIfProcessor);
                var expectedRootProcessors = new List <ITagProcessor>(expectedRootProcessor.Processors);

                var actualRootProcessor = new RootProcessor();
                generalParser.Parse(actualRootProcessor, doc.Root);

                var actualRootProcessors = new List <ITagProcessor>(actualRootProcessor.Processors);
                Assert.AreEqual(expectedRootProcessors.Count, actualRootProcessors.Count);
                Assert.AreEqual(expectedRootProcessors[0].GetType(), actualRootProcessors[0].GetType());
                var actualIfProcessors = new List <ITagProcessor>(actualRootProcessors[0].Processors);
                Assert.AreEqual(expectedIfProcessors.Count, actualIfProcessors.Count);
                Assert.AreEqual(expectedIfProcessors[0].GetType(), actualIfProcessors[0].GetType());
                Assert.AreEqual(expectedIfProcessors[0].Processors.Count, expectedIfProcessors[0].Processors.Count);
            }
        }
        private ProcessorTopology BuildTopology(ISet<string> nodeGroup)
        {
            IProcessor rootProcessor = new RootProcessor();
            IDictionary<string, IProcessor> sources = new Dictionary<string, IProcessor>();
            IDictionary<string, IProcessor> sinks = new Dictionary<string, IProcessor>();
            IDictionary<string, IProcessor> processors = new Dictionary<string, IProcessor>();
            IDictionary<string, IStateStore> stateStores = new Dictionary<string, IStateStore>();

            foreach (var nodeFactory in nodeFactories.Values)
            {
                if(nodeGroup == null || nodeGroup.Contains(nodeFactory.Name))
                {
                    var processor = nodeFactory.Build();
                    processors.Add(nodeFactory.Name, processor);

                    if (nodeFactory is IProcessorNodeFactory)
                        BuildProcessorNode(processors, stateStores, nodeFactory as IProcessorNodeFactory, processor);
                    else if (nodeFactory is ISourceNodeFactory)
                        BuildSourceNode(sources, nodeFactory as ISourceNodeFactory, processor);
                    else if (nodeFactory is ISinkNodeFactory)
                        BuildSinkNode(processors, sinks, nodeFactory as ISinkNodeFactory, processor);
                    else
                        throw new TopologyException($"Unknown definition class: {nodeFactory.GetType().Name}");
                }
            }

            foreach (var sourceProcessor in sources.Values)
                rootProcessor.AddNextProcessor(sourceProcessor);

            return new ProcessorTopology(rootProcessor, sources, sinks, processors, stateStores);
        }
 protected ControllerRequestProcessor(
     RootProcessor module,
     ProfileManager profileManager)
     : base(module, profileManager)
 {
     Contract.Requires<ArgumentNullException>(module != null);
     Contract.Requires<ArgumentNullException>(profileManager != null);
 }
Exemple #5
0
        private ProcessorTopology BuildTopology(ISet <string> nodeGroup, TaskId taskId)
        {
            // need refactor a little for repartition topic/processor source & sink etc .. change topic name
            IProcessor rootProcessor = new RootProcessor();
            IDictionary <string, IProcessor>  sources     = new Dictionary <string, IProcessor>();
            IDictionary <string, IProcessor>  sinks       = new Dictionary <string, IProcessor>();
            IDictionary <string, IProcessor>  processors  = new Dictionary <string, IProcessor>();
            IDictionary <string, IStateStore> stateStores = new Dictionary <string, IStateStore>();
            IList <string> repartitionTopics = new List <string>();

            foreach (var nodeFactory in nodeFactories.Values)
            {
                if (nodeGroup == null || nodeGroup.Contains(nodeFactory.Name))
                {
                    var processor = nodeFactory.Build();
                    processors.Add(nodeFactory.Name, processor);

                    if (nodeFactory is IProcessorNodeFactory)
                    {
                        BuildProcessorNode(processors, stateStores, nodeFactory as IProcessorNodeFactory, processor, taskId);
                    }
                    else if (nodeFactory is ISourceNodeFactory)
                    {
                        BuildSourceNode(sources, repartitionTopics, nodeFactory as ISourceNodeFactory, processor);
                    }
                    else if (nodeFactory is ISinkNodeFactory)
                    {
                        BuildSinkNode(processors, repartitionTopics, sinks, nodeFactory as ISinkNodeFactory, processor);
                    }
                    else
                    {
                        throw new TopologyException($"Unknown definition class: {nodeFactory.GetType().Name}");
                    }
                }
            }

            foreach (var sourceProcessor in sources.Values)
            {
                rootProcessor.AddNextProcessor(sourceProcessor);
            }

            var storesToChangelog = new Dictionary <string, string>(
                storesToTopics
                .Where(e => stateStores.ContainsKey(e.Key) ||
                       GlobalStateStores.ContainsKey(e.Key)));

            return(new ProcessorTopology(
                       rootProcessor,
                       sources,
                       sinks,
                       processors,
                       stateStores,
                       GlobalStateStores,
                       storesToChangelog,
                       repartitionTopics.Distinct().ToList()));
        }
Exemple #6
0
        public void TestParse()
        {
            var expectedTableProcessor = new TableProcessor();
            var expectedIfProcessor    = new IfProcessor();

            expectedIfProcessor.AddProcessor(new TextProcessor());
            expectedTableProcessor.AddProcessor(new TextProcessor());
            expectedTableProcessor.AddProcessor(expectedIfProcessor);
            var expectedRepeaterProcessor = new RepeaterProcessor();

            expectedRepeaterProcessor.AddProcessor(new TextProcessor());
            var expectedRootProcessor = new RootProcessor();

            expectedRootProcessor.AddProcessor(expectedTableProcessor);
            expectedRootProcessor.AddProcessor(expectedRepeaterProcessor);

            var actualRootProcessor = new RootProcessor();

            generalParser.Parse(actualRootProcessor, this.doc.Root);

            Assert.AreEqual(2, actualRootProcessor.Processors.Count);
            var actualInnerRootProcessors = new List <ITagProcessor>(actualRootProcessor.Processors);

            Assert.AreEqual(typeof(TableProcessor), actualInnerRootProcessors[0].GetType());
            Assert.AreEqual(typeof(RepeaterProcessor), actualInnerRootProcessors[1].GetType());

            var actualTableProcessor = actualInnerRootProcessors[0];

            Assert.AreEqual(2, actualTableProcessor.Processors.Count);
            var actualInnerTableProcessors = new List <ITagProcessor>(actualTableProcessor.Processors);

            Assert.AreEqual(typeof(TextProcessor), actualInnerTableProcessors[0].GetType());
            Assert.AreEqual(typeof(IfProcessor), actualInnerTableProcessors[1].GetType());

            Assert.AreEqual(0, actualInnerTableProcessors[0].Processors.Count);
            var actualIfProcessor = actualInnerTableProcessors[1];

            Assert.AreEqual(1, actualIfProcessor.Processors.Count);
            var actualInnerIfProcessors = new List <ITagProcessor>(actualIfProcessor.Processors);

            Assert.AreEqual(typeof(TextProcessor), actualInnerIfProcessors[0].GetType());

            var actualRepeaterProcessor = actualInnerRootProcessors[1];

            Assert.AreEqual(1, actualRepeaterProcessor.Processors.Count);
            var actualInnerRepeaterProcessors = new List <ITagProcessor>(actualRepeaterProcessor.Processors);

            Assert.AreEqual(typeof(TextProcessor), actualInnerRepeaterProcessors[0].GetType());
            Assert.AreEqual(0, actualInnerRepeaterProcessors[0].Processors.Count);
        }
        public void TestParseNedted()
        {
            var parser        = new TableParser();
            var rootProcessor = new RootProcessor();
            var tableElement  = this.nestedDocumentRoot.Element(WordMl.TableName);

            parser.Parse(rootProcessor, this.nestedDocumentRoot.Elements(WordMl.SdtName).First());

            var tableProcessor = rootProcessor.Processors.First();
            var tag            = ((TableProcessor)tableProcessor).TableTag;

            Assert.AreEqual(4, tag.DynamicRow);
            Assert.AreEqual("//test/certificates", tag.TagTable.Value);
            Assert.AreEqual(tableElement, tag.Table);
            this.CheckTagElements(tag);
            Assert.AreEqual(2, tableProcessor.Processors.Count);
            Assert.IsTrue(tableProcessor.Processors.All(p => p is TextProcessor));
        }
        public void TestParseCplx()
        {
            using (var docStream = AssemblyResourceHelper.GetResourceStream(this, "document_dontworking_if.xml"))
            {
                var doc          = XDocument.Load(docStream);
                var documentRoot = doc.Root.Element(WordMl.WordMlNamespace + "body");

                var parser          = new IfParser();
                var startElement    = TraverseUtils.TagElement(documentRoot, "If");
                var endElement      = TraverseUtils.TagElement(documentRoot, "EndIf");
                var parentProcessor = new RootProcessor();
                parser.Parse(parentProcessor, startElement);

                var          ifProcessor = (IfProcessor)parentProcessor.Processors.First();
                var          ifTag       = ifProcessor.Tag;
                const string IfCondition = "//test/condition";

                Assert.IsNotNull(ifProcessor);

                //Assert.IsTrue(IfCondition.Equals(ifTag.Conidition));
                CollectionAssert.AreEqual(Encoding.UTF8.GetBytes(IfCondition), Encoding.UTF8.GetBytes(ifTag.Conidition));

                Assert.AreEqual(startElement, ifTag.StartIf);
                Assert.AreEqual(endElement, ifTag.EndIf);

                var elements = ifTag.IfContent.ToList();

                Assert.AreEqual(1, elements.Count());

                /*
                 * Assert.IsTrue(elements.Take(6).All(e => e.Name.Equals(WordMl.TextRunName)));
                 * Assert.IsTrue(elements.Skip(6).Take(1).All(e => e.Name.Equals(WordMl.ParagraphName)));
                 * Assert.IsTrue(elements.Skip(7).Take(1).All(e => e.Name.Equals(WordMl.ParagraphPropertiesName)));
                 * Assert.IsTrue(elements.Skip(8).Take(1).All(e => e.Name.Equals(WordMl.BookmarkStartName)));
                 * Assert.IsTrue(elements.Skip(9).Take(4).All(e => e.Name.Equals(WordMl.TextRunName)));
                 * Assert.IsTrue(elements.Skip(13).Take(1).All(e => e.Name.Equals(WordMl.ProofingErrorAnchorName)));
                 * Assert.IsTrue(elements.Skip(14).Take(1).All(e => e.Name.Equals(WordMl.TextRunName)));
                 * Assert.IsTrue(elements.Skip(15).Take(1).All(e => e.Name.Equals(WordMl.ProofingErrorAnchorName)));
                 * Assert.IsTrue(elements.Skip(16).Take(1).All(e => e.Name.Equals(WordMl.TextRunName)));
                 */
                Assert.AreEqual(startElement, ifTag.StartIf);
                Assert.AreEqual(endElement, ifTag.EndIf);
            }
        }
Exemple #9
0
        private ProcessorTopology BuildTopology(ISet <string> nodeGroup, TaskId taskId)
        {
            IProcessor rootProcessor = new RootProcessor();
            IDictionary <string, IProcessor>  sources     = new Dictionary <string, IProcessor>();
            IDictionary <string, IProcessor>  sinks       = new Dictionary <string, IProcessor>();
            IDictionary <string, IProcessor>  processors  = new Dictionary <string, IProcessor>();
            IDictionary <string, IStateStore> stateStores = new Dictionary <string, IStateStore>();

            foreach (var nodeFactory in nodeFactories.Values)
            {
                if (nodeGroup == null || nodeGroup.Contains(nodeFactory.Name))
                {
                    var processor = nodeFactory.Build();
                    processors.Add(nodeFactory.Name, processor);

                    switch (nodeFactory)
                    {
                    case IProcessorNodeFactory factory:
                        BuildProcessorNode(processors, stateStores, factory, processor, taskId);
                        break;

                    case ISourceNodeFactory sourceNodeFactory:
                        BuildSourceNode(sources, sourceNodeFactory, processor);
                        break;

                    case ISinkNodeFactory sinkNodeFactory:
                        BuildSinkNode(processors, sinks, sinkNodeFactory, processor);
                        break;

                    default:
                        throw new TopologyException($"Unknown definition class: {nodeFactory.GetType().Name}");
                    }
                }
            }

            foreach (var sourceProcessor in sources.Values)
            {
                rootProcessor.AddNextProcessor(sourceProcessor);
            }

            return(new ProcessorTopology(rootProcessor, sources, sinks, processors, stateStores, GlobalStateStores, storesToTopics));
        }
        public void TestParse()
        {
            using (var docStream = AssemblyResourceHelper.GetResourceStream(this, "IfParserTest.xml"))
            {
                var doc          = XDocument.Load(docStream);
                var documentRoot = doc.Root.Element(WordMl.WordMlNamespace + "body");

                var parser          = new IfParser();
                var startElement    = TraverseUtils.TagElement(documentRoot, "If");
                var endElement      = TraverseUtils.TagElement(documentRoot, "EndIf");
                var parentProcessor = new RootProcessor();
                parser.Parse(parentProcessor, startElement);

                var          ifProcessor = (IfProcessor)parentProcessor.Processors.First();
                var          ifTag       = ifProcessor.Tag;
                const string IfCondition = "//test/condition";

                Assert.IsNotNull(ifProcessor);
                Assert.AreEqual(IfCondition, ifTag.Conidition);
                var content = ifTag.IfContent.ToList();
                Assert.AreEqual(1, content.Count);
                Assert.AreEqual(WordMl.ParagraphName, content[0].Name);
                var paragraphChildren = content[0].Elements().ToList();
                Assert.AreEqual(6, paragraphChildren.Count());
                Assert.AreEqual(WordMl.ParagraphPropertiesName, paragraphChildren[0].Name);
                Assert.AreEqual(WordMl.ProofingErrorAnchorName, paragraphChildren[1].Name);
                Assert.AreEqual(WordMl.TextRunName, paragraphChildren[2].Name);
                Assert.AreEqual("Hello", paragraphChildren[2].Value);
                Assert.AreEqual(WordMl.ProofingErrorAnchorName, paragraphChildren[3].Name);
                Assert.AreEqual(WordMl.TextRunName, paragraphChildren[4].Name);
                Assert.AreEqual(", World!", paragraphChildren[4].Value);
                Assert.AreEqual(WordMl.SdtName, paragraphChildren[5].Name);
                Assert.IsTrue(paragraphChildren[5].IsTag("text"));
                Assert.AreEqual(startElement, ifTag.StartIf);
                Assert.AreEqual(endElement, ifTag.EndIf);

                var textProcessor = (TextProcessor)ifProcessor.Processors.FirstOrDefault();
                Assert.IsNotNull(textProcessor);
                Assert.IsNotNull(textProcessor.TextTag);
                Assert.AreEqual("//test/text", textProcessor.TextTag.Expression);
            }
        }
        public void TestParse()
        {
            using (var docStream = AssemblyResourceHelper.GetResourceStream(this, "IfParserTest.xml"))
            {
                var doc = XDocument.Load(docStream);
                var documentRoot = doc.Root.Element(WordMl.WordMlNamespace + "body");

                var parser = new IfParser();
                var startElement = TraverseUtils.TagElement(documentRoot, "If");
                var endElement = TraverseUtils.TagElement(documentRoot, "EndIf");
                var parentProcessor = new RootProcessor();
                parser.Parse(parentProcessor, startElement);

                var ifProcessor = (IfProcessor) parentProcessor.Processors.First();
                var ifTag = ifProcessor.Tag;
                const string IfCondition = "//test/condition";

                Assert.IsNotNull(ifProcessor);
                Assert.AreEqual(IfCondition, ifTag.Conidition);
                var content = ifTag.IfContent.ToList();
                Assert.AreEqual(1, content.Count);
                Assert.AreEqual(WordMl.ParagraphName, content[0].Name);
                var paragraphChildren = content[0].Elements().ToList();
                Assert.AreEqual(6, paragraphChildren.Count());
                Assert.AreEqual(WordMl.ParagraphPropertiesName, paragraphChildren[0].Name);
                Assert.AreEqual(WordMl.ProofingErrorAnchorName, paragraphChildren[1].Name);
                Assert.AreEqual(WordMl.TextRunName, paragraphChildren[2].Name);
                Assert.AreEqual("Hello", paragraphChildren[2].Value);
                Assert.AreEqual(WordMl.ProofingErrorAnchorName, paragraphChildren[3].Name);
                Assert.AreEqual(WordMl.TextRunName, paragraphChildren[4].Name);
                Assert.AreEqual(", World!", paragraphChildren[4].Value);
                Assert.AreEqual(WordMl.SdtName, paragraphChildren[5].Name);
                Assert.IsTrue(paragraphChildren[5].IsTag("text"));
                Assert.AreEqual(startElement, ifTag.StartIf);
                Assert.AreEqual(endElement, ifTag.EndIf);

                var textProcessor = (TextProcessor) ifProcessor.Processors.FirstOrDefault();
                Assert.IsNotNull(textProcessor);
                Assert.IsNotNull(textProcessor.TextTag);
                Assert.AreEqual("//test/text", textProcessor.TextTag.Expression);
            }
        }
        public void TestParse()
        {
            var expectedTableProcessor = new TableProcessor();
            var expectedIfProcessor = new IfProcessor();
            expectedIfProcessor.AddProcessor(new TextProcessor());
            expectedTableProcessor.AddProcessor(new TextProcessor());
            expectedTableProcessor.AddProcessor(expectedIfProcessor);
            var expectedRepeaterProcessor = new RepeaterProcessor();
            expectedRepeaterProcessor.AddProcessor(new TextProcessor());
            var expectedRootProcessor = new RootProcessor();
            expectedRootProcessor.AddProcessor(expectedTableProcessor);
            expectedRootProcessor.AddProcessor(expectedRepeaterProcessor);

            var actualRootProcessor = new RootProcessor();
            generalParser.Parse(actualRootProcessor, this.doc.Root);

            Assert.AreEqual(2, actualRootProcessor.Processors.Count);
            var actualInnerRootProcessors = new List<ITagProcessor>(actualRootProcessor.Processors);
            Assert.AreEqual(typeof(TableProcessor), actualInnerRootProcessors[0].GetType());
            Assert.AreEqual(typeof(RepeaterProcessor), actualInnerRootProcessors[1].GetType());

            var actualTableProcessor = actualInnerRootProcessors[0];
            Assert.AreEqual(2, actualTableProcessor.Processors.Count);
            var actualInnerTableProcessors = new List<ITagProcessor>(actualTableProcessor.Processors);
            Assert.AreEqual(typeof(TextProcessor), actualInnerTableProcessors[0].GetType());
            Assert.AreEqual(typeof(IfProcessor), actualInnerTableProcessors[1].GetType());

            Assert.AreEqual(0, actualInnerTableProcessors[0].Processors.Count);
            var actualIfProcessor = actualInnerTableProcessors[1];

            Assert.AreEqual(1, actualIfProcessor.Processors.Count);
            var actualInnerIfProcessors = new List<ITagProcessor>(actualIfProcessor.Processors);
            Assert.AreEqual(typeof(TextProcessor), actualInnerIfProcessors[0].GetType());

            var actualRepeaterProcessor = actualInnerRootProcessors[1];
            Assert.AreEqual(1,actualRepeaterProcessor.Processors.Count);
            var actualInnerRepeaterProcessors = new List<ITagProcessor>(actualRepeaterProcessor.Processors);
            Assert.AreEqual(typeof(TextProcessor), actualInnerRepeaterProcessors[0].GetType());
            Assert.AreEqual(0, actualInnerRepeaterProcessors[0].Processors.Count);
        }
        public void TestParseComplex()
        {
            using (var docStream = AssemblyResourceHelper.GetResourceStream(this, "ComplexIf.xml"))
            {
                var doc = XDocument.Load(docStream);
                var documentRoot = doc.Root.Element(WordMl.WordMlNamespace + "body");

                var parser = new IfParser();
                var startElement = TraverseUtils.TagElement(documentRoot, "If");
                var endElement = TraverseUtils.TagElement(documentRoot, "EndIf");
                var parentProcessor = new RootProcessor();
                parser.Parse(parentProcessor, startElement);

                var ifProcessor = (IfProcessor) parentProcessor.Processors.First();
                var ifTag = ifProcessor.Tag;
                const string IfCondition = "//test/condition";

                Assert.IsNotNull(ifProcessor);
                Assert.AreEqual(IfCondition, ifTag.Conidition);

                Assert.AreEqual(startElement, ifTag.StartIf);
                Assert.AreEqual(endElement, ifTag.EndIf);

                var elements = ifTag.IfContent.ToList();

                Assert.AreEqual(17, elements.Count());
                Assert.IsTrue(elements.Take(6).All(e => e.Name.Equals(WordMl.TextRunName)));
                Assert.IsTrue(elements.Skip(6).Take(1).All(e => e.Name.Equals(WordMl.ParagraphName)));
                Assert.IsTrue(elements.Skip(7).Take(1).All(e => e.Name.Equals(WordMl.ParagraphPropertiesName)));
                Assert.IsTrue(elements.Skip(8).Take(1).All(e => e.Name.Equals(WordMl.BookmarkStartName)));
                Assert.IsTrue(elements.Skip(9).Take(4).All(e => e.Name.Equals(WordMl.TextRunName)));
                Assert.IsTrue(elements.Skip(13).Take(1).All(e => e.Name.Equals(WordMl.ProofingErrorAnchorName)));
                Assert.IsTrue(elements.Skip(14).Take(1).All(e => e.Name.Equals(WordMl.TextRunName)));
                Assert.IsTrue(elements.Skip(15).Take(1).All(e => e.Name.Equals(WordMl.ProofingErrorAnchorName)));
                Assert.IsTrue(elements.Skip(16).Take(1).All(e => e.Name.Equals(WordMl.TextRunName)));

                Assert.AreEqual(startElement, ifTag.StartIf);
                Assert.AreEqual(endElement, ifTag.EndIf);
            }
        }
Exemple #14
0
        public void TestParseNested()
        {
            var parser        = new RepeaterParser();
            var rootProcessor = new RootProcessor();

            parser.Parse(rootProcessor, this.nestedDocumentRoot.Descendants(WordMl.SdtName).First());

            var repeaterProcessor = rootProcessor.Processors.First();
            var result            = ((RepeaterProcessor)repeaterProcessor).RepeaterTag;

            var repeaterElements =
                TraverseUtils.ElementsBetween(result.StartRepeater, result.EndRepeater)
                .Select(result.MakeElementCallback).ToList();

            Assert.AreEqual(2, repeaterElements.Count);

            var textTag = repeaterElements.First();

            Assert.IsTrue(textTag.XElement.IsSdt());
            Assert.IsTrue(textTag.XElement.IsTag("Text"));

            var repeaterContent = repeaterElements[1].Elements.ToList();

            Assert.AreEqual(10, repeaterContent.Count);
            var textSdt = repeaterContent[3];

            Assert.IsNull(textSdt.Expression);
            Assert.IsTrue(textSdt.XElement.IsSdt());
            Assert.IsTrue(textSdt.XElement.IsTag("Text"));
            Assert.AreEqual("./Subject", repeaterContent[4].Expression);
            Assert.AreEqual(true, repeaterContent[6].IsIndex);
            Assert.AreEqual("./ExpireDate", repeaterContent[8].Expression);
            Assert.AreEqual("//test/certificates", result.Source);

            Assert.IsTrue(repeaterProcessor.Processors.All(p => p is TextProcessor));
            Assert.AreEqual(2, repeaterProcessor.Processors.Count);
        }
        public void TestParseNedted()
        {
            var parser = new TableParser();
            var rootProcessor = new RootProcessor();
            var tableElement = this.nestedDocumentRoot.Element(WordMl.TableName);
            parser.Parse(rootProcessor, this.nestedDocumentRoot.Elements(WordMl.SdtName).First());

            var tableProcessor = rootProcessor.Processors.First();
            var tag = ((TableProcessor)tableProcessor).TableTag;
            Assert.AreEqual(4, tag.DynamicRow);
            Assert.AreEqual("//test/certificates", tag.TagTable.Value);
            Assert.AreEqual(tableElement, tag.Table);
            this.CheckTagElements(tag);
            Assert.AreEqual(2, tableProcessor.Processors.Count);
            Assert.IsTrue(tableProcessor.Processors.All(p => p is TextProcessor));
        }
        public void TestParseNested()
        {
            var parser = new RepeaterParser();
            var rootProcessor = new RootProcessor();
            parser.Parse(rootProcessor, this.nestedDocumentRoot.Descendants(WordMl.SdtName).First());

            var repeaterProcessor = rootProcessor.Processors.First();
            var result = ((RepeaterProcessor)repeaterProcessor).RepeaterTag;

            var repeaterElements = 
                TraverseUtils.ElementsBetween(result.StartRepeater, result.EndRepeater)
                             .Select(result.MakeElementCallback).ToList();
            Assert.AreEqual(2, repeaterElements.Count);

            var textTag = repeaterElements.First();

            Assert.IsTrue(textTag.XElement.IsSdt());
            Assert.IsTrue(textTag.XElement.IsTag("Text"));

            var repeaterContent = repeaterElements[1].Elements.ToList();

            Assert.AreEqual(10, repeaterContent.Count);
            var textSdt = repeaterContent[3];
            Assert.IsNull(textSdt.Expression);
            Assert.IsTrue(textSdt.XElement.IsSdt());
            Assert.IsTrue(textSdt.XElement.IsTag("Text"));
            Assert.AreEqual("./Subject", repeaterContent[4].Expression);
            Assert.AreEqual(true, repeaterContent[6].IsIndex);
            Assert.AreEqual("./ExpireDate", repeaterContent[8].Expression);
            Assert.AreEqual("//test/certificates", result.Source);

            Assert.IsTrue(repeaterProcessor.Processors.All(p => p is TextProcessor));
            Assert.AreEqual(2, repeaterProcessor.Processors.Count);
        }