1+ using System ;
2+
3+ namespace CppAst . Tests
4+ {
5+
6+ public class TestMetaAttribute : InlineTestBase
7+ {
8+ [ Test ]
9+ public void TestNamespaceMetaAttribute ( )
10+ {
11+ ParseAssert ( @"
12+
13+ #if !defined(__cppast)
14+ #define __cppast(...)
15+ #endif
16+
17+ namespace __cppast(script, is_browsable=true, desc=""a namespace test"") TestNs{
18+
19+ }
20+
21+ " , compilation =>
22+ {
23+ Assert . False ( compilation . HasErrors ) ;
24+
25+ //annotate attribute support on namespace
26+ var ns = compilation . Namespaces [ 0 ] ;
27+
28+ Assert . IsTrue ( ns . MetaAttributes . QueryArgumentAsBool ( "script" , false ) ) ;
29+ Assert . IsFalse ( ! ns . MetaAttributes . QueryArgumentAsBool ( "is_browsable" , false ) ) ;
30+ Assert . AreEqual ( "a namespace test" , ns . MetaAttributes . QueryArgumentAsString ( "desc" , "" ) ) ;
31+
32+ }
33+ ) ;
34+ }
35+
36+ [ Test ]
37+ public void TestClassMetaAttribute ( )
38+ {
39+
40+ ParseAssert ( @"
41+
42+ #if !defined(__cppast)
43+ #define __cppast(...)
44+ #endif
45+
46+ class __cppast(script, is_browsable=true, desc=""a class"") TestClass
47+ {
48+ public:
49+ __cppast(desc=""a member function"")
50+ __cppast(desc2=""a member function 2"")
51+ void TestMemberFunc();
52+
53+ __cppast(desc=""a member field"")
54+ __cppast(desc2=""a member field 2"")
55+ int X;
56+ };
57+
58+ " , compilation =>
59+ {
60+ Assert . False ( compilation . HasErrors ) ;
61+
62+ var cppClass = compilation . Classes [ 0 ] ;
63+ Assert . IsTrue ( cppClass . MetaAttributes . QueryArgumentAsBool ( "script" , false ) ) ;
64+ Assert . IsFalse ( ! cppClass . MetaAttributes . QueryArgumentAsBool ( "is_browsable" , false ) ) ;
65+ Assert . AreEqual ( "a class" , cppClass . MetaAttributes . QueryArgumentAsString ( "desc" , "" ) ) ;
66+
67+ Assert . AreEqual ( 1 , cppClass . Functions . Count ) ;
68+ Assert . AreEqual ( "a member function" , cppClass . Functions [ 0 ] . MetaAttributes . QueryArgumentAsString ( "desc" , "" ) ) ;
69+ Assert . AreEqual ( "a member function 2" , cppClass . Functions [ 0 ] . MetaAttributes . QueryArgumentAsString ( "desc2" , "" ) ) ;
70+
71+ Assert . AreEqual ( 1 , cppClass . Fields . Count ) ;
72+ Assert . AreEqual ( "a member field" , cppClass . Fields [ 0 ] . MetaAttributes . QueryArgumentAsString ( "desc" , "" ) ) ;
73+ Assert . AreEqual ( "a member field 2" , cppClass . Fields [ 0 ] . MetaAttributes . QueryArgumentAsString ( "desc2" , "" ) ) ;
74+
75+ }
76+ ) ;
77+ }
78+
79+ [ Test ]
80+ public void TestTemplateMetaAttribute ( )
81+ {
82+
83+ ParseAssert ( @"
84+
85+ #if !defined(__cppast)
86+ #define __cppast(...)
87+ #endif
88+
89+ template <typename T>
90+ class TestTemplateClass
91+ {
92+ public:
93+
94+ __cppast(desc=""a template member field"")
95+ T X;
96+ };
97+
98+ using IntClass __cppast(desc=""a template class for int"") = TestTemplateClass<int>;
99+ using DoubleClass __cppast(desc=""a template class for double"") = TestTemplateClass<double>;
100+
101+ typedef TestTemplateClass<float> __cppast(desc=""a template class for float"") FloatClass;
102+ " , compilation =>
103+ {
104+ Assert . False ( compilation . HasErrors ) ;
105+
106+ var templateClass = compilation . Classes [ 0 ] ;
107+ Assert . AreEqual ( "a template member field" , templateClass . Fields [ 0 ] . MetaAttributes . QueryArgumentAsString ( "desc" , "" ) ) ;
108+
109+ var intClass = compilation . Classes [ 1 ] ;
110+ var doubleClass = compilation . Classes [ 2 ] ;
111+ var floatClass = compilation . Classes [ 3 ] ;
112+ Assert . AreEqual ( "a template class for int" , intClass . MetaAttributes . QueryArgumentAsString ( "desc" , "" ) ) ;
113+ Assert . AreEqual ( "a template class for double" , doubleClass . MetaAttributes . QueryArgumentAsString ( "desc" , "" ) ) ;
114+ Assert . AreEqual ( "a template class for float" , floatClass . MetaAttributes . QueryArgumentAsString ( "desc" , "" ) ) ;
115+ }
116+ ) ;
117+ }
118+ }
119+ }
0 commit comments