예제 #1
0
        public void TestCalcEngineDayDiff()
        {
            string[] maskDate   = { "dd.MM.yyyy", "dd.MM.yyyy", "dd.MM.yyyy HH:mm", "dd.MM.yyyy HH:mm" };
            string[] dateFrom   = { "01.01.2014", "01.01.2014", "10.03.2014 12:00", "15.03.2014 15:00" };
            string[] dateTo     = { "01.01.2014", "10.01.2014", "10.03.2014 14:00", "16.03.2014 09:00" };
            double[] answerDate = { 1, 10, 1, 2 };


            string[] maskInterval   = { "dd.MM.yyyy", "dd.MM.yyyy", "dd.MM.yyyy" };
            string[] interval       = { "01.01.2014", "01.01.2014 - 31.01.2014", "c 02.02.2014 по 10.02.2014" };
            double[] answerInterval = { 1, 31, 9 };

            var engine = new CalcEngine.CalcEngine();

            for (int i = 0; i < dateFrom.Length; i++)
            {
                engine.Variables.Clear();
                engine.Variables.Add("Mask", maskDate[i]);
                engine.Variables.Add("DateFrom", dateFrom[i]);
                engine.Variables.Add("DateTo", dateTo[i]);

                var res = (double)engine.Evaluate("DAYDIFF(DateFrom,DateTo,Mask)");
                res.Should().Be(answerDate[i]);
            }

            for (int i = 0; i < interval.Length; i++)
            {
                engine.Variables.Clear();
                engine.Variables.Add("Mask", maskInterval[i]);
                engine.Variables.Add("Interval", interval[i]);

                var res = (double)engine.Evaluate("DAYDIFF(Interval,Mask)");
                res.Should().Be(answerInterval[i]);
            }
        }
예제 #2
0
        public void TestCalcEngineLeft()
        {
            var engine = new CalcEngine.CalcEngine();

            engine.Variables.Add("A1", TestString);

            var res = (string)engine.Evaluate("LEFT(A1,4)");

            res.Should().Be(TestString.Remove(4));

            res = (string)engine.Evaluate("LEFT(A1)");
            res.Should().Be(TestString.Remove(1));
        }
예제 #3
0
        public void TestFormulaForDisplayName()
        {
            var engine = new CalcEngine.CalcEngine();

            engine.Variables.Add("A", 5);
            engine.Variables.Add("B", "Test string");
            engine.Variables.Add("C", "1");

            var res = (string)engine.Evaluate("FORMAT(\"{0} [{1}]\", B, A)");

            res.Should().Be("Test string [5]");

            res = (string)engine.Evaluate("FORMAT(\"{0} [{1}]\", B, IF(A = 5, C, -1*C))");
            res.Should().Be("Test string [1]");
        }
예제 #4
0
        public ICommandResult Execute(CommandContext context)
        {
            string expression = string.Join(string.Empty, context.Parameters["expression"].GetValues());

            try
            {
                object result = engine.Evaluate(expression);
                engine.Variables[VARIABLE_RESULT] = result;

                if (context.HasOption("variable"))
                {
                    var    variableContext = context.GetOption("variable");
                    string variableName    = variableContext.GetParameterValue("variableName");
                    engine.Variables[variableName] = result;
                    return(new TextResult($"{variableName} = {result}"));
                }
                else
                {
                    return(new TextResult(result.ToString()));
                }
            }
            catch (Exception exception)
            {
                return(new ErrorTextResult(exception.Message));
            }
        }
예제 #5
0
        public void TestCalcEngineLower()
        {
            var engine = new CalcEngine.CalcEngine();

            engine.Variables.Add("A1", TestString);

            var res = (string)engine.Evaluate("LOWER(A1)");

            res.Should().Be(TestString.ToLower());
        }
예제 #6
0
        public void TestCalcEngineLen()
        {
            var engine = new CalcEngine.CalcEngine();

            engine.Variables.Add("A1", TestString);

            var res = (int)engine.Evaluate("LEN(A1)");

            res.Should().Be(TestString.Length);
        }
예제 #7
0
 public bool TryGetValue(string key, out object value)
 {
     if (_dct.TryGetValue(key, out value))
     {
         var expr = value as string;
         if (expr != null && expr.Length > 0 && expr[0] == '=')
         {
             value = _ce.Evaluate(expr.Substring(1));
         }
         return(true);
     }
     return(false);
 }
