import gc

from clang.cindex import CursorKind
from clang.cindex import TranslationUnit
from clang.cindex import TypeKind
from nose.tools import raises
from .util import get_cursor
from .util import get_tu

kInput = """\

typedef int I;

struct teststruct {
  int a;
  I b;
  long c;
  unsigned long d;
  signed long e;
  const int f;
  int *g;
  int ***h;
};

"""

def test_a_struct():
    tu = get_tu(kInput)

    teststruct = get_cursor(tu, 'teststruct')
    assert teststruct is not None, "Could not find teststruct."
    fields = list(teststruct.get_children())
    assert all(x.kind == CursorKind.FIELD_DECL for x in fields)
    assert all(x.translation_unit is not None for x in fields)

    assert fields[0].spelling == 'a'
    assert not fields[0].type.is_const_qualified()
    assert fields[0].type.kind == TypeKind.INT
    assert fields[0].type.get_canonical().kind == TypeKind.INT

    assert fields[1].spelling == 'b'
    assert not fields[1].type.is_const_qualified()
    assert fields[1].type.kind == TypeKind.TYPEDEF
    assert fields[1].type.get_canonical().kind == TypeKind.INT
    assert fields[1].type.get_declaration().spelling == 'I'

    assert fields[2].spelling == 'c'
    assert not fields[2].type.is_const_qualified()
    assert fields[2].type.kind == TypeKind.LONG
    assert fields[2].type.get_canonical().kind == TypeKind.LONG

    assert fields[3].spelling == 'd'
    assert not fields[3].type.is_const_qualified()
    assert fields[3].type.kind == TypeKind.ULONG
    assert fields[3].type.get_canonical().kind == TypeKind.ULONG

    assert fields[4].spelling == 'e'
    assert not fields[4].type.is_const_qualified()
    assert fields[4].type.kind == TypeKind.LONG
    assert fields[4].type.get_canonical().kind == TypeKind.LONG

    assert fields[5].spelling == 'f'
    assert fields[5].type.is_const_qualified()
    assert fields[5].type.kind == TypeKind.INT
    assert fields[5].type.get_canonical().kind == TypeKind.INT

    assert fields[6].spelling == 'g'
    assert not fields[6].type.is_const_qualified()
    assert fields[6].type.kind == TypeKind.POINTER
    assert fields[6].type.get_pointee().kind == TypeKind.INT

    assert fields[7].spelling == 'h'
    assert not fields[7].type.is_const_qualified()
    assert fields[7].type.kind == TypeKind.POINTER
    assert fields[7].type.get_pointee().kind == TypeKind.POINTER
    assert fields[7].type.get_pointee().get_pointee().kind == TypeKind.POINTER
    assert fields[7].type.get_pointee().get_pointee().get_pointee().kind == TypeKind.INT

def test_references():
    """Ensure that a Type maintains a reference to a TranslationUnit."""

    tu = get_tu('int x;')
    children = list(tu.cursor.get_children())
    assert len(children) > 0

    cursor = children[0]
    t = cursor.type

    assert isinstance(t.translation_unit, TranslationUnit)

    # Delete main TranslationUnit reference and force a GC.
    del tu
    gc.collect()
    assert isinstance(t.translation_unit, TranslationUnit)

    # If the TU was destroyed, this should cause a segfault.
    decl = t.get_declaration()

constarrayInput="""
struct teststruct {
  void *A[2];
};
"""
def testConstantArray():
    tu = get_tu(constarrayInput)

    teststruct = get_cursor(tu, 'teststruct')
    assert teststruct is not None, "Didn't find teststruct??"
    fields = list(teststruct.get_children())
    assert fields[0].spelling == 'A'
    assert fields[0].type.kind == TypeKind.CONSTANTARRAY
    assert fields[0].type.get_array_element_type() is not None
    assert fields[0].type.get_array_element_type().kind == TypeKind.POINTER
    assert fields[0].type.get_array_size() == 2

def test_equal():
    """Ensure equivalence operators work on Type."""
    source = 'int a; int b; void *v;'
    tu = get_tu(source)

    a = get_cursor(tu, 'a')
    b = get_cursor(tu, 'b')
    v = get_cursor(tu, 'v')

    assert a is not None
    assert b is not None
    assert v is not None

    assert a.type == b.type
    assert a.type != v.type

    assert a.type != None
    assert a.type != 'foo'

