import unittest
from test import test_support
import os
import subprocess

MacOS = test_support.import_module('MacOS')

TESTFN2 = test_support.TESTFN + '2'

class TestMacOS(unittest.TestCase):
    @unittest.skipUnless(os.path.exists('/Developer/Tools/SetFile'),
                         '/Developer/Tools/SetFile does not exist')
    def testGetCreatorAndType(self):
        try:
            fp = open(test_support.TESTFN, 'w')
            fp.write('\n')
            fp.close()

            subprocess.call(
                    ['/Developer/Tools/SetFile', '-t', 'ABCD', '-c', 'EFGH',
                        test_support.TESTFN])

            cr, tp = MacOS.GetCreatorAndType(test_support.TESTFN)
            self.assertEqual(tp, 'ABCD')
            self.assertEqual(cr, 'EFGH')

        finally:
            os.unlink(test_support.TESTFN)

    @unittest.skipUnless(os.path.exists('/Developer/Tools/GetFileInfo'),
                         '/Developer/Tools/GetFileInfo does not exist')
    def testSetCreatorAndType(self):
        try:
            fp = open(test_support.TESTFN, 'w')
            fp.write('\n')
            fp.close()

            MacOS.SetCreatorAndType(test_support.TESTFN,
                    'ABCD', 'EFGH')

            cr, tp = MacOS.GetCreatorAndType(test_support.TESTFN)
            self.assertEqual(cr, 'ABCD')
            self.assertEqual(tp, 'EFGH')

            data = subprocess.Popen(["/Developer/Tools/GetFileInfo", test_support.TESTFN],
                    stdout=subprocess.PIPE).communicate()[0]

            tp = None
            cr = None
            for  ln in data.splitlines():
                if ln.startswith('type:'):
                    tp = ln.split()[-1][1:-1]
                if ln.startswith('creator:'):
                    cr = ln.split()[-1][1:-1]

            self.assertEqual(cr, 'ABCD')
            self.assertEqual(tp, 'EFGH')

        finally:
            os.unlink(test_support.TESTFN)


    def testOpenRF(self):
        try:
            fp = open(test_support.TESTFN, 'w')
            fp.write('hello world\n')
            fp.close()

            rfp = MacOS.openrf(test_support.TESTFN, '*wb')
            rfp.write('goodbye world\n')
            rfp.close()


            fp = open(test_support.TESTFN, 'r')
            data = fp.read()
            fp.close()
            self.assertEqual(data, 'hello world\n')

            rfp = MacOS.openrf(test_support.TESTFN, '*rb')
            data = rfp.read(100)
            data2 = rfp.read(100)
            rfp.close()
            self.assertEqual(data, 'goodbye world\n')
            self.assertEqual(data2, '')


        finally:
            os.unlink(test_support.TESTFN)

def test_main():
    test_support.run_unittest(TestMacOS)


if __name__ == '__main__':
    test_main()
