Unverified Commit 8df0d655 authored by Kate Lovett's avatar Kate Lovett Committed by GitHub

Skia Gold Support for Local & PreSubmit Testing in package:flutter (#40710)

parent 31a4ff80
65bd07204149c4f7612bbf179cf088a2d69ca549
...@@ -45,7 +45,7 @@ void main() { ...@@ -45,7 +45,7 @@ void main() {
await expectLater( await expectLater(
find.byKey(key), find.byKey(key),
matchesGoldenFile('activityIndicator.paused.light.png', version: 0), matchesGoldenFile('activityIndicator.paused.light.png'),
); );
await tester.pumpWidget( await tester.pumpWidget(
...@@ -65,7 +65,7 @@ void main() { ...@@ -65,7 +65,7 @@ void main() {
await expectLater( await expectLater(
find.byKey(key), find.byKey(key),
matchesGoldenFile('activityIndicator.paused.dark.png', version: 0), matchesGoldenFile('activityIndicator.paused.dark.png'),
); );
}); });
......
...@@ -922,10 +922,7 @@ void main() { ...@@ -922,10 +922,7 @@ void main() {
await expectLater( await expectLater(
find.byType(CupertinoDatePicker), find.byType(CupertinoDatePicker),
matchesGoldenFile( matchesGoldenFile('date_picker_test.datetime.initial.png'),
'date_picker_test.datetime.initial.png',
version: 2,
),
); );
// Slightly drag the hour component to make the current hour off-center. // Slightly drag the hour component to make the current hour off-center.
...@@ -934,10 +931,7 @@ void main() { ...@@ -934,10 +931,7 @@ void main() {
await expectLater( await expectLater(
find.byType(CupertinoDatePicker), find.byType(CupertinoDatePicker),
matchesGoldenFile( matchesGoldenFile('date_picker_test.datetime.drag.png'),
'date_picker_test.datetime.drag.png',
version: 2,
),
); );
}); });
}); });
...@@ -971,10 +965,7 @@ void main() { ...@@ -971,10 +965,7 @@ void main() {
await expectLater( await expectLater(
find.byType(CupertinoTimerPicker), find.byType(CupertinoTimerPicker),
matchesGoldenFile( matchesGoldenFile('timer_picker_test.datetime.initial.png'),
'timer_picker_test.datetime.initial.png',
version: 1,
),
); );
// Slightly drag the minute component to make the current minute off-center. // Slightly drag the minute component to make the current minute off-center.
...@@ -983,10 +974,7 @@ void main() { ...@@ -983,10 +974,7 @@ void main() {
await expectLater( await expectLater(
find.byType(CupertinoTimerPicker), find.byType(CupertinoTimerPicker),
matchesGoldenFile( matchesGoldenFile('timer_picker_test.datetime.drag.png'),
'timer_picker_test.datetime.drag.png',
version: 1,
),
); );
}); });
......
...@@ -820,10 +820,7 @@ void main() { ...@@ -820,10 +820,7 @@ void main() {
await expectLater( await expectLater(
find.byType(RepaintBoundary).last, find.byType(RepaintBoundary).last,
matchesGoldenFile( matchesGoldenFile('nav_bar_test.standard_title.png'),
'nav_bar_test.standard_title.png',
version: 2,
),
); );
}, },
); );
...@@ -854,10 +851,7 @@ void main() { ...@@ -854,10 +851,7 @@ void main() {
await expectLater( await expectLater(
find.byType(RepaintBoundary).last, find.byType(RepaintBoundary).last,
matchesGoldenFile( matchesGoldenFile('nav_bar_test.large_title.png'),
'nav_bar_test.large_title.png',
version: 2,
),
); );
}, },
); );
......
...@@ -1414,10 +1414,7 @@ void main() { ...@@ -1414,10 +1414,7 @@ void main() {
await expectLater( await expectLater(
find.byType(RepaintBoundary), find.byType(RepaintBoundary),
matchesGoldenFile( matchesGoldenFile('segmented_control_test.0.png'),
'segmented_control_test.0.png',
version: 0,
),
); );
}); });
...@@ -1455,10 +1452,7 @@ void main() { ...@@ -1455,10 +1452,7 @@ void main() {
await expectLater( await expectLater(
find.byType(RepaintBoundary), find.byType(RepaintBoundary),
matchesGoldenFile( matchesGoldenFile('segmented_control_test.1.png'),
'segmented_control_test.1.png',
version: 0,
),
); );
}); });
} }
...@@ -542,10 +542,7 @@ void main() { ...@@ -542,10 +542,7 @@ void main() {
await expectLater( await expectLater(
find.byKey(switchKey), find.byKey(switchKey),
matchesGoldenFile( matchesGoldenFile('switch.tap.off.png'),
'switch.tap.off.png',
version: 1,
),
); );
await tester.tap(find.byKey(switchKey)); await tester.tap(find.byKey(switchKey));
...@@ -556,19 +553,13 @@ void main() { ...@@ -556,19 +553,13 @@ void main() {
await tester.pump(const Duration(milliseconds: 60)); await tester.pump(const Duration(milliseconds: 60));
await expectLater( await expectLater(
find.byKey(switchKey), find.byKey(switchKey),
matchesGoldenFile( matchesGoldenFile('switch.tap.turningOn.png'),
'switch.tap.turningOn.png',
version: 1,
),
); );
await tester.pumpAndSettle(); await tester.pumpAndSettle();
await expectLater( await expectLater(
find.byKey(switchKey), find.byKey(switchKey),
matchesGoldenFile( matchesGoldenFile('switch.tap.on.png'),
'switch.tap.on.png',
version: 1,
),
); );
}); });
...@@ -604,10 +595,7 @@ void main() { ...@@ -604,10 +595,7 @@ void main() {
await expectLater( await expectLater(
find.byKey(switchKey), find.byKey(switchKey),
matchesGoldenFile( matchesGoldenFile('switch.tap.off.dark.png'),
'switch.tap.off.dark.png',
version: 0,
),
); );
await tester.tap(find.byKey(switchKey)); await tester.tap(find.byKey(switchKey));
...@@ -616,10 +604,7 @@ void main() { ...@@ -616,10 +604,7 @@ void main() {
await tester.pumpAndSettle(); await tester.pumpAndSettle();
await expectLater( await expectLater(
find.byKey(switchKey), find.byKey(switchKey),
matchesGoldenFile( matchesGoldenFile('switch.tap.on.dark.png'),
'switch.tap.on.dark.png',
version: 0,
),
); );
}); });
} }
...@@ -503,10 +503,7 @@ void main() { ...@@ -503,10 +503,7 @@ void main() {
await expectLater( await expectLater(
find.byKey(const ValueKey<int>(1)), find.byKey(const ValueKey<int>(1)),
matchesGoldenFile( matchesGoldenFile('text_field_cursor_test.cupertino.0.png'),
'text_field_cursor_test.cupertino.0.png',
version: 3,
),
); );
}); });
...@@ -536,10 +533,7 @@ void main() { ...@@ -536,10 +533,7 @@ void main() {
debugDefaultTargetPlatformOverride = null; debugDefaultTargetPlatformOverride = null;
await expectLater( await expectLater(
find.byKey(const ValueKey<int>(1)), find.byKey(const ValueKey<int>(1)),
matchesGoldenFile( matchesGoldenFile('text_field_cursor_test.cupertino.1.png'),
'text_field_cursor_test.cupertino.1.png',
version: 3,
),
); );
}); });
...@@ -3042,10 +3036,7 @@ void main() { ...@@ -3042,10 +3036,7 @@ void main() {
await expectLater( await expectLater(
find.byKey(const ValueKey<int>(1)), find.byKey(const ValueKey<int>(1)),
matchesGoldenFile( matchesGoldenFile('text_field_test.disabled.png'),
'text_field_test.disabled.png',
version: 1,
),
); );
}); });
......
...@@ -71,19 +71,13 @@ void main() { ...@@ -71,19 +71,13 @@ void main() {
await pump(FloatingActionButtonLocation.endDocked); await pump(FloatingActionButtonLocation.endDocked);
await expectLater( await expectLater(
find.byKey(key), find.byKey(key),
matchesGoldenFile( matchesGoldenFile('bottom_app_bar.custom_shape.1.png'),
'bottom_app_bar.custom_shape.1.png',
version: null,
),
); );
await pump(FloatingActionButtonLocation.centerDocked); await pump(FloatingActionButtonLocation.centerDocked);
await tester.pumpAndSettle(); await tester.pumpAndSettle();
await expectLater( await expectLater(
find.byKey(key), find.byKey(key),
matchesGoldenFile( matchesGoldenFile('bottom_app_bar.custom_shape.2.png'),
'bottom_app_bar.custom_shape.2.png',
version: null,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
......
...@@ -80,10 +80,7 @@ void main() { ...@@ -80,10 +80,7 @@ void main() {
await expectLater( await expectLater(
find.byKey(_painterKey), find.byKey(_painterKey),
matchesGoldenFile( matchesGoldenFile('bottom_app_bar_theme.custom_shape.png'),
'bottom_app_bar_theme.custom_shape.png',
version: null,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
......
...@@ -1426,10 +1426,7 @@ void main() { ...@@ -1426,10 +1426,7 @@ void main() {
await tester.pump(const Duration(milliseconds: 30)); await tester.pump(const Duration(milliseconds: 30));
await expectLater( await expectLater(
find.byType(BottomNavigationBar), find.byType(BottomNavigationBar),
matchesGoldenFile( matchesGoldenFile('bottom_navigation_bar.shifting_transition.$pump.png'),
'bottom_navigation_bar.shifting_transition.$pump.png',
version: 2,
),
); );
} }
}, skip: isBrowser); }, skip: isBrowser);
......
...@@ -137,10 +137,7 @@ void main() { ...@@ -137,10 +137,7 @@ void main() {
await expectLater( await expectLater(
find.byKey(painterKey), find.byKey(painterKey),
matchesGoldenFile( matchesGoldenFile('card_theme.custom_shape.png'),
'card_theme.custom_shape.png',
version: null,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
} }
......
...@@ -130,10 +130,7 @@ void main() { ...@@ -130,10 +130,7 @@ void main() {
await expectLater( await expectLater(
find.byKey(_painterKey), find.byKey(_painterKey),
matchesGoldenFile( matchesGoldenFile('dialog_theme.dialog_with_custom_border.png'),
'dialog_theme.dialog_with_custom_border.png',
version: null,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
......
...@@ -227,10 +227,7 @@ void main() { ...@@ -227,10 +227,7 @@ void main() {
assert(tester.renderObject(buttonFinder).attached); assert(tester.renderObject(buttonFinder).attached);
await expectLater( await expectLater(
find.ancestor(of: buttonFinder, matching: find.byType(RepaintBoundary)).first, find.ancestor(of: buttonFinder, matching: find.byType(RepaintBoundary)).first,
matchesGoldenFile( matchesGoldenFile('dropdown_test.default.png'),
'dropdown_test.default.png',
version: 0,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
...@@ -242,10 +239,7 @@ void main() { ...@@ -242,10 +239,7 @@ void main() {
assert(tester.renderObject(buttonFinder).attached); assert(tester.renderObject(buttonFinder).attached);
await expectLater( await expectLater(
find.ancestor(of: buttonFinder, matching: find.byType(RepaintBoundary)).first, find.ancestor(of: buttonFinder, matching: find.byType(RepaintBoundary)).first,
matchesGoldenFile( matchesGoldenFile('dropdown_test.expanded.png'),
'dropdown_test.expanded.png',
version: 0,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
......
...@@ -740,10 +740,7 @@ void main() { ...@@ -740,10 +740,7 @@ void main() {
await tester.pump(const Duration(milliseconds: 1000)); await tester.pump(const Duration(milliseconds: 1000));
await expectLater( await expectLater(
find.byKey(key), find.byKey(key),
matchesGoldenFile( matchesGoldenFile('floating_action_button_test.clip.png'),
'floating_action_button_test.clip.png',
version: 2,
),
); );
}); });
......
...@@ -2960,19 +2960,13 @@ void main() { ...@@ -2960,19 +2960,13 @@ void main() {
await tester.pumpWidget(buildFrame(TextDirection.ltr)); await tester.pumpWidget(buildFrame(TextDirection.ltr));
await expectLater( await expectLater(
find.byType(InputDecorator), find.byType(InputDecorator),
matchesGoldenFile( matchesGoldenFile('input_decorator.outline_icon_label.ltr.png'),
'input_decorator.outline_icon_label.ltr.png',
version: null,
),
); );
await tester.pumpWidget(buildFrame(TextDirection.rtl)); await tester.pumpWidget(buildFrame(TextDirection.rtl));
await expectLater( await expectLater(
find.byType(InputDecorator), find.byType(InputDecorator),
matchesGoldenFile( matchesGoldenFile('input_decorator.outline_icon_label.rtl.png'),
'input_decorator.outline_icon_label.rtl.png',
version: null,
),
); );
}, },
); );
......
...@@ -715,10 +715,7 @@ void main() { ...@@ -715,10 +715,7 @@ void main() {
await expectLater( await expectLater(
find.byKey(painterKey), find.byKey(painterKey),
matchesGoldenFile( matchesGoldenFile('material.border_paint_above.png'),
'material.border_paint_above.png',
version: null,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
...@@ -758,10 +755,7 @@ void main() { ...@@ -758,10 +755,7 @@ void main() {
await expectLater( await expectLater(
find.byKey(painterKey), find.byKey(painterKey),
matchesGoldenFile( matchesGoldenFile('material.border_paint_below.png'),
'material.border_paint_below.png',
version: null,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
}); });
......
...@@ -276,10 +276,7 @@ void main() { ...@@ -276,10 +276,7 @@ void main() {
await tester.pumpAndSettle(); await tester.pumpAndSettle();
await expectLater( await expectLater(
find.byKey(painterKey), find.byKey(painterKey),
matchesGoldenFile( matchesGoldenFile('radio.ink_ripple.png'),
'radio.ink_ripple.png',
version: null,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
} }
......
...@@ -267,10 +267,7 @@ void main() { ...@@ -267,10 +267,7 @@ void main() {
await expectLater( await expectLater(
find.byKey(_painterKey), find.byKey(_painterKey),
matchesGoldenFile( matchesGoldenFile('tab_bar_theme.tab_indicator_size_tab.png'),
'tab_bar_theme.tab_indicator_size_tab.png',
version: null,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
...@@ -281,10 +278,7 @@ void main() { ...@@ -281,10 +278,7 @@ void main() {
await expectLater( await expectLater(
find.byKey(_painterKey), find.byKey(_painterKey),
matchesGoldenFile( matchesGoldenFile('tab_bar_theme.tab_indicator_size_label.png'),
'tab_bar_theme.tab_indicator_size_label.png',
version: null,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
...@@ -300,10 +294,7 @@ void main() { ...@@ -300,10 +294,7 @@ void main() {
await expectLater( await expectLater(
find.byKey(_painterKey), find.byKey(_painterKey),
matchesGoldenFile( matchesGoldenFile('tab_bar_theme.custom_tab_indicator.png'),
'tab_bar_theme.custom_tab_indicator.png',
version: null,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
...@@ -319,10 +310,7 @@ void main() { ...@@ -319,10 +310,7 @@ void main() {
await expectLater( await expectLater(
find.byKey(_painterKey), find.byKey(_painterKey),
matchesGoldenFile( matchesGoldenFile('tab_bar_theme.beveled_rect_indicator.png'),
'tab_bar_theme.beveled_rect_indicator.png',
version: null,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
} }
...@@ -412,10 +412,7 @@ void main() { ...@@ -412,10 +412,7 @@ void main() {
await expectLater( await expectLater(
find.byKey(const ValueKey<int>(1)), find.byKey(const ValueKey<int>(1)),
matchesGoldenFile( matchesGoldenFile('text_field_cursor_test.material.0.png'),
'text_field_cursor_test.material.0.png',
version: 0,
),
); );
}); });
...@@ -444,10 +441,7 @@ void main() { ...@@ -444,10 +441,7 @@ void main() {
debugDefaultTargetPlatformOverride = null; debugDefaultTargetPlatformOverride = null;
await expectLater( await expectLater(
find.byKey(const ValueKey<int>(1)), find.byKey(const ValueKey<int>(1)),
matchesGoldenFile( matchesGoldenFile('text_field_cursor_test.material.1.png'),
'text_field_cursor_test.material.1.png',
version: 0,
),
); );
}); });
...@@ -498,10 +492,7 @@ void main() { ...@@ -498,10 +492,7 @@ void main() {
await expectLater( await expectLater(
// The toolbar exists in the Overlay above the MaterialApp. // The toolbar exists in the Overlay above the MaterialApp.
find.byType(Overlay), find.byType(Overlay),
matchesGoldenFile( matchesGoldenFile('text_field_opacity_test.0.png'),
'text_field_opacity_test.0.png',
version: 3,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
......
...@@ -71,10 +71,7 @@ void main() { ...@@ -71,10 +71,7 @@ void main() {
await expectLater( await expectLater(
find.byType(RepaintBoundary), find.byType(RepaintBoundary),
matchesGoldenFile( matchesGoldenFile('continuous_rectangle_border.golden_test_even_radii.png'),
'continuous_rectangle_border.golden_test_even_radii.png',
version: null,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
...@@ -95,10 +92,7 @@ void main() { ...@@ -95,10 +92,7 @@ void main() {
await expectLater( await expectLater(
find.byType(RepaintBoundary), find.byType(RepaintBoundary),
matchesGoldenFile( matchesGoldenFile('continuous_rectangle_border.golden_test_varying_radii.png'),
'continuous_rectangle_border.golden_test_varying_radii.png',
version: null,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
...@@ -116,10 +110,7 @@ void main() { ...@@ -116,10 +110,7 @@ void main() {
await expectLater( await expectLater(
find.byType(RepaintBoundary), find.byType(RepaintBoundary),
matchesGoldenFile( matchesGoldenFile('continuous_rectangle_border.golden_test_large_radii.png'),
'continuous_rectangle_border.golden_test_large_radii.png',
version: null,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
......
...@@ -806,7 +806,10 @@ void main() { ...@@ -806,7 +806,10 @@ void main() {
), ),
), ),
)); ));
await expectLater(find.byKey(painterKey), matchesGoldenFile(goldenName)); await expectLater(
find.byKey(painterKey),
matchesGoldenFile(goldenName),
);
} }
testWidgets('Gradients - 45 degrees', (WidgetTester tester) async { testWidgets('Gradients - 45 degrees', (WidgetTester tester) async {
......
...@@ -49,10 +49,7 @@ void main() { ...@@ -49,10 +49,7 @@ void main() {
await expectLater( await expectLater(
find.byType(RichText), find.byType(RichText),
matchesGoldenFile( matchesGoldenFile('localized_fonts.rich_text.styled_text_span.png'),
'localized_fonts.rich_text.styled_text_span.png',
version: null,
),
); );
}, },
skip: isBrowser, // TODO(yjbanov): implement goldens on the Web: https://github.com/flutter/flutter/issues/40297 skip: isBrowser, // TODO(yjbanov): implement goldens on the Web: https://github.com/flutter/flutter/issues/40297
...@@ -104,10 +101,7 @@ void main() { ...@@ -104,10 +101,7 @@ void main() {
await expectLater( await expectLater(
find.byType(Row), find.byType(Row),
matchesGoldenFile( matchesGoldenFile('localized_fonts.text_ambient_locale.chars.png'),
'localized_fonts.text_ambient_locale.chars.png',
version: null,
),
); );
}, },
skip: isBrowser, // TODO(yjbanov): implement goldens on the Web: https://github.com/flutter/flutter/issues/40297 skip: isBrowser, // TODO(yjbanov): implement goldens on the Web: https://github.com/flutter/flutter/issues/40297
...@@ -151,10 +145,7 @@ void main() { ...@@ -151,10 +145,7 @@ void main() {
await expectLater( await expectLater(
find.byType(Row), find.byType(Row),
matchesGoldenFile( matchesGoldenFile('localized_fonts.text_explicit_locale.chars.png'),
'localized_fonts.text_explicit_locale.chars.png',
version: null,
),
); );
}, },
skip: isBrowser, // TODO(yjbanov): implement goldens on the Web: https://github.com/flutter/flutter/issues/40297 skip: isBrowser, // TODO(yjbanov): implement goldens on the Web: https://github.com/flutter/flutter/issues/40297
......
...@@ -43,10 +43,7 @@ void main() { ...@@ -43,10 +43,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(RepaintBoundary).first, find.byType(RepaintBoundary).first,
matchesGoldenFile( matchesGoldenFile('backdrop_filter_test.cull_rect.png'),
'backdrop_filter_test.cull_rect.png',
version: 1,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
} }
...@@ -375,10 +375,7 @@ void main() { ...@@ -375,10 +375,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(RepaintBoundary).first, find.byType(RepaintBoundary).first,
matchesGoldenFile( matchesGoldenFile('clip.ClipRect.png'),
'clip.ClipRect.png',
version: 1,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
...@@ -418,10 +415,7 @@ void main() { ...@@ -418,10 +415,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(RepaintBoundary).first, find.byType(RepaintBoundary).first,
matchesGoldenFile( matchesGoldenFile('clip.ClipRectOverlay.png'),
'clip.ClipRectOverlay.png',
version: 1,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
...@@ -470,10 +464,7 @@ void main() { ...@@ -470,10 +464,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(RepaintBoundary).first, find.byType(RepaintBoundary).first,
matchesGoldenFile( matchesGoldenFile('clip.ClipRRect.png'),
'clip.ClipRRect.png',
version: 1,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
...@@ -516,10 +507,7 @@ void main() { ...@@ -516,10 +507,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(RepaintBoundary).first, find.byType(RepaintBoundary).first,
matchesGoldenFile( matchesGoldenFile('clip.ClipOval.png'),
'clip.ClipOval.png',
version: 1,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
...@@ -567,10 +555,7 @@ void main() { ...@@ -567,10 +555,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(RepaintBoundary).first, find.byType(RepaintBoundary).first,
matchesGoldenFile( matchesGoldenFile('clip.ClipPath.png'),
'clip.ClipPath.png',
version: 1,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
...@@ -615,10 +600,7 @@ void main() { ...@@ -615,10 +600,7 @@ void main() {
await tester.pumpWidget(genPhysicalModel(Clip.antiAlias)); await tester.pumpWidget(genPhysicalModel(Clip.antiAlias));
await expectLater( await expectLater(
find.byType(RepaintBoundary).first, find.byType(RepaintBoundary).first,
matchesGoldenFile( matchesGoldenFile('clip.PhysicalModel.antiAlias.png'),
'clip.PhysicalModel.antiAlias.png',
version: 1,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
...@@ -626,10 +608,7 @@ void main() { ...@@ -626,10 +608,7 @@ void main() {
await tester.pumpWidget(genPhysicalModel(Clip.hardEdge)); await tester.pumpWidget(genPhysicalModel(Clip.hardEdge));
await expectLater( await expectLater(
find.byType(RepaintBoundary).first, find.byType(RepaintBoundary).first,
matchesGoldenFile( matchesGoldenFile('clip.PhysicalModel.hardEdge.png'),
'clip.PhysicalModel.hardEdge.png',
version: 1,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
...@@ -639,10 +618,7 @@ void main() { ...@@ -639,10 +618,7 @@ void main() {
await tester.pumpWidget(genPhysicalModel(Clip.antiAliasWithSaveLayer)); await tester.pumpWidget(genPhysicalModel(Clip.antiAliasWithSaveLayer));
await expectLater( await expectLater(
find.byType(RepaintBoundary).first, find.byType(RepaintBoundary).first,
matchesGoldenFile( matchesGoldenFile('clip.PhysicalModel.antiAliasWithSaveLayer.png'),
'clip.PhysicalModel.antiAliasWithSaveLayer.png',
version: null,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
...@@ -684,10 +660,7 @@ void main() { ...@@ -684,10 +660,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(RepaintBoundary).first, find.byType(RepaintBoundary).first,
matchesGoldenFile( matchesGoldenFile('clip.PhysicalModel.default.png'),
'clip.PhysicalModel.default.png',
version: 1,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
...@@ -736,10 +709,7 @@ void main() { ...@@ -736,10 +709,7 @@ void main() {
await tester.pumpWidget(genPhysicalShape(Clip.antiAlias)); await tester.pumpWidget(genPhysicalShape(Clip.antiAlias));
await expectLater( await expectLater(
find.byType(RepaintBoundary).first, find.byType(RepaintBoundary).first,
matchesGoldenFile( matchesGoldenFile('clip.PhysicalShape.antiAlias.png'),
'clip.PhysicalShape.antiAlias.png',
version: 1,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
...@@ -747,10 +717,7 @@ void main() { ...@@ -747,10 +717,7 @@ void main() {
await tester.pumpWidget(genPhysicalShape(Clip.hardEdge)); await tester.pumpWidget(genPhysicalShape(Clip.hardEdge));
await expectLater( await expectLater(
find.byType(RepaintBoundary).first, find.byType(RepaintBoundary).first,
matchesGoldenFile( matchesGoldenFile('clip.PhysicalShape.hardEdge.png'),
'clip.PhysicalShape.hardEdge.png',
version: 1,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
...@@ -758,10 +725,7 @@ void main() { ...@@ -758,10 +725,7 @@ void main() {
await tester.pumpWidget(genPhysicalShape(Clip.antiAliasWithSaveLayer)); await tester.pumpWidget(genPhysicalShape(Clip.antiAliasWithSaveLayer));
await expectLater( await expectLater(
find.byType(RepaintBoundary).first, find.byType(RepaintBoundary).first,
matchesGoldenFile( matchesGoldenFile('clip.PhysicalShape.antiAliasWithSaveLayer.png'),
'clip.PhysicalShape.antiAliasWithSaveLayer.png',
version: null,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
...@@ -807,10 +771,7 @@ void main() { ...@@ -807,10 +771,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(RepaintBoundary).first, find.byType(RepaintBoundary).first,
matchesGoldenFile( matchesGoldenFile('clip.PhysicalShape.default.png'),
'clip.PhysicalShape.default.png',
version: 1,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
......
...@@ -18,10 +18,7 @@ void main() { ...@@ -18,10 +18,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(ColorFiltered), find.byType(ColorFiltered),
matchesGoldenFile( matchesGoldenFile('color_filter_red.png'),
'color_filter_red.png',
version: 1,
),
); );
}); });
...@@ -58,10 +55,7 @@ void main() { ...@@ -58,10 +55,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(ColorFiltered), find.byType(ColorFiltered),
matchesGoldenFile( matchesGoldenFile('color_filter_sepia.png'),
'color_filter_sepia.png',
version: 1,
),
); );
}); });
......
...@@ -90,10 +90,7 @@ void main() { ...@@ -90,10 +90,7 @@ void main() {
await expectLater( await expectLater(
find.byKey(const ValueKey<int>(1)), find.byKey(const ValueKey<int>(1)),
matchesGoldenFile( matchesGoldenFile('editable_text_test.0.png'),
'editable_text_test.0.png',
version: 3,
),
); );
}); });
...@@ -144,10 +141,7 @@ void main() { ...@@ -144,10 +141,7 @@ void main() {
await expectLater( await expectLater(
find.byKey(const ValueKey<int>(1)), find.byKey(const ValueKey<int>(1)),
matchesGoldenFile( matchesGoldenFile('editable_text_test.1.png'),
'editable_text_test.1.png',
version: 3,
),
); );
}); });
...@@ -797,10 +791,7 @@ void main() { ...@@ -797,10 +791,7 @@ void main() {
await expectLater( await expectLater(
find.byKey(const ValueKey<int>(1)), find.byKey(const ValueKey<int>(1)),
matchesGoldenFile( matchesGoldenFile('editable_text_test.2.png'),
'editable_text_test.2.png',
version: 0,
),
); );
debugDefaultTargetPlatformOverride = null; debugDefaultTargetPlatformOverride = null;
}); });
......
...@@ -20,10 +20,7 @@ void main() { ...@@ -20,10 +20,7 @@ void main() {
await expectLater( await expectLater(
find.byType(RepaintBoundary), find.byType(RepaintBoundary),
matchesGoldenFile( matchesGoldenFile('invert_colors_test.0.png'),
'invert_colors_test.0.png',
version: null,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
...@@ -41,10 +38,7 @@ void main() { ...@@ -41,10 +38,7 @@ void main() {
await expectLater( await expectLater(
find.byType(RepaintBoundary), find.byType(RepaintBoundary),
matchesGoldenFile( matchesGoldenFile('invert_colors_test.1.png'),
'invert_colors_test.1.png',
version: null,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
} }
......
...@@ -535,10 +535,7 @@ void main() { ...@@ -535,10 +535,7 @@ void main() {
await expectLater( await expectLater(
find.byKey(const Key('list_wheel_scroll_view')), find.byKey(const Key('list_wheel_scroll_view')),
matchesGoldenFile( matchesGoldenFile('list_wheel_scroll_view.center_child.magnified.png'),
'list_wheel_scroll_view.center_child.magnified.png',
version: null,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
...@@ -592,10 +589,7 @@ void main() { ...@@ -592,10 +589,7 @@ void main() {
await expectLater( await expectLater(
find.byKey(const Key('list_wheel_scroll_view')), find.byKey(const Key('list_wheel_scroll_view')),
matchesGoldenFile( matchesGoldenFile('list_wheel_scroll_view.curved_wheel.left.png'),
'list_wheel_scroll_view.curved_wheel.left.png',
version: null,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
......
...@@ -178,10 +178,7 @@ void main() { ...@@ -178,10 +178,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(RepaintBoundary).first, find.byType(RepaintBoundary).first,
matchesGoldenFile( matchesGoldenFile('opacity_test.offset.png'),
'opacity_test.offset.png',
version: 1,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
......
...@@ -110,10 +110,7 @@ void main() { ...@@ -110,10 +110,7 @@ void main() {
expect(exception.diagnostics.first.toString(), startsWith('A RenderFlex overflowed by ')); expect(exception.diagnostics.first.toString(), startsWith('A RenderFlex overflowed by '));
await expectLater( await expectLater(
find.byKey(key), find.byKey(key),
matchesGoldenFile( matchesGoldenFile('physical_model_overflow.png'),
'physical_model_overflow.png',
version: null,
),
); );
}, skip: isBrowser); }, skip: isBrowser);
......
...@@ -23,20 +23,14 @@ void main() { ...@@ -23,20 +23,14 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('shadow.BoxDecoration.disabled.png'),
'shadow.BoxDecoration.disabled.png',
version: null,
),
); );
debugDisableShadows = false; debugDisableShadows = false;
tester.binding.reassembleApplication(); tester.binding.reassembleApplication();
await tester.pump(); await tester.pump();
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('shadow.BoxDecoration.enabled.png'),
'shadow.BoxDecoration.enabled.png',
version: null,
),
); );
debugDisableShadows = true; debugDisableShadows = true;
}, skip: isBrowser); }, skip: isBrowser);
...@@ -62,10 +56,7 @@ void main() { ...@@ -62,10 +56,7 @@ void main() {
await tester.pumpWidget(build(elevation)); await tester.pumpWidget(build(elevation));
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('shadow.ShapeDecoration.$elevation.png'),
'shadow.ShapeDecoration.$elevation.png',
version: null,
),
); );
} }
debugDisableShadows = true; debugDisableShadows = true;
...@@ -92,20 +83,14 @@ void main() { ...@@ -92,20 +83,14 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('shadow.PhysicalModel.disabled.png'),
'shadow.PhysicalModel.disabled.png',
version: null,
),
); );
debugDisableShadows = false; debugDisableShadows = false;
tester.binding.reassembleApplication(); tester.binding.reassembleApplication();
await tester.pump(); await tester.pump();
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('shadow.PhysicalModel.enabled.png'),
'shadow.PhysicalModel.enabled.png',
version: null,
),
); );
debugDisableShadows = true; debugDisableShadows = true;
}, skip: isBrowser); }, skip: isBrowser);
...@@ -135,10 +120,7 @@ void main() { ...@@ -135,10 +120,7 @@ void main() {
await tester.pumpWidget(build(elevation.toDouble())); await tester.pumpWidget(build(elevation.toDouble()));
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('shadow.PhysicalShape.$elevation.png'),
'shadow.PhysicalShape.$elevation.png',
version: 1,
),
); );
} }
debugDisableShadows = true; debugDisableShadows = true;
......
...@@ -30,10 +30,7 @@ void main() { ...@@ -30,10 +30,7 @@ void main() {
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('text_golden.Centered.png'),
'text_golden.Centered.png',
version: null,
),
); );
await tester.pumpWidget( await tester.pumpWidget(
...@@ -57,10 +54,7 @@ void main() { ...@@ -57,10 +54,7 @@ void main() {
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('text_golden.Centered.wrap.png'),
'text_golden.Centered.wrap.png',
version: null,
),
); );
}); });
...@@ -91,10 +85,7 @@ void main() { ...@@ -91,10 +85,7 @@ void main() {
await expectLater( await expectLater(
find.byType(RepaintBoundary), find.byType(RepaintBoundary),
matchesGoldenFile( matchesGoldenFile('text_golden.Foreground.gradient.png'),
'text_golden.Foreground.gradient.png',
version: null,
),
); );
await tester.pumpWidget( await tester.pumpWidget(
...@@ -116,10 +107,7 @@ void main() { ...@@ -116,10 +107,7 @@ void main() {
await expectLater( await expectLater(
find.byType(RepaintBoundary), find.byType(RepaintBoundary),
matchesGoldenFile( matchesGoldenFile('text_golden.Foreground.stroke.png'),
'text_golden.Foreground.stroke.png',
version: null,
),
); );
await tester.pumpWidget( await tester.pumpWidget(
...@@ -142,10 +130,7 @@ void main() { ...@@ -142,10 +130,7 @@ void main() {
await expectLater( await expectLater(
find.byType(RepaintBoundary), find.byType(RepaintBoundary),
matchesGoldenFile( matchesGoldenFile('text_golden.Foreground.stroke_and_gradient.png'),
'text_golden.Foreground.stroke_and_gradient.png',
version: null,
),
); );
}); });
...@@ -195,10 +180,7 @@ void main() { ...@@ -195,10 +180,7 @@ void main() {
await expectLater( await expectLater(
find.byType(RepaintBoundary), find.byType(RepaintBoundary),
matchesGoldenFile( matchesGoldenFile('text_golden.Background.png'),
'text_golden.Background.png',
version: null,
),
); );
}); });
...@@ -234,10 +216,7 @@ void main() { ...@@ -234,10 +216,7 @@ void main() {
await expectLater( await expectLater(
find.byType(RepaintBoundary).first, find.byType(RepaintBoundary).first,
matchesGoldenFile( matchesGoldenFile('text_golden.Fade.png'),
'text_golden.Fade.png',
version: 1,
),
); );
}); });
...@@ -262,10 +241,7 @@ void main() { ...@@ -262,10 +241,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('text_golden.StrutDefault.png'),
'text_golden.StrutDefault.png',
version: null,
),
); );
}); });
...@@ -292,10 +268,7 @@ void main() { ...@@ -292,10 +268,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('text_golden.Strut.1.png'),
'text_golden.Strut.1.png',
version: 1,
),
); );
}); });
...@@ -323,10 +296,7 @@ void main() { ...@@ -323,10 +296,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('text_golden.Strut.2.png'),
'text_golden.Strut.2.png',
version: 1,
),
); );
}); });
...@@ -377,10 +347,7 @@ void main() { ...@@ -377,10 +347,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('text_golden.Strut.3.png'),
'text_golden.Strut.3.png',
version: 1,
),
); );
}); });
...@@ -415,10 +382,7 @@ void main() { ...@@ -415,10 +382,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('text_golden.Strut.4.png'),
'text_golden.Strut.4.png',
version: 1,
),
); );
}); });
...@@ -469,10 +433,7 @@ void main() { ...@@ -469,10 +433,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('text_golden.StrutForce.1.png'),
'text_golden.StrutForce.1.png',
version: 1,
),
); );
}); });
...@@ -510,10 +471,7 @@ void main() { ...@@ -510,10 +471,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('text_golden.Decoration.1.png'),
'text_golden.Decoration.1.png',
version: 0,
),
); );
}); });
...@@ -552,10 +510,7 @@ void main() { ...@@ -552,10 +510,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('text_golden.DecorationThickness.1.png'),
'text_golden.DecorationThickness.1.png',
version: 1,
),
); );
}); });
...@@ -649,10 +604,7 @@ void main() { ...@@ -649,10 +604,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('text_golden.TextInlineWidget.1.png'),
'text_golden.TextInlineWidget.1.png',
version: 1,
),
); );
}); });
...@@ -697,10 +649,7 @@ void main() { ...@@ -697,10 +649,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('text_golden.TextInlineWidget.2.png'),
'text_golden.TextInlineWidget.2.png',
version: 2,
),
); );
}); });
...@@ -829,10 +778,7 @@ void main() { ...@@ -829,10 +778,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('text_golden.TextInlineWidgetNest.1.png'),
'text_golden.TextInlineWidgetNest.1.png',
version: 3,
),
); );
}); });
...@@ -939,10 +885,7 @@ void main() { ...@@ -939,10 +885,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('text_golden.TextInlineWidgetBaseline.1.png'),
'text_golden.TextInlineWidgetBaseline.1.png',
version: 1,
),
); );
}); });
...@@ -1049,10 +992,7 @@ void main() { ...@@ -1049,10 +992,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('text_golden.TextInlineWidgetAboveBaseline.1.png'),
'text_golden.TextInlineWidgetAboveBaseline.1.png',
version: 1,
),
); );
}); });
...@@ -1159,10 +1099,7 @@ void main() { ...@@ -1159,10 +1099,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('text_golden.TextInlineWidgetBelowBaseline.1.png'),
'text_golden.TextInlineWidgetBelowBaseline.1.png',
version: 1,
),
); );
}); });
...@@ -1269,10 +1206,7 @@ void main() { ...@@ -1269,10 +1206,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('text_golden.TextInlineWidgetTop.1.png'),
'text_golden.TextInlineWidgetTop.1.png',
version: 1,
),
); );
}); });
...@@ -1379,10 +1313,7 @@ void main() { ...@@ -1379,10 +1313,7 @@ void main() {
); );
await expectLater( await expectLater(
find.byType(Container), find.byType(Container),
matchesGoldenFile( matchesGoldenFile('text_golden.TextInlineWidgetMiddle.1.png'),
'text_golden.TextInlineWidgetMiddle.1.png',
version: 1,
),
); );
}); });
} }
// Copyright 2019 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.
/// Json response template for Skia Gold expectations request:
/// https://flutter-gold.skia.org/json/expectations/commit/HEAD
String rawExpectationsTemplate() {
return '''
{
"md5": "a7489b00e03a1846e43500b7c14dd7b0",
"master": {
"flutter.golden_test.1": {
"55109a4bed52acc780530f7a9aeff6c0": 1
},
"flutter.golden_test.3": {
"87cb35131e6ad4b57d4d09d59ae743c3": 1,
"dc94eb2c39c0c8ae11a4efd090b72f94": 1,
"f2583c9003978a06b7888878bdc089e2": 1
},
"flutter.golden_test.2": {
"eb03a5e3114c9ecad5e4f1178f285a49": 1,
"f14631979de24fca6e14ad247d5f2bd6": 1
}
}
}
''';
}
/// Decoded json response template for Skia Gold expectations request:
/// https://flutter-gold.skia.org/json/expectations/commit/HEAD
Map<String, List<String>> expectationsTemplate() {
return <String, List<String>>{
'flutter.golden_test.1': <String>[
'55109a4bed52acc780530f7a9aeff6c0'
],
'flutter.golden_test.3': <String>[
'87cb35131e6ad4b57d4d09d59ae743c3',
'dc94eb2c39c0c8ae11a4efd090b72f94',
'f2583c9003978a06b7888878bdc089e2',
],
'flutter.golden_test.2': <String>[
'eb03a5e3114c9ecad5e4f1178f285a49',
'f14631979de24fca6e14ad247d5f2bd6',
],
};
}
/// Json response template for Skia Gold digest request:
/// https://flutter-gold.skia.org/json/details?test=[testName]&digest=[expectation]
String digestResponseTemplate({
String testName = 'flutter.golden_test.1',
String expectation = '55109a4bed52acc780530f7a9aeff6c0',
String platform = 'macos',
String status = 'positive',
}) {
return '''
{
"digest": {
"test": "$testName",
"digest": "$expectation",
"status": "$status",
"paramset": {
"Platform": [
"$platform"
],
"ext": [
"png"
],
"name": [
"$testName"
],
"source_type": [
"flutter"
]
},
"traces": {
"tileSize": 200,
"traces": [
{
"data": [
{
"x": 0,
"y": 0,
"s": 0
},
{
"x": 1,
"y": 0,
"s": 0
},
{
"x": 199,
"y": 0,
"s": 0
}
],
"label": ",Platform=$platform,name=$testName,source_type=flutter,",
"params": {
"Platform": "$platform",
"ext": "png",
"name": "$testName",
"source_type": "flutter"
}
}
],
"digests": [
{
"digest": "$expectation",
"status": "$status"
}
]
},
"closestRef": "pos",
"refDiffs": {
"neg": null,
"pos": {
"numDiffPixels": 999,
"pixelDiffPercent": 0.4995,
"maxRGBADiffs": [
86,
86,
86,
0
],
"dimDiffer": false,
"diffs": {
"combined": 0.381955,
"percent": 0.4995,
"pixel": 999
},
"digest": "aa748136c70cefdda646df5be0ae189d",
"status": "positive",
"paramset": {
"Platform": [
"macos"
],
"ext": [
"png"
],
"name": [
"$testName"
],
"source_type": [
"flutter"
]
},
"n": 197
}
}
},
"commits": [
{
"commit_time": 1568069344,
"hash": "399bb04e2de41665320d3c888f40af6d8bc734a2",
"author": "Contributor A (contributorA@getMail.com)"
},
{
"commit_time": 1568078053,
"hash": "0f365d3add253a65e5e5af1024f56c6169bf9739",
"author": "Contributor B (contributorB@getMail.com)"
},
{
"commit_time": 1569353925,
"hash": "81e693a7fe3b808cc9ae2bb3a2cbe404e67ec773",
"author": "Contributor C (contributorC@getMail.com)"
}
]
}
''';
}
/// Json response template for Skia Gold ignore request:
/// https://flutter-gold.skia.org/json/ignores
String ignoreResponseTemplate({
String pullRequestNumber = '0000',
String testName = 'flutter.golden_test.1',
}) {
return '''
[
{
"id": "7579425228619212078",
"name": "contributor@getMail.com",
"updatedBy": "contributor@getMail.com",
"expires": "2019-09-06T21:28:18.815336Z",
"query": "ext=png&name=$testName",
"note": "https://github.com/flutter/flutter/pull/$pullRequestNumber"
}
]
''';
}
/// Json response template for Skia Gold image request:
/// https://flutter-gold.skia.org/img/images/[imageHash].png
List<List<int>> imageResponseTemplate() {
return <List<int>>[
<int>[137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73,
72, 68, 82, 0, 0, 0, 1, 0, 0, 0, 1, 8, 6, 0, 0, 0, 31, 21, 196, 137, 0],
<int>[0, 0, 11, 73, 68, 65, 84, 120, 1, 99, 97, 0, 2, 0,
0, 25, 0, 5, 144, 240, 54, 245, 0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96,
130],
];
}
// Copyright 2018 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.
import 'dart:async';
import 'dart:io' as io;
import 'package:file/file.dart';
import 'package:file/local.dart';
import 'package:platform/platform.dart';
import 'package:process/process.dart';
// If you are here trying to figure out how to use golden files in the Flutter
// repo itself, consider reading this wiki page:
// https://github.com/flutter/flutter/wiki/Writing-a-golden-file-test-for-package%3Aflutter
const String _kFlutterRootKey = 'FLUTTER_ROOT';
/// A base class that provides shared information to the
/// [FlutterGoldenFileComparator] as well as the [SkiaGoldClient] and
/// [GoldensRepositoryClient].
abstract class GoldensClient {
/// Creates a handle to the local environment of golden file images.
GoldensClient({
this.fs = const LocalFileSystem(),
this.platform = const LocalPlatform(),
this.process = const LocalProcessManager(),
});
/// The file system to use for storing the local clone of the repository.
///
/// This is useful in tests, where a local file system (the default) can
/// be replaced by a memory file system.
final FileSystem fs;
/// A wrapper for the [dart:io.Platform] API.
///
/// This is useful in tests, where the system platform (the default) can
/// be replaced by a mock platform instance.
final Platform platform;
/// A controller for launching subprocesses.
///
/// This is useful in tests, where the real process manager (the default)
/// can be replaced by a mock process manager that doesn't really create
/// subprocesses.
final ProcessManager process;
/// The local [Directory] where the Flutter repository is hosted.
///
/// Uses the [fs] file system.
Directory get flutterRoot => fs.directory(platform.environment[_kFlutterRootKey]);
/// The local [Directory] where the goldens files are located.
///
/// Uses the [fs] file system.
Directory get comparisonRoot => flutterRoot.childDirectory(fs.path.join('bin', 'cache', 'pkg', 'goldens'));
}
/// A class that represents a clone of the https://github.com/flutter/goldens
/// repository, nested within the `bin/cache` directory of the caller's Flutter
/// repository.
class GoldensRepositoryClient extends GoldensClient {
GoldensRepositoryClient({
FileSystem fs = const LocalFileSystem(),
ProcessManager process = const LocalProcessManager(),
Platform platform = const LocalPlatform(),
}) : super(
fs: fs,
process: process,
platform: platform,
);
RandomAccessFile _lock;
/// Prepares the local clone of the `flutter/goldens` repository for golden
/// file testing.
///
/// This ensures that the goldens repository has been cloned into its
/// expected location within `bin/cache` and that it is synced to the Git
/// revision specified in `bin/internal/goldens.version`.
///
/// While this is preparing the repository, it obtains a file lock such that
/// [GoldensClient] instances in other processes or isolates will not
/// duplicate the work that this is doing.
Future<void> prepare() async {
final String goldensCommit = await _getGoldensCommit();
String currentCommit = await _getCurrentCommit();
if (currentCommit != goldensCommit) {
await _obtainLock();
try {
// Check the current commit again now that we have the lock.
currentCommit = await _getCurrentCommit();
if (currentCommit != goldensCommit) {
if (currentCommit == null) {
await _initRepository();
}
await _checkCanSync();
await _syncTo(goldensCommit);
}
} finally {
await _releaseLock();
}
}
}
Future<String> _getCurrentCommit() async {
if (!comparisonRoot.existsSync()) {
return null;
} else {
final io.ProcessResult revParse = await process.run(
<String>['git', 'rev-parse', 'HEAD'],
workingDirectory: comparisonRoot.path,
);
return revParse.exitCode == 0 ? revParse.stdout.trim() : null;
}
}
Future<String> _getGoldensCommit() async {
final File versionFile = flutterRoot.childFile(fs.path.join('bin', 'internal', 'goldens.version'));
return (await versionFile.readAsString()).trim();
}
Future<void> _initRepository() async {
await comparisonRoot.create(recursive: true);
await _runCommands(
<String>[
'git init',
'git remote add upstream https://github.com/flutter/goldens.git',
'git remote set-url --push upstream git@github.com:flutter/goldens.git',
],
workingDirectory: comparisonRoot,
);
}
Future<void> _checkCanSync() async {
final io.ProcessResult result = await process.run(
<String>['git', 'status', '--porcelain'],
workingDirectory: comparisonRoot.path,
);
if (result.stdout.trim().isNotEmpty) {
final StringBuffer buf = StringBuffer()
..writeln('flutter_goldens git checkout at ${comparisonRoot.path} has local changes and cannot be synced.')
..writeln('To reset your client to a clean state, and lose any local golden test changes:')
..writeln('cd ${comparisonRoot.path}')
..writeln('git reset --hard HEAD')
..writeln('git clean -x -d -f -f');
throw NonZeroExitCode(1, buf.toString());
}
}
Future<void> _syncTo(String commit) async {
await _runCommands(
<String>[
'git pull upstream master',
'git fetch upstream $commit',
'git reset --hard FETCH_HEAD',
],
workingDirectory: comparisonRoot,
);
}
Future<void> _runCommands(
List<String> commands, {
Directory workingDirectory,
}) async {
for (String command in commands) {
final List<String> parts = command.split(' ');
final io.ProcessResult result = await process.run(
parts,
workingDirectory: workingDirectory?.path,
);
if (result.exitCode != 0) {
throw NonZeroExitCode(result.exitCode, result.stderr);
}
}
}
Future<void> _obtainLock() async {
final File lockFile = flutterRoot.childFile(fs.path.join('bin', 'cache', 'goldens.lockfile'));
await lockFile.create(recursive: true);
_lock = await lockFile.open(mode: io.FileMode.write);
await _lock.lock(io.FileLock.blockingExclusive);
}
Future<void> _releaseLock() async {
await _lock.close();
_lock = null;
}
}
/// Exception that signals a process' exit with a non-zero exit code.
class NonZeroExitCode implements Exception {
/// Create an exception that represents a non-zero exit code.
///
/// The first argument must be non-zero.
const NonZeroExitCode(this.exitCode, this.stderr) : assert(exitCode != 0);
/// The code that the process will signal to the operating system.
///
/// By definition, this is not zero.
final int exitCode;
/// The message to show on standard error.
final String stderr;
@override
String toString() {
return 'Exit code $exitCode: $stderr';
}
}
...@@ -15,8 +15,8 @@ import 'goldens.dart'; ...@@ -15,8 +15,8 @@ import 'goldens.dart';
/// The default [GoldenFileComparator] implementation for `flutter test`. /// The default [GoldenFileComparator] implementation for `flutter test`.
/// ///
/// The term __golden file__ refers to a master image that is considered the true /// The term __golden file__ refers to a master image that is considered the
/// rendering of a given widget, state, application, or other visual /// true rendering of a given widget, state, application, or other visual
/// representation you have chosen to capture. This comparator loads golden /// representation you have chosen to capture. This comparator loads golden
/// files from the local file system, treating the golden key as a relative /// files from the local file system, treating the golden key as a relative
/// path from the test file's directory. /// path from the test file's directory.
...@@ -53,7 +53,7 @@ import 'goldens.dart'; ...@@ -53,7 +53,7 @@ import 'goldens.dart';
/// implements. /// implements.
/// * [matchesGoldenFile], the function from [flutter_test] that invokes the /// * [matchesGoldenFile], the function from [flutter_test] that invokes the
/// comparator. /// comparator.
class LocalFileComparator extends GoldenFileComparator { class LocalFileComparator extends GoldenFileComparator with LocalComparisonOutput {
/// Creates a new [LocalFileComparator] for the specified [testFile]. /// Creates a new [LocalFileComparator] for the specified [testFile].
/// ///
/// Golden file keys will be interpreted as file paths relative to the /// Golden file keys will be interpreted as file paths relative to the
...@@ -90,24 +90,18 @@ class LocalFileComparator extends GoldenFileComparator { ...@@ -90,24 +90,18 @@ class LocalFileComparator extends GoldenFileComparator {
Future<bool> compare(Uint8List imageBytes, Uri golden) async { Future<bool> compare(Uint8List imageBytes, Uri golden) async {
final File goldenFile = _getGoldenFile(golden); final File goldenFile = _getGoldenFile(golden);
if (!goldenFile.existsSync()) { if (!goldenFile.existsSync()) {
throw test_package.TestFailure('Could not be compared against non-existent file: "$golden"'); throw test_package.TestFailure(
'Could not be compared against non-existent file: "$golden"'
);
} }
final List<int> goldenBytes = await goldenFile.readAsBytes(); final List<int> goldenBytes = await goldenFile.readAsBytes();
final ComparisonResult result = GoldenFileComparator.compareLists(imageBytes, goldenBytes); final ComparisonResult result = GoldenFileComparator.compareLists(
imageBytes,
goldenBytes,
);
if (!result.passed) { if (!result.passed) {
String additionalFeedback = ''; generateFailureOutput(result, golden, basedir);
if (result.diffs != null) {
additionalFeedback = '\nFailure feedback can be found at ${path.join(basedir.path, 'failures')}';
final Map<String, Object> diffs = result.diffs;
diffs.forEach((String name, Object untypedImage) {
final Image image = untypedImage;
final File output = _getFailureFile(name, golden);
output.parent.createSync(recursive: true);
output.writeAsBytesSync(encodePng(image));
});
}
throw test_package.TestFailure('Golden "$golden": ${result.error}$additionalFeedback');
} }
return result.passed; return result.passed;
} }
...@@ -122,16 +116,50 @@ class LocalFileComparator extends GoldenFileComparator { ...@@ -122,16 +116,50 @@ class LocalFileComparator extends GoldenFileComparator {
File _getGoldenFile(Uri golden) { File _getGoldenFile(Uri golden) {
return File(_path.join(_path.fromUri(basedir), _path.fromUri(golden.path))); return File(_path.join(_path.fromUri(basedir), _path.fromUri(golden.path)));
} }
}
/// A class for use in golden file comparators that run locally and provide
/// output.
class LocalComparisonOutput {
/// Writes out diffs from the [ComparisonResult] of a golden file test.
///
/// Will throw an error if a null result is provided.
void generateFailureOutput(
ComparisonResult result,
Uri golden,
Uri basedir, {
String key = '',
}) {
String additionalFeedback = '';
if (result.diffs != null) {
additionalFeedback = '\nFailure feedback can be found at '
'${path.join(basedir.path, 'failures')}';
final Map<String, Image> diffs = result.diffs;
diffs.forEach((String name, Image image) {
final File output = getFailureFile(
key.isEmpty ? name : name + '_' + key,
golden,
basedir,
);
output.parent.createSync(recursive: true);
output.writeAsBytesSync(encodePng(image));
});
}
throw test_package.TestFailure(
'Golden "$golden": ${result.error}$additionalFeedback'
);
}
File _getFailureFile(String failure, Uri golden) { /// Returns the appropriate file for a given diff from a [ComparisonResult].
File getFailureFile(String failure, Uri golden, Uri basedir) {
final String fileName = golden.pathSegments[0]; final String fileName = golden.pathSegments[0];
final String testName = fileName.split(path.extension(fileName))[0] final String testName = fileName.split(path.extension(fileName))[0]
+ '_' + '_'
+ failure + failure
+ '.png'; + '.png';
return File(_path.join( return File(path.join(
_path.fromUri(basedir), path.fromUri(basedir),
_path.fromUri(Uri.parse('failures/$testName')), path.fromUri(Uri.parse('failures/$testName')),
)); ));
} }
} }
...@@ -203,7 +231,9 @@ ComparisonResult compareLists(List<int> test, List<int> master) { ...@@ -203,7 +231,9 @@ ComparisonResult compareLists(List<int> test, List<int> master) {
if (pixelDiffCount > 0) { if (pixelDiffCount > 0) {
return ComparisonResult( return ComparisonResult(
passed: false, passed: false,
error: 'Pixel test failed, ${((pixelDiffCount/totalPixels) * 100).toStringAsFixed(2)}% diff detected.', error: 'Pixel test failed, '
'${((pixelDiffCount/totalPixels) * 100).toStringAsFixed(2)}% '
'diff detected.',
diffs: diffs, diffs: diffs,
); );
} }
......
...@@ -303,9 +303,7 @@ Matcher coversSameAreaAs(Path expectedPath, { @required Rect areaToCompare, int ...@@ -303,9 +303,7 @@ Matcher coversSameAreaAs(Path expectedPath, { @required Rect areaToCompare, int
/// The [key] may be either a [Uri] or a [String] representation of a URI. /// The [key] may be either a [Uri] or a [String] representation of a URI.
/// ///
/// The [version] is a number that can be used to differentiate historical /// The [version] is a number that can be used to differentiate historical
/// golden files. This parameter is optional. Version numbers are used in golden /// golden files. This parameter is optional.
/// file tests for package:flutter. You can learn more about these tests
/// [here](https://github.com/flutter/flutter/wiki/Writing-a-golden-file-test-for-package:flutter).
/// ///
/// This is an asynchronous matcher, meaning that callers should use /// This is an asynchronous matcher, meaning that callers should use
/// [expectLater] when using this matcher and await the future returned by /// [expectLater] when using this matcher and await the future returned by
...@@ -336,8 +334,11 @@ Matcher coversSameAreaAs(Path expectedPath, { @required Rect areaToCompare, int ...@@ -336,8 +334,11 @@ Matcher coversSameAreaAs(Path expectedPath, { @required Rect areaToCompare, int
/// ///
/// await expectLater( /// await expectLater(
/// imageFuture, /// imageFuture,
/// matchesGoldenFile('save.png'), /// matchesGoldenFile(
/// ); /// 'save.png',
/// version: 2,
/// ),
/// );
/// ///
/// await expectLater( /// await expectLater(
/// find.byType(MyWidget), /// find.byType(MyWidget),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment