public void Be_Creatable()
        {
            var settings = new Dictionary <string, string>
            {
                { "FieldToCompareWith", "stopTime" },
                { "CompareOperator", "<" }
            } as IDictionary <string, string>;
            var formData = new FormData();

            var ctx = new ContextFor <DateTimeComparisonCheck>();

            ctx.Use(settings);
            ctx.Use <Func <FormData> >(() => formData);

            var sut = ctx.BuildSut();

            sut.Should().NotBeNull();
            sut.GetType().GetCustomAttribute <DisplayNameAttribute>().DisplayName.Should().Be("datetime");
        }
Пример #2
0
        public void Lookup_packages()
        {
            var ctx = new ContextFor <NuPlugPackageRepository>();
            var sut = ctx.BuildSut();

            var lookup   = ctx.For <IPackageLookup>();
            var registry = ctx.For <IPackageRegistry>();

            var package = "foo".CreatePackage("0.1.0");

            sut.Exists(package).Should().BeFalse();
            Received.InOrder(() =>
            {
                registry.Exists(package.Id, package.Version);
                lookup.Exists(package.Id, package.Version);
            });

            registry.FindPackage(package.Id, package.Version).Returns(package);
            sut.FindPackage(package.Id, package.Version).Should().Be(package);

            registry.FindPackage(package.Id, package.Version).Returns((IPackage)null);
            lookup.FindPackage(package.Id, package.Version).Returns(package);
            sut.FindPackage(package.Id, package.Version).Should().Be(package);

            lookup.FindPackage(package.Id, package.Version).Returns((IPackage)null);
            sut.FindPackage(package.Id, package.Version).Should().BeNull();

            sut.FindPackagesById(package.Id).Should().BeEmpty();

            var packages = new[] { package };

            registry.FindPackagesById(package.Id).Returns(packages);
            sut.FindPackagesById(package.Id).ShouldAllBeEquivalentTo(packages);

            var empty = Enumerable.Empty <IPackage>().ToList();

            registry.FindPackagesById(package.Id).Returns(empty);
            lookup.FindPackagesById(package.Id).Returns(packages);
            sut.FindPackagesById(package.Id).ShouldAllBeEquivalentTo(packages);

            lookup.FindPackagesById(package.Id).Returns(empty);
            sut.FindPackagesById(package.Id).Should().BeEmpty();
        }
Пример #3
0
        public void Handle_Position_Changed_Event_From_MediaPlayer_If_Changed()
        {
            var positionPovider = Substitute.For <IMediaPlayer>();

            positionPovider.Duration.ReturnsForAnyArgs(2);

            var ctx = new ContextFor <WaveformViewModel>();
            var sut = ctx.BuildSut();

            sut.PositionProvider = positionPovider;

            using (var monitor = sut.Monitor())
            {
                positionPovider.PropertyChanged += Raise.Event <PropertyChangedEventHandler>(new object(),
                                                                                             new PropertyChangedEventArgs(nameof(sut.Position)));

                monitor.Should().Raise(nameof(sut.PropertyChanged))
                .WithArgs <PropertyChangedEventArgs>(t => t.PropertyName == nameof(sut.Position));
            }
        }
        public void Ignore_Walk_info_by_default()
        {
            var context = new ContextFor <NuPlugPackageManager>();
            var sut     = context.BuildSut();

            sut.DisableWalkInfo.Should().BeTrue();

            var package = "foo".CreatePackage("0.1.0");

            sut.Logger = new TraceLogger();

            using (var tl = new TestTraceListener())
            {
                sut.InstallPackage(package, false, true);
                var infos = tl.MessagesFor(TraceLevel.Info);
                infos.Should().BeEquivalentTo(
                    $"Installing '{package.Id} {package.Version}'.",
                    $"Successfully installed '{package.Id} {package.Version}'.");
            }
        }
