import unittest

from test import test_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(test_support.TESTFN, "wb")

        try:

            f.write("foo")

            f.close()

            self.assertEqual(genericpath.getsize(test_support.TESTFN), 3)

        finally:

            if not f.closed:

                f.close()

            os.remove(test_support.TESTFN)



    def test_time(self):

        f = open(test_support.TESTFN, "wb")

        try:

            f.write("foo")

            f.close()

            f = open(test_support.TESTFN, "ab")

            f.write("bar")

            f.close()

            f = open(test_support.TESTFN, "rb")

            d = f.read()

            f.close()

            self.assertEqual(d, "foobar")



            self.assert_(

                genericpath.getctime(test_support.TESTFN) <=

                genericpath.getmtime(test_support.TESTFN)

            )

        finally:

            if not f.closed:

                f.close()

            os.remove(test_support.TESTFN)



    def test_exists(self):

        self.assertIs(genericpath.exists(test_support.TESTFN), False)

        f = open(test_support.TESTFN, "wb")

        try:

            f.write("foo")

            f.close()

            self.assertIs(genericpath.exists(test_support.TESTFN), True)

        finally:

            if not f.close():

                f.close()

            try:

                os.remove(test_support.TESTFN)

            except os.error:

                pass



        self.assertRaises(TypeError, genericpath.exists)



    def test_isdir(self):

        self.assertIs(genericpath.isdir(test_support.TESTFN), False)

        f = open(test_support.TESTFN, "wb")

        try:

            f.write("foo")

            f.close()

            self.assertIs(genericpath.isdir(test_support.TESTFN), False)

            os.remove(test_support.TESTFN)

            os.mkdir(test_support.TESTFN)

            self.assertIs(genericpath.isdir(test_support.TESTFN), True)

            os.rmdir(test_support.TESTFN)

        finally:

            if not f.close():

                f.close()

            try:

                os.remove(test_support.TESTFN)

            except os.error:

                pass

            try:

                os.rmdir(test_support.TESTFN)

            except os.error:

                pass



        self.assertRaises(TypeError, genericpath.isdir)



    def test_isfile(self):

        self.assertIs(genericpath.isfile(test_support.TESTFN), False)

        f = open(test_support.TESTFN, "wb")

        try:

            f.write("foo")

            f.close()

            self.assertIs(genericpath.isfile(test_support.TESTFN), True)

            os.remove(test_support.TESTFN)

            os.mkdir(test_support.TESTFN)

            self.assertIs(genericpath.isfile(test_support.TESTFN), False)

            os.rmdir(test_support.TESTFN)

        finally:

            if not f.close():

                f.close()

            try:

                os.remove(test_support.TESTFN)

            except os.error:

                pass

            try:

                os.rmdir(test_support.TESTFN)

            except os.error:

                pass



        self.assertRaises(TypeError, genericpath.isdir)



        def test_samefile(self):

            f = open(test_support.TESTFN + "1", "wb")

            try:

                f.write("foo")

                f.close()

                self.assertIs(

                    genericpath.samefile(

                        test_support.TESTFN + "1",

                        test_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(

                        test_support.TESTFN + "1",

                        test_support.TESTFN + "2"

                    )

                    self.assertIs(

                        genericpath.samefile(

                            test_support.TESTFN + "1",

                            test_support.TESTFN + "2"

                        ),

                        True

                    )

                    os.remove(test_support.TESTFN + "2")

                    f = open(test_support.TESTFN + "2", "wb")

                    f.write("bar")

                    f.close()

                    self.assertIs(

                        genericpath.samefile(

                            test_support.TESTFN + "1",

                            test_support.TESTFN + "2"

                        ),

                        False

                    )

            finally:

                if not f.close():

                    f.close()

                try:

                    os.remove(test_support.TESTFN + "1")

                except os.error:

                    pass

                try:

                    os.remove(test_support.TESTFN + "2")

                except os.error:

                    pass



            self.assertRaises(TypeError, genericpath.samefile)



def test_main():

    test_support.run_unittest(AllCommonTest)



if __name__=="__main__":

    test_main()

