# encoding: utf-8
"""This file contains unittests for the 
IPython.frontend.cocoa.cocoa_frontend module.
"""
__docformat__ = "restructuredtext en"
                                                                            
#---------------------------------------------------------------------------
#       Copyright (C) 2005  The IPython Development Team    
#                                                                           
#  Distributed under the terms of the BSD License.  The full license is in  
#  the file COPYING, distributed as part of this software.                  
#---------------------------------------------------------------------------
                                                                            
#---------------------------------------------------------------------------
# Imports                                                                   
#---------------------------------------------------------------------------

# Tell nose to skip this module
__test__ = {}

from twisted.trial import unittest
from twisted.internet.defer import succeed

from IPython.kernel.core.interpreter import Interpreter
import IPython.kernel.engineservice as es

try:
    from IPython.frontend.cocoa.cocoa_frontend import IPythonCocoaController
    from Foundation import NSMakeRect
    from AppKit import NSTextView, NSScrollView
except ImportError:
    # This tells twisted.trial to skip this module if PyObjC is not found
    skip = True

#---------------------------------------------------------------------------
# Tests
#---------------------------------------------------------------------------
class TestIPythonCocoaControler(unittest.TestCase):
    """Tests for IPythonCocoaController"""

    def setUp(self):
        self.controller = IPythonCocoaController.alloc().init()
        self.engine = es.EngineService()
        self.engine.startService()

    def tearDown(self):
        self.controller = None
        self.engine.stopService()

    def testControllerExecutesCode(self):
        code ="""5+5"""
        expected = Interpreter().execute(code)
        del expected['number']
        def removeNumberAndID(result):
            del result['number']
            del result['id']
            return result
        d = self.controller.execute(code)
        d.addCallback(removeNumberAndID)
        d.addCallback(lambda r: self.assertEquals(r, expected))

    def testControllerMirrorsUserNSWithValuesAsStrings(self):
        code = """userns1=1;userns2=2"""
        def testControllerUserNS(result):
            self.assertEquals(self.controller.userNS['userns1'], 1)
            self.assertEquals(self.controller.userNS['userns2'], 2)
        self.controller.execute(code).addCallback(testControllerUserNS)

    def testControllerInstantiatesIEngine(self):
        self.assert_(es.IEngineBase.providedBy(self.controller.engine))

    def testControllerCompletesToken(self):
        code = """longNameVariable=10"""
        def testCompletes(result):
            self.assert_("longNameVariable" in result)

        def testCompleteToken(result):
            self.controller.complete("longNa").addCallback(testCompletes)

        self.controller.execute(code).addCallback(testCompletes)


    def testCurrentIndent(self):
        """test that current_indent_string returns current indent or None.
        Uses _indent_for_block for direct unit testing.
        """
        
        self.controller.tabUsesSpaces = True
        self.assert_(self.controller._indent_for_block("""a=3""") == None)
        self.assert_(self.controller._indent_for_block("") == None)
        block = """def test():\n    a=3"""
        self.assert_(self.controller._indent_for_block(block) == \
                    ' ' * self.controller.tabSpaces)
        
        block = """if(True):\n%sif(False):\n%spass""" % \
                    (' '*self.controller.tabSpaces,
                     2*' '*self.controller.tabSpaces)
        self.assert_(self.controller._indent_for_block(block) == \
                    2*(' '*self.controller.tabSpaces))