def test_type_spelling():
    """Ensure Type.spelling works."""
    tu = get_tu('int c[5]; void f(int i[]); int x; int v[x];')
    c = get_cursor(tu, 'c')
    i = get_cursor(tu, 'i')
    x = get_cursor(tu, 'x')
    v = get_cursor(tu, 'v')
    assert c is not None
    assert i is not None
    assert x is not None
    assert v is not None
    assert c.type.spelling == "int [5]"
    assert i.type.spelling == "int []"
    assert x.type.spelling == "int"
    assert v.type.spelling == "int [x]"

def test_typekind_spelling():
    """Ensure TypeKind.spelling works."""
    tu = get_tu('int a;')
    a = get_cursor(tu, 'a')

    assert a is not None
    assert a.type.kind.spelling == 'Int'

def test_function_argument_types():
    """Ensure that Type.argument_types() works as expected."""
    tu = get_tu('void f(int, int);')
    f = get_cursor(tu, 'f')
    assert f is not None

    args = f.type.argument_types()
    assert args is not None
    assert len(args) == 2

    t0 = args[0]
    assert t0 is not None
    assert t0.kind == TypeKind.INT

    t1 = args[1]
    assert t1 is not None
    assert t1.kind == TypeKind.INT

    args2 = list(args)
    assert len(args2) == 2
    assert t0 == args2[0]
    assert t1 == args2[1]

@raises(TypeError)
def test_argument_types_string_key():
    """Ensure that non-int keys raise a TypeError."""
    tu = get_tu('void f(int, int);')
    f = get_cursor(tu, 'f')
    assert f is not None

    args = f.type.argument_types()
    assert len(args) == 2

    args['foo']

@raises(IndexError)
def test_argument_types_negative_index():
    """Ensure that negative indexes on argument_types Raises an IndexError."""
    tu = get_tu('void f(int, int);')
    f = get_cursor(tu, 'f')
    args = f.type.argument_types()

    args[-1]

@raises(IndexError)
def test_argument_types_overflow_index():
    """Ensure that indexes beyond the length of Type.argument_types() raise."""
    tu = get_tu('void f(int, int);')
    f = get_cursor(tu, 'f')
    args = f.type.argument_types()

    args[2]

@raises(Exception)
def test_argument_types_invalid_type():
    """Ensure that obtaining argument_types on a Type without them raises."""
    tu = get_tu('int i;')
    i = get_cursor(tu, 'i')
    assert i is not None

    i.type.argument_types()

def test_is_pod():
    """Ensure Type.is_pod() works."""
    tu = get_tu('int i; void f();')
    i = get_cursor(tu, 'i')
    f = get_cursor(tu, 'f')

    assert i is not None
    assert f is not None

    assert i.type.is_pod()
    assert not f.type.is_pod()

def test_function_variadic():
    """Ensure Type.is_function_variadic works."""

    source ="""
#include <stdarg.h>

void foo(int a, ...);
void bar(int a, int b);
"""

    tu = get_tu(source)
    foo = get_cursor(tu, 'foo')
    bar = get_cursor(tu, 'bar')

    assert foo is not None
    assert bar is not None

    assert isinstance(foo.type.is_function_variadic(), bool)
    assert foo.type.is_function_variadic()
    assert not bar.type.is_function_variadic()

def test_element_type():
    """Ensure Type.element_type works."""
    tu = get_tu('int c[5]; void f(int i[]); int x; int v[x];')
    c = get_cursor(tu, 'c')
    i = get_cursor(tu, 'i')
    v = get_cursor(tu, 'v')
    assert c is not None
    assert i is not None
    assert v is not None

    assert c.type.kind == TypeKind.CONSTANTARRAY
    assert c.type.element_type.kind == TypeKind.INT
    assert i.type.kind == TypeKind.INCOMPLETEARRAY
    assert i.type.element_type.kind == TypeKind.INT
    assert v.type.kind == TypeKind.VARIABLEARRAY
    assert v.type.element_type.kind == TypeKind.INT

@raises(Exception)
def test_invalid_element_type():
    """Ensure Type.element_type raises if type doesn't have elements."""
    tu = get_tu('int i;')
    i = get_cursor(tu, 'i')
    assert i is not None
    i.element_type

