Attempting to fix test loading of images.

This commit is contained in:
Greg Spencer
2018-07-06 16:27:24 -07:00
parent 561164f154
commit b6c946793d

View File

@ -4,23 +4,72 @@
import 'dart:async'; import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'dart:typed_data';
import 'dart:ui' as ui
show Image, Codec, FrameInfo, instantiateImageCodec, ImageByteFormat;
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
import 'package:palette_generator/palette_generator.dart'; import 'package:palette_generator/palette_generator.dart';
/// An image provider implementation for testing that takes a pre-loaded image.
/// This avoids handling asynchronous I/O in the test zone, which is
/// problematic.
class FakeImageProvider extends ImageProvider<FakeImageProvider> {
const FakeImageProvider(this._image, {this.scale = 1.0});
final ui.Image _image;
/// The scale to place in the [ImageInfo] object of the image.
final double scale;
@override
Future<FakeImageProvider> obtainKey(ImageConfiguration configuration) {
return new SynchronousFuture<FakeImageProvider>(this);
}
@override
ImageStreamCompleter load(FakeImageProvider key) {
assert(key == this);
return new OneFrameImageStreamCompleter(
new SynchronousFuture<ImageInfo>(
new ImageInfo(image: _image, scale: scale),
),
);
}
}
Future<ImageProvider> loadImage(String name) async { Future<ImageProvider> loadImage(String name) async {
File imagePath = new File(path.joinAll(<String>['assets', name])); File imagePath = new File(path.joinAll(<String>['assets', name]));
if (path.split(Directory.current.absolute.path).last != 'test') { if (path.split(Directory.current.absolute.path).last != 'test') {
imagePath = new File(path.join('test', imagePath.path)); imagePath = new File(path.join('test', imagePath.path));
} }
return new FileImage(imagePath); final Uint8List data = new Uint8List.fromList(imagePath.readAsBytesSync());
final ui.Codec codec = await ui.instantiateImageCodec(data);
final ui.FrameInfo frameInfo = await codec.getNextFrame();
return new FakeImageProvider(frameInfo.image);
} }
void main() { void main() async {
test('PaletteGenerator works on 1-pixel wide blue image', () async { // Load the images outside of the test zone so that IO doesn't get
final ImageProvider image = await loadImage('tall_blue.png'); // complicated.
final List<String> imageNames = <String>[
'tall_blue',
'wide_red',
'dominant',
'landscape'
];
final Map<String, ImageProvider> testImages = <String, ImageProvider>{};
for (String name in imageNames) {
testImages[name] = await loadImage('$name.png');
}
testWidgets('PaletteGenerator works on 1-pixel wide blue image',
(WidgetTester tester) async {
tester.pump();
final ImageProvider image = testImages['tall_blue'];
final PaletteGenerator palette = final PaletteGenerator palette =
await PaletteGenerator.fromImageProvider(image); await PaletteGenerator.fromImageProvider(image);
expect(palette.paletteColors.length, equals(1)); expect(palette.paletteColors.length, equals(1));
@ -28,8 +77,9 @@ void main() {
within<Color>(distance: 8, from: const Color(0xff0000ff))); within<Color>(distance: 8, from: const Color(0xff0000ff)));
}); });
test('PaletteGenerator works on 1-pixel high red image', () async { testWidgets('PaletteGenerator works on 1-pixel high red image',
final ImageProvider image = await loadImage('wide_red.png'); (WidgetTester tester) async {
final ImageProvider image = testImages['wide_red'];
final PaletteGenerator palette = final PaletteGenerator palette =
await PaletteGenerator.fromImageProvider(image); await PaletteGenerator.fromImageProvider(image);
expect(palette.paletteColors.length, equals(1)); expect(palette.paletteColors.length, equals(1));
@ -37,8 +87,9 @@ void main() {
within<Color>(distance: 8, from: const Color(0xffff0000))); within<Color>(distance: 8, from: const Color(0xffff0000)));
}); });
test('PaletteGenerator finds dominant color and text colors', () async { testWidgets('PaletteGenerator finds dominant color and text colors',
final ImageProvider image = await loadImage('dominant.png'); (WidgetTester tester) async {
final ImageProvider image = testImages['dominant'];
final PaletteGenerator palette = final PaletteGenerator palette =
await PaletteGenerator.fromImageProvider(image); await PaletteGenerator.fromImageProvider(image);
expect(palette.paletteColors.length, equals(3)); expect(palette.paletteColors.length, equals(3));
@ -50,8 +101,9 @@ void main() {
within<Color>(distance: 8, from: const Color(0xda000000))); within<Color>(distance: 8, from: const Color(0xda000000)));
}); });
test('PaletteGenerator works with regions', () async { testWidgets('PaletteGenerator works with regions',
final ImageProvider image = await loadImage('dominant.png'); (WidgetTester tester) async {
final ImageProvider image = testImages['dominant'];
Rect region = new Rect.fromLTRB(0.0, 0.0, 100.0, 100.0); Rect region = new Rect.fromLTRB(0.0, 0.0, 100.0, 100.0);
PaletteGenerator palette = PaletteGenerator palette =
await PaletteGenerator.fromImageProvider(image, region: region); await PaletteGenerator.fromImageProvider(image, region: region);
@ -72,8 +124,9 @@ void main() {
within<Color>(distance: 8, from: const Color(0xff00ff00))); within<Color>(distance: 8, from: const Color(0xff00ff00)));
}); });
test('PaletteGenerator works as expected on a real image', () async { testWidgets('PaletteGenerator works as expected on a real image',
final ImageProvider image = await loadImage('landscape.png'); (WidgetTester tester) async {
final ImageProvider image = testImages['landscape'];
final PaletteGenerator palette = final PaletteGenerator palette =
await PaletteGenerator.fromImageProvider(image); await PaletteGenerator.fromImageProvider(image);
final List<PaletteColor> expectedSwatches = <PaletteColor>[ final List<PaletteColor> expectedSwatches = <PaletteColor>[
@ -113,8 +166,9 @@ void main() {
expect(palette.colors.length, equals(palette.paletteColors.length)); expect(palette.colors.length, equals(palette.paletteColors.length));
}); });
test('PaletteGenerator limits max colors', () async { testWidgets('PaletteGenerator limits max colors',
final ImageProvider image = await loadImage('landscape.png'); (WidgetTester tester) async {
final ImageProvider image = testImages['landscape'];
PaletteGenerator palette = PaletteGenerator palette =
await PaletteGenerator.fromImageProvider(image, maximumColorCount: 32); await PaletteGenerator.fromImageProvider(image, maximumColorCount: 32);
expect(palette.paletteColors.length, equals(31)); expect(palette.paletteColors.length, equals(31));
@ -126,8 +180,8 @@ void main() {
expect(palette.paletteColors.length, equals(15)); expect(palette.paletteColors.length, equals(15));
}); });
test('PaletteGenerator Filters work', () async { testWidgets('PaletteGenerator Filters work', (WidgetTester tester) async {
final ImageProvider image = await loadImage('landscape.png'); final ImageProvider image = testImages['landscape'];
// First, test that supplying the default filter is the same as not supplying one. // First, test that supplying the default filter is the same as not supplying one.
List<PaletteFilter> filters = <PaletteFilter>[ List<PaletteFilter> filters = <PaletteFilter>[
avoidRedBlackWhitePaletteFilter avoidRedBlackWhitePaletteFilter
@ -225,8 +279,8 @@ void main() {
expect(palette.colors, isEmpty); expect(palette.colors, isEmpty);
}); });
test('PaletteGenerator targets work', () async { testWidgets('PaletteGenerator targets work', (WidgetTester tester) async {
final ImageProvider image = await loadImage('landscape.png'); final ImageProvider image = testImages['landscape'];
// Passing an empty set of targets works the same as passing a null targets // Passing an empty set of targets works the same as passing a null targets
// list. // list.
PaletteGenerator palette = await PaletteGenerator PaletteGenerator palette = await PaletteGenerator
@ -260,8 +314,9 @@ void main() {
equals(const Color(0xff6e80a2))); equals(const Color(0xff6e80a2)));
}); });
test('PaletteGenerator produces consistent results', () async { testWidgets('PaletteGenerator produces consistent results',
final ImageProvider image = await loadImage('landscape.png'); (WidgetTester tester) async {
final ImageProvider image = testImages['landscape'];
PaletteGenerator lastPalette = PaletteGenerator lastPalette =
await PaletteGenerator.fromImageProvider(image); await PaletteGenerator.fromImageProvider(image);