Пример #5
0
        public void IpAddressChecks()
        {
            var settings = new Dictionary <string, string>
            {
                { "Hint", "Not a valid ip." }, { "RegEx", @"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$" }
            } as
            IDictionary <string, string>;
            var ctx = new ContextFor <StringRegExCheck>();

            ctx.Use(settings);
            var sut = ctx.BuildSut();

            sut.ShouldPass("1.1.1.1", "1.1.1.1");
            sut.ShouldPass("22.22.22.22", "22.22.22.22");
            sut.ShouldPass("333.333.333.333",
                           "333.333.333.333");                         // actually this is not a valid IP address. However, we check the RegEx here!

            sut.ShouldFailWith <ArgumentException>("1.1.11", 0);       // missing separator
            sut.ShouldFailWith <ArgumentException>("1.22.33.4444", 0); // field with 4 digits
        }
        public void Support_live_tracking()
        {
            var ctx = new ContextFor <WaveformDisplayViewModel>();
            var sut = ctx.BuildSut();

            sut.IsLive.Should().BeFalse("innitially not live");
            sut.LastWritePosition.Should().Be(0);

            var peaks = new[] { new PeakInfo(-1f, 1f) };
            var uri   = new Uri("channel://1/");
            var e     = new PeaksReceivedEvent(uri, 0, 1, peaks);

            sut.Duration = e.End * 2;
            sut.HandlePeaks(e);
            sut.IsLive.Should().BeTrue("Receiving partial peaks should activate live tracking");
            sut.LastWritePosition.Should().Be(e.End, "last write position should be updated for received peaks");

            sut.HandleShift(sut.LastWritePosition);
            sut.LastWritePosition.Should().Be(0);
        }
        public void Ignore_AlreadyInstalled_Packages()
        {
            var context = new ContextFor <NuPlugPackageManager>();

            var packageLookup   = Substitute.For <IPackageLookup>();
            var packageRegistry = new NuPlugPackageRegistry();
            var localRepo       = new NuPlugPackageRepository(packageLookup, packageRegistry);

            var sut         = context.BuildSut();
            var foo         = "foo".CreatePackage("0.1.0");
            var bar         = "bar".CreatePackage("2.9.0");
            var versionSpec = new VersionSpec(SemanticVersion.Parse("2.6.0"))
            {
                MaxVersion = null
            };
            var deps = new[]
            { new PackageDependencySet(sut.TargetFramework, new[] { new PackageDependency(bar.Id, versionSpec) }) };

            foo.DependencySets.Returns(deps);

            localRepo.AddPackage(new NullPackage(bar.Id, bar.Version));

            var remotePackages = new[] { foo };

            sut.SourceRepository.GetPackages().Returns(remotePackages.AsQueryable());
            sut.SetLocalRepository(localRepo);

            sut.Logger = new TraceLogger();
            using (var tl = new TestTraceListener())
            {
                sut.InstallPackage(foo, false, true);

                var infos = tl.MessagesFor(TraceLevel.Info);
                infos.Should().BeEquivalentTo(
                    $"Attempting to resolve dependency '{bar.Id} (≥ {versionSpec.MinVersion})'.",
                    //$"{bar.Id} already installed.",
                    $"Installing '{foo.Id} {foo.Version}'.",
                    $"Successfully installed '{foo.Id} {foo.Version}'."
                    );
            }
        }
        public void Get_lib_dirs_for(string framework)
        {
            var context  = new ContextFor <NuGetPackageContainer <string> >();
            var foo      = "foo".CreatePackage("0.1.0");
            var packages = new[] { foo };

            var pm = context.For <IPackageManager>();

            pm.LocalRepository.GetPackages().Returns(packages.AsQueryable());

            var path = foo.Id;

            pm.PathResolver.GetInstallPath(foo).Returns(path);
            var expectedPath = MockFileSystem(pm.FileSystem, foo, framework);

            var sut = context.BuildSut();

            var asmResolver = context.For <IResolveAssembly>();

            asmResolver.Received().Directories.Add(expectedPath);
        }
Пример #9
0
        public void Use_Providers_Position()
        {
            var position        = 42.0;
            var positionPovider = Substitute.For <IMediaPlayer>();

            positionPovider.Position.Returns(position);

            var ctx = new ContextFor <WaveformViewModel>();
            var sut = ctx.BuildSut();

            sut.PositionProvider = positionPovider;

            sut.Position.Should().Be(42);

            // ReSharper disable once RedundantAssignment // needed to match NSubstitute syntax!
            position = positionPovider.Received().Position;

            position     = 48.0;
            sut.Position = position;
            positionPovider.Received().Position = position;
        }
