Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(403)

Side by Side Diff: apps/moterm/moterm_model_unittest.cc

Issue 1130563002: Moterm part 1: Add MotermModel, a "model" for terminal emulation. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: oops Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « apps/moterm/moterm_model.cc ('k') | mojo/tools/data/apptests » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "apps/moterm/moterm_model.h"
6
7 #include "testing/gtest/include/gtest/gtest.h"
8
9 namespace {
10
11 TEST(MotermModelTest, Position) {
12 MotermModel::Position def;
13 EXPECT_EQ(0, def.row);
14 EXPECT_EQ(0, def.column);
15
16 MotermModel::Position pos(12, 34);
17 EXPECT_EQ(12, pos.row);
18 EXPECT_EQ(34, pos.column);
19 }
20
21 TEST(MotermModelTest, Size) {
22 MotermModel::Size def;
23 EXPECT_EQ(0u, def.rows);
24 EXPECT_EQ(0u, def.columns);
25
26 MotermModel::Size size(12, 34);
27 EXPECT_EQ(12u, size.rows);
28 EXPECT_EQ(34u, size.columns);
29 }
30
31 TEST(MotermModelTest, Rectangle) {
32 MotermModel::Rectangle def;
33 EXPECT_EQ(0, def.position.row);
34 EXPECT_EQ(0, def.position.column);
35 EXPECT_EQ(0u, def.size.rows);
36 EXPECT_EQ(0u, def.size.columns);
37 EXPECT_TRUE(def.IsEmpty());
38
39 MotermModel::Rectangle rect1(1, 2, 34, 56);
40 EXPECT_EQ(1, rect1.position.row);
41 EXPECT_EQ(2, rect1.position.column);
42 EXPECT_EQ(34u, rect1.size.rows);
43 EXPECT_EQ(56u, rect1.size.columns);
44 EXPECT_FALSE(rect1.IsEmpty());
45
46 MotermModel::Rectangle rect2(1, 2, 0, 0);
47 EXPECT_EQ(1, rect2.position.row);
48 EXPECT_EQ(2, rect2.position.column);
49 EXPECT_EQ(0u, rect2.size.rows);
50 EXPECT_EQ(0u, rect2.size.columns);
51 EXPECT_TRUE(rect2.IsEmpty());
52
53 MotermModel::Rectangle rect3(0, 0, 1, 2);
54 EXPECT_EQ(0, rect3.position.row);
55 EXPECT_EQ(0, rect3.position.column);
56 EXPECT_EQ(1u, rect3.size.rows);
57 EXPECT_EQ(2u, rect3.size.columns);
58 EXPECT_FALSE(rect3.IsEmpty());
59
60 MotermModel::Rectangle rect4(1, 2, 3, 0);
61 EXPECT_EQ(1, rect4.position.row);
62 EXPECT_EQ(2, rect4.position.column);
63 EXPECT_EQ(3u, rect4.size.rows);
64 EXPECT_EQ(0u, rect4.size.columns);
65 EXPECT_TRUE(rect4.IsEmpty());
66
67 MotermModel::Rectangle rect5(1, 2, 0, 3);
68 EXPECT_EQ(1, rect5.position.row);
69 EXPECT_EQ(2, rect5.position.column);
70 EXPECT_EQ(0u, rect5.size.rows);
71 EXPECT_EQ(3u, rect5.size.columns);
72 EXPECT_TRUE(rect5.IsEmpty());
73 }
74
75 TEST(MotermModelTest, Color) {
76 MotermModel::Color def;
77 EXPECT_EQ(0u, def.red);
78 EXPECT_EQ(0u, def.green);
79 EXPECT_EQ(0u, def.blue);
80
81 MotermModel::Color color(1, 234, 56);
82 EXPECT_EQ(1u, color.red);
83 EXPECT_EQ(234u, color.green);
84 EXPECT_EQ(56u, color.blue);
85 }
86
87 TEST(MotermModelTest, CharacterInfo) {
88 MotermModel::CharacterInfo char_info(65, MotermModel::kAttributesBold,
89 MotermModel::Color(12, 34, 56),
90 MotermModel::Color(123, 45, 67));
91 EXPECT_EQ(65u, char_info.code_point);
92 EXPECT_EQ(MotermModel::kAttributesBold, char_info.attributes);
93 EXPECT_EQ(12u, char_info.foreground_color.red);
94 EXPECT_EQ(34u, char_info.foreground_color.green);
95 EXPECT_EQ(56u, char_info.foreground_color.blue);
96 EXPECT_EQ(123u, char_info.background_color.red);
97 EXPECT_EQ(45u, char_info.background_color.green);
98 EXPECT_EQ(67u, char_info.background_color.blue);
99 }
100
101 TEST(MotermModelTest, StateChanges) {
102 MotermModel::StateChanges state_changes;
103 EXPECT_FALSE(state_changes.cursor_moved);
104 EXPECT_EQ(0u, state_changes.bell_count);
105 EXPECT_TRUE(state_changes.dirty_rect.IsEmpty());
106 EXPECT_FALSE(state_changes.IsDirty());
107 // Should be the same after reset.
108 state_changes.Reset();
109 EXPECT_FALSE(state_changes.cursor_moved);
110 EXPECT_EQ(0u, state_changes.bell_count);
111 EXPECT_TRUE(state_changes.dirty_rect.IsEmpty());
112 EXPECT_FALSE(state_changes.IsDirty());
113
114 state_changes.cursor_moved = true;
115 EXPECT_TRUE(state_changes.IsDirty());
116 state_changes.Reset();
117 EXPECT_FALSE(state_changes.cursor_moved);
118 EXPECT_FALSE(state_changes.IsDirty());
119
120 state_changes.bell_count++;
121 EXPECT_TRUE(state_changes.IsDirty());
122 state_changes.Reset();
123 EXPECT_EQ(0u, state_changes.bell_count);
124 EXPECT_FALSE(state_changes.IsDirty());
125
126 state_changes.dirty_rect = MotermModel::Rectangle(1, 2, 34, 56);
127 EXPECT_TRUE(state_changes.IsDirty());
128 state_changes.Reset();
129 EXPECT_TRUE(state_changes.dirty_rect.IsEmpty());
130 EXPECT_FALSE(state_changes.IsDirty());
131 }
132
133 TEST(MotermModelTest, Basic) {
134 MotermModel model(MotermModel::Size(43, 132), MotermModel::Size(25, 80));
135
136 MotermModel::Size size = model.GetSize();
137 EXPECT_EQ(25u, size.rows);
138 EXPECT_EQ(80u, size.columns);
139
140 // The cursor should start out at the upper-left.
141 MotermModel::Position cursor_pos = model.GetCursorPosition();
142 EXPECT_EQ(0, cursor_pos.row);
143 EXPECT_EQ(0, cursor_pos.column);
144
145 MotermModel::StateChanges state_changes;
146 EXPECT_FALSE(state_changes.IsDirty());
147
148 // Print "XYZ" in bright (bold) green on red.
149 static const char kXYZ[] = "\x1b[1;32;41mXYZ";
150 model.ProcessInput(kXYZ, sizeof(kXYZ) - 1, &state_changes);
151 EXPECT_TRUE(state_changes.IsDirty());
152 EXPECT_TRUE(state_changes.cursor_moved);
153 EXPECT_EQ(0u, state_changes.bell_count);
154 EXPECT_FALSE(state_changes.dirty_rect.IsEmpty());
155 // The model has some flexibility in the size of the dirty rectangle (it may
156 // over-report), but it should contain the actually-dirty part.
157 EXPECT_LE(state_changes.dirty_rect.position.row, 0);
158 EXPECT_LE(state_changes.dirty_rect.position.column, 0);
159 EXPECT_GE(state_changes.dirty_rect.size.rows, 1u);
160 EXPECT_GE(state_changes.dirty_rect.size.columns, 3u);
161
162 // Get the 'Y'.
163 MotermModel::CharacterInfo char_info =
164 model.GetCharacterInfoAt(MotermModel::Position(0, 1));
165 EXPECT_EQ(static_cast<uint32_t>('Y'), char_info.code_point);
166 EXPECT_EQ(MotermModel::kAttributesBold, char_info.attributes);
167 // The foreground should be (bright) green-ish; this is a guess at what that
168 // means.
169 EXPECT_GE(char_info.foreground_color.green, 100u);
170 EXPECT_GE(char_info.foreground_color.green / 2,
171 char_info.foreground_color.red);
172 EXPECT_GE(char_info.foreground_color.green / 2,
173 char_info.foreground_color.blue);
174 // The background_color should be (non-bright) red-ish.
175 EXPECT_GE(char_info.background_color.red, 50u);
176 EXPECT_GE(char_info.background_color.red / 2,
177 char_info.background_color.green);
178 EXPECT_GE(char_info.background_color.red / 2,
179 char_info.background_color.blue);
180
181 state_changes.Reset();
182 EXPECT_FALSE(state_changes.IsDirty());
183
184 // Now ring the bell three times.
185 static const char kBellBellBell[] = "\a\a\a";
186 model.ProcessInput(kBellBellBell, sizeof(kBellBellBell) - 1, &state_changes);
187 EXPECT_TRUE(state_changes.IsDirty());
188 EXPECT_FALSE(state_changes.cursor_moved);
189 EXPECT_EQ(3u, state_changes.bell_count);
190 EXPECT_TRUE(state_changes.dirty_rect.IsEmpty());
191
192 model.SetSize(MotermModel::Size(43, 132), false);
193 size = model.GetSize();
194 EXPECT_EQ(43u, size.rows);
195 EXPECT_EQ(132u, size.columns);
196
197 model.SetSize(MotermModel::Size(40, 100), true);
198 size = model.GetSize();
199 EXPECT_EQ(40u, size.rows);
200 EXPECT_EQ(100u, size.columns);
201 }
202
203 } // namespace
OLDNEW
« no previous file with comments | « apps/moterm/moterm_model.cc ('k') | mojo/tools/data/apptests » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698