blob: 792cbd205b05dfb0cdd0c7537df44f44e0ad5287 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. 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:ansicolor/ansicolor.dart';
import 'package:devtools_app/src/config_specific/ide_theme/ide_theme.dart';
import 'package:devtools_app/src/screens/debugger/console.dart';
import 'package:devtools_app/src/screens/debugger/debugger_controller.dart';
import 'package:devtools_app/src/scripts/script_manager.dart';
import 'package:devtools_app/src/service/service_manager.dart';
import 'package:devtools_app/src/shared/globals.dart';
import 'package:devtools_test/devtools_test.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
void main() {
final fakeServiceManager = FakeServiceManager();
final debuggerController = createMockDebuggerControllerWithDefaults();
const windowSize = Size(4000.0, 4000.0);
when(fakeServiceManager.connectedApp!.isProfileBuildNow).thenReturn(false);
when(fakeServiceManager.connectedApp!.isDartWebAppNow).thenReturn(false);
setGlobal(ServiceConnectionManager, fakeServiceManager);
setGlobal(IdeTheme, IdeTheme());
setGlobal(ScriptManager, MockScriptManager());
fakeServiceManager.consoleService.ensureServiceInitialized();
when(fakeServiceManager.errorBadgeManager.errorCountNotifier('debugger'))
.thenReturn(ValueNotifier<int>(0));
Future<void> pumpConsole(
WidgetTester tester,
DebuggerController controller,
) async {
await tester.pumpWidget(
wrapWithControllers(
Row(
children: [
Flexible(child: DebuggerConsole.buildHeader()),
const Expanded(child: DebuggerConsole()),
],
),
debugger: controller,
),
);
}
group('ConsoleControls', () {
final _stdio = ['First line', _ansiCodesOutput(), 'Third line'];
void _appendStdioLines() {
for (var line in _stdio) {
serviceManager.consoleService.appendStdio('$line\n');
}
}
testWidgetsWithWindowSize(
'Tapping the Console Clear button clears stdio.', windowSize,
(WidgetTester tester) async {
serviceManager.consoleService.clearStdio();
serviceManager.consoleService.appendStdio(_ansiCodesOutput());
await pumpConsole(tester, debuggerController);
final clearButton = find.byKey(DebuggerConsole.clearStdioButtonKey);
expect(clearButton, findsOneWidget);
await tester.tap(clearButton);
expect(serviceManager.consoleService.stdio.value, isEmpty);
});
group('Clipboard', () {
String _clipboardContents = '';
final _expected = _stdio.join('\n');
setUp(() {
_appendStdioLines();
// This intercepts the Clipboard.setData SystemChannel message,
// and stores the contents that were (attempted) to be copied.
SystemChannels.platform.setMockMethodCallHandler((MethodCall call) {
switch (call.method) {
case 'Clipboard.setData':
_clipboardContents = call.arguments['text'];
break;
case 'Clipboard.getData':
return Future.value(<String, dynamic>{});
case 'Clipboard.hasStrings':
return Future.value(<String, dynamic>{'value': true});
default:
break;
}
return Future.value(true);
});
});
tearDown(() {
// Cleanup the SystemChannel
SystemChannels.platform.setMockMethodCallHandler(null);
});
testWidgetsWithWindowSize(
'Tapping the Copy to Clipboard button attempts to copy stdio to clipboard.',
windowSize, (WidgetTester tester) async {
await pumpConsole(tester, debuggerController);
final copyButton = find.byKey(DebuggerConsole.copyToClipboardButtonKey);
expect(copyButton, findsOneWidget);
expect(_clipboardContents, isEmpty);
await tester.tap(copyButton);
expect(_clipboardContents, equals(_expected));
});
});
});
}
String _ansiCodesOutput() {
final sb = StringBuffer();
sb.write('Ansi color codes processed for ');
final pen = AnsiPen()..rgb(r: 0.8, g: 0.3, b: 0.4, bg: true);
sb.write(pen('console'));
return sb.toString();
}