public void IsRegisteredShouldReturnTrueIfBindingIsRegistered()
        {
            const string path = "test";
            var target = new object();
            var bindingMock = new DataBindingMock();
            var manager = GetBindingManager();

            manager.Register(target, path, bindingMock);
            manager.IsRegistered(bindingMock).ShouldBeTrue();
        }
        public void ManagerShouldRegisterBinding()
        {
            const string path = "test";
            var target = new object();
            var bindingMock = new DataBindingMock();
            var manager = GetBindingManager();

            manager.Register(target, path, bindingMock);
            manager.IsRegistered(bindingMock).ShouldBeTrue();
            manager.GetBindings(target, path).Single().ShouldEqual(bindingMock);
            manager.GetBindings(target).Single().ShouldEqual(bindingMock);
        }
        public void ManagerShouldReturnAllBindingsForTarget()
        {
            const string path = "test";
            var target = new object();
            var bindingMock1 = new DataBindingMock();
            var bindingMock2 = new DataBindingMock();

            var manager = GetBindingManager();
            manager.Register(target, path, bindingMock1);
            manager.GetBindings(target).Single().ShouldEqual(bindingMock1);

            manager.Register(target, path + 1, bindingMock2);
            var bindings = manager.GetBindings(target).ToList();
            bindings.Contains(bindingMock1).ShouldBeTrue();
            bindings.Contains(bindingMock2).ShouldBeTrue();
            bindings.Count.ShouldEqual(2);
        }
        public void ManagerShouldClearAllBindingsForTarget()
        {
            const string path1 = "test";
            const string path2 = "test2";
            var target = new object();
            var bindingFirst = new DataBindingMock();
            var bindingSecond = new DataBindingMock();
            var manager = GetBindingManager();

            manager.Register(target, path1, bindingFirst);
            manager.Register(target, path2, bindingSecond);

            manager.IsRegistered(bindingFirst).ShouldBeTrue();
            manager.IsRegistered(bindingSecond).ShouldBeTrue();

            manager.ClearBindings(target);

            manager.IsRegistered(bindingFirst).ShouldBeFalse();
            manager.IsRegistered(bindingSecond).ShouldBeFalse();
            manager.GetBindings(target).ShouldBeEmpty();
        }
        public void ManagerShouldReturnAllBindingsForTargetAndPath()
        {
            const string path = "test";
            var target = new object();
            var bindingMock1 = new DataBindingMock();

            var manager = GetBindingManager();
            manager.Register(target, path, bindingMock1);
            manager.GetBindings(target, path).Single().ShouldEqual(bindingMock1);
        }
 public void IsRegisteredShouldReturnFalseIfBindingIsNotRegistered()
 {
     var bindingMock = new DataBindingMock();
     var manager = GetBindingManager();
     manager.IsRegistered(bindingMock).ShouldBeFalse();
 }
        public void ManagerShouldClearBindingIfBindingIsRegistered()
        {
            const string path = "test";
            var target = new object();
            var bindingMock = new DataBindingMock
            {
                TargetAccessor = new BindingSourceAccessorMock
                {
                    Source = new BindingSourceMock
                    {
                        Path = BindingPath.Create(path),
                        GetSource = b => target
                    }
                }
            };
            var manager = GetBindingManager();

            manager.Register(target, path, bindingMock);
            manager.IsRegistered(bindingMock).ShouldBeTrue();

            manager.Unregister(bindingMock);
            manager.IsRegistered(bindingMock).ShouldBeFalse();
            bindingMock.IsDisposed.ShouldBeTrue();
        }
        public void ParserShouldParseMultiExpressionWithConverter()
        {
            const string targetPath = "Text";
            const string sourcePath1 = "SourceText1";
            const string sourcePath2 = "SourceText2";
            const string converterName = "TestConverter";
            const string binding = "Text $TestConverter(SourceText1, SourceText2)";
            var target = new object();
            var args = new object[] { "tset", 1 };
            var sourceModel = new BindingSourceModel { IntProperty = int.MaxValue };
            var bindingMock = new DataBindingMock
            {
                TargetAccessor = new BindingSourceAccessorMock
                {
                    Source = new BindingSourceMock
                    {
                        GetPathMembers = b => new BindingPathMembersMock(this, BindingPath.Create("IntProperty"), new BindingMemberInfo("IntProperty", BindingSourceModel.IntPropertyInfo, typeof(BindingSourceModel)))
                    }
                }
            };

            var converterMock = new ValueConverterCoreMock
            {
                Convert = (o, type, arg3, arg4) =>
                {
                    type.ShouldEqual(BindingSourceModel.IntPropertyInfo.PropertyType);
                    o.ShouldEqual(args[0]);
                    arg3.ShouldEqual(args[1]);
                    return sourceModel;
                }
            };
            var provider = new BindingProvider();
            var resolver = new BindingResourceResolver();
            BindingServiceProvider.ResourceResolver = resolver;
            resolver.AddConverter(converterName, converterMock, true);
            IBindingParser bindingParser = CreateBindingParser(bindingProvider: provider);

            var context = new BindingBuilder(bindingParser.Parse(binding, EmptyContext, target, null).Single());
            context.Add(BindingConstants.Binding, bindingMock);

            IBindingPath path = context.GetData(BindingBuilderConstants.TargetPath);
            path.Path.ShouldEqual(targetPath);

            var expression = context.GetData(BindingBuilderConstants.MultiExpression);
            expression(context, args).ShouldEqual(sourceModel);

            var sources = context.GetData(BindingBuilderConstants.Sources);
            BindingSourceShouldBeValidDataContext(target, sources[0].Invoke(context), sourcePath1);
            BindingSourceShouldBeValidDataContext(target, sources[1].Invoke(context), sourcePath2);
        }
        public void ParserShouldParseExpressionWithBinding()
        {
            const string targetPath = "Text";
            const string binding = @"Text $binding";
            var dataContext = new DataContext();
            var bindingMock = new DataBindingMock { GetContext = () => dataContext };
            IBindingParser bindingParser = CreateBindingParser();

            var context = new BindingBuilder(bindingParser.Parse(new object(), binding, null, null).Single());
            var path = context.GetData(BindingBuilderConstants.TargetPath);
            path.Path.ShouldEqual(targetPath);

            context.Add(BindingConstants.Binding, bindingMock);
            var expression = context.GetData(BindingBuilderConstants.MultiExpression);
            expression(context, Empty.Array<object>()).ShouldEqual(bindingMock);
        }
        public void ParserShouldParseMultiExpressionWithOneTimeScope()
        {
            const string targetPath = "Text";
            const string sourcePath1 = "SourceText1";
            const string sourcePath2 = "SourceText2";
            const string sourcePath3 = "SourceText3";
            const string methodName = "TestMethod";
            const string binding = "Text $OneTime($TestMethod(SourceText1, SourceText2).IntProperty) + SourceText3";

            const int firstValue = -1;
            var ctx = new DataContext();
            var bindingMock = new DataBindingMock { GetContext = () => ctx };
            int executionCount = 0;
            var target = new object();
            var args = new object[] { "tset", 1, 3 };
            var sourceModel = new BindingSourceModel { IntProperty = firstValue };

            var provider = new BindingProvider();
            var resolver = new BindingResourceResolver();
            BindingServiceProvider.ResourceResolver = resolver;
            var method = new BindingResourceMethod((list, objects, c) =>
            {
                ++executionCount;
                objects[0].ShouldEqual(args[0]);
                objects[1].ShouldEqual(args[1]);
                return sourceModel;
            }, typeof(BindingSourceModel));
            resolver.AddMethod(methodName, method, true);
            IBindingParser bindingParser = CreateBindingParser(bindingProvider: provider);


            var context = new BindingBuilder(bindingParser.Parse(target, binding, null, null).Single());
            context.AddOrUpdate(BindingConstants.Binding, bindingMock);
            IBindingPath path = context.GetData(BindingBuilderConstants.TargetPath);
            path.Path.ShouldEqual(targetPath);

            var expression = context.GetData(BindingBuilderConstants.MultiExpression);
            expression(context, args).ShouldEqual(firstValue + 3);
            sourceModel.IntProperty = int.MinValue;
            args[2] = 5;
            expression(context, args).ShouldEqual(firstValue + 5);
            args[2] = 6;
            expression(context, args).ShouldEqual(firstValue + 6);

            executionCount.ShouldEqual(1);

            var sources = context.GetData(BindingBuilderConstants.Sources);
            BindingSourceShouldBeValidDataContext(target, sources[0].Invoke(context), sourcePath1);
            BindingSourceShouldBeValidDataContext(target, sources[1].Invoke(context), sourcePath2);
            BindingSourceShouldBeValidDataContext(target, sources[2].Invoke(context), sourcePath3);
        }
        public void BuilderShouldUseExpressionWithOneTimeScope()
        {
            const string key = "key";
            var builder = new BindingBuilder();
            var sourceModel = new BindingSourceModel();
            const int firstValue = -1;
            int executionCount = 0;
            var dataContext = new DataContext();
            var bindingMock = new DataBindingMock { GetContext = () => dataContext };
            var result = new BindingSourceModel { IntProperty = firstValue };
            BindingServiceProvider.ResourceResolver.AddMethod<string, object, BindingSourceModel>(key, (s1, s2, context) =>
            {
                ++executionCount;
                s1.ShouldEqual(key);
                s2.ShouldEqual(builder);
                context.ShouldEqual(builder);
                return result;
            });
            builder.Bind(sourceModel, "empty").To<BindingSourceModel>(() => (model, ctx) => ctx.OneTime(ctx.ResourceMethod<BindingSourceModel>(key, key, builder).IntProperty) + 3);
            builder.AddOrUpdate(BindingConstants.Binding, bindingMock);

            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(firstValue + 3);
            sourceModel.IntProperty = int.MinValue;
            expression(builder, Empty.Array<object>()).ShouldEqual(firstValue + 3);
            executionCount.ShouldEqual(1);
        }
 public void BuilderShouldUseBinding()
 {
     var builder = new BindingBuilder();
     var dataContext = new DataContext();
     var bindingMock = new DataBindingMock { GetContext = () => dataContext };
     builder.Bind(new object(), "empty").To<BindingSourceModel>(() => (model, ctx) => ctx.Binding());
     
     builder.AddOrUpdate(BindingConstants.Binding, bindingMock);
     var expression = builder.GetData(BindingBuilderConstants.MultiExpression);
     expression(builder, Empty.Array<object>()).ShouldEqual(bindingMock);
 }