# Copyright (C) 2003 Python Software Foundation

import unittest
import os
import sys
from test import test_support

MacOS = test_support.import_module('MacOS')
#The following modules should exist if MacOS exists.
import Carbon.File
import macostools

TESTFN2 = test_support.TESTFN + '2'

class TestMacostools(unittest.TestCase):

    def setUp(self):
        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()

    def tearDown(self):
        test_support.unlink(test_support.TESTFN)
        test_support.unlink(TESTFN2)

    def compareData(self):
        fp = open(test_support.TESTFN, 'r')
        data1 = fp.read()
        fp.close()
        fp = open(TESTFN2, 'r')
        data2 = fp.read()
        fp.close()
        if data1 != data2:
            return 'Data forks differ'
        rfp = MacOS.openrf(test_support.TESTFN, '*rb')
        data1 = rfp.read(1000)
        rfp.close()
        rfp = MacOS.openrf(TESTFN2, '*rb')
        data2 = rfp.read(1000)
        rfp.close()
        if data1 != data2:
            return 'Resource forks differ'
        return ''

    def test_touched(self):
        # This really only tests that nothing unforeseen happens.
        with test_support.check_warnings(('macostools.touched*',
                                          DeprecationWarning), quiet=True):
            macostools.touched(test_support.TESTFN)

    if sys.maxint < 2**32:
        def test_copy(self):
            test_support.unlink(TESTFN2)
            macostools.copy(test_support.TESTFN, TESTFN2)
            self.assertEqual(self.compareData(), '')

    if sys.maxint < 2**32:
        def test_mkalias(self):
            test_support.unlink(TESTFN2)
            macostools.mkalias(test_support.TESTFN, TESTFN2)
            fss, _, _ = Carbon.File.ResolveAliasFile(TESTFN2, 0)
            self.assertEqual(fss.as_pathname(), os.path.realpath(test_support.TESTFN))

        def test_mkalias_relative(self):
            test_support.unlink(TESTFN2)
            # If the directory doesn't exist, then chances are this is a new
            # install of Python so don't create it since the user might end up
            # running ``sudo make install`` and creating the directory here won't
            # leave it with the proper permissions.
            if not os.path.exists(sys.prefix):
                return
            macostools.mkalias(test_support.TESTFN, TESTFN2, sys.prefix)
            fss, _, _ = Carbon.File.ResolveAliasFile(TESTFN2, 0)
            self.assertEqual(fss.as_pathname(), os.path.realpath(test_support.TESTFN))


def test_main():
    # Skip on wide unicode
    if len(u'\0'.encode('unicode-internal')) == 4:
        raise unittest.SkipTest("test_macostools is broken in USC4")
    test_support.run_unittest(TestMacostools)


if __name__ == '__main__':
    test_main()
