def test_convert_union_to_json_type(self):
        union = {'u': Union('u')}
        types = {}

        convert_unions_to_type_for_json(union, types)

        self.assertEqual(types, {UnionType('u').type_hash: UnionType('u')})
    def test_parse_nested_union_without_name_to_type_for_json(self):
        union = 'union s1{ union { char c; }s2; };'
        types = {}

        union = parse_struct(union, 'file')
        parse_union_to_type_for_json(union, types)
        prim = PrimitiveType('char')
        s1 = UnionType('s1', [])
        s2 = UnionType('_LOCAL_s1_s2', [])
        expected = {prim.type_hash: prim, s1.type_hash: s1, s2.type_hash: s2}

        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_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_union_to_type_for_json(self):
        types = {}
        union = 'union xy { int a;};'

        s_info = parse_union(union, 'file')
        parse_union_to_type_for_json(s_info, types)
        st = UnionType('xy', [])
        pt = PrimitiveType('int')
        expected = {st.type_hash: st, pt.type_hash: pt}

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

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

        self.assertEqual(types, expected)
    def test_union_with_func_ptr_to_type_for_json(self):
        types = {}
        union = 'union s{int *(* ptr)();};'

        s_info = parse_union(union, 'file')
        parse_union_to_type_for_json(s_info, types)
        tint = PrimitiveType('int')
        ptrint = PointerType(tint)
        func = FunctionType(ptrint, [])
        func_ptr = PointerType(func)
        st = UnionType('s', [func_ptr])
        expected = {
            tint.type_hash: tint,
            ptrint.type_hash: ptrint,
            func.type_hash: func,
            func_ptr.type_hash: func_ptr,
            st.type_hash: st
        }

        self.assertEqual(types, expected)
 def test_union_type_correct_string_repr(self):
     self.assertEqual(
         UnionType('File').__repr__(), "UnionType('union File', [])")
 def test_union_in_params_is_union_type(self):
     self.assertEqual(parse_type_to_type_for_json('union uname', {}),
                      UnionType('uname'))
 def test_has_members_returns_true_if_union_has_some_data(self):
     self.assertTrue(
         UnionType('s',
                   [Param('x',
                          PrimitiveType('int').type_hash)]).has_members)