예제 #8
0
        public void TestSKUExample()
        {
            var engine = new CalcEngine.CalcEngine();

            engine.DataContext = new SKUTestClass()
            {
                SKUNAME = "test", SKUCOUNT = 1, SKUCLIENT = null
            };

            var res = (string)engine.Evaluate("FORMAT(\"{0}, {1}{2}\",SKUNAME,SKUCOUNT,IF(SKUCLIENT = null, \", *\", \"\"))");

            //engine.Variables.Add("privet", 66);
            //res = (string)engine.Evaluate("FORMAT(\"{0}, {1}{2}{3}\",SKUNAME,SKUCOUNT,IF(SKUCLIENT = null, \", *\", \"\"),privet)");

            res.Should().Be("test, 1, *");
        }
예제 #9
0
        private void button1_Click(object sender, EventArgs e)
        {
            var ce  = new CalcEngine.CalcEngine();
            var dct = new CalcDictionary(ce);

            ce.Variables = dct;

            dct["Amount"]     = 12;
            dct["OfferPrice"] = 12.32;
            dct["Item1"]      = "=Amount * OfferPrice";
            dct["Item2"]      = "=Item1 * 0.06";

            // this will print "8.8704"
            // (Amount * OfferPrice) * 0.06 = 12 * 12.32 * 0.06 = 8.8704
            Console.WriteLine(ce.Evaluate("Item2"));
        }
예제 #10
0
        public void TestCalcEngineLastDateInInterval()
        {
            string[] mask    = { "dd.MM.yyyy", "dd.MM.yyyy", "dd.MM.yyyy", "dd.MM.yyyy" };
            string[] example = { "10.01.2014", "15.01.2014", "01.01.2014 - 31.01.2014", "c 01.01.2014 по 31.01.2014" };
            string[] answer  = { "10.01.2014", "15.01.2014", "31.01.2014", "31.01.2014" };

            var engine = new CalcEngine.CalcEngine();

            for (int i = 0; i < example.Length; i++)
            {
                engine.Variables.Clear();
                engine.Variables.Add("Mask", mask[i]);
                engine.Variables.Add("Date", example[i]);

                var res = (string)engine.Evaluate("LASTDATEININTERVAL(Date,Mask)");
                res.Should().Be(answer[i]);
            }
        }
        private void Calc()
        {
            var cpv = _billOperation2Contract.Operation2ContractCpvL;

            if (cpv != null)
            {
                var formulaDate    = cpv.FirstOrDefault(p => p != null && p.CustomParamCode.EqIgnoreCase("BillO2CCalcFDateL2"));
                var formulaDateStr = formulaDate != null && _dateTimeFormats != null ? formulaDate.CPVValue : string.Empty;

                var formulaCount    = cpv.FirstOrDefault(p => p != null && p.CustomParamCode.EqIgnoreCase("BillO2CCalcFCountL2"));
                var formulaCountStr = formulaCount != null ? formulaCount.CPVValue : string.Empty;

                var formulaFactor    = cpv.FirstOrDefault(p => p != null && p.CustomParamCode.EqIgnoreCase("BillO2CCalcFFactorL2"));
                var formulaFactorStr = formulaFactor != null  ? formulaFactor.CPVValue : string.Empty;

                var formulaSumm    = cpv.FirstOrDefault(p => p != null && p.CustomParamCode.EqIgnoreCase("BillO2CCalcFSummL2"));
                var formulaSummStr = formulaSumm != null  ? formulaSumm.CPVValue : string.Empty;

                var engine = new CalcEngine.CalcEngine {
                    DataContext = Source
                };

                //дата
                DateTime?date;
                if (!formulaDateStr.IsNullOrEmptyAfterTrim())
                {
                    var culture = System.Threading.Thread.CurrentThread.CurrentCulture;
                    try
                    {
                        date = new StringToDateTimeConverter().Convert(engine.Evaluate(formulaDateStr), null, _dateTimeFormats, culture) as DateTime?;
                    }
                    catch (Exception)
                    {
                        date = null;
                    }
                }
                else
                {
                    date = _defaltCalcDate;
                }

                //цена
                double price = 0;
                if (date.HasValue)
                {
                    using (var mgrTariff = IoC.Instance.Resolve <IBaseManager <BillTariff> >())
                    {
                        var filter =
                            string.Format(
                                "operation2contractid_r = {0} and TO_DATE('{1}','YYYY.MM.DD') >= tariffdatefrom and TO_DATE('{1}','YYYY.MM.DD') < tariffdatetill",
                                Source.Operation2ContractID, ((DateTime)date).ToString("yyyy.MM.dd"));
                        var values = mgrTariff.GetFiltered(filter).ToArray();
                        if (values.Length == 1)
                        {
                            price = values[0].Value;
                        }
                    }
                }
                engine.Variables.Add("PRICE", price);

                //кол-во
                double count;
                if (!formulaCountStr.IsNullOrEmptyAfterTrim())
                {
                    try
                    {
                        if (!double.TryParse(engine.Evaluate(formulaCountStr).ToString(), out count))
                        {
                            count = 0;
                        }
                    }
                    catch (Exception)
                    {
                        count = 0;
                    }
                }
                else
                {
                    count = DefaultCalcCount;
                }
                Source.WorkActDetailCount = count;

                //коэффициент
                double factor;
                if (!formulaFactorStr.IsNullOrEmptyAfterTrim())
                {
                    try
                    {
                        if (!double.TryParse(engine.Evaluate(formulaFactorStr).ToString(), out factor))
                        {
                            factor = 0;
                        }
                    }
                    catch (Exception)
                    {
                        factor = 0;
                    }
                }
                else
                {
                    factor = DefaultCalcFactor;
                }
                Source.WorkActDetailMulti = factor;

                //сумма
                if (!Source.IsEnabledTotalSum)
                {
                    double summ = 0;
                    if (!formulaSummStr.IsNullOrEmptyAfterTrim())
                    {
                        try
                        {
                            if (!double.TryParse(engine.Evaluate(formulaSummStr).ToString(), out summ))
                            {
                                summ = 0;
                            }
                        }
                        catch (Exception)
                        {
                            summ = 0;
                        }
                    }
                    Source.WorkActDetailTotalSum = summ;
                }
            }
        }
