• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // 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 
24 namespace open_vcdiff {
25 namespace {
26 
27 class InstructionMapTest : public testing::Test {
28  protected:
29   static void SetUpTestCase();
30   static void TearDownTestCase();
31 
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,
38                                 int opcode);
39 
40   void VerifyExerciseFirstInstruction(unsigned char expected_opcode,
41                                       unsigned char inst,
42                                       unsigned char size,
43                                       unsigned char mode);
44 
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,
51                                        unsigned char mode2);
52 
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 
76 VCDiffCodeTableData* InstructionMapTest::g_exercise_code_table_ = NULL;
77 const VCDiffInstructionMap* InstructionMapTest::default_map = NULL;
78 const VCDiffInstructionMap* InstructionMapTest::exercise_map = NULL;
79 
SetUpTestCase()80 void 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 
TearDownTestCase()118 void InstructionMapTest::TearDownTestCase() {
119   delete exercise_map;
120   delete g_exercise_code_table_;
121 }
122 
AddExerciseOpcode(unsigned char inst1,unsigned char mode1,unsigned char size1,unsigned char inst2,unsigned char mode2,unsigned char size2,int opcode)123 void 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 
VerifyExerciseFirstInstruction(unsigned char expected_opcode,unsigned char inst,unsigned char size,unsigned char mode)138 void 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 
VerifyExerciseSecondInstruction(unsigned char expected_opcode,unsigned char inst1,unsigned char size1,unsigned char mode1,unsigned char inst2,unsigned char size2,unsigned char mode2)164 void 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 
TEST_F(InstructionMapTest,DefaultMapLookupFirstNoop)181 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupFirstAdd)188 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupFirstRun)214 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupFirstCopyMode0)222 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupFirstCopyMode1)241 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupFirstCopyMode2)260 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupFirstCopyMode3)279 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupFirstCopyMode4)298 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupFirstCopyMode5)317 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupFirstCopyMode6)336 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupFirstCopyMode7)355 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupFirstCopyMode8)374 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupFirstCopyInvalid)393 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupSecondNoop)399 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupSecondAdd)408 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupSecondRun)431 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupSecondCopyMode0)440 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupSecondCopyMode1)455 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupSecondCopyMode2)470 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupSecondCopyMode3)485 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupSecondCopyMode4)500 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupSecondCopyMode5)515 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupSecondCopyMode6)530 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupSecondCopyMode7)538 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupSecondCopyMode8)544 TEST_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 
TEST_F(InstructionMapTest,DefaultMapLookupSecondCopyInvalid)551 TEST_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 
TEST_F(InstructionMapTest,ExerciseTableLookup)559 TEST_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
628