private static void TwoWayAssertions(MvxFullBinding binding, MockTargetBinding mockTarget, MockSourceBinding mockSource) { Assert.Equal(1, mockTarget.SubscribeToEventsCalled); Assert.Single(mockTarget.Values); Assert.Equal("TryGetValueValue", mockTarget.Values[0]); mockSource.TryGetValueValue = "SecondValue"; mockSource.FireSourceChanged(); Assert.Equal(2, mockTarget.Values.Count); Assert.Equal("SecondValue", mockTarget.Values[1]); mockSource.TryGetValueValue = "ThirdValue"; mockSource.FireSourceChanged(); Assert.Equal(3, mockTarget.Values.Count); Assert.Equal("ThirdValue", mockTarget.Values[2]); Assert.Empty(mockSource.ValuesSet); mockTarget.FireValueChanged(new MvxTargetChangedEventArgs("FromTarget1")); Assert.Single(mockSource.ValuesSet); Assert.Equal("FromTarget1", mockSource.ValuesSet[0]); mockTarget.FireValueChanged(new MvxTargetChangedEventArgs("FromTarget2")); Assert.Equal(2, mockSource.ValuesSet.Count); Assert.Equal("FromTarget2", mockSource.ValuesSet[1]); Assert.Equal(0, mockSource.DisposeCalled); Assert.Equal(0, mockTarget.DisposeCalled); binding.DataContext = new { ignored = 12 }; Assert.Equal(1, mockSource.DisposeCalled); Assert.Equal(0, mockTarget.DisposeCalled); Assert.Equal(4, mockTarget.Values.Count); Assert.Equal("ThirdValue", mockTarget.Values[3]); binding.DataContext = new { ignored = 13 }; Assert.Equal(2, mockSource.DisposeCalled); Assert.Equal(0, mockTarget.DisposeCalled); Assert.Equal(5, mockTarget.Values.Count); Assert.Equal("ThirdValue", mockTarget.Values[4]); mockSource.TryGetValueValue = "NewValue"; mockSource.FireSourceChanged(); Assert.Equal(6, mockTarget.Values.Count); Assert.Equal("NewValue", mockTarget.Values[5]); mockTarget.FireValueChanged(new MvxTargetChangedEventArgs("FromTarget1")); Assert.Equal(3, mockSource.ValuesSet.Count); Assert.Equal("FromTarget1", mockSource.ValuesSet[2]); mockTarget.FireValueChanged(new MvxTargetChangedEventArgs("FromTarget2")); Assert.Equal(4, mockSource.ValuesSet.Count); Assert.Equal("FromTarget2", mockSource.ValuesSet[3]); binding.Dispose(); Assert.Equal(3, mockSource.DisposeCalled); Assert.Equal(1, mockTarget.DisposeCalled); }
// TODO: need to test other things like: // - event subscription (hard to do through Moq) // - use of valueConverter // - one time subscription // - fallback values // - setup again on DataContext change // - dispose mechanism private void TestCommon(MvxBindingMode bindingMode, bool expectSourceBinding, bool expectTargetBinding) { ClearAll(); var mockSourceBindingFactory = new Mock <IMvxSourceBindingFactory>(); Ioc.RegisterSingleton(mockSourceBindingFactory.Object); var mockTargetBindingFactory = new Mock <IMvxTargetBindingFactory>(); Ioc.RegisterSingleton(mockTargetBindingFactory.Object); var sourceText = "sourceText"; var targetName = "targetName"; var source = new { Value = 1 }; var target = new { Value = 2 }; var converterParameter = new { Value = 3 }; var fallbackValue = new { Value = 4 }; var converter = new Mock <IMvxValueConverter>(); var bindingDescription = new MvxBindingDescription { Converter = converter.Object, ConverterParameter = converterParameter, FallbackValue = fallbackValue, Mode = bindingMode, SourcePropertyPath = sourceText, TargetName = targetName }; var mockSourceBinding = new Mock <IMvxSourceBinding>(); var mockTargetBinding = new Mock <IMvxTargetBinding>(); mockSourceBindingFactory .Setup(x => x.CreateBinding(It.Is <object>(s => s == source), It.Is <string>(s => s == sourceText))) .Returns((object a, string b) => mockSourceBinding.Object); mockTargetBindingFactory .Setup(x => x.CreateBinding(It.Is <object>(s => s == target), It.Is <string>(s => s == targetName))) .Returns((object a, string b) => mockTargetBinding.Object); var request = new MvxBindingRequest(source, target, bindingDescription); var toTest = new MvxFullBinding(request); //var sourceBindingTimes = expectSourceBinding ? Times.Once() : Times.Never(); //mockSourceBinding.Verify(x => x.Changed += It.IsAny<EventHandler<MvxSourcePropertyBindingEventArgs>>(), sourceBindingTimes); mockSourceBindingFactory .Verify(x => x.CreateBinding(It.Is <object>(s => s == source), It.Is <string>(s => s == sourceText)), Times.Once()); //var targetBindingTimes = expectSourceBinding ? Times.Once() : Times.Never(); //mockTargetBinding.Verify(x => x.ValueChanged += It.IsAny<EventHandler<MvxTargetChangedEventArgs>>(), targetBindingTimes); mockTargetBindingFactory .Verify(x => x.CreateBinding(It.Is <object>(s => s == target), It.Is <string>(s => s == targetName)), Times.Once()); }
private MvxFullBinding TestSetupCommon(IMvxValueConverter valueConverter, object converterParameter, object fallbackValue, Type targetType, out MockSourceBinding mockSource, out MockTargetBinding mockTarget) { ClearAll(); MvxBindingSingletonCache.Initialize(); var mockSourceBindingFactory = new Mock <IMvxSourceBindingFactory>(); Ioc.RegisterSingleton(mockSourceBindingFactory.Object); var mockTargetBindingFactory = new Mock <IMvxTargetBindingFactory>(); Ioc.RegisterSingleton(mockTargetBindingFactory.Object); var realSourceStepFactory = new MvxSourceStepFactory(); realSourceStepFactory.AddOrOverwrite(typeof(MvxPathSourceStepDescription), new MvxPathSourceStepFactory()); Ioc.RegisterSingleton <IMvxSourceStepFactory>(realSourceStepFactory); var sourceText = "sourceText"; var targetName = "targetName"; var source = new { Value = 1 }; var target = new { Value = 2 }; var bindingDescription = new MvxBindingDescription { Source = new MvxPathSourceStepDescription() { Converter = valueConverter, ConverterParameter = converterParameter, FallbackValue = fallbackValue, SourcePropertyPath = sourceText, }, Mode = MvxBindingMode.TwoWay, TargetName = targetName }; mockSource = new MockSourceBinding(); mockTarget = new MockTargetBinding() { TargetType = targetType }; mockTarget.DefaultMode = MvxBindingMode.TwoWay; var localSource = mockSource; mockSourceBindingFactory .Setup(x => x.CreateBinding(It.IsAny <object>(), It.Is <string>(s => s == sourceText))) .Returns((object a, string b) => localSource); var localTarget = mockTarget; mockTargetBindingFactory .Setup(x => x.CreateBinding(It.IsAny <object>(), It.Is <string>(s => s == targetName))) .Returns((object a, string b) => localTarget); mockSource.TryGetValueResult = true; mockSource.TryGetValueValue = "TryGetValueValue"; var request = new MvxBindingRequest(source, target, bindingDescription); var toTest = new MvxFullBinding(request); return(toTest); }
private MvxFullBinding TestSetupCommon(MvxBindingMode mvxBindingMode, MvxBindingMode defaultMode, out MockSourceBinding mockSource, out MockTargetBinding mockTarget) { _fixture.ClearAll(); _fixture.Ioc.RegisterSingleton <IMvxMainThreadDispatcher>(new InlineMockMainThreadDispatcher()); var mockSourceBindingFactory = new Mock <IMvxSourceBindingFactory>(); _fixture.Ioc.RegisterSingleton(mockSourceBindingFactory.Object); var mockTargetBindingFactory = new Mock <IMvxTargetBindingFactory>(); _fixture.Ioc.RegisterSingleton(mockTargetBindingFactory.Object); var realSourceStepFactory = new MvxSourceStepFactory(); realSourceStepFactory.AddOrOverwrite(typeof(MvxPathSourceStepDescription), new MvxPathSourceStepFactory()); _fixture.Ioc.RegisterSingleton <IMvxSourceStepFactory>(realSourceStepFactory); var sourceText = "sourceText"; var targetName = "targetName"; var source = new { Value = 1 }; var target = new { Value = 2 }; var converterParameter = new { Value = 3 }; var fallbackValue = new { Value = 4 }; var bindingDescription = new MvxBindingDescription { Source = new MvxPathSourceStepDescription { Converter = null, ConverterParameter = converterParameter, FallbackValue = fallbackValue, SourcePropertyPath = sourceText, }, Mode = mvxBindingMode, TargetName = targetName }; mockSource = new MockSourceBinding(); mockTarget = new MockTargetBinding { DefaultMode = defaultMode }; var localSource = mockSource; mockSourceBindingFactory .Setup(x => x.CreateBinding(It.IsAny <object>(), It.Is <string>(s => s == sourceText))) .Returns((object a, string b) => localSource); var localTarget = mockTarget; mockTargetBindingFactory .Setup(x => x.CreateBinding(It.IsAny <object>(), It.Is <string>(s => s == targetName))) .Returns((object a, string b) => localTarget); mockSource.TryGetValueResult = true; mockSource.TryGetValueValue = "TryGetValueValue"; var request = new MvxBindingRequest(source, target, bindingDescription); var toTest = new MvxFullBinding(request); return(toTest); }