using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using System.Reflection; using StrixMusic.Sdk.BaseModels; namespace StrixMusic.Sdk.Tests.Plugins.Models.GlobalModelPluginConnector { [TestClass] public class PlaylistCollectionTests { private static bool NoInner(MemberInfo x) => !x.Name.Contains("Inner"); private static bool NoInnerOrSources(MemberInfo x) => NoInner(x) && !x.Name.ToLower().Contains("sources"); [TestMethod] public void AccessedThroughPlayableCollectionGroup() { var plugins = new Sdk.Plugins.Model.SdkModelPlugin(SdkTestPluginMetadata.Metadata); plugins.PlaylistCollection.Add(x => new PlaylistCollectionPluginBaseTests.FullyCustom(x)); var plugin = StrixMusic.Sdk.Plugins.Model.GlobalModelPluginConnector.Create(plugins).PlayableCollectionGroup.Execute(new PlayableCollectionGroupPluginBaseTests.Unimplemented()); Helpers.AssertAllMembersThrowOnAccess, PlaylistCollectionPluginBaseTests.FullyCustom>( value: plugin, customFilter: NoInnerOrSources, typesToExclude: new[] { typeof(IAsyncDisposable), typeof(IPlayableCollectionItem) }); } [TestMethod] public void NotBlockingPlayableCollectionGroup() { var plugins = new Sdk.Plugins.Model.SdkModelPlugin(SdkTestPluginMetadata.Metadata); plugins.PlaylistCollection.Add(x => new PlaylistCollectionPluginBaseTests.FullyCustom(x)); plugins.PlayableCollectionGroup.Add(x => new PlayableCollectionGroupPluginBaseTests.FullyCustom(x)); var plugin = StrixMusic.Sdk.Plugins.Model.GlobalModelPluginConnector.Create(plugins).PlayableCollectionGroup.Execute(new PlayableCollectionGroupPluginBaseTests.Unimplemented()); // Ensure an PlayableCollectionGroup plugin can still be accessed through PlaylistCollection members. Helpers.AssertAllMembersThrowOnAccess, PlaylistCollectionPluginBaseTests.FullyCustom>( value: plugin, customFilter: NoInnerOrSources, typesToExclude: typeof(IAsyncDisposable)); } [TestMethod] public void DisposingPlayableCollectionGroup() { var plugins = new Sdk.Plugins.Model.SdkModelPlugin(SdkTestPluginMetadata.Metadata); plugins.PlaylistCollection.Add(x => new PlaylistCollectionPluginBaseTests.FullyCustom(x)); var plugin = StrixMusic.Sdk.Plugins.Model.GlobalModelPluginConnector.Create(plugins).PlayableCollectionGroup.Execute(new PlayableCollectionGroupPluginBaseTests.Unimplemented()); Helpers.AssertAllThrowsOnMemberAccess(value: plugin, expectedExceptions: new[] { typeof(AccessedException), typeof(AccessedException), }); } [TestMethod] public void AccessedThroughLibrary() { var plugins = new Sdk.Plugins.Model.SdkModelPlugin(SdkTestPluginMetadata.Metadata); plugins.PlaylistCollection.Add(x => new PlaylistCollectionPluginBaseTests.FullyCustom(x)); var plugin = StrixMusic.Sdk.Plugins.Model.GlobalModelPluginConnector.Create(plugins).Library.Execute(new LibraryPluginBaseTests.Unimplemented()); Helpers.AssertAllMembersThrowOnAccess, PlaylistCollectionPluginBaseTests.FullyCustom>( value: plugin, customFilter: NoInnerOrSources, typesToExclude: new[] { typeof(IAsyncDisposable), typeof(IPlayableCollectionItem) }); } [TestMethod] public void NotBlockingLibrary() { var plugins = new Sdk.Plugins.Model.SdkModelPlugin(SdkTestPluginMetadata.Metadata); plugins.PlaylistCollection.Add(x => new PlaylistCollectionPluginBaseTests.FullyCustom(x)); plugins.Library.Add(x => new LibraryPluginBaseTests.FullyCustom(x)); var plugin = StrixMusic.Sdk.Plugins.Model.GlobalModelPluginConnector.Create(plugins).Library.Execute(new LibraryPluginBaseTests.Unimplemented()); // Ensure an Library plugin can still be accessed through PlaylistCollection members. Helpers.AssertAllMembersThrowOnAccess, PlaylistCollectionPluginBaseTests.FullyCustom>( value: plugin, customFilter: NoInnerOrSources, typesToExclude: typeof(IAsyncDisposable)); } [TestMethod] public void DisposingLibrary() { var plugins = new Sdk.Plugins.Model.SdkModelPlugin(SdkTestPluginMetadata.Metadata); plugins.PlaylistCollection.Add(x => new PlaylistCollectionPluginBaseTests.FullyCustom(x)); var plugin = StrixMusic.Sdk.Plugins.Model.GlobalModelPluginConnector.Create(plugins).Library.Execute(new LibraryPluginBaseTests.Unimplemented()); Helpers.AssertAllThrowsOnMemberAccess(value: plugin, expectedExceptions: new[] { typeof(AccessedException), typeof(AccessedException), }); } [TestMethod] public void AccessedThroughDiscoverables() { var plugins = new Sdk.Plugins.Model.SdkModelPlugin(SdkTestPluginMetadata.Metadata); plugins.PlaylistCollection.Add(x => new PlaylistCollectionPluginBaseTests.FullyCustom(x)); var plugin = StrixMusic.Sdk.Plugins.Model.GlobalModelPluginConnector.Create(plugins).Discoverables.Execute(new DiscoverablesPluginBaseTests.Unimplemented()); Helpers.AssertAllMembersThrowOnAccess, PlaylistCollectionPluginBaseTests.FullyCustom>( value: plugin, customFilter: NoInnerOrSources, typesToExclude: new[] { typeof(IAsyncDisposable), typeof(IPlayableCollectionItem) }); } [TestMethod] public void NotBlockingDiscoverables() { var plugins = new Sdk.Plugins.Model.SdkModelPlugin(SdkTestPluginMetadata.Metadata); plugins.PlaylistCollection.Add(x => new PlaylistCollectionPluginBaseTests.FullyCustom(x)); plugins.Discoverables.Add(x => new DiscoverablesPluginBaseTests.FullyCustom(x)); var plugin = StrixMusic.Sdk.Plugins.Model.GlobalModelPluginConnector.Create(plugins).Discoverables.Execute(new DiscoverablesPluginBaseTests.Unimplemented()); // Ensure an Discoverables plugin can still be accessed through PlaylistCollection members. Helpers.AssertAllMembersThrowOnAccess, PlaylistCollectionPluginBaseTests.FullyCustom>( value: plugin, customFilter: NoInnerOrSources, typesToExclude: typeof(IAsyncDisposable)); } [TestMethod] public void DisposingDiscoverables() { var plugins = new Sdk.Plugins.Model.SdkModelPlugin(SdkTestPluginMetadata.Metadata); plugins.PlaylistCollection.Add(x => new PlaylistCollectionPluginBaseTests.FullyCustom(x)); var plugin = StrixMusic.Sdk.Plugins.Model.GlobalModelPluginConnector.Create(plugins).Discoverables.Execute(new DiscoverablesPluginBaseTests.Unimplemented()); Helpers.AssertAllThrowsOnMemberAccess(value: plugin, expectedExceptions: new[] { typeof(AccessedException), typeof(AccessedException), }); } [TestMethod] public void AccessedThroughSearchHistory() { var plugins = new Sdk.Plugins.Model.SdkModelPlugin(SdkTestPluginMetadata.Metadata); plugins.PlaylistCollection.Add(x => new PlaylistCollectionPluginBaseTests.FullyCustom(x)); var plugin = StrixMusic.Sdk.Plugins.Model.GlobalModelPluginConnector.Create(plugins).SearchHistory.Execute(new SearchHistoryPluginBaseTests.Unimplemented()); Helpers.AssertAllMembersThrowOnAccess, PlaylistCollectionPluginBaseTests.FullyCustom>( value: plugin, customFilter: NoInnerOrSources, typesToExclude: new[] { typeof(IAsyncDisposable), typeof(IPlayableCollectionItem) }); } [TestMethod] public void NotBlockingSearchHistory() { var plugins = new Sdk.Plugins.Model.SdkModelPlugin(SdkTestPluginMetadata.Metadata); plugins.PlaylistCollection.Add(x => new PlaylistCollectionPluginBaseTests.FullyCustom(x)); plugins.SearchHistory.Add(x => new SearchHistoryPluginBaseTests.FullyCustom(x)); var plugin = StrixMusic.Sdk.Plugins.Model.GlobalModelPluginConnector.Create(plugins).SearchHistory.Execute(new SearchHistoryPluginBaseTests.Unimplemented()); // Ensure an SearchHistory plugin can still be accessed through PlaylistCollection members. Helpers.AssertAllMembersThrowOnAccess, PlaylistCollectionPluginBaseTests.FullyCustom>( value: plugin, customFilter: NoInnerOrSources, typesToExclude: typeof(IAsyncDisposable)); } [TestMethod] public void DisposingSearchHistory() { var plugins = new Sdk.Plugins.Model.SdkModelPlugin(SdkTestPluginMetadata.Metadata); plugins.PlaylistCollection.Add(x => new PlaylistCollectionPluginBaseTests.FullyCustom(x)); var plugin = StrixMusic.Sdk.Plugins.Model.GlobalModelPluginConnector.Create(plugins).SearchHistory.Execute(new SearchHistoryPluginBaseTests.Unimplemented()); Helpers.AssertAllThrowsOnMemberAccess(value: plugin, expectedExceptions: new[] { typeof(AccessedException), typeof(AccessedException), }); } [TestMethod] public void AccessedThroughSearchResults() { var plugins = new Sdk.Plugins.Model.SdkModelPlugin(SdkTestPluginMetadata.Metadata); plugins.PlaylistCollection.Add(x => new PlaylistCollectionPluginBaseTests.FullyCustom(x)); var plugin = StrixMusic.Sdk.Plugins.Model.GlobalModelPluginConnector.Create(plugins).SearchResults.Execute(new SearchResultsPluginBaseTests.Unimplemented()); Helpers.AssertAllMembersThrowOnAccess, PlaylistCollectionPluginBaseTests.FullyCustom>( value: plugin, customFilter: NoInnerOrSources, typesToExclude: new[] { typeof(IAsyncDisposable), typeof(IPlayableCollectionItem) }); } [TestMethod] public void NotBlockingSearchResults() { var plugins = new Sdk.Plugins.Model.SdkModelPlugin(SdkTestPluginMetadata.Metadata); plugins.PlaylistCollection.Add(x => new PlaylistCollectionPluginBaseTests.FullyCustom(x)); plugins.SearchResults.Add(x => new SearchResultsPluginBaseTests.FullyCustom(x)); var plugin = StrixMusic.Sdk.Plugins.Model.GlobalModelPluginConnector.Create(plugins).SearchResults.Execute(new SearchResultsPluginBaseTests.Unimplemented()); // Ensure an SearchResults plugin can still be accessed through PlaylistCollection members. Helpers.AssertAllMembersThrowOnAccess, PlaylistCollectionPluginBaseTests.FullyCustom>( value: plugin, customFilter: NoInnerOrSources, typesToExclude: typeof(IAsyncDisposable)); } [TestMethod] public void DisposingSearchResults() { var plugins = new Sdk.Plugins.Model.SdkModelPlugin(SdkTestPluginMetadata.Metadata); plugins.PlaylistCollection.Add(x => new PlaylistCollectionPluginBaseTests.FullyCustom(x)); var plugin = StrixMusic.Sdk.Plugins.Model.GlobalModelPluginConnector.Create(plugins).SearchResults.Execute(new SearchResultsPluginBaseTests.Unimplemented()); Helpers.AssertAllThrowsOnMemberAccess(value: plugin, expectedExceptions: new[] { typeof(AccessedException), typeof(AccessedException), }); } } }