|
|
/*++
Copyright � Microsoft Corporation. All rights reserved.
Module Name:
test_par.cpp
Abstract:
Test program for CObjectPathParser objects
History:
--*/
#include "precomp.h"
#include "genlex.h"
#include "objpath.h"
BOOL bVerbose = FALSE;
void fatal(int n) { printf("\n*** Test failed on source line %d ***\n", n); exit(1); }
void DisplayVariant(VARIANT * pvar) { SCODE sc; VARTYPE vSave; VARTYPE vtSimple = pvar->vt & ~VT_ARRAY & ~VT_BYREF;
VARIANT vTemp; if(pvar->vt == VT_NULL) { printf(" data is NULL"); return; }
// keep in mind that our bstr are acutally WCHAR * in this context.
if(vtSimple == VT_BSTR) { printf(" Type is 0x%x, value is %S", pvar->vt, pvar->bstrVal); return; }
VariantInit(&vTemp); vSave = pvar->vt; pvar->vt = vtSimple; sc = VariantChangeTypeEx(&vTemp, pvar,0,0, VT_BSTR); pvar->vt = vSave; if(sc == S_OK) { printf(" Type is 0x%x, value is %S", pvar->vt, vTemp.bstrVal); } else printf(" Couldnt convert type 0x%x, error code 0x%x", pvar->vt, sc); VariantClear(&vTemp); }
void DumpIt(WCHAR * pTest, ParsedObjectPath * pOutput) { DWORD dwCnt; if(!bVerbose) return; printf("\n\nTesting -%S-", pTest); if(pOutput == NULL) return; printf("\nClass is, %S, Singleton is %d", pOutput->m_pClass, pOutput->m_bSingletonObj); printf("\nNumber of keys is %d", pOutput->m_dwNumKeys); for(dwCnt = 0; dwCnt < pOutput->m_dwNumKeys; dwCnt++) { printf(" -%S-", pOutput->m_paKeys[dwCnt]->m_pName); DisplayVariant((&pOutput->m_paKeys[dwCnt]->m_vValue)); } printf("\nNumber of namespaces is %d", pOutput->m_dwNumNamespaces); for(dwCnt = 0; dwCnt < pOutput->m_dwNumNamespaces; dwCnt++) printf(" -%S-", pOutput->m_paNamespaces[dwCnt]); }
// this tests a normal single key path
void test1() { int iRet; ParsedObjectPath * pOutput; WCHAR * pTest = L"\\\\.\\root\\default:MyClass=\"a\""; WCHAR * pRet = NULL; CObjectPathParser p; iRet = p.Parse(pTest, &pOutput); if(iRet != CObjectPathParser::NoError) fatal(__LINE__); DumpIt(pTest, pOutput); if(_wcsicmp(pOutput->m_pClass,L"MyClass")) fatal(__LINE__); if(pOutput->m_dwNumKeys != 1) fatal(__LINE__); if(pOutput->m_bSingletonObj) fatal(__LINE__); p.Unparse(pOutput, &pRet); printf("\nUnparse -%S-", pRet); // if(_wcsicmp(pTest, pRet))
// fatal(__LINE__);
delete pRet; delete pOutput; }
// this tests a singleton
void test2() { int iRet; ParsedObjectPath * pOutput; CObjectPathParser p; WCHAR * pTest = L"\\\\.\\root\\default:MyClass=@"; WCHAR * pRet = NULL;
iRet = p.Parse(pTest, &pOutput); if(iRet != CObjectPathParser::NoError) fatal(__LINE__); DumpIt(pTest, pOutput); if(_wcsicmp(pOutput->m_pClass,L"MyClass")) fatal(__LINE__); if(pOutput->m_dwNumKeys != 0) fatal(__LINE__); if(!pOutput->m_bSingletonObj) fatal(__LINE__); p.Unparse(pOutput, &pRet); printf("\nUnparse -%S-", pRet); // if(_wcsicmp(pTest, pRet))
// fatal(__LINE__);
delete pRet; delete pOutput; }
// this tests a multiple key path
void test3() { int iRet; ParsedObjectPath * pOutput; CObjectPathParser p; WCHAR * pTest = L"\\\\.\\root\\default:MyClass.key=23,key2=\"xx\""; WCHAR * pRet = NULL;
iRet = p.Parse(pTest, &pOutput); if(iRet != CObjectPathParser::NoError) fatal(__LINE__); DumpIt(pTest, pOutput); if(_wcsicmp(pOutput->m_pClass,L"MyClass")) fatal(__LINE__); if(pOutput->m_dwNumKeys != 2) fatal(__LINE__); if(pOutput->m_bSingletonObj) fatal(__LINE__); p.Unparse(pOutput, &pRet); printf("\nUnparse -%S-", pRet); // if(_wcsicmp(pTest, pRet))
// fatal(__LINE__);
delete pRet; delete pOutput; }
// this tests an error in a single key path - missing closing quote
void test4() { int iRet; ParsedObjectPath * pOutput; CObjectPathParser p; WCHAR * pTest = L"\\\\.\\root\\default:MyClass=\"hello"; WCHAR * pRet = NULL;
iRet = p.Parse(pTest, &pOutput); if(iRet == CObjectPathParser::NoError) fatal(__LINE__); }
// this tests forward path slashes and a mix of slashes in the key
void test5() { int iRet; ParsedObjectPath * pOutput; WCHAR * pTest = L"//./root/default:MyClass.key=\"ab/c\\\\def\""; // it takes four '\'s within a quoted string to yield a single '\'
WCHAR * pRet = NULL; CObjectPathParser p; iRet = p.Parse(pTest, &pOutput); if(iRet != CObjectPathParser::NoError) fatal(__LINE__); DumpIt(pTest, pOutput); if(_wcsicmp(pOutput->m_pClass,L"MyClass")) fatal(__LINE__); if(pOutput->m_dwNumKeys != 1) fatal(__LINE__); if(pOutput->m_bSingletonObj) fatal(__LINE__); p.Unparse(pOutput, &pRet); printf("\nUnparse -%S-", pRet); // if(_wcsicmp(pTest, pRet))
// fatal(__LINE__);
delete pRet; delete pOutput; }
// This tests unicode
void test6() { int iRet; ParsedObjectPath * pOutput; WCHAR * pTest = L"//./root/\x0100xde\231faul\xffef:MyClass.\x0100\231\xffef=\"\x0100\xffef\""; WCHAR * pRet = NULL; CObjectPathParser p; iRet = p.Parse(pTest, &pOutput); if(iRet != CObjectPathParser::NoError) fatal(__LINE__);
// note that the dump will not output much information since printf doesnt like unicode
DumpIt(pTest, pOutput); if(_wcsicmp(pOutput->m_pClass,L"MyClass")) fatal(__LINE__); if(_wcsicmp(pOutput->m_paNamespaces[0],L"root")) fatal(__LINE__); if(_wcsicmp(pOutput->m_paNamespaces[1],L"\x0100xde\231faul\xffef")) fatal(__LINE__); if(_wcsicmp(pOutput->m_paKeys[0]->m_pName,L"\x0100\231\xffef")) fatal(__LINE__); if(_wcsicmp(pOutput->m_paKeys[0]->m_vValue.bstrVal,L"\x0100\xffef")) fatal(__LINE__);
if(pOutput->m_dwNumKeys != 1) fatal(__LINE__); if(pOutput->m_bSingletonObj) fatal(__LINE__); p.Unparse(pOutput, &pRet); printf("\nUnparse -%S-", pRet); // if(_wcsicmp(pTest, pRet))
// fatal(__LINE__);
delete pRet; delete pOutput; }
// This tests association type paths
void test7() { int iRet; ParsedObjectPath * pOutput; WCHAR * pTest = L"\\\\.\\root\\default:Win32Users.Ant=\"\\\\\\\\WKSTA\\\\root\\\\default:System.Name=\\\"WKSTA\\\"\",Dep=\"Win32User.Name=\\\".Default\\\"\""; WCHAR * pRet = NULL; CObjectPathParser p; iRet = p.Parse(pTest, &pOutput); if(iRet != CObjectPathParser::NoError) fatal(__LINE__);
// note that the dump will not output much information since printf doesnt like unicode
DumpIt(pTest, pOutput); if(_wcsicmp(pOutput->m_pClass,L"Win32Users")) fatal(__LINE__); if(_wcsicmp(pOutput->m_paNamespaces[0],L"root")) fatal(__LINE__); if(_wcsicmp(pOutput->m_paNamespaces[1],L"default")) fatal(__LINE__); if(_wcsicmp(pOutput->m_paKeys[0]->m_pName,L"Ant")) fatal(__LINE__); if(_wcsicmp(pOutput->m_paKeys[0]->m_vValue.bstrVal, L"\\\\WKSTA\\root\\default:System.Name=\"WKSTA\"")) fatal(__LINE__); if(_wcsicmp(pOutput->m_paKeys[1]->m_pName,L"Dep")) fatal(__LINE__); if(_wcsicmp(pOutput->m_paKeys[1]->m_vValue.bstrVal,L"Win32User.Name=\".Default\"")) fatal(__LINE__);
if(pOutput->m_dwNumKeys != 2) fatal(__LINE__); if(pOutput->m_bSingletonObj) fatal(__LINE__); p.Unparse(pOutput, &pRet); printf("\nUnparse -%S-", pRet); // if(_wcsicmp(pTest, pRet))
// fatal(__LINE__);
delete pRet; delete pOutput; }
int main(int argc, char **argv) { int i; bVerbose = TRUE; for(i = 0; i< 1; i++) { printf("\ndoing test %d",i); test1(); test2(); test3(); test4(); test5(); test6(); test7(); } return 0; }
|