@@ -42,7 +42,8 @@ void main() {
4242 group ('Experiments' , () {
4343 Library lateFinalWithoutInitializer,
4444 nnbdClassMemberDeclarations,
45- optOutOfNnbd;
45+ optOutOfNnbd,
46+ nullableElements;
4647 Class b;
4748
4849 setUpAll (() async {
@@ -55,6 +56,9 @@ void main() {
5556 optOutOfNnbd = (await utils.testPackageGraphExperiments)
5657 .libraries
5758 .firstWhere ((lib) => lib.name == 'opt_out_of_nnbd' );
59+ nullableElements = (await utils.testPackageGraphExperiments)
60+ .libraries
61+ .firstWhere ((lib) => lib.name == 'nullable_elements' );
5862 b = nnbdClassMemberDeclarations.allClasses
5963 .firstWhere ((c) => c.name == 'B' );
6064 });
@@ -142,6 +146,65 @@ void main() {
142146 expect (initializeMe.isLate, isTrue);
143147 expect (initializeMe.features, contains ('late' ));
144148 });
149+
150+ test ('Opt out of NNBD' , () {
151+ var notOptedIn = optOutOfNnbd.publicProperties
152+ .firstWhere ((v) => v.name == 'notOptedIn' );
153+ expect (notOptedIn.isNNBD, isFalse);
154+ expect (notOptedIn.modelType.nullabilitySuffix, isEmpty);
155+ });
156+
157+ test ('complex nullable elements are detected and rendered correctly' , () {
158+ var complexNullableMembers = nullableElements.allClasses
159+ .firstWhere ((c) => c.name == 'ComplexNullableMembers' );
160+ var aComplexType = complexNullableMembers.allFields
161+ .firstWhere ((f) => f.name == 'aComplexType' );
162+ var aComplexSetterOnlyType = complexNullableMembers.allFields
163+ .firstWhere ((f) => f.name == 'aComplexSetterOnlyType' );
164+ expect (complexNullableMembers.isNNBD, isTrue);
165+ expect (
166+ complexNullableMembers.nameWithGenerics,
167+ equals (
168+ 'ComplexNullableMembers<<wbr><span class=\" type-parameter\" >T extends String?</span>>' ));
169+ expect (
170+ aComplexType.linkedReturnType,
171+ equals (
172+ 'Map<span class="signature"><<wbr><span class="type-parameter">T?</span>, <span class="type-parameter">String?</span>></span>' ));
173+ expect (aComplexSetterOnlyType.linkedReturnType, equals (
174+ // TODO(jcollins-g): fix wrong span class for setter-only return type (#2226)
175+ '<span class="parameter" id="aComplexSetterOnlyType=-param-value"><span class="type-annotation">List<span class="signature"><<wbr><span class="type-parameter">Map<span class="signature"><<wbr><span class="type-parameter">T?</span>, <span class="type-parameter">String?</span>></span>?</span>></span></span></span><wbr>' ));
176+ });
177+
178+ test ('simple nullable elements are detected and rendered correctly' , () {
179+ var nullableMembers = nullableElements.allClasses
180+ .firstWhere ((c) => c.name == 'NullableMembers' );
181+ var initialized =
182+ nullableMembers.allFields.firstWhere ((f) => f.name == 'initialized' );
183+ var nullableField = nullableMembers.allFields
184+ .firstWhere ((f) => f.name == 'nullableField' );
185+ var methodWithNullables = nullableMembers.publicInstanceMethods
186+ .firstWhere ((f) => f.name == 'methodWithNullables' );
187+ var operatorStar = nullableMembers.publicInstanceOperators
188+ .firstWhere ((f) => f.name == 'operator *' );
189+ expect (nullableMembers.isNNBD, isTrue);
190+ expect (
191+ nullableField.linkedReturnType,
192+ equals (
193+ 'Iterable<span class=\" signature\" ><<wbr><span class=\" type-parameter\" >BigInt</span>></span>?' ));
194+ expect (
195+ methodWithNullables.linkedParams,
196+ equals (
197+ '<span class="parameter" id="methodWithNullables-param-foo"><span class="type-annotation">String?</span> <span class="parameter-name">foo</span></span><wbr>' ));
198+ expect (methodWithNullables.linkedReturnType, equals ('int?' ));
199+ expect (
200+ initialized.linkedReturnType,
201+ equals (
202+ 'Map<span class="signature"><<wbr><span class="type-parameter">String</span>, <span class="type-parameter">Map</span>></span>?' ));
203+ expect (
204+ operatorStar.linkedParams,
205+ equals (
206+ '<span class="parameter" id="*-param-nullableOther"><span class="type-annotation"><a href="%%__HTMLBASE_dartdoc_internal__%%nullable_elements/NullableMembers-class.html">NullableMembers</a>?</span> <span class="parameter-name">nullableOther</span></span><wbr>' ));
207+ });
145208 },
146209 skip: (! _nnbdExperimentAllowed.allows (_platformVersion) &&
147210 ! _platformVersionString.contains ('edge' )));
0 commit comments