| // Copyright 2023 Google LLC |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include "mpact/sim/decoder/instruction_set.h" |
| |
| #include <memory> |
| |
| #include "googlemock/include/gmock/gmock.h" |
| #include "googletest/include/gtest/gtest.h" |
| #include "mpact/sim/decoder/bundle.h" |
| #include "mpact/sim/decoder/slot.h" |
| |
| namespace mpact { |
| namespace sim { |
| namespace machine_description { |
| namespace instruction_set { |
| namespace { |
| |
| constexpr char kInstructionSetName[] = "Test"; |
| constexpr char kBundleName[] = "TestBundle"; |
| constexpr char kSlotName[] = "TestSlot"; |
| |
| class InstructionSetTest : public testing::Test { |
| protected: |
| InstructionSetTest() { |
| instruction_set_ = std::make_unique<InstructionSet>(kInstructionSetName); |
| } |
| ~InstructionSetTest() override {} |
| |
| std::unique_ptr<InstructionSet> instruction_set_; |
| }; |
| |
| // Test that the InstructionSet class in properly initialized. |
| TEST_F(InstructionSetTest, Basic) { |
| EXPECT_STREQ(instruction_set_->name().c_str(), kInstructionSetName); |
| EXPECT_EQ(nullptr, instruction_set_->bundle()); |
| Bundle *bundle = new Bundle(kBundleName, instruction_set_.get()); |
| instruction_set_->set_bundle(bundle); |
| EXPECT_EQ(instruction_set_->bundle(), bundle); |
| } |
| |
| // Test that a bundle added to the instruction set class can be retrieved by |
| // name. |
| TEST_F(InstructionSetTest, SingleBundle) { |
| EXPECT_EQ(nullptr, instruction_set_->GetBundle(kBundleName)); |
| Bundle *bundle = new Bundle(kBundleName, instruction_set_.get()); |
| instruction_set_->AddBundle(bundle); |
| EXPECT_EQ(bundle, instruction_set_->GetBundle(kBundleName)); |
| EXPECT_EQ(nullptr, instruction_set_->GetBundle(kSlotName)); |
| // The bundle will be deleted by the InstructionSet destructor. |
| } |
| |
| // Test that a slot added to the instruction set class can be retrieved by |
| // name. |
| TEST_F(InstructionSetTest, SingleSlot) { |
| EXPECT_EQ(nullptr, instruction_set_->GetSlot(kSlotName)); |
| Slot *slot = |
| new Slot(kSlotName, instruction_set_.get(), /* is_templated */ false); |
| instruction_set_->AddSlot(slot); |
| EXPECT_EQ(slot, instruction_set_->GetSlot(kSlotName)); |
| EXPECT_EQ(nullptr, instruction_set_->GetSlot(kBundleName)); |
| // The slot will be delted by the InstructionSet destructor. |
| } |
| |
| } // namespace |
| } // namespace instruction_set |
| } // namespace machine_description |
| } // namespace sim |
| } // namespace mpact |