Ejemplo n.º 1
0
        //Returns output for section representing situation if there is the match or not
        private string GetMatchOrNotBody(int ruleIndex)
        {
            //Assign maximum/minimum if this is the first met condition
            var    noMatchCheck     = new SolidityIfElse();
            string noMatchCheckBody = string.Empty;

            foreach (var outputEntry in Decision.DecisionTable.Rules[ruleIndex].OutputEntries.Select((value, i) => new { i, value }))
            {
                var dataType       = Decision.DecisionTable.Outputs[outputEntry.i].TypeRef;
                var convertedValue = ConvertToSolidityValue(outputEntry.value.Text, dataType);
                noMatchCheckBody += $"output.{Decision.DecisionTable.Outputs[outputEntry.i].Name.Replace(".", "__")} = {convertedValue};";
                if (outputEntry.i + 1 < Decision.DecisionTable.Rules[ruleIndex].OutputEntries.Count())
                {
                    noMatchCheckBody += "\n";
                }
            }
            noMatchCheck.AddConditionBlock("!matchedRule", new SolidityStatement(noMatchCheckBody, false));

            //Assign maximum/minimum if the values are greater/lesser
            string matchCheckBody = string.Empty;

            foreach (var outputEntry in Decision.DecisionTable.Rules[ruleIndex].OutputEntries.Select((value, i) => new { i, value }))
            {
                var    outputsCheck          = new SolidityIfElse();
                var    dataType              = Decision.DecisionTable.Outputs[outputEntry.i].TypeRef;
                var    convertedValue        = ConvertToSolidityValue(outputEntry.value.Text, dataType);
                string outputsCheckCondition = $"output.{Decision.DecisionTable.Outputs[outputEntry.i].Name} {Sign} {convertedValue}";
                string outputsCheckBody      = $"output.{Decision.DecisionTable.Outputs[outputEntry.i].Name.Replace(".", "__")} = {convertedValue};";
                outputsCheck.AddConditionBlock(outputsCheckCondition, new SolidityStatement(outputsCheckBody, false));
                matchCheckBody += outputsCheck.ToString();
            }
            noMatchCheck.AddConditionBlock(string.Empty, new SolidityStatement(matchCheckBody, false));
            return(noMatchCheck.ToString());
        }
Ejemplo n.º 2
0
        private string GetPriorityComparisonBody()
        {
            var    priorityComparison = new SolidityIfElse();
            string ifCondition        = string.Empty;

            //Make function of cycles comparing priorities
            foreach (var outputVarable in Decision.DecisionTable.Outputs.Select((value, i) => new { i, value }))
            {
                ifCondition += $"priorities[i].{outputVarable.value.Name} == currentOutput.{outputVarable.value.Name}";
                if (outputVarable.i + 1 < Decision.DecisionTable.Outputs.Count)
                {
                    ifCondition += " && ";
                }
            }
            priorityComparison.AddConditionBlock(ifCondition, new SolidityStatement("return currentOutput", true));
            string elseCondition = string.Empty;

            foreach (var outputVarable in Decision.DecisionTable.Outputs.Select((value, i) => new { i, value }))
            {
                elseCondition += $"priorities[i].{outputVarable.value.Name} == newOutput.{outputVarable.value.Name}";
                if (outputVarable.i + 1 < Decision.DecisionTable.Outputs.Count)
                {
                    elseCondition += " && ";
                }
            }
            priorityComparison.AddConditionBlock(elseCondition, new SolidityStatement("return newOutput", true));
            return(priorityComparison.ToString());
        }
Ejemplo n.º 3
0
        public void OneConditionTest()
        {
            SolidityIfElse ifelse = new SolidityIfElse();

            ifelse.AddConditionBlock("a == 2", new SolidityStatement("a = 0"));

            string expected = "if(a == 2){\n" +
                              "\ta = 0;\n" +
                              "}\n";

            Assert.Equal(expected, ifelse.ToString());
        }
Ejemplo n.º 4
0
        //Returns output for section representing situation if there is the match or not
        private string GetPriorityCheckBody(int ruleIndex)
        {
            var priorityCheck = new SolidityIfElse();
            //Assign output if there is already match
            string matchBody = GetMatchBody(ruleIndex);

            priorityCheck.AddConditionBlock("!matchedRule", new SolidityStatement(matchBody, false));

            //Assign output if there is no match yet
            string noMatchBody = GetNoMatchBody(ruleIndex);

            priorityCheck.AddConditionBlock("", new SolidityStatement(noMatchBody, true));
            return(priorityCheck.ToString());
        }
Ejemplo n.º 5
0
        //Returns string representation of section checking existence of matched output in the priority list
        private string GetPirorityListCheck(int ruleIndex)
        {
            var    priorityListCheck     = new SolidityIfElse();
            string priorityListCheckBody = "existsInOutput[i] = true;\n" +
                                           "outputSize++;\n" +
                                           "matchedRule = true;\n" +
                                           "break;";
            string priorityListCheckCond = "!existsInOutput[i]";

            foreach (var outputEntry in Decision.DecisionTable.Rules[ruleIndex].OutputEntries.Select((value, i) => new { i, value }))
            {
                var comparisonVar   = $"priorities[i].{Decision.DecisionTable.Outputs[outputEntry.i].Name}";
                var comparisonType  = Decision.DecisionTable.Outputs[outputEntry.i].TypeRef;
                var comparisonEntry = outputEntry.value.Text;
                var comparison      = ConvertExpressionToCondition(comparisonVar, comparisonType, comparisonEntry, true);
                priorityListCheckCond += $" && {comparison}";
            }
            priorityListCheck.AddConditionBlock(priorityListCheckCond, new SolidityStatement(priorityListCheckBody, false));
            return(priorityListCheck.ToString());
        }
Ejemplo n.º 6
0
        //Retruns for loop component initializing the output
        private SolidityFor GetInitializationForLoop(int noUniqueOutputs)
        {
            var initForLoop = new SolidityFor("i", $"{noUniqueOutputs}");
            //Add only outputs that meet the conditions
            var    initCheck     = new SolidityIfElse();
            string initCheckBody = $"output[j] = {OutputStructName}(";

            foreach (var output in Decision.DecisionTable.Outputs.Select((value, i) => new { i, value }))
            {
                initCheckBody += $"priorities[i].{output.value.Name}";
                if (output.i + 1 < Decision.DecisionTable.Outputs.Count)
                {
                    initCheckBody += ", ";
                }
            }
            initCheckBody += ");\n";
            initCheckBody += "j++;";
            initCheck.AddConditionBlock("existsInOutput[i]", new SolidityStatement(initCheckBody, false));
            initForLoop.AddToBody(new SolidityStatement(initCheck.ToString(), false));
            return(initForLoop);
        }