import os
from clang.cindex import Config
if 'CLANG_LIBRARY_PATH' in os.environ:
    Config.set_library_path(os.environ['CLANG_LIBRARY_PATH'])

from clang.cindex import CursorKind
from clang.cindex import Index
from clang.cindex import SourceLocation
from clang.cindex import SourceRange
from clang.cindex import TokenKind

from .util import get_tu

import unittest


class TestTokens(unittest.TestCase):
    def test_token_to_cursor(self):
        """Ensure we can obtain a Cursor from a Token instance."""
        tu = get_tu('int i = 5;')
        r = tu.get_extent('t.c', (0, 9))
        tokens = list(tu.get_tokens(extent=r))

        self.assertEqual(len(tokens), 4)
        self.assertEqual(tokens[1].spelling, 'i')
        self.assertEqual(tokens[1].kind, TokenKind.IDENTIFIER)

        cursor = tokens[1].cursor
        self.assertEqual(cursor.kind, CursorKind.VAR_DECL)
        self.assertEqual(tokens[1].cursor, tokens[2].cursor)

    def test_token_location(self):
        """Ensure Token.location works."""

        tu = get_tu('int foo = 10;')
        r = tu.get_extent('t.c', (0, 11))

        tokens = list(tu.get_tokens(extent=r))
        self.assertEqual(len(tokens), 4)

        loc = tokens[1].location
        self.assertIsInstance(loc, SourceLocation)
        self.assertEqual(loc.line, 1)
        self.assertEqual(loc.column, 5)
        self.assertEqual(loc.offset, 4)

    def test_token_extent(self):
        """Ensure Token.extent works."""
        tu = get_tu('int foo = 10;')
        r = tu.get_extent('t.c', (0, 11))

        tokens = list(tu.get_tokens(extent=r))
        self.assertEqual(len(tokens), 4)

        extent = tokens[1].extent
        self.assertIsInstance(extent, SourceRange)

        self.assertEqual(extent.start.offset, 4)
        self.assertEqual(extent.end.offset, 7)
