private IScanner CreateScanner(IConfigItem config)
        {
            IScanPreprocessor      preprocessor = CreateScanPreprocessor();
            IHashProvider <string> hashProvider = CreateHashProvider();

            string scannerNamespace = typeof(IScanner).Namespace;

            Type[] scannerTypes = config.Scanners
                                  .Select(scannerName => $"{scannerNamespace}.{scannerName}Scanner")
                                  .Select(scannerType => Type.GetType(scannerType))
                                  .ToArray();

            IScanner[] scanners = scannerTypes
                                  .Select(scannerType => (IScanner)Activator.CreateInstance(scannerType, config, preprocessor, hashProvider))
                                  .ToArray();

            if (scanners.Length > 1)
            {
                CompositeScanner compositeScanner = new CompositeScanner();

                foreach (IScanner scanner in scanners)
                {
                    compositeScanner.AddScanner(scanner);
                }

                return(compositeScanner);
            }

            if (scanners.Length == 1)
            {
                return(scanners.First());
            }

            throw new ArgumentOutOfRangeException(nameof(config.Scanners));
        }
        public void ScanTest(IScanner[] scanners, ScanResult[] expectedResult)
        {
            CompositeScanner compositeScanner = new CompositeScanner();

            foreach (IScanner scanner in scanners)
            {
                compositeScanner.AddScanner(scanner);
            }

            compositeScanner.Scan();

            IReadOnlyCollection <ScanResult> results = compositeScanner.GetResult();

            results.ShouldAllBeEquivalentTo(expectedResult);
        }
        public void AppendLineTest(IScanner[] scanners, string line)
        {
            CompositeScanner compositeScanner = new CompositeScanner();

            foreach (IScanner scanner in scanners)
            {
                compositeScanner.AddScanner(scanner);
            }

            compositeScanner.AppendLine(line);

            foreach (IScanner scanner in scanners)
            {
                scanner.Received(1).AppendLine(line);
            }
        }
示例#4
0
        public void CanScanComposite()
        {
            var         alice   = new Script(OpcodeType.OP_RETURN).Hash;
            var         bob     = new Key().PubKey.Hash;
            var         satoshi = new Key().PubKey.Hash;
            Transaction tx      = new Transaction();

            tx.Outputs.Add(new TxOut(Money.Parse("1.5"), alice));
            tx.Outputs.Add(new TxOut(Money.Parse("2.0"), bob));
            tx.Outputs.Add(new TxOut(Money.Parse("0.9"), satoshi));
            tx.Outputs.Add(new TxOut(Money.Parse("0.5"), bob));
            var scanner = new CompositeScanner()
            {
                Scanners =
                {
                    new ScriptHashScanner(alice),
                    new PubKeyHashScanner(bob)
                }
            };
            var coins = scanner.ScanCoins(tx, 0);

            Assert.NotNull(coins);
            Assert.Equal(Money.Parse("4.0"), coins.Value);
        }