//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()); }
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()); }
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()); }
//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()); }
//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()); }
//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); }