|  | // Copyright 2022 The Pigweed Authors | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); you may not | 
|  | // use this file except in compliance with the License. You may obtain a copy of | 
|  | // the License at | 
|  | // | 
|  | //     https://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | 
|  | // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | 
|  | // License for the specific language governing permissions and limitations under | 
|  | // the License. | 
|  |  | 
|  | #include "text_buffer.h" | 
|  |  | 
|  | #include "gtest/gtest.h" | 
|  | #include "pw_color/colors_pico8.h" | 
|  |  | 
|  | using pw::color::color_rgb565_t; | 
|  |  | 
|  | namespace { | 
|  | constexpr color_rgb565_t kIndigo = pw::color::kColorsPico8Rgb565[13]; | 
|  | constexpr color_rgb565_t kDarkGreen = pw::color::kColorsPico8Rgb565[3]; | 
|  | }  // namespace | 
|  |  | 
|  | TEST(TextBufferTest, DimsAsExpected) { | 
|  | TextBuffer buffer; | 
|  | ASSERT_EQ(kNumCharsWide, static_cast<size_t>(buffer.GetSize().width)); | 
|  | ASSERT_EQ(kNumRows, static_cast<size_t>(buffer.GetSize().height)); | 
|  | } | 
|  |  | 
|  | TEST(TextBufferTest, ClearedOnConstruction) { | 
|  | TextBuffer buffer; | 
|  |  | 
|  | const auto buffer_size = buffer.GetSize(); | 
|  | for (int r = 0; r < buffer_size.height; r++) { | 
|  | for (int c = 0; c < buffer_size.width; c++) { | 
|  | const auto ch = buffer.GetChar({c, r}); | 
|  | ASSERT_TRUE(ch.ok()); | 
|  | ASSERT_EQ('\0', ch->ch); | 
|  | ASSERT_EQ(kWhiteColor, ch->foreground_color); | 
|  | ASSERT_EQ(kBlackColor, ch->background_color); | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | TEST(TextBufferTest, OutOfBoundsColumnNotOk) { | 
|  | TextBuffer buffer; | 
|  | auto ch = buffer.GetChar({buffer.GetSize().width, 0}); | 
|  | EXPECT_FALSE(ch.ok()); | 
|  |  | 
|  | ch = buffer.GetChar({-1, 0}); | 
|  | EXPECT_FALSE(ch.ok()); | 
|  | } | 
|  |  | 
|  | TEST(TextBufferTest, OutOfBoundsRowNotOk) { | 
|  | TextBuffer buffer; | 
|  | auto ch = buffer.GetChar({0, buffer.GetSize().height}); | 
|  | EXPECT_FALSE(ch.ok()); | 
|  |  | 
|  | ch = buffer.GetChar({0, -1}); | 
|  | EXPECT_FALSE(ch.ok()); | 
|  | } | 
|  |  | 
|  | TEST(TextBufferTest, SimpleInsert) { | 
|  | TextBuffer buffer; | 
|  |  | 
|  | buffer.DrawCharacter({'A', kIndigo, kDarkGreen}); | 
|  | auto ch = buffer.GetChar({0, 0}); | 
|  | ASSERT_TRUE(ch.ok()); | 
|  | EXPECT_EQ('A', ch->ch); | 
|  | EXPECT_EQ(kIndigo, ch->foreground_color); | 
|  | EXPECT_EQ(kDarkGreen, ch->background_color); | 
|  |  | 
|  | buffer.DrawCharacter({'B', kIndigo, kDarkGreen}); | 
|  | ch = buffer.GetChar({0, 0}); | 
|  | ASSERT_TRUE(ch.ok()); | 
|  | EXPECT_EQ('A', ch->ch); | 
|  | EXPECT_EQ(kIndigo, ch->foreground_color); | 
|  | EXPECT_EQ(kDarkGreen, ch->background_color); | 
|  |  | 
|  | ch = buffer.GetChar({1, 0}); | 
|  | ASSERT_TRUE(ch.ok()); | 
|  | EXPECT_EQ('B', ch->ch); | 
|  | EXPECT_EQ(kIndigo, ch->foreground_color); | 
|  | EXPECT_EQ(kDarkGreen, ch->background_color); | 
|  | } | 
|  |  | 
|  | TEST(TextBufferTest, NewLineInsertsToNextRow) { | 
|  | TextBuffer buffer; | 
|  | buffer.DrawCharacter({'A', kIndigo, kDarkGreen}); | 
|  | buffer.DrawCharacter({'\n', kIndigo, kDarkGreen}); | 
|  | buffer.DrawCharacter({'B', kIndigo, kDarkGreen}); | 
|  | buffer.DrawCharacter({'\n', kIndigo, kDarkGreen}); | 
|  |  | 
|  | auto ch = buffer.GetChar({1, 0}); | 
|  | ASSERT_TRUE(ch.ok()); | 
|  | EXPECT_EQ('\0', ch->ch); | 
|  | EXPECT_EQ(kWhiteColor, ch->foreground_color); | 
|  | EXPECT_EQ(kBlackColor, ch->background_color); | 
|  |  | 
|  | ch = buffer.GetChar({0, 1}); | 
|  | ASSERT_TRUE(ch.ok()); | 
|  | EXPECT_EQ('B', ch->ch); | 
|  | EXPECT_EQ(kIndigo, ch->foreground_color); | 
|  | EXPECT_EQ(kDarkGreen, ch->background_color); | 
|  | } | 
|  |  | 
|  | TEST(TextBufferTest, Scroll) { | 
|  | // Insert enough newlines to scroll buffer. | 
|  | TextBuffer buffer; | 
|  | char next_char = 'A'; | 
|  | for (size_t i = 0; i < kNumRows; i++) { | 
|  | buffer.DrawCharacter({next_char, kIndigo, kDarkGreen}); | 
|  | buffer.DrawCharacter({'\n', kIndigo, kDarkGreen}); | 
|  | next_char++; | 
|  | } | 
|  |  | 
|  | // Verify the buffer has scrolled up once, | 
|  | auto ch = buffer.GetChar({0, 0}); | 
|  | ASSERT_TRUE(ch.ok()); | 
|  | EXPECT_EQ('B', ch->ch); | 
|  | EXPECT_EQ(kIndigo, ch->foreground_color); | 
|  | EXPECT_EQ(kDarkGreen, ch->background_color); | 
|  | } |