// Copyright (c) 2017, 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:analyzer/dart/analysis/results.dart'; import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart'; import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart'; import 'package:analyzer_plugin/utilities/navigation/navigation.dart'; import 'package:test/test.dart'; import 'package:test_reflective_loader/test_reflective_loader.dart'; import '../plugin/mocks.dart'; void main() { defineReflectiveTests(NavigationGeneratorTest); } @reflectiveTest class NavigationGeneratorTest with ResourceProviderMixin { ResolvedUnitResult resolvedUnit = MockResolvedUnitResult(path: 'a.dart'); void test_none() { var generator = NavigationGenerator([]); NavigationRequest request = DartNavigationRequestImpl(resourceProvider, 0, 100, resolvedUnit); var result = generator.generateNavigationNotification(request); expect(result.notifications, hasLength(1)); } void test_normal() { var contributor = TestContributor(); var generator = NavigationGenerator([contributor]); NavigationRequest request = DartNavigationRequestImpl(resourceProvider, 0, 100, resolvedUnit); var result = generator.generateNavigationNotification(request); expect(result.notifications, hasLength(1)); expect(contributor.count, 1); } /// This tests that we get an error notification for each contributor that /// throws an error and that an error in one contributor doesn't prevent other /// contributors from being called. void test_withException() { var contributor1 = TestContributor(); var contributor2 = TestContributor(throwException: true); var contributor3 = TestContributor(); var contributor4 = TestContributor(throwException: true); var generator = NavigationGenerator( [contributor1, contributor2, contributor3, contributor4]); NavigationRequest request = DartNavigationRequestImpl(resourceProvider, 0, 100, resolvedUnit); var result = generator.generateNavigationNotification(request); expect(result.notifications, hasLength(3)); expect( result.notifications.where( (notification) => notification.event == 'analysis.navigation'), hasLength(1)); expect( result.notifications .where((notification) => notification.event == 'plugin.error'), hasLength(2)); expect(contributor1.count, 1); expect(contributor2.count, 1); expect(contributor3.count, 1); expect(contributor4.count, 1); } } class TestContributor implements NavigationContributor { /// A flag indicating whether the contributor should throw an exception when /// [computeNavigation] is invoked. bool throwException; /// The number of times that [computeNavigation] was invoked. int count = 0; TestContributor({this.throwException = false}); @override void computeNavigation( NavigationRequest request, NavigationCollector collector) { count++; if (throwException) { throw Exception(); } } }