private void Check(string expr, int count)
        {
            var parts = GenericExpressionHelper.Split(expr);

            Assert.AreEqual(expr ?? string.Empty, string.Concat(parts));
            Assert.AreEqual(count, parts.Length);
        }
        public void ConvertTypesInExpressions()
        {
            string ToCSharp(string expr) => GenericExpressionHelper.ConvertApexTypesToCSharp(expr);
            string ToApex(string expr) => GenericExpressionHelper.ConvertCSharpTypesToApex(expr);

            Assert.AreEqual("Map<string, string>", ToCSharp("Map<String, String>"));
            Assert.AreEqual("Map<String, String>", ToApex("Map<string, string>"));
        }
        public override void VisitExpression(ExpressionSyntax node)
        {
            // replace Apex-style constructor initializers:
            // new Class(Prop1=Value1, Prop2=Value2) => new Class { Prop1=Value1, Prop2=Value2 }
            var expr = GenericExpressionHelper.ConvertApexConstructorInitializerToCSharp(node.ExpressionString);

            // split into portions and process one by one
            base.VisitExpression(new ExpressionSyntax(expr));
        }
        private ApexTypeSyntax ConvertType(TypeSyntax type)
        {
            if (type != null)
            {
                var apexType = GenericExpressionHelper.ConvertCSharpTypesToApex(type.ToString());
                return(new ApexTypeSyntax(apexType));
            }

            return(null);
        }
Example #5
0
        protected override void AppendExpressionPart(string part)
        {
            // replace string.class => typeof(string), string.valueOf(x) => x.ToString(), etc
            part = GenericExpressionHelper.ConvertTypeofExpressionsToCSharp(part);
            part = GenericExpressionHelper.ConvertStringValueofToString(part);
            part = GenericExpressionHelper.ConvertApexInstanceOfTypeExpressionToCSharp(part);
            part = GenericExpressionHelper.ConvertApexTypesToCSharp(part);

            base.AppendExpressionPart(part);
        }
        public void ApexPritimiveTypesStaticMethodsAreNotConvertedToCSharp()
        {
            string ToCSharp(string expr) => GenericExpressionHelper.ConvertApexTypesToCSharp(expr);
            string ToApex(string expr) => GenericExpressionHelper.ConvertCSharpTypesToApex(expr);

            Assert.AreEqual("a = (int)b", ToCSharp("a = (Integer)b"));
            Assert.AreEqual("a = Integer.valueOf(b)", ToCSharp("a = Integer.valueOf(b)"));

            Assert.AreEqual("a = (Integer)b", ToApex("a = (int)b"));
            Assert.AreEqual("a = Integer.valueOf(b)", ToApex("a = Integer.valueOf(b)"));
        }
        public void SomeDotClassIsConvertedToTypeofClass()
        {
            var text   = "string.class";
            var csharp = GenericExpressionHelper.ConvertTypeofExpressionsToCSharp(text);

            Assert.AreEqual("typeof(string)", csharp);

            text   = "mock(MyLittleClass.class)";
            csharp = GenericExpressionHelper.ConvertTypeofExpressionsToCSharp(text);
            Assert.AreEqual("mock(typeof(MyLittleClass))", csharp);
        }
        public void ConvertSoqlExpressionReturnsConvertedApexSoqlExpression()
        {
            var text = "List<Contact> contacts = Soql.Query<Contact>(\"SELECT Id, Email, Phone FROM Contact\");";
            var expr = GenericExpressionHelper.ConvertSoqlQueriesToApex(text);

            Assert.AreEqual("List<Contact> contacts = [SELECT Id, Email, Phone FROM Contact];", expr);

            text = @"List<Contact> contacts = Soql.Query<Contact>(""SELECT Id, Email, Phone FROM Contact WHERE Email = :email"", email);";
            expr = GenericExpressionHelper.ConvertSoqlQueriesToApex(text);
            Assert.AreEqual("List<Contact> contacts = [SELECT Id, Email, Phone FROM Contact WHERE Email = :email];", expr);
        }
