blob: 6829dd2dbed58b6eb75657055bed0e12656ac6bd [file] [log] [blame] [edit]
// Copyright (c) 2022, 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:heap_snapshot/analysis.dart';
import 'package:heapsnapshot/src/cli.dart';
import 'package:path/path.dart' as path;
import 'package:test/test.dart';
class FakeAnalysis implements Analysis {
@override
final IntSet roots = IntSet();
@override
dynamic noSuchMethod(Invocation i) {}
}
main() {
late CliState cliState;
String? complete(String text) =>
cliCommandRunner.completeCommand(cliState, text);
group('cli-completion no snapshot loaded', () {
setUp(() {
cliState = CliState(CompletionCollector());
});
// <...incomplete-load-command...>
test('complete load command', () {
expect(complete('l'), 'load');
});
// <...incomplete-stats-command...> fails
test('complete stats command fails', () {
// Since there was no snapshot loaded, commands operating on loaded
// snapshot should not auto-complete yet.
expect(complete('s'), null);
});
// load <...incomplete-file...>
test('complete incomplete file', () {
final snapshotDir = Directory.systemTemp.createTempSync('snapshot');
try {
final file = path.join(snapshotDir.path, 'foobar.heapsnapshot');
File(file).createSync();
// Ensure auto-complete works for files.
expect(complete('load ${path.join(snapshotDir.path, 'fo')}'),
'load $file');
} finally {
snapshotDir.deleteSync(recursive: true);
}
});
});
group('cli-completion snapshot loaded', () {
setUp(() {
cliState = CliState(CompletionCollector());
cliState.initialize(FakeAnalysis());
});
// <...incomplete-command...>
test('complete command', () {
expect(complete('s'), 'stats');
});
// <command> <...incomplete-option...>
test('complete command short option', () {
expect(complete('stats -'), 'stats -c');
});
test('complete command long option', () {
expect(complete('stats --m'), 'stats --max');
});
// <command> <...incomplete-args...>
test('complete command arg', () {
cliState.namedSets.nameSet({1}, 'foobar');
expect(complete('stats f'), 'stats foobar');
});
// <expr>
test('complete default eval command', () {
cliState.namedSets.nameSet({1}, 'foobar');
expect(complete('foo'), 'foobar');
});
});
group('cli-completion meta commands', () {
setUp(() {
cliState = CliState(CompletionCollector());
});
test('complete short-help', () {
expect(complete('h'), 'h');
});
test('complete long-help', () {
expect(complete('he'), 'help');
});
test('complete short-help-command', () {
expect(complete('h lo'), 'h load');
});
test('complete long-help-command', () {
expect(complete('help lo'), 'help load');
});
test('complete exit', () {
expect(complete('e'), 'exit');
});
test('complete short-quit', () {
expect(complete('q'), 'q');
});
test('complete long-quit', () {
expect(complete('qu'), 'quit');
});
});
}