blob: efef72c81063ccb67e4a41763aba6aecd45c3afd [file]
#include "mpact/sim/decoder/resource.h"
#include "absl/status/statusor.h"
#include "googlemock/include/gmock/gmock.h"
#include "googletest/include/gtest/gtest.h"
namespace {
// This file contains tests for Resource and ResourceFactory.
using ::mpact::sim::machine_description::instruction_set::ResourceFactory;
constexpr char kResource1PascalName[] = "Resource1Name";
constexpr char kResource1Name[] = "resource_1_name";
constexpr char kResource2Name[] = "resource_2_name";
class ResourceTest : public ::testing::Test {
protected:
ResourceTest() {}
~ResourceTest() override {}
ResourceFactory factory_;
};
// Test that ResourceFactory works as expected.
TEST_F(ResourceTest, Factory) {
auto result = factory_.CreateResource(kResource1Name);
EXPECT_TRUE(result.status().ok());
auto result2 = factory_.CreateResource(kResource1Name);
EXPECT_TRUE(absl::IsAlreadyExists(result2.status()));
auto* resource1 = factory_.GetOrInsertResource(kResource1Name);
EXPECT_EQ(result.value(), resource1);
auto* resource2 = factory_.GetOrInsertResource(kResource2Name);
EXPECT_NE(resource2, nullptr);
EXPECT_NE(resource2, resource1);
auto result3 = factory_.CreateResource(kResource2Name);
EXPECT_TRUE(absl::IsAlreadyExists(result3.status()));
EXPECT_EQ(factory_.resource_map().find(kResource1Name)->second, resource1);
EXPECT_EQ(factory_.resource_map().find(kResource2Name)->second, resource2);
}
// Test initial state of a new resource.
TEST_F(ResourceTest, ResourceInitial) {
auto* resource = factory_.GetOrInsertResource(kResource1Name);
EXPECT_TRUE(resource->is_simple());
EXPECT_FALSE(resource->is_multi_valued());
EXPECT_EQ(resource->name(), kResource1Name);
EXPECT_EQ(resource->pascal_name(), kResource1PascalName);
}
// Test resource setters.
TEST_F(ResourceTest, ResourceSetters) {
auto* resource = factory_.GetOrInsertResource(kResource1Name);
resource->set_is_simple(false);
resource->set_is_multi_valued(true);
EXPECT_FALSE(resource->is_simple());
EXPECT_TRUE(resource->is_multi_valued());
resource->set_is_simple(true);
resource->set_is_multi_valued(false);
EXPECT_TRUE(resource->is_simple());
EXPECT_FALSE(resource->is_multi_valued());
}
} // namespace