// Copyright (c) 2015, 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:async'; import 'package:observatory_2/cli.dart'; import 'package:test/test.dart'; class TestCommand extends Command { TestCommand(this.out, name, children) : super(name, children); StringBuffer out; Future run(List args) { out.write('executing ${name}(${args})\n'); return new Future.value(null); } } class TestCompleteCommand extends Command { TestCompleteCommand(this.out, name, children) : super(name, children); StringBuffer out; Future> complete(List args) { var possibles = ['one ', 'two ', 'three ']; return new Future.value( possibles.where((possible) => possible.startsWith(args[0])).toList()); } Future run(List args) { out.write('executing ${name}(${args})\n'); return new Future.value(null); } } void testCommandComplete() { RootCommand cmd = new RootCommand([ new TestCommand(null, 'alpha', []), new TestCommand(null, 'game', [ new TestCommand(null, 'checkers', []), new TestCommand(null, 'chess', []) ]), new TestCommand(null, 'gamera', [ new TestCommand(null, 'london', []), new TestCommand(null, 'tokyo', []), new TestCommand(null, 'topeka', []) ]), new TestCompleteCommand( null, 'count', [new TestCommand(null, 'chocula', [])]) ]); // Show all commands. cmd.completeCommand('').then((result) { expect(result, equals(['alpha ', 'game ', 'gamera ', 'count '])); }); // Substring completion. cmd.completeCommand('al').then((result) { expect(result, equals(['alpha '])); }); // Full string completion. cmd.completeCommand('alpha').then((result) { expect(result, equals(['alpha '])); }); // Extra space, no subcommands. cmd.completeCommand('alpha ').then((result) { expect(result, equals(['alpha '])); }); // Ambiguous completion. cmd.completeCommand('g').then((result) { expect(result, equals(['game ', 'gamera '])); }); // Ambiguous completion, exact match not preferred. cmd.completeCommand('game').then((result) { expect(result, equals(['game ', 'gamera '])); }); // Show all subcommands. cmd.completeCommand('gamera ').then((result) { expect( result, equals(['gamera london ', 'gamera tokyo ', 'gamera topeka '])); }); // Subcommand completion. cmd.completeCommand('gamera l').then((result) { expect(result, equals(['gamera london '])); }); // Extra space, with subcommand. cmd.completeCommand('gamera london ').then((result) { expect(result, equals(['gamera london '])); }); // Ambiguous subcommand completion. cmd.completeCommand('gamera t').then((result) { expect(result, equals(['gamera tokyo ', 'gamera topeka '])); }); // Ambiguous subcommand completion with substring prefix. // Note that the prefix is left alone. cmd.completeCommand('gamer t').then((result) { expect(result, equals(['gamer tokyo ', 'gamer topeka '])); }); // Ambiguous but exact prefix is preferred. cmd.completeCommand('game chec').then((result) { expect(result, equals(['game checkers '])); }); // Ambiguous non-exact prefix means no matches. cmd.completeCommand('gam chec').then((result) { expect(result, equals([])); }); // Locals + subcommands, show all. cmd.completeCommand('count ').then((result) { expect(result, equals(['count chocula ', 'count one ', 'count two ', 'count three '])); }); // Locals + subcommands, single local match. cmd.completeCommand('count th').then((result) { expect(result, equals(['count three '])); }); // Locals + subcommands, ambiguous local match. cmd.completeCommand('count t').then((result) { expect(result, equals(['count two ', 'count three '])); }); // Locals + subcommands, single command match. cmd.completeCommand('co choc').then((result) { expect(result, equals(['co chocula '])); }); // We gobble spare spaces in the prefix but not elsewhere. cmd.completeCommand(' game chec').then((result) { expect(result, equals(['game checkers '])); }); } testCommandRunSimple() async { // Run a simple command. StringBuffer out = new StringBuffer(); RootCommand cmd = new RootCommand([new TestCommand(out, 'alpha', [])]); // Full name dispatch works. Argument passing works. await cmd.runCommand('alpha dog'); expect(out.toString(), contains('executing alpha([dog])\n')); out.clear(); // Substring dispatch works. await cmd.runCommand('al cat mouse'); expect(out.toString(), contains('executing alpha([cat , mouse])\n')); } testCommandRunSubcommand() async { // Run a simple command. StringBuffer out = new StringBuffer(); RootCommand cmd = new RootCommand([ new TestCommand(out, 'alpha', [ new TestCommand(out, 'beta', []), new TestCommand(out, 'gamma', []) ]) ]); await cmd.runCommand('a b'); expect(out.toString(), equals('executing beta([])\n')); out.clear(); await cmd.runCommand('alpha g '); expect(out.toString(), equals('executing gamma([])\n')); } testCommandRunNotFound() async { // Run a simple command. StringBuffer out = new StringBuffer(); RootCommand cmd = new RootCommand([new TestCommand(out, 'alpha', [])]); dynamic e; try { await cmd.runCommand('goose'); } catch (ex) { e = ex; } expect(e.toString(), equals("No such command: 'goose'")); } testCommandRunAmbiguous() async { // Run a simple command. StringBuffer out = new StringBuffer(); RootCommand cmd = new RootCommand([ new TestCommand(out, 'alpha', []), new TestCommand(out, 'ankle', []) ]); dynamic e; try { await cmd.runCommand('a 55'); } catch (ex) { e = ex; } expect(e.toString(), equals("Command 'a 55' is ambiguous: [alpha, ankle]")); out.clear(); await cmd.runCommand('ankl 55'); expect(out.toString(), equals('executing ankle([55])\n')); } testCommandRunAlias() async { // Run a simple command. StringBuffer out = new StringBuffer(); var aliasCmd = new TestCommand(out, 'alpha', []); aliasCmd.alias = 'a'; RootCommand cmd = new RootCommand([aliasCmd, new TestCommand(out, 'ankle', [])]); await cmd.runCommand('a 55'); expect(out.toString(), equals('executing alpha([55])\n')); } main() { test('command completion test suite', testCommandComplete); test('run a simple command', testCommandRunSimple); test('run a subcommand', testCommandRunSubcommand); test('run a command which is not found', testCommandRunNotFound); test('run a command which is ambiguous', testCommandRunAmbiguous); test('run a command using an alias', testCommandRunAlias); }