Пример #10
0
        public void Handle_samples_and_publish_peaks()
        {
            var ctx = new ContextFor <SamplesHandlerPeakPublisher>();
            var sut = ctx.BuildSut();

            sut.Should().BeAssignableTo <IHandle <SamplesReceivedEvent> >();
            var events = ctx.For <IEventAggregator>();

            events.Received().Subscribe(sut);

            var waveFormat = new WaveFormat(8000, 1);
            var start      = TimeSpan.Zero;
            var duration   = TimeSpan.FromSeconds(1);
            var data       = waveFormat.Generate(duration);
            var samples    = new SamplesReceivedEvent(new Uri("some://uri/"), start, waveFormat, data);

            PeaksReceivedEvent actualPeaks = null;

            events.When(x => x.PublishOnCurrentThread(Arg.Any <PeaksReceivedEvent>())).Do(x => actualPeaks = x.Arg <PeaksReceivedEvent>());

            var        peakProvider     = ctx.For <IPeakProvider>();
            WaveFormat actualWaveformat = null;

            byte[] actualData = null;
            peakProvider.Sample(Arg.Any <WaveFormat>(), Arg.Any <byte[]>()).Returns(x =>
            {
                actualWaveformat = x.Arg <WaveFormat>();
                actualData       = x.Arg <byte[]>();
                return(new[] { new PeakInfo(-1, 1) });
            });

            sut.Handle(samples);

            actualPeaks.Source.Should().Be(samples.Source);
            actualPeaks.Start.Should().Be(samples.Start.TotalSeconds);
            actualPeaks.End.Should().Be((samples.Start + duration).TotalSeconds);

            actualWaveformat.Should().BeSameAs(waveFormat);
            actualData.Should().BeSameAs(samples.Data);
        }
        public void Return_True_For_Start_time_Before_End_time_Using_Smaller_Than_Within_A_Table_field()
        {
            const string tableData = "\"columnStartRow__1\":\"11:00\",\"columnStopRow__1\":\"12:00\"";
            var          testDict  = new Dictionary <string, string>
            {
                { "tableKey", tableData }
            };

            var formData            = new FormData(testDict);
            var tableDataSerializer = Substitute.For <INZazuTableDataSerializer>();

            tableDataSerializer.Deserialize(tableData)
            .Returns(new Dictionary <string, string>
            {
                { "columnStartRow__1", "11:00" },
                { "columnStopRow__1", "12:00" }
            });

            var testFormats = new[] { "HHmm", "HHmmss", "HH:mm", "HH:mm:ss" };

            var settings = new Dictionary <string, string>
            {
                { "FieldToCompareWith", "stopTime" },
                { "CompareOperator", "<" },
                { "SpecificDateTimeFormats", string.Join("|", testFormats) }
            } as IDictionary <string, string>;
            var ctx = new ContextFor <DateTimeComparisonCheck>();

            ctx.Use(settings);
            ctx.Use <Func <FormData> >(() => formData);
            var sut = ctx.BuildSut();

            //var dateTimeCheck = new DateTimeComparisonCheck(
            //    "lorem ipsum", "<", "columnStopRow", () => formData, tableDataSerializer,
            //    tableKey: "tableKey", specificDateTimeFormats: testFormats, rowIdx: 1);
            var res = sut.Validate("11:00", default(DateTime));

            res.IsValid.Should().BeTrue();
        }
Пример #12
0
        public void Shift_position_selection_channels_and_labels()
        {
            var ctx = new ContextFor <WaveformViewModel>();
            var sut = ctx.BuildSut();

            sut.Duration        = 12;
            sut.Position        = 6;
            sut.Selection.Start = 6;
            sut.Selection.End   = 9;

            using (var monitor = sut.Monitor())
            {
                sut.HandleShift(3);

                monitor.Should().RaisePropertyChangeFor(x => x.Position,
                                                        "sut should not change position, just notify on the base stream (position provider)");
                sut.Selection.Start.Should().Be(3);
                sut.Selection.End.Should().Be(6);

                // TODO: assert channels & labels
            }
        }
Пример #13
0
        public void Support_auto_play()
        {
            var ctx = new ContextFor <WaveformViewModel>();
            var sut = ctx.BuildSut();

            var uri = new Uri("channel://1/");

            // set player
            var player = Substitute.For <IMediaPlayer>();

            player.Source        = uri;
            sut.PositionProvider = player;
            player.CanPlay.Returns(true);

            // activate
            ((IActivate)sut).Activate();
            sut.IsActive.Should().BeTrue();

            // now, after receiving partial peaks, should start autplaying
            var peaks = new[] { new PeakInfo(-1f, 1f) };
            var e     = new PeaksReceivedEvent(uri, 0, 1, peaks);

            sut.Duration = e.End * 2;
            sut.HandlePeaks(e);
            player.Received().Play();
            sut.Position.Should().Be(sut.LastWritePosition - sut.LiveDelta);

            player.ClearReceivedCalls();
            sut.HandlePeaks(e);
            // only play once after activation
            player.DidNotReceive().Play();

            // deactivate/activate & check autoplay again
            ((IDeactivate)sut).Deactivate(false);
            ((IActivate)sut).Activate();
            sut.HandlePeaks(e);
            player.Received().Play();
            sut.Position.Should().Be(sut.LastWritePosition - sut.LiveDelta);
        }
