00001 #include <gtest/gtest.h> 00002 #include <boost/shared_ptr.hpp> 00003 #include "robot_instance/RegisterWizard.h" 00004 00005 class TestProperties : public RegisterProperties 00006 { 00007 public: 00008 TestProperties(); 00009 virtual ~TestProperties() {}; 00010 }; 00011 00012 TestProperties::TestProperties() 00013 { 00014 REGISTER_CERTIFICATE_VALUE = 0x4000; 00015 REGISTER_CERTIFICATE_MASK = 0xF000; 00016 00017 isWritable = true; 00018 00019 registerProperty["flag1"] = PropertyDef("flag1", "0=disable,1=enable", BitMinion::BIT_ZERO_INDEX, BitMinion::ONE_BIT_MASK); 00020 registerProperty["flag2"] = PropertyDef("flag2", "0=engage,1=release", BitMinion::BIT_ONE_INDEX, BitMinion::ONE_BIT_MASK); 00021 registerProperty["value"] = PropertyDef("value", "repeat count", BitMinion::BIT_EIGHT_INDEX, BitMinion::FOUR_BIT_MASK); 00022 00023 for (PropertyDefMap::iterator it = registerProperty.begin(); it != registerProperty.end(); it++) 00024 { 00025 registerPropertyVector.push_back(&(it->second)); 00026 } 00027 00028 sort(registerPropertyVector.begin(), registerPropertyVector.end(), comparePropertyDefPointers()); 00029 } 00030 00031 class RegisterWizardTest : public ::testing::Test 00032 { 00033 protected: 00034 virtual void SetUp() 00035 { 00036 testProperties.reset(new TestProperties()); 00037 registerWizard.reset(new RegisterWizard(testProperties)); 00038 } 00039 00040 virtual void TearDown() 00041 { 00042 } 00043 00044 boost::shared_ptr<TestProperties> testProperties; 00045 boost::shared_ptr<RegisterWizard> registerWizard; 00046 BitWizard<uint16_t> bw; 00047 std::string prop; 00048 BitMinion::BitIndexEnumType bitIndex; 00049 uint16_t registerValue; 00050 uint16_t checkValue; 00051 }; 00052 00053 TEST(RegisterWizardTest_NoFixture, Constructors) 00054 { 00055 boost::shared_ptr<TestProperties> testProperties; 00056 ASSERT_NO_THROW(RegisterWizard registerWizard(testProperties)); 00057 } 00058 00059 TEST_F(RegisterWizardTest, CheckAndMaskRegister) 00060 { 00061 registerValue = 0; 00062 registerWizard->certifyRegister(registerValue); 00063 EXPECT_EQ(testProperties->REGISTER_CERTIFICATE_VALUE, registerValue); 00064 00065 registerValue = 0xF000; 00066 registerWizard->certifyRegister(registerValue); 00067 EXPECT_EQ(testProperties->REGISTER_CERTIFICATE_VALUE, registerValue); 00068 00069 registerValue = 0x00FF; 00070 registerWizard->certifyRegister(registerValue); 00071 EXPECT_EQ(testProperties->REGISTER_CERTIFICATE_VALUE | 0x00FF, registerValue); 00072 } 00073 00074 TEST_F(RegisterWizardTest, IsRegisterValid) 00075 { 00076 registerValue = 0; 00077 EXPECT_FALSE(registerWizard->isRegisterCertified(registerValue)); 00078 00079 registerValue = 0x1278; 00080 EXPECT_FALSE(registerWizard->isRegisterCertified(registerValue)); 00081 00082 registerValue = testProperties->REGISTER_CERTIFICATE_VALUE; 00083 EXPECT_TRUE(registerWizard->isRegisterCertified(registerValue)); 00084 00085 registerValue = 0x1278; 00086 registerWizard->certifyRegister(registerValue); 00087 EXPECT_TRUE(registerWizard->isRegisterCertified(registerValue)); 00088 } 00089 00090 TEST_F(RegisterWizardTest, GetSetFlag1) 00091 { 00092 prop = std::string("flag1"); 00093 bitIndex = BitMinion::BIT_ZERO_INDEX; 00094 00095 registerValue = 0; 00096 checkValue = testProperties->REGISTER_CERTIFICATE_VALUE; 00097 00098 registerWizard->setRegisterValue(true, prop, registerValue); 00099 bw.setBit(true, bitIndex, checkValue); 00100 EXPECT_EQ(checkValue, registerValue); 00101 EXPECT_EQ(0x1, registerWizard->getRegisterValue(prop, registerValue)); 00102 00103 registerWizard->setRegisterValue(false, prop, registerValue); 00104 EXPECT_EQ(testProperties->REGISTER_CERTIFICATE_VALUE, registerValue); 00105 EXPECT_EQ(0x0, registerWizard->getRegisterValue(prop, registerValue)); 00106 } 00107 00108 TEST_F(RegisterWizardTest, GetSetFlag2) 00109 { 00110 prop = std::string("flag2"); 00111 bitIndex = BitMinion::BIT_ONE_INDEX; 00112 00113 registerValue = 0; 00114 checkValue = testProperties->REGISTER_CERTIFICATE_VALUE; 00115 00116 registerWizard->setRegisterValue(true, prop, registerValue); 00117 bw.setBit(true, bitIndex, checkValue); 00118 EXPECT_EQ(checkValue, registerValue); 00119 EXPECT_EQ(0x1, registerWizard->getRegisterValue(prop, registerValue)); 00120 00121 registerWizard->setRegisterValue(false, prop, registerValue); 00122 EXPECT_EQ(testProperties->REGISTER_CERTIFICATE_VALUE, registerValue); 00123 EXPECT_EQ(0x0, registerWizard->getRegisterValue(prop, registerValue)); 00124 } 00125 00126 TEST_F(RegisterWizardTest, GetSetValue) 00127 { 00128 prop = std::string("value"); 00129 bitIndex = BitMinion::BIT_EIGHT_INDEX; 00130 00131 registerValue = 0; 00132 checkValue = testProperties->REGISTER_CERTIFICATE_VALUE; 00133 00134 uint16_t controlValue = 12; 00135 00136 registerWizard->setRegisterValue(controlValue, prop, registerValue); 00137 bw.setBits(controlValue, bitIndex, BitMinion::FOUR_BIT_MASK, checkValue); 00138 EXPECT_EQ(checkValue, registerValue); 00139 EXPECT_EQ(controlValue, registerWizard->getRegisterValue(prop, registerValue)); 00140 00141 registerWizard->setRegisterValue(0x0, prop, registerValue); 00142 EXPECT_EQ(testProperties->REGISTER_CERTIFICATE_VALUE, registerValue); 00143 EXPECT_EQ(0x0, registerWizard->getRegisterValue(prop, registerValue)); 00144 } 00145 00146 TEST_F(RegisterWizardTest, GetSetInvalid) 00147 { 00148 prop = std::string("INVALID"); 00149 00150 uint16_t temp = 0; 00151 00152 EXPECT_THROW(registerWizard->setRegisterValue(true, prop, temp), std::out_of_range); 00153 EXPECT_THROW(registerWizard->getRegisterValue(prop, temp), std::out_of_range); 00154 } 00155 00156 TEST_F(RegisterWizardTest, RegisterToString) 00157 { 00158 registerValue = 0; 00159 EXPECT_EQ(std::string("Register is invalid."), registerWizard->registerToString(registerValue)); 00160 00161 registerValue = 0x4303; 00162 EXPECT_NE(std::string("Register is invalid."), registerWizard->registerToString(registerValue)); 00163 std::cout << registerWizard->registerToString(registerValue) << std::endl; 00164 } 00165 00166 TEST_F(RegisterWizardTest, ChangedRegisterProperties) 00167 { 00168 uint16_t flag0 = 0; 00169 uint16_t flag1 = (1 << BitMinion::BIT_ZERO_INDEX); 00170 uint16_t flag2 = (1 << BitMinion::BIT_ONE_INDEX); 00171 uint16_t flag3 = flag1 | flag2; 00172 00173 std::vector< std::string > changed; 00174 EXPECT_NO_THROW(changed = registerWizard->changedRegisterProperties(0, 0)); 00175 00176 changed = registerWizard->changedRegisterProperties(flag0, flag0); 00177 EXPECT_EQ(0, changed.size()); 00178 00179 changed = registerWizard->changedRegisterProperties(flag0, flag1); 00180 EXPECT_EQ(1, changed.size()); 00181 EXPECT_STREQ("flag1", changed[0].c_str()); 00182 00183 changed = registerWizard->changedRegisterProperties(flag1, flag0); 00184 EXPECT_EQ(1, changed.size()); 00185 EXPECT_STREQ("flag1", changed[0].c_str()); 00186 00187 changed = registerWizard->changedRegisterProperties(flag0, flag2); 00188 EXPECT_EQ(1, changed.size()); 00189 EXPECT_STREQ("flag2", changed[0].c_str()); 00190 00191 changed = registerWizard->changedRegisterProperties(flag2, flag0); 00192 EXPECT_EQ(1, changed.size()); 00193 EXPECT_STREQ("flag2", changed[0].c_str()); 00194 00195 changed = registerWizard->changedRegisterProperties(flag0, flag3); 00196 EXPECT_EQ(2, changed.size()); 00197 EXPECT_TRUE(std::find(changed.begin(), changed.end(), "flag1") != changed.end()); 00198 EXPECT_TRUE(std::find(changed.begin(), changed.end(), "flag2") != changed.end()); 00199 00200 changed = registerWizard->changedRegisterProperties(flag3, flag0); 00201 EXPECT_EQ(2, changed.size()); 00202 EXPECT_TRUE(std::find(changed.begin(), changed.end(), "flag1") != changed.end()); 00203 EXPECT_TRUE(std::find(changed.begin(), changed.end(), "flag2") != changed.end()); 00204 } 00205 00206 TEST_F(RegisterWizardTest, ChangedRegisterPropertiesMasked) 00207 { 00208 uint16_t flag0 = 0; 00209 uint16_t flag1 = (1 << BitMinion::BIT_ZERO_INDEX); 00210 uint16_t flag2 = (1 << BitMinion::BIT_ONE_INDEX); 00211 uint16_t flag3 = flag1 | flag2; 00212 00213 std::vector< std::string > changed; 00214 EXPECT_NO_THROW(changed = registerWizard->changedRegisterProperties(0, 0, 0)); 00215 00216 changed = registerWizard->changedRegisterProperties(flag0, flag0, flag0); 00217 EXPECT_EQ(0, changed.size()); 00218 00219 changed = registerWizard->changedRegisterProperties(flag0, flag0, flag1); 00220 EXPECT_EQ(0, changed.size()); 00221 00222 changed = registerWizard->changedRegisterProperties(flag0, flag1, flag1); 00223 EXPECT_EQ(1, changed.size()); 00224 EXPECT_STREQ("flag1", changed[0].c_str()); 00225 00226 changed = registerWizard->changedRegisterProperties(flag0, flag1, flag2); 00227 EXPECT_EQ(0, changed.size()); 00228 00229 changed = registerWizard->changedRegisterProperties(flag0, flag1, flag3); 00230 EXPECT_EQ(1, changed.size()); 00231 EXPECT_STREQ("flag1", changed[0].c_str()); 00232 00233 changed = registerWizard->changedRegisterProperties(flag0, flag3, flag1); 00234 EXPECT_EQ(1, changed.size()); 00235 EXPECT_TRUE(std::find(changed.begin(), changed.end(), "flag1") != changed.end()); 00236 00237 changed = registerWizard->changedRegisterProperties(flag0, flag3, flag3); 00238 EXPECT_EQ(2, changed.size()); 00239 EXPECT_TRUE(std::find(changed.begin(), changed.end(), "flag1") != changed.end()); 00240 EXPECT_TRUE(std::find(changed.begin(), changed.end(), "flag2") != changed.end()); 00241 } 00242 00243 TEST_F(RegisterWizardTest, Has) 00244 { 00245 EXPECT_TRUE(registerWizard->has("flag1")); 00246 EXPECT_TRUE(registerWizard->has("flag2")); 00247 EXPECT_TRUE(registerWizard->has("value")); 00248 EXPECT_FALSE(registerWizard->has("asdf")); 00249 } 00250 00251 TEST_F(RegisterWizardTest, GetRegisterProperties) 00252 { 00253 std::vector< std::string > properties = registerWizard->getRegisterProperties(); 00254 00255 EXPECT_EQ(3, properties.size()); 00256 EXPECT_STREQ("flag1", properties[0].c_str()); 00257 EXPECT_STREQ("flag2", properties[1].c_str()); 00258 EXPECT_STREQ("value", properties[2].c_str()); 00259 } 00260 00261 TEST_F(RegisterWizardTest, IsWritable) 00262 { 00263 EXPECT_TRUE(registerWizard->isWritable()); 00264 } 00265 00266 int main(int argc, char** argv) 00267 { 00268 testing::InitGoogleTest(&argc, argv); 00269 return RUN_ALL_TESTS(); 00270 }