public void ParserShouldParseSingleExpression2() { const string targetPath = "Text"; const string sourcePath = "SourceText"; const string binding = "Text $context.SourceText"; var target = new object(); IBindingParser bindingParser = CreateBindingParser(); var context = new BindingBuilder(bindingParser.Parse(binding, EmptyContext, target, null).Single()); IBindingPath path = context.GetData(BindingBuilderConstants.TargetPath); path.Path.ShouldEqual(targetPath); var sources = context.GetData(BindingBuilderConstants.Sources); IBindingSource source = sources.Single().Invoke(context); BindingSourceShouldBeValid(source, AttachedMemberConstants.DataContext + "." + sourcePath, target); }
public void ParserShouldParseSingleExpression1() { const string targetPath = "Text"; const string sourcePath = "SourceText"; const string binding = "Text SourceText"; var target = new object(); IBindingParser bindingParser = CreateBindingParser(); var context = new BindingBuilder(bindingParser.Parse(target, binding, null, null).Single()); IBindingPath path = context.GetData(BindingBuilderConstants.TargetPath); path.Path.ShouldEqual(targetPath); var sources = context.GetData(BindingBuilderConstants.Sources); IObserver source = sources.Single().Invoke(context); BindingSourceShouldBeValidDataContext(target, source, sourcePath); }
public void ParserShouldUseTargetBindingContextForSource() { const string targetPath = "Text"; const string sourcePath = "IntProperty"; const string binding = "Text IntProperty"; var target = new object(); IBindingParser bindingParser = CreateBindingParser(); var context = new BindingBuilder(bindingParser.Parse(binding, EmptyContext, target, null).Single()); IBindingPath path = context.GetData(BindingBuilderConstants.TargetPath); path.Path.ShouldEqual(targetPath); var sources = context.GetData(BindingBuilderConstants.Sources); IBindingSource source = sources.Single().Invoke(context); BindingSourceShouldBeValidDataContext(target, source, sourcePath); var sourceObj = new BindingSourceModel(); BindingServiceProvider.ContextManager.GetBindingContext(target).Value = sourceObj; BindingSourceShouldBeValidDataContext(target, source, sourcePath); }
public void BuilderShouldUseTargetBindingContextForSource3() { const string sourcePath = "IntProperty"; var targetObj = new BindingSourceEventNotifierModel(); var builder = new BindingBuilder(); builder.Bind(targetObj, () => model => model.ObjectProperty).To(sourcePath); IList<Func<IDataContext, IBindingSource>> sources = builder.GetData(BindingBuilderConstants.Sources); IBindingSource source = sources.Single().Invoke(builder); BindingParserTest.BindingSourceShouldBeValidDataContext(targetObj, source, sourcePath); var sourceObj = new BindingSourceModel(); BindingServiceProvider.ContextManager.GetBindingContext(targetObj).Value = sourceObj; BindingParserTest.BindingSourceShouldBeValidDataContext(targetObj, source, sourcePath); }
public void BuilderShouldUseTargetBindingContextForSource2() { const string targetPath = "Text"; const string sourcePath = "IntProperty"; var targetObj = new object(); var builder = new BindingBuilder(); builder.Bind(targetObj, targetPath).To<BindingSourceModel>(() => (model, ctx) => model.IntProperty); IList<Func<IDataContext, IObserver>> sources = builder.GetData(BindingBuilderConstants.Sources); IObserver source = sources.Single().Invoke(builder); BindingParserTest.BindingSourceShouldBeValidDataContext(targetObj, source, sourcePath); var sourceObj = new BindingSourceModel(); BindingServiceProvider.ContextManager.GetBindingContext(targetObj).Value = sourceObj; BindingParserTest.BindingSourceShouldBeValidDataContext(targetObj, source, sourcePath); }
public void BuilderShouldUseSourceObject1() { const string targetPath = "Text"; const string sourcePath = "IntProperty"; var targetObj = new object(); var sourceObj = new BindingSourceModel(); var builder = new BindingBuilder(); builder.Bind(targetObj, targetPath).To(sourceObj, sourcePath); IList<Func<IDataContext, IBindingSource>> sources = builder.GetData(BindingBuilderConstants.Sources); IBindingSource source = sources.Single().Invoke(builder); BindingParserTest.BindingSourceShouldBeValid(source, sourcePath, sourceObj); }
public void BuilderShouldUseBindingContextExtension4() { const string targetPath = "Text"; const string sourcePath = "IntProperty"; var targetObj = new object(); var builder = new BindingBuilder(); builder.Bind(targetObj, targetPath).To<BindingSourceModel>(() => model => BindingSyntaxEx.Self<object>().DataContext<BindingSourceModel>().IntProperty); IList<Func<IDataContext, IBindingSource>> sources = builder.GetData(BindingBuilderConstants.Sources); IBindingSource source = sources.Single().Invoke(builder); source.Path.Path.ShouldEqual(AttachedMemberConstants.DataContext + "." + sourcePath); }
public void BuilderShouldUseResourceMethod2() { const string key = "key"; var builder = new BindingBuilder(); var sourceModel = new BindingSourceModel(); var result = new BindingSourceModel { ObjectProperty = "Test" }; BindingServiceProvider.ResourceResolver.AddMethod<string, object, BindingSourceModel>(key, (s1, s2, context) => { s1.ShouldEqual(key); s2.ShouldEqual(builder); context.ShouldEqual(builder); return result; }); builder.Bind(sourceModel, "empty").To<BindingSourceModel>(() => model => BindingSyntaxEx.ResourceMethod<BindingSourceModel>(key, key, builder).ObjectProperty); var sources = builder.GetData(BindingBuilderConstants.Sources); sources.Count.ShouldEqual(1); sources[0].Invoke(builder).Path.Path.ShouldEqual(string.Empty); var expression = builder.GetData(BindingBuilderConstants.MultiExpression); expression(builder, Empty.Array<object>()).ShouldEqual(result.ObjectProperty); }
public void BuilderShouldUseGetErrorsMethod3() { var builder = new BindingBuilder(); var sourceModel = new BindingSourceModel(); builder.Bind(sourceModel, "empty").To(sourceModel, () => model => BindingSyntaxEx.GetErrors("1", "2", model.ObjectProperty)); var source = builder.GetData(BindingBuilderConstants.Sources).Single().Invoke(builder); source.Path.Path.ShouldEqual(GetMemberPath(sourceModel, model => model.ObjectProperty)); source.GetSource(true).ShouldEqual(sourceModel); var behavior = builder.GetOrAddBehaviors().OfType<NotifyDataErrorsAggregatorBehavior>().Single(); behavior.ErrorPaths.SequenceEqual(new[] { "1", "2" }).ShouldBeTrue(); builder.AddOrUpdate(BindingConstants.Binding, new DataBindingMock { Behaviors = new[] { behavior } }); var expression = builder.GetData(BindingBuilderConstants.MultiExpression); behavior.Errors = new List<object> { "test" }; expression(builder, new object[] { sourceModel }).ShouldEqual(behavior.Errors); }
public void BuilderShouldUseSelfExpression1() { var builder = new BindingBuilder(); var sourceModel = new BindingSourceModel(); builder.Bind(sourceModel, "empty").To<BindingSourceModel>(() => model => BindingSyntaxEx.Self<BindingSourceModel>()); var source = builder.GetData(BindingBuilderConstants.Sources).Single().Invoke(builder); builder.GetData(BindingBuilderConstants.MultiExpression).ShouldBeNull(); source.Path.IsEmpty.ShouldBeTrue(); source.GetSource(true).ShouldEqual(sourceModel); var pathMembers = source.GetPathMembers(true); pathMembers.LastMember.GetValue(pathMembers.PenultimateValue, null).ShouldEqual(sourceModel); }
public void BuilderShouldUseConverterCulture3() { var builder = new BindingBuilder(); builder.Bind(CultureInfo.InvariantCulture, "test").To("test").WithConverterCulture(() => o => BindingSyntaxEx.Self<CultureInfo>()); builder.GetData(BindingBuilderConstants.ConverterCulture).Invoke(builder).ShouldEqual(CultureInfo.InvariantCulture); }
public void BuilderShouldUseConverterCulture2() { Func<IDataContext, CultureInfo> culture = context => null; var builder = new BindingBuilder(); builder.Bind(new object(), "test").To("test").WithConverterCulture(culture); builder.GetData(BindingBuilderConstants.ConverterCulture).ShouldEqual(culture); }
public void BuilderShouldUseConverterCulture1() { var culture = CultureInfo.InvariantCulture; var builder = new BindingBuilder(); builder.Bind(new object(), "test").To("test").WithConverterCulture(culture); builder.GetData(BindingBuilderConstants.ConverterCulture).Invoke(builder).ShouldEqual(culture); }
public void BuilderShouldUseDelayBehaviorTarget() { var builder = new BindingBuilder(); builder.Bind(new object(), "test").To("test").WithDelay(10, true); var behavior = builder.GetData(BindingBuilderConstants.Behaviors).OfType<DelayBindingBehavior>().Single(); behavior.Delay.ShouldEqual(10); behavior.IsTarget.ShouldBeTrue(); }
public void BuilderShouldUseFallback3() { var builder = new BindingBuilder(); builder.Bind(builder, "test").To("test").WithFallback(() => o => BindingSyntaxEx.Self<object>()); builder.GetData(BindingBuilderConstants.Fallback).Invoke(builder).ShouldEqual(builder); }
public void BuilderShouldUseEventArgs2() { var builder = new BindingBuilder(); builder.Bind(new object(), "empty").To<BindingSourceModel>(() => model => BindingSyntaxEx.EventArgs<EventArgs>().GetType().Name); builder.Add(BindingConstants.CurrentEventArgs, EventArgs.Empty); var expression = builder.GetData(BindingBuilderConstants.MultiExpression); expression(builder, Empty.Array<object>()).ShouldEqual(EventArgs.Empty.GetType().Name); }
public void BuilderShouldUseEventArgs3() { var builder = new BindingBuilder(); builder.Bind(new object(), "empty").To<BindingSourceModel>(() => model => BindingSyntaxEx.EventArgs<BindingSourceModel>().ObjectProperty); var sourceModel = new BindingSourceModel { ObjectProperty = "test" }; builder.Add(BindingConstants.CurrentEventArgs, sourceModel); var expression = builder.GetData(BindingBuilderConstants.MultiExpression); expression(builder, Empty.Array<object>()).ShouldEqual(sourceModel.ObjectProperty); }
public void BuilderShouldUseConverterParameter1() { var parameter = new object(); var builder = new BindingBuilder(); builder.Bind(new object(), "test").To("test").WithConverterParameter(parameter); builder.GetData(BindingBuilderConstants.ConverterParameter).Invoke(builder).ShouldEqual(parameter); }
public void BuilderShouldUseResource2() { const string key = "key"; var builder = new BindingBuilder(); var sourceModel = new BindingSourceModel { ObjectProperty = "test" }; BindingServiceProvider.ResourceResolver.AddObject(key, sourceModel); builder.Bind(sourceModel, "empty").To<BindingSourceModel>(() => model => BindingSyntaxEx.Self<BindingSourceModel>().ObjectProperty); var source = builder.GetData(BindingBuilderConstants.Sources).Single().Invoke(builder); builder.GetData(BindingBuilderConstants.MultiExpression).ShouldBeNull(); source.Path.Path.ShouldEqual(GetMemberPath(sourceModel, model => model.ObjectProperty)); source.GetSource(true).ShouldEqual(sourceModel); var pathMembers = source.GetPathMembers(true); pathMembers.LastMember.GetValue(pathMembers.PenultimateValue, null).ShouldEqual(sourceModel.ObjectProperty); }
public void BuilderShouldUseConverterParameter2() { Func<IDataContext, object> parameter = context => null; var builder = new BindingBuilder(); builder.Bind(new object(), "test").To("test").WithConverterParameter(parameter); builder.GetData(BindingBuilderConstants.ConverterParameter).ShouldEqual(parameter); }
public void BuilderShouldUseGetErrorsMethod4() { var builder = new BindingBuilder(); var sourceModel = new BindingSourceModel(); builder.Bind(sourceModel, "empty").To(sourceModel, () => model => BindingSyntaxEx.GetErrors("1", "2").Concat(BindingSyntaxEx.GetErrors(model.ObjectProperty))); var sources = builder.GetData(BindingBuilderConstants.Sources).Select(func => func(builder)).ToArray(); sources[0].GetSource(true).ShouldEqual(sourceModel); sources[1].GetSource(true).ShouldEqual(sourceModel); if (sources[0].Path.IsEmpty) sources[1].Path.Path.ShouldEqual(GetMemberPath(sourceModel, model => model.ObjectProperty)); else sources[0].Path.Path.ShouldEqual(GetMemberPath(sourceModel, model => model.ObjectProperty)); var behaviors = builder.GetOrAddBehaviors().OfType<NotifyDataErrorsAggregatorBehavior>().ToArray(); builder.AddOrUpdate(BindingConstants.Binding, new DataBindingMock { Behaviors = behaviors }); var behavior = behaviors.Single(b => !b.ErrorPaths.IsNullOrEmpty()); behavior.ErrorPaths.SequenceEqual(new[] { "1", "2" }).ShouldBeTrue(); behaviors.ForEach(aggregatorBehavior => aggregatorBehavior.Errors = new[] { "1" }); var expression = builder.GetData(BindingBuilderConstants.MultiExpression); var errors = (IEnumerable<object>)expression(builder, new object[] { sourceModel, sourceModel }); errors.SequenceEqual(behaviors[0].Errors.Concat(behaviors[1].Errors)).ShouldBeTrue(); }
public void BuilderShouldUseConverterParameter3() { var builder = new BindingBuilder(); builder.Bind(builder, "test").To("test").WithConverterParameter(() => o => BindingSyntaxEx.Self<object>()); builder.GetData(BindingBuilderConstants.ConverterParameter).Invoke(builder).ShouldEqual(builder); }
public void BuilderShouldUseElementSource2() { const string name = "name"; var builder = new BindingBuilder(); var targetObj = new BindingSourceModel { ObjectProperty = "test" }; var relativeObj = new BindingSourceModel(); bool isInvoked = false; IEventListener eventListener = null; var memberMock = new BindingMemberInfoMock { TryObserveMember = (o, listener) => { eventListener = listener; return null; } }; var treeManagerMock = new VisualTreeManagerMock { FindByName = (o, s) => { o.ShouldEqual(targetObj); s.ShouldEqual(name); isInvoked = true; return relativeObj; }, GetRootMember = type => memberMock }; BindingServiceProvider.VisualTreeManager = treeManagerMock; builder.Bind(targetObj, "empty").To<BindingSourceModel>(() => model => BindingSyntaxEx.Element<BindingSourceModel>(name).ObjectProperty); var source = builder.GetData(BindingBuilderConstants.Sources).Single().Invoke(builder); builder.GetData(BindingBuilderConstants.MultiExpression).ShouldBeNull(); source.Path.Path.ShouldEqual(GetMemberPath(targetObj, model => model.ObjectProperty)); source.GetSource(true).ShouldEqual(relativeObj); var pathMembers = source.GetPathMembers(true); pathMembers.LastMember.GetValue(pathMembers.PenultimateValue, null).ShouldEqual(relativeObj.ObjectProperty); isInvoked.ShouldBeTrue(); isInvoked = false; eventListener.ShouldNotBeNull(); eventListener.Handle(this, EventArgs.Empty); isInvoked.ShouldBeTrue(); }
public void BuilderShouldUseTargetNullValue() { var nullValue = new object(); var builder = new BindingBuilder(); builder.Bind(new object(), "test").To("test").WithTargetNullValue(nullValue); builder.GetData(BindingBuilderConstants.TargetNullValue).ShouldEqual(nullValue); }
public void BuilderShouldUseBindingContextExtension1() { const string targetPath = "Text"; var targetObj = new object(); var builder = new BindingBuilder(); builder.Bind(targetObj, targetPath).To<BindingSourceModel>(() => model => BindingSyntaxEx.DataContext<BindingSourceModel>()); IList<Func<IDataContext, IBindingSource>> sources = builder.GetData(BindingBuilderConstants.Sources); IBindingSource source = sources.Single().Invoke(builder); BindingParserTest.BindingSourceShouldBeValidDataContext(targetObj, source, string.Empty); var sourceObj = new BindingSourceModel(); BindingServiceProvider.ContextManager.GetBindingContext(targetObj).Value = sourceObj; BindingParserTest.BindingSourceShouldBeValidDataContext(targetObj, source, string.Empty); }
public void BuilderShouldUseLambdaExpression1() { var builder = new BindingBuilder(); builder.Bind(new object(), "empty") .To<BindingSourceModel>(() => model => model.IntProperty + 100 + model.NestedModel.IntProperty + int.Parse(model.NestedModel["1"])); var expression = builder.GetData(BindingBuilderConstants.MultiExpression); expression.Invoke(builder, new object[] { 10, 10, "10" }).ShouldEqual(130); expression.Invoke(builder, new object[] { -10, 10, "-100" }).ShouldEqual(0); var list = builder.GetData(BindingBuilderConstants.Sources); list.Count.ShouldEqual(3); list[0].Invoke(builder).Path.Path.ShouldEqual(GetMemberPath<BindingSourceModel>(model => model.IntProperty)); list[1].Invoke(builder).Path.Path.ShouldEqual(GetMemberPath<BindingSourceModel>(model => model.NestedModel.IntProperty)); list[2].Invoke(builder).Path.Path.ShouldEqual(GetMemberPath<BindingSourceModel>(model => model.NestedModel["1"])); }
public void BuilderShouldUseDynamicMember3() { const string targetPath = "Text"; var targetObj = new object(); var builder = new BindingBuilder(); var src = new BindingSourceModel { ObjectProperty = new BindingSourceModel { StringProperty = "test" } }; builder.Bind(targetObj, targetPath).To<BindingSourceModel>(() => model => model.GetObjectProperty().Member<string>("StringProperty").Member<int>("Length")); IList<Func<IDataContext, IBindingSource>> sources = builder.GetData(BindingBuilderConstants.Sources); IBindingSource source = sources.Single().Invoke(builder); BindingParserTest.BindingSourceShouldBeValidDataContext(targetObj, source, string.Empty); var sourceObj = new BindingSourceModel(); BindingServiceProvider.ContextManager.GetBindingContext(targetObj).Value = sourceObj; BindingParserTest.BindingSourceShouldBeValidDataContext(targetObj, source, string.Empty); var data = builder.GetData(BindingBuilderConstants.MultiExpression); data.Invoke(builder, new[] { src }).ShouldEqual(((BindingSourceModel)src.GetObjectProperty()).StringProperty.Length); }
public void BuilderShouldUseLambdaExpression2() { var builder = new BindingBuilder(); builder.Bind(new object(), "empty") .To<BindingSourceModel>(() => model => model.StringProperty.OfType<char>().Count(c => c == '1') + ((BindingSourceModel)model.ObjectProperty).IntProperty); var expression = builder.GetData(BindingBuilderConstants.MultiExpression); expression.Invoke(builder, new object[] { "1", 10 }).ShouldEqual(11); expression.Invoke(builder, new object[] { "", 0 }).ShouldEqual(0); var list = builder.GetData(BindingBuilderConstants.Sources); list.Count.ShouldEqual(2); list[0].Invoke(builder).Path.Path.ShouldEqual(GetMemberPath<BindingSourceModel>(model => model.StringProperty)); list[1].Invoke(builder).Path.Path.ShouldEqual(GetMemberPath<BindingSourceModel>(model => ((BindingSourceModel)model.ObjectProperty).IntProperty)); }
public void BuilderShouldUseDynamicMember5() { const string targetPath = "Text"; var targetObj = new object(); var builder = new BindingBuilder(); var src = new BindingSourceModel { ObjectProperty = "test" }; builder.Bind(targetObj, targetPath).To(src, () => model => model.Member<string>("ObjectProperty").Member<int>("Length") + 0); IList<Func<IDataContext, IBindingSource>> sources = builder.GetData(BindingBuilderConstants.Sources); IBindingSource source = sources.Single().Invoke(builder); source.Path.Path.ShouldEqual("ObjectProperty.Length"); source.GetSource(true).ShouldEqual(src); var data = builder.GetData(BindingBuilderConstants.MultiExpression); data.Invoke(builder, new object[] { ((string)src.ObjectProperty).Length }).ShouldEqual(((string)src.ObjectProperty).Length); }
public void BuilderShouldUseLambdaExpression3() { var builder = new BindingBuilder(); builder.Bind(new object(), "empty") .To<BindingSourceModel>(() => model => model.StringProperty.OfType<char>().Select(s => s == null ? 10 + 4 : 3 + 10).FirstOrDefault() == 0 ? false : true || true); var expression = builder.GetData(BindingBuilderConstants.MultiExpression); expression.Invoke(builder, new object[] { "1" }).ShouldEqual("1".OfType<char>().Select(s => s == null ? 10 + 4 : 3 + 10).FirstOrDefault() == 0 ? false : true || true); expression.Invoke(builder, new object[] { "2" }).ShouldEqual("2".OfType<char>().Select(s => s == null ? 10 + 4 : 3 + 10).FirstOrDefault() == 0 ? false : true || true); var list = builder.GetData(BindingBuilderConstants.Sources); list.Count.ShouldEqual(1); list[0].Invoke(builder).Path.Path.ShouldEqual(GetMemberPath<BindingSourceModel>(model => model.StringProperty)); }