from winreg import hives, createKey, openKey, flags, deleteKey, regtypes
import sys, traceback
import time

def testHives():
    hivenames = ["HKEY_CLASSES_ROOT","HKEY_CURRENT_USER","HKEY_LOCAL_MACHINE",
                "HKEY_USERS","HKEY_CURRENT_CONFIG"] #, # 
    for hivename in hivenames:
        hive = hives[ hivename ]
        print hive.name
        assert hive.handle
        assert hive.getSubkeys()
    for hivename in ["HKEY_DYN_DATA", "HKEY_PERFORMANCE_DATA"]:
        hive =  hives[ hivename ]
        print hive.name
        assert hive.handle
        assert not hive.getValues()
        assert not hive.getSubkeys()

def testNonZero():
    key=hives["HKLM"].openSubkey( "SOFTWARE" )
    assert key.openSubkey( "Microsoft" )
    assert key
    key.close()
    assert not key
    try:
        key.openSubkey( "Microsoft" )
        assert 0
    except EnvironmentError:
        pass

def testCmp():
    HKLM=hives["HKLM"]
    assert (openKey("HKLM\\SOFTWARE")==\
                        HKLM.openSubkey("SOFTWARE"))
    assert not HKLM.openSubkey("SYSTEM")!=HKLM.openSubkey("SYSTEM")
    assert HKLM.openSubkey("SOFTWARE")!=HKLM.openSubkey("SYSTEM")
    assert not HKLM.openSubkey("SOFTWARE")==HKLM.openSubkey("SYSTEM")
    assert not HKLM.openSubkey("SOFTWARE")=="spam"
    assert ((HKLM.openSubkey("SOFTWARE")<"spam") !=
                        (HKLM.openSubkey("SOFTWARE")>"spam"))

def testClose(): 
    key=hives["HKLM"].openSubkey( "SOFTWARE" )
    assert key
    key.close()
    assert not key

def testOpen():
    assert openKey( r"HKLM" )
    assert openKey( r"HKLM\HARDWARE" )
    assert openKey( r"HKLM\HARDWARE\DESCRIPTION\System" )

def testOpenFailure():
    try:
        print openKey( r"HKCU\Software\Python\A\B\C\D" )
        assert 0 #
    except EnvironmentError:
        pass

def testDeleteKey():
    createKey( r"HKCU\Software\Python\A\B\C\D" )
    deleteKey( r"HKCU\Software\Python\A\B\C\D" )
    deleteKey( r"HKCU\Software\Python\A\B\C" )
    deleteKey( r"HKCU\Software\Python\A\B" )
    assert "A" in \
            openKey(r"HKCU\Software\Python").getSubkeys().keys()
    openKey( r"HKCU\Software\Python" ).deleteSubkey( r"A" )
    assert "A" not in \
            openKey(r"HKCU\Software\Python").getSubkeys().keys()

def testDeleteValue():
    key=createKey( r"HKCU\Software\Python\A" )
    key.setValue( "abcde", "fghij" )
    assert key.getValueData( "abcde" )=="fghij"
    assert "abcde" in key.getValues().keys()
    assert "fghij" in map( lambda x:x[1], key.getValues().values() )
    assert "abcde" in key.getValues().keys()
    key.deleteValue( "abcde" )
    assert "abcde" not in key.getValues().keys()
    assert "fghij" not in map( lambda x:x[1], key.getValues().values() )
    deleteKey( r"HKCU\Software\Python\A" )

def testCreateKey():
    key=createKey( r"HKCU\Software\Python\A" )
    assert openKey( r"HKCU\Software\Python").getSubkeys().has_key( "A" )
    deleteKey( r"HKCU\Software\Python\A" )
    assert not openKey( r"HKCU\Software\Python").getSubkeys().\
                        has_key( "A" )
    key=openKey( r"HKCU\Software\Python" ).createSubkey( "A" )

def testOpenKeyWithFlags():
    assert openKey( r"HKCU\Software\Python", 
                                flags["KEY_READ"])
    assert openKey( r"HKCU\Software\Python", 
                                flags["KEY_ALL_ACCESS"])

def testGetSubkeys():
    keys=openKey( r"HKCU\Software" ).getSubkeys()
    assert keys
    index=0
    for i in keys:
        index=index+1
    assert index==len( keys )

def testGetValueNameDataAndType(): pass

def testGetSubkeyNames():
    subkeyNames=hives["HKLM"].getSubkeyNames()
    assert len( subkeyNames )==len(hives["HKLM"].getSubkeys())
    for name in subkeyNames:
        assert type( name )==type("")

def testGetValueNames(): 
    valNames=hives["HKLM"].getValueNames()
    assert len( valNames )==len(hives["HKLM"].getValues())
    for name in valNames:
        assert type( name )==type("")

def testRepr():
    assert repr(hives["HKCU"])==str(hives["HKCU"])

def testSetStringValue():
    hives["HKCU"].setValue( "Blah", "abc" )
    assert hives["HKCU"].getValueData( "Blah" )=="abc"
    assert hives["HKCU"].getValues().has_key( "Blah" )
    del hives["HKCU"].getValues()[ "Blah" ]
    assert not hives["HKCU"].getValues().has_key( "Blah" )

def testDeleteValue():
    hives["HKCU"].setValue( "Blah", "abc" )
    assert hives["HKCU"].getValues().has_key( "Blah" )
    del hives["HKCU"].getValues()[ "Blah" ]
    assert not hives["HKCU"].getValues().has_key( "Blah" )
    hives["HKCU"].setValue( "Blah", "abc" )
    hives["HKCU"].deleteValue( "Blah" )
    assert not hives["HKCU"].getValues().has_key( "Blah" )

