from clang.cindex import TLSKind
from clang.cindex import Cursor
from clang.cindex import TranslationUnit

from .util import get_cursor
from .util import get_tu

import unittest


class TestTLSKind(unittest.TestCase):
    def test_tls_kind(self):
        """Ensure that thread-local storage kinds are available on cursors."""

        tu = get_tu("""
int tls_none;
thread_local int tls_dynamic;
_Thread_local int tls_static;
""", lang = 'cpp')

        tls_none = get_cursor(tu.cursor, 'tls_none')
        self.assertEqual(tls_none.tls_kind, TLSKind.NONE)

        tls_dynamic = get_cursor(tu.cursor, 'tls_dynamic')
        self.assertEqual(tls_dynamic.tls_kind, TLSKind.DYNAMIC)

        tls_static = get_cursor(tu.cursor, 'tls_static')
        self.assertEqual(tls_static.tls_kind, TLSKind.STATIC)

        # The following case tests '__declspec(thread)'.  Since it is a Microsoft
        # specific extension, specific flags are required for the parser to pick
        # these up.
        flags = ['-fms-extensions', '-target', 'x86_64-unknown-windows-win32',
                 '-fms-compatibility-version=18']
        tu = get_tu("""
__declspec(thread) int tls_declspec_msvc18;
""", lang = 'cpp', flags=flags)

        tls_declspec_msvc18 = get_cursor(tu.cursor, 'tls_declspec_msvc18')
        self.assertEqual(tls_declspec_msvc18.tls_kind, TLSKind.STATIC)

        flags = ['-fms-extensions', '-target', 'x86_64-unknown-windows-win32',
                 '-fms-compatibility-version=19']
        tu = get_tu("""
__declspec(thread) int tls_declspec_msvc19;
""", lang = 'cpp', flags=flags)

        tls_declspec_msvc19 = get_cursor(tu.cursor, 'tls_declspec_msvc19')
        self.assertEqual(tls_declspec_msvc19.tls_kind, TLSKind.DYNAMIC)