def test_element_count():
    """Ensure Type.element_count works."""
    tu = get_tu('int i[5]; int j;')
    i = get_cursor(tu, 'i')
    j = get_cursor(tu, 'j')

    assert i is not None
    assert j is not None

    assert i.type.element_count == 5

    try:
        j.type.element_count
        assert False
    except:
        assert True

def test_is_volatile_qualified():
    """Ensure Type.is_volatile_qualified works."""

    tu = get_tu('volatile int i = 4; int j = 2;')

    i = get_cursor(tu, 'i')
    j = get_cursor(tu, 'j')

    assert i is not None
    assert j is not None

    assert isinstance(i.type.is_volatile_qualified(), bool)
    assert i.type.is_volatile_qualified()
    assert not j.type.is_volatile_qualified()

def test_is_restrict_qualified():
    """Ensure Type.is_restrict_qualified works."""

    tu = get_tu('struct s { void * restrict i; void * j; };')

    i = get_cursor(tu, 'i')
    j = get_cursor(tu, 'j')

    assert i is not None
    assert j is not None

    assert isinstance(i.type.is_restrict_qualified(), bool)
    assert i.type.is_restrict_qualified()
    assert not j.type.is_restrict_qualified()

def test_record_layout():
    """Ensure Cursor.type.get_size, Cursor.type.get_align and
    Cursor.type.get_offset works."""

    source ="""
struct a {
    long a1;
    long a2:3;
    long a3:4;
    long long a4;
};
"""
    tries=[(['-target','i386-linux-gnu'],(4,16,0,32,35,64)),
           (['-target','nvptx64-unknown-unknown'],(8,24,0,64,67,128)),
           (['-target','i386-pc-win32'],(8,16,0,32,35,64)),
           (['-target','msp430-none-none'],(2,14,0,32,35,48))]
    for flags, values in tries:
        align,total,a1,a2,a3,a4 = values

        tu = get_tu(source, flags=flags)
        teststruct = get_cursor(tu, 'a')
        fields = list(teststruct.get_children())

        assert teststruct.type.get_align() == align
        assert teststruct.type.get_size() == total
        assert teststruct.type.get_offset(fields[0].spelling) == a1
        assert teststruct.type.get_offset(fields[1].spelling) == a2
        assert teststruct.type.get_offset(fields[2].spelling) == a3
        assert teststruct.type.get_offset(fields[3].spelling) == a4
        assert fields[0].is_bitfield() == False
        assert fields[1].is_bitfield() == True
        assert fields[1].get_bitfield_width() == 3
        assert fields[2].is_bitfield() == True
        assert fields[2].get_bitfield_width() == 4
        assert fields[3].is_bitfield() == False

def test_offset():
    """Ensure Cursor.get_record_field_offset works in anonymous records"""
    source="""
struct Test {
  struct {int a;} typeanon;
  struct {
    int bariton;
    union {
      int foo;
    };
  };
  int bar;
};"""
    tries=[(['-target','i386-linux-gnu'],(4,16,0,32,64,96)),
           (['-target','nvptx64-unknown-unknown'],(8,24,0,32,64,96)),
           (['-target','i386-pc-win32'],(8,16,0,32,64,96)),
           (['-target','msp430-none-none'],(2,14,0,32,64,96))]
    for flags, values in tries:
        align,total,f1,bariton,foo,bar = values
        tu = get_tu(source)
        teststruct = get_cursor(tu, 'Test')
        children = list(teststruct.get_children())
        fields = list(teststruct.type.get_fields())
        assert children[0].kind == CursorKind.STRUCT_DECL
        assert children[0].spelling != "typeanon"
        assert children[1].spelling == "typeanon"
        assert fields[0].kind == CursorKind.FIELD_DECL
        assert fields[1].kind == CursorKind.FIELD_DECL
        assert fields[1].is_anonymous()
        assert teststruct.type.get_offset("typeanon") == f1
        assert teststruct.type.get_offset("bariton") == bariton
        assert teststruct.type.get_offset("foo") == foo
        assert teststruct.type.get_offset("bar") == bar


def test_decay():
    """Ensure decayed types are handled as the original type"""

    tu = get_tu("void foo(int a[]);")
    foo = get_cursor(tu, 'foo')
    a = foo.type.argument_types()[0]

    assert a.kind == TypeKind.INCOMPLETEARRAY
    assert a.element_type.kind == TypeKind.INT
    assert a.get_canonical().kind == TypeKind.INCOMPLETEARRAY
