public Task When_a_road_segment_was_imported()
        {
            var geometry       = _fixture.Create <MultiLineString>();
            var european_roads = _fixture.CreateMany <ImportedRoadSegmentEuropeanRoadAttributes>().ToArray();
            var numbered_roads = _fixture.CreateMany <ImportedRoadSegmentNumberedRoadAttributes>().ToArray();
            var national_roads = _fixture.CreateMany <ImportedRoadSegmentNationalRoadAttributes>().ToArray();
            var lanes          = _fixture.CreateMany <ImportedRoadSegmentLaneAttributes>().ToArray();
            var widths         = _fixture.CreateMany <ImportedRoadSegmentWidthAttributes>().ToArray();
            var hardenings     = _fixture.CreateMany <ImportedRoadSegmentSurfaceAttributes>().ToArray();
            var content        = new PolyLineMShapeContent(Be.Vlaanderen.Basisregisters.Shaperon.Geometries.GeometryTranslator.FromGeometryMultiLineString(geometry));

            return(new RoadRegistry.Product.Projections.RoadNetworkInfoProjection()
                   .Scenario()
                   .Given(
                       new BeganRoadNetworkImport(),
                       new ImportedRoadSegment
            {
                Id = _fixture.Create <int>(),
                StartNodeId = _fixture.Create <int>(),
                EndNodeId = _fixture.Create <int>(),
                Geometry = GeometryTranslator.Translate(geometry),
                GeometryVersion = _fixture.Create <int>(),
                MaintenanceAuthority = _fixture.Create <MaintenanceAuthority>(),
                GeometryDrawMethod = _fixture.Create <RoadSegmentGeometryDrawMethod>(),
                Morphology = _fixture.Create <RoadSegmentMorphology>(),
                Status = _fixture.Create <RoadSegmentStatus>(),
                Category = _fixture.Create <RoadSegmentCategory>(),
                AccessRestriction = _fixture.Create <RoadSegmentAccessRestriction>(),
                LeftSide = _fixture.Create <ImportedRoadSegmentSideAttributes>(),
                RightSide = _fixture.Create <ImportedRoadSegmentSideAttributes>(),
                PartOfEuropeanRoads = european_roads,
                PartOfNationalRoads = national_roads,
                PartOfNumberedRoads = numbered_roads,
                Lanes = lanes,
                Widths = widths,
                Surfaces = hardenings,
                Version = _fixture.Create <int>(),
                RecordingDate = _fixture.Create <DateTime>(),
                Origin = _fixture.Create <ImportedOriginProperties>()
            }
                       )
                   .Expect(
                       new RoadNetworkInfo {
                Id = 0,
                CompletedImport = false,
                OrganizationCount = 0,
                RoadNodeCount = 0,
                TotalRoadNodeShapeLength = 0,
                RoadSegmentCount = 1,
                RoadSegmentSurfaceAttributeCount = hardenings.Length,
                RoadSegmentLaneAttributeCount = lanes.Length,
                RoadSegmentWidthAttributeCount = widths.Length,
                RoadSegmentEuropeanRoadAttributeCount = european_roads.Length,
                RoadSegmentNationalRoadAttributeCount = national_roads.Length,
                RoadSegmentNumberedRoadAttributeCount = numbered_roads.Length,
                TotalRoadSegmentShapeLength = ShapeRecord.HeaderLength.Plus(content.ContentLength).ToInt32(),
                GradeSeparatedJunctionCount = 0
            }
                       ));
        }
        public Task When_road_segments_are_imported()
        {
            var random = new Random();
            var data   = _fixture
                         .CreateMany <ImportedRoadSegment>(random.Next(1, 10))
                         .Select(importedRoadSegment =>
            {
                var geometry = GeometryTranslator.Translate(importedRoadSegment.Geometry);
                var polyLineMShapeContent = new PolyLineMShapeContent(Be.Vlaanderen.Basisregisters.Shaperon.Geometries.GeometryTranslator.FromGeometryMultiLineString(geometry));

                var expected = new RoadSegmentRecord
                {
                    Id = importedRoadSegment.Id,
                    ShapeRecordContent       = polyLineMShapeContent.ToBytes(_services.MemoryStreamManager, Encoding.UTF8),
                    ShapeRecordContentLength = polyLineMShapeContent.ContentLength.ToInt32(),
                    BoundingBox = RoadSegmentBoundingBox.From(polyLineMShapeContent.Shape),
                    DbaseRecord = new RoadSegmentDbaseRecord
                    {
                        WS_OIDN   = { Value = importedRoadSegment.Id },
                        WS_UIDN   = { Value = importedRoadSegment.Id + "_" + importedRoadSegment.Version },
                        WS_GIDN   = { Value = importedRoadSegment.Id + "_" + importedRoadSegment.GeometryVersion },
                        B_WK_OIDN = { Value = importedRoadSegment.StartNodeId },
                        E_WK_OIDN = { Value = importedRoadSegment.EndNodeId },
                        STATUS    = { Value = RoadSegmentStatus.Parse(importedRoadSegment.Status).Translation.Identifier },
                        LBLSTATUS = { Value = RoadSegmentStatus.Parse(importedRoadSegment.Status).Translation.Name },
                        MORF      = { Value = RoadSegmentMorphology.Parse(importedRoadSegment.Morphology).Translation.Identifier },
                        LBLMORF   = { Value = RoadSegmentMorphology.Parse(importedRoadSegment.Morphology).Translation.Name },
                        WEGCAT    = { Value = RoadSegmentCategory.Parse(importedRoadSegment.Category).Translation.Identifier },
                        LBLWEGCAT = { Value = RoadSegmentCategory.Parse(importedRoadSegment.Category).Translation.Name },
                        LSTRNMID  = { Value = importedRoadSegment.LeftSide.StreetNameId },
                        LSTRNM    = { Value = importedRoadSegment.LeftSide.StreetName },
                        RSTRNMID  = { Value = importedRoadSegment.RightSide.StreetNameId },
                        RSTRNM    = { Value = importedRoadSegment.RightSide.StreetName },
                        BEHEER    = { Value = importedRoadSegment.MaintenanceAuthority.Code },
                        LBLBEHEER = { Value = importedRoadSegment.MaintenanceAuthority.Name },
                        METHODE   = { Value = RoadSegmentGeometryDrawMethod.Parse(importedRoadSegment.GeometryDrawMethod).Translation.Identifier },
                        LBLMETHOD = { Value = RoadSegmentGeometryDrawMethod.Parse(importedRoadSegment.GeometryDrawMethod).Translation.Name },
                        OPNDATUM  = { Value = importedRoadSegment.RecordingDate },
                        BEGINTIJD = { Value = importedRoadSegment.Origin.Since },
                        BEGINORG  = { Value = importedRoadSegment.Origin.OrganizationId },
                        LBLBGNORG = { Value = importedRoadSegment.Origin.Organization },
                        TGBEP     = { Value = RoadSegmentAccessRestriction.Parse(importedRoadSegment.AccessRestriction).Translation.Identifier },
                        LBLTGBEP  = { Value = RoadSegmentAccessRestriction.Parse(importedRoadSegment.AccessRestriction).Translation.Name }
                    }.ToBytes(_services.MemoryStreamManager, Encoding.UTF8)
                };
                return(new { importedRoadSegment, expected });
            }).ToList();

            return(new RoadRegistry.Product.Projections.RoadSegmentRecordProjection(_services.MemoryStreamManager, Encoding.UTF8)
                   .Scenario()
                   .Given(data.Select(d => d.importedRoadSegment))
                   .Expect(data.Select(d => d.expected)));
        }
        public Task When_road_nodes_were_imported()
        {
            var imported_nodes = Enumerable
                                 .Range(0, new Random().Next(10))
                                 .Select(index => new ImportedRoadNode
            {
                Id       = _fixture.Create <int>(),
                Type     = _fixture.Create <RoadNodeType>(),
                Geometry = GeometryTranslator.Translate(_fixture.Create <NetTopologySuite.Geometries.Point>()),
                Origin   = _fixture.Create <ImportedOriginProperties>()
            })
                                 .ToArray();
            var givens = Array.ConvertAll(imported_nodes, imported => (object)imported);

            return(new RoadRegistry.Product.Projections.RoadNetworkInfoProjection()
                   .Scenario()
                   .Given(
                       new BeganRoadNetworkImport()
                       )
                   .Given(givens)
                   .Expect(
                       new RoadNetworkInfo
            {
                Id = 0,
                CompletedImport = false,
                OrganizationCount = 0,
                RoadNodeCount = imported_nodes.Length,
                TotalRoadNodeShapeLength = imported_nodes.Aggregate(
                    new WordLength(0),
                    (current, imported) =>
                    current
                    .Plus(
                        new PointShapeContent(Be.Vlaanderen.Basisregisters.Shaperon.Geometries.GeometryTranslator.FromGeometryPoint(GeometryTranslator.Translate(imported.Geometry)))
                        .ContentLength
                        .Plus(ShapeRecord.HeaderLength))
                    ).ToInt32(),
                RoadSegmentCount = 0,
                RoadSegmentSurfaceAttributeCount = 0,
                RoadSegmentLaneAttributeCount = 0,
                RoadSegmentWidthAttributeCount = 0,
                RoadSegmentEuropeanRoadAttributeCount = 0,
                RoadSegmentNationalRoadAttributeCount = 0,
                RoadSegmentNumberedRoadAttributeCount = 0,
                TotalRoadSegmentShapeLength = 0,
                GradeSeparatedJunctionCount = 0
            }
                       ));
        }
        public Task When_road_nodes_were_imported()
        {
            var data = _fixture
                       .CreateMany <ImportedRoadNode>(new Random().Next(1, 100))
                       .Select(@event =>
            {
                var point             = GeometryTranslator.Translate(@event.Geometry);
                var pointShapeContent = new PointShapeContent(
                    Be.Vlaanderen.Basisregisters.Shaperon.Geometries.GeometryTranslator.FromGeometryPoint(
                        new NetTopologySuite.Geometries.Point(point.X, point.Y)
                        )
                    );
                var expectedRecord = new RoadNodeRecord
                {
                    Id          = @event.Id,
                    DbaseRecord = new RoadNodeDbaseRecord
                    {
                        WK_OIDN = { Value = @event.Id },
                        WK_UIDN = { Value = @event.Id + "_" + @event.Version },
                        TYPE    = { Value = RoadNodeType.Parse(@event.Type).Translation.Identifier },
                        LBLTYPE =
                        {
                            Value = RoadNodeType.Parse(@event.Type).Translation.Name
                        },
                        BEGINTIJD = { Value = @event.Origin.Since },
                        BEGINORG  = { Value = @event.Origin.OrganizationId },
                        LBLBGNORG = { Value = @event.Origin.Organization }
                    }.ToBytes(_services.MemoryStreamManager, Encoding.UTF8),
                    ShapeRecordContent       = pointShapeContent.ToBytes(_services.MemoryStreamManager, Encoding.UTF8),
                    ShapeRecordContentLength = pointShapeContent.ContentLength.ToInt32(),
                    BoundingBox = RoadNodeBoundingBox.From(pointShapeContent.Shape)
                };

                return(new
                {
                    ImportedRoadNode = @event,
                    ExpectedRecord = expectedRecord
                });
            }).ToList();

            return(new RoadRegistry.Product.Projections.RoadNodeRecordProjection(new RecyclableMemoryStreamManager(), Encoding.UTF8)
                   .Scenario()
                   .Given(data.Select(d => d.ImportedRoadNode))
                   .Expect(data.Select(d => d.ExpectedRecord)));
        }
        public Task When_a_road_node_was_imported()
        {
            var geometry = _fixture.Create <NetTopologySuite.Geometries.Point>();

            return(new RoadRegistry.Product.Projections.RoadNetworkInfoProjection()
                   .Scenario()
                   .Given(
                       new BeganRoadNetworkImport(),
                       new ImportedRoadNode
            {
                Id = _fixture.Create <int>(),
                Type = _fixture.Create <RoadNodeType>(),
                Geometry = GeometryTranslator.Translate(geometry),
                Origin = _fixture.Create <ImportedOriginProperties>()
            }
                       )
                   .Expect(
                       new RoadNetworkInfo
            {
                Id = 0,
                CompletedImport = false,
                OrganizationCount = 0,
                RoadNodeCount = 1,
                TotalRoadNodeShapeLength = ShapeRecord.HeaderLength
                                           .Plus(new PointShapeContent(Be.Vlaanderen.Basisregisters.Shaperon.Geometries.GeometryTranslator.FromGeometryPoint(geometry)).ContentLength).ToInt32(),
                RoadSegmentCount = 0,
                RoadSegmentSurfaceAttributeCount = 0,
                RoadSegmentLaneAttributeCount = 0,
                RoadSegmentWidthAttributeCount = 0,
                RoadSegmentEuropeanRoadAttributeCount = 0,
                RoadSegmentNationalRoadAttributeCount = 0,
                RoadSegmentNumberedRoadAttributeCount = 0,
                TotalRoadSegmentShapeLength = 0,
                GradeSeparatedJunctionCount = 0
            }
                       ));
        }
        public Task When_road_segments_were_imported()
        {
            var imported_segments = Enumerable
                                    .Range(0, new Random().Next(10))
                                    .Select(index => new ImportedRoadSegment
            {
                Id                   = _fixture.Create <int>(),
                StartNodeId          = _fixture.Create <int>(),
                EndNodeId            = _fixture.Create <int>(),
                Geometry             = GeometryTranslator.Translate(_fixture.Create <MultiLineString>()),
                GeometryVersion      = _fixture.Create <int>(),
                MaintenanceAuthority = _fixture.Create <MaintenanceAuthority>(),
                GeometryDrawMethod   = _fixture.Create <RoadSegmentGeometryDrawMethod>(),
                Morphology           = _fixture.Create <RoadSegmentMorphology>(),
                Status               = _fixture.Create <RoadSegmentStatus>(),
                Category             = _fixture.Create <RoadSegmentCategory>(),
                AccessRestriction    = _fixture.Create <RoadSegmentAccessRestriction>(),
                LeftSide             = _fixture.Create <ImportedRoadSegmentSideAttributes>(),
                RightSide            = _fixture.Create <ImportedRoadSegmentSideAttributes>(),
                PartOfEuropeanRoads  = _fixture.CreateMany <ImportedRoadSegmentEuropeanRoadAttributes>().ToArray(),
                PartOfNationalRoads  = _fixture.CreateMany <ImportedRoadSegmentNationalRoadAttributes>().ToArray(),
                PartOfNumberedRoads  = _fixture.CreateMany <ImportedRoadSegmentNumberedRoadAttributes>().ToArray(),
                Lanes                = _fixture.CreateMany <ImportedRoadSegmentLaneAttributes>().ToArray(),
                Widths               = _fixture.CreateMany <ImportedRoadSegmentWidthAttributes>().ToArray(),
                Surfaces             = _fixture.CreateMany <ImportedRoadSegmentSurfaceAttributes>().ToArray(),
                Version              = _fixture.Create <int>(),
                RecordingDate        = _fixture.Create <DateTime>(),
                Origin               = _fixture.Create <ImportedOriginProperties>()
            })
                                    .ToArray();
            var givens = Array.ConvertAll(imported_segments, imported => (object)imported);
            var reader = new WellKnownBinaryReader();

            return(new RoadRegistry.Product.Projections.RoadNetworkInfoProjection()
                   .Scenario()
                   .Given(
                       new BeganRoadNetworkImport()
                       )
                   .Given(givens)
                   .Expect(
                       new RoadNetworkInfo
            {
                Id = 0,
                CompletedImport = false,
                OrganizationCount = 0,
                RoadNodeCount = 0,
                TotalRoadNodeShapeLength = 0,
                RoadSegmentCount = imported_segments.Length,
                RoadSegmentSurfaceAttributeCount = imported_segments.Aggregate(0,
                                                                               (current, imported) => current + imported.Surfaces.Length),
                RoadSegmentLaneAttributeCount = imported_segments.Aggregate(0,
                                                                            (current, imported) => current + imported.Lanes.Length),
                RoadSegmentWidthAttributeCount = imported_segments.Aggregate(0,
                                                                             (current, imported) => current + imported.Widths.Length),
                RoadSegmentEuropeanRoadAttributeCount = imported_segments.Aggregate(0,
                                                                                    (current, imported) => current + imported.PartOfEuropeanRoads.Length),
                RoadSegmentNationalRoadAttributeCount = imported_segments.Aggregate(0,
                                                                                    (current, imported) => current + imported.PartOfNationalRoads.Length),
                RoadSegmentNumberedRoadAttributeCount = imported_segments.Aggregate(0,
                                                                                    (current, imported) => current + imported.PartOfNumberedRoads.Length),
                TotalRoadSegmentShapeLength = imported_segments.Aggregate(new WordLength(0),
                                                                          (current, imported) => current
                                                                          .Plus(
                                                                              new PolyLineMShapeContent(
                                                                                  Be.Vlaanderen.Basisregisters.Shaperon.Geometries.GeometryTranslator.FromGeometryMultiLineString(
                                                                                      GeometryTranslator.Translate(imported.Geometry)
                                                                                      )
                                                                                  )
                                                                              .ContentLength
                                                                              .Plus(ShapeRecord.HeaderLength)
                                                                              )
                                                                          )
                                              .ToInt32(),
                GradeSeparatedJunctionCount = 0
            }
                       ));
        }