blob: 687dcca0eeed3613bdabe504c074c2dacc5fcb6f [file]
// 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 'package:flutter_driver/flutter_driver.dart';
import 'package:test/test.dart' hide TypeMatcher, isInstanceOf;
void main() {
group('Texture rendering integration test', () {
late FlutterDriver driver;
setUpAll(() async {
driver = await FlutterDriver.connect();
});
tearDownAll(() async {
await driver.close();
});
test('renders red color when Red button is pressed', () async {
// Find the "Red" button.
final SerializableFinder redButton = find.text('Red');
await driver.waitFor(redButton);
// Take initial screenshot before changing the color to Red.
final List<int> initialScreenshot = await driver.screenshot(
format: ScreenshotFormat.rawStraightRgba,
);
final int initialRedPixels = countRedPixels(initialScreenshot);
// ignore: avoid_print
print('Initial red pixel count: $initialRedPixels');
// Initially, there shouldn't be a significant number of pixels matching the texture's red color.
expect(initialRedPixels, lessThan(100));
// Tap the "Red" button.
await driver.tap(redButton);
// Poll, taking screenshots and counting red pixels for up to 10 seconds (20 attempts of 500ms).
var afterRedPixels = 0;
var attempt = 1;
while (afterRedPixels < 10000) {
await Future<void>.delayed(const Duration(milliseconds: 500));
final List<int> afterScreenshot = await driver.screenshot(
format: ScreenshotFormat.rawStraightRgba,
);
afterRedPixels = countRedPixels(afterScreenshot);
// ignore: avoid_print
print('Attempt $attempt: after red pixel count = $afterRedPixels');
attempt++;
}
// The texture size is 300x300. Even with scaling/different device pixel ratio,
// there should be a substantial block of red pixels (at least several thousands).
expect(afterRedPixels, greaterThan(10000));
});
});
}
int countRedPixels(List<int> data) {
var count = 0;
for (var i = 0; i < data.length; i += 4) {
final int r = data[i];
final int g = data[i + 1];
final int b = data[i + 2];
if ((r - 0xf2).abs() < 5 && (g - 0x5d).abs() < 5 && (b - 0x50).abs() < 5) {
count++;
}
}
return count;
}