public void When_Inherited_data_Context_And_Converter_Different_Types_Invalid_Child_Path() { var SUT = new Target1(); var child = new Target2(SUT); var converter = new BoolToNumber(); child.SetBinding("DataContext", new Binding("Item.List[0]")); child.SetBinding("TargetValue", new Binding("Details_zzz.InfoBoolean", converter: converter) { FallbackValue = 10 }); SUT.ChildrenBinders.Add(child); // With the invalid path (Details_zzz instead of Details), the converter should not be called at all. // FallbackValue should be used SUT.DataContext = new SourceLevel0() { Item = new SourceLevel1() { List = new SourceLevel2[] { new SourceLevel2() } } }; Assert.AreEqual(10, child.TargetValue); Assert.AreEqual(0, converter.ConversionCount); Assert.AreEqual(null, converter.LastValue); }
public void When_Inherited_data_Context_Sequence_And_Converter_DifferentTypes() { var SUT = new Target1(); var child = new Target2(SUT); var converter = new BoolToNumber(); child.SetBinding(Target2.DataContextProperty, new Binding("Item.List[0]")); child.SetBinding("TargetValue", new Binding("Details.InfoBoolean", converter: converter) { FallbackValue = 10 }); SUT.ChildrenBinders.Add(child); SUT.DataContext = new SourceLevel0(); Assert.AreEqual(10, child.TargetValue); Assert.AreEqual(0, converter.ConversionCount); Assert.AreEqual(null, converter.LastValue); SUT.DataContext = null; Assert.AreEqual(10, child.TargetValue); Assert.AreEqual(0, converter.ConversionCount); Assert.AreEqual(null, converter.LastValue); SUT.DataContext = new SourceLevel0(); Assert.AreEqual(10, child.TargetValue); Assert.AreEqual(0, converter.ConversionCount); Assert.AreEqual(null, converter.LastValue); SUT.DataContext = null; Assert.AreEqual(10, child.TargetValue); Assert.AreEqual(0, converter.ConversionCount); Assert.AreEqual(null, converter.LastValue); SUT.DataContext = new SourceLevel0() { Item = new SourceLevel1() { List = new SourceLevel2[] { new SourceLevel2() } } }; Assert.AreEqual(-1000, child.TargetValue); Assert.AreEqual(1, converter.ConversionCount); Assert.AreEqual(true, converter.LastValue); // It breaks here, when a broken binding would replace a fully functional one. SUT.DataContext = new SourceLevel0(); Assert.AreEqual(10, child.TargetValue); Assert.AreEqual(2, converter.ConversionCount); Assert.AreEqual(null, converter.LastValue); SUT.DataContext = new SourceLevel0() { Item = new SourceLevel1() { List = new SourceLevel2[] { new SourceLevel2() } } }; Assert.AreEqual(-1000, child.TargetValue); Assert.AreEqual(3, converter.ConversionCount); Assert.AreEqual(true, converter.LastValue); SUT.DataContext = null; Assert.AreEqual(10, child.TargetValue); Assert.AreEqual(4, converter.ConversionCount); Assert.AreEqual(null, converter.LastValue); SUT.DataContext = new SourceLevel0() { Item = new SourceLevel1() { List = new SourceLevel2[] { new SourceLevel2() } } }; Assert.AreEqual(-1000, child.TargetValue); Assert.AreEqual(5, converter.ConversionCount); Assert.AreEqual(true, converter.LastValue); }
public void getAllEquivalentReplacements(Node original, List <Node> result) { //TODO predelat. mozna pomoci visitoru? //result.Clear(); switch (original.functionType.signature) { case FunctionTypeEnum._00_10: for (int i = constantsLowerLimit; i <= constantsUpperLimit; i++) { result.Add(new NumericConstant(i)); } for (int i = 0; i < problemSchema.inputsType.Length; i++) { if (problemSchema.inputsType[i] == DataType.numerical) { result.Add(new NumericInput(i)); } } break; case FunctionTypeEnum._00_01: result.Add(new BoolConstant(true)); result.Add(new BoolConstant(false)); for (int i = 0; i < problemSchema.inputsType.Length; i++) { if (problemSchema.inputsType[i] == DataType.logic) { result.Add(new BoolInput(i)); } } break; case FunctionTypeEnum._10_10: NumericUnaryOperator originalNode = (NumericUnaryOperator)original; NumericUnaryOperator newNode; foreach (var item in categories[original.functionType.signature]) { newNode = (NumericUnaryOperator)NodeFactory.createNode(item.Key); newNode.experssion = (NumericNode)originalNode.experssion.Clone(); result.Add(newNode); } break; case FunctionTypeEnum._20_10: NumericBinaryOperator originalNode1 = (NumericBinaryOperator)original; NumericBinaryOperator newNode1; foreach (var item in categories[original.functionType.signature]) { newNode1 = (NumericBinaryOperator)NodeFactory.createNode(item.Key); newNode1.first = (NumericNode)originalNode1.first.Clone(); newNode1.second = (NumericNode)originalNode1.second.Clone(); result.Add(newNode1); } break; case FunctionTypeEnum._20_01: BoolRelationOperator originalNode2 = (BoolRelationOperator)original; BoolRelationOperator newNode2; foreach (var item in categories[original.functionType.signature]) { newNode2 = (BoolRelationOperator)NodeFactory.createNode(item.Key); newNode2.first = (NumericNode)originalNode2.first.Clone(); newNode2.second = (NumericNode)originalNode2.second.Clone(); result.Add(newNode2); } break; case FunctionTypeEnum._02_01: BoolLogicBinaryOperator originalNode3 = (BoolLogicBinaryOperator)original; BoolLogicBinaryOperator newNode3; foreach (var item in categories[original.functionType.signature]) { newNode3 = (BoolLogicBinaryOperator)NodeFactory.createNode(item.Key); newNode3.first = (BoolNode)originalNode3.first.Clone(); newNode3.second = (BoolNode)originalNode3.second.Clone(); result.Add(newNode3); } break; case FunctionTypeEnum._01_01: BoolUnaryLogicOperator originalNode4 = (BoolUnaryLogicOperator)original; BoolUnaryLogicOperator newNode4; foreach (var item in categories[original.functionType.signature]) { newNode4 = (BoolUnaryLogicOperator)NodeFactory.createNode(item.Key); newNode4.exp = (BoolNode)originalNode4.exp.Clone(); result.Add(newNode4); } break; case FunctionTypeEnum._01_10: BoolToNumber originalNode5 = (BoolToNumber)original; BoolToNumber newNode5 = (BoolToNumber)NodeFactory.createNode(original.type); newNode5.expression = (BoolNode)originalNode5.expression.Clone(); result.Add(newNode5); break; default: break; } }