// Copyright (c) 2012-2017 VideoStitch SAS
// Copyright (c) 2018 stitchEm

#include "gpu/testing.hpp"

#include "libvideostitch/gpu_device.hpp"
#include <gpu/stream.hpp>

namespace VideoStitch {
namespace Testing {

void testStreamLifetime() {
  auto stream = GPU::Stream::create();
  ENSURE(stream.ok());
  ENSURE(stream.value().destroy());
}

void testDefaultStream() {
  auto stream = GPU::Stream::create();
  ENSURE(stream.ok());
  ENSURE(GPU::Stream::getDefault() != stream.value());
  ENSURE(stream.value().destroy());
  ENSURE(GPU::Stream::getDefault() == GPU::Stream::getDefault());
}

void borrowUniqueStream(GPU::Stream stream) { ENSURE(stream.synchronize()); }

void testUniqueStream() {
  auto potUniqueStream = GPU::UniqueStream::create();
  ENSURE(potUniqueStream.ok());

  auto& uniqueStream = potUniqueStream.ref();

  // Stream we created should not be default stream
  ENSURE(GPU::Stream::getDefault() != uniqueStream.borrow());

  // borrowing twice should borrow same underlying stream
  ENSURE(potUniqueStream.ref().borrow() == potUniqueStream.ref().borrow());

  borrowUniqueStream(uniqueStream.borrow());
}

void testUninitializedStream() {
  GPU::Stream uninitialized;
  GPU::Stream copy = uninitialized;
  ENSURE(copy == uninitialized);
  ENSURE(copy != GPU::Stream::getDefault());
}

}  // namespace Testing
}  // namespace VideoStitch

int main(int /*argc*/, char** /*argv*/) {
  VideoStitch::Testing::initTest();
  VideoStitch::Testing::ENSURE(VideoStitch::GPU::setDefaultBackendDevice(0));

  VideoStitch::Testing::testStreamLifetime();
  VideoStitch::Testing::testDefaultStream();
  VideoStitch::Testing::testUniqueStream();
  VideoStitch::Testing::testUninitializedStream();
  return 0;
}