Skip to content

Commit cab6931

Browse files
authored
Move NNBD out of experiments (#2557)
1 parent 59166fd commit cab6931

7 files changed

+188
-213
lines changed

test/end2end/model_special_cases_test.dart

Lines changed: 2 additions & 212 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,10 @@ import 'package:dartdoc/src/model/model.dart';
1616
import 'package:dartdoc/src/package_config_provider.dart';
1717
import 'package:dartdoc/src/package_meta.dart';
1818
import 'package:dartdoc/src/special_elements.dart';
19-
import 'package:pub_semver/pub_semver.dart';
2019
import 'package:test/test.dart';
2120

2221
import '../src/utils.dart' as utils;
2322

24-
final String _platformVersionString = Platform.version.split(' ').first;
25-
final Version _platformVersion = Version.parse(_platformVersionString);
26-
27-
final _testPackageGraphExperimentsMemo = AsyncMemoizer<PackageGraph>();
28-
Future<PackageGraph> get _testPackageGraphExperiments =>
29-
_testPackageGraphExperimentsMemo.runOnce(() => utils.bootBasicPackage(
30-
'testing/test_package_experiments',
31-
pubPackageMetaProvider,
32-
PhysicalPackageConfigProvider(),
33-
additionalArguments: [
34-
'--enable-experiment',
35-
'non-nullable',
36-
'--no-link-to-remote'
37-
]));
38-
3923
final _testPackageGraphGinormousMemo = AsyncMemoizer<PackageGraph>();
4024
Future<PackageGraph> get _testPackageGraphGinormous =>
4125
_testPackageGraphGinormousMemo.runOnce(() => utils.bootBasicPackage(
@@ -74,205 +58,11 @@ void main() {
7458
exit(1);
7559
}
7660

77-
// This doesn't have the `max` because Null safety is supposed to work after
78-
// this version, and if the `max` is placed here we'll silently pass 2.10
79-
// stable if we haven't figured out how to switch on Null safety outside of
80-
// dev builds as specified in #2148.
81-
final _nullSafetyExperimentAllowed =
82-
VersionRange(min: Version.parse('2.9.0-9.0.dev'), includeMin: true);
83-
8461
// Experimental features not yet enabled by default. Move tests out of this
8562
// block when the feature is enabled by default.
8663
group('Experiments', () {
87-
Library lateFinalWithoutInitializer,
88-
nullSafetyClassMemberDeclarations,
89-
optOutOfNullSafety,
90-
nullableElements;
91-
Class b;
92-
Class c;
93-
94-
setUpAll(() async {
95-
lateFinalWithoutInitializer = (await _testPackageGraphExperiments)
96-
.libraries
97-
.firstWhere((lib) => lib.name == 'late_final_without_initializer');
98-
nullSafetyClassMemberDeclarations = (await _testPackageGraphExperiments)
99-
.libraries
100-
.firstWhere((lib) => lib.name == 'nnbd_class_member_declarations');
101-
optOutOfNullSafety = (await _testPackageGraphExperiments)
102-
.libraries
103-
.firstWhere((lib) => lib.name == 'opt_out_of_nnbd');
104-
nullableElements = (await _testPackageGraphExperiments)
105-
.libraries
106-
.firstWhere((lib) => lib.name == 'nullable_elements');
107-
b = nullSafetyClassMemberDeclarations.allClasses
108-
.firstWhere((c) => c.name == 'B');
109-
c = nullSafetyClassMemberDeclarations.allClasses
110-
.firstWhere((c) => c.name == 'C');
111-
});
112-
113-
test('isNullSafety is set correctly for libraries', () {
114-
expect(lateFinalWithoutInitializer.isNullSafety, isTrue);
115-
expect(optOutOfNullSafety.isNullSafety, isFalse);
116-
});
117-
118-
test('method parameters with required', () {
119-
var m1 = b.instanceMethods.firstWhere((m) => m.name == 'm1');
120-
var p1 = m1.allParameters.firstWhere((p) => p.name == 'p1');
121-
var p2 = m1.allParameters.firstWhere((p) => p.name == 'p2');
122-
expect(p1.isRequiredNamed, isTrue);
123-
expect(p2.isRequiredNamed, isFalse);
124-
expect(p2.isNamed, isTrue);
125-
126-
expect(
127-
m1.linkedParamsLines,
128-
equals(
129-
'<ol class="parameter-list"><li><span class="parameter" id="m1-param-some"><span class="type-annotation">int</span> <span class="parameter-name">some</span>, </span></li>\n'
130-
'<li><span class="parameter" id="m1-param-regular"><span class="type-annotation">dynamic</span> <span class="parameter-name">regular</span>, </span></li>\n'
131-
'<li><span class="parameter" id="m1-param-parameters"><span>covariant</span> <span class="type-annotation">dynamic</span> <span class="parameter-name">parameters</span>, </span></li>\n'
132-
'<li><span class="parameter" id="m1-param-p1">{<span>required</span> <span class="type-annotation">dynamic</span> <span class="parameter-name">p1</span>, </span></li>\n'
133-
'<li><span class="parameter" id="m1-param-p2"><span class="type-annotation">int</span> <span class="parameter-name">p2</span> = <span class="default-value">3</span>, </span></li>\n'
134-
'<li><span class="parameter" id="m1-param-p3"><span>required</span> <span>covariant</span> <span class="type-annotation">dynamic</span> <span class="parameter-name">p3</span>, </span></li>\n'
135-
'<li><span class="parameter" id="m1-param-p4"><span>required</span> <span>covariant</span> <span class="type-annotation">int</span> <span class="parameter-name">p4</span>}</span></li>\n'
136-
'</ol>'));
137-
});
138-
139-
test('verify no regression on ordinary optionals', () {
140-
var m2 = b.instanceMethods.firstWhere((m) => m.name == 'm2');
141-
var sometimes = m2.allParameters.firstWhere((p) => p.name == 'sometimes');
142-
var optionals = m2.allParameters.firstWhere((p) => p.name == 'optionals');
143-
expect(sometimes.isRequiredNamed, isFalse);
144-
expect(sometimes.isRequiredPositional, isTrue);
145-
expect(sometimes.isOptionalPositional, isFalse);
146-
expect(optionals.isRequiredNamed, isFalse);
147-
expect(optionals.isRequiredPositional, isFalse);
148-
expect(optionals.isOptionalPositional, isTrue);
149-
150-
expect(
151-
m2.linkedParamsLines,
152-
equals(
153-
'<ol class="parameter-list"><li><span class="parameter" id="m2-param-sometimes"><span class="type-annotation">int</span> <span class="parameter-name">sometimes</span>, </span></li>\n'
154-
'<li><span class="parameter" id="m2-param-we"><span class="type-annotation">dynamic</span> <span class="parameter-name">we</span>, </span></li>\n'
155-
'<li><span class="parameter" id="m2-param-have">[<span class="type-annotation">String</span> <span class="parameter-name">have</span>, </span></li>\n'
156-
'<li><span class="parameter" id="m2-param-optionals"><span class="type-annotation">double</span> <span class="parameter-name">optionals</span>]</span></li>\n'
157-
'</ol>'));
158-
});
159-
160-
test('anonymous callback parameters are correctly marked as nullable', () {
161-
var m3 = c.instanceMethods.firstWhere((m) => m.name == 'm3');
162-
var listen = m3.allParameters.firstWhere((p) => p.name == 'listen');
163-
var onDone = m3.allParameters.firstWhere((p) => p.name == 'onDone');
164-
expect(listen.isRequiredPositional, isTrue);
165-
expect(onDone.isNamed, isTrue);
166-
167-
expect(
168-
m3.linkedParamsLines,
169-
equals(
170-
'<ol class="parameter-list"><li><span class="parameter" id="m3-param-listen"><span class="type-annotation">void</span> <span class="parameter-name">listen</span>(<ol class="parameter-list"><li><span class="parameter" id="param-t"><span class="type-annotation">int</span> <span class="parameter-name">t</span></span></li>\n'
171-
'</ol>\n'
172-
')?, </span></li>\n'
173-
'<li><span class="parameter" id="m3-param-onDone">{<span class="type-annotation">void</span> <span class="parameter-name">onDone</span>(<ol class="parameter-list"></ol>\n'
174-
')?}</span></li>\n'
175-
'</ol>'));
176-
});
177-
178-
test('Late final class member test', () {
179-
var c = lateFinalWithoutInitializer.allClasses
180-
.firstWhere((c) => c.name == 'C');
181-
var a = c.instanceFields.firstWhere((f) => f.name == 'a');
182-
var b = c.instanceFields.firstWhere((f) => f.name == 'b');
183-
var cField = c.instanceFields.firstWhere((f) => f.name == 'cField');
184-
var dField = c.instanceFields.firstWhere((f) => f.name == 'dField');
185-
186-
// If Null safety isn't enabled, fields named 'late' come back from the
187-
// analyzer instead of setting up 'isLate'.
188-
expect(c.instanceFields.any((f) => f.name == 'late'), isFalse);
189-
190-
expect(a.modelType.returnType.name, equals('dynamic'));
191-
expect(a.isLate, isTrue);
192-
expect(a.features, contains('late'));
193-
194-
expect(b.modelType.returnType.name, equals('int'));
195-
expect(b.isLate, isTrue);
196-
expect(b.features, contains('late'));
197-
198-
expect(cField.modelType.returnType.name, equals('dynamic'));
199-
expect(cField.isLate, isTrue);
200-
expect(cField.features, contains('late'));
201-
202-
expect(dField.modelType.returnType.name, equals('double'));
203-
expect(dField.isLate, isTrue);
204-
expect(dField.features, contains('late'));
205-
});
206-
207-
test('Late final top level variables', () {
208-
var initializeMe = lateFinalWithoutInitializer.publicProperties
209-
.firstWhere((v) => v.name == 'initializeMe');
210-
expect(initializeMe.modelType.returnType.name, equals('String'));
211-
expect(initializeMe.isLate, isTrue);
212-
expect(initializeMe.features, contains('late'));
213-
});
214-
215-
test('Opt out of Null safety', () {
216-
var notOptedIn = optOutOfNullSafety.publicProperties
217-
.firstWhere((v) => v.name == 'notOptedIn');
218-
expect(notOptedIn.isNullSafety, isFalse);
219-
expect(notOptedIn.modelType.nullabilitySuffix, isEmpty);
220-
});
221-
222-
test('complex nullable elements are detected and rendered correctly', () {
223-
var complexNullableMembers = nullableElements.allClasses
224-
.firstWhere((c) => c.name == 'ComplexNullableMembers');
225-
var aComplexType = complexNullableMembers.allFields
226-
.firstWhere((f) => f.name == 'aComplexType');
227-
var aComplexSetterOnlyType = complexNullableMembers.allFields
228-
.firstWhere((f) => f.name == 'aComplexSetterOnlyType');
229-
expect(complexNullableMembers.isNullSafety, isTrue);
230-
expect(
231-
complexNullableMembers.nameWithGenerics,
232-
equals(
233-
'ComplexNullableMembers&lt;<wbr><span class=\"type-parameter\">T extends String?</span>&gt;'));
234-
expect(
235-
aComplexType.linkedReturnType,
236-
equals(
237-
'Map<span class="signature">&lt;<wbr><span class="type-parameter">T?</span>, <span class="type-parameter">String?</span>&gt;</span>'));
238-
expect(aComplexSetterOnlyType.linkedReturnType, equals(
239-
// TODO(jcollins-g): fix wrong span class for setter-only return type (#2226)
240-
'<span class="parameter" id="aComplexSetterOnlyType=-param-value"><span class="type-annotation">List<span class="signature">&lt;<wbr><span class="type-parameter">Map<span class="signature">&lt;<wbr><span class="type-parameter">T?</span>, <span class="type-parameter">String?</span>&gt;</span>?</span>&gt;</span></span></span>'));
241-
});
242-
243-
test('simple nullable elements are detected and rendered correctly', () {
244-
var nullableMembers = nullableElements.allClasses
245-
.firstWhere((c) => c.name == 'NullableMembers');
246-
var initialized =
247-
nullableMembers.allFields.firstWhere((f) => f.name == 'initialized');
248-
var nullableField = nullableMembers.allFields
249-
.firstWhere((f) => f.name == 'nullableField');
250-
var methodWithNullables = nullableMembers.publicInstanceMethods
251-
.firstWhere((f) => f.name == 'methodWithNullables');
252-
var operatorStar = nullableMembers.publicInstanceOperators
253-
.firstWhere((f) => f.name == 'operator *');
254-
expect(nullableMembers.isNullSafety, isTrue);
255-
expect(
256-
nullableField.linkedReturnType,
257-
equals(
258-
'Iterable<span class=\"signature\">&lt;<wbr><span class=\"type-parameter\">BigInt</span>&gt;</span>?'));
259-
expect(
260-
methodWithNullables.linkedParams,
261-
equals(
262-
'<span class="parameter" id="methodWithNullables-param-foo"><span class="type-annotation">String?</span> <span class="parameter-name">foo</span></span>'));
263-
expect(methodWithNullables.linkedReturnType, equals('int?'));
264-
expect(
265-
initialized.linkedReturnType,
266-
equals(
267-
'Map<span class="signature">&lt;<wbr><span class="type-parameter">String</span>, <span class="type-parameter">Map</span>&gt;</span>?'));
268-
expect(
269-
operatorStar.linkedParams,
270-
equals(
271-
'<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>'));
272-
});
273-
},
274-
skip: (!_nullSafetyExperimentAllowed.allows(_platformVersion) &&
275-
!_platformVersionString.contains('edge')));
64+
setUpAll(() async {});
65+
});
27666

27767
group('HTML Injection when allowed', () {
27868
Class htmlInjection;

0 commit comments

Comments
 (0)