#include <catch2/catch_test_macros.hpp>

#include "example/example.yunq.h"

TEST_CASE("Basic Setter/Getter", "[yunq]") {
  ex::Basic b;
  b.set_field(1);
  REQUIRE(b.field() == 1);
}

TEST_CASE("Basic serialization", "[yunq]") {
  ex::Basic a;
  a.set_field(1);

  glcr::ByteBuffer buf(1024);
  a.SerializeToBytes(buf, 0);

  ex::Basic b;
  yunq::MessageView v(buf, 0);
  REQUIRE(b.ParseFromBytes(v).ok() == true);

  REQUIRE(b.field() == 1);
}

TEST_CASE("Types Setter/Getter", "[yunq]") {
  ex::Types t;
  t.set_unsigned_int(1);
  t.set_signed_int(-1);
  t.set_str("test");

  REQUIRE(t.unsigned_int() == 1);
  REQUIRE(t.signed_int() == -1);
  REQUIRE(t.str() == "test");
}

TEST_CASE("Types Serialization", "[yunq]") {
  ex::Types a;
  a.set_unsigned_int(1);
  a.set_signed_int(-1);
  a.set_str("test");

  glcr::ByteBuffer buf(1024);
  a.SerializeToBytes(buf, 0);

  ex::Types b;
  yunq::MessageView v(buf, 0);
  REQUIRE(b.ParseFromBytes(v).ok() == true);

  REQUIRE(b.unsigned_int() == 1);
  REQUIRE(b.signed_int() == -1);
  REQUIRE(b.str() == "test");
}

TEST_CASE("Cap Setter/Getter", "[yunq]") {
  ex::Cap c;
  c.set_cap(1234);

  REQUIRE(c.cap() == 1234);
}

TEST_CASE("Cap Serialization Inline", "[yunq]") {
  ex::Cap a;
  a.set_cap(1234);

  glcr::ByteBuffer buf(1024);
  a.SerializeToBytes(buf, 0);

  ex::Cap b;
  yunq::MessageView v(buf, 0);
  REQUIRE(b.ParseFromBytes(v).ok() == true);

  REQUIRE(b.cap() == 1234);
}

TEST_CASE("Cap Serialization Sidebuffer", "[yunq]") {
  ex::Cap a;
  a.set_cap(1234);

  glcr::ByteBuffer buf(1024);
  glcr::CapBuffer caps(1);
  a.SerializeToBytes(buf, 0, caps);

  ex::Cap b;
  yunq::MessageView v(buf, 0);
  REQUIRE(b.ParseFromBytes(v, caps).ok() == true);

  REQUIRE(b.cap() == 1234);
}

TEST_CASE("Repeated Setter/Getter", "[yunq]") {
  ex::Repeated r;
  r.mutable_unsigned_ints().PushBack(1);
  r.add_unsigned_ints(2);
  uint64_t c = 3;
  r.add_unsigned_ints(glcr::Move(c));

  REQUIRE(r.unsigned_ints()[0] == 1);
  REQUIRE(r.unsigned_ints()[1] == 2);
  REQUIRE(r.unsigned_ints()[2] == 3);
}