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