// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/media/audio/lib/test/test_fixture.h"

namespace media::audio::test {
//
// TestFixture implementation
//
void TestFixture::SetUp() { ::gtest::RealLoopFixture::SetUp(); }

void TestFixture::TearDown() {
  EXPECT_EQ(error_expected_, error_occurred_);

  ::gtest::RealLoopFixture::TearDown();
}

bool TestFixture::RunUntilComplete(fit::function<bool()> condition) {
  return RunLoopWithTimeoutOrUntil(std::move(condition), kDurationResponseExpected,
                                   kDurationGranularity);
}

void TestFixture::ExpectCondition(fit::function<bool()> condition) {
  EXPECT_TRUE(RunUntilComplete(std::move(condition)));
}

void TestFixture::ExpectCallback() {
  callback_received_ = false;

  ExpectCondition([this]() { return (error_occurred_ || callback_received_); });

  EXPECT_FALSE(error_occurred_) << kDisconnectErr;
  EXPECT_TRUE(callback_received_);
}

void TestFixture::ExpectError(zx_status_t expected_error) {
  SetNegativeExpectations();
  callback_received_ = false;

  ExpectCondition([this]() { return (error_occurred_ || callback_received_); });

  EXPECT_TRUE(error_occurred_);
  EXPECT_EQ(error_code_, expected_error);
  EXPECT_FALSE(callback_received_) << kCallbackErr;
}

}  // namespace media::audio::test
