/src/UnitTests/IOC/Configuration/AssemblyContainerLoaderTests.cs

http://github.com/philiplaureano/LinFu · C# · 125 lines · 85 code · 28 blank · 12 comment · 0 complexity · 9312addc70cd3d3e7a9739c4584efaed MD5 · raw file

  1. using System;
  2. using LinFu.IoC.Configuration;
  3. using LinFu.IoC.Interfaces;
  4. using LinFu.Reflection;
  5. using Moq;
  6. using Xunit;
  7. using SampleLibrary;
  8. namespace LinFu.UnitTests.IOC.Configuration
  9. {
  10. public class AssemblyContainerLoaderTests : BaseTestFixture
  11. {
  12. protected override void Init()
  13. {
  14. _mockAssemblyLoader = new Mock<IAssemblyLoader>();
  15. _mockTypeExtractor = new Mock<ITypeExtractor>();
  16. _mockTypeLoader = new Mock<ITypeLoader>();
  17. }
  18. protected override void Term()
  19. {
  20. _mockAssemblyLoader.VerifyAll();
  21. _mockTypeExtractor.VerifyAll();
  22. _mockTypeLoader.VerifyAll();
  23. _mockAssemblyLoader = null;
  24. _mockTypeExtractor = null;
  25. _mockTypeLoader = null;
  26. }
  27. private Mock<IAssemblyLoader> _mockAssemblyLoader;
  28. private Mock<ITypeExtractor> _mockTypeExtractor;
  29. private Mock<ITypeLoader> _mockTypeLoader;
  30. [Fact]
  31. public void AssemblyContainerLoaderShouldCallAssemblyLoader()
  32. {
  33. var containerLoader = new AssemblyContainerLoader();
  34. // The container loader should use the assembly loader
  35. // to load the assembly
  36. var filename = "input.dll";
  37. _mockAssemblyLoader.Expect(loader => loader.Load(filename)).Returns(typeof(SampleClass).Assembly);
  38. containerLoader.AssemblyLoader = _mockAssemblyLoader.Object;
  39. containerLoader.Load(filename);
  40. }
  41. [Fact]
  42. public void AssemblyContainerLoaderShouldCallTypeExtractor()
  43. {
  44. var containerLoader = new AssemblyContainerLoader();
  45. var filename = "input.dll";
  46. var targetAssembly = typeof(SampleClass).Assembly;
  47. // Make sure that it calls the assembly loader
  48. _mockAssemblyLoader.Expect(loader => loader.Load(filename)).Returns(targetAssembly);
  49. // It must call the Type Extractor
  50. _mockTypeExtractor.Expect(extractor => extractor.GetTypes(targetAssembly))
  51. .Returns(new[] {typeof(SampleClass)});
  52. var assemblyActionLoader = new AssemblyActionLoader<IServiceContainer>(() => containerLoader.TypeLoaders);
  53. assemblyActionLoader.TypeExtractor = _mockTypeExtractor.Object;
  54. containerLoader.AssemblyLoader = _mockAssemblyLoader.Object;
  55. containerLoader.AssemblyActionLoader = assemblyActionLoader;
  56. containerLoader.Load(filename);
  57. }
  58. [Fact]
  59. public void AssemblyContainerLoaderShouldCallTypeLoader()
  60. {
  61. // HACK: The Cut&Paste is ugly, but it works
  62. var containerLoader = new AssemblyContainerLoader();
  63. var filename = "input.dll";
  64. var targetAssembly = typeof(SampleClass).Assembly;
  65. // Make sure that it calls the assembly loader
  66. _mockAssemblyLoader.Expect(loader => loader.Load(filename)).Returns(targetAssembly);
  67. // It must call the Type Extractor
  68. _mockTypeExtractor.Expect(extractor => extractor.GetTypes(targetAssembly))
  69. .Returns(new[] {typeof(SampleClass)});
  70. // Make sure that it calls the type loaders
  71. _mockTypeLoader.Expect(loader => loader.CanLoad(typeof(SampleClass))).Returns(true);
  72. _mockTypeLoader.Expect(loader => loader.Load(typeof(SampleClass)))
  73. .Returns(new Action<IServiceContainer>[0]);
  74. var assemblyActionLoader = new AssemblyActionLoader<IServiceContainer>(() => containerLoader.TypeLoaders);
  75. assemblyActionLoader.TypeExtractor = _mockTypeExtractor.Object;
  76. containerLoader.AssemblyLoader = _mockAssemblyLoader.Object;
  77. containerLoader.AssemblyActionLoader = assemblyActionLoader;
  78. // The container loader should call the type loader
  79. // once the load method is called
  80. containerLoader.TypeLoaders.Add(_mockTypeLoader.Object);
  81. containerLoader.Load(filename);
  82. }
  83. [Fact]
  84. public void AssemblyContainerLoaderShouldOnlyLoadDllFiles()
  85. {
  86. var mockTypeLoader = new Mock<ITypeLoader>();
  87. var containerLoader = new AssemblyContainerLoader();
  88. containerLoader.TypeLoaders.Add(mockTypeLoader.Object);
  89. // This should return true
  90. var validFile = typeof(AssemblyContainerLoaderTests).Assembly.Location;
  91. Assert.True(containerLoader.CanLoad(validFile));
  92. // This should return false;
  93. var invalidFile = "input.txt";
  94. Assert.False(containerLoader.CanLoad(invalidFile));
  95. }
  96. }
  97. }