// Copyright 2017 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 "garnet/lib/measure/test_events.h"

namespace tracing {
namespace measure {
namespace test {

trace::Record::Event DurationBegin(fbl::String name, fbl::String category, uint64_t timestamp) {
  return trace::Record::Event{timestamp, {}, category,
                              name,      {}, trace::EventData(trace::EventData::DurationBegin{})};
}

trace::Record::Event DurationEnd(fbl::String name, fbl::String category, uint64_t timestamp) {
  return trace::Record::Event{timestamp, {}, category,
                              name,      {}, trace::EventData(trace::EventData::DurationEnd{})};
}

trace::Record::Event DurationComplete(fbl::String name, fbl::String category, uint64_t timestamp,
                                      uint64_t end_time) {
  return trace::Record::Event{
      timestamp, {}, category,
      name,      {}, trace::EventData(trace::EventData::DurationComplete{end_time})};
}

trace::Record::Event AsyncBegin(uint64_t id, fbl::String name, fbl::String category,
                                uint64_t timestamp) {
  return trace::Record::Event{timestamp, {}, category,
                              name,      {}, trace::EventData(trace::EventData::AsyncBegin{id})};
}

trace::Record::Event AsyncEnd(uint64_t id, fbl::String name, fbl::String category,
                              uint64_t timestamp) {
  return trace::Record::Event{timestamp, {}, category,
                              name,      {}, trace::EventData(trace::EventData::AsyncEnd{id})};
}

trace::Record::Event FlowBegin(uint64_t id, fbl::String name, fbl::String category,
                               uint64_t timestamp) {
  return trace::Record::Event{timestamp, {}, category,
                              name,      {}, trace::EventData(trace::EventData::FlowBegin{id})};
}

trace::Record::Event FlowEnd(uint64_t id, fbl::String name, fbl::String category,
                             uint64_t timestamp) {
  return trace::Record::Event{timestamp, {}, category,
                              name,      {}, trace::EventData(trace::EventData::FlowEnd{id})};
}

trace::Record::Event Instant(fbl::String name, fbl::String category, uint64_t timestamp,
                             fbl::Vector<trace::Argument> args) {
  return trace::Record::Event{timestamp,       {},
                              category,        name,
                              std::move(args), trace::EventData(trace::EventData::Instant{})};
}
}  // namespace test

}  // namespace measure
}  // namespace tracing