예제 #12
0
        //[InlineData("SUBSTITUTE(\"abracadabra\", \"a\", \"b\")", "bbrbcbdbbrb")]
        //[InlineData("SUBSTITUTE(\"abcabcabc\", \"a\", \"b\")", "bbcbbcbbc")]
        //[InlineData("SUBSTITUTE(\"abcabcabc\", \"a\", \"b\", 1)", "bbcabcabc")]
        //[InlineData("SUBSTITUTE(\"abcabcabc\", \"a\", \"b\", 2)", "abcbbcabc")]
        //[InlineData("SUBSTITUTE(\"abcabcabc\", \"A\", \"b\", 2)", "abcabcabc")]
        public void ShouldAverageExpressionEquals(string expression, object expected)
        {
            var result = calcEngine.Evaluate(expression);

            Assert.Equal(expected, result);
        }
예제 #13
0
        static void RunBenchmark(BenchmarkKind which)
        {
            var yamp       = YAMP.Parser.PrimaryContext;
            var mpparser   = new MathParser.Parser();
            var mptk       = new MathParserTK_NET.MathParserTK();
            var mpnet      = new MathParserNet.Parser();
            var mfmp       = new MathFunctions.MathParser();
            var llmp       = new MathParserDataStructures.MathObj();
            var calcEngine = new CalcEngine.CalcEngine();

            calcEngine.CacheExpressions = false;

            var lines = new string[0];

            switch (which)
            {
            case BenchmarkKind.Standard:
                //         UB
                //YAMP  : 154 ms
                //LLMP  : 108 ms
                //MP    : 4134 ms
                //MPTK  : 375 ms
                //MPNET : 3054 ms
                //MFP   : 88 ms
                //CALEN : 33 ms
                //NCALC : 420 ms
                lines = MakeTenK("2-3*5+7/2-8*2");
                break;

            case BenchmarkKind.File:
                //         UB
                //YAMP  : 2084 ms
                //LLMP  : 1072 ms
                //MP    : 372847 ms
                //MPTK  : ---
                //MPNET : ---
                //MFP   : ---
                //CALEN : 271 ms
                //NCALC : ---
                if (!File.Exists(BMK_FILE))
                {
                    GenerateBenchmarks();
                }

                lines = File.ReadAllLines(BMK_FILE);
                break;

            case BenchmarkKind.Little:
                //         UB
                //YAMP  : 71 ms
                //LLMP  : 59 ms
                //MP    : 1840 ms
                //MPTK  : 87 ms
                //MPNET : 3232 ms
                //MFP   : 37 ms
                //CALEN : 23 ms
                //NCALC : 247 ms
                lines = MakeTenK("2+3");
                break;

            case BenchmarkKind.Thomson:
                //         UB
                //YAMP  : 193 ms
                //LLMP  : 138 ms
                //MP    : 11508 ms
                //MPTK  : 647 ms
                //MPNET : 3827 ms
                //MFP   : ---
                //CALEN : 41 ms
                //NCALC : ---
                lines = MakeTenK("2-(3*5)^2+7/(2-8)*2");
                break;
            }

            Console.WriteLine("Starting benchmarks ...");
            Console.WriteLine("----------");

            // The implementation here... YAMP
            Benchmark("YAMP", lines, query => yamp.Run(query));

            //http://www.codeproject.com/Articles/53001/LL-Mathematical-Parser
            Benchmark("LLMathParser", lines, query => llmp.Evaluate(query, new char[0], new double[0]));

            //http://www.codeproject.com/Articles/11164/Math-Parser
            Benchmark("MathParser", lines, query => mpparser.Evaluate(query));

            //http://www.codeproject.com/Tips/381509/Math-Parser-NET-Csharp
            Benchmark("MathParserTK", lines, query => mptk.Parse(query, false));

            //http://www.codeproject.com/Articles/274093/Math-Parser-NET
            Benchmark("MathParserNet", lines, query => mpnet.Simplify(query));

            //http://www.codeproject.com/Articles/23061/MathParser-Math-Formula-Parser
            Benchmark("MathFormulaParser", lines, query => mfmp.Calculate(query));

            //http://www.codeproject.com/Articles/246374/A-Calculation-Engine-for-NET
            Benchmark("CalcEngine", lines, query => calcEngine.Evaluate(query));

            //http://ncalc.codeplex.com/
            //Benchmark("NCalc", lines, query => new NCalc.Expression(query, NCalc.EvaluateOptions.NoCache).Evaluate());
        }
