@cparra/apex-reflection 2.12.1 → 2.13.0

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.
Files changed (3) hide show
  1. package/__tests__/end-to-end.test.ts +276 -258
  2. package/out.js +4995 -4897
  3. 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
- 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 = `
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
- const result = reflect(enumBody).typeMirror;
19
- expect(result.type_name).toBe('enum');
20
- expect(result.name).toBe('MyEnumName');
21
- });
18
+ const result = reflect(enumBody).typeMirror;
19
+ expect(result.type_name).toBe('enum');
20
+ expect(result.name).toBe('MyEnumName');
21
+ });
22
22
 
23
- test('With doc comments', () => {
24
- const enumBody = `
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
- const result = reflect(enumBody).typeMirror;
34
- expect(result.docComment.description).toBe('My enum description');
35
- });
33
+ const result = reflect(enumBody).typeMirror;
34
+ expect(result.docComment.description).toBe('My enum description');
35
+ });
36
36
 
37
- test('Enums can have values', () => {
38
- const enumBody = `
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
- 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 = `
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
- 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
- });
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
- 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 = `
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
- const result = (reflect(interfaceBody).typeMirror) as InterfaceMirror;
99
- expect(result.methods.length).toBe(1);
100
- expect(result.methods[0].name).toBe('method1');
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
- test('Can have extend other interfaces', () => {
104
- const interfaceBody = `
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
- const result = (reflect(interfaceBody).typeMirror) as InterfaceMirror;
110
- expect(result.extended_interfaces.length).toBe(1);
111
- expect(result.extended_interfaces[0]).toBe('Interface2');
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
- test('Can have annotations', () => {
115
- const interfaceBody = `
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
- const result = (reflect(interfaceBody).typeMirror) as InterfaceMirror;
122
- expect(result.annotations.length).toBe(1);
123
- expect(result.annotations[0].name).toBe('namespaceaccessible');
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
- test('Methods can have their own annotations', () => {
127
- const interfaceBody = `
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
- const result = (reflect(interfaceBody).typeMirror) as InterfaceMirror;
135
- expect(result.methods[0].annotations.length).toBe(2);
134
+ const result = (reflect(interfaceBody).typeMirror) as InterfaceMirror;
135
+ expect(result.methods[0].annotations.length).toBe(2);
136
136
 
137
- const annotationNames = result.methods[0].annotations.map(a => a.name);
138
- expect(annotationNames).toContain('namespaceaccessible');
139
- expect(annotationNames).toContain('deprecated');
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
- 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 = `
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
- 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 = `
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
- 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 = `
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
- 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 = `
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
- 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 = `
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
- 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 = `
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
- 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 = `
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
- 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 = `
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
- const result = (reflect(classBody)).typeMirror as ClassMirror;
309
- expect(result.methods[0].memberModifiers[0]).toBe('virtual');
310
- });
308
+ const result = (reflect(classBody)).typeMirror as ClassMirror;
309
+ expect(result.methods[0].memberModifiers[0]).toBe('virtual');
310
+ });
311
311
 
312
- test('Can have abstract methods', () => {
313
- const classBody = `
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
- const result = (reflect(classBody)).typeMirror as ClassMirror;
321
- expect(result.methods[0].memberModifiers[0]).toBe('abstract');
322
- });
320
+ const result = (reflect(classBody)).typeMirror as ClassMirror;
321
+ expect(result.methods[0].memberModifiers[0]).toBe('abstract');
322
+ });
323
323
 
324
- test('Can have inner enums', () => {
325
- const classBody = `
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
- 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 = `
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
- 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 = `
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
- 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 = `
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
- 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 = `/**********************************************************
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
- const result = reflect(classBody);
403
- expect(result.error).toBeNull()
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
- const typeResult = result.typeMirror as ClassMirror;
406
- expect(typeResult.name).toBe('GroupedClass');
407
- });
423
+ const result = reflect(classBody);
424
+ expect(result.error).toBeNull()
425
+ });
408
426
  });