Пример #14
0
        public void Delegate_to_decorated_repo()
        {
            var ctx = new ContextFor <NuPlugPackageRepository>();
            var sut = ctx.BuildSut();

            sut.Should().BeAssignableTo <IPackageLookup>();

            var lookup = ctx.For <IPackageLookup>();

            sut.PackageSaveMode.Should().Be(lookup.PackageSaveMode);
            // ReSharper disable once RedundantAssignment
            var mode = lookup.Received().PackageSaveMode;

            mode = PackageSaveModes.Nupkg;
            sut.PackageSaveMode = mode;
            lookup.Received().PackageSaveMode = mode;

            lookup.SupportsPrereleasePackages.Returns(true);
            sut.SupportsPrereleasePackages.Should().BeTrue();
            // ReSharper disable once UnusedVariable
            var b = lookup.Received().SupportsPrereleasePackages;

            lookup.Source.Returns("source");
            sut.Source.Should().Be(lookup.Source);
            // ReSharper disable once UnusedVariable
            var s = lookup.Received().Source;

            sut.GetPackages().Should().BeEmpty();
            lookup.Received().GetPackages();

            var package = "foo".CreatePackage("0.1.0");

            sut.AddPackage(package);
            lookup.Received().AddPackage(package);

            sut.RemovePackage(package);
            lookup.Received().RemovePackage(package);
        }
Пример #15
0
        public void Create_All_Checks(string type)
        {
            var ctx = new ContextFor <CheckFactory>();
            var sut = ctx.BuildSut();

            var settings = new Dictionary <string, string>
            {
                { "Hint", "This is a hint for the error message" },
                { "RegEx", "true|false" }
            };

            var checkDefinition = new CheckDefinition {
                Type = type, Settings = settings
            };
            var definition = new FieldDefinition
            {
                Key = "test_string", Type = "string", Checks = new[] { checkDefinition }
            };
            var field = sut.CreateCheck(definition.Checks.Single(), definition, () => new FormData(),
                                        Substitute.For <INZazuTableDataSerializer>());

            field.Should().NotBeNull();
        }
        public void Handle_shift_events()
        {
            var ctx = new ContextFor <WaveformDisplayViewModel>();
            var sut = ctx.BuildSut();

            sut.Should().BeAssignableTo <IHandle <AudioShiftedEvent> >();

            var source       = new Uri("http://some/audio/");
            var shift        = TimeSpan.FromSeconds(3);
            var newStartTime = DateTimeOffset.Now;
            var e            = new AudioShiftedEvent(source, shift, newStartTime);

            sut.Source.Should().BeNull("skip shift if not same source");
            sut.Handle(e);

            sut.Source        = source;
            sut.WaveformImage = BitmapFactory.New(20, 20);
            sut.Duration.Should().Be(0, "skip shifts if duration 0");
            sut.Handle(e);

            sut.Duration = shift.TotalSeconds * 2;
            sut.HandleShift(e.Shift.TotalSeconds);
        }
Пример #17
0
        public void Push_And_Pop()
        {
            var ctx = new ContextFor <BlackList <string> >();

            ctx.Use(10);
            var sut = ctx.BuildSut();

            sut.Push("foo");
            sut.Push("bar");
            sut.Count.Should().Be(2);

            sut.Push("bar");
            sut.Count.Should().Be(2);

            sut.Pop("foo").Should().BeTrue();
            sut.Count.Should().Be(1);

            sut.Pop("bar").Should().BeTrue();
            sut.Count.Should().Be(0);

            sut.Pop("bar").Should().BeFalse();
            sut.Pop("hugo").Should().BeFalse();
        }
