Skip to content

Commit 8b4ce01

Browse files
stereotype441Commit Queue
authored and
Commit Queue
committed
[sound flow analysis] Additional unit tests for patterns.
These unit tests exercise flow analysis behaviors for patterns that one might plausibly assume are part of the `sound-flow-analysis` feature, but actually have been present ever since the `patterns` feature was introduced. Adding these tests helps me be confident that the behavior of flow analysis after `sound-flow-analysis` has all of the soundness behaviors I expect; even though some of those behaviors aren't new. Bug: #60438 Change-Id: I77a269907c67d643d0ef23d4f76545e36761bbfc Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/421960 Reviewed-by: Chloe Stefantsova <cstefantsova@google.com> Commit-Queue: Paul Berry <paulberry@google.com>
1 parent 0768228 commit 8b4ce01

File tree

1 file changed

+139
-0
lines changed

1 file changed

+139
-0
lines changed

pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart

+139
Original file line numberDiff line numberDiff line change
@@ -11600,6 +11600,145 @@ main() {
1160011600
]);
1160111601
});
1160211602
});
11603+
11604+
group('Declared variable pattern with matching non-nullable types', () {
11605+
test('When enabled, guaranteed to match', () {
11606+
var x = Var('x');
11607+
h.run([
11608+
ifCase(expr('int'), x.pattern(type: 'int'), [
11609+
checkReachable(true),
11610+
], [
11611+
checkReachable(false),
11612+
])
11613+
]);
11614+
});
11615+
11616+
test('When disabled, guaranteed to match', () {
11617+
// Flow analysis has considered `int x` as guaranteed to match a value
11618+
// with static type `int` since patterns were added to the language
11619+
// (even though that was not technically guaranteed to be the case when
11620+
// running in unsound null safety mode).
11621+
h.disableSoundFlowAnalysis();
11622+
var x = Var('x');
11623+
h.run([
11624+
ifCase(expr('int'), x.pattern(type: 'int'), [
11625+
checkReachable(true),
11626+
], [
11627+
checkReachable(false),
11628+
])
11629+
]);
11630+
});
11631+
});
11632+
11633+
group('List pattern', () {
11634+
test('When enabled, guaranteed to match non-nullable list', () {
11635+
h.run([
11636+
ifCase(expr('List<int>'), listPattern([restPattern()]), [
11637+
checkReachable(true),
11638+
], [
11639+
checkReachable(false),
11640+
])
11641+
]);
11642+
});
11643+
11644+
test('When disabled, guaranteed to match non-nullable list', () {
11645+
// Flow analysis has considered a list pattern as guaranteed to match a
11646+
// value with static type `List` since patterns were added to the
11647+
// language (even though that was not technically guaranteed to be the
11648+
// case when running in unsound null safety mode).
11649+
h.disableSoundFlowAnalysis();
11650+
h.run([
11651+
ifCase(expr('List<int>'), listPattern([restPattern()]), [
11652+
checkReachable(true),
11653+
], [
11654+
checkReachable(false),
11655+
])
11656+
]);
11657+
});
11658+
});
11659+
11660+
group('Object pattern with matching non-nullable types', () {
11661+
test('When enabled, guaranteed to match', () {
11662+
h.run([
11663+
ifCase(expr('int'), objectPattern(requiredType: 'int', fields: []), [
11664+
checkReachable(true),
11665+
], [
11666+
checkReachable(false),
11667+
])
11668+
]);
11669+
});
11670+
11671+
test('When disabled, guaranteed to match', () {
11672+
// Flow analysis has considered an object pattern as guaranteed to match
11673+
// a value with a matching static type since patterns were added to the
11674+
// language (even though that was not technically guaranteed to be the
11675+
// case when running in unsound null safety mode).
11676+
h.disableSoundFlowAnalysis();
11677+
h.run([
11678+
ifCase(expr('int'), objectPattern(requiredType: 'int', fields: []), [
11679+
checkReachable(true),
11680+
], [
11681+
checkReachable(false),
11682+
])
11683+
]);
11684+
});
11685+
});
11686+
11687+
group('Record pattern with matching non-nullable type', () {
11688+
test('When enabled, guaranteed to match', () {
11689+
h.run([
11690+
ifCase(expr('(int,)'),
11691+
recordPattern([wildcard(type: 'int').recordField()]), [
11692+
checkReachable(true),
11693+
], [
11694+
checkReachable(false),
11695+
])
11696+
]);
11697+
});
11698+
11699+
test('When disabled, guaranteed to match', () {
11700+
// Flow analysis has considered a record pattern as guaranteed to match
11701+
// a value with a matching static type since patterns were added to the
11702+
// language (even though that was not technically guaranteed to be the
11703+
// case when running in unsound null safety mode).
11704+
h.disableSoundFlowAnalysis();
11705+
h.run([
11706+
ifCase(expr('(int,)'),
11707+
recordPattern([wildcard(type: 'int').recordField()]), [
11708+
checkReachable(true),
11709+
], [
11710+
checkReachable(false),
11711+
])
11712+
]);
11713+
});
11714+
});
11715+
11716+
group('Wildcard pattern with matching non-nullable types', () {
11717+
test('When enabled, guaranteed to match', () {
11718+
h.run([
11719+
ifCase(expr('int'), wildcard(type: 'int'), [
11720+
checkReachable(true),
11721+
], [
11722+
checkReachable(false),
11723+
])
11724+
]);
11725+
});
11726+
11727+
test('When disabled, guaranteed to match', () {
11728+
// Flow analysis has considered `int _` as guaranteed to match a value
11729+
// with static type `int` since patterns were added to the language
11730+
// (even though that was not technically guaranteed to be the case when
11731+
// running in unsound null safety mode).
11732+
h.disableSoundFlowAnalysis();
11733+
h.run([
11734+
ifCase(expr('int'), wildcard(type: 'int'), [
11735+
checkReachable(true),
11736+
], [
11737+
checkReachable(false),
11738+
])
11739+
]);
11740+
});
11741+
});
1160311742
});
1160411743
}
1160511744

0 commit comments

Comments
 (0)