using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Xunit; using Moq; using FluentAssertions; using SpotifyAPI.Web; using Selector; using System.Threading; namespace Selector.Tests { public class AudioInjectorTests { [Fact] public void Subscribe() { var watcherMock = new Mock(); var spotifyMock = new Mock(); var featureInjector = new AudioFeatureInjector(watcherMock.Object, spotifyMock.Object); featureInjector.Subscribe(); watcherMock.VerifyAdd(m => m.ItemChange += It.IsAny>()); } [Fact] public void Unsubscribe() { var watcherMock = new Mock(); var spotifyMock = new Mock(); var featureInjector = new AudioFeatureInjector(watcherMock.Object, spotifyMock.Object); featureInjector.Unsubscribe(); watcherMock.VerifyRemove(m => m.ItemChange -= It.IsAny>()); } [Fact] public void SubscribeFuncArg() { var watcherMock = new Mock(); var watcherFuncArgMock = new Mock(); var spotifyMock = new Mock(); var featureInjector = new AudioFeatureInjector(watcherMock.Object, spotifyMock.Object); featureInjector.Subscribe(watcherFuncArgMock.Object); watcherFuncArgMock.VerifyAdd(m => m.ItemChange += It.IsAny>()); watcherMock.VerifyNoOtherCalls(); } [Fact] public void UnsubscribeFuncArg() { var watcherMock = new Mock(); var watcherFuncArgMock = new Mock(); var spotifyMock = new Mock(); var featureInjector = new AudioFeatureInjector(watcherMock.Object, spotifyMock.Object); featureInjector.Unsubscribe(watcherFuncArgMock.Object); watcherFuncArgMock.VerifyRemove(m => m.ItemChange -= It.IsAny>()); watcherMock.VerifyNoOtherCalls(); } [Fact] public async void CallbackNoId() { var watcherMock = new Mock(); var spotifyMock = new Mock(); var timelineMock = new Mock(); var eventArgsMock = new Mock(); var playingMock = new Mock(); var trackMock = new Mock(); var featureMock = new Mock(); eventArgsMock.Object.Current = playingMock.Object; playingMock.Object.Item = trackMock.Object; spotifyMock.Setup(m => m.GetAudioFeatures(It.IsAny(), It.IsAny()).Result).Returns(() => featureMock.Object); var featureInjector = new AudioFeatureInjector(watcherMock.Object, spotifyMock.Object) { Timeline = timelineMock.Object }; await featureInjector.AsyncCallback(eventArgsMock.Object); spotifyMock.VerifyNoOtherCalls(); timelineMock.VerifyNoOtherCalls(); } [Fact] public async void CallbackWithId() { var watcherMock = new Mock(); var spotifyMock = new Mock(); var timelineMock = new Mock(); var eventArgsMock = new Mock(); var playingMock = new Mock(); var trackMock = new Mock(); var featureMock = new Mock(); eventArgsMock.Object.Current = playingMock.Object; playingMock.Object.Item = trackMock.Object; trackMock.Object.Id = "Fake-Id"; spotifyMock.Setup(m => m.GetAudioFeatures(It.IsAny(), It.IsAny()).Result).Returns(() => featureMock.Object); var featureInjector = new AudioFeatureInjector(watcherMock.Object, spotifyMock.Object) { Timeline = timelineMock.Object }; await featureInjector.AsyncCallback(eventArgsMock.Object); spotifyMock.Verify(m => m.GetAudioFeatures(It.IsAny(), It.IsAny())); spotifyMock.VerifyNoOtherCalls(); timelineMock.Verify(m => m.Add(It.IsAny(), It.IsAny()), Times.Once); timelineMock.VerifyNoOtherCalls(); } } }