blob: a2fcf89f3f4c427d55ff72c476610e458af6843a [file] [log] [blame]
// Copyright (c) 2020, 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 'dart:io';
import 'package:analysis_server_client/protocol.dart';
import 'package:cli_util/cli_logging.dart';
import 'package:dartfix/src/migrate/apply.dart';
import 'package:dartfix/src/migrate/display.dart';
import 'package:test/test.dart';
void main() {
defineMigrateTests();
}
void defineMigrateTests() {
group('issue render', defineIssueRenderTests);
group('SourcePrinter', defineSourcePrinterTests);
group('applyEdits', defineApplyEditsTests);
}
void defineIssueRenderTests() {
IssueRenderer renderer;
TestLogger logger;
setUp(() {
logger = TestLogger();
renderer = IssueRenderer(logger, '.');
});
test('issue1', () {
AnalysisError issue = AnalysisError(
AnalysisErrorSeverity.ERROR,
AnalysisErrorType.COMPILE_TIME_ERROR,
Location('foo/bar/baz.dart', 1, 2, 3, 4),
'My message.',
'my_error_code',
);
renderer.render(issue);
expect(
logger.stdoutText.trim(),
contains(platformPath(
'error • My message at foo/bar/baz.dart:3:4 • (my_error_code)')),
);
expect(logger.stderrText, isEmpty);
});
test('issue2', () {
AnalysisError issue = AnalysisError(
AnalysisErrorSeverity.INFO,
AnalysisErrorType.TODO,
Location('foo/bar/qux.dart', 1, 2, 3, 4),
'todo: My message.',
'todo',
);
renderer.render(issue);
expect(
logger.stdoutText,
contains(platformPath(
'info • todo: My message at foo/bar/qux.dart:3:4 • (todo)')));
expect(logger.stderrText, isEmpty);
});
}
void defineSourcePrinterTests() {
SourcePrinter printer;
setUp(() {
printer = SourcePrinter('''
void main() {
Cat one = Cat('Tabby');
print(one);
}
class Cat {
final String name;
String color;
Cat(this.name);
String toString() {
return name?.toString() + ' is ' + color.toString();
}
}
''');
});
test('add and remove', () {
printer.insertText(192, '?');
printer.deleteRange(164, 1);
printer.insertText(98, '?');
StringBuffer buf = StringBuffer();
printer.processChangedLines((lineNumber, lineText) {
buf.writeln('$lineNumber ${lineText.trim()}');
});
expect(buf.toString().trim(), '''
8 String\x1B[7m?\x1B[0m color;
13 return name?\x1B[31m\x1B[7m.\x1B[0mtoString() + \' is \' + color\x1B[7m?\x1B[0m.toString();''');
});
}
void defineApplyEditsTests() {
test('insert', () {
String source = 'one two\nthree four';
SourceFileEdit edit = SourceFileEdit('foo.dart', 0, edits: [
SourceEdit(0, 0, 'five '),
]);
String result = applyEdits(edit, source);
expect(result, 'five one two\nthree four');
});
test('delete', () {
String source = 'one two\nthree four';
SourceFileEdit edit = SourceFileEdit('foo.dart', 0, edits: [
SourceEdit(0, 4, ''),
SourceEdit(8, 6, ''),
]);
String result = applyEdits(edit, source);
expect(result, 'two\nfour');
});
test('insert and delete', () {
String source = 'one two\nthree four';
SourceFileEdit edit = SourceFileEdit('foo.dart', 0, edits: [
SourceEdit(13, 5, ''),
SourceEdit(8, 0, 'six '),
SourceEdit(7, 1, ' '),
]);
String result = applyEdits(edit, source);
expect(result, 'one two six three');
});
}
class TestLogger implements Logger {
final bool debug;
@override
final Ansi ansi;
final stdoutBuffer = StringBuffer();
final stderrBuffer = StringBuffer();
TestLogger({this.debug = false}) : ansi = Ansi(false);
@override
void flush() {}
@override
bool get isVerbose => debug;
@override
Progress progress(String message) {
return SimpleProgress(this, message);
}
@override
void stdout(String message) {
stdoutBuffer.writeln(message);
}
@override
void write(String message) {
stdoutBuffer.write(message);
}
@override
void writeCharCode(int charCode) {
stdoutBuffer.writeCharCode(charCode);
}
@override
void stderr(String message) {
stderrBuffer.writeln(message);
}
@override
void trace(String message) {
if (debug) {
stdoutBuffer.writeln(message);
}
}
String get stdoutText => stdoutBuffer.toString();
String get stderrText => stderrBuffer.toString();
}
String platformPath(String path) {
return path.replaceAll('/', Platform.pathSeparator);
}