public void ShouldConvertLineSeparatorForTextOnRtf()
        {
            const string replacement = "text\nwith\r\nnew lines";
            var replacements = new Dictionary<string, string> { { "value", replacement } };
            var evaluator = new ExpressionEvaluator(new Dictionary<string, bool>(), false);

            var engine = new TemplateEngine.TemplateEngine(evaluator, true, false, replacements);

            var result = engine.Apply("{\\rtf1\\ansi Sample with \\{tag=value\\}.}");
            Assert.AreEqual("{\\rtf1\\ansi Sample with text\\line\nwith\\line\nnew lines.}", result);
        }
        public void ShouldApplyTemplateOnText()
        {
            var dict = new Dictionary<string, bool> { { "Displayed", true } };
            var replacements = new Dictionary<string, string> { { "value", "text" } };
            var evaluator = new ExpressionEvaluator(dict, false);

            var engine = new TemplateEngine.TemplateEngine(evaluator, false, false, replacements);

            var result = engine.Apply(Text);
            Assert.AreEqual("It's a sample with a displayed text.", result);
        }
        public void ShouldAllowDictionnaryIgnoringCase()
        {
            var dict = new Dictionary<string, bool> { { "displaYED", true } };
            var replacements = new Dictionary<string, string> { { "VALue", "text" } };
            var evaluator = new ExpressionEvaluator(dict, true);

            var engine = new TemplateEngine.TemplateEngine(evaluator, false, true, replacements);

            var result = engine.Apply(Text);
            Assert.AreEqual("It's a sample with a displayed text.", result);
        }
        public void ShouldApplyTemplateOnRtf()
        {
            var dict = new Dictionary<string, bool> { { "visible", true } };
            var replacements = new Dictionary<string, string> { { "value", "some extra text" } };
            var evaluator = new ExpressionEvaluator(dict, false);

            var engine = new TemplateEngine.TemplateEngine(evaluator, true, false, replacements);

            var result = engine.Apply(RtfText);
            Assert.AreEqual(@"{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1036{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
            {\*\generator Riched20 6.3.9600}\viewkind4\uc1
            \pard\sa200\sl276\slmult1\b\f0\fs24\lang12 Sample of a RTF file.\par
            \b0\fs22 It can contain some paragraph. With a lot of text or not. Everything is possible. This part should be visible.\par
            \b We've added some extra text. \par
            }

            ", result);
        }
        /// <summary>
        ///     Create a template engine
        /// </summary>
        /// <param name="evaluator">The boolean expression evaluator</param>
        /// <param name="isRtf">Is template engine for RTF text?</param>
        /// <param name="replacements">List of tag replacements</param>
        /// <param name="ignoreCase">Is key is case sensitive?</param>
        public TemplateEngine(ExpressionEvaluator evaluator, bool isRtf, bool ignoreCase,
            Dictionary<string, string> replacements)
        {
            this.evaluator = evaluator;
            this.ignoreCase = ignoreCase;
            if (ignoreCase || isRtf)
            {
                var regexNewLine = new Regex("[\r]{0,1}\n",
                    RegexOptions.Compiled | RegexOptions.Singleline);

                this.replacements = new Dictionary<string, string>();
                foreach (var var in replacements)
                {
                    this.replacements.Add(
                        ignoreCase ? var.Key.ToUpper() : var.Key,
                        isRtf && !var.Value.Contains("{\\") ? regexNewLine.Replace(var.Value, "\\line\n") : var.Value
                    );
                }
            }
            else
            {
                this.replacements = replacements;
            }

            if (isRtf)
            {
                regexIf = new Regex(@"\\\{if=""(?<condition>[^""]+?)""\\\}(?<text>.*?)\\\{/if\\\}",
                    RegexOptions.Compiled | RegexOptions.Singleline);
                regexReplacement = new Regex(@"\\\{tag=(?<tag>[^}]+?)\\\}",
                    RegexOptions.Compiled | RegexOptions.Singleline);
            }
            else
            {
                regexIf = new Regex(@"\{if=""(?<condition>[^""]+?)""\}(?<text>.*?)\{/if\}",
                    RegexOptions.Compiled | RegexOptions.Singleline);
                regexReplacement = new Regex(@"\{tag=(?<tag>[^}]+?)\}",
                    RegexOptions.Compiled | RegexOptions.Singleline);
            }
        }
 private void AssertEquals(bool expected, string str, Dictionary<string, bool> dict)
 {
     var s = new ExpressionEvaluator(dict, false);
     Assert.AreEqual(expected, s.Evaluate(str));
 }
        public void ShouldDoNotConvertLineSeparatorOnText()
        {
            const string replacement = "text\nwith\r\nnew lines";
            var replacements = new Dictionary<string, string> { { "value", replacement } };
            var evaluator = new ExpressionEvaluator(new Dictionary<string, bool>(), false);

            var engine = new TemplateEngine.TemplateEngine(evaluator, false, false, replacements);

            var result = engine.Apply("Sample with {tag=value}.");
            Assert.AreEqual("Sample with " + replacement + ".", result);
        }
        public void ShouldThrowExceptionIfReplacementDoesNotExists()
        {
            var dict = new Dictionary<string, bool> { { "Displayed", true } };
            var replacements = new Dictionary<string, string>();
            var evaluator = new ExpressionEvaluator(dict, true);

            var engine = new TemplateEngine.TemplateEngine(evaluator, false, false, replacements);

            Assert.Throws<InvalidOperationException>(() => engine.Apply(Text));
        }
        public void ShouldRetrieveAllTagsIgnoringCase()
        {
            var dict = new Dictionary<string, bool>();
            var replacements = new Dictionary<string, string>();
            var evaluator = new ExpressionEvaluator(dict, true);

            var engine = new TemplateEngine.TemplateEngine(evaluator, false, true, replacements);

            var result = engine.GetAvailableTags(Text).ToList();
            Assert.AreEqual(2, result.Count);
            Assert.Contains("DISPLAYED", result);
            Assert.Contains("VALUE", result);
        }