def test_call_conv_is_set_only_when_one_of_CALL_CONVENTIONS(self):
        types = {}
        fptr = 'void (__MYCALL)(int p1)'

        fptr_type = parse_type_to_type_for_json(fptr, types)
        types[fptr_type.type_hash] = fptr_type

        ret_type = VoidType()
        p1 = PrimitiveType('int')
        func_type = FunctionType(ret_type, [Param('p1', p1.type_hash)], False)
        expected = {
            ret_type.type_hash: ret_type,
            p1.type_hash: p1,
            func_type.type_hash: func_type
        }
        self.assertEqual(types, expected)
    def test_parse_function_with_call_conv_to_type_for_json(self):
        types = {}
        fptr = 'void (__cdecl)(int p1)'

        fptr_type = parse_type_to_type_for_json(fptr, types)
        types[fptr_type.type_hash] = fptr_type

        ret_type = VoidType()
        p1 = PrimitiveType('int')
        func_type = FunctionType(ret_type, [Param('p1', p1.type_hash)], False,
                                 'cdecl')
        expected = {
            ret_type.type_hash: ret_type,
            p1.type_hash: p1,
            func_type.type_hash: func_type
        }
        self.assertEqual(types, expected)
    def test_parse_ptr_to_function_no_params_to_type_for_json(self):
        types = {}
        fptr = 'void * (*)()'

        fptr_type = parse_type_to_type_for_json(fptr, types)
        types[fptr_type.type_hash] = fptr_type
        ret = PrimitiveType('void')
        ret_type = PointerType(ret)
        func_type = FunctionType(ret_type, [])
        ptr = PointerType(func_type)
        expected = {
            ret_type.type_hash: ret_type,
            ret.type_hash: ret,
            func_type.type_hash: func_type,
            ptr.type_hash: ptr
        }

        self.assertEqual(types, expected)
    def test_parse_ptr_to_vararg_function_to_type_for_json(self):
        types = {}
        fptr = 'void (*)(int p1, ...)'

        fptr_type = parse_type_to_type_for_json(fptr, types)
        types[fptr_type.type_hash] = fptr_type

        ret_type = PrimitiveType('void')
        p1 = PrimitiveType('int')
        func_type = FunctionType(ret_type, [Param('p1', p1.type_hash)], True)
        ptr = PointerType(func_type)
        expected = {
            ret_type.type_hash: ret_type,
            p1.type_hash: p1,
            func_type.type_hash: func_type,
            ptr.type_hash: ptr
        }

        self.assertEqual(types, expected)
    def test_parse_ptr_to_function_with_ptr_to_func_as_param(self):
        types = {}
        fptr = 'void (*)(void (*)())'

        fptr_type = parse_type_to_type_for_json(fptr, types)
        types[fptr_type.type_hash] = fptr_type

        ret_type = PrimitiveType('void')
        param = FunctionType(ret_type, [])
        param_ptr = PointerType(param)
        func_type = FunctionType(ret_type, [Param('', param_ptr.type_hash)])
        ptr = PointerType(func_type)
        expected = {
            ret_type.type_hash: ret_type,
            param.type_hash: param,
            param_ptr.type_hash: param_ptr,
            func_type.type_hash: func_type,
            ptr.type_hash: ptr
        }

        self.assertEqual(types, expected)
 def test_parse_array_multi_dimensional(self):
     self.assertEqual(parse_type_to_type_for_json('int [10][10][12]', {}),
                      ArrayType(PrimitiveType('int'), [10, 10, 12]))
 def test_parse_array_one_dimension_not_specified(self):
     self.assertEqual(parse_type_to_type_for_json('int [][10]', {}),
                      ArrayType(PrimitiveType('int'), ['', 10]))
 def test_parse_array_of_structs(self):
     self.assertEqual(parse_type_to_type_for_json('struct A [10]', {}),
                      ArrayType(StructType('A'), [10]))
 def test_parse_ptr_to_const_struct_inversion(self):
     self.assertEqual(
         parse_type_to_type_for_json('struct info const *', {}),
         PointerType(QualifierType('const', StructType('info'))))
 def test_unsigned_type_is_primitive_type_place_of_unsigned_not_matter(
         self):
     self.assertEqual(parse_type_to_type_for_json('long unsigned int', {}),
                      PrimitiveType('long unsigned int'))
 def test_not_primitve_type_without_modifiers_is_typedefed_type(self):
     self.assertEqual(parse_type_to_type_for_json('FILE', {}),
                      TypedefedType('FILE'))
 def test_char_const_is_constant_type_of_primitive_type(self):
     self.assertEqual(parse_type_to_type_for_json('char const', {}),
                      QualifierType('const', PrimitiveType('char')))
 def test_restrict_char_is_restrict_type_of_primitive_type(self):
     self.assertEqual(parse_type_to_type_for_json('restrict char', {}),
                      QualifierType('restrict', PrimitiveType('char')))
 def test_more_modifiers_in_one_type_parsed_correctly(self):
     self.assertEqual(
         parse_type_to_type_for_json('volatile char * const', {}),
         QualifierType(
             'const',
             PointerType(QualifierType('volatile', PrimitiveType('char')))))
 def test_ptr_to_const_ptr_to_void_is_(self):
     self.assertEqual(
         parse_type_to_type_for_json('void * const *', {}),
         PointerType(
             QualifierType('const', PointerType(PrimitiveType('void')))))
 def test_char_const_ptr_is_pointer_type_to_const_type_of_primitive_type(
         self):
     self.assertEqual(
         parse_type_to_type_for_json('char const *', {}),
         PointerType(QualifierType('const', PrimitiveType('char'))))
 def test_signed_modifier_with_primitive_type_is_primitive_type(self):
     self.assertEqual(
         parse_type_to_type_for_json('long signed long int', {}),
         PrimitiveType('long signed long int'))
 def test_signed_is_primitive_type(self):
     self.assertEqual(parse_type_to_type_for_json('signed', {}),
                      PrimitiveType('signed'))
 def test_typedef_name_with_space_is_returned_as_unnamed_unknown_typedef(
         self):
     self.assertEqual(parse_type_to_type_for_json('some Macro', {}),
                      TypedefedType(''))
 def test_volatile_char_is_volatile_type_of_primitive_type(self):
     self.assertEqual(parse_type_to_type_for_json('volatile char', {}),
                      QualifierType('volatile', PrimitiveType('char')))
 def test_parse_array_dimension_set_by_arithmetic_expr(self):
     self.assertEqual(
         parse_type_to_type_for_json('int [10][5 + sizeof(int) - 4 * 3]',
                                     {}),
         ArrayType(PrimitiveType('int'), [10, '5 + sizeof(int) - 4 * 3']))
 def test_ignore_macros_around_common_typedefs(self):
     self.assertEqual(parse_type_to_type_for_json('HRESULT MYAPI', {}),
                      TypedefedType('HRESULT'))
 def test_struct_in_params_is_struct_type(self):
     self.assertEqual(parse_type_to_type_for_json('struct sname', {}),
                      StructType('sname'))
 def test_unsigned_type_is_primitive_type(self):
     self.assertEqual(parse_type_to_type_for_json('unsigned long int', {}),
                      PrimitiveType('unsigned long int'))
 def test_union_in_params_is_union_type(self):
     self.assertEqual(parse_type_to_type_for_json('union uname', {}),
                      UnionType('uname'))
 def test_enum_in_params_is_enum_type(self):
     self.assertEqual(parse_type_to_type_for_json('enum ename', {}),
                      EnumType('ename'))
 def test_ignore_macros_around_void_type(self):
     self.assertEqual(parse_type_to_type_for_json('void MYAPI', {}),
                      VoidType())
 def test_parse_const_array_one_dimension(self):
     self.assertEqual(
         parse_type_to_type_for_json('const int [10]', {}),
         ArrayType(QualifierType('const', PrimitiveType('int')), [10]))
 def test_parse_ptr_to_common_typedef_correctly(self):
     self.assertEqual(parse_type_to_type_for_json('BOOL * MYAPI', {}),
                      PointerType(TypedefedType('BOOL')))
 def test_ptr_ptr_char_is_pointer_type_to_pointer_type_to_primitive_type(
         self):
     self.assertEqual(parse_type_to_type_for_json('char **', {}),
                      PointerType(PointerType(PrimitiveType('char'))))