Example #9
0
        /// <summary>
        /// Get the unvalidated string of a model property posted in Request.
        /// </summary>
        /// <typeparam name="M">The type of the model</typeparam>
        /// <param name="propertySelector">An expression to select the property from the model.</param>
        /// <returns>Returns the string in the request for the property.</returns>
        protected string GetUnvalidatedPropertyFromRequest <M>(Expression <Func <M, object> > propertySelector)
        {
            if (propertySelector == null)
            {
                throw new ArgumentNullException(nameof(propertySelector));
            }

            string requestKey = GenericExpressionHelper.GetExpressionText(propertySelector);

            return(this.Request.Unvalidated[requestKey]);
        }
        public void ApexMembersSpelledTheSameWayAsPrimitiveTypesAreNotConvertedToCSharp()
        {
            string ToCSharp(string expr) => GenericExpressionHelper.ConvertApexTypesToCSharp(expr);
            string ToApex(string expr) => GenericExpressionHelper.ConvertCSharpTypesToApex(expr);

            Assert.AreEqual("a = (Date)x", ToCSharp("a = (date)x"));
            Assert.AreEqual("a = new Date(x)", ToCSharp("a = new date(x)"));
            Assert.AreEqual("a = new Date(x).date()", ToCSharp("a = new Date(x).date()"));

            Assert.AreEqual("a = new Date(x)", ToApex("a = new Date(x)"));
            Assert.AreEqual("a = new Date(x).date()", ToApex("a = new Date(x).date()"));
        }
Example #11
0
        /// <summary>
        /// Attempt to update the specified model instance using values from the controller's current value provider.
        /// </summary>
        /// <typeparam name="M">The type of the model.</typeparam>
        /// <typeparam name="VM">The type of object which contains the model.</typeparam>
        /// <param name="modelSelector">The expression which extracts the model from which container.</param>
        /// <param name="model">The model to update.</param>
        /// <returns>Returns true when the included model properties were valid.</returns>
        protected bool TryUpdateModel <M, VM>(M model, Expression <Func <VM, M> > modelSelector)
            where M : class
        {
            if (modelSelector == null)
            {
                throw new ArgumentNullException(nameof(modelSelector));
            }

            string modelPrefix = GenericExpressionHelper.GetExpressionText(modelSelector);

            return(TryUpdateModel(model, modelPrefix));
        }
