blob: 1070db81321711f8ac3ef04f8dfddd0f25496578 [file] [log] [blame]
openvcdiff311c7142008-08-26 19:29:25 +00001// Copyright 2008 Google Inc.
2// Author: Lincoln Smith
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
16// Unit tests for the class VCDiffInstructionMap, found in instruction_map.h.
17
18#include <config.h>
19#include "instruction_map.h"
20#include "codetable.h"
21#include "testing.h"
22#include "vcdiff_defs.h"
23
24namespace open_vcdiff {
25namespace {
26
27class InstructionMapTest : public testing::Test {
28 protected:
openvcdiff28db8072008-10-10 23:29:11 +000029 static void SetUpTestCase();
30 static void TearDownTestCase();
openvcdiff311c7142008-08-26 19:29:25 +000031
32 static void AddExerciseOpcode(unsigned char inst1,
33 unsigned char mode1,
34 unsigned char size1,
35 unsigned char inst2,
36 unsigned char mode2,
37 unsigned char size2,
openvcdiff28db8072008-10-10 23:29:11 +000038 int opcode);
openvcdiff311c7142008-08-26 19:29:25 +000039
40 void VerifyExerciseFirstInstruction(unsigned char expected_opcode,
41 unsigned char inst,
42 unsigned char size,
openvcdiff28db8072008-10-10 23:29:11 +000043 unsigned char mode);
openvcdiff311c7142008-08-26 19:29:25 +000044
45 void VerifyExerciseSecondInstruction(unsigned char expected_opcode,
46 unsigned char inst1,
47 unsigned char size1,
48 unsigned char mode1,
49 unsigned char inst2,
50 unsigned char size2,
openvcdiff28db8072008-10-10 23:29:11 +000051 unsigned char mode2);
openvcdiff311c7142008-08-26 19:29:25 +000052
53 // This value is designed so that the total number of inst values and modes
54 // will equal 8 (VCD_NOOP, VCD_ADD, VCD_RUN, VCD_COPY modes 0 - 4).
55 // Eight combinations of inst and mode, times two possible size values,
56 // squared (because there are two instructions per opcode), makes
57 // exactly 256 possible instruction combinations, which fits kCodeTableSize
58 // (the number of opcodes in the table.)
59 static const int kLastExerciseMode = 4;
60
61 // A code table that exercises as many combinations as possible:
62 // 2 instructions, each is a NOOP, ADD, RUN, or one of 5 copy modes
63 // (== 8 total combinations of inst and mode), and each has
64 // size == 0 or 255 (2 possibilities.)
65 static VCDiffCodeTableData* g_exercise_code_table_;
66
67 // The instruction map corresponding to kDefaultCodeTableData.
68 static const VCDiffInstructionMap* default_map;
69
70 // The instruction map corresponding to g_exercise_code_table_.
71 static const VCDiffInstructionMap* exercise_map;
72
73 size_t out_index;
74};
75
76VCDiffCodeTableData* InstructionMapTest::g_exercise_code_table_ = NULL;
77const VCDiffInstructionMap* InstructionMapTest::default_map = NULL;
78const VCDiffInstructionMap* InstructionMapTest::exercise_map = NULL;
79
openvcdiff28db8072008-10-10 23:29:11 +000080void InstructionMapTest::SetUpTestCase() {
81 g_exercise_code_table_ = new VCDiffCodeTableData;
82 int opcode = 0;
83 for (unsigned char inst_mode1 = 0;
84 inst_mode1 <= VCD_LAST_INSTRUCTION_TYPE + kLastExerciseMode;
85 ++inst_mode1) {
86 unsigned char inst1 = inst_mode1;
87 unsigned char mode1 = 0;
88 if (inst_mode1 > VCD_COPY) {
89 inst1 = VCD_COPY;
90 mode1 = inst_mode1 - VCD_COPY;
91 }
92 for (unsigned char inst_mode2 = 0;
93 inst_mode2 <= VCD_LAST_INSTRUCTION_TYPE + kLastExerciseMode;
94 ++inst_mode2) {
95 unsigned char inst2 = inst_mode2;
96 unsigned char mode2 = 0;
97 if (inst_mode2 > VCD_COPY) {
98 inst2 = VCD_COPY;
99 mode2 = inst_mode2 - VCD_COPY;
100 }
101 AddExerciseOpcode(inst1, mode1, 0, inst2, mode2, 0, opcode++);
102 AddExerciseOpcode(inst1, mode1, 0, inst2, mode2, 255, opcode++);
103 AddExerciseOpcode(inst1, mode1, 255, inst2, mode2, 0, opcode++);
104 AddExerciseOpcode(inst1, mode1, 255, inst2, mode2, 255, opcode++);
105 }
106 }
107 // This is a CHECK rather than an EXPECT because it validates only
108 // the logic of the test, not of the code being tested.
109 CHECK_EQ(VCDiffCodeTableData::kCodeTableSize, opcode);
110
111 EXPECT_TRUE(VCDiffCodeTableData::kDefaultCodeTableData.Validate());
112 EXPECT_TRUE(g_exercise_code_table_->Validate(kLastExerciseMode));
113 default_map = VCDiffInstructionMap::GetDefaultInstructionMap();
114 exercise_map = new VCDiffInstructionMap(*g_exercise_code_table_,
115 kLastExerciseMode);
116}
117
118void InstructionMapTest::TearDownTestCase() {
119 delete exercise_map;
120 delete g_exercise_code_table_;
121}
122
123void InstructionMapTest::AddExerciseOpcode(unsigned char inst1,
124 unsigned char mode1,
125 unsigned char size1,
126 unsigned char inst2,
127 unsigned char mode2,
128 unsigned char size2,
129 int opcode) {
130 g_exercise_code_table_->inst1[opcode] = inst1;
131 g_exercise_code_table_->mode1[opcode] = mode1;
132 g_exercise_code_table_->size1[opcode] = (inst1 == VCD_NOOP) ? 0 : size1;
133 g_exercise_code_table_->inst2[opcode] = inst2;
134 g_exercise_code_table_->mode2[opcode] = mode2;
135 g_exercise_code_table_->size2[opcode] = (inst2 == VCD_NOOP) ? 0 : size2;
136}
137
138void InstructionMapTest::VerifyExerciseFirstInstruction(
139 unsigned char expected_opcode,
140 unsigned char inst,
141 unsigned char size,
142 unsigned char mode) {
143 int found_opcode = exercise_map->LookupFirstOpcode(inst, size, mode);
144 if (g_exercise_code_table_->inst1[found_opcode] == VCD_NOOP) {
145 // The opcode is backwards: (VCD_NOOP, [instruction])
146 EXPECT_GE(expected_opcode, found_opcode);
147 EXPECT_EQ(inst, g_exercise_code_table_->inst2[found_opcode]);
148 EXPECT_EQ(size, g_exercise_code_table_->size2[found_opcode]);
149 EXPECT_EQ(mode, g_exercise_code_table_->mode2[found_opcode]);
150 EXPECT_EQ(VCD_NOOP, g_exercise_code_table_->inst1[found_opcode]);
151 EXPECT_EQ(0, g_exercise_code_table_->size1[found_opcode]);
152 EXPECT_EQ(0, g_exercise_code_table_->mode1[found_opcode]);
153 } else {
154 EXPECT_EQ(expected_opcode, found_opcode);
155 EXPECT_EQ(inst, g_exercise_code_table_->inst1[found_opcode]);
156 EXPECT_EQ(size, g_exercise_code_table_->size1[found_opcode]);
157 EXPECT_EQ(mode, g_exercise_code_table_->mode1[found_opcode]);
158 EXPECT_EQ(VCD_NOOP, g_exercise_code_table_->inst2[found_opcode]);
159 EXPECT_EQ(0, g_exercise_code_table_->size2[found_opcode]);
160 EXPECT_EQ(0, g_exercise_code_table_->mode2[found_opcode]);
161 }
162}
163
164void InstructionMapTest::VerifyExerciseSecondInstruction(
165 unsigned char expected_opcode,
166 unsigned char inst1,
167 unsigned char size1,
168 unsigned char mode1,
169 unsigned char inst2,
170 unsigned char size2,
171 unsigned char mode2) {
172 int first_opcode = exercise_map->LookupFirstOpcode(inst1, size1, mode1);
173 EXPECT_NE(kNoOpcode, first_opcode);
174 EXPECT_EQ(expected_opcode,
175 exercise_map->LookupSecondOpcode(first_opcode,
176 inst2,
177 size2,
178 mode2));
179}
180
openvcdiff311c7142008-08-26 19:29:25 +0000181TEST_F(InstructionMapTest, DefaultMapLookupFirstNoop) {
182 EXPECT_EQ(kNoOpcode, default_map->LookupFirstOpcode(VCD_NOOP, 0, 0));
183 EXPECT_EQ(kNoOpcode, default_map->LookupFirstOpcode(VCD_NOOP, 0, 255));
184 EXPECT_EQ(kNoOpcode, default_map->LookupFirstOpcode(VCD_NOOP, 255, 0));
185 EXPECT_EQ(kNoOpcode, default_map->LookupFirstOpcode(VCD_NOOP, 255, 255));
186}
187
188TEST_F(InstructionMapTest, DefaultMapLookupFirstAdd) {
189 EXPECT_EQ(2, default_map->LookupFirstOpcode(VCD_ADD, 1, 0));
190 EXPECT_EQ(3, default_map->LookupFirstOpcode(VCD_ADD, 2, 0));
191 EXPECT_EQ(4, default_map->LookupFirstOpcode(VCD_ADD, 3, 0));
192 EXPECT_EQ(5, default_map->LookupFirstOpcode(VCD_ADD, 4, 0));
193 EXPECT_EQ(6, default_map->LookupFirstOpcode(VCD_ADD, 5, 0));
194 EXPECT_EQ(7, default_map->LookupFirstOpcode(VCD_ADD, 6, 0));
195 EXPECT_EQ(8, default_map->LookupFirstOpcode(VCD_ADD, 7, 0));
196 EXPECT_EQ(9, default_map->LookupFirstOpcode(VCD_ADD, 8, 0));
197 EXPECT_EQ(10, default_map->LookupFirstOpcode(VCD_ADD, 9, 0));
198 EXPECT_EQ(11, default_map->LookupFirstOpcode(VCD_ADD, 10, 0));
199 EXPECT_EQ(12, default_map->LookupFirstOpcode(VCD_ADD, 11, 0));
200 EXPECT_EQ(13, default_map->LookupFirstOpcode(VCD_ADD, 12, 0));
201 EXPECT_EQ(14, default_map->LookupFirstOpcode(VCD_ADD, 13, 0));
202 EXPECT_EQ(15, default_map->LookupFirstOpcode(VCD_ADD, 14, 0));
203 EXPECT_EQ(16, default_map->LookupFirstOpcode(VCD_ADD, 15, 0));
204 EXPECT_EQ(17, default_map->LookupFirstOpcode(VCD_ADD, 16, 0));
205 EXPECT_EQ(18, default_map->LookupFirstOpcode(VCD_ADD, 17, 0));
206 EXPECT_EQ(kNoOpcode, default_map->LookupFirstOpcode(VCD_ADD, 100, 0));
207 EXPECT_EQ(kNoOpcode, default_map->LookupFirstOpcode(VCD_ADD, 255, 0));
208 EXPECT_EQ(1, default_map->LookupFirstOpcode(VCD_ADD, 0, 0));
209 // Value of "mode" should not matter
210 EXPECT_EQ(2, default_map->LookupFirstOpcode(VCD_ADD, 1, 2));
211 EXPECT_EQ(2, default_map->LookupFirstOpcode(VCD_ADD, 1, 255));
212}
213
214TEST_F(InstructionMapTest, DefaultMapLookupFirstRun) {
215 EXPECT_EQ(0, default_map->LookupFirstOpcode(VCD_RUN, 0, 0));
216 EXPECT_EQ(kNoOpcode, default_map->LookupFirstOpcode(VCD_RUN, 1, 0));
217 EXPECT_EQ(kNoOpcode, default_map->LookupFirstOpcode(VCD_RUN, 255, 0));
218 // Value of "mode" should not matter
219 EXPECT_EQ(0, default_map->LookupFirstOpcode(VCD_RUN, 0, 2));
220}
221
222TEST_F(InstructionMapTest, DefaultMapLookupFirstCopyMode0) {
223 EXPECT_EQ(19, default_map->LookupFirstOpcode(VCD_COPY, 0, 0));
224 EXPECT_EQ(20, default_map->LookupFirstOpcode(VCD_COPY, 4, 0));
225 EXPECT_EQ(21, default_map->LookupFirstOpcode(VCD_COPY, 5, 0));
226 EXPECT_EQ(22, default_map->LookupFirstOpcode(VCD_COPY, 6, 0));
227 EXPECT_EQ(23, default_map->LookupFirstOpcode(VCD_COPY, 7, 0));
228 EXPECT_EQ(24, default_map->LookupFirstOpcode(VCD_COPY, 8, 0));
229 EXPECT_EQ(25, default_map->LookupFirstOpcode(VCD_COPY, 9, 0));
230 EXPECT_EQ(26, default_map->LookupFirstOpcode(VCD_COPY, 10, 0));
231 EXPECT_EQ(27, default_map->LookupFirstOpcode(VCD_COPY, 11, 0));
232 EXPECT_EQ(28, default_map->LookupFirstOpcode(VCD_COPY, 12, 0));
233 EXPECT_EQ(29, default_map->LookupFirstOpcode(VCD_COPY, 13, 0));
234 EXPECT_EQ(30, default_map->LookupFirstOpcode(VCD_COPY, 14, 0));
235 EXPECT_EQ(31, default_map->LookupFirstOpcode(VCD_COPY, 15, 0));
236 EXPECT_EQ(32, default_map->LookupFirstOpcode(VCD_COPY, 16, 0));
237 EXPECT_EQ(33, default_map->LookupFirstOpcode(VCD_COPY, 17, 0));
238 EXPECT_EQ(34, default_map->LookupFirstOpcode(VCD_COPY, 18, 0));
239}
240
241TEST_F(InstructionMapTest, DefaultMapLookupFirstCopyMode1) {
242 EXPECT_EQ(35, default_map->LookupFirstOpcode(VCD_COPY, 0, 1));
243 EXPECT_EQ(36, default_map->LookupFirstOpcode(VCD_COPY, 4, 1));
244 EXPECT_EQ(37, default_map->LookupFirstOpcode(VCD_COPY, 5, 1));
245 EXPECT_EQ(38, default_map->LookupFirstOpcode(VCD_COPY, 6, 1));
246 EXPECT_EQ(39, default_map->LookupFirstOpcode(VCD_COPY, 7, 1));
247 EXPECT_EQ(40, default_map->LookupFirstOpcode(VCD_COPY, 8, 1));
248 EXPECT_EQ(41, default_map->LookupFirstOpcode(VCD_COPY, 9, 1));
249 EXPECT_EQ(42, default_map->LookupFirstOpcode(VCD_COPY, 10, 1));
250 EXPECT_EQ(43, default_map->LookupFirstOpcode(VCD_COPY, 11, 1));
251 EXPECT_EQ(44, default_map->LookupFirstOpcode(VCD_COPY, 12, 1));
252 EXPECT_EQ(45, default_map->LookupFirstOpcode(VCD_COPY, 13, 1));
253 EXPECT_EQ(46, default_map->LookupFirstOpcode(VCD_COPY, 14, 1));
254 EXPECT_EQ(47, default_map->LookupFirstOpcode(VCD_COPY, 15, 1));
255 EXPECT_EQ(48, default_map->LookupFirstOpcode(VCD_COPY, 16, 1));
256 EXPECT_EQ(49, default_map->LookupFirstOpcode(VCD_COPY, 17, 1));
257 EXPECT_EQ(50, default_map->LookupFirstOpcode(VCD_COPY, 18, 1));
258}
259
260TEST_F(InstructionMapTest, DefaultMapLookupFirstCopyMode2) {
261 EXPECT_EQ(51, default_map->LookupFirstOpcode(VCD_COPY, 0, 2));
262 EXPECT_EQ(52, default_map->LookupFirstOpcode(VCD_COPY, 4, 2));
263 EXPECT_EQ(53, default_map->LookupFirstOpcode(VCD_COPY, 5, 2));
264 EXPECT_EQ(54, default_map->LookupFirstOpcode(VCD_COPY, 6, 2));
265 EXPECT_EQ(55, default_map->LookupFirstOpcode(VCD_COPY, 7, 2));
266 EXPECT_EQ(56, default_map->LookupFirstOpcode(VCD_COPY, 8, 2));
267 EXPECT_EQ(57, default_map->LookupFirstOpcode(VCD_COPY, 9, 2));
268 EXPECT_EQ(58, default_map->LookupFirstOpcode(VCD_COPY, 10, 2));
269 EXPECT_EQ(59, default_map->LookupFirstOpcode(VCD_COPY, 11, 2));
270 EXPECT_EQ(60, default_map->LookupFirstOpcode(VCD_COPY, 12, 2));
271 EXPECT_EQ(61, default_map->LookupFirstOpcode(VCD_COPY, 13, 2));
272 EXPECT_EQ(62, default_map->LookupFirstOpcode(VCD_COPY, 14, 2));
273 EXPECT_EQ(63, default_map->LookupFirstOpcode(VCD_COPY, 15, 2));
274 EXPECT_EQ(64, default_map->LookupFirstOpcode(VCD_COPY, 16, 2));
275 EXPECT_EQ(65, default_map->LookupFirstOpcode(VCD_COPY, 17, 2));
276 EXPECT_EQ(66, default_map->LookupFirstOpcode(VCD_COPY, 18, 2));
277}
278
279TEST_F(InstructionMapTest, DefaultMapLookupFirstCopyMode3) {
280 EXPECT_EQ(67, default_map->LookupFirstOpcode(VCD_COPY, 0, 3));
281 EXPECT_EQ(68, default_map->LookupFirstOpcode(VCD_COPY, 4, 3));
282 EXPECT_EQ(69, default_map->LookupFirstOpcode(VCD_COPY, 5, 3));
283 EXPECT_EQ(70, default_map->LookupFirstOpcode(VCD_COPY, 6, 3));
284 EXPECT_EQ(71, default_map->LookupFirstOpcode(VCD_COPY, 7, 3));
285 EXPECT_EQ(72, default_map->LookupFirstOpcode(VCD_COPY, 8, 3));
286 EXPECT_EQ(73, default_map->LookupFirstOpcode(VCD_COPY, 9, 3));
287 EXPECT_EQ(74, default_map->LookupFirstOpcode(VCD_COPY, 10, 3));
288 EXPECT_EQ(75, default_map->LookupFirstOpcode(VCD_COPY, 11, 3));
289 EXPECT_EQ(76, default_map->LookupFirstOpcode(VCD_COPY, 12, 3));
290 EXPECT_EQ(77, default_map->LookupFirstOpcode(VCD_COPY, 13, 3));
291 EXPECT_EQ(78, default_map->LookupFirstOpcode(VCD_COPY, 14, 3));
292 EXPECT_EQ(79, default_map->LookupFirstOpcode(VCD_COPY, 15, 3));
293 EXPECT_EQ(80, default_map->LookupFirstOpcode(VCD_COPY, 16, 3));
294 EXPECT_EQ(81, default_map->LookupFirstOpcode(VCD_COPY, 17, 3));
295 EXPECT_EQ(82, default_map->LookupFirstOpcode(VCD_COPY, 18, 3));
296}
297
298TEST_F(InstructionMapTest, DefaultMapLookupFirstCopyMode4) {
299 EXPECT_EQ(83, default_map->LookupFirstOpcode(VCD_COPY, 0, 4));
300 EXPECT_EQ(84, default_map->LookupFirstOpcode(VCD_COPY, 4, 4));
301 EXPECT_EQ(85, default_map->LookupFirstOpcode(VCD_COPY, 5, 4));
302 EXPECT_EQ(86, default_map->LookupFirstOpcode(VCD_COPY, 6, 4));
303 EXPECT_EQ(87, default_map->LookupFirstOpcode(VCD_COPY, 7, 4));
304 EXPECT_EQ(88, default_map->LookupFirstOpcode(VCD_COPY, 8, 4));
305 EXPECT_EQ(89, default_map->LookupFirstOpcode(VCD_COPY, 9, 4));
306 EXPECT_EQ(90, default_map->LookupFirstOpcode(VCD_COPY, 10, 4));
307 EXPECT_EQ(91, default_map->LookupFirstOpcode(VCD_COPY, 11, 4));
308 EXPECT_EQ(92, default_map->LookupFirstOpcode(VCD_COPY, 12, 4));
309 EXPECT_EQ(93, default_map->LookupFirstOpcode(VCD_COPY, 13, 4));
310 EXPECT_EQ(94, default_map->LookupFirstOpcode(VCD_COPY, 14, 4));
311 EXPECT_EQ(95, default_map->LookupFirstOpcode(VCD_COPY, 15, 4));
312 EXPECT_EQ(96, default_map->LookupFirstOpcode(VCD_COPY, 16, 4));
313 EXPECT_EQ(97, default_map->LookupFirstOpcode(VCD_COPY, 17, 4));
314 EXPECT_EQ(98, default_map->LookupFirstOpcode(VCD_COPY, 18, 4));
315}
316
317TEST_F(InstructionMapTest, DefaultMapLookupFirstCopyMode5) {
318 EXPECT_EQ(99, default_map->LookupFirstOpcode(VCD_COPY, 0, 5));
319 EXPECT_EQ(100, default_map->LookupFirstOpcode(VCD_COPY, 4, 5));
320 EXPECT_EQ(101, default_map->LookupFirstOpcode(VCD_COPY, 5, 5));
321 EXPECT_EQ(102, default_map->LookupFirstOpcode(VCD_COPY, 6, 5));
322 EXPECT_EQ(103, default_map->LookupFirstOpcode(VCD_COPY, 7, 5));
323 EXPECT_EQ(104, default_map->LookupFirstOpcode(VCD_COPY, 8, 5));
324 EXPECT_EQ(105, default_map->LookupFirstOpcode(VCD_COPY, 9, 5));
325 EXPECT_EQ(106, default_map->LookupFirstOpcode(VCD_COPY, 10, 5));
326 EXPECT_EQ(107, default_map->LookupFirstOpcode(VCD_COPY, 11, 5));
327 EXPECT_EQ(108, default_map->LookupFirstOpcode(VCD_COPY, 12, 5));
328 EXPECT_EQ(109, default_map->LookupFirstOpcode(VCD_COPY, 13, 5));
329 EXPECT_EQ(110, default_map->LookupFirstOpcode(VCD_COPY, 14, 5));
330 EXPECT_EQ(111, default_map->LookupFirstOpcode(VCD_COPY, 15, 5));
331 EXPECT_EQ(112, default_map->LookupFirstOpcode(VCD_COPY, 16, 5));
332 EXPECT_EQ(113, default_map->LookupFirstOpcode(VCD_COPY, 17, 5));
333 EXPECT_EQ(114, default_map->LookupFirstOpcode(VCD_COPY, 18, 5));
334}
335
336TEST_F(InstructionMapTest, DefaultMapLookupFirstCopyMode6) {
337 EXPECT_EQ(115, default_map->LookupFirstOpcode(VCD_COPY, 0, 6));
338 EXPECT_EQ(116, default_map->LookupFirstOpcode(VCD_COPY, 4, 6));
339 EXPECT_EQ(117, default_map->LookupFirstOpcode(VCD_COPY, 5, 6));
340 EXPECT_EQ(118, default_map->LookupFirstOpcode(VCD_COPY, 6, 6));
341 EXPECT_EQ(119, default_map->LookupFirstOpcode(VCD_COPY, 7, 6));
342 EXPECT_EQ(120, default_map->LookupFirstOpcode(VCD_COPY, 8, 6));
343 EXPECT_EQ(121, default_map->LookupFirstOpcode(VCD_COPY, 9, 6));
344 EXPECT_EQ(122, default_map->LookupFirstOpcode(VCD_COPY, 10, 6));
345 EXPECT_EQ(123, default_map->LookupFirstOpcode(VCD_COPY, 11, 6));
346 EXPECT_EQ(124, default_map->LookupFirstOpcode(VCD_COPY, 12, 6));
347 EXPECT_EQ(125, default_map->LookupFirstOpcode(VCD_COPY, 13, 6));
348 EXPECT_EQ(126, default_map->LookupFirstOpcode(VCD_COPY, 14, 6));
349 EXPECT_EQ(127, default_map->LookupFirstOpcode(VCD_COPY, 15, 6));
350 EXPECT_EQ(128, default_map->LookupFirstOpcode(VCD_COPY, 16, 6));
351 EXPECT_EQ(129, default_map->LookupFirstOpcode(VCD_COPY, 17, 6));
352 EXPECT_EQ(130, default_map->LookupFirstOpcode(VCD_COPY, 18, 6));
353}
354
355TEST_F(InstructionMapTest, DefaultMapLookupFirstCopyMode7) {
356 EXPECT_EQ(131, default_map->LookupFirstOpcode(VCD_COPY, 0, 7));
357 EXPECT_EQ(132, default_map->LookupFirstOpcode(VCD_COPY, 4, 7));
358 EXPECT_EQ(133, default_map->LookupFirstOpcode(VCD_COPY, 5, 7));
359 EXPECT_EQ(134, default_map->LookupFirstOpcode(VCD_COPY, 6, 7));
360 EXPECT_EQ(135, default_map->LookupFirstOpcode(VCD_COPY, 7, 7));
361 EXPECT_EQ(136, default_map->LookupFirstOpcode(VCD_COPY, 8, 7));
362 EXPECT_EQ(137, default_map->LookupFirstOpcode(VCD_COPY, 9, 7));
363 EXPECT_EQ(138, default_map->LookupFirstOpcode(VCD_COPY, 10, 7));
364 EXPECT_EQ(139, default_map->LookupFirstOpcode(VCD_COPY, 11, 7));
365 EXPECT_EQ(140, default_map->LookupFirstOpcode(VCD_COPY, 12, 7));
366 EXPECT_EQ(141, default_map->LookupFirstOpcode(VCD_COPY, 13, 7));
367 EXPECT_EQ(142, default_map->LookupFirstOpcode(VCD_COPY, 14, 7));
368 EXPECT_EQ(143, default_map->LookupFirstOpcode(VCD_COPY, 15, 7));
369 EXPECT_EQ(144, default_map->LookupFirstOpcode(VCD_COPY, 16, 7));
370 EXPECT_EQ(145, default_map->LookupFirstOpcode(VCD_COPY, 17, 7));
371 EXPECT_EQ(146, default_map->LookupFirstOpcode(VCD_COPY, 18, 7));
372}
373
374TEST_F(InstructionMapTest, DefaultMapLookupFirstCopyMode8) {
375 EXPECT_EQ(147, default_map->LookupFirstOpcode(VCD_COPY, 0, 8));
376 EXPECT_EQ(148, default_map->LookupFirstOpcode(VCD_COPY, 4, 8));
377 EXPECT_EQ(149, default_map->LookupFirstOpcode(VCD_COPY, 5, 8));
378 EXPECT_EQ(150, default_map->LookupFirstOpcode(VCD_COPY, 6, 8));
379 EXPECT_EQ(151, default_map->LookupFirstOpcode(VCD_COPY, 7, 8));
380 EXPECT_EQ(152, default_map->LookupFirstOpcode(VCD_COPY, 8, 8));
381 EXPECT_EQ(153, default_map->LookupFirstOpcode(VCD_COPY, 9, 8));
382 EXPECT_EQ(154, default_map->LookupFirstOpcode(VCD_COPY, 10, 8));
383 EXPECT_EQ(155, default_map->LookupFirstOpcode(VCD_COPY, 11, 8));
384 EXPECT_EQ(156, default_map->LookupFirstOpcode(VCD_COPY, 12, 8));
385 EXPECT_EQ(157, default_map->LookupFirstOpcode(VCD_COPY, 13, 8));
386 EXPECT_EQ(158, default_map->LookupFirstOpcode(VCD_COPY, 14, 8));
387 EXPECT_EQ(159, default_map->LookupFirstOpcode(VCD_COPY, 15, 8));
388 EXPECT_EQ(160, default_map->LookupFirstOpcode(VCD_COPY, 16, 8));
389 EXPECT_EQ(161, default_map->LookupFirstOpcode(VCD_COPY, 17, 8));
390 EXPECT_EQ(162, default_map->LookupFirstOpcode(VCD_COPY, 18, 8));
391}
392
393TEST_F(InstructionMapTest, DefaultMapLookupFirstCopyInvalid) {
394 EXPECT_EQ(kNoOpcode, default_map->LookupFirstOpcode(VCD_COPY, 3, 0));
395 EXPECT_EQ(kNoOpcode, default_map->LookupFirstOpcode(VCD_COPY, 3, 3));
396 EXPECT_EQ(kNoOpcode, default_map->LookupFirstOpcode(VCD_COPY, 255, 0));
397}
398
399TEST_F(InstructionMapTest, DefaultMapLookupSecondNoop) {
400 // The second opcode table does not store entries for NOOP instructions.
401 // Just make sure that a NOOP does not crash the lookup code.
402 EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(20, VCD_NOOP, 0, 0));
403 EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(20, VCD_NOOP, 0, 255));
404 EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(20, VCD_NOOP, 255, 0));
405 EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(20, VCD_NOOP, 255, 255));
406}
407
408TEST_F(InstructionMapTest, DefaultMapLookupSecondAdd) {
409 EXPECT_EQ(247, default_map->LookupSecondOpcode(20, VCD_ADD, 1, 0));
410 EXPECT_EQ(248, default_map->LookupSecondOpcode(36, VCD_ADD, 1, 0));
411 EXPECT_EQ(249, default_map->LookupSecondOpcode(52, VCD_ADD, 1, 0));
412 EXPECT_EQ(250, default_map->LookupSecondOpcode(68, VCD_ADD, 1, 0));
413 EXPECT_EQ(251, default_map->LookupSecondOpcode(84, VCD_ADD, 1, 0));
414 EXPECT_EQ(252, default_map->LookupSecondOpcode(100, VCD_ADD, 1, 0));
415 EXPECT_EQ(253, default_map->LookupSecondOpcode(116, VCD_ADD, 1, 0));
416 EXPECT_EQ(254, default_map->LookupSecondOpcode(132, VCD_ADD, 1, 0));
417 EXPECT_EQ(255, default_map->LookupSecondOpcode(148, VCD_ADD, 1, 0));
418 // Value of "mode" should not matter
419 EXPECT_EQ(247, default_map->LookupSecondOpcode(20, VCD_ADD, 1, 2));
420 EXPECT_EQ(247, default_map->LookupSecondOpcode(20, VCD_ADD, 1, 255));
421 // Only valid 2nd ADD opcode has size 1
422 EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(20, VCD_ADD, 0, 0));
423 EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(20, VCD_ADD, 0, 255));
424 EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(20, VCD_ADD, 255, 0));
425 EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(0, VCD_ADD, 1, 0));
426 EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(1, VCD_ADD, 1, 0));
427 EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(247, VCD_ADD, 1, 0));
428 EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(255, VCD_ADD, 1, 0));
429}
430
431TEST_F(InstructionMapTest, DefaultMapLookupSecondRun) {
432 EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(0, VCD_RUN, 0, 0));
433 EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(20, VCD_RUN, 0, 0));
434 EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(20, VCD_RUN, 0, 255));
435 EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(20, VCD_RUN, 255, 0));
436 EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(20, VCD_RUN, 255, 255));
437 EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(255, VCD_RUN, 0, 0));
438}
439
440TEST_F(InstructionMapTest, DefaultMapLookupSecondCopyMode0) {
441 EXPECT_EQ(163, default_map->LookupSecondOpcode(2, VCD_COPY, 4, 0));
442 EXPECT_EQ(164, default_map->LookupSecondOpcode(2, VCD_COPY, 5, 0));
443 EXPECT_EQ(165, default_map->LookupSecondOpcode(2, VCD_COPY, 6, 0));
444 EXPECT_EQ(166, default_map->LookupSecondOpcode(3, VCD_COPY, 4, 0));
445 EXPECT_EQ(167, default_map->LookupSecondOpcode(3, VCD_COPY, 5, 0));
446 EXPECT_EQ(168, default_map->LookupSecondOpcode(3, VCD_COPY, 6, 0));
447 EXPECT_EQ(169, default_map->LookupSecondOpcode(4, VCD_COPY, 4, 0));
448 EXPECT_EQ(170, default_map->LookupSecondOpcode(4, VCD_COPY, 5, 0));
449 EXPECT_EQ(171, default_map->LookupSecondOpcode(4, VCD_COPY, 6, 0));
450 EXPECT_EQ(172, default_map->LookupSecondOpcode(5, VCD_COPY, 4, 0));
451 EXPECT_EQ(173, default_map->LookupSecondOpcode(5, VCD_COPY, 5, 0));
452 EXPECT_EQ(174, default_map->LookupSecondOpcode(5, VCD_COPY, 6, 0));
453}
454
455TEST_F(InstructionMapTest, DefaultMapLookupSecondCopyMode1) {
456 EXPECT_EQ(175, default_map->LookupSecondOpcode(2, VCD_COPY, 4, 1));
457 EXPECT_EQ(176, default_map->LookupSecondOpcode(2, VCD_COPY, 5, 1));
458 EXPECT_EQ(177, default_map->LookupSecondOpcode(2, VCD_COPY, 6, 1));
459 EXPECT_EQ(178, default_map->LookupSecondOpcode(3, VCD_COPY, 4, 1));
460 EXPECT_EQ(179, default_map->LookupSecondOpcode(3, VCD_COPY, 5, 1));
461 EXPECT_EQ(180, default_map->LookupSecondOpcode(3, VCD_COPY, 6, 1));
462 EXPECT_EQ(181, default_map->LookupSecondOpcode(4, VCD_COPY, 4, 1));
463 EXPECT_EQ(182, default_map->LookupSecondOpcode(4, VCD_COPY, 5, 1));
464 EXPECT_EQ(183, default_map->LookupSecondOpcode(4, VCD_COPY, 6, 1));
465 EXPECT_EQ(184, default_map->LookupSecondOpcode(5, VCD_COPY, 4, 1));
466 EXPECT_EQ(185, default_map->LookupSecondOpcode(5, VCD_COPY, 5, 1));
467 EXPECT_EQ(186, default_map->LookupSecondOpcode(5, VCD_COPY, 6, 1));
468}
469
470TEST_F(InstructionMapTest, DefaultMapLookupSecondCopyMode2) {
471 EXPECT_EQ(187, default_map->LookupSecondOpcode(2, VCD_COPY, 4, 2));
472 EXPECT_EQ(188, default_map->LookupSecondOpcode(2, VCD_COPY, 5, 2));
473 EXPECT_EQ(189, default_map->LookupSecondOpcode(2, VCD_COPY, 6, 2));
474 EXPECT_EQ(190, default_map->LookupSecondOpcode(3, VCD_COPY, 4, 2));
475 EXPECT_EQ(191, default_map->LookupSecondOpcode(3, VCD_COPY, 5, 2));
476 EXPECT_EQ(192, default_map->LookupSecondOpcode(3, VCD_COPY, 6, 2));
477 EXPECT_EQ(193, default_map->LookupSecondOpcode(4, VCD_COPY, 4, 2));
478 EXPECT_EQ(194, default_map->LookupSecondOpcode(4, VCD_COPY, 5, 2));
479 EXPECT_EQ(195, default_map->LookupSecondOpcode(4, VCD_COPY, 6, 2));
480 EXPECT_EQ(196, default_map->LookupSecondOpcode(5, VCD_COPY, 4, 2));
481 EXPECT_EQ(197, default_map->LookupSecondOpcode(5, VCD_COPY, 5, 2));
482 EXPECT_EQ(198, default_map->LookupSecondOpcode(5, VCD_COPY, 6, 2));
483}
484
485TEST_F(InstructionMapTest, DefaultMapLookupSecondCopyMode3) {
486 EXPECT_EQ(199, default_map->LookupSecondOpcode(2, VCD_COPY, 4, 3));
487 EXPECT_EQ(200, default_map->LookupSecondOpcode(2, VCD_COPY, 5, 3));
488 EXPECT_EQ(201, default_map->LookupSecondOpcode(2, VCD_COPY, 6, 3));
489 EXPECT_EQ(202, default_map->LookupSecondOpcode(3, VCD_COPY, 4, 3));
490 EXPECT_EQ(203, default_map->LookupSecondOpcode(3, VCD_COPY, 5, 3));
491 EXPECT_EQ(204, default_map->LookupSecondOpcode(3, VCD_COPY, 6, 3));
492 EXPECT_EQ(205, default_map->LookupSecondOpcode(4, VCD_COPY, 4, 3));
493 EXPECT_EQ(206, default_map->LookupSecondOpcode(4, VCD_COPY, 5, 3));
494 EXPECT_EQ(207, default_map->LookupSecondOpcode(4, VCD_COPY, 6, 3));
495 EXPECT_EQ(208, default_map->LookupSecondOpcode(5, VCD_COPY, 4, 3));
496 EXPECT_EQ(209, default_map->LookupSecondOpcode(5, VCD_COPY, 5, 3));
497 EXPECT_EQ(210, default_map->LookupSecondOpcode(5, VCD_COPY, 6, 3));
498}
499
500TEST_F(InstructionMapTest, DefaultMapLookupSecondCopyMode4) {
501 EXPECT_EQ(211, default_map->LookupSecondOpcode(2, VCD_COPY, 4, 4));
502 EXPECT_EQ(212, default_map->LookupSecondOpcode(2, VCD_COPY, 5, 4));
503 EXPECT_EQ(213, default_map->LookupSecondOpcode(2, VCD_COPY, 6, 4));
504 EXPECT_EQ(214, default_map->LookupSecondOpcode(3, VCD_COPY, 4, 4));
505 EXPECT_EQ(215, default_map->LookupSecondOpcode(3, VCD_COPY, 5, 4));
506 EXPECT_EQ(216, default_map->LookupSecondOpcode(3, VCD_COPY, 6, 4));
507 EXPECT_EQ(217, default_map->LookupSecondOpcode(4, VCD_COPY, 4, 4));
508 EXPECT_EQ(218, default_map->LookupSecondOpcode(4, VCD_COPY, 5, 4));
509 EXPECT_EQ(219, default_map->LookupSecondOpcode(4, VCD_COPY, 6, 4));
510 EXPECT_EQ(220, default_map->LookupSecondOpcode(5, VCD_COPY, 4, 4));
511 EXPECT_EQ(221, default_map->LookupSecondOpcode(5, VCD_COPY, 5, 4));
512 EXPECT_EQ(222, default_map->LookupSecondOpcode(5, VCD_COPY, 6, 4));
513}
514
515TEST_F(InstructionMapTest, DefaultMapLookupSecondCopyMode5) {
516 EXPECT_EQ(223, default_map->LookupSecondOpcode(2, VCD_COPY, 4, 5));
517 EXPECT_EQ(224, default_map->LookupSecondOpcode(2, VCD_COPY, 5, 5));
518 EXPECT_EQ(225, default_map->LookupSecondOpcode(2, VCD_COPY, 6, 5));
519 EXPECT_EQ(226, default_map->LookupSecondOpcode(3, VCD_COPY, 4, 5));
520 EXPECT_EQ(227, default_map->LookupSecondOpcode(3, VCD_COPY, 5, 5));
521 EXPECT_EQ(228, default_map->LookupSecondOpcode(3, VCD_COPY, 6, 5));
522 EXPECT_EQ(229, default_map->LookupSecondOpcode(4, VCD_COPY, 4, 5));
523 EXPECT_EQ(230, default_map->LookupSecondOpcode(4, VCD_COPY, 5, 5));
524 EXPECT_EQ(231, default_map->LookupSecondOpcode(4, VCD_COPY, 6, 5));
525 EXPECT_EQ(232, default_map->LookupSecondOpcode(5, VCD_COPY, 4, 5));
526 EXPECT_EQ(233, default_map->LookupSecondOpcode(5, VCD_COPY, 5, 5));
527 EXPECT_EQ(234, default_map->LookupSecondOpcode(5, VCD_COPY, 6, 5));
528}
529
530TEST_F(InstructionMapTest, DefaultMapLookupSecondCopyMode6) {
531 EXPECT_EQ(235, default_map->LookupSecondOpcode(2, VCD_COPY, 4, 6));
532 EXPECT_EQ(236, default_map->LookupSecondOpcode(3, VCD_COPY, 4, 6));
533 EXPECT_EQ(237, default_map->LookupSecondOpcode(4, VCD_COPY, 4, 6));
534 EXPECT_EQ(238, default_map->LookupSecondOpcode(5, VCD_COPY, 4, 6));
535 EXPECT_EQ(239, default_map->LookupSecondOpcode(2, VCD_COPY, 4, 7));
536}
537
538TEST_F(InstructionMapTest, DefaultMapLookupSecondCopyMode7) {
539 EXPECT_EQ(240, default_map->LookupSecondOpcode(3, VCD_COPY, 4, 7));
540 EXPECT_EQ(241, default_map->LookupSecondOpcode(4, VCD_COPY, 4, 7));
541 EXPECT_EQ(242, default_map->LookupSecondOpcode(5, VCD_COPY, 4, 7));
542}
543
544TEST_F(InstructionMapTest, DefaultMapLookupSecondCopyMode8) {
545 EXPECT_EQ(243, default_map->LookupSecondOpcode(2, VCD_COPY, 4, 8));
546 EXPECT_EQ(244, default_map->LookupSecondOpcode(3, VCD_COPY, 4, 8));
547 EXPECT_EQ(245, default_map->LookupSecondOpcode(4, VCD_COPY, 4, 8));
548 EXPECT_EQ(246, default_map->LookupSecondOpcode(5, VCD_COPY, 4, 8));
549}
550
551TEST_F(InstructionMapTest, DefaultMapLookupSecondCopyInvalid) {
552 EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(2, VCD_COPY, 0, 0));
553 EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(2, VCD_COPY, 255, 0));
554 EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(2, VCD_COPY, 255, 255));
555 EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(0, VCD_COPY, 4, 0));
556 EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(255, VCD_COPY, 4, 0));
557}
558
559TEST_F(InstructionMapTest, ExerciseTableLookup) {
560 int opcode = 0;
561 // This loop has the same bounds as the one in SetUpTestCase.
562 // Look up each instruction type and make sure it returns
563 // the proper opcode.
564 for (unsigned char inst_mode1 = 0;
565 inst_mode1 <= VCD_LAST_INSTRUCTION_TYPE + kLastExerciseMode;
566 ++inst_mode1) {
567 unsigned char inst1 = inst_mode1;
568 unsigned char mode1 = 0;
569 if (inst_mode1 > VCD_COPY) {
570 inst1 = VCD_COPY;
571 mode1 = inst_mode1 - VCD_COPY;
572 }
573 for (unsigned char inst_mode2 = 0;
574 inst_mode2 <= VCD_LAST_INSTRUCTION_TYPE + kLastExerciseMode;
575 ++inst_mode2) {
576 unsigned char inst2 = inst_mode2;
577 unsigned char mode2 = 0;
578 if (inst_mode2 > VCD_COPY) {
579 inst2 = VCD_COPY;
580 mode2 = inst_mode2 - VCD_COPY;
581 }
582 if (inst2 == VCD_NOOP) {
583 VerifyExerciseFirstInstruction(opcode, inst1, 0, mode1);
584 VerifyExerciseFirstInstruction(opcode + 2,
585 inst1,
586 ((inst1 == VCD_NOOP) ? 0 : 255),
587 mode1);
588 } else if (inst1 != VCD_NOOP) {
589 VerifyExerciseSecondInstruction(opcode,
590 inst1,
591 0,
592 mode1,
593 inst2,
594 0,
595 mode2);
596 VerifyExerciseSecondInstruction(opcode + 1,
597 inst1,
598 0,
599 mode1,
600 inst2,
601 255,
602 mode2);
603 VerifyExerciseSecondInstruction(opcode + 2,
604 inst1,
605 255,
606 mode1,
607 inst2,
608 0,
609 mode2);
610 VerifyExerciseSecondInstruction(opcode + 3,
611 inst1,
612 255,
613 mode1,
614 inst2,
615 255,
616 mode2);
617 }
618 opcode += 4;
619 }
620 }
621 // This is a CHECK rather than an EXPECT because it validates only
622 // the logic of the test, not of the code being tested.
623 CHECK_EQ(VCDiffCodeTableData::kCodeTableSize, opcode);
624}
625
626} // unnamed namespace
627} // namespace open_vcdiff