@cparra/apex-reflection 2.12.1 → 2.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/__tests__/end-to-end.test.ts +276 -258
- package/index.d.ts +2 -2
- package/index.ts +2 -2
- package/out.js +4995 -4897
- package/package.json +1 -1
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
import {ClassMirror, EnumMirror, InterfaceMirror, reflect} from '../index';
|
|
2
2
|
|
|
3
3
|
describe('Enum Reflection', () => {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
4
|
+
test('Simple, single line declaration', () => {
|
|
5
|
+
const enumBody = 'enum MyEnumName {}';
|
|
6
|
+
const result = reflect(enumBody).typeMirror;
|
|
7
|
+
expect(result.type_name).toBe('enum');
|
|
8
|
+
expect(result.name).toBe('MyEnumName');
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
test('Multi-line declaration with values', () => {
|
|
12
|
+
const enumBody = `
|
|
13
13
|
enum MyEnumName {
|
|
14
14
|
VALUE_1,
|
|
15
15
|
VALUE2
|
|
16
16
|
}
|
|
17
17
|
`;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
const result = reflect(enumBody).typeMirror;
|
|
19
|
+
expect(result.type_name).toBe('enum');
|
|
20
|
+
expect(result.name).toBe('MyEnumName');
|
|
21
|
+
});
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
test('With doc comments', () => {
|
|
24
|
+
const enumBody = `
|
|
25
25
|
/**
|
|
26
26
|
* My enum description
|
|
27
27
|
*/
|
|
@@ -30,25 +30,25 @@ describe('Enum Reflection', () => {
|
|
|
30
30
|
VALUE2
|
|
31
31
|
}
|
|
32
32
|
`;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
const result = reflect(enumBody).typeMirror;
|
|
34
|
+
expect(result.docComment.description).toBe('My enum description');
|
|
35
|
+
});
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
test('Enums can have values', () => {
|
|
38
|
+
const enumBody = `
|
|
39
39
|
enum MyEnumName {
|
|
40
40
|
VALUE_1,
|
|
41
41
|
VALUE2
|
|
42
42
|
}
|
|
43
43
|
`;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
44
|
+
const result = reflect(enumBody).typeMirror as EnumMirror;
|
|
45
|
+
expect(result.values.length).toBe(2);
|
|
46
|
+
expect(result.values[0].name).toBe('VALUE_1');
|
|
47
|
+
expect(result.values[1].name).toBe('VALUE2');
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test('Enum values can have descriptions', () => {
|
|
51
|
+
const enumBody = `
|
|
52
52
|
enum MyEnumName {
|
|
53
53
|
/**
|
|
54
54
|
* Value 1 description
|
|
@@ -57,224 +57,224 @@ describe('Enum Reflection', () => {
|
|
|
57
57
|
VALUE2
|
|
58
58
|
}
|
|
59
59
|
`;
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
60
|
+
const result = reflect(enumBody).typeMirror as EnumMirror;
|
|
61
|
+
expect(result.values.length).toBe(2);
|
|
62
|
+
expect(result.values[0].docComment.description).toBe('Value 1 description');
|
|
63
|
+
});
|
|
64
64
|
});
|
|
65
65
|
|
|
66
66
|
describe('Interface Reflection', () => {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
67
|
+
test('Single line interface definition', () => {
|
|
68
|
+
const interfaceBody = 'interface MyInterface{}';
|
|
69
|
+
const result = reflect(interfaceBody).typeMirror;
|
|
70
|
+
expect(result.type_name).toBe('interface');
|
|
71
|
+
expect(result.name).toBe('MyInterface');
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test('When no access modifier is defined it is private', () => {
|
|
75
|
+
const interfaceBody = 'interface MyInterface{}';
|
|
76
|
+
const result = reflect(interfaceBody).typeMirror;
|
|
77
|
+
expect(result.access_modifier).toBe('private');
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
test('Can have access modifier', () => {
|
|
81
|
+
const interfaceBody = 'public interface MyInterface{}';
|
|
82
|
+
const result = reflect(interfaceBody).typeMirror;
|
|
83
|
+
expect(result.access_modifier).toBe('public');
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test('Can have a sharing modifier', () => {
|
|
87
|
+
const interfaceBody = 'public with sharing interface MyInterface{}';
|
|
88
|
+
const result = (reflect(interfaceBody).typeMirror) as InterfaceMirror;
|
|
89
|
+
expect(result.sharingModifier).toBe('withSharing');
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
test('Can have methods', () => {
|
|
93
|
+
const interfaceBody = `
|
|
94
94
|
public with sharing interface MyInterface{
|
|
95
95
|
void method1();
|
|
96
96
|
}
|
|
97
97
|
`;
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
98
|
+
const result = (reflect(interfaceBody).typeMirror) as InterfaceMirror;
|
|
99
|
+
expect(result.methods.length).toBe(1);
|
|
100
|
+
expect(result.methods[0].name).toBe('method1');
|
|
101
|
+
});
|
|
102
102
|
|
|
103
|
-
|
|
104
|
-
|
|
103
|
+
test('Can have extend other interfaces', () => {
|
|
104
|
+
const interfaceBody = `
|
|
105
105
|
public with sharing interface MyInterface extends Interface2 {
|
|
106
106
|
void method1();
|
|
107
107
|
}
|
|
108
108
|
`;
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
109
|
+
const result = (reflect(interfaceBody).typeMirror) as InterfaceMirror;
|
|
110
|
+
expect(result.extended_interfaces.length).toBe(1);
|
|
111
|
+
expect(result.extended_interfaces[0]).toBe('Interface2');
|
|
112
|
+
});
|
|
113
113
|
|
|
114
|
-
|
|
115
|
-
|
|
114
|
+
test('Can have annotations', () => {
|
|
115
|
+
const interfaceBody = `
|
|
116
116
|
@NamespaceAccessible
|
|
117
117
|
public with sharing interface MyInterface{
|
|
118
118
|
void method1();
|
|
119
119
|
}
|
|
120
120
|
`;
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
121
|
+
const result = (reflect(interfaceBody).typeMirror) as InterfaceMirror;
|
|
122
|
+
expect(result.annotations.length).toBe(1);
|
|
123
|
+
expect(result.annotations[0].name).toBe('namespaceaccessible');
|
|
124
|
+
});
|
|
125
125
|
|
|
126
|
-
|
|
127
|
-
|
|
126
|
+
test('Methods can have their own annotations', () => {
|
|
127
|
+
const interfaceBody = `
|
|
128
128
|
@NamespaceAccessible
|
|
129
129
|
public with sharing interface MyInterface{
|
|
130
130
|
@Deprecated
|
|
131
131
|
void method1();
|
|
132
132
|
}
|
|
133
133
|
`;
|
|
134
|
-
|
|
135
|
-
|
|
134
|
+
const result = (reflect(interfaceBody).typeMirror) as InterfaceMirror;
|
|
135
|
+
expect(result.methods[0].annotations.length).toBe(2);
|
|
136
136
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
137
|
+
const annotationNames = result.methods[0].annotations.map(a => a.name);
|
|
138
|
+
expect(annotationNames).toContain('namespaceaccessible');
|
|
139
|
+
expect(annotationNames).toContain('deprecated');
|
|
140
|
+
});
|
|
141
141
|
});
|
|
142
142
|
|
|
143
143
|
describe('Class reflection', () => {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
144
|
+
test('Single line class definition', () => {
|
|
145
|
+
const classBody = 'class MyClass{}';
|
|
146
|
+
const result = reflect(classBody).typeMirror;
|
|
147
|
+
expect(result.type_name).toBe('class');
|
|
148
|
+
expect(result.name).toBe('MyClass');
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
test('When no access modifier is defined it is private', () => {
|
|
152
|
+
const classBody = 'class MyClass{}';
|
|
153
|
+
const result = reflect(classBody).typeMirror;
|
|
154
|
+
expect(result.access_modifier).toBe('private');
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
test('Can have access modifier', () => {
|
|
158
|
+
const interfaceBody = 'public class MyClass{}';
|
|
159
|
+
const result = reflect(interfaceBody).typeMirror;
|
|
160
|
+
expect(result.access_modifier).toBe('public');
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
test('Can have a sharing modifier', () => {
|
|
164
|
+
const classBody = 'public with sharing class MyClass{}';
|
|
165
|
+
const result = (reflect(classBody)).typeMirror as ClassMirror;
|
|
166
|
+
expect(result.sharingModifier).toBe('withSharing');
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
test('Can have a class modifier', () => {
|
|
170
|
+
const classBody = 'public with sharing abstract class MyClass{}';
|
|
171
|
+
const result = (reflect(classBody)).typeMirror as ClassMirror;
|
|
172
|
+
expect(result.classModifier).toBe('abstract');
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
test('Can extend a class', () => {
|
|
176
|
+
const classBody = 'public with sharing class MyClass extends Class2 {}';
|
|
177
|
+
const result = (reflect(classBody)).typeMirror as ClassMirror;
|
|
178
|
+
expect(result.extended_class).toBe('Class2');
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
test('Can implement interfaces', () => {
|
|
182
|
+
const classBody = 'public with sharing class MyClass implements Interface1, Interface2 {}';
|
|
183
|
+
const result = (reflect(classBody)).typeMirror as ClassMirror;
|
|
184
|
+
expect(result.implemented_interfaces.length).toBe(2);
|
|
185
|
+
expect(result.implemented_interfaces[0]).toBe('Interface1');
|
|
186
|
+
expect(result.implemented_interfaces[1]).toBe('Interface2');
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
test('Can have properties', () => {
|
|
190
|
+
const classBody = `
|
|
191
191
|
public with sharing class MyClass {
|
|
192
192
|
public String Prop1 { get; set; }
|
|
193
193
|
public Integer Prop2 { get; set; }
|
|
194
194
|
}
|
|
195
195
|
`;
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
196
|
+
const result = (reflect(classBody)).typeMirror as ClassMirror;
|
|
197
|
+
expect(result.properties.length).toBe(2);
|
|
198
|
+
expect(result.properties[0].typeReference.type).toBe('String');
|
|
199
|
+
expect(result.properties[0].name).toBe('Prop1');
|
|
200
|
+
expect(result.properties[1].typeReference.type).toBe('Integer');
|
|
201
|
+
expect(result.properties[1].name).toBe('Prop2');
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
test('Can have fields', () => {
|
|
205
|
+
const classBody = `
|
|
206
206
|
public with sharing class MyClass {
|
|
207
207
|
private String var1, var2;
|
|
208
208
|
}
|
|
209
209
|
`;
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
210
|
+
const result = (reflect(classBody)).typeMirror as ClassMirror;
|
|
211
|
+
expect(result.fields.length).toBe(2);
|
|
212
|
+
expect(result.fields[0].typeReference.type).toBe('String');
|
|
213
|
+
expect(result.fields[1].typeReference.type).toBe('String');
|
|
214
|
+
expect(result.fields[0].name).toBe('var1');
|
|
215
|
+
expect(result.fields[1].name).toBe('var2');
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
test('Can have transient fields', () => {
|
|
219
|
+
const classBody = `
|
|
220
220
|
public with sharing class MyClass {
|
|
221
221
|
transient String var1;
|
|
222
222
|
}
|
|
223
223
|
`;
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
224
|
+
const result = (reflect(classBody)).typeMirror as ClassMirror;
|
|
225
|
+
expect(result.fields.length).toBe(1);
|
|
226
|
+
expect(result.fields[0].typeReference.type).toBe('String');
|
|
227
|
+
expect(result.fields[0].name).toBe('var1');
|
|
228
|
+
expect(result.fields[0].memberModifiers).toContain('transient');
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
test('Can have annotations with parameters', () => {
|
|
232
|
+
const classBody = `
|
|
233
233
|
@IsTest(SeeAllData=true)
|
|
234
234
|
/** Some docs */
|
|
235
235
|
public with sharing class MyClass {}
|
|
236
236
|
`;
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
237
|
+
const result = (reflect(classBody)).typeMirror as ClassMirror;
|
|
238
|
+
expect(result.annotations.length).toBe(1);
|
|
239
|
+
expect(result.annotations[0].elementValues.length).toBe(1);
|
|
240
|
+
expect(result.annotations[0].elementValues[0].key).toBe('SeeAllData');
|
|
241
|
+
expect(result.annotations[0].elementValues[0].value).toBe('true');
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
test('Can have annotations with parameters after the docs', () => {
|
|
245
|
+
const classBody = `
|
|
246
246
|
/**
|
|
247
247
|
* @description Account related operations.
|
|
248
248
|
*/
|
|
249
249
|
@RestResource(urlMapping='/Account/*')
|
|
250
250
|
global with sharing class SampleRestResource {}
|
|
251
251
|
`;
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
252
|
+
const result = (reflect(classBody)).typeMirror as ClassMirror;
|
|
253
|
+
expect(result.annotations.length).toBe(1);
|
|
254
|
+
expect(result.annotations[0].elementValues.length).toBe(1);
|
|
255
|
+
expect(result.annotations[0].elementValues[0].key).toBe('urlMapping');
|
|
256
|
+
expect(result.annotations[0].elementValues[0].value).toBe('\'/Account/*\'');
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
test('Can have constructors', () => {
|
|
260
|
+
const classBody = `
|
|
261
261
|
public with sharing class MyClass {
|
|
262
262
|
public MyClass() {}
|
|
263
263
|
public MyClass(String var1) {}
|
|
264
264
|
}
|
|
265
265
|
`;
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
266
|
+
const result = (reflect(classBody)).typeMirror as ClassMirror;
|
|
267
|
+
expect(result.constructors.length).toBe(2);
|
|
268
|
+
expect(result.constructors[0].parameters.length).toBe(0);
|
|
269
|
+
expect(result.constructors[0].access_modifier).toBe('public');
|
|
270
|
+
expect(result.constructors[1].parameters.length).toBe(1);
|
|
271
|
+
expect(result.constructors[1].parameters[0].name).toBe('var1');
|
|
272
|
+
expect(result.constructors[1].parameters[0].typeReference.type).toBe('String');
|
|
273
|
+
expect(result.constructors[1].access_modifier).toBe('public');
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
test('Can have methods', () => {
|
|
277
|
+
const classBody = `
|
|
278
278
|
public with sharing class MyClass {
|
|
279
279
|
public static String method1() {
|
|
280
280
|
return '';
|
|
@@ -283,58 +283,58 @@ describe('Class reflection', () => {
|
|
|
283
283
|
private void method2(){}
|
|
284
284
|
}
|
|
285
285
|
`;
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
286
|
+
const result = (reflect(classBody)).typeMirror as ClassMirror;
|
|
287
|
+
expect(result.methods.length).toBe(2);
|
|
288
|
+
expect(result.methods[0].memberModifiers.length).toBe(1);
|
|
289
|
+
expect(result.methods[0].memberModifiers[0]).toBe('static');
|
|
290
|
+
expect(result.methods[0].access_modifier).toBe('public');
|
|
291
|
+
expect(result.methods[0].typeReference.type).toBe('String');
|
|
292
|
+
expect(result.methods[0].name).toBe('method1');
|
|
293
|
+
|
|
294
|
+
expect(result.methods[1].memberModifiers.length).toBe(0);
|
|
295
|
+
expect(result.methods[1].access_modifier).toBe('private');
|
|
296
|
+
expect(result.methods[1].typeReference.type).toBe('void');
|
|
297
|
+
expect(result.methods[1].name).toBe('method2');
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
test('Can have virtual methods', () => {
|
|
301
|
+
const classBody = `
|
|
302
302
|
public with sharing class MyClass {
|
|
303
303
|
public virtual String method1() {
|
|
304
304
|
return null ?? '';
|
|
305
305
|
}
|
|
306
306
|
}
|
|
307
307
|
`;
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
308
|
+
const result = (reflect(classBody)).typeMirror as ClassMirror;
|
|
309
|
+
expect(result.methods[0].memberModifiers[0]).toBe('virtual');
|
|
310
|
+
});
|
|
311
311
|
|
|
312
|
-
|
|
313
|
-
|
|
312
|
+
test('Can have abstract methods', () => {
|
|
313
|
+
const classBody = `
|
|
314
314
|
public with sharing abstract class MyClass {
|
|
315
315
|
public abstract String method1() {
|
|
316
316
|
return null ?? '';
|
|
317
317
|
}
|
|
318
318
|
}
|
|
319
319
|
`;
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
320
|
+
const result = (reflect(classBody)).typeMirror as ClassMirror;
|
|
321
|
+
expect(result.methods[0].memberModifiers[0]).toBe('abstract');
|
|
322
|
+
});
|
|
323
323
|
|
|
324
|
-
|
|
325
|
-
|
|
324
|
+
test('Can have inner enums', () => {
|
|
325
|
+
const classBody = `
|
|
326
326
|
public with sharing class MyClass {
|
|
327
327
|
public enum MyEnum {}
|
|
328
328
|
}
|
|
329
329
|
`;
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
330
|
+
const result = (reflect(classBody)).typeMirror as ClassMirror;
|
|
331
|
+
expect(result.enums.length).toBe(1);
|
|
332
|
+
expect(result.enums[0].access_modifier).toBe('public');
|
|
333
|
+
expect(result.enums[0].name).toBe('MyEnum');
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
test('Can have inner interfaces', () => {
|
|
337
|
+
const classBody = `
|
|
338
338
|
public with sharing class MyClass {
|
|
339
339
|
public interface MyInterface {
|
|
340
340
|
void method1();
|
|
@@ -342,14 +342,14 @@ describe('Class reflection', () => {
|
|
|
342
342
|
}
|
|
343
343
|
}
|
|
344
344
|
`;
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
345
|
+
const result = (reflect(classBody)).typeMirror as ClassMirror;
|
|
346
|
+
expect(result.interfaces.length).toBe(1);
|
|
347
|
+
expect(result.interfaces[0].name).toBe('MyInterface');
|
|
348
|
+
expect(result.interfaces[0].methods.length).toBe(2);
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
test('Can have inner classes', () => {
|
|
352
|
+
const classBody = `
|
|
353
353
|
public with sharing class MyClass {
|
|
354
354
|
public class MyClass {
|
|
355
355
|
public void method1();
|
|
@@ -357,14 +357,14 @@ describe('Class reflection', () => {
|
|
|
357
357
|
}
|
|
358
358
|
}
|
|
359
359
|
`;
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
360
|
+
const result = (reflect(classBody)).typeMirror as ClassMirror;
|
|
361
|
+
expect(result.classes.length).toBe(1);
|
|
362
|
+
expect(result.classes[0].name).toBe('MyClass');
|
|
363
|
+
expect(result.classes[0].methods.length).toBe(2);
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
test('Can have members in groups', () => {
|
|
367
|
+
const classBody = `
|
|
368
368
|
public with sharing class MyClass {
|
|
369
369
|
/**
|
|
370
370
|
* @start-group Group Name
|
|
@@ -376,20 +376,20 @@ describe('Class reflection', () => {
|
|
|
376
376
|
}
|
|
377
377
|
`;
|
|
378
378
|
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
379
|
+
const result = (reflect(classBody)).typeMirror as ClassMirror;
|
|
380
|
+
expect(result.properties.length).toBe(2);
|
|
381
|
+
expect(result.properties[0].typeReference.type).toBe('String');
|
|
382
|
+
expect(result.properties[0].name).toBe('Prop1');
|
|
383
|
+
expect(result.properties[0].group).toBe('Group Name');
|
|
384
|
+
expect(result.properties[0].groupDescription).toBe('Group Description');
|
|
385
|
+
expect(result.properties[1].typeReference.type).toBe('Integer');
|
|
386
|
+
expect(result.properties[1].name).toBe('Prop2');
|
|
387
|
+
expect(result.properties[1].group).toBe('Group Name');
|
|
388
|
+
expect(result.properties[1].groupDescription).toBe('Group Description');
|
|
389
|
+
});
|
|
390
|
+
|
|
391
|
+
test('Supports block style apex docs', () => {
|
|
392
|
+
const classBody = `/**********************************************************
|
|
393
393
|
@description Uses a block style apex doc
|
|
394
394
|
@group Main
|
|
395
395
|
@test-class {@link SampleClass}
|
|
@@ -399,10 +399,28 @@ describe('Class reflection', () => {
|
|
|
399
399
|
}
|
|
400
400
|
`;
|
|
401
401
|
|
|
402
|
-
|
|
403
|
-
|
|
402
|
+
const result = reflect(classBody);
|
|
403
|
+
expect(result.error).toBeNull()
|
|
404
|
+
|
|
405
|
+
const typeResult = result.typeMirror as ClassMirror;
|
|
406
|
+
expect(typeResult.name).toBe('GroupedClass');
|
|
407
|
+
});
|
|
408
|
+
|
|
409
|
+
test('supports grouping', () => {
|
|
410
|
+
const classBody = `
|
|
411
|
+
public class MyClass {
|
|
412
|
+
public void myMethod() {
|
|
413
|
+
List<Object> groupedResults =
|
|
414
|
+
[SELECT LeadSource, Rating,
|
|
415
|
+
GROUPING(LeadSource) grpLS, GROUPING(Rating) grpRating,
|
|
416
|
+
COUNT(Name) cnt
|
|
417
|
+
FROM Lead
|
|
418
|
+
GROUP BY ROLLUP(LeadSource, Rating)];
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
`;
|
|
404
422
|
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
423
|
+
const result = reflect(classBody);
|
|
424
|
+
expect(result.error).toBeNull()
|
|
425
|
+
});
|
|
408
426
|
});
|