Пример #18
0
        public void Not_Handle_Duration_Changed_Event_From_MediaPlayer_If_Not_Changed()
        {
            const int expectedDuration = 4;
            var       positionPovider  = Substitute.For <IMediaPlayer>();

            positionPovider.Duration.ReturnsForAnyArgs(4);

            var ctx = new ContextFor <WaveformViewModel>();
            var sut = ctx.BuildSut();

            sut.Duration         = 4.0;
            sut.PositionProvider = positionPovider;

            using (var monitor = sut.Monitor())
            {
                positionPovider.PropertyChanged += Raise.Event <PropertyChangedEventHandler>(new object(),
                                                                                             new PropertyChangedEventArgs(nameof(sut.Duration)));
                monitor.Should().NotRaise(nameof(sut.PropertyChanged));
                monitor.Should().NotRaise(nameof(sut.PropertyChanged));
                sut.Duration.Should().Be(expectedDuration);
                sut.HasDuration.Should().BeTrue();
            }
        }
        public void Handle_live_sample_updates()
        {
            var ctx = new ContextFor <WaveformDisplayViewModel>();
            var sut = ctx.BuildSut();

            sut.Should().BeAssignableTo <IHandle <PeaksReceivedEvent> >();
            ctx.For <IEventAggregator>().Received().Subscribe(sut);

            // |----------         |
            // |-------------------|
            // |          ---------|
            sut.BackgroundBrush = new SolidColorBrush(Colors.Black);
            sut.LeftBrush       = new SolidColorBrush(Colors.Red);
            sut.RightBrush      = new SolidColorBrush(Colors.Blue);
            sut.WaveformImage   = BitmapFactory.New(20, 20);
            var w2 = (int)(sut.WaveformImage.Width / 2);
            var h2 = (int)(sut.WaveformImage.Height / 2);

            var peaks = Enumerable.Repeat(1f, 2 * w2).Concat(Enumerable.Repeat(0f, 2 * w2))
                        .Select(m => new PeakInfo(m - 1f, m)).ToArray();
            var e = new PeaksReceivedEvent(new Uri("source://test/"), 0, 2, peaks);

            sut.Duration = e.End;
            sut.HandlePeaks(e);

            // assert the image rendered
            sut.WaveformImage.RectShouldHaveColor(1, 1, w2, h2, sut.LeftBrush.Color);
            sut.WaveformImage.RectShouldHaveColor(w2 + 1, h2 + 1, 2 * w2, 2 * h2, sut.RightBrush.Color);
            sut.WaveformImage.RectShouldHaveColor(1, h2 + 1, w2 - 1, 2 * h2 - 1, sut.BackgroundBrush.Color);
            sut.WaveformImage.RectShouldHaveColor(w2 + 1, 1, 2 * w2, h2, sut.BackgroundBrush.Color);

            // assert the points are filled
            sut.LeftChannel.Take(10).Should().AllBeEquivalentTo(0);
            sut.RightChannel.Take(10).Should().AllBeEquivalentTo(h2);
            sut.LeftChannel.Skip(10).Take(10).Should().AllBeEquivalentTo(h2);
            sut.RightChannel.Skip(10).Take(10).Should().AllBeEquivalentTo(2 * h2);
        }
        public void Sync_directories_with_installed_packages()
        {
            var context = new ContextFor <NuGetPackageContainer <string> >();

            var foo      = "foo".CreatePackage("0.1.0");
            var packages = new[] { foo };

            var pm = context.For <IPackageManager>();

            pm.LocalRepository.GetPackages().Returns(packages.AsQueryable());

            var path = foo.Id;

            pm.PathResolver.GetInstallPath(foo).Returns(path);
            var expectedPath = MockFileSystem(pm.FileSystem, foo);

            var sut = context.BuildSut();

            pm.LocalRepository.Received().GetPackages();
            var asmResolver = context.For <IResolveAssembly>();

            asmResolver.Received().Directories.Add(expectedPath);

            var bar = "bar".CreatePackage("1.42.0");
            var fs2 = Substitute.For <IFileSystem>();

            expectedPath = MockFileSystem(fs2, bar);
            var args = new PackageOperationEventArgs(bar, fs2, "otherPath");

            pm.PackageInstalled += Raise.EventWith(args);

            asmResolver.Received().Directories.Add(expectedPath);

            pm.PackageUninstalled += Raise.EventWith(args);
            asmResolver.Received().Directories.Remove(expectedPath);
        }
