public void SortTest()
        {
            var array = (int[])data.Clone();

            ParallelTool.Sort(array);

            AssertSorted(array);
        }
        public void Can_SpeculativeInvoke()
        {
            var @functions = _functions;

            for (var i = 0; i < MaxTestCount; i++)
            {
                var result = ParallelTool.SpeculativeInvoke <int, double>(i, @functions);
                Assert.AreEqual(Math.Pow(i, PowerNumber), result);
            }
        }
        public void Can_SpeculativeForEach()
        {
            var @functions = _functions;

            for (int i = 0; i < MaxTestCount; i++)
            {
                var result = ParallelTool.SpeculativeForEach(@functions, i);
                Assert.AreEqual(Math.Pow(i, PowerNumber), result);
            }
        }
        public void Can_SpeculativeFor()
        {
            var @functions = _functions;

            for (var i = 0; i < MaxTestCount; i++)
            {
                var testCount = i;
                var result    = ParallelTool.SpeculativeFor(0, @functions.Length, n => @functions[n](testCount));
                Assert.AreEqual(Math.Pow(i, PowerNumber), result);
            }
        }
Пример #5
0
 public void BulkInsertTimeSheetAsParallel(int count)
 {
     using (new OperationTimer("Build Insert ProjectTask TimeSeet " + count)) {
         ParallelTool.ForRange(0,
                               count,
                               (s, e, loop) => {
             using (UnitOfWork.Start(UnitOfWorkNestingOptions.CreateNewOrNestUnitOfWork))
                 TimeSheets.Skip(s).Take(e - s).InsertStateless(UnitOfWork.CurrentSession);
         });
     }
 }
Пример #6
0
 public void InsertAsParallel(int count)
 {
     using (new OperationTimer("InsertAsParallel - " + count)) {
         ParallelTool.ForRange(0,
                               count,
                               (s, e, loop) => {
             foreach (var timesheet in TimeSheets.Skip(s).Take(e - s))
             {
                 Repository.Insert(timesheet);
             }
         });
     }
 }
Пример #7
0
        /// <summary>
        /// 함수의 [a,b] 구간을 적분합니다.
        /// </summary>
        /// <param name="func">적분할 함수</param>
        /// <param name="a">적분 시작 위치</param>
        /// <param name="b">적분 끝 위치</param>
        /// <returns>적분 값</returns>
        public override double Integrate(Func <double, double> func, double a, double b)
        {
            func.ShouldNotBeNull("func");

            if (IsDebugEnabled)
            {
                log.Debug(@"Simpson 적분법을 이용하여 적분을 수행합니다. func=[{0}], a=[{1}], b=[{2}]", func, a, b);
            }

            func.ShouldNotBeNull("unaryFunc");

            if (a > b)
            {
                return(Integrate(func, b, a));
            }

            _steps = GetSteps(a, b, _steps);

            double h     = (b - a) / (2.0 * _steps);
            double hdiv3 = h / 3;

            double fo = 0;
            double fe = 0;

            double N = 2 * _steps - 3;

            ParallelTool.ForWithStep(1, (int)N + 1, 2, () => 0.0, (i, loopState, local) => local + func(a + h * i),
                                     local => { lock (_syncLock) fo += local; });
            ParallelTool.ForWithStep(1, (int)N + 1, 2, () => 0.0, (i, loopState, local) => local + func(a + h * (i + 1)),
                                     local => { lock (_syncLock) fe += local; });

            //for(int i = 1; i <= N; i += 2)
            //{
            //    fo += func(a + h * i); // 홀수항 (odd)
            //    fe += func(a + h * (i + 1)); // 짝수항 (even)
            //}

            var result = (func(a) + func(b) + 4.0 * (fo + func(b - h)) + 2.0 * fe) * hdiv3;

            if (IsDebugEnabled)
            {
                log.Debug(@"적분결과=[{0}]", result);
            }

            return(result);
        }
Пример #8
0
        /// <summary>
        /// 함수의 [a,b] 구간을 적분합니다.
        /// </summary>
        /// <param name="func">적분할 함수</param>
        /// <param name="a">적분 시작 위치</param>
        /// <param name="b">적분 끝 위치</param>
        /// <returns>적분 값</returns>
        public override double Integrate(Func <double, double> func, double a, double b)
        {
            func.ShouldNotBeNull("func");

            if (IsDebugEnabled)
            {
                log.Debug(@"중점접(MidValue)를 이용하여 적분을 수행합니다. func=[{0}], a=[{1}], b=[{2}]", func, a, b);
            }

            func.ShouldNotBeNull("f");

            if (a > b)
            {
                MathTool.Swap(ref a, ref b);
            }

            int    n      = GetSteps(a, b, Steps);
            double h      = (b - a) / n;
            double hdiv2  = h / 2;
            double n2     = n * 2;
            double result = 0;

            ParallelTool.ForWithStep(1,
                                     (int)(n2 + 1),
                                     2,
                                     () => 0.0,
                                     (i, loopState, local) => local + func(a + i * hdiv2),
                                     local => {
                lock (_syncLock)
                    result += local;
            });

            //for(int i = 1; i < n2; i += 2)
            //    result += func(a + i * hdiv2);

            result *= h;
            if (IsDebugEnabled)
            {
                log.Debug(@"적분 결과=[{0}]", result);
            }

            return(result);
        }
