public async Task Scan_No_StartingPath_Throws_ArgumentException()
 {
     var scanner = new DefaultAssemblyScanner((s) => null, () => null);
     await Assert.ThrowsExceptionAsync <ArgumentException>(() => scanner.Scan(new AssemblyScannerOptions
     {
         PluginType = typeof(ITestPlugin)
     }));
 }
 public async Task Scan_No_PluginType_Throws_ArgumentException()
 {
     var scanner = new DefaultAssemblyScanner((s) => null, () => null);
     await Assert.ThrowsExceptionAsync <ArgumentException>(() => scanner.Scan(new AssemblyScannerOptions
     {
         StartingPath = "/home/maarten"
     }));
 }
 public async Task Scan_Unrooted_Path_Throws_AssemblyScanningException()
 {
     var scanner = new DefaultAssemblyScanner((s) => null, () => null);
     await Assert.ThrowsExceptionAsync <AssemblyScanningException>(() => scanner.Scan(new AssemblyScannerOptions
     {
         StartingPath = "../home/maarten",
         PluginType   = typeof(ITestPlugin)
     }));
 }
        public async Task Scan_Succeeds()
        {
            var startingPath        = "/home/maarten";
            var metadataLoadContext = this.mockRepository.Create <IMetadataLoadContext>();
            var assemblyShim        = this.mockRepository.Create <IAssemblyShim>();
            var directoryTraverser  = this.mockRepository.Create <IDirectoryTraverser>();

            directoryTraverser.Setup(d => d.TraverseDirectories(startingPath)).Returns(new[] { "pathy/mcpathface" });
            directoryTraverser.Setup(d => d.TraverseFiles(It.IsAny <string>(), It.IsAny <IEnumerable <string> >())).Returns(new[] { "filey.mcfile.face" });

            var contract = TestableTypeBuilder.New()
                           .WithName("IMyTestType")
                           .WithNamespace("Test.Type")
                           .Build();

            var pluginAttributeTypedValue = new CustomAttributeTypedArgument(contract);
            var pluginAttribute           = new TestableAttribute
            {
                _AttributeType  = typeof(Prise.Plugin.PluginAttribute),
                _NamedArguments = new[] { new CustomAttributeNamedArgument(new TestableMemberInfo {
                        _Name = "PluginType"
                    }, pluginAttributeTypedValue) }
            };

            var testableType = TestableTypeBuilder.New()
                               .WithCustomAttributes(pluginAttribute)
                               .WithName("MyTestType")
                               .WithNamespace("Test.Type")
                               .Build();

            assemblyShim.Setup(a => a.Types).Returns(new[] { testableType });

            metadataLoadContext.Setup(c => c.LoadFromAssemblyName(It.IsAny <string>())).Returns(assemblyShim.Object);

            var scanner = new DefaultAssemblyScanner(
                (s) => metadataLoadContext.Object,
                () => directoryTraverser.Object
                );
            var types = await scanner.Scan(new AssemblyScannerOptions
            {
                StartingPath = startingPath,
                PluginType   = contract
            });

            var result = types.FirstOrDefault();

            Assert.IsNotNull(result);
            Assert.AreEqual("MyTestType", result.PluginType.Name);
            Assert.AreEqual("Test.Type", result.PluginType.Namespace);
        }
 public async Task Scan_No_Options_Throws_ArgumentNullException()
 {
     var scanner = new DefaultAssemblyScanner((s) => null, () => null);
     await Assert.ThrowsExceptionAsync <ArgumentNullException>(() => scanner.Scan(null));
 }