public void MusicPlayer_Set_PlayList_Change_Track()
        {
            //arrange
            IMusicFactory imf = Substitute.For<IMusicFactory>();
            IInternalPlayer iip = Substitute.For<IInternalPlayer>();
            imf.GetInternalPlayer().Returns(iip);

            MusicPlayer target = new MusicPlayer(imf);

            IReadOnlyPlayList irop = Substitute.For<IReadOnlyPlayList>();
            IInternalTrack it = Substitute.For<IInternalTrack>();
            it.Path.Returns("MyPath");
            irop.CurrentTrack = it;

            target.PlayList = irop;

            IInternalTrack it2 = Substitute.For<IInternalTrack>();
            it2.Path.Returns("MyPath2");

            target.MonitorEvents();

            //act

            irop.ChangeCurrent(it2);

            //assert
            iip.FileSource.Should().Be("MyPath2");
            iip.Received().Play();
            target.ShouldRaisePropertyChangeFor(t => t.MusicTrackSource);

            target.Mode.Should().Be(PlayMode.Play);
            target.MusicTrackSource.Should().Be(it2);

            //clean
            target.Dispose();
        }
        public void MusicPlayer_Set_PlayList_CurrentTrack_Null()
        {
            //arrange
            IMusicFactory imf = Substitute.For<IMusicFactory>();
            IInternalPlayer iip = Substitute.For<IInternalPlayer>();
            imf.GetInternalPlayer().Returns(iip);

            MusicPlayer target = new MusicPlayer(imf);

            IReadOnlyPlayList irop = Substitute.For<IReadOnlyPlayList>();
            irop.CurrentTrack = null;

            target.MonitorEvents();           
            
            //act
            target.PlayList = irop;

            //assert
            target.PlayList.Should().Be(irop);
            target.ShouldRaisePropertyChangeFor(t => t.PlayList);
            target.Mode.Should().Be( PlayMode.Stopped);

            target.Dispose();
        }
        public void MusicPlayer_Play_Do_NotPlay_UnderEdit()
        {
            //arrange
            IMusicFactory imf = Substitute.For<IMusicFactory>();
            IInternalPlayer iip = Substitute.For<IInternalPlayer>();
            imf.GetInternalPlayer().Returns(iip);
            iip.FileSource = null;

            IReadOnlyPlayList irop = Substitute.For<IReadOnlyPlayList>();
            IInternalTrack it = Substitute.For<IInternalTrack>();
            it.Path.Returns("MyPath");
            it.InternalState.Returns(ObjectState.UnderEdit);
            irop.CurrentTrack.Returns(it);


            // act
            MusicPlayer target = new MusicPlayer(imf);
            target.MonitorEvents();
            target.PlayList = irop;


            //assert
            target.PlayList.Should().Be(irop);
            target.MusicTrackSource.Should().Be(it);
            target.Mode.Should().Be(PlayMode.Stopped);
            target.ShouldRaisePropertyChangeFor(t => t.PlayList);
            target.ShouldRaisePropertyChangeFor(t => t.MusicTrackSource);
            iip.FileSource.Should().Be("MyPath");
            iip.DidNotReceive().Play();
            irop.DidNotReceive().Init();
            iip.Listener.Should().Be(target);

            //act2
            target.Pause();

            //assert2 
            target.Mode.Should().Be(PlayMode.Stopped);
            iip.DidNotReceive().Pause();

            //act3
            target.Stop();

            //assert3
            target.Mode.Should().Be(PlayMode.Stopped);
            iip.DidNotReceive().Play();


            //act4
            IInternalMusicPlayer iimp = target;
            it.UpdatedState.Returns(ObjectState.Available);
            it.InternalState.Returns(ObjectState.Available);
            iimp.OnLockEvent(it, new ObjectStateChangeArgs(it, ObjectState.UnderEdit, ObjectState.Available));

            target.Play();

            //assert4
            target.Mode.Should().Be(PlayMode.Play);

        }
        public void MusicPlayer_Play_Do_NotPlay_Broken()
        {
            //arrange
            IMusicFactory imf = Substitute.For<IMusicFactory>();
            IInternalPlayer iip = Substitute.For<IInternalPlayer>();
            imf.GetInternalPlayer().Returns(iip);
            iip.FileSource = null;

            IReadOnlyPlayList irop = Substitute.For<IReadOnlyPlayList>();
            IInternalTrack it = Substitute.For<IInternalTrack>();
            it.Path.Returns("MyPath");
            it.IsBroken.Returns(true);
            irop.CurrentTrack.Returns(it);


            // act
            MusicPlayer target = new MusicPlayer(imf);
            target.MonitorEvents();
            target.PlayList = irop;
          

            //assert
            target.PlayList.Should().Be(irop);
            target.MusicTrackSource.Should().Be(it);
            target.Mode.Should().Be(PlayMode.Stopped);
            target.ShouldRaisePropertyChangeFor(t => t.PlayList);
            target.ShouldRaisePropertyChangeFor(t => t.MusicTrackSource);
            iip.FileSource.Should().Be("MyPath");
            iip.DidNotReceive().Play();
            irop.DidNotReceive().Init();
            iip.Listener.Should().Be(target);

            //act2 
            target.Pause();

            //assert2
            target.Mode.Should().Be(PlayMode.Stopped);
            iip.DidNotReceive().Pause();

            //act2 
            target.Stop();

            //assert2
            target.Mode.Should().Be(PlayMode.Stopped);

        }
        public void MusicPlayer_Play_List_Current_Null_Init_OnPLay()
        {
            //arrange
            IMusicFactory imf = Substitute.For<IMusicFactory>();
            IInternalPlayer iip = Substitute.For<IInternalPlayer>();
            imf.GetInternalPlayer().Returns(iip);

            IReadOnlyPlayList irop = Substitute.For<IReadOnlyPlayList>();
            IInternalTrack it = Substitute.For<IInternalTrack>();
            it.Path.Returns("MyPath");
            irop.CurrentTrack.Returns((IInternalTrack)null);

            irop.When(x => x.Init()).Do(x=> irop.CurrentTrack.Returns(it));

            // act
            MusicPlayer target = new MusicPlayer(imf);
            target.MonitorEvents();
            target.PlayList = irop;
            target.Play();

            //assert
            target.PlayList.Should().Be(irop);
            target.MusicTrackSource.Should().Be(it);          
            target.ShouldRaisePropertyChangeFor(t => t.PlayList);
            target.ShouldRaisePropertyChangeFor(t => t.MusicTrackSource);
            iip.FileSource.Should().Be("MyPath");
            iip.Received().Play();
            irop.Received().Init();

            iip.Listener.Should().Be(target);

            target.Mode.Should().Be(PlayMode.Play);
        }
        public void MusicPlayer_Volume_Change()
        {
            //arrange
            IMusicFactory imf = Substitute.For<IMusicFactory>();
            IInternalPlayer iip = Substitute.For<IInternalPlayer>();
            imf.GetInternalPlayer().Returns(iip);
            iip.Volume.Returns(0.5d);

            MusicPlayer target = new MusicPlayer(imf);
               
            //act-assert 1
            target.Volume.Should().Be(0.5d); 

            //act-assert 2
            target.MonitorEvents();
            target.Volume = 0.2;
            target.Volume.Should().Be(0.2d);
            iip.Volume.Should().Be(0.2d);
            //iip.Listener.OnVolumeChange();
            target.ShouldRaisePropertyChangeFor(t => t.Volume);

            //act-assert 3
            target.Volume = -1;
            target.Volume.Should().Be(0d);
            iip.Volume.Should().Be(0d);

            //act-assert 4
            target.Volume = 5;
            target.Volume.Should().Be(1d);
            iip.Volume.Should().Be(1d);

            //assert
            
            target.PlayList.Should().BeNull();

            target.Mode.Should().Be(PlayMode.Stopped);
            target.MusicTrackSource.Should().Be(null);

            //clean
            target.Dispose();
        }
        public void MusicPlayer_Set_PlayList_CurrentTrack_NotNull_ChangePlayList()
        {
            //arrange
            IMusicFactory imf = Substitute.For<IMusicFactory>();
            IInternalPlayer iip = Substitute.For<IInternalPlayer>();
            imf.GetInternalPlayer().Returns(iip);

            MusicPlayer target = new MusicPlayer(imf);

            IReadOnlyPlayList irop = Substitute.For<IReadOnlyPlayList>();
            IInternalTrack it = Substitute.For<IInternalTrack>();
            it.Path.Returns("MyPath");
            irop.CurrentTrack = it;

            target.PlayList = irop;

            //act
            target.MonitorEvents();
            target.PlayList = null;

            //assert
            target.ShouldRaisePropertyChangeFor(t => t.PlayList);
            target.PlayList.Should().BeNull();
            iip.Received().Stop();

            target.Mode.Should().Be(PlayMode.Stopped);
            target.MusicTrackSource.Should().Be(null);

            //clean
            target.Dispose();
        }