public void TestEscaping() {
     MarkupExtensionsParser parser = new MarkupExtensionsParser(new TestResolver(),
         "{}Just a string{{}}");
     // should be thrown syntax error: markup extension name is empty
     String result = ( string ) parser.ProcessMarkupExtension( null );
     Assert.AreEqual( "Just a string{{}}", result );
 }
        /// <summary>
        /// Если str начинается с одинарной открывающей фигурной скобки, то метод обрабатывает его
        /// как вызов расширения разметки, и возвращает результат, или выбрасывает исключение,
        /// если при парсинге или выполнении возникли ошибки. Если же str начинается c комбинации
        /// {}, то остаток строки возвращается просто строкой.
        /// </summary>
        private Object processText(String text,
                                   String currentProperty, object currentObject, object dataContext)
        {
            if (String.IsNullOrEmpty(text))
            {
                return(String.Empty);
            }

            if (text[0] != '{')
            {
                // interpret whole text as string
                return(text);
            }
            else if (text.Length > 1 && text[1] == '}')
            {
                // interpret the rest as string
                return(text.Length > 2 ? text.Substring(2) : String.Empty);
            }
            else
            {
                MarkupExtensionsParser markupExtensionsParser = new MarkupExtensionsParser(
                    new MarkupExtensionsResolver(this), text);
                MarkupExtensionContext context = new MarkupExtensionContext(
                    this, text, currentProperty, currentObject, dataContext);
                object providedValue = markupExtensionsParser.ProcessMarkupExtension(context);
                if (providedValue is IFixupToken)
                {
                    fixupTokens.Add(( FixupToken )providedValue);
                    // Null means no value will be assigned to target property
                    return(null);
                }
                return(providedValue);
            }
        }
        private void processFixupTokens( )
        {
            // Выполнить поиск fixup tokens, желания которых удовлетворены,
            // и вызвать расширения разметки для них снова
            List <FixupToken> tokens = new List <FixupToken>(fixupTokens);

            fixupTokens.Clear(  );
            foreach (FixupToken token in tokens)
            {
                if (token.Ids.All(id => objectsById.ContainsKey(id)))
                {
                    MarkupExtensionsParser markupExtensionsParser = new MarkupExtensionsParser(
                        new MarkupExtensionsResolver(this), token.Expression);
                    MarkupExtensionContext context = new MarkupExtensionContext(
                        this, token.Expression, token.PropertyName, token.Object, token.DataContext);
                    object providedValue = markupExtensionsParser.ProcessMarkupExtension(context);
                    if (providedValue is IFixupToken)
                    {
                        fixupTokens.Add(( FixupToken )providedValue);
                    }
                    else
                    {
                        // assign providedValue to property of object
                        if (null != providedValue)
                        {
                            PropertyInfo propertyInfo = token.Object.GetType(  ).GetProperty(
                                token.PropertyName);
                            object convertedValue = ConvertValueIfNeed(providedValue.GetType(),
                                                                       propertyInfo.PropertyType,
                                                                       providedValue);
                            //propertyInfo.SetValue(token.Object, convertedValue, null);
                            propertyInfo.GetSetMethod().Invoke(token.Object, new [] { convertedValue });
                        }
                    }
                }
                else
                {
                    fixupTokens.Add(token);
                }
            }
        }
 public void TestSyntaxError2( ) {
     MarkupExtensionsParser parser = new MarkupExtensionsParser(new TestResolver(),
         "{TestExtension* }");
     // should be thrown syntax error: whitespace expected after name
     parser.ProcessMarkupExtension(null);
 }
 public void TestSyntaxError1( ) {
     MarkupExtensionsParser parser = new MarkupExtensionsParser(new TestResolver(), "{ }");
     // should be thrown syntax error: markup extension name is empty
     parser.ProcessMarkupExtension(null);
 }
 public void TestInner2( ) {
     MarkupExtensionsParser parser = new MarkupExtensionsParser(new TestResolver(),
         @"{xm:TestExtension Arg1, Property3=\=\{\}\\sdf, Property2={TestExtension Property1=1}}");
     String result = (String)parser.ProcessMarkupExtension(null);
     Assert.AreEqual(result, @"Arg1_1___={}\sdf");
 }
 public void TestEscaping2() {
     MarkupExtensionsParser parser = new MarkupExtensionsParser( new TestResolver(  ),
         @"{xm:TestExtension Arg1, Arg2, Property3=\=\{\}\\sdf}");
     String result = (String)parser.ProcessMarkupExtension(null);
     Assert.AreEqual( result, @"Arg1_Arg2_={}\sdf" );
 }
 public void TestSyntaxError5() {
     MarkupExtensionsParser parser = new MarkupExtensionsParser(new TestResolver(),
         "{TestExtension CtorArg, Property1=1,}");
     // should be thrown syntax error: member name or string expected
     parser.ProcessMarkupExtension(null);
 }
 public void TestSyntaxError4() {
     MarkupExtensionsParser parser = new MarkupExtensionsParser(new TestResolver(),
         "{TestExtension CtorArg, Property1=1 } ");
     // should be thrown syntax error: unexpected characters
     parser.ProcessMarkupExtension(null);
 }
 public void TestSyntaxError3( ) {
     MarkupExtensionsParser parser = new MarkupExtensionsParser(new TestResolver(),
         "{TestExtension Property1=1, CtorArg }");
     // should be thrown syntax error: constructor argument cannot be after property assignment
     parser.ProcessMarkupExtension(null);
 }