예제 #14
0
        public void ShouldItemWhereExpressionEquals()
        {
            var result = calcEngine.Evaluate("WHERE(Item,Score>90)");

            Assert.Equal(students.Where(o => o.Score > 90), result);
        }
        public void ShouldCapacityEquals()
        {
            var result = calcEngine.Evaluate("capacity");

            Assert.Equal(students.Capacity, result);
        }
예제 #16
0
 private static void EvaluateExpressionAndAssign(CalcExpressionVm calcVm, CellVm targetCell)
 {
     var expr = new CalcEngine.CalcEngine();
     var result = (double)expr.Evaluate(calcVm.Expression);
     if (UpdateContextIsCellValue(calcVm.UpdateContext))
     {
         targetCell.Value = FormatCellValue(result, targetCell);
     }
     else
     {
         FormatCellHoverAddition(result, targetCell);
     }
 }
        public void ShouldNameEquals()
        {
            var result = calcEngine.Evaluate("Name");

            Assert.Equal(student.Name, result);
        }
예제 #18
0
        public void TestCalcEngineHourDiff()
        {
            //HourDiff([дата с], [дата по],[формат даты])
            string[] maskDate   = { "dd.MM.yyyy HH:mm", "dd.MM.yyyy HH:mm" };
            string[] dateFrom   = { "01.01.2014 11:00", "01.02.2014 21:00" };
            string[] dateTo     = { "01.01.2014 13:30", "02.02.2014 03:00" };
            double[] answerDate = { 2.5, 6 };

            //HourDiff([период с по],[формат даты])
            string[] maskInterval   = { "dd.MM.yyyy HH:mm", "dd.MM.yyyy HH:mm", };
            string[] interval       = { "01.01.2014 15:30 - 01.01.2014 16:00 ", " c 01.01.2014 22:00 по 02.01.2014 02:00" };
            double[] answerInterval = { 0.5, 4 };

            //HourDiff([время с], [время по])
            string[] timeFrom   = { "11:00", "21:00" };
            string[] timeTo     = { "13:30", "00:00" };
            double[] answerTime = { 2.5, 3 };

            //HourDiff([период времен])
            string[] timeInterval       = { "09:00 - 13:30", "21:00 - 00:00" };
            double[] answerTimeInterval = { 4.5, 3 };


            var engine = new CalcEngine.CalcEngine();

            for (int i = 0; i < dateFrom.Length; i++)
            {
                engine.Variables.Clear();
                engine.Variables.Add("Mask", maskDate[i]);
                engine.Variables.Add("DateFrom", dateFrom[i]);
                engine.Variables.Add("DateTo", dateTo[i]);

                var res = (double)engine.Evaluate("HOURDIFF(DateFrom,DateTo,Mask)");
                res.Should().Be(answerDate[i]);
            }

            for (int i = 0; i < interval.Length; i++)
            {
                engine.Variables.Clear();
                engine.Variables.Add("Mask", maskInterval[i]);
                engine.Variables.Add("Interval", interval[i]);

                var res = (double)engine.Evaluate("HOURDIFF(Interval,Mask)");
                res.Should().Be(answerInterval[i]);
            }

            for (int i = 0; i < timeFrom.Length; i++)
            {
                engine.Variables.Clear();
                engine.Variables.Add("TimeFrom", timeFrom[i]);
                engine.Variables.Add("TimeTo", timeTo[i]);

                var res = (double)engine.Evaluate("HOURDIFF(TimeFrom,TimeTo)");
                res.Should().Be(answerTime[i]);
            }

            for (int i = 0; i < timeInterval.Length; i++)
            {
                engine.Variables.Clear();
                engine.Variables.Add("TimeInterval", timeInterval[i]);

                var res = (double)engine.Evaluate("HOURDIFF(TimeInterval)");
                res.Should().Be(answerTimeInterval[i]);
            }
        }
