command_help_test.dart 13 KB
Newer Older
1 2 3 4 5
// Copyright 2014 The Flutter 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:flutter_tools/src/base/command_help.dart';
6
import 'package:flutter_tools/src/base/logger.dart';
7
import 'package:flutter_tools/src/base/platform.dart';
8 9
import 'package:flutter_tools/src/base/terminal.dart' show AnsiTerminal, OutputPreferences;
import 'package:meta/meta.dart';
10 11

import '../../src/common.dart';
12 13 14 15 16 17
import '../../src/mocks.dart' show MockStdio;

CommandHelp _createCommandHelp({
  @required bool ansi,
  @required int wrapColumn,
}) {
18 19 20
  final Platform platform = FakePlatform(
    stdoutSupportsAnsi: ansi,
  );
21
  return CommandHelp(
22
    logger: BufferLogger.test(),
23 24
    terminal: AnsiTerminal(
      stdio:  MockStdio(),
25
      platform: platform,
26
    ),
27
    platform: platform,
28 29 30 31 32 33
    outputPreferences: OutputPreferences.test(
      showColor: ansi,
      wrapColumn: wrapColumn,
    ),
  );
}
34 35

// Used to use the message length in different scenarios in a DRY way
36 37 38 39 40 41 42 43 44
void _testMessageLength({
  @required bool stdoutSupportsAnsi,
  @required int maxTestLineLength,
  @required int wrapColumn,
}) {
  final CommandHelp commandHelp = _createCommandHelp(
    ansi: stdoutSupportsAnsi,
    wrapColumn: wrapColumn,
  );
45 46 47 48 49 50 51 52

  int expectedWidth = maxTestLineLength;

  if (stdoutSupportsAnsi) {
    const int ansiMetaCharactersLength = 33;
    expectedWidth += ansiMetaCharactersLength;
  }

53 54 55 56
  expect(
    commandHelp.I.toString().length,
    lessThanOrEqualTo(expectedWidth),
  );
57 58 59 60 61 62 63
  expect(commandHelp.L.toString().length, lessThanOrEqualTo(expectedWidth));
  expect(commandHelp.P.toString().length, lessThanOrEqualTo(expectedWidth));
  expect(commandHelp.R.toString().length, lessThanOrEqualTo(expectedWidth));
  expect(commandHelp.S.toString().length, lessThanOrEqualTo(expectedWidth));
  expect(commandHelp.U.toString().length, lessThanOrEqualTo(expectedWidth));
  expect(commandHelp.a.toString().length, lessThanOrEqualTo(expectedWidth));
  expect(commandHelp.d.toString().length, lessThanOrEqualTo(expectedWidth));
64
  expect(commandHelp.g.toString().length, lessThanOrEqualTo(expectedWidth));
65 66
  expect(commandHelp.h.toString().length, lessThanOrEqualTo(expectedWidth));
  expect(commandHelp.i.toString().length, lessThanOrEqualTo(expectedWidth));
67
  expect(commandHelp.k.toString().length, lessThanOrEqualTo(expectedWidth));
68 69 70 71 72 73
  expect(commandHelp.o.toString().length, lessThanOrEqualTo(expectedWidth));
  expect(commandHelp.p.toString().length, lessThanOrEqualTo(expectedWidth));
  expect(commandHelp.q.toString().length, lessThanOrEqualTo(expectedWidth));
  expect(commandHelp.r.toString().length, lessThanOrEqualTo(expectedWidth));
  expect(commandHelp.s.toString().length, lessThanOrEqualTo(expectedWidth));
  expect(commandHelp.t.toString().length, lessThanOrEqualTo(expectedWidth));
74
  expect(commandHelp.v.toString().length, lessThanOrEqualTo(expectedWidth));
75 76 77
  expect(commandHelp.w.toString().length, lessThanOrEqualTo(expectedWidth));
  expect(commandHelp.z.toString().length, lessThanOrEqualTo(expectedWidth));
}
78 79 80 81

