public void OpenFileAndGetHeaderTest()
        {
            using (LasFileReader reader = new LasFileReader("file://" + _fixture.CurrentLasFilePath))
            {
                LasPublicHeader header = reader.Header;

                Assert.AreEqual(AEGIS.IO.GeometryStreamFormats.Lasfile, reader.Format);
                Assert.AreEqual((UInt16)39, header.FileSourceId);
                Assert.AreEqual(GPSTimeType.Standard, header.GPSTimeType);
                Assert.False(header.IsWavePacketStorageInternal);
                Assert.False(header.IsWavePacketStorageExternal);
                Assert.True(header.IsReturnNumberOriginSynthetical);
                Assert.AreEqual(CRSType.WKT, header.CRSType);
                Assert.AreEqual((UInt32)81, header.ProjectId1);
                Assert.AreEqual((UInt16)50, header.ProjectId2);
                Assert.AreEqual((UInt16)12, header.ProjectId3);
                Assert.AreEqual((UInt64)974, header.ProjectId4);
                Assert.AreEqual((Byte)1, header.VersionMajor);
                Assert.AreEqual((Byte)4, header.VersionMinor);
                Assert.AreEqual("OTHER", header.SystemIdentifier);
                Assert.AreEqual("LasFileReaderUnitTests", header.GeneratingSoftware);
                Assert.AreEqual((UInt16)286, header.FileCreationDay);
                Assert.AreEqual((UInt16)2020, header.FileCreationYear);
                Assert.AreEqual((UInt16)375, header.PublicHeaderSize);
                Assert.AreEqual((UInt32)375, header.PointDataOffset);
                Assert.AreEqual((UInt32)0, header.VariableLengthRecordCount);
                Assert.AreEqual((Byte)7, header.PointDataFormat);
                Assert.AreEqual((UInt16)36, header.PointDataLength);
                Assert.AreEqual((UInt32)0, header.LegacyPointCount);

                for (var i = 0; i < 5; i++)
                {
                    Assert.AreEqual((UInt32)0, header.LegacyPointCountPerReturn[i]);
                }

                Assert.AreEqual((Double)0.01, header.ScaleFactorX);
                Assert.AreEqual((Double)0.05, header.ScaleFactorY);
                Assert.AreEqual((Double)0.10, header.ScaleFactorZ);
                Assert.AreEqual((Double)(-0.50), header.OffsetX);
                Assert.AreEqual((Double)0.00, header.OffsetY);
                Assert.AreEqual((Double)0.50, header.OffsetZ);
                Assert.AreEqual((Double)100, header.MaxX);
                Assert.AreEqual((Double)0, header.MinX);
                Assert.AreEqual((Double)101, header.MaxY);
                Assert.AreEqual((Double)1, header.MinY);
                Assert.AreEqual((Double)102, header.MaxZ);
                Assert.AreEqual((Double)2, header.MinZ);
                Assert.AreEqual((UInt64)0, header.WavePacketRecordOffset);
                Assert.AreEqual((UInt64)0, header.ExtendedVariableLengthRecordOffset);
                Assert.AreEqual((UInt32)0, header.ExtendedVariableLengthRecordCount);
                Assert.AreEqual((UInt64)5, header.PointCount);
                Assert.AreEqual((UInt64)3, header.PointCountPerReturn[0]);
                Assert.AreEqual((UInt64)2, header.PointCountPerReturn[1]);

                for (var i = 2; i < 15; i++)
                {
                    Assert.AreEqual((UInt64)0, header.PointCountPerReturn[i]);
                }
            }
        }
        public void OpenFileLegacyFormatAndGetHeader()
        {
            using (LasFileReader reader = new LasFileReader("file://" + _fixture.LegacyLasFilePath))
            {
                LasPublicHeader header = reader.Header;

                Assert.AreEqual((UInt32)81, header.ProjectId1);
                Assert.AreEqual((UInt16)50, header.ProjectId2);
                Assert.AreEqual((UInt16)12, header.ProjectId3);
                Assert.AreEqual((UInt64)974, header.ProjectId4);
                Assert.AreEqual((Byte)1, header.VersionMajor);
                Assert.AreEqual((Byte)0, header.VersionMinor);
                Assert.AreEqual("OTHER", header.SystemIdentifier);
                Assert.AreEqual("LasFileReaderUnitTests", header.GeneratingSoftware);
                Assert.AreEqual((UInt16)286, header.FileCreationDay);
                Assert.AreEqual((UInt16)2020, header.FileCreationYear);
                Assert.AreEqual((UInt16)227, header.PublicHeaderSize);
                Assert.AreEqual((UInt32)227, header.PointDataOffset);
                Assert.AreEqual((UInt32)0, header.VariableLengthRecordCount);
                Assert.AreEqual((Byte)0, header.PointDataFormat);
                Assert.AreEqual((UInt16)20, header.PointDataLength);
                Assert.AreEqual((UInt32)5, header.LegacyPointCount);
                Assert.AreEqual((UInt32)3, header.LegacyPointCountPerReturn[0]);
                Assert.AreEqual((UInt32)2, header.LegacyPointCountPerReturn[1]);

                for (var i = 2; i < 5; i++)
                {
                    Assert.AreEqual((UInt32)0, header.LegacyPointCountPerReturn[i]);
                }

                Assert.AreEqual((Double)0.01, header.ScaleFactorX);
                Assert.AreEqual((Double)0.05, header.ScaleFactorY);
                Assert.AreEqual((Double)0.10, header.ScaleFactorZ);
                Assert.AreEqual((Double)(-0.50), header.OffsetX);
                Assert.AreEqual((Double)0.00, header.OffsetY);
                Assert.AreEqual((Double)0.50, header.OffsetZ);
                Assert.AreEqual((Double)100, header.MaxX);
                Assert.AreEqual((Double)0, header.MinX);
                Assert.AreEqual((Double)101, header.MaxY);
                Assert.AreEqual((Double)1, header.MinY);
                Assert.AreEqual((Double)102, header.MaxZ);
                Assert.AreEqual((Double)2, header.MinZ);
                Assert.AreEqual((UInt64)0, header.WavePacketRecordOffset);
                Assert.AreEqual((UInt64)0, header.ExtendedVariableLengthRecordOffset);
                Assert.AreEqual((UInt32)0, header.ExtendedVariableLengthRecordCount);
                Assert.AreEqual((UInt64)5, header.PointCount);
                Assert.AreEqual((UInt64)3, header.PointCountPerReturn[0]);
                Assert.AreEqual((UInt64)2, header.PointCountPerReturn[1]);

                for (var i = 2; i < 15; i++)
                {
                    Assert.AreEqual((UInt64)0, header.PointCountPerReturn[i]);
                }
            }
        }
        public void OpenFileNotSupportedFormatTest()
        {
            Boolean result = false;

            try
            {
                LasFileReader reader = new LasFileReader("file://" + _fixture.NotLasFilePath);
            }
            catch (InvalidDataException)
            {
                result = true;
            }

            Assert.True(result);
        }
        public void OpenFileInUseTest()
        {
            using (File.OpenWrite(new Uri(_fixture.CurrentLasFilePath).AbsolutePath))
            {
                Boolean result = false;

                try
                {
                    LasFileReader reader = new LasFileReader("file://" + _fixture.CurrentLasFilePath);
                }
                catch (IOException)
                {
                    result = true;
                }

                Assert.True(result);
            }
        }
        public void ReadLegacyPointTest()
        {
            using (LasFileReader reader = new LasFileReader("file://" + _fixture.LegacyLasFilePath))
            {
                Assert.AreEqual((UInt64)0, reader.ReadedPointCount);
                Assert.AreEqual((UInt64)5, reader.TotalPointCount);
                Assert.False(reader.EndOfStream);

                // Point 1.

                LasPointFormat0 point = reader.Read() as LasPointFormat0;
                Assert.AreEqual((UInt64)1, reader.ReadedPointCount);
                Assert.AreEqual((UInt64)5, reader.TotalPointCount);
                Assert.False(reader.EndOfStream);

                Assert.NotNull(point);
                Assert.AreEqual((Double)0.50, point.X);
                Assert.AreEqual((Double)1.00, point.Y);
                Assert.AreEqual((Double)1.50, point.Z);
                Assert.AreEqual((UInt16)0, point.Intensity);
                Assert.AreEqual((Byte)1, point.ReturnNumber);
                Assert.AreEqual((Byte)2, point.TotalReturnNumber);
                Assert.True(point.IsSynthetic);
                Assert.True(point.IsKeyPoint);
                Assert.False(point.IsWithheld);
                Assert.True(point.IsScanDirectionPositive);
                Assert.False(point.IsFlightLineEdge);
                Assert.AreEqual((Byte)1, point.Classification);
                Assert.AreEqual((Byte)0, point.UserData);
                Assert.AreEqual((Int16)0, point.ScanAngle);
                Assert.AreEqual((UInt16)0, point.PointSourceId);

                // Point 2.

                point = reader.Read() as LasPointFormat0;
                Assert.AreEqual((UInt64)2, reader.ReadedPointCount);
                Assert.False(reader.EndOfStream);

                Assert.NotNull(point);
                Assert.AreEqual((Double)1.50, point.X);
                Assert.AreEqual((Double)2.00, point.Y);
                Assert.AreEqual((Double)2.50, point.Z);
                Assert.AreEqual((UInt16)0, point.Intensity);
                Assert.AreEqual((Byte)2, point.ReturnNumber);
                Assert.AreEqual((Byte)2, point.TotalReturnNumber);
                Assert.True(point.IsSynthetic);
                Assert.False(point.IsKeyPoint);
                Assert.False(point.IsWithheld);
                Assert.True(point.IsScanDirectionPositive);
                Assert.False(point.IsFlightLineEdge);
                Assert.AreEqual((Byte)2, point.Classification);
                Assert.AreEqual((Byte)0, point.UserData);
                Assert.AreEqual((Int16)0, point.ScanAngle);
                Assert.AreEqual((UInt16)0, point.PointSourceId);

                reader.Read();
                Assert.AreEqual((UInt64)3, reader.ReadedPointCount);
                Assert.False(reader.EndOfStream);

                reader.Read();
                Assert.AreEqual((UInt64)4, reader.ReadedPointCount);
                Assert.False(reader.EndOfStream);

                // Point 5.

                point = reader.Read() as LasPointFormat0;
                Assert.AreEqual((UInt64)5, reader.ReadedPointCount);
                Assert.True(reader.EndOfStream);

                Assert.NotNull(point);
                Assert.AreEqual((Double)4.50, point.X);
                Assert.AreEqual((Double)5.00, point.Y);
                Assert.AreEqual((Double)5.50, point.Z);
                Assert.AreEqual((UInt16)0, point.Intensity);
                Assert.AreEqual((Byte)1, point.ReturnNumber);
                Assert.AreEqual((Byte)1, point.TotalReturnNumber);
                Assert.True(point.IsSynthetic);
                Assert.False(point.IsKeyPoint);
                Assert.True(point.IsWithheld);
                Assert.True(point.IsScanDirectionPositive);
                Assert.True(point.IsFlightLineEdge);
                Assert.AreEqual((Byte)5, point.Classification);
                Assert.AreEqual((Byte)0, point.UserData);
                Assert.AreEqual((Int16)0, point.ScanAngle);
                Assert.AreEqual((UInt16)0, point.PointSourceId);

                Boolean result = false;

                try
                {
                    reader.Read();
                }
                catch (InvalidDataException)
                {
                    result = true;
                }

                Assert.True(result);
            }
        }
        public void ReadMultiplePointsTest()
        {
            using (LasFileReader reader = new LasFileReader("file://" + _fixture.CurrentLasFilePath))
            {
                Assert.AreEqual((UInt64)0, reader.ReadedPointCount);
                Assert.False(reader.EndOfStream);

                IList <IGeometry> points = reader.Read(2);
                Assert.AreEqual(2, points.Count);
                Assert.AreEqual((UInt64)2, reader.ReadedPointCount);
                Assert.False(reader.EndOfStream);

                LasPointFormat7 point = points[0] as LasPointFormat7;
                Assert.NotNull(point);
                Assert.AreEqual((Double)0.50, point.X);
                Assert.AreEqual((Double)1.00, point.Y);
                Assert.AreEqual((Double)1.50, point.Z);
                Assert.AreEqual((UInt16)0, point.Intensity);
                Assert.AreEqual((Byte)1, point.ReturnNumber);
                Assert.AreEqual((Byte)2, point.TotalReturnNumber);
                Assert.True(point.IsSynthetic);
                Assert.True(point.IsKeyPoint);
                Assert.False(point.IsWithheld);
                Assert.False(point.IsOverlap);
                Assert.AreEqual((Byte)0, point.ScannerChannel);
                Assert.True(point.IsScanDirectionPositive);
                Assert.False(point.IsFlightLineEdge);
                Assert.AreEqual((Byte)1, point.Classification);
                Assert.AreEqual((Byte)0, point.UserData);
                Assert.AreEqual((Int16)0, point.ScanAngle);
                Assert.AreEqual((UInt16)0, point.PointSourceId);
                Assert.AreEqual((Double)0, point.GPSTime);
                Assert.AreEqual((UInt16)1, point.RedChannel);
                Assert.AreEqual((UInt16)2, point.GreenChannel);
                Assert.AreEqual((UInt16)3, point.BlueChannel);

                points = reader.ReadToEnd();
                Assert.AreEqual(3, points.Count);
                Assert.AreEqual((UInt64)5, reader.ReadedPointCount);
                Assert.True(reader.EndOfStream);

                point = points[2] as LasPointFormat7;
                Assert.NotNull(point);
                Assert.AreEqual((Double)4.50, point.X);
                Assert.AreEqual((Double)5.00, point.Y);
                Assert.AreEqual((Double)5.50, point.Z);
                Assert.AreEqual((UInt16)0, point.Intensity);
                Assert.AreEqual((Byte)1, point.ReturnNumber);
                Assert.AreEqual((Byte)1, point.TotalReturnNumber);
                Assert.True(point.IsSynthetic);
                Assert.False(point.IsKeyPoint);
                Assert.True(point.IsWithheld);
                Assert.True(point.IsOverlap);
                Assert.AreEqual((Byte)1, point.ScannerChannel);
                Assert.True(point.IsScanDirectionPositive);
                Assert.True(point.IsFlightLineEdge);
                Assert.AreEqual((Byte)5, point.Classification);
                Assert.AreEqual((Byte)0, point.UserData);
                Assert.AreEqual((Int16)0, point.ScanAngle);
                Assert.AreEqual((UInt16)0, point.PointSourceId);
                Assert.AreEqual((Double)0, point.GPSTime);
                Assert.AreEqual((UInt16)1, point.RedChannel);
                Assert.AreEqual((UInt16)2, point.GreenChannel);
                Assert.AreEqual((UInt16)3, point.BlueChannel);
            }
        }
        public void OpenFileNotSupportedPointVersionAndReadTest()
        {
            using (LasFileReader reader = new LasFileReader("file://" + _fixture.FutureLasFilePath))
            {
                LasPublicHeader header = reader.Header;

                Assert.AreEqual((UInt16)39, header.FileSourceId);
                Assert.AreEqual(GPSTimeType.Week, header.GPSTimeType);
                Assert.False(header.IsWavePacketStorageInternal);
                Assert.True(header.IsWavePacketStorageExternal);
                Assert.True(header.IsReturnNumberOriginSynthetical);
                Assert.AreEqual(CRSType.GeoTIFF, header.CRSType);
                Assert.AreEqual((UInt32)81, header.ProjectId1);
                Assert.AreEqual((UInt16)50, header.ProjectId2);
                Assert.AreEqual((UInt16)12, header.ProjectId3);
                Assert.AreEqual((UInt64)974, header.ProjectId4);
                Assert.AreEqual((Byte)1, header.VersionMajor);
                Assert.AreEqual((Byte)5, header.VersionMinor);
                Assert.AreEqual("OTHER", header.SystemIdentifier);
                Assert.AreEqual("LasFileReaderUnitTests", header.GeneratingSoftware);
                Assert.AreEqual((UInt16)286, header.FileCreationDay);
                Assert.AreEqual((UInt16)2020, header.FileCreationYear);
                Assert.AreEqual((UInt16)376, header.PublicHeaderSize);
                Assert.AreEqual((UInt32)376, header.PointDataOffset);
                Assert.AreEqual((UInt32)0, header.VariableLengthRecordCount);
                Assert.AreEqual((Byte)11, header.PointDataFormat);
                Assert.AreEqual((UInt16)37, header.PointDataLength);
                Assert.AreEqual((UInt32)0, header.LegacyPointCount);

                for (var i = 0; i < 5; i++)
                {
                    Assert.AreEqual((UInt32)0, header.LegacyPointCountPerReturn[i]);
                }

                Assert.AreEqual((Double)0.01, header.ScaleFactorX);
                Assert.AreEqual((Double)0.05, header.ScaleFactorY);
                Assert.AreEqual((Double)0.10, header.ScaleFactorZ);
                Assert.AreEqual((Double)(-0.50), header.OffsetX);
                Assert.AreEqual((Double)0.00, header.OffsetY);
                Assert.AreEqual((Double)0.50, header.OffsetZ);
                Assert.AreEqual((Double)100, header.MaxX);
                Assert.AreEqual((Double)0, header.MinX);
                Assert.AreEqual((Double)101, header.MaxY);
                Assert.AreEqual((Double)1, header.MinY);
                Assert.AreEqual((Double)102, header.MaxZ);
                Assert.AreEqual((Double)2, header.MinZ);
                Assert.AreEqual((UInt64)0, header.WavePacketRecordOffset);
                Assert.AreEqual((UInt64)0, header.ExtendedVariableLengthRecordOffset);
                Assert.AreEqual((UInt32)0, header.ExtendedVariableLengthRecordCount);
                Assert.AreEqual((UInt64)5, header.PointCount);
                Assert.AreEqual((UInt64)3, header.PointCountPerReturn[0]);
                Assert.AreEqual((UInt64)2, header.PointCountPerReturn[1]);

                for (var i = 2; i < 15; i++)
                {
                    Assert.AreEqual((UInt64)0, header.PointCountPerReturn[i]);
                }

                Boolean result = false;

                try
                {
                    reader.Read();
                }
                catch (InvalidDataException)
                {
                    result = true;
                }

                Assert.True(result);
            }
        }