import sys, os
import unittest
import win32rcparser
import win32con
import tempfile

class TestParser(unittest.TestCase):
    def setUp(self):
        rc_file = os.path.join(os.path.dirname(__file__), "win32rcparser", "test.rc")
        self.resources = win32rcparser.Parse(rc_file)

    def testStrings(self):
        for sid, expected in [
            ("IDS_TEST_STRING4", "Test 'single quoted' string"),
            ("IDS_TEST_STRING1", 'Test "quoted" string'),
            ("IDS_TEST_STRING3", 'String with single " quote'),
            ("IDS_TEST_STRING2", 'Test string'),
                             ]:
            got = self.resources.stringTable[sid].value
            self.assertEqual(got, expected)

    def testStandardIds(self):
        for idc in "IDOK IDCANCEL".split():
            correct = getattr(win32con, idc)
            self.assertEqual(self.resources.names[correct], idc)
            self.assertEqual(self.resources.ids[idc], correct)

    def testTabStop(self):
        d = self.resources.dialogs["IDD_TEST_DIALOG2"]
        tabstop_names = ["IDC_EDIT1", "IDOK"] # should have WS_TABSTOP
        tabstop_ids = [self.resources.ids[name] for name in tabstop_names]
        notabstop_names = ["IDC_EDIT2"] # should have WS_TABSTOP
        notabstop_ids = [self.resources.ids[name] for name in notabstop_names]
        num_ok = 0
        for cdef in d[1:]: # skip dlgdef
            #print cdef
            cid = cdef[2]
            style = cdef[-2]
            styleex = cdef[-1]
            if cid in tabstop_ids:
                self.failUnlessEqual(style & win32con.WS_TABSTOP, win32con.WS_TABSTOP)
                num_ok += 1
            elif cid in notabstop_ids:
                self.failUnlessEqual(style & win32con.WS_TABSTOP, 0)
                num_ok += 1
        self.failUnlessEqual(num_ok, len(tabstop_ids) + len(notabstop_ids))

class TestGenerated(TestParser):
    def setUp(self):
        # don't call base!
        rc_file = os.path.join(os.path.dirname(__file__), "win32rcparser", "test.rc")
        py_file = tempfile.mktemp('test_win32rcparser.py')
        try:
            win32rcparser.GenerateFrozenResource(rc_file, py_file)
            py_source = open(py_file).read()
        finally:
            if os.path.isfile(py_file):
                os.unlink(py_file)
            
        # poor-man's import :)
        globs = {}
        exec(py_source, globs, globs)
        self.resources = globs["FakeParser"]()

if __name__=='__main__':
    unittest.main()

