/*
 * Copyright 2017 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "nb/simple_profiler.h"

#include <map>
#include <string>
#include <vector>

#include "starboard/configuration.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace nb {
class SimpleProfilerTest : public ::testing::Test {
 public:
  SimpleProfilerTest() {}
  virtual void SetUp() SB_OVERRIDE {
    s_log_buffer_.clear();
    SimpleProfiler::SetLoggingFunction(TestLogFunction);
  }
  virtual void TearDown() SB_OVERRIDE {
    SimpleProfiler::SetLoggingFunction(nullptr);
    SimpleProfiler::SetClockFunction(nullptr);
    s_log_buffer_.clear();
  }

  std::string GetProfilerOutput() { return s_log_buffer_; }

 private:
  static std::string s_log_buffer_;
  static void TestLogFunction(const char* value) { s_log_buffer_ = value; }
};
std::string SimpleProfilerTest::s_log_buffer_;

struct CallChain {
  static void Foo() {
    SimpleProfiler profile("Foo");
    Bar();
    Qux();
  }

  static void Bar() {
    SimpleProfiler profile("Bar");
    Baz();
  }

  static void Baz() { SimpleProfiler profile("Baz"); }
  static void Qux() { SimpleProfiler profile("Qux"); }
};

TEST_F(SimpleProfilerTest, IsEnabledByDefault) {
  EXPECT_TRUE(SimpleProfiler::IsEnabled());
}

SbTimeMonotonic NullTime() {
  return SbTimeMonotonic(0);
}
// Tests the expectation that SimpleProfiler can be used in a call
// chain and will generate the expected string.
TEST_F(SimpleProfilerTest, CallChain) {
  SimpleProfiler::SetClockFunction(NullTime);
  CallChain::Foo();
  std::string profiler_log = GetProfilerOutput();

  std::string expected_output =
      "Foo: 0us\n"
      " Bar: 0us\n"
      "  Baz: 0us\n"
      " Qux: 0us\n";

  EXPECT_EQ(expected_output, profiler_log) << " actual output:\n"
                                           << profiler_log;
}

TEST_F(SimpleProfilerTest, EnableScopeDisabled) {
  SimpleProfiler::EnableScope enable(false);
  CallChain::Foo();
  std::string profiler_log = GetProfilerOutput();
  EXPECT_TRUE(profiler_log.empty());
}

}  // namespace nb
