blob: c40fd367a65e22f4e5c85044c70a7f323e2632ab [file] [log] [blame]
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../../../../client/completion_driver_test.dart';
void main() {
defineReflectiveSuite(() {
defineReflectiveTests(CaseClauseTest);
});
}
@reflectiveTest
class CaseClauseTest extends AbstractCompletionDriverTest
with CaseClauseTestCases {}
mixin CaseClauseTestCases on AbstractCompletionDriverTest {
Future<void> test_afterCase_inIfElement() async {
await computeSuggestions('''
var v = [ if (o case ^) ];
''');
assertResponse(r'''
suggestions
const
kind: keyword
false
kind: keyword
final
kind: keyword
null
kind: keyword
true
kind: keyword
var
kind: keyword
''');
}
Future<void> test_afterCase_inIfStatement() async {
await computeSuggestions('''
void f(Object o) {
if (o case ^) {}
}
''');
assertResponse(r'''
suggestions
const
kind: keyword
false
kind: keyword
final
kind: keyword
null
kind: keyword
true
kind: keyword
var
kind: keyword
''');
}
Future<void> test_afterCase_nameX_includeClass_imported() async {
newFile('$testPackageLibPath/a.dart', r'''
class A01 {}
class A02 {}
class B01 {}
''');
await computeSuggestions('''
import 'a.dart';
void f(Object? x) {
if (x case A0^) {}
}
''');
assertResponse(r'''
replacement
left: 2
suggestions
A01
kind: class
A01
kind: constructorInvocation
A02
kind: class
A02
kind: constructorInvocation
''');
}
Future<void> test_afterCase_nameX_includeClass_local() async {
await computeSuggestions('''
void f(Object? x) {
if (x case A0^) {}
}
class A01 {}
class A02 {}
class B01 {}
''');
assertResponse(r'''
replacement
left: 2
suggestions
A01
kind: class
A01
kind: constructorInvocation
A02
kind: class
A02
kind: constructorInvocation
''');
}
Future<void> test_afterCase_nameX_includeClass_notImported() async {
newFile('$testPackageLibPath/a.dart', r'''
class A01 {}
class A02 {}
class B01 {}
''');
await computeSuggestions('''
void f(Object? x) {
if (x case A0^) {}
}
''');
// TODO(scheglov): this is wrong, include only const constructors.
assertResponse(r'''
replacement
left: 2
suggestions
A01
kind: class
A01
kind: constructorInvocation
A02
kind: class
A02
kind: constructorInvocation
''');
}
Future<void> test_afterCase_typeName_nameX() async {
allowedIdentifiers = {'myValue', 'value'};
await computeSuggestions('''
class MyValue {}
void f(Object? x) {
if (x case MyValue v^) {}
}
''');
assertResponse(r'''
replacement
left: 1
suggestions
value
kind: identifier
''');
}
Future<void> test_afterCase_typeName_x() async {
allowedIdentifiers = {'myValue', 'value'};
await computeSuggestions('''
class MyValue {}
void f(Object? x) {
if (x case MyValue ^) {}
}
''');
assertResponse(r'''
suggestions
myValue
kind: identifier
value
kind: identifier
when
kind: keyword
''');
}
Future<void> test_afterCaseClause_inIfElement() async {
await computeSuggestions('''
var v = [ if (o case != '' ^) ];
''');
assertResponse(r'''
suggestions
when
kind: keyword
''');
}
@FailingTest(reason: "We're proposing 'when' but shouldn't be")
Future<void> test_afterCaseClause_inIfStatement_beforeExpression1() async {
// The `true` isn't in the `IfStatement`, but we don't catch that case.
await computeSuggestions('''
void f(Object o) {
if (o case != '' ^ true) {}
}
''');
assertResponse(r'''
suggestions
''');
}
Future<void> test_afterCaseClause_inIfStatement_beforeExpression2() async {
await computeSuggestions('''
void f(Object o) {
if (o case != '' ^ o.length > 3) {}
}
''');
assertResponse(r'''
suggestions
when
kind: keyword
''');
}
Future<void> test_afterCaseClause_inIfStatement_beforeParen() async {
await computeSuggestions('''
void f(Object o) {
if (o case != '' ^) {}
}
''');
assertResponse(r'''
suggestions
when
kind: keyword
''');
}
Future<void> test_afterColon_beforeRightBrace_inFunction() async {
await computeSuggestions('''
void f() {switch(1) {case 1:^}}
''');
assertResponse(r'''
suggestions
return
kind: keyword
if
kind: keyword
final
kind: keyword
for
kind: keyword
throw
kind: keyword
assert
kind: keyword
break
kind: keyword
case
kind: keyword
const
kind: keyword
default:
kind: keyword
do
kind: keyword
dynamic
kind: keyword
false
kind: keyword
late
kind: keyword
null
kind: keyword
switch
kind: keyword
true
kind: keyword
try
kind: keyword
var
kind: keyword
void
kind: keyword
while
kind: keyword
''');
}
Future<void> test_afterColon_beforeRightBrace_inFunction_partial() async {
await computeSuggestions('''
foo() {switch(1) {case 1: b^}}
''');
assertResponse(r'''
replacement
left: 1
suggestions
break
kind: keyword
''');
}
Future<void>
test_afterColon_beforeRightBrace_inFunction_partial_language219() async {
await computeSuggestions('''
// @dart=2.19
foo() {switch(1) {case 1: b^}}
''');
assertResponse(r'''
replacement
left: 1
suggestions
break
kind: keyword
''');
}
Future<void> test_afterColon_beforeRightBrace_inMethod() async {
await computeSuggestions('''
class A{foo() {switch(1) {case 1:^}}}
''');
assertResponse(r'''
suggestions
return
kind: keyword
if
kind: keyword
final
kind: keyword
for
kind: keyword
throw
kind: keyword
assert
kind: keyword
break
kind: keyword
case
kind: keyword
const
kind: keyword
default:
kind: keyword
do
kind: keyword
dynamic
kind: keyword
false
kind: keyword
late
kind: keyword
null
kind: keyword
super
kind: keyword
switch
kind: keyword
this
kind: keyword
true
kind: keyword
try
kind: keyword
var
kind: keyword
void
kind: keyword
while
kind: keyword
''');
}
Future<void> test_afterColon_beforeRightBrace_inMethod_partial() async {
await computeSuggestions('''
class A{foo() {switch(1) {case 1: b^}}}
''');
assertResponse(r'''
replacement
left: 1
suggestions
break
kind: keyword
''');
}
Future<void>
test_afterColon_beforeRightBrace_inMethod_partial_language219() async {
await computeSuggestions('''
// @dart=2.19
class A{foo() {switch(1) {case 1: b^}}}
''');
assertResponse(r'''
replacement
left: 1
suggestions
break
kind: keyword
''');
}
Future<void> test_afterWhen_inIfElement() async {
await computeSuggestions('''
var v = [ if (o case != '' when true ^) ];
''');
assertResponse(r'''
suggestions
''');
}
Future<void> test_afterWhen_inIfStatement() async {
await computeSuggestions('''
void f(Object o) {
if (o case != '' when true ^) {}
}
''');
assertResponse(r'''
suggestions
''');
}
Future<void> test_case_final_x_name() async {
await computeSuggestions('''
void f(Object? x) {
if (x case final ^ y) {}
}
class A01 {}
class A02 {}
class B01 {}
''');
assertResponse(r'''
suggestions
A01
kind: class
A02
kind: class
B01
kind: class
''');
}
Future<void> test_case_nothing_x_name() async {
await computeSuggestions('''
void f(Object? x) {
if (x case ^ y) {}
}
class A01 {}
class A02 {}
class B01 {}
''');
assertResponse(r'''
suggestions
A01
kind: class
A02
kind: class
B01
kind: class
''');
}
Future<void> test_declaredVariablePattern_typeX_name() async {
await computeSuggestions('''
void f(Object? x) {
if (x case A0^ y) {}
}
class A01 {}
class A02 {}
class B01 {}
''');
assertResponse(r'''
replacement
left: 2
suggestions
A01
kind: class
A02
kind: class
''');
}
Future<void> test_partialCase_inIfElement() async {
await computeSuggestions('''
var v = [ if (o c^) ];
''');
assertResponse(r'''
replacement
left: 1
suggestions
case
kind: keyword
''');
}
Future<void> test_partialCase_inIfStatement() async {
await computeSuggestions('''
void f(Object o) {
if (o ca^) {}
}
''');
assertResponse(r'''
replacement
left: 2
suggestions
case
kind: keyword
''');
}
}