Skip to content

File test_las_point.cpp

File List > las > tests > test_las_point.cpp

Go to the documentation of this file

#include <gtest/gtest.h>

#include <sstream>

#include "las/las_point.hpp"

// =============================================================================
// LASClassification tests
// =============================================================================

TEST(LASClassification, Values) {
  EXPECT_EQ(static_cast<uint8_t>(LASClassification::CreatedNeverClassified), 0);
  EXPECT_EQ(static_cast<uint8_t>(LASClassification::Unclassified), 1);
  EXPECT_EQ(static_cast<uint8_t>(LASClassification::Ground), 2);
  EXPECT_EQ(static_cast<uint8_t>(LASClassification::LowVegetation), 3);
  EXPECT_EQ(static_cast<uint8_t>(LASClassification::MediumVegetation), 4);
  EXPECT_EQ(static_cast<uint8_t>(LASClassification::HighVegetation), 5);
  EXPECT_EQ(static_cast<uint8_t>(LASClassification::Building), 6);
  EXPECT_EQ(static_cast<uint8_t>(LASClassification::LowPoint), 7);
  EXPECT_EQ(static_cast<uint8_t>(LASClassification::ModelKeyPoint), 8);
  EXPECT_EQ(static_cast<uint8_t>(LASClassification::Water), 9);
}

TEST(LASClassification, StreamOutput) {
  std::ostringstream os;
  os << LASClassification::Ground;
  EXPECT_EQ(os.str(), "Ground");

  os.str("");
  os << LASClassification::HighVegetation;
  EXPECT_EQ(os.str(), "HighVegetation");

  os.str("");
  os << LASClassification::Building;
  EXPECT_EQ(os.str(), "Building");

  os.str("");
  os << LASClassification::Water;
  EXPECT_EQ(os.str(), "Water");
}

// =============================================================================
// LASPoint tests
// =============================================================================

TEST(LASPoint, Construction) {
  LASPoint p(100.5, 200.3, 50.7, 1000, LASClassification::Ground);
  EXPECT_DOUBLE_EQ(p.x(), 100.5);
  EXPECT_DOUBLE_EQ(p.y(), 200.3);
  EXPECT_DOUBLE_EQ(p.z(), 50.7);
  EXPECT_EQ(p.intensity(), 1000);
  EXPECT_EQ(p.classification(), LASClassification::Ground);
}

TEST(LASPoint, DefaultConstruction) {
  LASPoint p;
  // Should not crash
  (void)p;
}

TEST(LASPoint, MutableAccessors) {
  LASPoint p(0, 0, 0, 0, LASClassification::Unclassified);
  p.x() = 10.0;
  p.y() = 20.0;
  p.z() = 30.0;
  p.intensity() = 500;
  p.classification() = LASClassification::HighVegetation;

  EXPECT_DOUBLE_EQ(p.x(), 10.0);
  EXPECT_DOUBLE_EQ(p.y(), 20.0);
  EXPECT_DOUBLE_EQ(p.z(), 30.0);
  EXPECT_EQ(p.intensity(), 500);
  EXPECT_EQ(p.classification(), LASClassification::HighVegetation);
}

TEST(LASPoint, InheritsCoordinate3D) {
  LASPoint p(1.0, 2.0, 3.0, 100, LASClassification::Ground);
  // LASPoint inherits from Coordinate3D<double> which inherits from Coordinate2D<double>
  // Test that coordinate operations work
  EXPECT_DOUBLE_EQ(p.x(), 1.0);
  EXPECT_DOUBLE_EQ(p.y(), 2.0);
  EXPECT_DOUBLE_EQ(p.z(), 3.0);

  // Test magnitude from Coordinate2D (only x,y)
  double mag = p.magnitude();
  EXPECT_NEAR(mag, std::sqrt(1.0 + 4.0), 1e-10);
}

TEST(LASPoint, StreamOutput) {
  LASPoint p(1.5, 2.5, 3.5, 42, LASClassification::Building);
  std::ostringstream os;
  os << p;
  std::string result = os.str();
  EXPECT_TRUE(result.find("LASPoint") != std::string::npos);
  EXPECT_TRUE(result.find("1.5") != std::string::npos);
  EXPECT_TRUE(result.find("2.5") != std::string::npos);
  EXPECT_TRUE(result.find("3.5") != std::string::npos);
}

TEST(LASPoint, AllClassifications) {
  // Ensure all classification values can be constructed
  LASClassification classes[] = {
      LASClassification::CreatedNeverClassified,
      LASClassification::Unclassified,
      LASClassification::Ground,
      LASClassification::LowVegetation,
      LASClassification::MediumVegetation,
      LASClassification::HighVegetation,
      LASClassification::Building,
      LASClassification::LowPoint,
      LASClassification::ModelKeyPoint,
      LASClassification::Water,
  };
  for (auto cls : classes) {
    LASPoint p(0, 0, 0, 0, cls);
    EXPECT_EQ(p.classification(), cls);
  }
}