Example #12
0
        private static string[] GetPropertyNames <M>(Expression <Func <M, object> >[] propertySelectors)
            where M : class
        {
            string[] propertyNames = new string[propertySelectors.Length];

            for (int i = 0; i < propertySelectors.Length; i++)
            {
                propertyNames[i] = GenericExpressionHelper.GetExpressionText(propertySelectors[i]);
            }

            return(propertyNames);
        }
        public void ComplexClassExpressionsAreConvertedToTypeof()
        {
            var text   = "Map<string, string>.class";
            var csharp = GenericExpressionHelper.ConvertTypeofExpressionsToCSharp(text);

            Assert.AreEqual("typeof(Map<string, string>)", csharp);

            text   = "string12.class";
            csharp = GenericExpressionHelper.ConvertTypeofExpressionsToCSharp(text);
            Assert.AreEqual("typeof(string12)", csharp);

            text   = "Some.New.Stuff.class";
            csharp = GenericExpressionHelper.ConvertTypeofExpressionsToCSharp(text);
            Assert.AreEqual("typeof(Some.New.Stuff)", csharp);

            text   = "List<string>.class";
            csharp = GenericExpressionHelper.ConvertTypeofExpressionsToCSharp(text);
            Assert.AreEqual("typeof(List<string>)", csharp);

            text   = "List<System.string1>.class";
            csharp = GenericExpressionHelper.ConvertTypeofExpressionsToCSharp(text);
            Assert.AreEqual("typeof(List<System.string1>)", csharp);

            text   = "System.List<string>.class";
            csharp = GenericExpressionHelper.ConvertTypeofExpressionsToCSharp(text);
            Assert.AreEqual("typeof(System.List<string>)", csharp);

            text   = "System.Map<string, string, string>.class";
            csharp = GenericExpressionHelper.ConvertTypeofExpressionsToCSharp(text);
            Assert.AreEqual("typeof(System.Map<string, string, string>)", csharp);

            text   = "Map<List<string>, string>.class";
            csharp = GenericExpressionHelper.ConvertTypeofExpressionsToCSharp(text);
            Assert.AreEqual("typeof(Map<List<string>, string>)", csharp);

            text   = "Map<string, System.List<string>>.class";
            csharp = GenericExpressionHelper.ConvertTypeofExpressionsToCSharp(text);
            Assert.AreEqual("typeof(Map<string, System.List<string>>)", csharp);

            text   = "Map<List<string>, System.List<string>>.class";
            csharp = GenericExpressionHelper.ConvertTypeofExpressionsToCSharp(text);
            Assert.AreEqual("typeof(Map<List<string>, System.List<string>>)", csharp);

            text   = "Map<System.Map<int , string> , System.List<string, int>>.class";
            csharp = GenericExpressionHelper.ConvertTypeofExpressionsToCSharp(text);
            Assert.AreEqual("typeof(Map<System.Map<int , string> , System.List<string, int>>)", csharp);

            // more than two levels deep — cannot be supported by regular expressions
            text   = "Map<List<Set<string>>, System.List<string>>.class";
            csharp = GenericExpressionHelper.ConvertTypeofExpressionsToCSharp(text);
            Assert.AreEqual("Map<List<Set<string>>, System.List<string>>.class", csharp);
        }
        public void GetSoqlExpressionReturnsApexSoqlExpressionBody()
        {
            var text = "List<Contact> contacts = Soql.Query<Contact>(\"SELECT Id, Email, Phone FROM Contact\");";
            var expr = GenericExpressionHelper.ExtractSoqlQueries(text);

            Assert.AreEqual(1, expr.Length);
            Assert.AreEqual("SELECT Id, Email, Phone FROM Contact", expr[0]);

            text = "Soql.Query<Contact>(\"SELECT Id, Email, Phone FROM Contact WHERE Email = :email\", email);";
            expr = GenericExpressionHelper.ExtractSoqlQueries(text);
            Assert.AreEqual(1, expr.Length);
            Assert.AreEqual("SELECT Id, Email, Phone FROM Contact WHERE Email = :email", expr[0]);
        }
        protected override void AppendSoqlQuery(string soqlQuery)
        {
            var queryText  = soqlQuery.Substring(1, soqlQuery.Length - 2);
            var tableName  = GenericExpressionHelper.GetSoqlTableName(queryText);
            var parameters = GenericExpressionHelper.GetSoqlParameters(queryText);
            var paramList  = string.Empty;

            if (parameters.Any())
            {
                paramList = ", " + string.Join(", ", parameters);
            }

            Append("Soql.query<{0}>(@\"{1}\"{2})", tableName, queryText, paramList);
        }
        private void Check(string expr, params string[] expectedParts)
        {
            var parts = GenericExpressionHelper.Split(expr);

            Assert.AreEqual(expr, string.Concat(parts));

            if (!expectedParts.IsNullOrEmpty())
            {
                Assert.AreEqual(expectedParts.Length, parts.Length);
                foreach (var part in parts.Zip(expectedParts, (p, e) => new { p, e }))
                {
                    Assert.AreEqual(part.e, part.p);
                }
            }
        }
        public void ConvertSoqlInserUpdateDeleteOperationsReturnsApexStatements()
        {
            var text = "Soql.Insert(contact);";
            var apex = GenericExpressionHelper.ConvertSoqlStatementsToApex(text);

            Assert.AreEqual("insert contact;", apex);

            text = "Soql.Update(contact);";
            apex = GenericExpressionHelper.ConvertSoqlStatementsToApex(text);
            Assert.AreEqual("update contact;", apex);

            text = "Soql.Delete(contact);";
            apex = GenericExpressionHelper.ConvertSoqlStatementsToApex(text);
            Assert.AreEqual("delete contact;", apex);
        }
