| // 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)); |
| } |
| } |