|
@@ -1,292 +0,0 @@
|
1
|
|
-// Copyright 2015 The Go Authors. All rights reserved.
|
2
|
|
-// Use of this source code is governed by a BSD-style
|
3
|
|
-// license that can be found in the LICENSE file.
|
4
|
|
-
|
5
|
|
-package demangle
|
6
|
|
-
|
7
|
|
-import (
|
8
|
|
- "strconv"
|
9
|
|
- "strings"
|
10
|
|
- "testing"
|
11
|
|
-)
|
12
|
|
-
|
13
|
|
-// Check test cases discovered after the code passed the tests in
|
14
|
|
-// demangle-expected (which are tested by TestExpected). Some of this
|
15
|
|
-// are cases where we differ from the standard demangler, some we are
|
16
|
|
-// the same but we weren't initially.
|
17
|
|
-func TestDemangler(t *testing.T) {
|
18
|
|
- var tests = []struct {
|
19
|
|
- input string
|
20
|
|
- want string
|
21
|
|
- wantNoParams string
|
22
|
|
- wantNoTemplateParams string
|
23
|
|
- wantMinimal string
|
24
|
|
- }{
|
25
|
|
- {
|
26
|
|
- "_ZNSaIcEC1ERKS_",
|
27
|
|
- "std::allocator<char>::allocator(std::allocator<char> const&)",
|
28
|
|
- "std::allocator<char>::allocator",
|
29
|
|
- "std::allocator::allocator(std::allocator const&)",
|
30
|
|
- "std::allocator::allocator",
|
31
|
|
- },
|
32
|
|
- {
|
33
|
|
- "_ZN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEC1EP8_IO_FILESt13_Ios_Openmodem",
|
34
|
|
- "__gnu_cxx::stdio_filebuf<char, std::char_traits<char> >::stdio_filebuf(_IO_FILE*, std::_Ios_Openmode, unsigned long)",
|
35
|
|
- "__gnu_cxx::stdio_filebuf<char, std::char_traits<char> >::stdio_filebuf",
|
36
|
|
- "__gnu_cxx::stdio_filebuf::stdio_filebuf(_IO_FILE*, std::_Ios_Openmode, unsigned long)",
|
37
|
|
- "__gnu_cxx::stdio_filebuf::stdio_filebuf",
|
38
|
|
- },
|
39
|
|
- {
|
40
|
|
- "_ZN1n1CcvNS_1DIT_EEI1EEEv",
|
41
|
|
- "n::C::operator n::D<E><E>()",
|
42
|
|
- "n::C::operator n::D<E><E>",
|
43
|
|
- "n::C::operator n::D()",
|
44
|
|
- "n::C::operator n::D",
|
45
|
|
- },
|
46
|
|
- {
|
47
|
|
- "_Z1CIvPN1D1E1FIdJEEEdEPN1GILb0ET_T0_T1_E1HEPFS6_S7_S8_EN1H1I1JIS7_E1KENSG_IS8_E1KE",
|
48
|
|
- "G<false, void, D::E::F<double>*, double>::H* C<void, D::E::F<double>*, double>(void (*)(D::E::F<double>*, double), H::I::J<D::E::F<double>*>::K, H::I::J<double>::K)",
|
49
|
|
- "C<void, D::E::F<double>*, double>",
|
50
|
|
- "G::H* C(void (*)(D::E::F*, double), H::I::J::K, H::I::J::K)",
|
51
|
|
- "C",
|
52
|
|
- },
|
53
|
|
- {
|
54
|
|
- "_ZZNK1CI1DIcSt1EIcESaIcEEJEE1FEvE1F",
|
55
|
|
- "C<D<char, std::E<char>, std::allocator<char> > >::F() const::F",
|
56
|
|
- "C<D<char, std::E<char>, std::allocator<char> > >::F() const::F",
|
57
|
|
- "C::F() const::F",
|
58
|
|
- "C::F() const::F",
|
59
|
|
- },
|
60
|
|
- {
|
61
|
|
- "_ZN1CI1DSt1EIK1FN1G1HEEE1I1JIJRKS6_EEEvDpOT_",
|
62
|
|
- "void C<D, std::E<F const, G::H> >::I::J<std::E<F const, G::H> const&>(std::E<F const, G::H> const&)",
|
63
|
|
- "C<D, std::E<F const, G::H> >::I::J<std::E<F const, G::H> const&>",
|
64
|
|
- "void C::I::J(std::E const&)",
|
65
|
|
- "C::I::J",
|
66
|
|
- },
|
67
|
|
- {
|
68
|
|
- "_ZN1C1D1E1FIJEEEvi1GDpT_",
|
69
|
|
- "void C::D::E::F<>(int, G)",
|
70
|
|
- "C::D::E::F<>",
|
71
|
|
- "void C::D::E::F(int, G)",
|
72
|
|
- "C::D::E::F",
|
73
|
|
- },
|
74
|
|
- {
|
75
|
|
- "_ZN1CILj50ELb1EE1DEv",
|
76
|
|
- "C<50u, true>::D()",
|
77
|
|
- "C<50u, true>::D",
|
78
|
|
- "C::D()",
|
79
|
|
- "C::D",
|
80
|
|
- },
|
81
|
|
- {
|
82
|
|
- "_ZN1CUt_C2Ev",
|
83
|
|
- "C::{unnamed type#1}::{unnamed type#1}()",
|
84
|
|
- "C::{unnamed type#1}::{unnamed type#1}",
|
85
|
|
- "C::{unnamed type#1}::{unnamed type#1}()",
|
86
|
|
- "C::{unnamed type#1}::{unnamed type#1}",
|
87
|
|
- },
|
88
|
|
- {
|
89
|
|
- "_ZN1C12_GLOBAL__N_11DINS_1EEEEN1F1GIDTadcldtcvT__E1HEEEERKS5_NS_1I1JE",
|
90
|
|
- "F::G<decltype (&((((C::E)()).H)()))> C::(anonymous namespace)::D<C::E>(C::E const&, C::I::J)",
|
91
|
|
- "C::(anonymous namespace)::D<C::E>",
|
92
|
|
- "F::G C::(anonymous namespace)::D(C::E const&, C::I::J)",
|
93
|
|
- "C::(anonymous namespace)::D",
|
94
|
|
- },
|
95
|
|
- {
|
96
|
|
- "_ZN1CI1DE1EIJiRiRPKcRA1_S4_S8_bS6_S3_RjRPKN1F1GERPKN1H1IEEEEvDpOT_",
|
97
|
|
- "void C<D>::E<int, int&, char const*&, char const (&) [1], char const (&) [1], bool, char const*&, int&, unsigned int&, F::G const*&, H::I const*&>(int&&, int&, char const*&, char const (&) [1], char const (&) [1], bool&&, char const*&, int&, unsigned int&, F::G const*&, H::I const*&)",
|
98
|
|
- "C<D>::E<int, int&, char const*&, char const (&) [1], char const (&) [1], bool, char const*&, int&, unsigned int&, F::G const*&, H::I const*&>",
|
99
|
|
- "void C::E(int&&, int&, char const*&, char const (&) [1], char const (&) [1], bool&&, char const*&, int&, unsigned int&, F::G const*&, H::I const*&)",
|
100
|
|
- "C::E",
|
101
|
|
- },
|
102
|
|
- {
|
103
|
|
- "_ZN1C12_GLOBAL__N_11DIFbPKNS_1EEEEEvPNS_1FERKT_",
|
104
|
|
- "void C::(anonymous namespace)::D<bool (C::E const*)>(C::F*, bool (&)(C::E const*) const)",
|
105
|
|
- "C::(anonymous namespace)::D<bool (C::E const*)>",
|
106
|
|
- "void C::(anonymous namespace)::D(C::F*, bool (&)(C::E const*) const)",
|
107
|
|
- "C::(anonymous namespace)::D",
|
108
|
|
- },
|
109
|
|
- {
|
110
|
|
- "_ZN1C1D1EIJRFviSt1FIFvRKN1G1H1IEEERKSt6vectorINS_1JESaISB_EEERiS9_EvEENS0_1K1LIJDpNSt1MIT_E1NEEEEDpOSM_",
|
111
|
|
- "C::D::K::L<std::M<void (&)(int, std::F<void (G::H::I const&)>, std::vector<C::J, std::allocator<C::J> > const&)>::N, std::M<int&>::N, std::M<std::F<void (G::H::I const&)> >::N> C::D::E<void (&)(int, std::F<void (G::H::I const&)>, std::vector<C::J, std::allocator<C::J> > const&), int&, std::F<void (G::H::I const&)>, void>(void (&)(int, std::F<void (G::H::I const&)>, std::vector<C::J, std::allocator<C::J> > const&), int&, std::F<void (G::H::I const&)>&&)",
|
112
|
|
- "C::D::E<void (&)(int, std::F<void (G::H::I const&)>, std::vector<C::J, std::allocator<C::J> > const&), int&, std::F<void (G::H::I const&)>, void>",
|
113
|
|
- "C::D::K::L C::D::E(void (&)(int, std::F, std::vector const&), int&, std::F&&)",
|
114
|
|
- "C::D::E",
|
115
|
|
- },
|
116
|
|
- {
|
117
|
|
- "_ZN1C1D1E1FcvNS_1GIT_EEI1HEEv",
|
118
|
|
- "C::D::E::F::operator C::G<H><H>()",
|
119
|
|
- "C::D::E::F::operator C::G<H><H>",
|
120
|
|
- "C::D::E::F::operator C::G()",
|
121
|
|
- "C::D::E::F::operator C::G",
|
122
|
|
- },
|
123
|
|
- {
|
124
|
|
- "_ZN9__gnu_cxx17__normal_iteratorIPK1EIN1F1G1HEESt6vectorIS5_SaIS5_EEEC2IPS5_EERKNS0_IT_NS_11__enable_ifIXsr3std10__are_sameISE_SD_EE7__valueESA_E1IEEE",
|
125
|
|
- "__gnu_cxx::__normal_iterator<E<F::G::H> const*, std::vector<E<F::G::H>, std::allocator<E<F::G::H> > > >::__normal_iterator<E<F::G::H>*>(__gnu_cxx::__normal_iterator<E<F::G::H>*, __gnu_cxx::__enable_if<std::__are_same<E<F::G::H>*, E<F::G::H>*>::__value, std::vector<E<F::G::H>, std::allocator<E<F::G::H> > > >::I> const&)",
|
126
|
|
- "__gnu_cxx::__normal_iterator<E<F::G::H> const*, std::vector<E<F::G::H>, std::allocator<E<F::G::H> > > >::__normal_iterator<E<F::G::H>*>",
|
127
|
|
- "__gnu_cxx::__normal_iterator::__normal_iterator(__gnu_cxx::__normal_iterator const&)",
|
128
|
|
- "__gnu_cxx::__normal_iterator::__normal_iterator",
|
129
|
|
- },
|
130
|
|
- {
|
131
|
|
- "_ZNKSt1CIM1DKFjvEEclIJEvEEjPKS0_DpOT_",
|
132
|
|
- "unsigned int std::C<unsigned int (D::*)() const>::operator()<void>(D const*) const",
|
133
|
|
- "std::C<unsigned int (D::*)() const>::operator()<void>",
|
134
|
|
- "unsigned int std::C::operator()(D const*) const",
|
135
|
|
- "std::C::operator()",
|
136
|
|
- },
|
137
|
|
- {
|
138
|
|
- "_ZNSt10_HashtableI12basic_stringIcSt11char_traitsIcESaIcEESt4pairIKS4_N1C1D1EEESaISA_ENSt8__detail10_Select1stESt8equal_toIS4_ESt4hashIS4_ENSC_18_Mod_range_hashingENSC_20_Default_ranged_hashENSC_20_Prime_rehash_policyENSC_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_assignIZNSN_C1ERKSN_EUlPKNSC_10_Hash_nodeISA_Lb1EEEE_EEvSQ_RKT_",
|
139
|
|
- "void std::_Hashtable<basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<basic_string<char, std::char_traits<char>, std::allocator<char> > const, C::D::E>, std::allocator<std::pair<basic_string<char, std::char_traits<char>, std::allocator<char> > const, C::D::E> >, std::__detail::_Select1st, std::equal_to<basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::hash<basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >::_M_assign<std::_Hashtable<basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<basic_string<char, std::char_traits<char>, std::allocator<char> > const, C::D::E>, std::allocator<std::pair<basic_string<char, std::char_traits<char>, std::allocator<char> > const, C::D::E> >, std::__detail::_Select1st, std::equal_to<basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::hash<basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >::_Hashtable(std::_Hashtable<basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<basic_string<char, std::char_traits<char>, std::allocator<char> > const, C::D::E>, std::allocator<std::pair<basic_string<char, std::char_traits<char>, std::allocator<char> > const, C::D::E> >, std::__detail::_Select1st, std::equal_to<basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::hash<basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> > const&)::{lambda(std::__detail::_Hash_node<std::pair<basic_string<char, std::char_traits<char>, std::allocator<char> > const, C::D::E>, true> const*)#1}>(std::_Hashtable<basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<basic_string<char, std::char_traits<char>, std::allocator<char> > const, C::D::E>, std::allocator<std::pair<basic_string<char, std::char_traits<char>, std::allocator<char> > const, C::D::E> >, std::__detail::_Select1st, std::equal_to<basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::hash<basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> > const&, std::_Hashtable<basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<basic_string<char, std::char_traits<char>, std::allocator<char> > const, C::D::E>, std::allocator<std::pair<basic_string<char, std::char_traits<char>, std::allocator<char> > const, C::D::E> >, std::__detail::_Select1st, std::equal_to<basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::hash<basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >::_Hashtable(std::_Hashtable<basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<basic_string<char, std::char_traits<char>, std::allocator<char> > const, C::D::E>, std::allocator<std::pair<basic_string<char, std::char_traits<char>, std::allocator<char> > const, C::D::E> >, std::__detail::_Select1st, std::equal_to<basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::hash<basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> > const&)::{lambda(std::__detail::_Hash_node<std::pair<basic_string<char, std::char_traits<char>, std::allocator<char> > const, C::D::E>, true> const*)#1} const&)",
|
140
|
|
- "std::_Hashtable<basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<basic_string<char, std::char_traits<char>, std::allocator<char> > const, C::D::E>, std::allocator<std::pair<basic_string<char, std::char_traits<char>, std::allocator<char> > const, C::D::E> >, std::__detail::_Select1st, std::equal_to<basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::hash<basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >::_M_assign<std::_Hashtable<basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<basic_string<char, std::char_traits<char>, std::allocator<char> > const, C::D::E>, std::allocator<std::pair<basic_string<char, std::char_traits<char>, std::allocator<char> > const, C::D::E> >, std::__detail::_Select1st, std::equal_to<basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::hash<basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >::_Hashtable(std::_Hashtable<basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<basic_string<char, std::char_traits<char>, std::allocator<char> > const, C::D::E>, std::allocator<std::pair<basic_string<char, std::char_traits<char>, std::allocator<char> > const, C::D::E> >, std::__detail::_Select1st, std::equal_to<basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::hash<basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> > const&)::{lambda(std::__detail::_Hash_node<std::pair<basic_string<char, std::char_traits<char>, std::allocator<char> > const, C::D::E>, true> const*)#1}>",
|
141
|
|
- "void std::_Hashtable::_M_assign(std::_Hashtable const&, std::_Hashtable::_Hashtable(std::_Hashtable const&)::{lambda(std::__detail::_Hash_node const*)#1} const&)",
|
142
|
|
- "std::_Hashtable::_M_assign",
|
143
|
|
- },
|
144
|
|
- {
|
145
|
|
- "_ZSt3maxIVdERKT_S3_S3_",
|
146
|
|
- "double const volatile& std::max<double volatile>(double const volatile&, double const volatile&)",
|
147
|
|
- "std::max<double volatile>",
|
148
|
|
- "double const volatile& std::max(double const volatile&, double const volatile&)",
|
149
|
|
- "std::max",
|
150
|
|
- },
|
151
|
|
- {
|
152
|
|
- "_ZZN1C1D1E1F1G1HEvENUlvE_C2EOS4_",
|
153
|
|
- "C::D::E::F::G::H()::{lambda()#1}::{lambda()#1}({lambda()#1}&&)",
|
154
|
|
- "C::D::E::F::G::H()::{lambda()#1}::{lambda()#1}",
|
155
|
|
- "C::D::E::F::G::H()::{lambda()#1}::{lambda()#1}({lambda()#1}&&)",
|
156
|
|
- "C::D::E::F::G::H()::{lambda()#1}::{lambda()#1}",
|
157
|
|
- },
|
158
|
|
- {
|
159
|
|
- "_ZThn8_NK1C1D1EEv",
|
160
|
|
- "non-virtual thunk to C::D::E() const",
|
161
|
|
- "non-virtual thunk to C::D::E() const",
|
162
|
|
- "non-virtual thunk to C::D::E() const",
|
163
|
|
- "non-virtual thunk to C::D::E() const",
|
164
|
|
- },
|
165
|
|
- {
|
166
|
|
- "_ZTv0_n96_NK1C1D1E1FEv",
|
167
|
|
- "virtual thunk to C::D::E::F() const",
|
168
|
|
- "virtual thunk to C::D::E::F() const",
|
169
|
|
- "virtual thunk to C::D::E::F() const",
|
170
|
|
- "virtual thunk to C::D::E::F() const",
|
171
|
|
- },
|
172
|
|
- {
|
173
|
|
- "_ZTCSt9strstream16_So",
|
174
|
|
- "construction vtable for std::ostream-in-std::strstream",
|
175
|
|
- "construction vtable for std::ostream-in-std::strstream",
|
176
|
|
- "construction vtable for std::ostream-in-std::strstream",
|
177
|
|
- "construction vtable for std::ostream-in-std::strstream",
|
178
|
|
- },
|
179
|
|
- {
|
180
|
|
- "_ZGVZZN1C1D1EEvENK3$_0clEvE1F",
|
181
|
|
- "guard variable for C::D::E()::$_0::operator()() const::F",
|
182
|
|
- "guard variable for C::D::E()::$_0::operator()() const::F",
|
183
|
|
- "guard variable for C::D::E()::$_0::operator()() const::F",
|
184
|
|
- "guard variable for C::D::E()::$_0::operator()() const::F",
|
185
|
|
- },
|
186
|
|
- {
|
187
|
|
- "_Z1fICiEvT_",
|
188
|
|
- "void f<int _Complex>(int _Complex)",
|
189
|
|
- "f<int _Complex>",
|
190
|
|
- "void f(int _Complex)",
|
191
|
|
- "f",
|
192
|
|
- },
|
193
|
|
- {
|
194
|
|
- "_GLOBAL__D__Z2fnv",
|
195
|
|
- "global destructors keyed to fn()",
|
196
|
|
- "global destructors keyed to fn()",
|
197
|
|
- "global destructors keyed to fn()",
|
198
|
|
- "global destructors keyed to fn()",
|
199
|
|
- },
|
200
|
|
- {
|
201
|
|
- "_Z1fIXadL_Z1hvEEEvv",
|
202
|
|
- "void f<&h>()",
|
203
|
|
- "f<&h>",
|
204
|
|
- "void f()",
|
205
|
|
- "f",
|
206
|
|
- },
|
207
|
|
- {
|
208
|
|
- "_Z1CIP1DEiRK1EPT_N1F1GIS5_Xaasr1HIS5_E1IntsrSA_1JEE1KE",
|
209
|
|
- "int C<D*>(E const&, D**, F::G<D*, H<D*>::I&&(!H<D*>::J)>::K)",
|
210
|
|
- "C<D*>",
|
211
|
|
- "int C(E const&, D**, F::G::K)",
|
212
|
|
- "C",
|
213
|
|
- },
|
214
|
|
- }
|
215
|
|
-
|
216
|
|
- for _, test := range tests {
|
217
|
|
- if got, err := ToString(test.input); err != nil {
|
218
|
|
- t.Errorf("demangling %s: unexpected error %v", test.input, err)
|
219
|
|
- } else if got != test.want {
|
220
|
|
- t.Errorf("demangling %s: got %s, want %s", test.input, got, test.want)
|
221
|
|
- }
|
222
|
|
-
|
223
|
|
- if got, err := ToString(test.input, NoParams); err != nil {
|
224
|
|
- t.Errorf("demangling NoParams %s: unexpected error %v", test.input, err)
|
225
|
|
- } else if got != test.wantNoParams {
|
226
|
|
- t.Errorf("demangling NoParams %s: got %s, want %s", test.input, got, test.wantNoParams)
|
227
|
|
- }
|
228
|
|
-
|
229
|
|
- if got, err := ToString(test.input, NoTemplateParams); err != nil {
|
230
|
|
- t.Errorf("demangling NoTemplateParams %s: unexpected error %v", test.input, err)
|
231
|
|
- } else if got != test.wantNoTemplateParams {
|
232
|
|
- t.Errorf("demangling NoTemplateParams %s: got %s, want %s", test.input, got, test.wantNoTemplateParams)
|
233
|
|
- }
|
234
|
|
-
|
235
|
|
- if got, err := ToString(test.input, NoParams, NoTemplateParams); err != nil {
|
236
|
|
- t.Errorf("demangling NoTemplateParams %s: unexpected error %v", test.input, err)
|
237
|
|
- } else if got != test.wantMinimal {
|
238
|
|
- t.Errorf("demangling Minimal %s: got %s, want %s", test.input, got, test.wantMinimal)
|
239
|
|
- }
|
240
|
|
-
|
241
|
|
- // Test Filter also.
|
242
|
|
- if got := Filter(test.input); got != test.want {
|
243
|
|
- t.Errorf("Filter(%s) == %s, want %s", test.input, got, test.want)
|
244
|
|
- }
|
245
|
|
- }
|
246
|
|
-}
|
247
|
|
-
|
248
|
|
-// Test for some failure cases.
|
249
|
|
-func TestFailure(t *testing.T) {
|
250
|
|
- var tests = []struct {
|
251
|
|
- input string
|
252
|
|
- error string
|
253
|
|
- off int
|
254
|
|
- }{
|
255
|
|
- {
|
256
|
|
- "_Z1FE",
|
257
|
|
- "unparsed characters at end of mangled name",
|
258
|
|
- 4,
|
259
|
|
- },
|
260
|
|
- {
|
261
|
|
- "_Z1FQ",
|
262
|
|
- "unrecognized type code",
|
263
|
|
- 4,
|
264
|
|
- },
|
265
|
|
- }
|
266
|
|
-
|
267
|
|
- for _, test := range tests {
|
268
|
|
- got, err := ToString(test.input)
|
269
|
|
- if err == nil {
|
270
|
|
- t.Errorf("unexpected success for %s: %s", test.input, got)
|
271
|
|
- } else if !strings.Contains(err.Error(), test.error) {
|
272
|
|
- t.Errorf("unexpected error for %s: %v", test.input, err)
|
273
|
|
- } else {
|
274
|
|
- s := err.Error()
|
275
|
|
- i := strings.LastIndex(s, " at ")
|
276
|
|
- if i < 0 {
|
277
|
|
- t.Errorf("missing offset in error for %s: %v", test.input, err)
|
278
|
|
- } else {
|
279
|
|
- off, oerr := strconv.Atoi(s[i+4:])
|
280
|
|
- if oerr != nil {
|
281
|
|
- t.Errorf("can't parse offset (%s) for %s: %v", s[i+4:], test.input, err)
|
282
|
|
- } else if off != test.off {
|
283
|
|
- t.Errorf("unexpected offset for %s: got %d, want %d", test.input, off, test.off)
|
284
|
|
- }
|
285
|
|
- }
|
286
|
|
- }
|
287
|
|
-
|
288
|
|
- if got := Filter(test.input); got != test.input {
|
289
|
|
- t.Errorf("Filter(%s) == %s, want %s", test.input, got, test.input)
|
290
|
|
- }
|
291
|
|
- }
|
292
|
|
-}
|