// Copyright 2019 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 <lib/fidl/cpp/comparison.h>

#include <fidl/test/misc/cpp/fidl.h>
#include <gtest/gtest.h>

namespace fidl {
namespace {

TEST(Table, IsEmpty) {
  test::misc::SimpleTable input;
  EXPECT_TRUE(input.IsEmpty());
  input.set_x(42);
  EXPECT_FALSE(input.IsEmpty());
}

TEST(Table, ChainSimpleSetters) {
  // Chain setters of simple types.
  test::misc::SimpleTable simple;
  simple.set_x(10);
  simple.set_y(20);
  EXPECT_EQ(10, simple.x());
  EXPECT_EQ(20, simple.y());

  // Chaining the setters gives you the same result:
  EXPECT_TRUE(fidl::Equals(simple, test::misc::SimpleTable().set_x(10).set_y(20)));
}

TEST(Table, ChainComplexSetters) {
  test::misc::SimpleTable simple;
  simple.set_x(10);

  test::misc::SampleXUnion u1, u2;
  u1.set_i(32);
  u1.Clone(&u2);

  test::misc::ComplexTable table;
  table.set_simple(std::move(simple));
  table.set_u(std::move(u1));
  table.set_strings({"a", "b"});

  EXPECT_TRUE(fidl::Equals(table, test::misc::ComplexTable()
                                      .set_simple(std::move(test::misc::SimpleTable().set_x(10)))
                                      .set_u(std::move(u2))
                                      .set_strings({"a", "b"})));
}

}  // namespace
}  // namespace fidl
