public void OptionalPatternAlwaysMatches()
        {
            var element = new OptionalPatternElement("b");

            Assert.True(element.Parse("a").IsSuccess);
            Assert.True(element.Parse("a").IsOptionallyMatched);
        }
        private static void AddSectionEnding()
        {
            var sectionNodeAttribute = typeof(T).GetCustomAttribute <SectionNodeAttribute>();

            if (sectionNodeAttribute != null)
            {
                AbstractSkriptPatternElement section = new LiteralPatternElement(":");
                if (sectionNodeAttribute.Optional)
                {
                    section = new OptionalPatternElement
                    {
                        Element = section
                    };
                }

                ExpressionPattern.Children.Add(section);
            }
        }
        public void LoadPatterns()
        {
            Events.ForEach(e => e.LoadPatterns());

            var optionalOn = new OptionalPatternElement {
                Element = new LiteralPatternElement("on ")
            };

            Events.ForEach(e =>
            {
                if (e.PatternNodes.Length <= 0)
                {
                    return;
                }
                foreach (var node in e.PatternNodes)
                {
                    node.Children.Insert(0, optionalOn);
                }
            });
            Types.ForEach(e => e.LoadPatterns());
            Effects.ForEach(e => e.LoadPatterns());
            var types = Enum.GetValues(typeof(ExpressionType)).Cast <ExpressionType>().ToList();

            foreach (var expr in InnerExpressions)
            {
                if (Managers.SkriptTypesManager.BannedClassNames.Contains(expr.ClassName))
                {
                    continue;
                }

                var typeOrdinal = (int)expr.ExpressionType;
                for (var i = typeOrdinal + 1; i < types.Count; i++)
                {
                    _expressionTypesStartIndices[i]++;
                }

                Expressions.Insert(_expressionTypesStartIndices[typeOrdinal], expr);
            }

            Expressions.ForEach(e => e.LoadPatterns());

            Conditions.ForEach(e => e.LoadPatterns());
        }
        public void OptionalPatternRenderIsCorrect()
        {
            var element = new OptionalPatternElement("abc");

            Assert.Equal("[abc]", element.RenderPattern());
        }