import unittest
from test import support
import os
import genericpath

class AllCommonTest(unittest.TestCase):

    def assertIs(self, a, b):
        self.assert_(a is b)

    def test_commonprefix(self):
        self.assertEqual(
            genericpath.commonprefix([]),
            ""
        )
        self.assertEqual(
            genericpath.commonprefix(["/home/swenson/spam", "/home/swen/spam"]),
            "/home/swen"
        )
        self.assertEqual(
            genericpath.commonprefix(["/home/swen/spam", "/home/swen/eggs"]),
            "/home/swen/"
        )
        self.assertEqual(
            genericpath.commonprefix(["/home/swen/spam", "/home/swen/spam"]),
            "/home/swen/spam"
        )

    def test_getsize(self):
        f = open(support.TESTFN, "wb")
        try:
            f.write(b"foo")
            f.close()
            self.assertEqual(genericpath.getsize(support.TESTFN), 3)
        finally:
            if not f.closed:
                f.close()
            os.remove(support.TESTFN)

    def test_time(self):
        f = open(support.TESTFN, "wb")
        try:
            f.write(b"foo")
            f.close()
            f = open(support.TESTFN, "ab")
            f.write(b"bar")
            f.close()
            f = open(support.TESTFN, "rb")
            d = f.read()
            f.close()
            self.assertEqual(d, b"foobar")

            self.assert_(
                genericpath.getctime(support.TESTFN) <=
                genericpath.getmtime(support.TESTFN)
            )
        finally:
            if not f.closed:
                f.close()
            os.remove(support.TESTFN)

    def test_exists(self):
        self.assertIs(genericpath.exists(support.TESTFN), False)
        f = open(support.TESTFN, "wb")
        try:
            f.write(b"foo")
            f.close()
            self.assertIs(genericpath.exists(support.TESTFN), True)
        finally:
            if not f.close():
                f.close()
            try:
                os.remove(support.TESTFN)
            except os.error:
                pass

        self.assertRaises(TypeError, genericpath.exists)

    def test_isdir(self):
        self.assertIs(genericpath.isdir(support.TESTFN), False)
        f = open(support.TESTFN, "wb")
        try:
            f.write(b"foo")
            f.close()
            self.assertIs(genericpath.isdir(support.TESTFN), False)
            os.remove(support.TESTFN)
            os.mkdir(support.TESTFN)
            self.assertIs(genericpath.isdir(support.TESTFN), True)
            os.rmdir(support.TESTFN)
        finally:
            if not f.close():
                f.close()
            try:
                os.remove(support.TESTFN)
            except os.error:
                pass
            try:
                os.rmdir(support.TESTFN)
            except os.error:
                pass

        self.assertRaises(TypeError, genericpath.isdir)

    def test_isfile(self):
        self.assertIs(genericpath.isfile(support.TESTFN), False)
        f = open(support.TESTFN, "wb")
        try:
            f.write(b"foo")
            f.close()
            self.assertIs(genericpath.isfile(support.TESTFN), True)
            os.remove(support.TESTFN)
            os.mkdir(support.TESTFN)
            self.assertIs(genericpath.isfile(support.TESTFN), False)
            os.rmdir(support.TESTFN)
        finally:
            if not f.close():
                f.close()
            try:
                os.remove(support.TESTFN)
            except os.error:
                pass
            try:
                os.rmdir(support.TESTFN)
            except os.error:
                pass

        self.assertRaises(TypeError, genericpath.isdir)

        def test_samefile(self):
            f = open(support.TESTFN + "1", "wb")
            try:
                f.write(b"foo")
                f.close()
                self.assertIs(
                    genericpath.samefile(
                        support.TESTFN + "1",
                        support.TESTFN + "1"
                    ),
                    True
                )
                # If we don't have links, assume that os.stat doesn't return resonable
                # inode information and thus, that samefile() doesn't work
                if hasattr(os, "symlink"):
                    os.symlink(
                        support.TESTFN + "1",
                        support.TESTFN + "2"
                    )
                    self.assertIs(
                        genericpath.samefile(
                            support.TESTFN + "1",
                            support.TESTFN + "2"
                        ),
                        True
                    )
                    os.remove(support.TESTFN + "2")
                    f = open(support.TESTFN + "2", "wb")
                    f.write(b"bar")
                    f.close()
                    self.assertIs(
                        genericpath.samefile(
                            support.TESTFN + "1",
                            support.TESTFN + "2"
                        ),
                        False
                    )
            finally:
                if not f.close():
                    f.close()
                try:
                    os.remove(support.TESTFN + "1")
                except os.error:
                    pass
                try:
                    os.remove(support.TESTFN + "2")
                except os.error:
                    pass

            self.assertRaises(TypeError, genericpath.samefile)

def test_main():
    support.run_unittest(AllCommonTest)

if __name__=="__main__":
    test_main()