예제 #19
0
        static void RunBenchmark(BenchmarkKind which)
        {
            var yamp = new YAMP.Parser();
            var mpparser = new MathParser.Parser();
            var mptk = new MathParserTK_NET.MathParserTK();
            var mpnet = new MathParserNet.Parser();
            var mfmp = new MathFunctions.MathParser();
            var llmp = new MathParserDataStructures.MathObj();
            var calcEngine = new CalcEngine.CalcEngine();
            calcEngine.CacheExpressions = false;

            var lines = new string[0];

            switch (which)
            {
                case BenchmarkKind.Standard:
                    //         UB
                    //YAMP  : 154 ms
                    //LLMP  : 108 ms
                    //MP    : 4134 ms
                    //MPTK  : 375 ms
                    //MPNET : 3054 ms
                    //MFP   : 88 ms
                    //CALEN : 33 ms
                    //NCALC : 420 ms
                    lines = MakeTenK("2-3*5+7/2-8*2");
                    break;

                case BenchmarkKind.File:
                    //         UB
                    //YAMP  : 2084 ms
                    //LLMP  : 1072 ms
                    //MP    : 372847 ms
                    //MPTK  : ---
                    //MPNET : ---
                    //MFP   : ---
                    //CALEN : 271 ms
                    //NCALC : ---
                    if (!File.Exists(BMK_FILE))
                        GenerateBenchmarks();

                    lines = File.ReadAllLines(BMK_FILE);
                    break;

                case BenchmarkKind.Little:
                    //         UB
                    //YAMP  : 71 ms
                    //LLMP  : 59 ms
                    //MP    : 1840 ms
                    //MPTK  : 87 ms
                    //MPNET : 3232 ms
                    //MFP   : 37 ms
                    //CALEN : 23 ms
                    //NCALC : 247 ms
                    lines = MakeTenK("2+3");
                    break;

                case BenchmarkKind.Thomson:
                    //         UB
                    //YAMP  : 193 ms
                    //LLMP  : 138 ms
                    //MP    : 11508 ms
                    //MPTK  : 647 ms
                    //MPNET : 3827 ms
                    //MFP   : ---
                    //CALEN : 41 ms
                    //NCALC : ---
                    lines = MakeTenK("2-(3*5)^2+7/(2-8)*2");
                    break;
            }

            Console.WriteLine("Starting benchmarks ...");
            Console.WriteLine("----------");

            // The implementation here... YAMP
            Benchmark("YAMP", lines, query => yamp.Evaluate(query));

            //http://www.codeproject.com/Articles/53001/LL-Mathematical-Parser
            Benchmark("LLMathParser", lines, query => llmp.Evaluate(query, new char[0], new double[0]));

            //http://www.codeproject.com/Articles/11164/Math-Parser
            Benchmark("MathParser", lines, query => mpparser.Evaluate(query));

            //http://www.codeproject.com/Tips/381509/Math-Parser-NET-Csharp
            Benchmark("MathParserTK", lines, query => mptk.Parse(query, false));

            //http://www.codeproject.com/Articles/274093/Math-Parser-NET
            Benchmark("MathParserNet", lines, query => mpnet.Simplify(query));

            //http://www.codeproject.com/Articles/23061/MathParser-Math-Formula-Parser
            Benchmark("MathFormulaParser", lines, query => mfmp.Calculate(query));

            //http://www.codeproject.com/Articles/246374/A-Calculation-Engine-for-NET
            Benchmark("CalcEngine", lines, query => calcEngine.Evaluate(query));

            //http://ncalc.codeplex.com/
            //Benchmark("NCalc", lines, query => new NCalc.Expression(query, NCalc.EvaluateOptions.NoCache).Evaluate());
        }