def test_convert_typedef_to_json_type(self):
        tdef = [Param('x', 'int')]
        types = {}

        convert_typedefs_to_type_for_json(tdef, types)
        x = PrimitiveType('int')

        self.assertEqual(types, {
            x.type_hash: x,
            TypedefedType('x', x).type_hash: TypedefedType('x', x)
        })
    def test_parse_typedef_and_ptr_to_struct_to_type_for_json(self):
        types = {}
        struct = 'typedef struct xy {} *ptr_s, typ;'

        s_info = parse_struct(struct, 'file')
        parse_struct_to_type_for_json(s_info, types)
        st = StructType('xy', [])
        ptr = PointerType(st)
        tptr = TypedefedType('ptr_s', ptr)
        typedef = TypedefedType('typ', st)
        expected = {
            st.type_hash: st,
            ptr.type_hash: ptr,
            tptr.type_hash: tptr,
            typedef.type_hash: typedef
        }

        self.assertEqual(types, expected)
    def test_parse_typedef_and_ptr_to_union_to_type_for_json(self):
        types = {}
        union = 'typedef union xy {} *ptr_s, typ;'

        s_info = parse_union(union, 'file')
        parse_union_to_type_for_json(s_info, types)
        st = UnionType('xy', [])
        ptr = PointerType(st)
        tptr = TypedefedType('ptr_s', ptr)
        typedef = TypedefedType('typ', st)
        expected = {
            st.type_hash: st,
            ptr.type_hash: ptr,
            tptr.type_hash: tptr,
            typedef.type_hash: typedef
        }

        self.assertEqual(types, expected)
    def test_parse_typedefed_ptr_to_enum_to_type_for_json(self):
        types = {}
        enum = 'typedef enum x{One = 1, Two = 3} my_type, *ptr;'

        enum_info = parse_enum(enum, 'file')
        parse_enum_to_type_for_json(enum_info, types)
        e = EnumType('x', [EnumItem('One', 1), EnumItem('Two', 3)])
        typ = TypedefedType('my_type', e)
        ptr = PointerType(e)
        tptr = TypedefedType('ptr', ptr)
        expected = {
            e.type_hash: e,
            typ.type_hash: typ,
            tptr.type_hash: tptr,
            ptr.type_hash: ptr
        }

        self.assertEqual(types, expected)
    def test_typedef_to_int_type_for_json(self):
        types = {}
        typedef = Param('tdef', 'int')

        parse_typedef_to_type_for_json(typedef, types)
        t = PrimitiveType('int')
        tdef = TypedefedType('tdef', t)
        expected = {t.type_hash: t, tdef.type_hash: tdef}

        self.assertEqual(types, expected)
    def test_parse_typedef_to_struct_without_name_to_type_for_json(self):
        types = {}
        struct = 'typedef struct {} type_s;'

        s_info = parse_struct(struct, 'file')
        parse_struct_to_type_for_json(s_info, types)
        st = StructType('_TYPEDEF_type_s', [])
        typedef = TypedefedType('type_s', st)
        expected = {st.type_hash: st, typedef.type_hash: typedef}

        self.assertEqual(types, expected)
    def test_parse_typedef_to_union_without_name_to_type_for_json(self):
        types = {}
        union = 'typedef union {} type_s;'

        s_info = parse_union(union, 'file')
        parse_union_to_type_for_json(s_info, types)
        st = UnionType('_TYPEDEF_type_s', [])
        typedef = TypedefedType('type_s', st)
        expected = {st.type_hash: st, typedef.type_hash: typedef}

        self.assertEqual(types, expected)
    def test_parse_typedefed_enum_to_type_for_json(self):
        types = {}
        enum = 'typedef enum x{One = 1, Two = 3} my_type;'

        enum_info = parse_enum(enum, 'file')
        parse_enum_to_type_for_json(enum_info, types)
        e = EnumType('x', [EnumItem('One', 1), EnumItem('Two', 3)])
        typ = TypedefedType('my_type', e)
        expected = {e.type_hash: e, typ.type_hash: typ}

        self.assertEqual(types, expected)
    def test_parse_typedefed_enum_without_name(self):
        types = {}
        enum = 'typedef enum{ }e_type;'

        enum_info = parse_enum(enum, 'file')
        parse_enum_to_type_for_json(enum_info, types)
        enum_type = EnumType('_TYPEDEF_' + 'e_type', [])
        tdef = TypedefedType('e_type')
        expected = {enum_type.type_hash: enum_type, tdef.type_hash: tdef}

        self.assertEqual(types, expected)
    def test_parse_nested_union_without_name_to_type_for_json_use_typedefed_name(
            self):
        union = 'typedef union { union { char c; }s2; } Tunion;'
        types = {}

        union = parse_union(union, 'file')
        parse_union_to_type_for_json(union, types)
        prim = PrimitiveType('char')
        s1 = UnionType('_TYPEDEF_Tunion', [])
        s2 = UnionType('_LOCAL_Tunion_s2', [])
        tdef = TypedefedType('Tunion', s1)
        expected = {
            prim.type_hash: prim,
            s1.type_hash: s1,
            s2.type_hash: s2,
            tdef.type_hash: tdef
        }

        self.assertEqual(types, expected)
 def test_invalid_typedef_name_is_returned_as_typedef_with_empty_name_and_type(
         self):
     self.assertEqual(get_primitive_type_or_typedef(['xx(xx)']),
                      TypedefedType(''))
 def test_typedefed_type_correct_string_repr(self):
     self.assertEqual(
         TypedefedType('Tptr').__repr__(),
         "TypedefedType('Tptr', 'unknown')")
 def test_typedefed_name_text_returns_correct_string(self):
     self.assertEqual(TypedefedType('Tptr').name_text, 'Tptr')
 def test_not_primitve_type_without_modifiers_is_typedefed_type(self):
     self.assertEqual(parse_type_to_type_for_json('FILE', {}),
                      TypedefedType('FILE'))
 def test_parsing_empty_string_to_json_types_returns_typedef_to_unknown(
         self):
     self.assertEqual(parse_type_to_type_for_json('', {}),
                      TypedefedType(''))
 def test_ignore_macros_around_common_typedefs(self):
     self.assertEqual(parse_type_to_type_for_json('HRESULT MYAPI', {}),
                      TypedefedType('HRESULT'))
 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_parse_ptr_to_common_typedef_correctly(self):
     self.assertEqual(parse_type_to_type_for_json('BOOL * MYAPI', {}),
                      PointerType(TypedefedType('BOOL')))
 def test_known_typedefed_type_returns_false_if_unknown_is_set(self):
     self.assertFalse(TypedefedType('Tname').known_typedefed_type)