blob: b6bdfe4f3de409ae81bd059d226b16747ad808bb [file] [log] [blame]
// 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:ui';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'utils/fake_and_mock_utils.dart';
void main() {
group('TestDisplay', () {
Display trueDisplay() => PlatformDispatcher.instance.displays.single;
TestDisplay boundDisplay() => WidgetsBinding.instance.platformDispatcher.displays.single as TestDisplay;
tearDown(() {
boundDisplay().reset();
});
testWidgets('can handle new methods without breaking', (WidgetTester tester) async {
final dynamic testDisplay = tester.view.display;
//ignore: avoid_dynamic_calls
expect(testDisplay.someNewProperty, null);
});
testWidgets('can fake devicePixelRatio', (WidgetTester tester) async {
verifyPropertyFaked<double>(
tester: tester,
realValue: trueDisplay().devicePixelRatio,
fakeValue: trueDisplay().devicePixelRatio + 1,
propertyRetriever: () => boundDisplay().devicePixelRatio,
propertyFaker: (_, double fake) {
boundDisplay().devicePixelRatio = fake;
},
);
});
testWidgets('can reset devicePixelRatio', (WidgetTester tester) async {
verifyPropertyReset<double>(
tester: tester,
fakeValue: trueDisplay().devicePixelRatio + 1,
propertyRetriever: () => boundDisplay().devicePixelRatio,
propertyResetter: () => boundDisplay().resetDevicePixelRatio(),
propertyFaker: (double fake) {
boundDisplay().devicePixelRatio = fake;
},
);
});
testWidgets('resetting devicePixelRatio also resets view.devicePixelRatio', (WidgetTester tester) async {
verifyPropertyReset(
tester: tester,
fakeValue: trueDisplay().devicePixelRatio + 1,
propertyRetriever: () => tester.view.devicePixelRatio,
propertyResetter: () => boundDisplay().resetDevicePixelRatio(),
propertyFaker: (double dpr) => boundDisplay().devicePixelRatio = dpr,
);
});
testWidgets('updating devicePixelRatio also updates view.devicePixelRatio', (WidgetTester tester) async {
tester.view.display.devicePixelRatio = tester.view.devicePixelRatio + 1;
expect(tester.view.devicePixelRatio, tester.view.display.devicePixelRatio);
});
testWidgets('can fake refreshRate', (WidgetTester tester) async {
verifyPropertyFaked<double>(
tester: tester,
realValue: trueDisplay().refreshRate,
fakeValue: trueDisplay().refreshRate + 1,
propertyRetriever: () => boundDisplay().refreshRate,
propertyFaker: (_, double fake) {
boundDisplay().refreshRate = fake;
},
);
});
testWidgets('can reset refreshRate', (WidgetTester tester) async {
verifyPropertyReset<double>(
tester: tester,
fakeValue: trueDisplay().refreshRate + 1,
propertyRetriever: () => boundDisplay().refreshRate,
propertyResetter: () => boundDisplay().resetRefreshRate(),
propertyFaker: (double fake) {
boundDisplay().refreshRate = fake;
},
);
});
testWidgets('can fake size', (WidgetTester tester) async {
verifyPropertyFaked<Size>(
tester: tester,
realValue: trueDisplay().size,
fakeValue: const Size(354, 856),
propertyRetriever: () => boundDisplay().size,
propertyFaker: (_, Size fake) {
boundDisplay().size = fake;
},
);
});
testWidgets('can reset size', (WidgetTester tester) async {
verifyPropertyReset<Size>(
tester: tester,
fakeValue: const Size(465, 980),
propertyRetriever: () => boundDisplay().size,
propertyResetter: () => boundDisplay().resetSize(),
propertyFaker: (Size fake) {
boundDisplay().size = fake;
},
);
});
testWidgets('can reset all values', (WidgetTester tester) async {
final DisplaySnapshot initial = DisplaySnapshot(tester.view.display);
tester.view.display.devicePixelRatio = 7;
tester.view.display.refreshRate = 40;
tester.view.display.size = const Size(476, 823);
final DisplaySnapshot faked = DisplaySnapshot(tester.view.display);
tester.view.display.reset();
final DisplaySnapshot reset = DisplaySnapshot(tester.view.display);
expect(initial, isNot(matchesSnapshot(faked)));
expect(initial, matchesSnapshot(reset));
});
});
}
class DisplaySnapshot {
DisplaySnapshot(Display display) :
devicePixelRatio = display.devicePixelRatio,
refreshRate = display.refreshRate,
id = display.id,
size = display.size;
final double devicePixelRatio;
final double refreshRate;
final int id;
final Size size;
}
Matcher matchesSnapshot(DisplaySnapshot expected) => _DisplaySnapshotMatcher(expected);
class _DisplaySnapshotMatcher extends Matcher {
_DisplaySnapshotMatcher(this.expected);
final DisplaySnapshot expected;
@override
Description describe(Description description) {
description.add('snapshot of a Display matches');
return description;
}
@override
Description describeMismatch(dynamic item, Description mismatchDescription, Map<dynamic, dynamic> matchState, bool verbose) {
assert(item is DisplaySnapshot, 'Can only match against snapshots of Display.');
final DisplaySnapshot actual = item as DisplaySnapshot;
if (actual.devicePixelRatio != expected.devicePixelRatio) {
mismatchDescription.add('actual.devicePixelRatio (${actual.devicePixelRatio}) did not match expected.devicePixelRatio (${expected.devicePixelRatio})');
}
if (actual.refreshRate != expected.refreshRate) {
mismatchDescription.add('actual.refreshRate (${actual.refreshRate}) did not match expected.refreshRate (${expected.refreshRate})');
}
if (actual.size != expected.size) {
mismatchDescription.add('actual.size (${actual.size}) did not match expected.size (${expected.size})');
}
if (actual.id != expected.id) {
mismatchDescription.add('actual.id (${actual.id}) did not match expected.id (${expected.id})');
}
return mismatchDescription;
}
@override
bool matches(dynamic item, Map<dynamic, dynamic> matchState) {
assert(item is DisplaySnapshot, 'Can only match against snapshots of Display.');
final DisplaySnapshot actual = item as DisplaySnapshot;
return actual.devicePixelRatio == expected.devicePixelRatio &&
actual.refreshRate == expected.refreshRate &&
actual.size == expected.size &&
actual.id == expected.id;
}
}