public void IntParameterAsInvalidXamlString()
        {
            var vm = new ViewModel();

            var binding = new MethodBindingExtension(vm, nameof(ViewModel.IntParam), "5x");

            TestHelper.RunMethodBinding(null, binding);

            vm.Executed.ShouldBe(false);
            TraceMessages.Count.ShouldBe(1);
            TraceMessages[0].ShouldStartWith("testhost Warning: 0 : [MethodBindingExtension] Method 'IntParam' (target type 'Singulink.WPF.Data.Tests.ViewModel') parameter 1 (name: 'x', type: 'System.Int32') could not be assigned from XAML string argument '5x':");
        }
        public void IntParameterAsXamlString()
        {
            var vm = new ViewModel();

            var binding = new MethodBindingExtension(nameof(ViewModel.IntParam), "5");

            TestHelper.RunMethodBinding(vm, binding);

            vm.Executed.ShouldBe(true);
            vm.ParamType.ShouldBe(typeof(int));
            TraceMessages.ShouldBeEmpty();
        }
        public void OverloadedNullableIntDoubleAsNull()
        {
            var vm = new ViewModel();

            var binding = new MethodBindingExtension(nameof(ViewModel.OverloadedNullableIntDouble), null);

            TestHelper.RunMethodBinding(vm, binding);

            vm.Executed.ShouldBe(true);
            vm.ParamType.ShouldBe(typeof(int?));
            TraceMessages.ShouldBeEmpty();
        }
        public void OverloadedIntStringAsInt()
        {
            var vm = new ViewModel();

            var binding = new MethodBindingExtension(nameof(ViewModel.OverloadedIntString), 5);

            TestHelper.RunMethodBinding(vm, binding);

            vm.Executed.ShouldBe(true);
            vm.ParamType.ShouldBe(typeof(int));
            TraceMessages.ShouldBeEmpty();
        }
        public void NullableIntParameterAsNullExtension()
        {
            var vm = new ViewModel();

            var binding = new MethodBindingExtension(nameof(ViewModel.NullableIntParam), new NullExtension());

            TestHelper.RunMethodBinding(vm, binding);

            vm.Executed.ShouldBe(true);
            vm.ParamType.ShouldBe(typeof(int?));
            TraceMessages.ShouldBeEmpty();
        }
        public void OverloadedNullableIntDoubleAsString()
        {
            var vm = new ViewModel();

            var binding = new MethodBindingExtension(vm, nameof(ViewModel.OverloadedNullableIntDouble), "5");

            TestHelper.RunMethodBinding(null, binding);

            vm.Executed.ShouldBe(false);
            TraceMessages.ShouldBe(new[] {
                "testhost Warning: 0 : [MethodBindingExtension] Could not find method 'OverloadedNullableIntDouble' (target type 'Singulink.WPF.Data.Tests.ViewModel') that accepts the provided arguments ('System.String').",
            });
        }
        public void IntParameterAsNullExtension()
        {
            var vm = new ViewModel();

            var binding = new MethodBindingExtension(vm, nameof(ViewModel.IntParam), new NullExtension());

            TestHelper.RunMethodBinding(null, binding);

            vm.Executed.ShouldBe(false);
            TraceMessages.ShouldBe(new[] {
                "testhost Warning: 0 : [MethodBindingExtension] Method 'IntParam' (target type 'Singulink.WPF.Data.Tests.ViewModel') parameter 1 (name: 'x', type: 'System.Int32') is not assignable to null.",
            });
        }
        public void NullMethodName()
        {
            var vm = new ViewModel();

            var binding = new MethodBindingExtension(vm, new NullExtension());

            TestHelper.RunMethodBinding(null, binding);

            binding = new MethodBindingExtension(vm, null);
            TestHelper.RunMethodBinding(null, binding);

            TraceMessages.ShouldBe(new[] {
                "testhost Warning: 0 : [MethodBindingExtension] Method target type resolved to 'Singulink.WPF.Data.Tests.ViewModel', method name resolved to null.",
                "testhost Warning: 0 : [MethodBindingExtension] Method target type resolved to 'Singulink.WPF.Data.Tests.ViewModel', method name resolved to null.",
            });
        }
        public void MissingMethod()
        {
            var vm = new ViewModel();

            var binding = new MethodBindingExtension(vm, "NonExistent");

            TestHelper.RunMethodBinding(null, binding);

            binding = new MethodBindingExtension(vm, "NonExistent", null);
            TestHelper.RunMethodBinding(null, binding);

            vm.Executed.ShouldBe(false);
            TraceMessages.ShouldBe(new[] {
                "testhost Warning: 0 : [MethodBindingExtension] Could not find parameterless method 'NonExistent' (target type 'Singulink.WPF.Data.Tests.ViewModel').",
                "testhost Warning: 0 : [MethodBindingExtension] Could not find method 'NonExistent' (target type 'Singulink.WPF.Data.Tests.ViewModel') that accepts the provided arguments (null).",
            });
        }