BaseItemKindTests.cs 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Reflection;
  7. using Jellyfin.Data.Enums;
  8. using Xunit;
  9. using Xunit.Sdk;
  10. namespace Jellyfin.Server.Implementations.Tests.BaseItem
  11. {
  12. public class BaseItemKindTests
  13. {
  14. [Theory]
  15. [ClassData(typeof(GetBaseItemDescendant))]
  16. public void BaseItemKindEnumTest(Type baseItemType)
  17. {
  18. var enumValue = Enum.Parse<BaseItemKind>(baseItemType.Name);
  19. Assert.True(Enum.IsDefined(typeof(BaseItemKind), enumValue));
  20. }
  21. [Theory]
  22. [ClassData(typeof(GetBaseItemDescendant))]
  23. public void GetBaseKindEnumTest(Type baseItemDescendantType)
  24. {
  25. var defaultConstructor = baseItemDescendantType.GetConstructor(Type.EmptyTypes);
  26. Assert.NotNull(defaultConstructor);
  27. if (defaultConstructor != null)
  28. {
  29. var instance = (MediaBrowser.Controller.Entities.BaseItem)defaultConstructor.Invoke(null);
  30. var exception = Record.Exception(() => instance.GetBaseItemKind());
  31. Assert.Null(exception);
  32. }
  33. }
  34. private class GetBaseItemDescendant : IEnumerable<object?[]>
  35. {
  36. private static bool IsProjectAssemblyName(string? name)
  37. {
  38. if (name == null)
  39. {
  40. return false;
  41. }
  42. return name.StartsWith("Jellyfin", StringComparison.OrdinalIgnoreCase)
  43. || name.StartsWith("Emby", StringComparison.OrdinalIgnoreCase)
  44. || name.StartsWith("MediaBrowser", StringComparison.OrdinalIgnoreCase)
  45. || name.StartsWith("RSSDP", StringComparison.OrdinalIgnoreCase);
  46. }
  47. public IEnumerator<object?[]> GetEnumerator()
  48. {
  49. var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();
  50. foreach (var assembly in loadedAssemblies)
  51. {
  52. if (IsProjectAssemblyName(assembly.FullName))
  53. {
  54. var baseItemTypes = assembly.GetTypes()
  55. .Where(targetType => targetType.IsClass
  56. && !targetType.IsAbstract
  57. && targetType.IsSubclassOf(typeof(MediaBrowser.Controller.Entities.BaseItem)));
  58. foreach (var baseItemType in baseItemTypes)
  59. {
  60. yield return new object?[] { baseItemType };
  61. }
  62. }
  63. }
  64. var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
  65. if (path == null)
  66. {
  67. throw new NullException("Assembly location is null");
  68. }
  69. foreach (string dll in Directory.GetFiles(path, "*.dll"))
  70. {
  71. var assembly = Assembly.LoadFile(dll);
  72. if (IsProjectAssemblyName(assembly.FullName))
  73. {
  74. var baseItemTypes = assembly.GetTypes()
  75. .Where(targetType => targetType.IsClass
  76. && !targetType.IsAbstract
  77. && targetType.IsSubclassOf(typeof(MediaBrowser.Controller.Entities.BaseItem)));
  78. foreach (var baseItemType in baseItemTypes)
  79. {
  80. yield return new object?[] { baseItemType };
  81. }
  82. }
  83. }
  84. }
  85. IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
  86. }
  87. }
  88. }