Пример #9
0
        public void AddWeekOfYearsTest()
        {
            const int maxAddWeeks = 40;

            Action <CultureInfo> @AddWeekOfYearsAction =
                (culture) => {
                var currentCulture = culture;

                Enumerable
                .Range(2000, 20)
                .RunEach(year => {
                    const int step         = 10;
                    YearAndWeek prevResult = new YearAndWeek();

                    var maxWeek = WeekTool.GetEndYearAndWeek(year, currentCulture);

                    for (var week = 1; week < maxWeek.Week; week += step)
                    {
                        for (var addWeeks = -maxAddWeeks; addWeeks <= maxAddWeeks; addWeeks += step)
                        {
                            var current = new YearAndWeek(year, week);
                            var result  = WeekTool.AddWeekOfYears(current, addWeeks, currentCulture);

                            if (addWeeks != 0 && prevResult.Week.HasValue)
                            {
                                if (result.Year == prevResult.Year)
                                {
                                    Assert.AreEqual(prevResult.Week + step, result.Week,
                                                    @"Prev=[{0}], Result=[{1}], addWeeks=[{2}]", prevResult, result,
                                                    addWeeks);
                                }
                            }

                            result.Week.Should().Have.Value();
                            result.Week.Value.Should().Be.GreaterThan(0);
                            result.Week.Value.Should().Be.LessThanOrEqualTo(TimeSpec.MaxWeeksPerYear);

                            prevResult = result;

                            if (IsDebugEnabled)
                            {
                                log.Debug("Current=[{0}], Added=[{1}], AddWeeks=[{2}]", current, result, addWeeks);
                            }
                        }
                    }
                });
            };


            Parallel.For(0, CultureTestData.Default.Count(), i => @AddWeekOfYearsAction(CultureTestData.Default[i]));

            var rule = WeekOfYearRuleKind.Iso8601;

            ParallelTool.ForWithStep(2000, 2020, 2,
                                     year => {
                const int step = 10;
                var prevResult = new YearAndWeek();

                var maxWeek = WeekTool.GetEndYearAndWeek(year, null, rule);

                for (var week = 1; week < maxWeek.Week; week += step)
                {
                    for (var addWeeks = -maxAddWeeks; addWeeks <= maxAddWeeks; addWeeks += step)
                    {
                        var current = new YearAndWeek(year, week);
                        var result  = WeekTool.AddWeekOfYears(current, addWeeks, null, rule);

                        if (addWeeks != 0 && prevResult.Week.HasValue)
                        {
                            if (result.Year == prevResult.Year)
                            {
                                Assert.AreEqual(prevResult.Week + step, result.Week,
                                                @"Prev={0}, Result={1}, addWeeks={2}", prevResult, result,
                                                addWeeks);
                            }
                        }

                        result.Week.Should().Have.Value();
                        result.Week.Value.Should().Be.GreaterThan(0);
                        result.Week.Value.Should().Be.LessThanOrEqualTo(TimeSpec.MaxWeeksPerYear);

                        prevResult = result;

                        if (IsDebugEnabled)
                        {
                            log.Debug("Current=[{0}], Added=[{1}], AddWeeks=[{2}]", current, result, addWeeks);
                        }
                    }
                }
            });
        }
