@@ -8,10 +8,10 @@ library json_serializable.test.json_generator_test;
8
8
import 'dart:async' ;
9
9
10
10
import 'package:analyzer/dart/ast/ast.dart' ;
11
- import 'package:analyzer/dart/element/element.dart' ;
12
11
import 'package:analyzer/src/string_source.dart' ;
13
12
import 'package:json_serializable/json_serializable.dart' ;
14
13
import 'package:path/path.dart' as p;
14
+ import 'package:source_gen/source_gen.dart' ;
15
15
import 'package:test/test.dart' ;
16
16
17
17
import 'analysis_utils.dart' ;
@@ -21,42 +21,35 @@ import 'test_utils.dart';
21
21
void main () {
22
22
group ('non-classes' , () {
23
23
test ('const field' , () async {
24
- var element = await _getClassForCodeString ('theAnswer' );
25
-
26
24
expect (
27
- _generator. generate (element, null ),
25
+ _runForElementNamed ( 'theAnswer' ),
28
26
throwsInvalidGenerationSourceError (
29
27
'Generator cannot target `const dynamic theAnswer`.' ,
30
28
'Remove the JsonSerializable annotation from `const dynamic theAnswer`.' ));
29
+ // TODO: validate the properties on the thrown error
31
30
});
32
31
33
32
test ('method' , () async {
34
- var element = await _getClassForCodeString ('annotatedMethod' );
35
-
36
33
expect (
37
- _generator. generate (element, null ),
34
+ _runForElementNamed ( 'annotatedMethod' ),
38
35
throwsInvalidGenerationSourceError (
39
36
'Generator cannot target `annotatedMethod`.' ,
40
37
'Remove the JsonSerializable annotation from `annotatedMethod`.' ));
38
+ // TODO: validate the properties on the thrown error
41
39
});
42
40
});
43
-
44
41
group ('unknown types' , () {
45
42
test ('in constructor arguments' , () async {
46
- var element = await _getClassForCodeString ('UnknownCtorParamType' );
47
-
48
43
expect (
49
- _generator. generate (element, null ),
44
+ _runForElementNamed ( 'UnknownCtorParamType' ),
50
45
throwsInvalidGenerationSourceError (
51
46
'At least one constructor argument has an invalid type: `number`.' ,
52
47
'Check names and imports.' ));
53
48
});
54
49
55
50
test ('in fields' , () async {
56
- var element = await _getClassForCodeString ('UnknownFieldType' );
57
-
58
51
expect (
59
- _generator. generate (element, null ),
52
+ _runForElementNamed ( 'UnknownFieldType' ),
60
53
throwsInvalidGenerationSourceError (
61
54
'At least one field has an invalid type: `number`.' ,
62
55
'Check names and imports.' ));
@@ -65,63 +58,46 @@ void main() {
65
58
66
59
group ('unserializable types' , () {
67
60
test ('for toJson' , () async {
68
- var element = await _getClassForCodeString ('NoSerializeFieldType' );
69
-
70
61
expect (
71
- _generator. generate (element, null ),
62
+ _runForElementNamed ( 'NoSerializeFieldType' ),
72
63
throwsInvalidGenerationSourceError (
73
64
'Could not generate `toJson` code for `Stopwatch watch`.' ,
74
65
'Make sure all of the types are serializable.' ));
75
66
});
76
67
77
68
test ('for fromJson' , () async {
78
- var element = await _getClassForCodeString ('NoDeserializeFieldType' );
79
-
80
69
expect (
81
- _generator. generate (element, null ),
70
+ _runForElementNamed ( 'NoDeserializeFieldType' ),
82
71
throwsInvalidGenerationSourceError (
83
72
'Could not generate fromJson code for `Stopwatch watch`.' ,
84
73
'Make sure all of the types are serializable.' ));
85
74
});
86
75
87
76
test ('for toJson in Map key' , () async {
88
- var element = await _getClassForCodeString ('NoSerializeBadKey' );
89
-
90
77
expect (
91
- _generator. generate (element, null ),
78
+ _runForElementNamed ( 'NoSerializeBadKey' ),
92
79
throwsInvalidGenerationSourceError (
93
80
'Could not generate `toJson` code for `Map<int, DateTime> intDateTimeMap`.' ,
94
81
'Make sure all of the types are serializable.' ));
95
82
});
96
83
97
84
test ('for fromJson' , () async {
98
- var element = await _getClassForCodeString ('NoDeserializeBadKey' );
99
-
100
85
expect (
101
- _generator. generate (element, null ),
86
+ _runForElementNamed ( 'NoDeserializeBadKey' ),
102
87
throwsInvalidGenerationSourceError (
103
88
'Could not generate fromJson code for `Map<int, DateTime> intDateTimeMap`.' ,
104
89
'Make sure all of the types are serializable.' ));
105
90
});
106
91
});
107
92
108
93
test ('class with final fields' , () async {
109
- var element = await _getClassForCodeString ('FinalFields' );
110
- var generateResult = await _generator.generate (element, null );
94
+ var generateResult = await _runForElementNamed ('FinalFields' );
111
95
expect (generateResult, contains ("Map<String, dynamic> toJson()" ));
112
96
});
113
97
114
- test ('unannotated classes no-op' , () async {
115
- var element = await _getClassForCodeString ('NoAnnotation' );
116
- var output = _generator.generate (element, null );
117
-
118
- expect (output, isNull);
119
- });
120
-
121
98
group ('valid inputs' , () {
122
99
test ('class with no fields' , () async {
123
- var element = await _getClassForCodeString ('Person' );
124
- var output = await _generator.generate (element, null );
100
+ var output = await _runForElementNamed ('Person' );
125
101
126
102
expect (output, isNotNull);
127
103
@@ -130,50 +106,42 @@ void main() {
130
106
});
131
107
132
108
test ('class with ctor params' , () async {
133
- var element = await _getClassForCodeString ('Order' );
134
- var output = await _generator.generate (element, null );
135
-
109
+ var output = await _runForElementNamed ('Order' );
136
110
expect (output, isNotNull);
137
111
138
112
// TODO: test the actual output
139
113
// print(output);
140
114
});
141
115
142
116
test ('class with child json-able object' , () async {
143
- var element = await _getClassForCodeString ('ParentObject' );
144
- var output = await _generator.generate (element, null );
117
+ var output = await _runForElementNamed ('ParentObject' );
145
118
146
119
expect (output, contains ('new ChildObject.fromJson' ));
147
120
});
148
121
149
122
test ('class with child list of json-able objects' , () async {
150
- var element = await _getClassForCodeString ('ParentObjectWithChildren' );
151
- var output = await _generator.generate (element, null );
123
+ var output = await _runForElementNamed ('ParentObjectWithChildren' );
152
124
153
125
expect (output, contains ('.toList()' ));
154
126
expect (output, contains ('new ChildObject.fromJson' ));
155
127
});
156
128
157
129
test ('class with child list of dynamic objects is left alone' , () async {
158
- var element =
159
- await _getClassForCodeString ('ParentObjectWithDynamicChildren' );
160
- var output = await _generator.generate (element, null );
130
+ var output = await _runForElementNamed ('ParentObjectWithDynamicChildren' );
161
131
162
132
expect (output, contains ('children = json[\' children\' ] as List;' ));
163
133
});
164
134
165
135
test ('class with list of int is cast for strong mode' , () async {
166
- var element = await _getClassForCodeString ('Person' );
167
- var output = await _generator.generate (element, null );
136
+ var output = await _runForElementNamed ('Person' );
168
137
169
138
expect (output,
170
139
contains ("json['listOfInts'] as List)?.map((v0) => v0 as int)" ));
171
140
});
172
141
});
173
142
174
143
test ('reads JsonKey annotations' , () async {
175
- var element = await _getClassForCodeString ('Person' );
176
- var output = await _generator.generate (element, null );
144
+ var output = await _runForElementNamed ('Person' );
177
145
178
146
expect (output, contains ("'h': height," ));
179
147
expect (output, contains ("..height = json['h']" ));
@@ -182,13 +150,15 @@ void main() {
182
150
183
151
const _generator = const JsonSerializableGenerator ();
184
152
185
- Future <Element > _getClassForCodeString (String name) async {
153
+ Future <String > _runForElementNamed (String name) async {
186
154
if (_compUnit == null ) {
187
155
_compUnit = await _getCompilationUnitForString (getPackagePath ());
188
156
}
189
-
190
- return getElementsFromLibraryElement (_compUnit.element.library)
191
- .singleWhere ((e) => e.name == name);
157
+ var library = new LibraryReader (_compUnit.element.library);
158
+ var element = library.allElements.singleWhere ((e) => e.name == name);
159
+ var annotation = _generator.typeChecker.firstAnnotationOf (element);
160
+ return _generator.generateForAnnotatedElement (
161
+ element, new ConstantReader (annotation), null );
192
162
}
193
163
194
164
Future <CompilationUnit > _getCompilationUnitForString (String projectPath) async {
@@ -234,9 +204,6 @@ class Order {
234
204
Order(this.height, String firstName, [this.lastName]);
235
205
}
236
206
237
- class NoAnnotation {
238
- }
239
-
240
207
@JsonSerializable()
241
208
class FinalFields {
242
209
final int a;
0 commit comments