// Copyright 2015 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 "apps/moterm/moterm_model.h"

#include "testing/gtest/include/gtest/gtest.h"

namespace {

TEST(MotermModelTest, Position) {
  MotermModel::Position def;
  EXPECT_EQ(0, def.row);
  EXPECT_EQ(0, def.column);

  MotermModel::Position pos(12, 34);
  EXPECT_EQ(12, pos.row);
  EXPECT_EQ(34, pos.column);
}

TEST(MotermModelTest, Size) {
  MotermModel::Size def;
  EXPECT_EQ(0u, def.rows);
  EXPECT_EQ(0u, def.columns);

  MotermModel::Size size(12, 34);
  EXPECT_EQ(12u, size.rows);
  EXPECT_EQ(34u, size.columns);
}

TEST(MotermModelTest, Rectangle) {
  MotermModel::Rectangle def;
  EXPECT_EQ(0, def.position.row);
  EXPECT_EQ(0, def.position.column);
  EXPECT_EQ(0u, def.size.rows);
  EXPECT_EQ(0u, def.size.columns);
  EXPECT_TRUE(def.IsEmpty());

  MotermModel::Rectangle rect1(1, 2, 34, 56);
  EXPECT_EQ(1, rect1.position.row);
  EXPECT_EQ(2, rect1.position.column);
  EXPECT_EQ(34u, rect1.size.rows);
  EXPECT_EQ(56u, rect1.size.columns);
  EXPECT_FALSE(rect1.IsEmpty());

  MotermModel::Rectangle rect2(1, 2, 0, 0);
  EXPECT_EQ(1, rect2.position.row);
  EXPECT_EQ(2, rect2.position.column);
  EXPECT_EQ(0u, rect2.size.rows);
  EXPECT_EQ(0u, rect2.size.columns);
  EXPECT_TRUE(rect2.IsEmpty());

  MotermModel::Rectangle rect3(0, 0, 1, 2);
  EXPECT_EQ(0, rect3.position.row);
  EXPECT_EQ(0, rect3.position.column);
  EXPECT_EQ(1u, rect3.size.rows);
  EXPECT_EQ(2u, rect3.size.columns);
  EXPECT_FALSE(rect3.IsEmpty());

  MotermModel::Rectangle rect4(1, 2, 3, 0);
  EXPECT_EQ(1, rect4.position.row);
  EXPECT_EQ(2, rect4.position.column);
  EXPECT_EQ(3u, rect4.size.rows);
  EXPECT_EQ(0u, rect4.size.columns);
  EXPECT_TRUE(rect4.IsEmpty());

  MotermModel::Rectangle rect5(1, 2, 0, 3);
  EXPECT_EQ(1, rect5.position.row);
  EXPECT_EQ(2, rect5.position.column);
  EXPECT_EQ(0u, rect5.size.rows);
  EXPECT_EQ(3u, rect5.size.columns);
  EXPECT_TRUE(rect5.IsEmpty());
}

TEST(MotermModelTest, Color) {
  MotermModel::Color def;
  EXPECT_EQ(0u, def.red);
  EXPECT_EQ(0u, def.green);
  EXPECT_EQ(0u, def.blue);

  MotermModel::Color color(1, 234, 56);
  EXPECT_EQ(1u, color.red);
  EXPECT_EQ(234u, color.green);
  EXPECT_EQ(56u, color.blue);
}

TEST(MotermModelTest, CharacterInfo) {
  MotermModel::CharacterInfo char_info(65, MotermModel::kAttributesBold,
                                       MotermModel::Color(12, 34, 56),
                                       MotermModel::Color(123, 45, 67));
  EXPECT_EQ(65u, char_info.code_point);
  EXPECT_EQ(MotermModel::kAttributesBold, char_info.attributes);
  EXPECT_EQ(12u, char_info.foreground_color.red);
  EXPECT_EQ(34u, char_info.foreground_color.green);
  EXPECT_EQ(56u, char_info.foreground_color.blue);
  EXPECT_EQ(123u, char_info.background_color.red);
  EXPECT_EQ(45u, char_info.background_color.green);
  EXPECT_EQ(67u, char_info.background_color.blue);
}

TEST(MotermModelTest, StateChanges) {
  MotermModel::StateChanges state_changes;
  EXPECT_FALSE(state_changes.cursor_moved);
  EXPECT_EQ(0u, state_changes.bell_count);
  EXPECT_TRUE(state_changes.dirty_rect.IsEmpty());
  EXPECT_FALSE(state_changes.IsDirty());
  // Should be the same after reset.
  state_changes.Reset();
  EXPECT_FALSE(state_changes.cursor_moved);
  EXPECT_EQ(0u, state_changes.bell_count);
  EXPECT_TRUE(state_changes.dirty_rect.IsEmpty());
  EXPECT_FALSE(state_changes.IsDirty());

  state_changes.cursor_moved = true;
  EXPECT_TRUE(state_changes.IsDirty());
  state_changes.Reset();
  EXPECT_FALSE(state_changes.cursor_moved);
  EXPECT_FALSE(state_changes.IsDirty());

  state_changes.bell_count++;
  EXPECT_TRUE(state_changes.IsDirty());
  state_changes.Reset();
  EXPECT_EQ(0u, state_changes.bell_count);
  EXPECT_FALSE(state_changes.IsDirty());

  state_changes.dirty_rect = MotermModel::Rectangle(1, 2, 34, 56);
  EXPECT_TRUE(state_changes.IsDirty());
  state_changes.Reset();
  EXPECT_TRUE(state_changes.dirty_rect.IsEmpty());
  EXPECT_FALSE(state_changes.IsDirty());
}

TEST(MotermModelTest, Basic) {
  MotermModel model(MotermModel::Size(43, 132), MotermModel::Size(25, 80));

  MotermModel::Size size = model.GetSize();
  EXPECT_EQ(25u, size.rows);
  EXPECT_EQ(80u, size.columns);

  // The cursor should start out at the upper-left.
  MotermModel::Position cursor_pos = model.GetCursorPosition();
  EXPECT_EQ(0, cursor_pos.row);
  EXPECT_EQ(0, cursor_pos.column);

  MotermModel::StateChanges state_changes;
  EXPECT_FALSE(state_changes.IsDirty());

  // Print "XYZ" in bright (bold) green on red.
  static const char kXYZ[] = "\x1b[1;32;41mXYZ";
  model.ProcessInput(kXYZ, sizeof(kXYZ) - 1, &state_changes);
  EXPECT_TRUE(state_changes.IsDirty());
  EXPECT_TRUE(state_changes.cursor_moved);
  EXPECT_EQ(0u, state_changes.bell_count);
  EXPECT_FALSE(state_changes.dirty_rect.IsEmpty());
  // The model has some flexibility in the size of the dirty rectangle (it may
  // over-report), but it should contain the actually-dirty part.
  EXPECT_LE(state_changes.dirty_rect.position.row, 0);
  EXPECT_LE(state_changes.dirty_rect.position.column, 0);
  EXPECT_GE(state_changes.dirty_rect.size.rows, 1u);
  EXPECT_GE(state_changes.dirty_rect.size.columns, 3u);

  // Get the 'Y'.
  MotermModel::CharacterInfo char_info =
      model.GetCharacterInfoAt(MotermModel::Position(0, 1));
  EXPECT_EQ(static_cast<uint32_t>('Y'), char_info.code_point);
  EXPECT_EQ(MotermModel::kAttributesBold, char_info.attributes);
  // The foreground should be (bright) green-ish; this is a guess at what that
  // means.
  EXPECT_GE(char_info.foreground_color.green, 100u);
  EXPECT_GE(char_info.foreground_color.green / 2,
            char_info.foreground_color.red);
  EXPECT_GE(char_info.foreground_color.green / 2,
            char_info.foreground_color.blue);
  // The background_color should be (non-bright) red-ish.
  EXPECT_GE(char_info.background_color.red, 50u);
  EXPECT_GE(char_info.background_color.red / 2,
            char_info.background_color.green);
  EXPECT_GE(char_info.background_color.red / 2,
            char_info.background_color.blue);

  state_changes.Reset();
  EXPECT_FALSE(state_changes.IsDirty());

  // Now ring the bell three times.
  static const char kBellBellBell[] = "\a\a\a";
  model.ProcessInput(kBellBellBell, sizeof(kBellBellBell) - 1, &state_changes);
  EXPECT_TRUE(state_changes.IsDirty());
  EXPECT_FALSE(state_changes.cursor_moved);
  EXPECT_EQ(3u, state_changes.bell_count);
  EXPECT_TRUE(state_changes.dirty_rect.IsEmpty());

  model.SetSize(MotermModel::Size(43, 132), false);
  size = model.GetSize();
  EXPECT_EQ(43u, size.rows);
  EXPECT_EQ(132u, size.columns);

  model.SetSize(MotermModel::Size(40, 100), true);
  size = model.GetSize();
  EXPECT_EQ(40u, size.rows);
  EXPECT_EQ(100u, size.columns);
}

}  // namespace
