TEST_F(VarRenamerTests, ClashingNamesNotEndingWithNumberAreSuffixedWithNumbers) { // Set-up the module. // // int a; // int b; // int c; // // void test() { // } // ShPtr<Variable> varA(Variable::create("a", IntType::create(32))); module->addGlobalVar(varA); ShPtr<Variable> varB(Variable::create("b", IntType::create(32))); module->addGlobalVar(varB); ShPtr<Variable> varC(Variable::create("c", IntType::create(32))); module->addGlobalVar(varC); // Setup the name generator so it always returns "g". INSTANTIATE_VAR_NAME_GEN_AND_VAR_RENAMER(VarRenamerWithCreate, false); EXPECT_CALL(*varNameGenMock, getNextVarName()) .Times(3) .WillOnce(Return("g")) .WillOnce(Return("g")) .WillOnce(Return("g")); // Do the renaming. varRenamer->renameVars(module); // We expect the following output: // // int g; // int g2; // int g3; // // void test() { // } // VarSet globalVarsSet(module->getGlobalVars()); ASSERT_EQ(3, globalVarsSet.size()); // We have to sort the variables to ease the checking. VarVector globalVarsVector(globalVarsSet.begin(), globalVarsSet.end()); sortByName(globalVarsVector); ShPtr<Variable> var1(globalVarsVector[0]); EXPECT_EQ("g", var1->getName()); ShPtr<Variable> var2(globalVarsVector[1]); EXPECT_EQ("g2", var2->getName()); ShPtr<Variable> var3(globalVarsVector[2]); EXPECT_EQ("g3", var3->getName()); }
TEST_F(UnifiedVarRenamerTests, GlobalVariablesGetCorrectlyRenamed) { // Set-up the module. // // int a; // int b; // int c; // // void test() { // } // ShPtr<Variable> varA(Variable::create("a", IntType::create(32))); module->addGlobalVar(varA); ShPtr<Variable> varB(Variable::create("b", IntType::create(32))); module->addGlobalVar(varB); ShPtr<Variable> varC(Variable::create("c", IntType::create(32))); module->addGlobalVar(varC); // Setup the renamer. INSTANTIATE_VAR_NAME_GEN_AND_VAR_RENAMER(UnifiedVarRenamer, true); // Do the renaming. varRenamer->renameVars(module); // We expect the following output: // // int g1; // int g2; // int g3; // // void test() { // } // VarSet globalVarsSet(module->getGlobalVars()); ASSERT_EQ(3, globalVarsSet.size()); // We have to sort the variables to ease the checking. VarVector globalVarsVector(globalVarsSet.begin(), globalVarsSet.end()); sortByName(globalVarsVector); ShPtr<Variable> var1(globalVarsVector[0]); EXPECT_EQ("g1", var1->getName()); ShPtr<Variable> var2(globalVarsVector[1]); EXPECT_EQ("g2", var2->getName()); ShPtr<Variable> var3(globalVarsVector[2]); EXPECT_EQ("g3", var3->getName()); }
int _tmain(int argc, _TCHAR* argv[]) { //BSTR的使用 { BSTR bstrA = SysAllocString(L"Hello BSTR"); BSTR bstrB = SysAllocStringLen(bstrA, SysStringLen(bstrA)); SysFreeString(bstrA); SysFreeString(bstrB); } //用VARIANT保存LONG { VARIANT var; VariantInit(&var); var.vt = VT_I4; var.lVal = 100; VariantClear(&var); int i = 0; i++; } //用VARIANT保存FLOAT { VARIANT var; VariantInit(&var); var.vt = VT_R4; var.fltVal = 1.23f; VariantClear(&var); } //用VARIANT保存BSTR { VARIANT var; VariantInit(&var); var.vt = VT_BSTR; var.bstrVal = SysAllocString(L"Hello World"); VariantClear(&var); } //用VARIANT保存布尔类型 { VARIANT var; VariantInit(&var); var.vt = VT_BOOL; var.boolVal = VARIANT_FALSE; VariantClear(&var); } //从VARIANT读取相应类型的值 { VARIANT var; VariantInit(&var); var.vt = VT_I4; var.lVal = 100; if (var.vt == VT_I4) { LONG lValue = var.lVal; } else if (var.vt == VT_R4) { FLOAT fValue = var.fltVal; } else if (var.vt == VT_BSTR) { BSTR bstrValue = var.bstrVal; } else if (var.vt == VT_BOOL) { VARIANT_BOOL varbValue = var.boolVal; } VariantClear(&var); } //COM数据类型的转换,LONG转成FLOAT { VARIANT var; VariantInit(&var); var.vt = VT_I4; var.lVal = 100; VariantChangeType(&var,&var,0, VT_R4); if (var.vt == VT_R4) { FLOAT fValue = var.fltVal; } VariantClear(&var); } //COM数据类型的转换,LONG转成BSTR { VARIANT var; VariantInit(&var); var.vt = VT_I4; var.lVal = 100; VariantChangeType(&var,&var,0, VT_BSTR); if (var.vt == VT_BSTR) { BSTR fValue = var.bstrVal; } VariantClear(&var); } //CComVariant的构造方法 { VARIANT varA; CComVariant varB; CComVariant varC(varA); CComVariant varD(varB); CComVariant varE(L"Hello CComVariant"); CComVariant varF("CComVariant"); CComVariant varG(true); CComVariant varH(100L); CComVariant varI(1.23f); //.... } //CComVariant的赋值方法 { VARIANT varA; CComVariant varB; CComVariant varC; varC = varA; varC = varB; varC = true; varC = 100L; varC = 1.23f; varC = L"Hello CComVariant"; varC = "Hello CComVariant"; //.... } //CComVariant与VARIANT的关联 { VARIANT varA; VariantInit(&varA); varA.vt = VT_I4; varA.lVal = 100; CComVariant varB; CComVariant varC(100L); VARIANT varD; VariantInit(&varD); //Attach varB.Attach(&varA); //之后无需调用VariantClear(&varA); //Detach varC.Detach(&varD); VariantClear(&varD); //需要调用VariantClear(&varD); } return 0; }