// Copyright 2013 The Flutter 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 "flutter/fml/message.h"

#include "gtest/gtest.h"

namespace fml {

struct TestStruct {
  int a = 12;
  char b = 'x';
  float c = 99.0f;
};

TEST(MessageTest, CanEncodeTriviallyCopyableTypes) {
  Message message;
  ASSERT_TRUE(message.Encode(12));
  ASSERT_TRUE(message.Encode(11.0f));
  ASSERT_TRUE(message.Encode('a'));

  TestStruct s;
  ASSERT_TRUE(message.Encode(s));
  ASSERT_GE(message.GetDataLength(), 0u);
  ASSERT_GE(message.GetBufferSize(), 0u);
  ASSERT_EQ(message.GetSizeRead(), 0u);
}

TEST(MessageTest, CanDecodeTriviallyCopyableTypes) {
  Message message;
  ASSERT_TRUE(message.Encode(12));
  ASSERT_TRUE(message.Encode(11.0f));
  ASSERT_TRUE(message.Encode('a'));
  TestStruct s;
  s.a = 10;
  s.b = 'y';
  s.c = 11.1f;

  ASSERT_TRUE(message.Encode(s));

  ASSERT_GE(message.GetDataLength(), 0u);
  ASSERT_GE(message.GetBufferSize(), 0u);
  ASSERT_EQ(message.GetSizeRead(), 0u);

  int int1 = 0;
  ASSERT_TRUE(message.Decode(int1));
  ASSERT_EQ(12, int1);

  float float1 = 0.0f;
  ASSERT_TRUE(message.Decode(float1));
  ASSERT_EQ(float1, 11.0f);

  char char1 = 'x';
  ASSERT_TRUE(message.Decode(char1));
  ASSERT_EQ(char1, 'a');

  TestStruct s1;
  ASSERT_TRUE(message.Decode(s1));
  ASSERT_EQ(s1.a, 10);
  ASSERT_EQ(s1.b, 'y');
  ASSERT_EQ(s1.c, 11.1f);

  ASSERT_NE(message.GetSizeRead(), 0u);
  ASSERT_EQ(message.GetDataLength(), message.GetSizeRead());
}

}  // namespace fml
