1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright 2008 Google Inc.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Author: Lincoln Smith
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Licensed under the Apache License, Version 2.0 (the "License");
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// you may not use this file except in compliance with the License.
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// You may obtain a copy of the License at
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//      http://www.apache.org/licenses/LICENSE-2.0
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Unless required by applicable law or agreed to in writing, software
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// distributed under the License is distributed on an "AS IS" BASIS,
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// See the License for the specific language governing permissions and
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// limitations under the License.
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Unit tests for struct VCDiffCodeTableData, found in codetable.h.
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <config.h>
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "codetable.h"
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "addrcache.h"
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing.h"
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace open_vcdiff {
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace {
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass CodeTableTest : public testing::Test {
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected:
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CodeTableTest()
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  : code_table_data_(VCDiffCodeTableData::kDefaultCodeTableData) { }
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual ~CodeTableTest() { }
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void SetUp() {
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Default code table must pass
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_TRUE(ValidateCodeTable());
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static void AddExerciseOpcode(unsigned char inst1,
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                unsigned char mode1,
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                unsigned char size1,
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                unsigned char inst2,
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                unsigned char mode2,
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                unsigned char size2,
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                int opcode) {
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    g_exercise_code_table_->inst1[opcode] = inst1;
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    g_exercise_code_table_->mode1[opcode] = mode1;
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    g_exercise_code_table_->size1[opcode] = (inst1 == VCD_NOOP) ? 0 : size1;
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    g_exercise_code_table_->inst2[opcode] = inst2;
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    g_exercise_code_table_->mode2[opcode] = mode2;
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    g_exercise_code_table_->size2[opcode] = (inst2 == VCD_NOOP) ? 0 : size2;
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static void SetUpTestCase() {
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    g_exercise_code_table_ = new VCDiffCodeTableData;
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int opcode = 0;
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    for (unsigned char inst_mode1 = 0;
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         inst_mode1 <= VCD_LAST_INSTRUCTION_TYPE + kLastExerciseMode;
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         ++inst_mode1) {
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      unsigned char inst1 = inst_mode1;
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      unsigned char mode1 = 0;
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      if (inst_mode1 > VCD_COPY) {
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        inst1 = VCD_COPY;
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mode1 = inst_mode1 - VCD_COPY;
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      }
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      for (unsigned char inst_mode2 = 0;
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott           inst_mode2 <= VCD_LAST_INSTRUCTION_TYPE + kLastExerciseMode;
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott           ++inst_mode2) {
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        unsigned char inst2 = inst_mode2;
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        unsigned char mode2 = 0;
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (inst_mode2 > VCD_COPY) {
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          inst2 = VCD_COPY;
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          mode2 = inst_mode2 - VCD_COPY;
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        AddExerciseOpcode(inst1, mode1, 0, inst2, mode2, 0, opcode++);
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        AddExerciseOpcode(inst1, mode1, 0, inst2, mode2, 255, opcode++);
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        AddExerciseOpcode(inst1, mode1, 255, inst2, mode2, 0, opcode++);
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        AddExerciseOpcode(inst1, mode1, 255, inst2, mode2, 255, opcode++);
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      }
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // This is a CHECK rather than an EXPECT because it validates only
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // the logic of the test, not of the code being tested.
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    CHECK_EQ(VCDiffCodeTableData::kCodeTableSize, opcode);
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_TRUE(VCDiffCodeTableData::kDefaultCodeTableData.Validate());
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_TRUE(g_exercise_code_table_->Validate(kLastExerciseMode));
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static void TearDownTestCase() {
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    delete g_exercise_code_table_;
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void VerifyInstruction(unsigned char opcode,
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                         unsigned char inst,
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                         unsigned char size,
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                         unsigned char mode) {
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(inst, code_table_data_.inst1[opcode]);
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(size, code_table_data_.size1[opcode]);
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(mode, code_table_data_.mode1[opcode]);
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(VCD_NOOP, code_table_data_.inst2[opcode]);
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(0, code_table_data_.size2[opcode]);
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(0, code_table_data_.mode2[opcode]);
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool ValidateCodeTable() {
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return code_table_data_.Validate();
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // This value is designed so that the total number of inst values and modes
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // will equal 8 (VCD_NOOP, VCD_ADD, VCD_RUN, VCD_COPY modes 0 - 4).
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Eight combinations of inst and mode, times two possible size values,
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // squared (because there are two instructions per opcode), makes
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // exactly 256 possible instruction combinations, which fits kCodeTableSize
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // (the number of opcodes in the table.)
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const int kLastExerciseMode = 4;
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // A code table that exercises as many combinations as possible:
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // 2 instructions, each is a NOOP, ADD, RUN, or one of 5 copy modes
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // (== 8 total combinations of inst and mode), and each has
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // size == 0 or 255 (2 possibilities.)
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static VCDiffCodeTableData* g_exercise_code_table_;
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The code table used by the current test.
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VCDiffCodeTableData code_table_data_;
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottVCDiffCodeTableData* CodeTableTest::g_exercise_code_table_ = NULL;
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// These tests make sure that ValidateCodeTable() catches particular
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// error conditions in a custom code table.
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// All possible combinations of inst and mode should have an opcode with size 0.
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(CodeTableTest, MissingCopyMode) {
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VerifyInstruction(/* opcode */ 131, VCD_COPY, /* size */ 0, /* mode */ 7);
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.size1[131] = 0xFF;
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Now there is no opcode expressing COPY with mode 7 and size 0.
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ValidateCodeTable());
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(CodeTableTest, MissingAdd) {
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VerifyInstruction(/* opcode */ 1, VCD_ADD, /* size */ 0, /* mode */ 0);
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.size1[1] = 0xFF;  // Add size 0 => size 255
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Now there is no opcode expressing ADD with size 0.
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ValidateCodeTable());
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(CodeTableTest, MissingRun) {
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VerifyInstruction(/* opcode */ 0, VCD_RUN, /* size */ 0, /* mode */ 0);
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.size1[0] = 0xFF;  // Run size 0 => size 255
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Now there is no opcode expressing RUN with size 0.
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ValidateCodeTable());
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(CodeTableTest, BadOpcode) {
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VerifyInstruction(/* opcode */ 0, VCD_RUN, /* size */ 0, /* mode */ 0);
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.inst1[0] = VCD_LAST_INSTRUCTION_TYPE + 1;
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ValidateCodeTable());
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.inst1[0] = 0xFF;
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ValidateCodeTable());
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(CodeTableTest, BadMode) {
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VerifyInstruction(/* opcode */ 131, VCD_COPY, /* size */ 0, /* mode */ 7);
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.mode1[131] = VCDiffAddressCache::DefaultLastMode() + 1;
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ValidateCodeTable());
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.mode1[131] = 0xFF;
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ValidateCodeTable());
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(CodeTableTest, AddWithNonzeroMode) {
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VerifyInstruction(/* opcode */ 1, VCD_ADD, /* size */ 0, /* mode */ 0);
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.mode1[1] = 1;
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ValidateCodeTable());
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(CodeTableTest, RunWithNonzeroMode) {
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VerifyInstruction(/* opcode */ 0, VCD_RUN, /* size */ 0, /* mode */ 0);
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.mode1[0] = 1;
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ValidateCodeTable());
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(CodeTableTest, NoOpWithNonzeroMode) {
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VerifyInstruction(/* opcode */ 20, VCD_COPY, /* size */ 4, /* mode */ 0);
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.inst1[20] = VCD_NOOP;
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.mode1[20] = 0;
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.size1[20] = 0;
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ValidateCodeTable());
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.mode1[20] = 1;
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ValidateCodeTable());
189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(CodeTableTest, NoOpWithNonzeroSize) {
192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VerifyInstruction(/* opcode */ 20, VCD_COPY, /* size */ 4, /* mode */ 0);
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.inst1[20] = VCD_NOOP;
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.mode1[20] = 0;
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.size1[20] = 0;
196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ValidateCodeTable());
197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.size1[20] = 1;
198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ValidateCodeTable());
199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(CodeTableTest, BadSecondOpcode) {
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VerifyInstruction(/* opcode */ 20, VCD_COPY, /* size */ 4, /* mode */ 0);
203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.inst2[20] = VCD_LAST_INSTRUCTION_TYPE + 1;
204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ValidateCodeTable());
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.inst2[20] = 0xFF;
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ValidateCodeTable());
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(CodeTableTest, BadSecondMode) {
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VerifyInstruction(/* opcode */ 20, VCD_COPY, /* size */ 4, /* mode */ 0);
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.inst2[20] = VCD_COPY;
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ValidateCodeTable());
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.mode2[20] = VCDiffAddressCache::DefaultLastMode() + 1;
214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ValidateCodeTable());
215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.mode2[20] = 0xFF;
216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ValidateCodeTable());
217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(CodeTableTest, AddSecondWithNonzeroMode) {
220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VerifyInstruction(/* opcode */ 20, VCD_COPY, /* size */ 4, /* mode */ 0);
221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.inst2[20] = VCD_ADD;
222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ValidateCodeTable());
223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.mode2[20] = 1;
224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ValidateCodeTable());
225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(CodeTableTest, RunSecondWithNonzeroMode) {
228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VerifyInstruction(/* opcode */ 20, VCD_COPY, /* size */ 4, /* mode */ 0);
229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.inst2[20] = VCD_RUN;
230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ValidateCodeTable());
231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.mode2[20] = 1;
232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ValidateCodeTable());
233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(CodeTableTest, SecondNoOpWithNonzeroMode) {
236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VerifyInstruction(/* opcode */ 20, VCD_COPY, /* size */ 4, /* mode */ 0);
237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VCD_NOOP, code_table_data_.inst2[20]);
238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.mode2[20] = 1;
239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ValidateCodeTable());
240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(CodeTableTest, SecondNoOpWithNonzeroSize) {
243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VerifyInstruction(/* opcode */ 20, VCD_COPY, /* size */ 4, /* mode */ 0);
244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VCD_NOOP, code_table_data_.inst2[20]);
245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  code_table_data_.size2[20] = 1;
246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ValidateCodeTable());
247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(CodeTableTest, ValidateExerciseCodeTable) {
250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(g_exercise_code_table_->Validate(kLastExerciseMode));
251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // unnamed namespace
254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace open_vcdiff
255