widget_inspector_test_utils.dart 2.32 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
// 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 'dart:async';
import 'dart:convert';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';

class TestWidgetInspectorService extends Object with WidgetInspectorService {
14
  final Map<String, ServiceExtensionCallback> extensions = <String, ServiceExtensionCallback>{};
15

16
  final Map<String, List<Map<Object, Object?>>> eventsDispatched = <String, List<Map<Object, Object?>>>{};
17 18 19

  @override
  void registerServiceExtension({
20 21
    required String name,
    required ServiceExtensionCallback callback,
22 23 24 25 26 27
  }) {
    assert(!extensions.containsKey(name));
    extensions[name] = callback;
  }

  @override
28
  void postEvent(String eventKind, Map<Object, Object?> eventData) {
29 30 31
    getEventsDispatched(eventKind).add(eventData);
  }

32
  List<Map<Object, Object?>> getEventsDispatched(String eventKind) {
33
    return eventsDispatched.putIfAbsent(eventKind, () => <Map<Object, Object?>>[]);
34 35
  }

36
  Iterable<Map<Object, Object?>> getServiceExtensionStateChangedEvents(String extensionName) {
37
    return getEventsDispatched('Flutter.ServiceExtensionStateChanged')
38
      .where((Map<Object, Object?> event) => event['extension'] == extensionName);
39 40
  }

41
  Future<Object?> testExtension(String name, Map<String, String> arguments) async {
42 43 44
    expect(extensions, contains(name));
    // Encode and decode to JSON to match behavior using a real service
    // extension where only JSON is allowed.
45
    return json.decode(json.encode(await extensions[name]!(arguments)))['result'];
46 47 48 49 50 51
  }

  Future<String> testBoolExtension(String name, Map<String, String> arguments) async {
    expect(extensions, contains(name));
    // Encode and decode to JSON to match behavior using a real service
    // extension where only JSON is allowed.
52
    return json.decode(json.encode(await extensions[name]!(arguments)))['enabled'] as String;
53 54 55 56 57 58 59
  }

  int rebuildCount = 0;

  @override
  Future<void> forceRebuild() async {
    rebuildCount++;
60
    final WidgetsBinding binding = WidgetsBinding.instance!;
61 62

    if (binding.renderViewElement != null) {
63
      binding.buildOwner!.reassemble(binding.renderViewElement!);
64 65 66
    }
  }
}