Example #18
0
        /// <summary>
        /// Updates the specified model instance using values from the controller's current value provider
        /// and included properties.
        /// </summary>
        /// <typeparam name="M">The type of the model.</typeparam>
        /// <typeparam name="VM">The type of object which contains the model.</typeparam>
        /// <param name="modelSelector">The expression to extract the model the view model of type <typeparamref name="VM"/>.</param>
        /// <param name="model">The model to update.</param>
        /// <param name="excludedPropertiesSelectors">Array of expressions of excluded properties.</param>
        /// <exception cref="InvalidOperationException">Thrown when the included properties are not valid.</exception>
        protected void UpdateModelExcluding <M, VM>(
            Expression <Func <VM, M> > modelSelector,
            M model,
            params Expression <Func <M, object> >[] excludedPropertiesSelectors)
            where M : class
        {
            if (modelSelector == null)
            {
                throw new ArgumentNullException(nameof(modelSelector));
            }

            string prefix = GenericExpressionHelper.GetExpressionText(modelSelector);

            UpdateModelExcluding(prefix, model, excludedPropertiesSelectors);
        }
        /// <summary>
        /// Using the controller's value provider, Bind a <see cref="IStatefulObjectExecutionModel"/> for executing a path on a stateful object.
        /// Any validation errors are capured in ModelState.
        /// </summary>
        /// <typeparam name="ST">The type of state transitions of the stateful object.</typeparam>
        /// <typeparam name="SO">The type of the stateful object.</typeparam>
        /// <typeparam name="WM">The type of the workflow manager for the stateful object.</typeparam>
        /// <typeparam name="VM">The type of the view model containing the <see cref="IStatefulObjectExecutionModel"/>.</typeparam>
        /// <param name="workflowManager">he workflow manager for the stateful object.</param>
        /// <param name="modelSelector">The expression to extract <see cref="IStatefulObjectExecutionModel"/> from the view model of type <typeparamref name="VM"/>.</param>
        /// <returns>Returns the model requested. Check ModelState for any validation errors.</returns>
        protected async Task <StatefulObjectExecutionModel <U, ST, SO> > BindStatefulObjectExecutionModelAsync <ST, SO, WM, VM>(
            WM workflowManager,
            Expression <Func <VM, IStatefulObjectExecutionModel> > modelSelector)
            where ST : StateTransition <U>
            where SO : IStateful <U, ST>
            where WM : IWorkflowManager <U, ST, SO>
        {
            if (modelSelector == null)
            {
                throw new ArgumentNullException(nameof(modelSelector));
            }

            string prefix = GenericExpressionHelper.GetExpressionText(modelSelector);

            return(await BindStatefulObjectExecutionModelAsync <ST, SO, WM>(workflowManager, prefix));
        }
        public override void VisitAnnotation(AnnotationSyntax node)
        {
            var attribute = ConvertUnitTestAnnotation(node, CurrentMember);

            if (string.IsNullOrWhiteSpace(attribute.Parameters))
            {
                AppendIndentedLine("[{0}]", attribute.Identifier);
            }
            else
            {
                // make sure parameters are comma-separated
                var parameters = GenericExpressionHelper.ConvertApexAnnotationParametersToCSharp(attribute.Parameters);
                parameters = parameters.Replace("\'", "\"");
                AppendIndentedLine("[{0}({1})]", attribute.Identifier, parameters);
            }
        }
        public void TypeofSomeIsConvertedToSomeDotClass()
        {
            var text = "typeof(string)";
            var apex = GenericExpressionHelper.ConvertTypeofExpressionsToApex(text);

            Assert.AreEqual("string.class", apex);

            text = "mock(typeof(MyLittleClass))";
            apex = GenericExpressionHelper.ConvertTypeofExpressionsToApex(text);
            Assert.AreEqual("mock(MyLittleClass.class)", apex);

            // backward conversion is supported
            text = "typeof(Map<string, string>)";
            apex = GenericExpressionHelper.ConvertTypeofExpressionsToApex(text);
            Assert.AreEqual("Map<string, string>.class", apex);
        }
        public void SomeDotClassIsConvertedToTypeofClass()
        {
            var text   = "string.class";
            var csharp = GenericExpressionHelper.ConvertTypeofExpressionsToCSharp(text);

            Assert.AreEqual("typeof(string)", csharp);

            text   = "mock(MyLittleClass.class)";
            csharp = GenericExpressionHelper.ConvertTypeofExpressionsToCSharp(text);
            Assert.AreEqual("mock(typeof(MyLittleClass))", csharp);

            // not supported by regex-based expression helper
            text   = "Map<string, string>.class)";
            csharp = GenericExpressionHelper.ConvertTypeofExpressionsToCSharp(text);
            Assert.AreEqual("Map<string, string>.class)", csharp);
        }
