public async Task Null_file_does_not_cause_error()
        {
            var jsonTreeWriter = new JsonTreeWriter(null, null);

            var people = await jsonTreeWriter.ReadAllAsync();

            Assert.Empty(people);
        }
        public async Task Error_is_indicated_when_people_are_not_found()
        {
            var jsonTreeWriter = new JsonTreeWriter(null, $@"Data\\Empty.json");
            var trees          = await jsonTreeWriter.ReadAllAsync();

            var treeStatistics = treeAnalyser.GenerateStatistics(trees);

            Assert.True(treeStatistics.PeopleNotFound);
        }
        public async Task Error_is_indicated_when_file_is_empty()
        {
            var jsonTreeWriter = new JsonTreeWriter(null, $@"Data\\Empty.json");
            var trees          = await jsonTreeWriter.ReadAllAsync();

            var treeStatistics = treeAnalyser.GenerateStatistics(trees);

            Assert.True(treeStatistics.TreesAreEmpty);
        }
        public async Task Error_is_indicated_when_file_does_not_exist()
        {
            var jsonTreeWriter = new JsonTreeWriter(null, $@"Data\\{System.Guid.NewGuid()}.json");
            var trees          = await jsonTreeWriter.ReadAllAsync();

            var treeStatistics = treeAnalyser.GenerateStatistics(trees);

            Assert.True(treeStatistics.TreesAreEmpty);
        }
        public async Task Empty_tree_results_in_non_null_stats()
        {
            var jsonTreeWriter = new JsonTreeWriter(null, string.Empty);
            var trees          = await jsonTreeWriter.ReadAllAsync();

            var treeStatistics = treeAnalyser.GenerateStatistics(trees);

            Assert.NotNull(treeStatistics);
        }
        public async Task Count_of_people_within_file_is_correct()
        {
            var jsonTreeWriter = new JsonTreeWriter(null, @"Data\\Processed tree.json");
            var trees          = await jsonTreeWriter.ReadAllAsync();

            var treeStatistics = treeAnalyser.GenerateStatistics(trees);

            Assert.Equal(282, treeStatistics.NumberOfPeople);
        }
        public async Task Statistics_can_be_generated_for_valid_file()
        {
            var jsonTreeWriter = new JsonTreeWriter(null, @"Data\\Processed tree.json");
            var trees          = await jsonTreeWriter.ReadAllAsync();

            var treeStatistics = treeAnalyser.GenerateStatistics(trees);

            Assert.NotNull(treeStatistics);
        }
Example #8
0
        public async Task Invalid_locations_raise_flag()
        {
            var jsonTreeWriter = new JsonTreeWriter(null, @"Data\\Processed tree.json");
            var trees          = await jsonTreeWriter.ReadAllAsync();

            var treeStatistics = treeAnalyser.GenerateStatistics(trees);

            Assert.True(treeStatistics.LocationIssuesExist);
        }
Example #9
0
        public static async Task Main(string[] args)
        {
            var configuration = ConfigureSettings.Build(args);

            serviceProvider = ConfigureDi.BuildDi(configuration);
            logger          = serviceProvider.GetService <ILogger <Program> >();

            try
            {
                logger.LogInformation("Starting");

                var configurationChecker = serviceProvider.GetRequiredService <ConfigurationChecker>();
                var configurationCheck   = configurationChecker.ConfigurationIsValid();
                if (configurationCheck.Errors.Any())
                {
                    logger.LogError("Configuration is invalid, stopping.");
                    return;
                }

                var argumentParser = serviceProvider.GetRequiredService <ArgumentParser>();
                var dataFiles      = argumentParser.ParseArgs(args);

                if (dataFiles.UnableToParseArguments)
                {
                    logger.LogError("Unable to parse command line, details follow.");
                    foreach (var message in dataFiles.Errors)
                    {
                        logger.LogCritical(message);
                    }
                }
                else
                {
                    var sawyerFactory = serviceProvider.GetRequiredService <SawyerFactory>();
                    var sawmill       = sawyerFactory.CreateCsvReaderWriter(dataFiles.Source.FullName, dataFiles.Destination.FullName);
                    await sawmill.ProcessTreeDataAsync();

                    // Output a bunch of stats on the tree we just processed.
                    var treeAnalyser   = serviceProvider.GetRequiredService <TreeAnalyser>();
                    var jsonTreeWriter = new JsonTreeWriter(null, dataFiles.Destination.FullName);
                    var trees          = await jsonTreeWriter.ReadAllAsync();

                    var treeStatistics      = treeAnalyser.GenerateStatistics(trees);
                    var consoleTreeReporter = serviceProvider.GetRequiredService <ConsoleTreeReporter>();

                    consoleTreeReporter.OutputToConsole(treeStatistics);
                }
            }
            catch (Exception ex)
            {
                logger.LogCritical(ex, "Unable to start application.");
                Console.WriteLine("Unable to start application.");
            }

            logger.LogInformation("Complete");
            Console.WriteLine("Press a key to exit.");
            Console.ReadKey();
        }
        public async Task Trees_can_be_written()
        {
            var csvTreeReader = new CsvTreeReader(RyansTreeCsv, null);
            var people        = await csvTreeReader.ReadAllAsync();

            var treeParser     = serviceProvider.GetRequiredService <TreeParser>();
            var trees          = treeParser.ParseListIntoTrees(people);
            var file           = new System.IO.FileInfo(Guid.NewGuid().ToString() + ".json");
            var jsonTreeWriter = new JsonTreeWriter(null, file.FullName);

            await jsonTreeWriter.WriteAllAsync(trees);

            Assert.True(file.Exists);
        }
        public Sawyer CreateCsvReaderWriter(string source, string destination)
        {
            var addressQualityChecker = serviceProvider.GetRequiredService <AddressQualityChecker>();
            var readerLogger          = serviceProvider.GetRequiredService <ILogger <CsvTreeReader> >();
            var reader       = new CsvTreeReader(source, readerLogger);
            var writerLogger = serviceProvider.GetRequiredService <ILogger <JsonTreeWriter> >();
            var writer       = new JsonTreeWriter(writerLogger, destination);

            var geocodeManager       = serviceProvider.GetRequiredService <IGeocodeManager>();
            var locationCacheFactory = serviceProvider.GetRequiredService <ILocationCacheFactory>();
            var logger     = serviceProvider.GetRequiredService <ILogger <Sawyer> >();
            var treeParser = serviceProvider.GetRequiredService <TreeParser>();

            return(new Sawyer(addressQualityChecker, geocodeManager, locationCacheFactory, logger, treeParser, reader, writer));
        }
        /// <summary>
        /// Creates an instance of <see cref="Sawyer"/> that is wired up to real I/O but the cache and geocoders are all fake I/O classes for unit testing.
        /// </summary>
        /// <returns></returns>
        public Sawyer CreateWithLocalIO(string source, string destination)
        {
            var addressQualityChecker = serviceProvider.GetRequiredService <AddressQualityChecker>();

            ReaderLogger = serviceProvider.GetRequiredService <FakeLogger <CsvTreeReader> >();
            var reader = new CsvTreeReader(source, ReaderLogger);

            WriterLogger = serviceProvider.GetRequiredService <FakeLogger <JsonTreeWriter> >();
            var writer = new JsonTreeWriter(WriterLogger, destination);

            GeocodeManager       = new FakeGeocodeManager();
            LocationCacheFactory = serviceProvider.GetRequiredService <FakeLocationCacheFactory>();
            TreeParser           = serviceProvider.GetRequiredService <TreeParser>();

            return(new Sawyer(addressQualityChecker, GeocodeManager, LocationCacheFactory, null, TreeParser, reader, writer));
        }
