Exemplo n.º 1
0
        public void ParserCanFormatArgumentWithSubExpressionMultiple()
        {
            var dt         = DateTime.Now;
            var dictionary = new Dictionary <string, object>
            {
                { "d", dt },
                { "f", 19191919 },
                { "by", 10L }
            };
            var exp = "d.(f.('d'), \"t\").('pl', by.(by, 'f'))";

            Assert.That(exp, Is.EqualTo(MorestachioExpression.ParseFrom(exp, TokenzierContext.FromText(exp), out _).ToString()));
            var parsingOptions = new ParserOptions("{{" + exp + "}}",
                                                   null, DefaultEncoding);
            var format           = "yyyy.mm";
            var formatterCalled  = false;
            var formatter2Called = false;
            var formatter3Called = false;

            parsingOptions.Formatters.AddSingle <int, string, string>((sourceValue, testString) =>
            {
                Assert.That(testString, Is.EqualTo("d"));
                formatterCalled = true;
                return(format);
            });
            parsingOptions.Formatters.AddSingle(new Func <long, long, string, int>(
                                                    (sourceValue, testString, f) =>
            {
                Assert.That(testString, Is.EqualTo(sourceValue));
                Assert.That(f, Is.EqualTo("f"));
                formatterCalled = true;
                return((int)sourceValue);
            }));
            parsingOptions.Formatters.AddSingle(new Func <DateTime, string, string, string>(
                                                    (sourceValue, testString2, shouldBed) =>
            {
                Assert.That(shouldBed, Is.EqualTo("t"));
                Assert.That(testString2, Is.EqualTo(format));
                formatter2Called = true;
                return(sourceValue.ToString(testString2));
            }));
            parsingOptions.Formatters.AddSingle(new Func <string, string, int, string>(
                                                    (sourceValue, name, number) =>
            {
                Assert.That(sourceValue, Is.EqualTo(dt.ToString(format)));
                Assert.That(name, Is.EqualTo("pl"));
                Assert.That(number, Is.EqualTo(dictionary["by"]));

                formatter3Called = true;
                return(sourceValue.PadLeft(number));
            }));

            var extendedParseInformation =
                Parser.ParseWithOptions(parsingOptions);
            var andStringify = extendedParseInformation.CreateAndStringify(dictionary);

            Assert.That(formatterCalled, Is.True, "The formatter was not called");
            Assert.That(formatter2Called, Is.True, "The Date formatter was not called");
            Assert.That(formatter3Called, Is.True, "The Pad formatter was not called");
            Assert.That(andStringify, Is.EqualTo(dt.ToString(format).PadLeft(int.Parse(dictionary["by"].ToString()))));
        }