Example #23
0
        /// <summary>
        /// Attempt to get the value of a model property from a value provider,
        /// else return null if the value was not specified.
        /// </summary>
        /// <typeparam name="M">The type of the model being bound to the value provider.</typeparam>
        /// <param name="valueProvider">The Value provoder.</param>
        /// <param name="modelPropertyExpression">Expression for selecting the property from the bound model.</param>
        /// <returns>Returns the result found if the value exists, else null.</returns>
        public static ValueProviderResult GetValue <M>(
            this IValueProvider valueProvider,
            Expression <Func <M, object> > modelPropertyExpression)
        {
            if (valueProvider == null)
            {
                throw new ArgumentNullException(nameof(valueProvider));
            }
            if (modelPropertyExpression == null)
            {
                throw new ArgumentNullException(nameof(modelPropertyExpression));
            }

            string propertyKey = GenericExpressionHelper.GetExpressionText(modelPropertyExpression);

            return(valueProvider.GetValue(propertyKey));
        }
        private ApexExpressionSyntax ConvertExpression(ExpressionSyntax expression)
        {
            if (expression == null)
            {
                return(null);
            }

            var apexExpr = expression.ToString();

            apexExpr = GenericExpressionHelper.ConvertSoqlQueriesToApex(apexExpr);
            apexExpr = GenericExpressionHelper.ConvertSoqlStatementsToApex(apexExpr);
            apexExpr = GenericExpressionHelper.ConvertTypeofExpressionsToApex(apexExpr);
            apexExpr = GenericExpressionHelper.ConvertCSharpIsTypeExpressionToApex(apexExpr);
            apexExpr = GenericExpressionHelper.ConvertCSharpTypesToApex(apexExpr);
            apexExpr = apexExpr.Replace("\"", "'");
            return(new ApexExpressionSyntax(apexExpr));
        }
        public void DoubleLiteralsAreConvertedToDecimalLiterals()
        {
            string ToCSharp(string expr) => GenericExpressionHelper.ConvertApexDoubleLiteralsToDecimals(expr);
            string ToApex(string expr) => GenericExpressionHelper.ConvertCSharpDecimalLiteralsToDoubles(expr);

            Assert.AreEqual("a = 123.45m", ToCSharp("a = 123.45"));
            Assert.AreEqual("a = .45m", ToCSharp("a = .45"));
            Assert.AreEqual("a = 1.0m", ToCSharp("a = 1.0"));
            Assert.AreEqual("a123.45", ToCSharp("a123.45"));
            Assert.AreEqual("a.", ToCSharp("a."));

            Assert.AreEqual("a = 123.45", ToApex("a = 123.45m"));
            Assert.AreEqual("a = .45", ToApex("a = .45M"));
            Assert.AreEqual("a = 1.0", ToApex("a = 1.0m"));
            Assert.AreEqual("a123.45m", ToApex("a123.45m"));
            Assert.AreEqual("a.m", ToCSharp("a.m"));
        }
        public void ConvertTypeNames()
        {
            string ToCSharp(string type) => GenericExpressionHelper.ConvertApexTypeToCSharp(type);
            string ToApex(string type) => GenericExpressionHelper.ConvertCSharpTypeToApex(type);

            Assert.AreEqual("bool", ToCSharp(ApexKeywords.Boolean));
            Assert.AreEqual("bool", ToCSharp("boolean"));
            Assert.AreEqual("bool", ToCSharp("BOOLEAN"));
            Assert.AreEqual("string", ToCSharp(ApexKeywords.String));
            Assert.AreEqual("string", ToCSharp("string"));
            Assert.AreEqual("int", ToCSharp(ApexKeywords.Integer));

            Assert.AreEqual(ApexKeywords.Integer, ToApex("int"));
            Assert.AreEqual(ApexKeywords.String, ToApex("string"));
            Assert.AreEqual(ApexKeywords.Datetime, ToApex("DateTime"));
            Assert.AreEqual(ApexKeywords.Time, ToApex("Time"));
        }
        public void DateTimeNowAndDateTodayAreConverted()
        {
            var text   = "Datetime.now()";
            var csharp = GenericExpressionHelper.ConvertApexDateTimeNowToCSharp(text);

            Assert.AreEqual("DateTime.Now", csharp);

            text   = "Date.today()";
            csharp = GenericExpressionHelper.ConvertApexDateTodayToCSharp(text);
            Assert.AreEqual("DateTime.Today", csharp);

            text = "DateTime.Now";
            var apex = GenericExpressionHelper.ConvertCSharpDateTimeNowToApex(text);

            Assert.AreEqual("Datetime.now()", apex);

            text = "DateTime.Today";
            apex = GenericExpressionHelper.ConvertCSharpDateTimeTodayToApex(text);
            Assert.AreEqual("Date.today()", apex);
        }
        public void StringValueofSomethingIsConvertedToSomethingToString()
        {
            var text   = "string.valueOf(1)";
            var csharp = GenericExpressionHelper.ConvertStringValueofToString(text);

            Assert.AreEqual("1.ToString()", csharp);

            text   = "string.valueOf(something)";
            csharp = GenericExpressionHelper.ConvertStringValueofToString(text);
            Assert.AreEqual("something.ToString()", csharp);

            text   = "string.valueOf(something+1)";
            csharp = GenericExpressionHelper.ConvertStringValueofToString(text);
            Assert.AreEqual("(something+1).ToString()", csharp);

            // not supported by regex-based expression helper
            text   = "string.valueOf(method())";
            csharp = GenericExpressionHelper.ConvertStringValueofToString(text);
            Assert.AreEqual("string.valueOf(method())", csharp);
        }
        private void SplitAndAppendParts(string expression)
        {
            var parts = GenericExpressionHelper.Split(expression);

            foreach (var part in parts)
            {
                if (part.StartsWith("'"))
                {
                    AppendStringLiteral(part);
                }
                else if (part.StartsWith("["))
                {
                    AppendSoqlQuery(part);
                }
                else
                {
                    AppendExpressionPart(part);
                }
            }
        }
        public void ApexInstanceOfConvertedToCSharpAndBackAgain()
        {
            string ToCSharp(string x) => GenericExpressionHelper.ConvertApexInstanceOfTypeExpressionToCSharp(x);
            string ToApex(string x) => GenericExpressionHelper.ConvertCSharpIsTypeExpressionToApex(x);

            var text   = "Property instanceof int";
            var csharp = ToCSharp(text);

            Assert.AreEqual("Property is int", csharp);

            var apex = ToApex(csharp);

            Assert.AreEqual(text, apex);

            text   = @"int a = Value instanceof Map<string, string> ? 10 : 20";
            csharp = ToCSharp(text);
            Assert.AreEqual(@"int a = Value is Map<string, string> ? 10 : 20", csharp);

            apex = ToApex(csharp);
            Assert.AreEqual(text, apex);
        }