// Copyright 2014 The Chromium 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 "mojo/public/interfaces/bindings/tests/test_structs.mojom.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace mojo {
namespace test {

namespace {

RectPtr CreateRect() {
  RectPtr r = Rect::New();
  r->x = 1;
  r->y = 2;
  r->width = 3;
  r->height = 4;
  return r;
}

}  // namespace

TEST(EqualsTest, Null) {
  RectPtr r1;
  RectPtr r2;
  EXPECT_TRUE(r1.Equals(r2));
  EXPECT_TRUE(r2.Equals(r1));

  r1 = CreateRect();
  EXPECT_FALSE(r1.Equals(r2));
  EXPECT_FALSE(r2.Equals(r1));
}

TEST(EqualsTest, EqualsStruct) {
  RectPtr r1(CreateRect());
  RectPtr r2(r1.Clone());
  EXPECT_TRUE(r1.Equals(r2));
  r2->y = 1;
  EXPECT_FALSE(r1.Equals(r2));
  r2.reset();
  EXPECT_FALSE(r1.Equals(r2));
}

TEST(EqualsTest, EqualsStructNested) {
  RectPairPtr p1(RectPair::New());
  p1->first = CreateRect();
  p1->second = CreateRect();
  RectPairPtr p2(p1.Clone());
  EXPECT_TRUE(p1.Equals(p2));
  p2->second->width = 0;
  EXPECT_FALSE(p1.Equals(p2));
  p2->second.reset();
  EXPECT_FALSE(p1.Equals(p2));
}

TEST(EqualsTest, EqualsArray) {
  NamedRegionPtr n1(NamedRegion::New());
  n1->name = "n1";
  n1->rects.push_back(CreateRect());
  NamedRegionPtr n2(n1.Clone());
  EXPECT_TRUE(n1.Equals(n2));

  n2->rects.reset();
  EXPECT_FALSE(n1.Equals(n2));
  n2->rects.resize(0);
  EXPECT_FALSE(n1.Equals(n2));

  n2->rects.push_back(CreateRect());
  n2->rects.push_back(CreateRect());
  EXPECT_FALSE(n1.Equals(n2));

  n2->rects.resize(1);
  n2->rects[0]->width = 0;
  EXPECT_FALSE(n1.Equals(n2));

  n2->rects[0] = CreateRect();
  EXPECT_TRUE(n1.Equals(n2));
}

TEST(EqualsTest, EqualsMap) {
  auto n1(NamedRegion::New());
  n1->name = "foo";
  n1->rects.push_back(CreateRect());

  Map<std::string, NamedRegionPtr> m1;
  m1.insert("foo", n1.Pass());

  decltype(m1) m2;
  EXPECT_FALSE(m1.Equals(m2));

  m2.insert("bar", m1.at("foo").Clone());
  EXPECT_FALSE(m1.Equals(m2));

  m2 = m1.Clone();
  m2.at("foo")->name = "monkey";
  EXPECT_FALSE(m1.Equals(m2));

  m2 = m1.Clone();
  m2.at("foo")->rects.push_back(Rect::New());
  EXPECT_FALSE(m1.Equals(m2));

  m2.at("foo")->rects.resize(1);
  m2.at("foo")->rects[0]->width = 1;
  EXPECT_FALSE(m1.Equals(m2));

  m2 = m1.Clone();
  EXPECT_TRUE(m1.Equals(m2));
}

}  // test
}  // mojo
