#!/usr/bin/env python



import unittest

import os

from test import test_support

from Tkinter import Tcl

from _tkinter import TclError



class TclTest(unittest.TestCase):



    def setUp(self):

        self.interp = Tcl()



    def testEval(self):

        tcl = self.interp

        tcl.eval('set a 1')

        self.assertEqual(tcl.eval('set a'),'1')



    def testEvalException(self):

        tcl = self.interp

        self.assertRaises(TclError,tcl.eval,'set a')



    def testEvalException2(self):

        tcl = self.interp

        self.assertRaises(TclError,tcl.eval,'this is wrong')



    def testCall(self):

        tcl = self.interp

        tcl.call('set','a','1')

        self.assertEqual(tcl.call('set','a'),'1')



    def testCallException(self):

        tcl = self.interp

        self.assertRaises(TclError,tcl.call,'set','a')



    def testCallException2(self):

        tcl = self.interp

        self.assertRaises(TclError,tcl.call,'this','is','wrong')



    def testSetVar(self):

        tcl = self.interp

        tcl.setvar('a','1')

        self.assertEqual(tcl.eval('set a'),'1')



    def testSetVarArray(self):

        tcl = self.interp

        tcl.setvar('a(1)','1')

        self.assertEqual(tcl.eval('set a(1)'),'1')



    def testGetVar(self):

        tcl = self.interp

        tcl.eval('set a 1')

        self.assertEqual(tcl.getvar('a'),'1')



    def testGetVarArray(self):

        tcl = self.interp

        tcl.eval('set a(1) 1')

        self.assertEqual(tcl.getvar('a(1)'),'1')



    def testGetVarException(self):

        tcl = self.interp

        self.assertRaises(TclError,tcl.getvar,'a')



    def testGetVarArrayException(self):

        tcl = self.interp

        self.assertRaises(TclError,tcl.getvar,'a(1)')



    def testUnsetVar(self):

        tcl = self.interp

        tcl.setvar('a',1)

        self.assertEqual(tcl.eval('info exists a'),'1')

        tcl.unsetvar('a')

        self.assertEqual(tcl.eval('info exists a'),'0')



    def testUnsetVarArray(self):

        tcl = self.interp

        tcl.setvar('a(1)',1)

        tcl.setvar('a(2)',2)

        self.assertEqual(tcl.eval('info exists a(1)'),'1')

        self.assertEqual(tcl.eval('info exists a(2)'),'1')

        tcl.unsetvar('a(1)')

        self.assertEqual(tcl.eval('info exists a(1)'),'0')

        self.assertEqual(tcl.eval('info exists a(2)'),'1')



    def testUnsetVarException(self):

        tcl = self.interp

        self.assertRaises(TclError,tcl.unsetvar,'a')



    def testEvalFile(self):

        tcl = self.interp

        filename = "testEvalFile.tcl"

        fd = open(filename,'w')

        script = """set a 1

        set b 2

        set c [ expr $a + $b ]

        """

        fd.write(script)

        fd.close()

        tcl.evalfile(filename)

        os.remove(filename)

        self.assertEqual(tcl.eval('set a'),'1')

        self.assertEqual(tcl.eval('set b'),'2')

        self.assertEqual(tcl.eval('set c'),'3')



    def testEvalFileException(self):

        tcl = self.interp

        filename = "doesnotexists"

        try:

            os.remove(filename)

        except Exception,e:

            pass

        self.assertRaises(TclError,tcl.evalfile,filename)



    def testPackageRequireException(self):

        tcl = self.interp

        self.assertRaises(TclError,tcl.eval,'package require DNE')



    def testLoadTk(self):

        import os

        if 'DISPLAY' not in os.environ:

            # skipping test of clean upgradeability

            return

        tcl = Tcl()

        self.assertRaises(TclError,tcl.winfo_geometry)

        tcl.loadtk()

        self.assertEqual('1x1+0+0', tcl.winfo_geometry())

        tcl.destroy()



    def testLoadTkFailure(self):

        import os

        old_display = None

        import sys

        if sys.platform.startswith(('win', 'darwin', 'cygwin')):

            return  # no failure possible on windows?

        if 'DISPLAY' in os.environ:

            old_display = os.environ['DISPLAY']

            del os.environ['DISPLAY']

            # on some platforms, deleting environment variables

            # doesn't actually carry through to the process level

            # because they don't support unsetenv

            # If that's the case, abort.

            display = os.popen('echo $DISPLAY').read().strip()

            if display:

                return

        try:

            tcl = Tcl()

            self.assertRaises(TclError, tcl.winfo_geometry)

            self.assertRaises(TclError, tcl.loadtk)

        finally:

            if old_display is not None:

                os.environ['DISPLAY'] = old_display



def test_main():

    test_support.run_unittest(TclTest)



if __name__ == "__main__":

    test_main()