void main() {
  group('CommandHelp', () {
    group('toString', () {
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
      testWithoutContext('ends with a resetBold when it has parenthetical text', () {
        final Platform platform = FakePlatform(stdoutSupportsAnsi: true);
        final AnsiTerminal terminal = AnsiTerminal(stdio: null, platform: platform);

        final CommandHelpOption commandHelpOption = CommandHelpOption(
          'tester',
          'for testing',
          platform: platform,
          outputPreferences: OutputPreferences.test(showColor: true),
          terminal: terminal,
          logger: BufferLogger.test(),
          inParenthesis: 'Parenthetical',
        );
        expect(commandHelpOption.toString(), endsWith(AnsiTerminal.resetBold));
      });
97

98 99 100 101 102 103 104 105 106 107 108 109 110
      testWithoutContext('should have a bold command key', () {
        final CommandHelp commandHelp = _createCommandHelp(
          ansi: true,
          wrapColumn: maxLineWidth,
        );

        expect(commandHelp.L.toString(), startsWith('\x1B[1mL\x1B[22m'));
        expect(commandHelp.P.toString(), startsWith('\x1B[1mP\x1B[22m'));
        expect(commandHelp.R.toString(), startsWith('\x1B[1mR\x1B[22m'));
        expect(commandHelp.S.toString(), startsWith('\x1B[1mS\x1B[22m'));
        expect(commandHelp.U.toString(), startsWith('\x1B[1mU\x1B[22m'));
        expect(commandHelp.a.toString(), startsWith('\x1B[1ma\x1B[22m'));
        expect(commandHelp.d.toString(), startsWith('\x1B[1md\x1B[22m'));
111
        expect(commandHelp.g.toString(), startsWith('\x1B[1mg\x1B[22m'));
112 113 114 115 116 117 118 119
        expect(commandHelp.h.toString(), startsWith('\x1B[1mh\x1B[22m'));
        expect(commandHelp.i.toString(), startsWith('\x1B[1mi\x1B[22m'));
        expect(commandHelp.o.toString(), startsWith('\x1B[1mo\x1B[22m'));
        expect(commandHelp.p.toString(), startsWith('\x1B[1mp\x1B[22m'));
        expect(commandHelp.q.toString(), startsWith('\x1B[1mq\x1B[22m'));
        expect(commandHelp.r.toString(), startsWith('\x1B[1mr\x1B[22m'));
        expect(commandHelp.s.toString(), startsWith('\x1B[1ms\x1B[22m'));
        expect(commandHelp.t.toString(), startsWith('\x1B[1mt\x1B[22m'));
120
        expect(commandHelp.v.toString(), startsWith('\x1B[1mv\x1B[22m'));
121 122
        expect(commandHelp.w.toString(), startsWith('\x1B[1mw\x1B[22m'));
        expect(commandHelp.z.toString(), startsWith('\x1B[1mz\x1B[22m'));
123 124
      });

125 126 127 128 129 130
      testWithoutContext('commands L,P,S,U,a,i,o,p,t,w should have a grey bolden parenthetical text', () {
        final CommandHelp commandHelp = _createCommandHelp(
          ansi: true,
          wrapColumn: maxLineWidth,
        );

131 132 133 134 135 136 137 138 139 140
        expect(commandHelp.L.toString(), endsWith('\x1B[1;30m(debugDumpLayerTree)\x1B[39m\x1b[22m'));
        expect(commandHelp.P.toString(), endsWith('\x1B[1;30m(WidgetsApp.showPerformanceOverlay)\x1B[39m\x1b[22m'));
        expect(commandHelp.S.toString(), endsWith('\x1B[1;30m(debugDumpSemantics)\x1B[39m\x1b[22m'));
        expect(commandHelp.U.toString(), endsWith('\x1B[1;30m(debugDumpSemantics)\x1B[39m\x1b[22m'));
        expect(commandHelp.a.toString(), endsWith('\x1B[1;30m(debugProfileWidgetBuilds)\x1B[39m\x1b[22m'));
        expect(commandHelp.i.toString(), endsWith('\x1B[1;30m(WidgetsApp.showWidgetInspectorOverride)\x1B[39m\x1b[22m'));
        expect(commandHelp.o.toString(), endsWith('\x1B[1;30m(defaultTargetPlatform)\x1B[39m\x1b[22m'));
        expect(commandHelp.p.toString(), endsWith('\x1B[1;30m(debugPaintSizeEnabled)\x1B[39m\x1b[22m'));
        expect(commandHelp.t.toString(), endsWith('\x1B[1;30m(debugDumpRenderTree)\x1B[39m\x1b[22m'));
        expect(commandHelp.w.toString(), endsWith('\x1B[1;30m(debugDumpApp)\x1B[39m\x1b[22m'));
141 142
      });

143 144 145 146 147 148
      testWithoutContext('should not create a help text longer than maxLineWidth without ansi support', () {
        _testMessageLength(
          stdoutSupportsAnsi: false,
          wrapColumn: 0,
          maxTestLineLength: maxLineWidth,
        );
149 150
      });

151 152 153 154 155 156
      testWithoutContext('should not create a help text longer than maxLineWidth with ansi support', () {
        _testMessageLength(
          stdoutSupportsAnsi: true,
          wrapColumn: 0,
          maxTestLineLength: maxLineWidth,
        );
157 158
      });

159 160 161 162 163 164
      testWithoutContext('should not create a help text longer than outputPreferences.wrapColumn without ansi support', () {
        _testMessageLength(
          stdoutSupportsAnsi: false,
          wrapColumn: OutputPreferences.kDefaultTerminalColumns,
          maxTestLineLength: OutputPreferences.kDefaultTerminalColumns,
        );
165 166
      });

167 168 169 170 171 172
      testWithoutContext('should not create a help text longer than outputPreferences.wrapColumn with ansi support', () {
        _testMessageLength(
          stdoutSupportsAnsi: true,
          wrapColumn: OutputPreferences.kDefaultTerminalColumns,
          maxTestLineLength: OutputPreferences.kDefaultTerminalColumns,
        );
173 174
      });

175 176 177 178 179 180
      testWithoutContext('should create the correct help text with ansi support', () {
        final CommandHelp commandHelp = _createCommandHelp(
          ansi: true,
          wrapColumn: maxLineWidth,
        );

181 182
        expect(commandHelp.L.toString(), equals('\x1B[1mL\x1B[22m Dump layer tree to the console.                               \x1B[1;30m(debugDumpLayerTree)\x1B[39m\x1b[22m'));
        expect(commandHelp.P.toString(), equals('\x1B[1mP\x1B[22m Toggle performance overlay.                    \x1B[1;30m(WidgetsApp.showPerformanceOverlay)\x1B[39m\x1b[22m'));
183
        expect(commandHelp.R.toString(), equals('\x1B[1mR\x1B[22m Hot restart.'));
184 185 186
        expect(commandHelp.S.toString(), equals('\x1B[1mS\x1B[22m Dump accessibility tree in traversal order.                   \x1B[1;30m(debugDumpSemantics)\x1B[39m\x1b[22m'));
        expect(commandHelp.U.toString(), equals('\x1B[1mU\x1B[22m Dump accessibility tree in inverse hit test order.            \x1B[1;30m(debugDumpSemantics)\x1B[39m\x1b[22m'));
        expect(commandHelp.a.toString(), equals('\x1B[1ma\x1B[22m Toggle timeline events for all widget build methods.    \x1B[1;30m(debugProfileWidgetBuilds)\x1B[39m\x1b[22m'));
187
        expect(commandHelp.d.toString(), equals('\x1B[1md\x1B[22m Detach (terminate "flutter run" but leave application running).'));
188
        expect(commandHelp.g.toString(), equals('\x1B[1mg\x1B[22m Run source code generators.'));
189
        expect(commandHelp.h.toString(), equals('\x1B[1mh\x1B[22m Repeat this help message.'));
190 191 192
        expect(commandHelp.i.toString(), equals('\x1B[1mi\x1B[22m Toggle widget inspector.                  \x1B[1;30m(WidgetsApp.showWidgetInspectorOverride)\x1B[39m\x1b[22m'));
        expect(commandHelp.o.toString(), equals('\x1B[1mo\x1B[22m Simulate different operating systems.                      \x1B[1;30m(defaultTargetPlatform)\x1B[39m\x1b[22m'));
        expect(commandHelp.p.toString(), equals('\x1B[1mp\x1B[22m Toggle the display of construction lines.                  \x1B[1;30m(debugPaintSizeEnabled)\x1B[39m\x1b[22m'));
193 194 195
        expect(commandHelp.q.toString(), equals('\x1B[1mq\x1B[22m Quit (terminate the application on the device).'));
        expect(commandHelp.r.toString(), equals('\x1B[1mr\x1B[22m Hot reload. $fire$fire$fire'));
        expect(commandHelp.s.toString(), equals('\x1B[1ms\x1B[22m Save a screenshot to flutter.png.'));
196
        expect(commandHelp.t.toString(), equals('\x1B[1mt\x1B[22m Dump rendering tree to the console.                          \x1B[1;30m(debugDumpRenderTree)\x1B[39m\x1b[22m'));
197
        expect(commandHelp.v.toString(), equals('\x1B[1mv\x1B[22m Launch DevTools.'));
198
        expect(commandHelp.w.toString(), equals('\x1B[1mw\x1B[22m Dump widget hierarchy to the console.                               \x1B[1;30m(debugDumpApp)\x1B[39m\x1b[22m'));
199
        expect(commandHelp.z.toString(), equals('\x1B[1mz\x1B[22m Toggle elevation checker.'));
200 201
      });

202 203 204 205 206 207 208 209 210 211 212 213 214
      testWithoutContext('should create the correct help text without ansi support', () {
        final CommandHelp commandHelp = _createCommandHelp(
          ansi: false,
          wrapColumn: maxLineWidth,
        );

        expect(commandHelp.L.toString(), equals('L Dump layer tree to the console.                               (debugDumpLayerTree)'));
        expect(commandHelp.P.toString(), equals('P Toggle performance overlay.                    (WidgetsApp.showPerformanceOverlay)'));
        expect(commandHelp.R.toString(), equals('R Hot restart.'));
        expect(commandHelp.S.toString(), equals('S Dump accessibility tree in traversal order.                   (debugDumpSemantics)'));
        expect(commandHelp.U.toString(), equals('U Dump accessibility tree in inverse hit test order.            (debugDumpSemantics)'));
        expect(commandHelp.a.toString(), equals('a Toggle timeline events for all widget build methods.    (debugProfileWidgetBuilds)'));
        expect(commandHelp.d.toString(), equals('d Detach (terminate "flutter run" but leave application running).'));
215
        expect(commandHelp.g.toString(), equals('g Run source code generators.'));
216 217 218 219 220 221 222 223
        expect(commandHelp.h.toString(), equals('h Repeat this help message.'));
        expect(commandHelp.i.toString(), equals('i Toggle widget inspector.                  (WidgetsApp.showWidgetInspectorOverride)'));
        expect(commandHelp.o.toString(), equals('o Simulate different operating systems.                      (defaultTargetPlatform)'));
        expect(commandHelp.p.toString(), equals('p Toggle the display of construction lines.                  (debugPaintSizeEnabled)'));
        expect(commandHelp.q.toString(), equals('q Quit (terminate the application on the device).'));
        expect(commandHelp.r.toString(), equals('r Hot reload. $fire$fire$fire'));
        expect(commandHelp.s.toString(), equals('s Save a screenshot to flutter.png.'));
        expect(commandHelp.t.toString(), equals('t Dump rendering tree to the console.                          (debugDumpRenderTree)'));
224
        expect(commandHelp.v.toString(), equals('v Launch DevTools.'));
225 226 227
        expect(commandHelp.w.toString(), equals('w Dump widget hierarchy to the console.                               (debugDumpApp)'));
        expect(commandHelp.z.toString(), equals('z Toggle elevation checker.'));
      });
228 229 230
    });
  });
}