// Copyright 2016 The Chromium 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 "services/media/framework/test/test_base.h"
#include "services/media/framework/util/incident.h"

namespace mojo {
namespace media {
namespace {

class IncidentTest : public TestBase {};

// Tests whether Incident::Occur and Incident::Reset have the right effect on
// Incident::occurred.
TEST_F(IncidentTest, Basics) {
  Incident under_test;

  EXPECT_FALSE(under_test.occurred());

  under_test.Occur();
  EXPECT_TRUE(under_test.occurred());

  under_test.Reset();
  EXPECT_FALSE(under_test.occurred());

  // Incident::Run does the same thing as Incident::Occur.
  under_test.Run();
  EXPECT_TRUE(under_test.occurred());

  under_test.Reset();
  EXPECT_FALSE(under_test.occurred());
}

// Tests whether a consequence registered with Incident::When runs only after
// Incident::Occur is called.
TEST_F(IncidentTest, When_Delayed) {
  Incident under_test;

  // These two together should be a no-op.
  under_test.Occur();
  under_test.Reset();

  bool consequence_ran = false;
  under_test.When([&consequence_ran]() { consequence_ran = true; });
  EXPECT_FALSE(consequence_ran);

  under_test.Occur();
  EXPECT_TRUE(consequence_ran);
}

// Tests whether a consequence registered with Incident::When runs immediately
// when Incident::Occur was called first.
TEST_F(IncidentTest, When_Immediate) {
  Incident under_test;

  under_test.Occur();

  bool consequence_ran = false;
  under_test.When([&consequence_ran]() { consequence_ran = true; });
  EXPECT_TRUE(consequence_ran);
}

// Tests whether a consequence registered with Incident::When runs
// Incident::Reset is called before Incident::Occur (it shouldn't).
TEST_F(IncidentTest, When_Reset) {
  Incident under_test;

  bool consequence_ran = false;
  under_test.When([&consequence_ran]() { consequence_ran = true; });
  EXPECT_FALSE(consequence_ran);

  under_test.Reset();
  EXPECT_FALSE(consequence_ran);

  under_test.Occur();
  EXPECT_FALSE(consequence_ran);
}

// Tests whether a consequences registered with Incident::When run in the
// correct order.
TEST_F(IncidentTest, When_Order) {
  Incident under_test;
  int sequence_counter = 0;

  under_test.When([&sequence_counter]() { EXPECT_EQ(0, sequence_counter++); });
  under_test.When([&sequence_counter]() { EXPECT_EQ(1, sequence_counter++); });
  under_test.When([&sequence_counter]() { EXPECT_EQ(2, sequence_counter++); });
  under_test.When([&sequence_counter]() { EXPECT_EQ(3, sequence_counter++); });

  under_test.Occur();

  under_test.When([&sequence_counter]() { EXPECT_EQ(4, sequence_counter++); });
  under_test.When([&sequence_counter]() { EXPECT_EQ(5, sequence_counter++); });
  under_test.When([&sequence_counter]() { EXPECT_EQ(6, sequence_counter++); });
  under_test.When([&sequence_counter]() { EXPECT_EQ(7, sequence_counter++); });

  EXPECT_EQ(8, sequence_counter);
}

// Tests whether a consequence registered with Incident::When runs when
// Incident::Occur is never called and the Incident is deleted (it shouldn't).
TEST_F(IncidentTest, When_After_Delete) {
  bool consequence_ran = false;

  {
    Incident under_test;
    under_test.When([&consequence_ran]() { consequence_ran = true; });
  }

  EXPECT_FALSE(consequence_ran);
}

class ThreadsafeIncidentTest : public TestBase {};

// Tests whether ThreadsafeIncident::Occur and ThreadsafeIncident::Reset have
// the right effect on ThreadsafeIncident::occurred.
TEST_F(ThreadsafeIncidentTest, Basics) {
  ThreadsafeIncident under_test;

  EXPECT_FALSE(under_test.occurred());

  under_test.Occur();
  EXPECT_TRUE(under_test.occurred());

  under_test.Reset();
  EXPECT_FALSE(under_test.occurred());

  // ThreadsafeIncident::Run does the same thing as ThreadsafeIncident::Occur.
  under_test.Run();
  EXPECT_TRUE(under_test.occurred());

  under_test.Reset();
  EXPECT_FALSE(under_test.occurred());
}

// Tests whether a consequence registered with ThreadsafeIncident::When runs
// only after ThreadsafeIncident::Occur is called.
TEST_F(ThreadsafeIncidentTest, When_Delayed) {
  ThreadsafeIncident under_test;

  // These two together should be a no-op.
  under_test.Occur();
  under_test.Reset();

  bool consequence_ran = false;
  under_test.When([&consequence_ran]() { consequence_ran = true; });
  EXPECT_FALSE(consequence_ran);

  under_test.Occur();
  EXPECT_TRUE(consequence_ran);
}

// Tests whether a consequence registered with ThreadsafeIncident::When runs
// immediately when ThreadsafeIncident::Occur was called first.
TEST_F(ThreadsafeIncidentTest, When_Immediate) {
  ThreadsafeIncident under_test;

  under_test.Occur();

  bool consequence_ran = false;
  under_test.When([&consequence_ran]() { consequence_ran = true; });
  EXPECT_TRUE(consequence_ran);
}

// Tests whether a consequence registered with ThreadsafeIncident::When runs
// ThreadsafeIncident::Reset is called before ThreadsafeIncident::Occur (it
// shouldn't).
TEST_F(ThreadsafeIncidentTest, When_Reset) {
  ThreadsafeIncident under_test;

  bool consequence_ran = false;
  under_test.When([&consequence_ran]() { consequence_ran = true; });
  EXPECT_FALSE(consequence_ran);

  under_test.Reset();
  EXPECT_FALSE(consequence_ran);

  under_test.Occur();
  EXPECT_FALSE(consequence_ran);
}

// Tests whether a consequences registered with ThreadsafeIncident::When run in
// the correct order.
TEST_F(ThreadsafeIncidentTest, When_Order) {
  ThreadsafeIncident under_test;
  int sequence_counter = 0;

  under_test.When([&sequence_counter]() { EXPECT_EQ(0, sequence_counter++); });
  under_test.When([&sequence_counter]() { EXPECT_EQ(1, sequence_counter++); });
  under_test.When([&sequence_counter]() { EXPECT_EQ(2, sequence_counter++); });
  under_test.When([&sequence_counter]() { EXPECT_EQ(3, sequence_counter++); });

  under_test.Occur();

  under_test.When([&sequence_counter]() { EXPECT_EQ(4, sequence_counter++); });
  under_test.When([&sequence_counter]() { EXPECT_EQ(5, sequence_counter++); });
  under_test.When([&sequence_counter]() { EXPECT_EQ(6, sequence_counter++); });
  under_test.When([&sequence_counter]() { EXPECT_EQ(7, sequence_counter++); });

  EXPECT_EQ(8, sequence_counter);
}

// Tests whether a consequence registered with ThreadsafeIncident::When runs
// when ThreadsafeIncident::Occur is never called and the ThreadsafeIncident is
// deleted (it shouldn't).
TEST_F(ThreadsafeIncidentTest, When_After_Delete) {
  bool consequence_ran = false;

  {
    ThreadsafeIncident under_test;
    under_test.When([&consequence_ran]() { consequence_ran = true; });
  }

  EXPECT_FALSE(consequence_ran);
}

}  // namespace
}  // namespace media
}  // namespace mojo