Пример #21
0
        public void Support_start_time_with_shifts()
        {
            var uri = new Uri("http://some/uri/audio.wav");
            var ctx = new ContextFor <WaveformPlayerViewModel>();

            var d   = DateTimeOffset.UtcNow;
            var sut = ctx.BuildSut();

            sut.Should().BeAssignableTo <IHandle <AudioShiftedEvent> >();
            ctx.For <IEventAggregator>().Received().Subscribe(sut);

            var getTime = ctx.For <IGetTimeStamp>();

            getTime.For(uri).Returns(d);

            sut.Source = uri;
            sut.HasCurrentTime.Should().BeTrue();
            sut.StartTime.Should().Be(d);

            var shiftedEvent = new AudioShiftedEvent(uri, TimeSpan.FromSeconds(3), sut.StartTime);

            sut.Handle(shiftedEvent);
            sut.StartTime.Should().Be(d + shiftedEvent.Shift);
        }
Пример #22
0
        public void Notify_property_changes()
        {
            var ctx = new ContextFor <WaveformViewModel>();
            var sut = ctx.BuildSut();

            using (var monitor = sut.Monitor())
            {
                var selection = new AudioSelectionViewModel();
                sut.Selection = selection;
                sut.Selection.Should().BeEquivalentTo(selection);
                monitor.Should().RaisePropertyChangeFor(x => x.Selection);
            }

            using (var monitor = sut.Monitor())
            {
                var selectionMenu = Substitute.For <IMenuViewModel>();
                sut.SelectionMenu = selectionMenu;
                sut.SelectionMenu.Should().Be(selectionMenu);
                monitor.Should().RaisePropertyChangeFor(x => x.SelectionMenu);
            }

            using (var monitor = sut.Monitor())
            {
                sut.TicksEach = 42.0;
                sut.TicksEach.Should().Be(42);
                monitor.Should().RaisePropertyChangeFor(x => x.TicksEach);
            }

            var brush  = new SolidColorBrush(Colors.Red);
            var points = new PointCollection();
            var label  = Substitute.For <ILabelVievModel>();
            var labels = new[] { label };

            sut.Labels = labels;
            sut.Labels.Should().BeEquivalentTo(labels);

            using (var monitor = sut.Monitor())
            {
                sut.SelectedLabel = label;
                sut.SelectedLabel.Should().Be(label);
                monitor.Should().RaisePropertyChangeFor(x => x.SelectedLabel);
            }

            using (var monitor = sut.Monitor())
            {
                sut.UserBrush = brush;
                sut.UserBrush.Should().Be(brush);
                monitor.Should().RaisePropertyChangeFor(x => x.UserBrush);
            }

            using (var monitor = sut.Monitor())
            {
                sut.SeparationLeftBrush = brush;
                sut.SeparationLeftBrush.Should().Be(brush);
                monitor.Should().RaisePropertyChangeFor(x => x.SeparationLeftBrush);
            }

            using (var monitor = sut.Monitor())
            {
                sut.SeparationRightBrush = brush;
                sut.SeparationRightBrush.Should().Be(brush);
                monitor.Should().RaisePropertyChangeFor(x => x.SeparationRightBrush);
            }

            using (var monitor = sut.Monitor())
            {
                sut.UserTextBrush = brush;
                sut.UserTextBrush.Should().Be(brush);
                monitor.Should().RaisePropertyChangeFor(x => x.UserTextBrush);
            }

            using (var monitor = sut.Monitor())
            {
                sut.PositionBrush = brush;
                sut.PositionBrush.Should().Be(brush);
                monitor.Should().RaisePropertyChangeFor(x => x.PositionBrush);
            }

            using (var monitor = sut.Monitor())
            {
                sut.SelectionBrush = brush;
                sut.SelectionBrush.Should().Be(brush);
                monitor.Should().RaisePropertyChangeFor(x => x.SelectionBrush);
            }

            using (var monitor = sut.Monitor())
            {
                sut.SeparationRightBrush = brush;
                sut.SeparationRightBrush.Should().Be(brush);
                monitor.Should().RaisePropertyChangeFor(x => x.SeparationRightBrush);
            }

            using (var monitor = sut.Monitor())
            {
                sut.UserChannel = points;
                sut.UserChannel.Should().BeEquivalentTo(points);
                monitor.Should().RaisePropertyChangeFor(x => x.UserChannel);
            }

            using (var monitor = sut.Monitor())
            {
                sut.SeparationLeftChannel = points;
                sut.SeparationLeftChannel.Should().BeEquivalentTo(points);
                monitor.Should().RaisePropertyChangeFor(x => x.SeparationLeftChannel);
            }

            using (var monitor = sut.Monitor())
            {
                sut.SeparationRightChannel = points;
                sut.SeparationRightChannel.Should().BeEquivalentTo(points);
                monitor.Should().RaisePropertyChangeFor(x => x.SeparationRightChannel);
            }
        }