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