blob: 1ba79018b9e81aeb51a4bb91de6a3dbb8693caca [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:analyzer/src/generated/source.dart';
import 'package:analyzer/src/generated/timestamped_data.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:mockito/mockito.dart';
import 'package:nnbd_migration/instrumentation.dart';
import 'package:nnbd_migration/nnbd_migration.dart';
import 'package:nnbd_migration/src/nullability_migration_impl.dart';
import 'package:nnbd_migration/src/potential_modification.dart';
import 'package:nnbd_migration/src/variables.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(NullabilityMigrationImplTest);
});
}
@reflectiveTest
class NullabilityMigrationImplTest {
VariablesMock variables;
void setUp() {
variables = VariablesMock();
}
void test_modification_columnLineInfo() {
final text = 'void f() {}\nint g() => null;';
final offset = text.indexOf('int') + 3;
final potentialModification = _PotentialModificationMock(
_NullabilityFixDescriptionMock('Add ?'),
false,
[SourceEdit(offset, 0, '?')]);
final listener = NullabilityMigrationListenerMock();
final source = SourceMock(text);
when(variables.getPotentialModifications()).thenReturn({
source: [potentialModification]
});
NullabilityMigrationImpl.broadcast(variables, listener, null);
final fix = verify(listener.addFix(captureAny)).captured.single
as SingleNullabilityFix;
expect(fix.description.appliedMessage, 'Add ?');
expect(fix.source, source);
expect(fix.location.offset, offset);
expect(fix.location.length, 0);
expect(fix.location.file, '/test.dart');
expect(fix.location.startLine, 2);
expect(fix.location.startColumn, 4);
verifyNever(listener.reportException(any, any, any, any));
final edit =
verify(listener.addEdit(fix, captureAny)).captured.single as SourceEdit;
expect(edit.offset, offset);
expect(edit.length, 0);
expect(edit.replacement, '?');
}
void test_noModifications_notReported() {
final potentialModification =
_PotentialModificationMock.empty(_NullabilityFixDescriptionMock('foo'));
final listener = NullabilityMigrationListenerMock();
final source = SourceMock('');
when(variables.getPotentialModifications()).thenReturn({
source: [potentialModification]
});
NullabilityMigrationImpl.broadcast(variables, listener, null);
verifyNever(listener.addFix(any));
verifyNever(listener.reportException(any, any, any, any));
verifyNever(listener.addEdit(any, any));
}
void test_noPotentialChanges_notReported() {
final listener = NullabilityMigrationListenerMock();
final source = SourceMock('');
when(variables.getPotentialModifications()).thenReturn({source: []});
NullabilityMigrationImpl.broadcast(variables, listener, null);
verifyNever(listener.addFix(any));
verifyNever(listener.reportException(any, any, any, any));
verifyNever(listener.addEdit(any, any));
}
}
class NullabilityMigrationListenerMock extends Mock
implements NullabilityMigrationListener {}
class SourceMock extends Mock implements Source {
final String _contents;
SourceMock(this._contents);
TimestampedData<String> get contents => TimestampedData<String>(0, _contents);
String get fullName => '/test.dart';
}
class VariablesMock extends Mock implements Variables {}
class _NullabilityFixDescriptionMock implements NullabilityFixDescription {
@override
final String appliedMessage;
_NullabilityFixDescriptionMock(this.appliedMessage);
}
class _PotentialModificationMock extends PotentialModification {
@override
final NullabilityFixDescription description;
@override
final bool isEmpty;
@override
final Iterable<SourceEdit> modifications;
_PotentialModificationMock(
this.description, this.isEmpty, this.modifications);
_PotentialModificationMock.empty(this.description)
: isEmpty = false,
modifications = [];
@override
Iterable<FixReasonInfo> get reasons => throw UnimplementedError();
}