def testKeyDict_ClearKeys():
    createKey( "HKLM\\Software\\a\\b\\c\\d\\e" )
    createKey( "HKLM\\Software\\a\\b\\c\\d\\f" )
    createKey( "HKLM\\Software\\a\\b\\c\\d\\g" )
    createKey( "HKLM\\Software\\a\\b\\c\\d\\h" )
    createKey( "HKLM\\Software\\a\\b\\c\\d\\i" )
    key=openKey( "HKLM\\Software\\a\\b\\c\\d" )
    assert key.getSubkeys()
    key.getSubkeys().clear()
    assert not key.getSubkeys()
    assert not openKey( "HKLM\\Software\\a\\b\\c\\d").getSubkeys()
    deleteKey( "HKLM\\Software\\a\\b\\c\\d" )
    deleteKey( "HKLM\\Software\\a\\b\\c" )
    deleteKey( "HKLM\\Software\\a\\b" )
    deleteKey( "HKLM\\Software\\a" )

def testUnicodeKeyName(): pass

def testUnicodeValueName(): pass

def testGetValueDataFromEnum(): pass

def testGetValueDataFromName(): pass

def testGetBinaryData(): pass


def testSetIntValue():
    key=createKey( "HKLM\\Software\\a\\b")
    key.setValue( "abcd", 5 )
    assert key.getValueData( "abcd" )==5
    assert key.getValues()[ "abcd" ][1]==5
    key.deleteValue( "abcd" )
    key.getValues()["abcd"]=5
    assert key.getValues()[ "abcd" ][1]==5
    key.deleteValue( "abcd" )
    key.getValues()["abcd"]=(5,regtypes["REG_DWORD"])
    assert key.getValues()[ "abcd" ][1]==5
    key.deleteValue( "abcd" )
    key.deleteKey( "HKLM\\Software\\a\\b")
    key.deleteKey( "HKLM\\Software\\a")

def testSetBinaryValue(): 
    key=createKey( "HKLM\\Software\\a\\b")
    key.setValue( "abcd", array.array( 'c', "PPPPPPPPPPPPPPP") )
    key.setValue( "abcde", array.array( 'c', "PPPPPPPPPPPPPPP"), 
                       regtypes["REG_BINARY"] )
    assert key.getValues()["abcd"]==key.getValues()["abcde"]
    key.deleteKey( "HKLM\\Software\\a\\b")
    key.deleteKey( "HKLM\\Software\\a")

def testSetNone(): pass

def testSetString(): pass

def testSetExpandString(): pass

def testSetBinaryData(): pass

def testSetDword(): pass

def testSetDwordBigEndian(): pass

def testSetLink(): pass

def testSetMultiSz(): pass

def testSetResourceList(): pass

def testSetFullResourceDescription(): pass

def testSetResourceRequirementsList(): pass



def testFlush(): pass

def testSave(): pass

def testLoad(): pass





def testNoneType(): pass

def testStringType(): pass

def testExpandStringType(): pass

def testDWordType(): pass

def testDWordBigEndianType(): pass

def testLinkType(): pass

def testMultiStringType(): pass

def testResourceLinkType(): pass

def testResourceDescriptionType(): pass

def testResourceRequirementsListType(): pass


def getSubkeysDict(): pass

def testKeyDict_Get(): pass

def testKeyDict_HasKey(): pass

def testKeyDict_Keys(): pass

def testKeyDict_Values(): pass

def testKeyDict_Items(): pass

def testKeyDict_Length(): pass

def testKeyDict_Map(): pass

def testKeyDict_GetItem(): pass

def testKeyDict_DelItem(): pass

def testRemote(): pass

def testShortcuts(): pass



def getValues(): pass

def testValueDict_ClearKeys(): pass

def testValueDict_Get(): pass

def testValueDict_HasKey(): pass

def testValueDict_Keys(): pass

def testValueDict_Values(): pass

def testValueDict_Items(): pass

def testValueDict_Length(): pass

def testValueDict_Map(): pass

def testValueDict_GetItem(): pass

def testValueDict_DelItem(): pass

for name in globals().keys():
    if name[0:4]=="test":
        func=globals()[ name ]
        try:
            func()
            print "Test Passed: %s" % name
        except Exception, e:
            print "Test Failed: %s" % name
            traceback.print_exc()

j=[0]*len( regtypes )

k=0

def test1( basekey ):
    global k
    for (name, data, type) in basekey.getValues():
        j[type.intval]=j[type.intval]+1
        if j[type.intval]==1:
            pass
            #print "[[%s]] %s [%s] = %s "% (type.msname, name, basekey, value)
    keys=basekey.getSubkeys()
    index=0
    k=k+1
    if(k%2500)==0:
        dump()
    while 1:
        try:
            test1( keys[index] )
            index=index+1
        except IndexError:
            break
            print "Done", basekey, index
        except (WindowsError, EnvironmentError):
            index=index+1
            dumpfile.write( "Skipping %s %s"% (basekey, index))

def dump(dumpfile):
    for i in range( len( j )):
        dumpfile.write( "%s %s\n" %( i,j[i] ))

def testRecursive():
    dumpfile=open( "foo.txt", "w" )
    start=time.time()
    for hive in hives.values():
        dumpfile.write( "Hive: %s\n" % hive )
        test1( hive )
        dump(dumpfile)
    print time.time()-start