Пример #10
0
        private static int LogStep(ref Step[,] canvasMatrix, Step step, int curRow, int threadCol, int indentLevel, out string log, out string functions)
        {
            int nextRow = curRow;

            log       = "";
            functions = "";
            string indentString = new string(' ', indentLevel * 4);

            if (step.Description.Length > 0)
            {
                log = "\r\n\r\n" + indentString + "/*" + step.Description + "*/";// + ((log.Length > 0) ? ("\r\n" + log) : (""));
            }
            else
            {
                log = "";//"\r\n";// +log;
            }
            switch (step.ToolName)
            {
            case "NullTool":
            {
                log = "";
                return(nextRow);
            }

            case "NoOpTool":
            {
                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "// " + "/*" + step.StepName.Replace("_x0020_", "_") + "*/";
                }
                else
                {
                    log += "\r\n" + indentString + "/*NOP: " + step.StepName.Replace("_x0020_", "_") + "*/";
                }

                return(nextRow);
            }

            case "CaseTool":
            {
                int width  = step.StepWidth;
                int height = step.StepHeight;
                log += "\r\n" + indentString + "/*" + step.ToolName + ": " + step.StepName + "*/";
                string caselog;
                string eh = ErrorHandlingToTxt.Parse(step.StepXmlNode, indentLevel);
                Step[,] caseMatrix = MatrixTransformations.ResizeArray <Step>(ref canvasMatrix, curRow, threadCol, Math.Min(curRow + height - 1, canvasMatrix.GetLength(0) - 1), canvasMatrix.GetLength(1) - 1);
                CaseTool.CaseToTxt(ref caseMatrix, 0, indentLevel + ((eh.Length > 0) ? 1 : 0), height, width, out caselog, out functions);
                nextRow = curRow + height;
                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "// " + caselog.Replace("\r\n", "\r\n// ");
                }
                else
                {
                    if (eh.Length > 0)
                    {
                        log += "\r\n" + indentString + "try" + "\r\n" + indentString + "{";
                        log += "\r\n" + indentString + "    " + caselog;
                        log += "\r\n" + indentString + "}" + "\r\n" + eh;
                    }
                    else
                    {
                        log += "\r\n" + indentString + caselog;
                    }
                }
                return(nextRow);
            }

            case "VariableTool":
            {
                string varlog, varfunction;
                string eh = ErrorHandlingToTxt.Parse(step.StepXmlNode, indentLevel);
                VariableTool.SetVariableToTxt(step, indentLevel + ((eh.Length > 0) ? 1 : 0), out varlog, out varfunction);

                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "//" + varlog;
                }
                else
                {
                    if (eh.Length > 0)
                    {
                        log += "\r\n" + indentString + "try" + "\r\n" + indentString + "{";
                        log += "\r\n" + indentString + "    " + varlog;
                        log += "\r\n" + indentString + "}" + "\r\n" + eh;
                    }
                    else
                    {
                        log += "\r\n" + indentString + varlog;
                    }
                }

                if (varfunction.Length > 0)
                {
                    if (step.Enabled == false)
                    {
                        functions += "\r\n" + "// " + varfunction.Replace("\r\n", "\r\n// ");
                    }
                    else
                    {
                        functions += "\r\n" + varfunction;
                    }
                }

                return(nextRow);
            }

            case "PaWTestTool":
            case "MethodTool":
            case "TestTool":
            case "Mouse":
            case "Keyboard":
            case "Inspect":
            {
                string testlog, dummy;
                string eh = ErrorHandlingToTxt.Parse(step.StepXmlNode, indentLevel);
                TestTool.TestToTxt(step.StepXmlNode, indentLevel + ((eh.Length > 0) ? 1 : 0), out testlog, out dummy);

                if (step.ToolName == "TestTool" || step.ToolName == "PaWTestTool")
                {
                    XmlNode path = step.StepXmlNode.SelectSingleNode(".//*[@Key='ResourceFullName']");
                    if (path != null)
                    {
                        string p;
                        if (path.Attributes["Value"] != null)
                        {
                            p = path.Attributes["Value"].Value;
                        }
                        else
                        {
                            p = path.SelectSingleNode(".//*[@Key='Value']/@Value").Value;
                        }

                        log += "\r\n" + indentString + "/*" + "Path: " + p.Replace(".tsdrv", "") + " */";
                    }
                }

                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "//" + step.StepName.Replace("_x0020_", "_") + testlog;
                }
                else
                {
                    if (eh.Length > 0)
                    {
                        log += "\r\n" + indentString + "try" + "\r\n" + indentString + "{";
                        log += "\r\n" + indentString + "    " + step.StepName.Replace("_x0020_", "_") + testlog;
                        log += "\r\n" + indentString + "}" + "\r\n" + eh;
                    }
                    else
                    {
                        log += "\r\n" + indentString + step.StepName.Replace("_x0020_", "_") + testlog;
                    }
                }

                return(nextRow);
            }

            case "AttributeTool":
            {
                string alog, dummy;
                string eh = ErrorHandlingToTxt.Parse(step.StepXmlNode, indentLevel);
                AttributeTool.AttributeToTxt(step.StepXmlNode, indentLevel + ((eh.Length > 0) ? 1 : 0), out alog, out dummy);

                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "//" + step.StepName.Replace("_x0020_", "_") + alog;
                }
                else
                {
                    if (eh.Length > 0)
                    {
                        log += "\r\n" + indentString + "try" + "\r\n" + indentString + "{";
                        log += "\r\n" + indentString + "    " + step.StepName.Replace("_x0020_", "_") + alog;
                        log += "\r\n" + indentString + "}" + "\r\n" + eh;
                    }
                    else
                    {
                        log += "\r\n" + indentString + step.StepName.Replace("_x0020_", "_") + alog;
                    }
                }

                return(nextRow);
            }

            case "CaptureImageTool":
            {
                string cilog, dummy;
                string eh = ErrorHandlingToTxt.Parse(step.StepXmlNode, indentLevel);
                CaptureImageTool.CaptureImageToTxt(step.StepXmlNode, indentLevel + ((eh.Length > 0) ? 1 : 0), out cilog, out dummy);

                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "//" + step.StepName.Replace("_x0020_", "_") + cilog;
                }
                else
                {
                    if (eh.Length > 0)
                    {
                        log += "\r\n" + indentString + "try" + "\r\n" + indentString + "{";
                        log += "\r\n" + indentString + "    " + step.StepName.Replace("_x0020_", "_") + cilog;
                        log += "\r\n" + indentString + "}" + "\r\n" + eh;
                    }
                    else
                    {
                        log += "\r\n" + indentString + step.StepName.Replace("_x0020_", "_") + cilog;
                    }
                }

                return(nextRow);
            }

            case "CriteriaTool":
            {
                string clog, cfunction;
                string eh = ErrorHandlingToTxt.Parse(step.StepXmlNode, indentLevel);
                CriteriaTool.CriteriaToTxt(step, indentLevel + ((eh.Length > 0) ? 1 : 0), out clog, out cfunction);

                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "//" + step.StepName.Replace("_x0020_", "_") + clog;
                }
                else
                {
                    if (eh.Length > 0)
                    {
                        log += "\r\n" + indentString + "try" + "\r\n" + indentString + "{";
                        log += "\r\n" + indentString + "    " + step.StepName.Replace("_x0020_", "_") + clog;
                        log += "\r\n" + indentString + "}" + "\r\n" + eh;
                    }
                    else
                    {
                        log += "\r\n" + indentString + step.StepName.Replace("_x0020_", "_") + clog;
                    }
                }

                if (cfunction.Length > 0)
                {
                    if (step.Enabled == false)
                    {
                        functions += "\r\n" + "// " + cfunction.Replace("\r\n", "\r\n// ");
                    }
                    else
                    {
                        functions += "\r\n" + cfunction;
                    }
                }

                return(nextRow);
            }

            case "ScripterTool":
            case "PaWScripterTool":
            {
                string slog, dummy;
                string eh = ErrorHandlingToTxt.Parse(step.StepXmlNode, indentLevel);
                ScripterTool.ScripterToTxt(step.StepXmlNode, indentLevel + ((eh.Length > 0) ? 1 : 0), out slog, out dummy);

                XmlNode path = step.StepXmlNode.SelectSingleNode(".//*[@Key='ResourceFullName']");
                if (path != null)
                {
                    string p;
                    if (path.Attributes["Value"] != null)
                    {
                        p = path.Attributes["Value"].Value;
                    }
                    else
                    {
                        p = path.SelectSingleNode(".//*[@Key='Value']/@Value").Value;
                    }

                    log += "\r\n" + indentString + "/* " + "Path: " + p.Replace(".tsscript", "") + " */";
                }

                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "//" + step.StepName.Replace("_x0020_", "_") + slog;
                }
                else
                {
                    if (eh.Length > 0)
                    {
                        log += "\r\n" + indentString + "try" + "\r\n" + indentString + "{";
                        log += "\r\n" + indentString + "    " + step.StepName.Replace("_x0020_", "_") + slog;
                        log += "\r\n" + indentString + "}" + "\r\n" + eh;
                    }
                    else
                    {
                        log += "\r\n" + indentString + step.StepName.Replace("_x0020_", "_") + slog;
                    }
                }

                return(nextRow);
            }

            case "CommandTool":
            {
                string clog, cfunction;
                string eh = ErrorHandlingToTxt.Parse(step.StepXmlNode, indentLevel);
                CommandTool.CommandToTxt(step, indentLevel + ((eh.Length > 0) ? 1 : 0), out clog, out cfunction);

                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "//" + step.StepName.Replace("_x0020_", "_") + clog;
                }
                else
                {
                    if (eh.Length > 0)
                    {
                        log += "\r\n" + indentString + "try" + "\r\n" + indentString + "{";
                        log += "\r\n" + indentString + "    " + step.StepName.Replace("_x0020_", "_") + clog;
                        log += "\r\n" + indentString + "}" + "\r\n" + eh;
                    }
                    else
                    {
                        log += "\r\n" + indentString + step.StepName.Replace("_x0020_", "_") + clog;
                    }
                }

                if (cfunction.Length > 0)
                {
                    if (step.Enabled == false)
                    {
                        functions += "\r\n" + "// " + cfunction.Replace("\r\n", "\r\n// ");
                    }
                    else
                    {
                        functions += "\r\n" + cfunction;
                    }
                }

                return(nextRow);
            }

            case "TerminalCommandTool":
            {
                string clog, cfunction;
                string eh = ErrorHandlingToTxt.Parse(step.StepXmlNode, indentLevel);
                TerminalCommandTool.CommandToTxt(step, indentLevel + ((eh.Length > 0) ? 1 : 0), out clog, out cfunction);

                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "//" + step.StepName.Replace("_x0020_", "_") + clog;
                }
                else
                {
                    if (eh.Length > 0)
                    {
                        log += "\r\n" + indentString + "try" + "\r\n" + indentString + "{";
                        log += "\r\n" + indentString + "    " + step.StepName.Replace("_x0020_", "_") + clog;
                        log += "\r\n" + indentString + "}" + "\r\n" + eh;
                    }
                    else
                    {
                        log += "\r\n" + indentString + step.StepName.Replace("_x0020_", "_") + clog;
                    }
                }

                if (cfunction.Length > 0)
                {
                    if (step.Enabled == false)
                    {
                        functions += "\r\n" + "// " + cfunction.Replace("\r\n", "\r\n// ");
                    }
                    else
                    {
                        functions += "\r\n" + cfunction;
                    }
                }

                return(nextRow);
            }

            case "WriteTool":
            {
                string clog, cfunction;
                string eh = ErrorHandlingToTxt.Parse(step.StepXmlNode, indentLevel);
                WriteTool.WriteToTxt(step, indentLevel + ((eh.Length > 0) ? 1 : 0), out clog, out cfunction);

                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "//" + step.StepName.Replace("_x0020_", "_") + clog;
                }
                else
                {
                    if (eh.Length > 0)
                    {
                        log += "\r\n" + indentString + "try" + "\r\n" + indentString + "{";
                        log += "\r\n" + indentString + "    " + step.StepName.Replace("_x0020_", "_") + clog;
                        log += "\r\n" + indentString + "}" + "\r\n" + eh;
                    }
                    else
                    {
                        log += "\r\n" + indentString + step.StepName.Replace("_x0020_", "_") + clog;
                    }
                }

                if (cfunction.Length > 0)
                {
                    if (step.Enabled == false)
                    {
                        functions += "\r\n" + "// " + cfunction.Replace("\r\n", "\r\n// ");
                    }
                    else
                    {
                        functions += "\r\n" + cfunction;
                    }
                }

                return(nextRow);
            }

            case "ReadTool":
            {
                string clog, cfunction;
                string eh = ErrorHandlingToTxt.Parse(step.StepXmlNode, indentLevel);
                ReadTool.ReadToTxt(step, indentLevel + ((eh.Length > 0) ? 1 : 0), out clog, out cfunction);

                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "//" + step.StepName.Replace("_x0020_", "_") + clog;
                }
                else
                {
                    if (eh.Length > 0)
                    {
                        log += "\r\n" + indentString + "try" + "\r\n" + indentString + "{";
                        log += "\r\n" + indentString + "    " + step.StepName.Replace("_x0020_", "_") + clog;
                        log += "\r\n" + indentString + "}" + "\r\n" + eh;
                    }
                    else
                    {
                        log += "\r\n" + indentString + step.StepName.Replace("_x0020_", "_") + clog;
                    }
                }

                if (cfunction.Length > 0)
                {
                    if (step.Enabled == false)
                    {
                        functions += "\r\n" + "// " + cfunction.Replace("\r\n", "\r\n// ");
                    }
                    else
                    {
                        functions += "\r\n" + cfunction;
                    }
                }

                return(nextRow);
            }

            case "MessageTool":
            {
                string clog, cfunction;
                string eh = ErrorHandlingToTxt.Parse(step.StepXmlNode, indentLevel);
                MessageTool.MessageToTxt(step, indentLevel + ((eh.Length > 0) ? 1 : 0), out clog, out cfunction);

                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "//" + step.StepName.Replace("_x0020_", "_") + clog;
                }
                else
                {
                    if (eh.Length > 0)
                    {
                        log += "\r\n" + indentString + "try" + "\r\n" + indentString + "{";
                        log += "\r\n" + indentString + "    " + step.StepName.Replace("_x0020_", "_") + clog;
                        log += "\r\n" + indentString + "}" + "\r\n" + eh;
                    }
                    else
                    {
                        log += "\r\n" + indentString + step.StepName.Replace("_x0020_", "_") + clog;
                    }
                }

                if (cfunction.Length > 0)
                {
                    if (step.Enabled == false)
                    {
                        functions += "\r\n" + "// " + cfunction.Replace("\r\n", "\r\n// ");
                    }
                    else
                    {
                        functions += "\r\n" + cfunction;
                    }
                }

                return(nextRow);
            }

            case "TransformationTool":
            {
                string tlog, tfunctions;
                string eh = ErrorHandlingToTxt.Parse(step.StepXmlNode, indentLevel);
                TransformTool.TransformToTxt(step, indentLevel + ((eh.Length > 0) ? 1 : 0), out tlog, out tfunctions);

                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "//" + step.StepName.Replace("_x0020_", "_") + tlog;
                }
                else
                {
                    if (eh.Length > 0)
                    {
                        log += "\r\n" + indentString + "try" + "\r\n" + indentString + "{";
                        log += "\r\n" + indentString + "    " + step.StepName.Replace("_x0020_", "_") + tlog;
                        log += "\r\n" + indentString + "}" + "\r\n" + eh;
                    }
                    else
                    {
                        log += "\r\n" + indentString + step.StepName.Replace("_x0020_", "_") + tlog;
                    }
                }

                if (tfunctions.Length > 0)
                {
                    if (step.Enabled == false)
                    {
                        functions += "\r\n" + "// " + tfunctions.Replace("\r\n", "\r\n// ");
                    }
                    else
                    {
                        functions += "\r\n" + tfunctions;
                    }
                }

                return(nextRow);
            }

            case "SetSessionTool":
            {
                string sessionlog, dummy;
                string eh = ErrorHandlingToTxt.Parse(step.StepXmlNode, indentLevel);
                SetSessionTool.SessionToTxt(step, indentLevel + ((eh.Length > 0) ? 1 : 0), out sessionlog, out dummy);
                log += "\r\n" + indentString + "/*" + step.ToolName + ": " + step.StepName + "*/";

                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "//" + step.StepName.Replace("_x0020_", "_") + sessionlog;
                }
                else
                {
                    if (eh.Length > 0)
                    {
                        log += "\r\n" + indentString + "try" + "\r\n" + indentString + "{";
                        log += "\r\n" + indentString + "    " + step.StepName.Replace("_x0020_", "_") + sessionlog;
                        log += "\r\n" + indentString + "}" + "\r\n" + eh;
                    }
                    else
                    {
                        log += "\r\n" + indentString + step.StepName.Replace("_x0020_", "_") + sessionlog;
                    }
                }

                return(nextRow);
            }

            case "DelayTool":
            {
                string dlog, dummy;
                string eh = ErrorHandlingToTxt.Parse(step.StepXmlNode, indentLevel);
                DelayTool.DelayToTxt(step, indentLevel + ((eh.Length > 0) ? 1 : 0), out dlog, out dummy);

                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "//" + step.StepName.Replace("_x0020_", "_") + dlog;
                }
                else
                {
                    if (eh.Length > 0)
                    {
                        log += "\r\n" + indentString + "try" + "\r\n" + indentString + "{";
                        log += "\r\n" + indentString + "    " + step.StepName.Replace("_x0020_", "_") + dlog;
                        log += "\r\n" + indentString + "}" + "\r\n" + eh;
                    }
                    else
                    {
                        log += "\r\n" + indentString + step.StepName.Replace("_x0020_", "_") + dlog;
                    }
                }

                return(nextRow);
            }

            case "SetEventTool":
            {
                string dlog, dummy;
                string eh = ErrorHandlingToTxt.Parse(step.StepXmlNode, indentLevel);
                SetEventTool.SetEventToTxt(step, indentLevel + ((eh.Length > 0) ? 1 : 0), out dlog, out dummy);

                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "//" + step.StepName.Replace("_x0020_", "_") + dlog;
                }
                else
                {
                    if (eh.Length > 0)
                    {
                        log += "\r\n" + indentString + "try" + "\r\n" + indentString + "{";
                        log += "\r\n" + indentString + "    " + step.StepName.Replace("_x0020_", "_") + dlog;
                        log += "\r\n" + indentString + "}" + "\r\n" + eh;
                    }
                    else
                    {
                        log += "\r\n" + indentString + step.StepName.Replace("_x0020_", "_") + dlog;
                    }
                }

                return(nextRow);
            }

            case "WaitForEventTool":
            {
                string dlog, dummy;
                string eh = ErrorHandlingToTxt.Parse(step.StepXmlNode, indentLevel);
                WaitForEventTool.WaitForEventToTxt(step, indentLevel + ((eh.Length > 0) ? 1 : 0), out dlog, out dummy);

                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "//" + step.StepName.Replace("_x0020_", "_") + dlog;
                }
                else
                {
                    if (eh.Length > 0)
                    {
                        log += "\r\n" + indentString + "try" + "\r\n" + indentString + "{";
                        log += "\r\n" + indentString + "    " + step.StepName.Replace("_x0020_", "_") + dlog;
                        log += "\r\n" + indentString + "}" + "\r\n" + eh;
                    }
                    else
                    {
                        log += "\r\n" + indentString + step.StepName.Replace("_x0020_", "_") + dlog;
                    }
                }

                return(nextRow);
            }

            case "PassFailTool":
            {
                string dlog, dfunc;
                string eh = ErrorHandlingToTxt.Parse(step.StepXmlNode, indentLevel);
                PassFailTool.PassFailToTxt(step, indentLevel + ((eh.Length > 0) ? 1 : 0), out dlog, out dfunc);
                string tooltype = step.StepXmlNode.SelectSingleNode(".//*[@Key='NotificationType']/@Value").Value;
                string toolname = "PassFailTool";
                switch (tooltype)
                {
                case "0":
                    toolname = "Pass";
                    break;

                case "1":
                    toolname = "Fail";
                    break;

                case "2":
                    toolname = "Text To Report";
                    break;

                default:
                    break;
                }
                log += "\r\n" + indentString + "/*" + toolname + ": " + step.StepName + "*/";

                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "//" + step.StepName.Replace("_x0020_", "_") + dlog;
                }
                else
                {
                    if (eh.Length > 0)
                    {
                        log += "\r\n" + indentString + "try" + "\r\n" + indentString + "{";
                        log += "\r\n" + indentString + "    " + step.StepName.Replace("_x0020_", "_") + dlog;
                        log += "\r\n" + indentString + "}" + "\r\n" + eh;
                    }
                    else
                    {
                        log += "\r\n" + indentString + step.StepName.Replace("_x0020_", "_") + dlog;
                    }
                }

                if (dfunc.Length > 0)
                {
                    if (step.Enabled == false)
                    {
                        functions += "\r\n" + "// " + dfunc.Replace("\r\n", "\r\n// ");
                    }
                    else
                    {
                        functions += "\r\n" + dfunc;
                    }
                }

                return(nextRow);
            }

            case "ErrorTool":
            {
                string dlog, dummy;
                ErrorTool.ErrorToTxt(step, indentLevel, out dlog, out dummy);
                log += "\r\n" + indentString + "/*" + step.ToolName + ": " + step.StepName + "*/";

                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "// throw" + step.StepName.Replace("_x0020_", "_") + dlog;
                }
                else
                {
                    log += "\r\n" + indentString + "throw " + step.StepName.Replace("_x0020_", "_") + dlog;
                }

                return(nextRow);
            }

            case "EndSessionTool":
            {
                string dlog, dummy;
                string eh = ErrorHandlingToTxt.Parse(step.StepXmlNode, indentLevel);
                EndSessionTool.EndSessionToTxt(step, indentLevel + ((eh.Length > 0) ? 1 : 0), out dlog, out dummy);
                log += "\r\n" + indentString + "/*" + step.ToolName + ": " + step.StepName + "*/";

                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "//" + step.StepName.Replace("_x0020_", "_") + dlog;
                }
                else
                {
                    if (eh.Length > 0)
                    {
                        log += "\r\n" + indentString + "try" + "\r\n" + indentString + "{";
                        log += "\r\n" + indentString + "    " + step.StepName.Replace("_x0020_", "_") + dlog;
                        log += "\r\n" + indentString + "}" + "\r\n" + eh;
                    }
                    else
                    {
                        log += "\r\n" + indentString + step.StepName.Replace("_x0020_", "_") + dlog;
                    }
                }

                return(nextRow);
            }

            case "EndTool":
            {
                string dlog, dummy;
                EndTool.EndToTxt(step, indentLevel, out dlog, out dummy);
                log += "\r\n" + indentString + "/*" + step.ToolName + ": " + step.StepName + "*/";

                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "//" + step.StepName.Replace("_x0020_", "_") + dlog;
                }
                else
                {
                    log += "\r\n" + indentString + step.StepName.Replace("_x0020_", "_") + dlog;
                }

                return(nextRow);
            }

            case "CodeTool":
            {
                string dummy, codefunction;
                string eh = ErrorHandlingToTxt.Parse(step.StepXmlNode, indentLevel);
                CodeTool.CodeToTxt(step, indentLevel + ((eh.Length > 0)?1:0), out dummy, out codefunction);

                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "//" + step.StepName.Replace("_x0020_", "_") + "()";
                }
                else
                {
                    if (eh.Length > 0)
                    {
                        log += "\r\n" + indentString + "try" + "\r\n" + indentString + "{";
                        log += "\r\n" + indentString + "    " + step.StepName.Replace("_x0020_", "_") + "()";
                        log += "\r\n" + indentString + "}" + "\r\n" + eh;
                    }
                    else
                    {
                        log += "\r\n" + indentString + step.StepName.Replace("_x0020_", "_") + "()";
                    }
                }

                if (codefunction.Length > 0)
                {
                    if (step.Enabled == false)
                    {
                        functions += "\r\n" + "// " + codefunction.Replace("\r\n", "\r\n// ");
                    }
                    else
                    {
                        functions += "\r\n" + codefunction;
                    }
                }

                return(nextRow);
            }

            case "LoopTool":
            case "ParaLoopTool":
            {
                int width  = step.StepWidth;
                int height = step.StepHeight;
                log += "\r\n" + indentString + "/*" + step.ToolName + ": " + step.StepName + "*/";
                string looplog, loopfunctions;
                string eh = ErrorHandlingToTxt.Parse(step.StepXmlNode, indentLevel);
                Step[,] loopMatrix = MatrixTransformations.ResizeArray <Step>(ref canvasMatrix, curRow, threadCol, Math.Min(curRow + height - 1, canvasMatrix.GetLength(0) - 1), canvasMatrix.GetLength(1) - 1);
                LoopTool.LoopToTxt(ref loopMatrix, 0, indentLevel + ((eh.Length > 0) ? 1 : 0), height, width, out looplog, out loopfunctions);

                nextRow = curRow + height;
                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "// " + looplog.Replace("\r\n", "\r\n// ");
                }
                else
                {
                    if (eh.Length > 0)
                    {
                        log += "\r\n" + indentString + "try" + "\r\n" + indentString + "{";
                        log += "\r\n" + indentString + "    " + looplog;
                        log += "\r\n" + indentString + "}" + "\r\n" + eh;
                    }
                    else
                    {
                        log += "\r\n" + indentString + looplog;
                    }
                }

                if (loopfunctions.Length > 0)
                {
                    if (step.Enabled == false)
                    {
                        functions += "\r\n" + "// " + loopfunctions.Replace("\r\n", "\r\n// ");
                    }
                    else
                    {
                        functions += "\r\n" + loopfunctions;
                    }
                }

                return(nextRow);
            }

            case "WhileTool":
            {
                int width  = step.StepWidth;
                int height = step.StepHeight;
                log += "\r\n" + indentString + "/*" + step.ToolName + ": " + step.StepName + "*/";
                string wlog, wfunctions;
                string eh = ErrorHandlingToTxt.Parse(step.StepXmlNode, indentLevel);
                Step[,] whileMatrix = MatrixTransformations.ResizeArray <Step>(ref canvasMatrix, curRow, threadCol, Math.Min(curRow + height - 1, canvasMatrix.GetLength(0) - 1), canvasMatrix.GetLength(1) - 1);
                WhileTool.WhileToTxt(ref whileMatrix, 0, indentLevel + ((eh.Length > 0) ? 1 : 0), height, width, out wlog, out wfunctions);

                nextRow = curRow + height;
                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "// " + wlog.Replace("\r\n", "\r\n// ");
                }
                else
                {
                    if (eh.Length > 0)
                    {
                        log += "\r\n" + indentString + "try" + "\r\n" + indentString + "{";
                        log += "\r\n" + indentString + "    " + wlog;
                        log += "\r\n" + indentString + "}" + "\r\n" + eh;
                    }
                    else
                    {
                        log += "\r\n" + indentString + wlog;
                    }
                }

                if (wfunctions.Length > 0)
                {
                    if (step.Enabled == false)
                    {
                        functions += "\r\n" + "// " + wfunctions.Replace("\r\n", "\r\n// ");
                    }
                    else
                    {
                        functions += "\r\n" + wfunctions;
                    }
                }

                return(nextRow);
            }

            case "LockTool":
            {
                int width  = step.StepWidth;
                int height = step.StepHeight;
                log += "\r\n" + indentString + "/*" + step.ToolName + ": " + step.StepName + "*/";
                string llog, lfunctions;
                string eh = ErrorHandlingToTxt.Parse(step.StepXmlNode, indentLevel);
                Step[,] lockMatrix = MatrixTransformations.ResizeArray <Step>(ref canvasMatrix, curRow, threadCol, Math.Min(curRow + height - 1, canvasMatrix.GetLength(0) - 1), canvasMatrix.GetLength(1) - 1);
                LockTool.LockToTxt(ref lockMatrix, 0, indentLevel + ((eh.Length > 0) ? 1 : 0), height, width, out llog, out lfunctions);

                nextRow = curRow + height;
                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "// " + llog.Replace("\r\n", "\r\n// ");
                }
                else
                {
                    if (eh.Length > 0)
                    {
                        log += "\r\n" + indentString + "try" + "\r\n" + indentString + "{";
                        log += "\r\n" + indentString + "    " + llog;
                        log += "\r\n" + indentString + "}" + "\r\n" + eh;
                    }
                    else
                    {
                        log += "\r\n" + indentString + llog;
                    }
                }

                if (lfunctions.Length > 0)
                {
                    if (step.Enabled == false)
                    {
                        functions += "\r\n" + "// " + lfunctions.Replace("\r\n", "\r\n// ");
                    }
                    else
                    {
                        functions += "\r\n" + lfunctions;
                    }
                }

                return(nextRow);
            }

            case "ParallelTool":
            {
                int width  = step.StepWidth;
                int height = step.StepHeight;
                log += "\r\n" + indentString + "/*" + step.ToolName + ": " + step.StepName + "*/";
                string plog, pfunctions;
                Step[,] pMatrix = MatrixTransformations.ResizeArray <Step>(ref canvasMatrix, curRow, 0, Math.Min(curRow + height - 1, canvasMatrix.GetLength(0) - 1), canvasMatrix.GetLength(1) - 1);
                ParallelTool.ParallelToTxt(ref pMatrix, threadCol, indentLevel, height, width, out plog, out pfunctions);
                nextRow = curRow + height;
                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "// " + plog.Replace("\r\n", "\r\n// ");
                }
                else
                {
                    log += "\r\n" + indentString + plog;
                }

                if (pfunctions.Length > 0)
                {
                    if (step.Enabled == false)
                    {
                        functions += "\r\n" + "// " + pfunctions.Replace("\r\n", "\r\n// ");
                    }
                    else
                    {
                        functions += "\r\n" + pfunctions;
                    }
                }

                return(nextRow);
            }

            case "GroupTool":
            case "PaWDllTool":
            case "DllTool":
            case "CommandShellTool":
            case "SequenceTool":
            case "TerminalTool":
            case "WebServiceTool":
            case "NetworkClientTool":
            {
                string glog, gfunctions;
                if (step.ToolName == "DllTool" || step.ToolName == "PaWDllTool" || step.ToolName == "WebServiceTool")
                {
                    XmlNode path = step.StepXmlNode.SelectSingleNode(".//*[@Key='ResourceFullName']");
                    if (path != null)
                    {
                        string p;
                        if (path.Attributes["Value"] != null)
                        {
                            p = path.Attributes["Value"].Value;
                        }
                        else
                        {
                            p = path.SelectSingleNode(".//*[@Key='Value']/@Value").Value;
                        }

                        log += "\r\n" + indentString + "/*" + "Path: " + p.Replace(".tsdll", "") + " */";
                    }

                    log += "\r\n" + indentString + "/*" + step.ToolName + ": " + step.StepName + "*/";
                }
                else if (step.ToolName == "SequenceTool")
                {
                    XmlNode path = step.StepXmlNode.SelectSingleNode(".//*[@Key='LibraryFullName']");
                    if (path != null)
                    {
                        string p;
                        if (path.Attributes["Value"] != null)
                        {
                            p = path.Attributes["Value"].Value;
                        }
                        else
                        {
                            p = path.SelectSingleNode(".//*[@Key='Value']/@Value").Value;
                        }

                        log += "\r\n" + indentString + "/*" + "Path: " + p.Replace(".tslib", "") + " */";
                    }

                    log += "\r\n" + indentString + "/*" + step.ToolName + ": " + step.StepName + "*/";
                }
                else
                {
                    log += "\r\n" + indentString + "/*" + step.ToolName + ": " + step.StepName + "*/";
                }
                XmlNode groupSteps = step.StepXmlNode.SelectSingleNode(".//List[@Key='Steps']");
                XmlNode eh         = step.StepXmlNode.SelectSingleNode(".//ErrorHandlingBehavior");
                CanvasAnalyzer.StepsListToTxt(groupSteps.ChildNodes, true, indentLevel, eh, out glog, out gfunctions);
                if (step.Enabled == false)
                {
                    log += "\r\n" + indentString + "// " + glog.Replace("\r\n", "\r\n// ");
                }
                else
                {
                    log += "\r\n" + indentString + glog;
                }

                if (gfunctions.Length > 0)
                {
                    if (step.Enabled == false)
                    {
                        functions += "\r\n" + "// " + gfunctions.Replace("\r\n", "\r\n// ");
                    }
                    else
                    {
                        functions += "\r\n" + gfunctions;
                    }
                }

                return(nextRow);
            }

            case "AnalyzableCompositeTool":
            {
                string      aclog, acfunctions;
                XmlNodeList acTools = step.StepXmlNode.SelectNodes(".//Array[@Key='ChildTools']/*");
                foreach (XmlNode tool in acTools)
                {
                    Step curstep = new Step(tool);
                    curstep.Enabled = step.Enabled;
                    LogStep(ref canvasMatrix, curstep, curRow, threadCol, indentLevel, out aclog, out acfunctions);

                    if (step.Enabled == false)
                    {
                        log += "\r\n" + indentString + "// " + aclog.Replace("\r\n", "\r\n// ");
                    }
                    else
                    {
                        log += "\r\n" + indentString + aclog;
                    }

                    if (acfunctions.Length > 0)
                    {
                        if (step.Enabled == false)
                        {
                            functions += "\r\n" + "// " + acfunctions.Replace("\r\n", "\r\n// ");
                        }
                        else
                        {
                            functions += "\r\n" + acfunctions;
                        }
                    }
                }

                return(nextRow + acTools.Count - 1);
            }
            }

            if (step.Enabled == false)
            {
                log += "\r\n" + indentString + "//";
            }
            else
            {
                log += "\r\n" + indentString;
            }

            log += step.StepName.Replace("_x0020_", "_") + " // (" + step.ToolName + ")";

            return(nextRow);
        }