extension_test.dart 4.31 KB
Newer Older
1 2 3 4
// Copyright 2016 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.

5
import 'package:flutter/rendering.dart';
6
import 'package:flutter/scheduler.dart';
7
import 'package:flutter/widgets.dart';
8 9 10
import 'package:flutter_driver/src/common/find.dart';
import 'package:flutter_driver/src/common/request_data.dart';
import 'package:flutter_driver/src/extension/extension.dart';
11 12 13 14 15 16
import 'package:flutter_test/flutter_test.dart';

void main() {
  group('waitUntilNoTransientCallbacks', () {
    FlutterDriverExtension extension;
    Map<String, dynamic> result;
17 18
    int messageId = 0;
    final List<String> log = <String>[];
19 20 21

    setUp(() {
      result = null;
22
      extension = FlutterDriverExtension((String message) async { log.add(message); return (messageId += 1).toString(); }, false);
23 24 25
    });

    testWidgets('returns immediately when transient callback queue is empty', (WidgetTester tester) async {
26
      extension.call(WaitUntilNoTransientCallbacks().serialize())
27 28 29
        .then<void>(expectAsync1((Map<String, dynamic> r) {
          result = r;
        }));
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

      await tester.idle();
      expect(
          result,
          <String, dynamic>{
            'isError': false,
            'response': null,
          },
      );
    });

    testWidgets('waits until no transient callbacks', (WidgetTester tester) async {
      SchedulerBinding.instance.scheduleFrameCallback((_) {
        // Intentionally blank. We only care about existence of a callback.
      });

46
      extension.call(WaitUntilNoTransientCallbacks().serialize())
47 48 49
        .then<void>(expectAsync1((Map<String, dynamic> r) {
          result = r;
        }));
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64

      // Nothing should happen until the next frame.
      await tester.idle();
      expect(result, isNull);

      // NOW we should receive the result.
      await tester.pump();
      expect(
          result,
          <String, dynamic>{
            'isError': false,
            'response': null,
          },
      );
    });
65 66 67

    testWidgets('handler', (WidgetTester tester) async {
      expect(log, isEmpty);
68
      final dynamic result = RequestDataResult.fromJson((await extension.call(RequestData('hello').serialize()))['response']);
69 70 71
      expect(log, <String>['hello']);
      expect(result.message, '1');
    });
72
  });
73 74 75 76

  group('getSemanticsId', () {
    FlutterDriverExtension extension;
    setUp(() {
77
      extension = FlutterDriverExtension((String arg) async => '', true);
78 79 80 81 82 83
    });

    testWidgets('works when semantics are enabled', (WidgetTester tester) async {
      final SemanticsHandle semantics = RendererBinding.instance.pipelineOwner.ensureSemantics();
      await tester.pumpWidget(
        const Text('hello', textDirection: TextDirection.ltr));
84

85
      final Map<String, Object> arguments = GetSemanticsId(ByText('hello')).serialize();
86
      final GetSemanticsIdResult result = GetSemanticsIdResult.fromJson((await extension.call(arguments))['response']);
87

88 89 90 91 92 93 94
      expect(result.id, 1);
      semantics.dispose();
    });

    testWidgets('throws state error if no data is found', (WidgetTester tester) async {
      await tester.pumpWidget(
        const Text('hello', textDirection: TextDirection.ltr));
95

96
      final Map<String, Object> arguments = GetSemanticsId(ByText('hello')).serialize();
97
      final Map<String, Object> response = await extension.call(arguments);
98

99 100 101 102 103 104 105
      expect(response['isError'], true);
      expect(response['response'], contains('Bad state: No semantics data found'));
    });

    testWidgets('throws state error multiple matches are found', (WidgetTester tester) async {
      final SemanticsHandle semantics = RendererBinding.instance.pipelineOwner.ensureSemantics();
      await tester.pumpWidget(
106
        Directionality(
107
          textDirection: TextDirection.ltr,
108
          child: ListView(children: const <Widget>[
109 110
            SizedBox(width: 100.0, height: 100.0, child: Text('hello')),
            SizedBox(width: 100.0, height: 100.0, child: Text('hello')),
111 112 113
          ]),
        ),
      );
114

115
      final Map<String, Object> arguments = GetSemanticsId(ByText('hello')).serialize();
116
      final Map<String, Object> response = await extension.call(arguments);
117

118 119 120 121 122
      expect(response['isError'], true);
      expect(response['response'], contains('Bad state: Too many elements'));
      semantics.dispose();
    });
  });
123
}