blob: 7e4d5d068c5b87b4c0549d1fef8ba909f45a385f [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 'package:analysis_server/src/flutter/flutter_correction.dart';
import 'package:analysis_server/src/protocol_server.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 = 0;
FlutterCorrections corrections;
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();
addFlutterPackage();
}
test_addForDesignTimeConstructor_BAD_notClass() async {
await resolveTestUnit('var v = 42;');
offset = findOffset('v =');
_createCorrections();
SourceChange change = await corrections.addForDesignTimeConstructor();
expect(change, isNull);
}
test_addForDesignTimeConstructor_OK_hasConstructor() async {
await resolveTestUnit('''
import 'package:flutter/widgets.dart';
class MyWidget extends StatelessWidget {
MyWidget(String text);
Widget build(BuildContext context) {
return new Container();
}
}
''');
offset = findOffset('class MyWidget');
_createCorrections();
SourceChange change = await corrections.addForDesignTimeConstructor();
_assertChange(change, r'''
import 'package:flutter/widgets.dart';
class MyWidget extends StatelessWidget {
MyWidget(String text);
factory MyWidget.forDesignTime() {
// TODO: add arguments
return new MyWidget();
}
Widget build(BuildContext context) {
return new Container();
}
}
''');
}
test_addForDesignTimeConstructor_OK_noConstructor() async {
await resolveTestUnit('''
import 'package:flutter/widgets.dart';
class MyWidget extends StatelessWidget {
Widget build(BuildContext context) {
return new Container();
}
}
''');
offset = findOffset('class MyWidget');
_createCorrections();
SourceChange change = await corrections.addForDesignTimeConstructor();
_assertChange(change, r'''
import 'package:flutter/widgets.dart';
class MyWidget extends StatelessWidget {
MyWidget();
factory MyWidget.forDesignTime() {
// TODO: add arguments
return new MyWidget();
}
Widget build(BuildContext context) {
return new Container();
}
}
''');
}
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);
}
void _createCorrections() {
corrections = new FlutterCorrections(
file: testFile,
fileContent: testCode,
selectionOffset: offset,
selectionLength: length,
session: testAnalysisResult.session,
unit: testUnit);
}
}