blob: fb365487f8f6ddd8d0ace50f5882ca0e9001f736 [file] [log] [blame]
// Copyright (c) 2018, 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 'dart:async';
import 'package:analysis_server/src/flutter/flutter_correction.dart';
import 'package:analysis_server/src/protocol_server.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../../abstract_single_unit.dart';
import '../utilities/flutter_util.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(FlutterCorrectionTest);
});
}
@reflectiveTest
class FlutterCorrectionTest extends AbstractSingleUnitTest {
int offset;
int length;
int findOffset(String search) {
int offset = testCode.indexOf(search);
expect(offset, isNonNegative, reason: "Not found '$search' in\n$testCode");
return offset;
}
@override
void setUp() {
super.setUp();
packageMap['flutter'] = [configureFlutterPackage(resourceProvider)];
}
test_wrapWidget_OK_multiLine() async {
await resolveTestUnit('''
import 'package:flutter/widgets.dart';
class MyWidget extends StatelessWidget {
Widget build(BuildContext context) {
return /*start*/new Row(
children: [
new Text('aaa'),
new Text('bbb'),
],
)/*end*/;
}
}
''');
_setStartEndSelection();
InterfaceType parentType = await _getContainerType();
SourceChange change = await _wrapWidget(parentType);
_assertChange(change, r'''
import 'package:flutter/widgets.dart';
class MyWidget extends StatelessWidget {
Widget build(BuildContext context) {
return new Container(
child: /*start*/new Row(
children: [
new Text('aaa'),
new Text('bbb'),
],
)/*end*/,
);
}
}
''');
}
test_wrapWidget_OK_multiLine_subChild() async {
await resolveTestUnit('''
import 'package:flutter/widgets.dart';
class MyWidget extends StatelessWidget {
Widget build(BuildContext context) {
return new Container(
child: /*start*/new Row(
children: [
new Text('aaa'),
new Text('bbb'),
],
)/*end*/,
);
}
}
''');
_setStartEndSelection();
InterfaceType parentType = await _getContainerType();
SourceChange change = await _wrapWidget(parentType);
_assertChange(change, r'''
import 'package:flutter/widgets.dart';
class MyWidget extends StatelessWidget {
Widget build(BuildContext context) {
return new Container(
child: new Container(
child: /*start*/new Row(
children: [
new Text('aaa'),
new Text('bbb'),
],
)/*end*/,
),
);
}
}
''');
}
test_wrapWidget_OK_oneLine_newInstance() async {
await resolveTestUnit('''
import 'package:flutter/widgets.dart';
class MyWidget extends StatelessWidget {
Widget build(BuildContext context) {
return /*start*/new Text('abc')/*end*/;
}
}
''');
_setStartEndSelection();
InterfaceType parentType = await _getContainerType();
SourceChange change = await _wrapWidget(parentType);
_assertChange(change, r'''
import 'package:flutter/widgets.dart';
class MyWidget extends StatelessWidget {
Widget build(BuildContext context) {
return new Container(child: /*start*/new Text('abc')/*end*/);
}
}
''');
}
test_wrapWidget_OK_oneLine_variable() async {
await resolveTestUnit('''
import 'package:flutter/widgets.dart';
class MyWidget extends StatelessWidget {
Widget build(BuildContext context) {
var text = new Text('abc');
return /*start*/text/*end*/;
}
}
''');
_setStartEndSelection();
InterfaceType parentType = await _getContainerType();
SourceChange change = await _wrapWidget(parentType);
_assertChange(change, r'''
import 'package:flutter/widgets.dart';
class MyWidget extends StatelessWidget {
Widget build(BuildContext context) {
var text = new Text('abc');
return new Container(child: /*start*/text/*end*/);
}
}
''');
}
void _assertChange(SourceChange change, String expectedCode) {
expect(change, isNotNull);
List<SourceFileEdit> files = change.edits;
expect(files, hasLength(1));
expect(files[0].file, testFile);
List<SourceEdit> fileEdits = files[0].edits;
String resultCode = SourceEdit.applySequence(testCode, fileEdits);
if (resultCode != expectedCode) {
print(resultCode);
}
expect(resultCode, expectedCode);
}
Future<InterfaceType> _getContainerType() async {
LibraryElement widgetsLibrary = await testAnalysisResult.session
.getLibraryByUri('package:flutter/widgets.dart');
ClassElement containerElement =
widgetsLibrary.exportNamespace.get('Container');
return containerElement.type;
}
void _setStartEndSelection() {
offset = findOffset('/*start*/');
length = findOffset('/*end*/') + '/*end*/'.length - offset;
}
Future<SourceChange> _wrapWidget(InterfaceType parentType) async {
var corrections = new FlutterCorrections(
file: testFile,
fileContent: testCode,
selectionOffset: offset,
selectionLength: length,
session: testAnalysisResult.session,
unit: testUnit);
return await corrections.wrapWidget(parentType);
}
}