semantics_tester_generateTestSemanticsExpressionForCurrentSemanticsTree_test.dart 5.55 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 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
// 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();
  });

  Future<Null> pumpTestWidget(WidgetTester tester) async {
    await tester.pumpWidget(new MaterialApp(
      home: new ListView(
        children: <Widget>[
          const Text('Plain text'),
          new Semantics(
            selected: true,
            checked: true,
            onTap: () {},
            onDecrease: () {},
            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 {
    final SemanticsTester semantics = new SemanticsTester(tester);
    await pumpTestWidget(tester);
    final String code = semantics
57
      .generateTestSemanticsExpressionForCurrentSemanticsTree(DebugSemanticsDumpOrder.inverseHitTest)
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
      .split('\n')
      .map((String line) => line.trim())
      .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 85 86 87 88 89 90 91 92 93 94 95 96 97
    )
      .split('\n')
      .map((String line) => line.trim())
      .join('\n')
      .trim();
    semantics.dispose();
    expect(code, expectedCode);
  });

  testWidgets('generated code is correct', (WidgetTester tester) async {
    final SemanticsTester semantics = new SemanticsTester(tester);
    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
        new TestSemantics.root(
105 106
          children: <TestSemantics>[
            new TestSemantics(
107
              id: 1,
108
              textDirection: TextDirection.ltr,
109 110
              children: <TestSemantics>[
                new TestSemantics(
111
                  id: 2,
112
                  flags: <SemanticsFlag>[SemanticsFlag.scopesRoute],
113 114
                  children: <TestSemantics>[
                    new TestSemantics(
115
                      id: 3,
116 117
                      children: <TestSemantics>[
                        new TestSemantics(
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
                          id: 6,
                          children: <TestSemantics>[
                            new TestSemantics(
                              id: 4,
                              tags: <SemanticsTag>[const SemanticsTag('RenderViewport.twoPane')],
                              label: 'Plain text',
                              textDirection: TextDirection.ltr,
                            ),
                            new TestSemantics(
                              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,
                            ),
                          ],
139 140
                        ),
                      ],
141 142 143 144 145 146 147
                    ),
                  ],
                ),
              ],
            ),
          ],
        ),
148
        // ^^^^^^^^^^^^
149 150 151 152 153 154 155 156
        ignoreRect: true,
        ignoreTransform: true,
        ignoreId: true,
      )
    );
    semantics.dispose();
  });
}