// Copyright 2016 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 <sstream>

#include "gtest/gtest.h"
#include "mojo/public/cpp/bindings/array.h"
#include "mojo/public/cpp/bindings/formatting.h"
#include "mojo/public/cpp/bindings/map.h"
#include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h"

namespace mojo {
namespace test {
namespace {
RectPtr MakeRect(int32_t factor = 1) {
  RectPtr rect(Rect::New());
  rect->x = 1 * factor;
  rect->y = 2 * factor;
  rect->width = 10 * factor;
  rect->height = 20 * factor;
  return rect;
}
}  // namespace

std::ostream& operator<<(std::ostream& os, const Rect& value) {
  return os << "{x=" << value.x << ", y=" << value.y
            << ", width=" << value.width << ", height=" << value.height << "}";
}

std::ostream& operator<<(std::ostream& os, const RectPair& value) {
  return os << "{first=" << value.first << ", second=" << value.second << "}";
}

TEST(FormattingTest, Arrays) {
  Array<int32_t> null_array;
  Array<int32_t> empty_array;
  empty_array.resize(0);
  Array<int32_t> one_element_array;
  one_element_array.push_back(123);
  Array<int32_t> three_element_array;
  three_element_array.push_back(4);
  three_element_array.push_back(5);
  three_element_array.push_back(6);

  std::ostringstream so;
  so << "null_array=" << null_array << ", empty_array=" << empty_array
     << ", one_element_array=" << one_element_array
     << ", three_element_array=" << three_element_array;

  EXPECT_EQ(
      "null_array=null, "
      "empty_array=[], "
      "one_element_array=[123], "
      "three_element_array=[4, 5, 6]",
      so.str());
}

TEST(FormattingTest, Maps) {
  Map<int32_t, std::string> null_map;
  Map<int32_t, std::string> empty_map;
  empty_map.mark_non_null();
  Map<int32_t, std::string> one_element_map;
  one_element_map.insert(123, "abc");
  Map<int32_t, std::string> three_element_map;
  three_element_map.insert(4, "d");
  three_element_map.insert(5, "e");
  three_element_map.insert(6, "f");

  std::ostringstream so;
  so << "null_map=" << null_map << ", empty_map=" << empty_map
     << ", one_element_map=" << one_element_map
     << ", three_element_map=" << three_element_map;

  EXPECT_EQ(
      "null_map=null, "
      "empty_map={}, "
      "one_element_map={123: abc}, "
      "three_element_map={4: d, 5: e, 6: f}",
      so.str());
}

TEST(FormattingTest, Structs) {
  InlinedStructPtr<Rect> inlined_struct_ptr = MakeRect(1);
  InlinedStructPtr<Rect> null_inlined_struct_ptr;
  StructPtr<RectPair> struct_ptr = RectPair::New();
  struct_ptr->first = MakeRect(2);
  StructPtr<RectPair> null_struct_ptr;

  std::ostringstream so;
  so << "inlined_struct_ptr=" << inlined_struct_ptr
     << ", null_inlined_struct_ptr=" << null_inlined_struct_ptr
     << ", struct_ptr=" << struct_ptr
     << ", null_struct_ptr=" << null_struct_ptr;
  EXPECT_EQ(
      "inlined_struct_ptr={x=1, y=2, width=10, height=20}, "
      "null_inlined_struct_ptr=null, "
      "struct_ptr={first={x=2, y=4, width=20, height=40}, second=null}, "
      "null_struct_ptr=null",
      so.str());
}

}  // namespace test
}  // namespace mojo
