{{>copyright comment="//"}}

#include <memory>

#include <sdk/lib/inspect/testing/cpp/zxtest/inspect.h>
#include <zxtest/zxtest.h>

#include "src/devices/testing/mock-ddk/mock-device.h"
#include "{{PROJECT_PATH}}/{{snake_case PROJECT_NAME}}.h"

namespace {{snake_case PROJECT_NAME}} {

using inspect::InspectTestHelper;

class {{pascal_case PROJECT_NAME}}Test : public InspectTestHelper, public zxtest::Test {
  void SetUp() override { fake_root_ = MockDevice::FakeRootParent(); }

  void TearDown() override {}

 protected:
  std::shared_ptr<zx_device> fake_root_;
};

TEST_F({{pascal_case PROJECT_NAME}}Test, LifetimeTest) {
  auto device = new {{pascal_case PROJECT_NAME}}(fake_root_.get());
  ASSERT_OK(device->Bind());
  device->zxdev()->InitOp();
  ASSERT_OK(device->zxdev()->WaitUntilInitReplyCalled(zx::time::infinite()));
  device->DdkAsyncRemove();
  ASSERT_OK(mock_ddk::ReleaseFlaggedDevices(fake_root_.get()));
}

// TODO: `is_bound` is an example inspect property. Replace this test with inspect properties
// if any are added to the driver. Remove this test if no new inspect nodes/properties were added.
TEST_F({{pascal_case PROJECT_NAME}}Test, InspectTest) {
  auto device = new {{pascal_case PROJECT_NAME}}(fake_root_.get());
  // Verify is_bound = false.
  ASSERT_NO_FATAL_FAILURE(ReadInspect(device->inspect_vmo()));
  ASSERT_NO_FATAL_FAILURE(
      CheckProperty(hierarchy().node(), "is_bound", inspect::BoolPropertyValue(false)));

  ASSERT_OK(device->Bind());

  // Verify is_bound = true.
  ASSERT_NO_FATAL_FAILURE(ReadInspect(device->inspect_vmo()));
  ASSERT_NO_FATAL_FAILURE(
      CheckProperty(hierarchy().node(), "is_bound", inspect::BoolPropertyValue(true)));

  device->zxdev()->InitOp();
  ASSERT_OK(device->zxdev()->WaitUntilInitReplyCalled(zx::time::infinite()));
  device->DdkAsyncRemove();
  ASSERT_OK(mock_ddk::ReleaseFlaggedDevices(fake_root_.get()));
}

}  // namespace {{snake_case PROJECT_NAME}}
