# 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()
