semantics_tester_generateTestSemanticsExpressionForCurrentSemanticsTree_test.dart 5.61 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
// Copyright 2017 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 'dart:async';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter/semantics.dart';
import 'package:flutter_test/flutter_test.dart';

import 'semantics_tester.dart';

void main() {
  group('generateTestSemanticsExpressionForCurrentSemanticsTree', () {
    _tests();
  });
}

void _tests() {
  setUp(() {
    debugResetSemanticsIdCounter();
  });

25
  Future<void> pumpTestWidget(WidgetTester tester) async {
26 27
    await tester.pumpWidget(MaterialApp(
      home: ListView(
28 29
        children: <Widget>[
          const Text('Plain text'),
30
          Semantics(
31 32
            selected: true,
            checked: true,
33 34
            onTap: () { },
            onDecrease: () { },
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
            value: 'test-value',
            increasedValue: 'test-increasedValue',
            decreasedValue: 'test-decreasedValue',
            hint: 'test-hint',
            textDirection: TextDirection.rtl,
            child: const Text('Interactive text'),
          ),
        ],
      ),
    ));
  }

  // This test generates code using generateTestSemanticsExpressionForCurrentSemanticsTree
  // then compares it to the code used in the 'generated code is correct' test
  // below. When you update the implementation of generateTestSemanticsExpressionForCurrentSemanticsTree
  // also update this code to reflect the new output.
  //
  // This test is flexible w.r.t. leading and trailing whitespace.
  testWidgets('generates code', (WidgetTester tester) async {
54
    final SemanticsTester semantics = SemanticsTester(tester);
55 56
    await pumpTestWidget(tester);
    final String code = semantics
57
      .generateTestSemanticsExpressionForCurrentSemanticsTree(DebugSemanticsDumpOrder.inverseHitTest)
58
      .split('\n')
59
      .map<String>((String line) => line.trim())
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
      .join('\n')
      .trim() + ',';

    File findThisTestFile(Directory directory) {
      for (FileSystemEntity entity in directory.listSync()) {
        if (entity is Directory) {
          final File childSearch = findThisTestFile(entity);
          if (childSearch != null) {
            return childSearch;
          }
        } else if (entity is File && entity.path.endsWith('semantics_tester_generateTestSemanticsExpressionForCurrentSemanticsTree_test.dart')) {
          return entity;
        }
      }
      return null;
    }

    final File thisTestFile = findThisTestFile(Directory.current);
    expect(thisTestFile, isNotNull);
    String expectedCode = thisTestFile.readAsStringSync();
    expectedCode = expectedCode.substring(
81 82
      expectedCode.indexOf('v' * 12) + 12,
      expectedCode.indexOf('^' * 12) - 3,
83 84
    )
      .split('\n')
85
      .map<String>((String line) => line.trim())
86 87 88 89 90 91 92
      .join('\n')
      .trim();
    semantics.dispose();
    expect(code, expectedCode);
  });

  testWidgets('generated code is correct', (WidgetTester tester) async {
93
    final SemanticsTester semantics = SemanticsTester(tester);
94 95 96 97
    await pumpTestWidget(tester);
    expect(
      semantics,
      hasSemantics(
98
        // The code below delimited by "v" and "^" characters is generated by
99 100 101 102
        // generateTestSemanticsExpressionForCurrentSemanticsTree function.
        // You must update it when changing the output generated by
        // generateTestSemanticsExpressionForCurrentSemanticsTree. Otherwise,
        // the test 'generates code', defined above, will fail.
103
        // vvvvvvvvvvvv
104
        TestSemantics.root(
105
          children: <TestSemantics>[
106
            TestSemantics(
107
              id: 1,
108
              textDirection: TextDirection.ltr,
109
              children: <TestSemantics>[
110
                TestSemantics(
111
                  id: 2,
112
                  flags: <SemanticsFlag>[SemanticsFlag.scopesRoute],
113
                  children: <TestSemantics>[
114
                    TestSemantics(
115
                      id: 3,
116
                      children: <TestSemantics>[
117
                        TestSemantics(
118
                          id: 6,
119
                          flags: <SemanticsFlag>[SemanticsFlag.hasImplicitScrolling],
120
                          children: <TestSemantics>[
121
                            TestSemantics(
122 123 124 125 126
                              id: 4,
                              tags: <SemanticsTag>[const SemanticsTag('RenderViewport.twoPane')],
                              label: 'Plain text',
                              textDirection: TextDirection.ltr,
                            ),
127
                            TestSemantics(
128 129 130 131 132 133 134 135 136 137 138 139
                              id: 5,
                              tags: <SemanticsTag>[const SemanticsTag('RenderViewport.twoPane')],
                              flags: <SemanticsFlag>[SemanticsFlag.hasCheckedState, SemanticsFlag.isChecked, SemanticsFlag.isSelected],
                              actions: <SemanticsAction>[SemanticsAction.tap, SemanticsAction.decrease],
                              label: '‪Interactive text‬',
                              value: 'test-value',
                              increasedValue: 'test-increasedValue',
                              decreasedValue: 'test-decreasedValue',
                              hint: 'test-hint',
                              textDirection: TextDirection.rtl,
                            ),
                          ],
140 141
                        ),
                      ],
142 143 144 145 146 147 148
                    ),
                  ],
                ),
              ],
            ),
          ],
        ),
149
        // ^^^^^^^^^^^^
150 151 152
        ignoreRect: true,
        ignoreTransform: true,
        ignoreId: true,
153
      ),
154 155 156 157
    );
    semantics.dispose();
  });
}