Example #13
0
        public async Task Date_breakdown_is_correct()
        {
            var jsonTreeWriter = new JsonTreeWriter(null, @"Data\\Processed tree.json");
            var trees          = await jsonTreeWriter.ReadAllAsync();

            var treeStatistics = treeAnalyser.GenerateStatistics(trees);

            Assert.Equal(193, treeStatistics.DateCountsByStatus.Single(d => d.Status == DateQualityStatus.Empty).Count);
            Assert.Equal(115, treeStatistics.DateCountsByStatus.Single(d => d.Status == DateQualityStatus.MonthIsAmbiguous).Count);
            Assert.Equal(0, treeStatistics.DateCountsByStatus.Single(d => d.Status == DateQualityStatus.NotSet).Count);
            Assert.Equal(0, treeStatistics.DateCountsByStatus.Single(d => d.Status == DateQualityStatus.NotValid).Count);
            Assert.Equal(256, treeStatistics.DateCountsByStatus.Single(d => d.Status == DateQualityStatus.OK).Count);
            Assert.Equal(0, treeStatistics.DateCountsByStatus.Single(d => d.Status == DateQualityStatus.OnlyMonthIsPresent).Count);
            Assert.Equal(0, treeStatistics.DateCountsByStatus.Single(d => d.Status == DateQualityStatus.ThreePartsWithoutYear).Count);
            Assert.Equal(0, treeStatistics.DateCountsByStatus.Single(d => d.Status == DateQualityStatus.TooManyDateParts).Count);
            Assert.Equal(0, treeStatistics.DateCountsByStatus.Single(d => d.Status == DateQualityStatus.YearInMiddle).Count);
        }
Example #14
0
        public async Task Location_breakdown_is_correct()
        {
            var jsonTreeWriter = new JsonTreeWriter(null, @"Data\\Processed tree.json");
            var trees          = await jsonTreeWriter.ReadAllAsync();

            var treeStatistics = treeAnalyser.GenerateStatistics(trees);

            Assert.Equal(0, treeStatistics.LocationCountsByStatus.Single(d => d.Status == Models.SawmillStatus.AllNumeric).Count);
            Assert.Equal(330, treeStatistics.LocationCountsByStatus.Single(d => d.Status == Models.SawmillStatus.Geocoded).Count);
            Assert.Equal(134, treeStatistics.LocationCountsByStatus.Single(d => d.Status == Models.SawmillStatus.KnownErroneous).Count);
            Assert.Equal(0, treeStatistics.LocationCountsByStatus.Single(d => d.Status == Models.SawmillStatus.RequiresGeocoding).Count);
            Assert.Equal(0, treeStatistics.LocationCountsByStatus.Single(d => d.Status == Models.SawmillStatus.RequiresLookup).Count);
            Assert.Equal(0, treeStatistics.LocationCountsByStatus.Single(d => d.Status == Models.SawmillStatus.RequiresUserIntervention).Count);
            Assert.Equal(0, treeStatistics.LocationCountsByStatus.Single(d => d.Status == Models.SawmillStatus.SeemsToBeADate).Count);
            Assert.Equal(100, treeStatistics.LocationCountsByStatus.Single(d => d.Status == Models.SawmillStatus.SkippedAsEmpty).Count);
            Assert.Equal(0, treeStatistics.LocationCountsByStatus.Single(d => d.Status == Models.SawmillStatus.TemporaryGeocodeError).Count);
            Assert.Equal(0, treeStatistics.LocationCountsByStatus.Single(d => d.Status == Models.SawmillStatus.ZeroResults).Count);
        }