// Copyright 2018 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 <fuchsia/modular/storymodel/cpp/fidl.h>

#include "gmock/gmock.h"  // For EXPECT_THAT and matchers.
#include "gtest/gtest.h"
#include "peridot/bin/sessionmgr/story/model/testing/mutation_matchers.h"
#include "peridot/bin/sessionmgr/story/model/testing/test_mutator.h"
#include "peridot/bin/sessionmgr/story/systems/story_visibility_system.h"

using fuchsia::modular::storymodel::StoryModel;
using fuchsia::modular::storymodel::StoryModelMutation;

namespace modular {
namespace {

class StoryVisibilitySystemTest : public ::testing::Test {
 protected:
  StoryVisibilitySystemTest() {
    system_ =
        std::make_unique<StoryVisibilitySystem>(TestMutator::Create(&mutator_));
  }

  std::unique_ptr<StoryVisibilitySystem> system_;
  TestMutator* mutator_;
};

TEST_F(StoryVisibilitySystemTest, All) {
  system_->RequestStoryVisibilityStateChange(
      fuchsia::modular::StoryVisibilityState::IMMERSIVE);

  EXPECT_EQ(1lu, mutator_->execute_calls.size());
  EXPECT_THAT(mutator_->execute_calls[0].commands,
              testing::ElementsAre(IsSetVisibilityMutation(
                  fuchsia::modular::StoryVisibilityState::IMMERSIVE)));
}

}  // namespace
}  // namespace modular
