blob: 2059de5a499c585ee37a155a963803cf44cd806d [file] [log] [blame]
// Copyright (c) 2019, 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/lsp_protocol/protocol_generated.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'server_abstract.dart';
void main() {
defineReflectiveSuite(() {
defineReflectiveTests(FlutterOutlineTest);
});
}
@reflectiveTest
class FlutterOutlineTest extends AbstractLspAnalysisServerTest {
@override
void setUp() {
super.setUp();
writePackageConfig(projectFolderPath, flutter: true);
}
Future<void> test_afterChange() async {
final initialContent = '''
import 'package:flutter/material.dart';
Widget build(BuildContext context) => Container();
''';
final updatedContent = '''
import 'package:flutter/material.dart';
Widget build(BuildContext context) => Icon();
''';
await initialize(initializationOptions: {'flutterOutline': true});
final outlineUpdateBeforeChange = waitForFlutterOutline(mainFileUri);
openFile(mainFileUri, initialContent);
final outlineBeforeChange = await outlineUpdateBeforeChange;
final outlineUpdateAfterChange = waitForFlutterOutline(mainFileUri);
replaceFile(1, mainFileUri, updatedContent);
final outlineAfterChange = await outlineUpdateAfterChange;
expect(outlineBeforeChange, isNotNull);
expect(outlineBeforeChange.children, hasLength(1));
expect(outlineBeforeChange.children![0].children![0].className,
equals('Container'));
expect(outlineAfterChange, isNotNull);
expect(outlineAfterChange.children, hasLength(1));
expect(
outlineAfterChange.children![0].children![0].className, equals('Icon'));
}
Future<void> test_initial() async {
final content = '''
import 'package:flutter/material.dart';
/// My build method
Widget build(BuildContext context) => Container(
child: DefaultTextStyle(
child: SafeArea(
child: Row(
children: <Widget>[
Container(child: Icon(Icons.ac_unit)),
Expanded(child: Container()),
],
),
),
),
);
''';
await initialize(initializationOptions: {'flutterOutline': true});
final outlineNotification = waitForFlutterOutline(mainFileUri);
openFile(mainFileUri, content);
final outline = await outlineNotification;
expect(outline, isNotNull);
// Root node is entire document
expect(
outline.range,
equals(Range(
start: Position(line: 0, character: 0),
end: Position(line: 15, character: 0))));
expect(outline.children, hasLength(1));
final build = outline.children![0];
expect(build.kind, equals('DART_ELEMENT'));
expect(
build.range,
equals(Range(
start: Position(line: 2, character: 0),
end: Position(line: 14, character: 6))));
expect(
build.codeRange,
equals(Range(
start: Position(line: 3, character: 0),
end: Position(line: 14, character: 6))));
final dartElement = build.dartElement!;
expect(dartElement.kind, equals('FUNCTION'));
expect(dartElement.name, equals('build'));
expect(dartElement.parameters, equals('(BuildContext context)'));
expect(
dartElement.range,
equals(Range(
start: Position(line: 3, character: 7),
end: Position(line: 3, character: 12))));
expect(dartElement.returnType, equals('Widget'));
expect(build.children, hasLength(1));
final icon =
build.children![0].children![0].children![0].children![0].children![0];
expect(icon.kind, equals('NEW_INSTANCE'));
expect(icon.className, 'Icon');
expect(
icon.range,
equals(Range(
start: Position(line: 8, character: 31),
end: Position(line: 8, character: 50))));
expect(icon.codeRange, equals(icon.range));
expect(icon.attributes, hasLength(1));
final attributes = icon.attributes!;
expect(attributes[0].name, equals('icon'));
expect(attributes[0].label, equals('Icons.ac_unit'));
expect(
attributes[0].valueRange,
equals(Range(
start: Position(line: 8, character: 36),
end: Position(line: 8, character: 49))));
expect(icon.dartElement, isNull);
expect(icon.children, hasLength(0));
}
}