diff --git a/.mapping.json b/.mapping.json index 671ef2db1..9a32ef2b9 100644 --- a/.mapping.json +++ b/.mapping.json @@ -10769,9 +10769,12 @@ "client/flutter/divkit/test/goldens/framework/enhanced_file_comparator.dart":"divkit/public/client/flutter/divkit/test/goldens/framework/enhanced_file_comparator.dart", "client/flutter/divkit/test/goldens/framework/flutter_test_config.dart":"divkit/public/client/flutter/divkit/test/goldens/framework/flutter_test_config.dart", "client/flutter/divkit/test/goldens/framework/framework.dart":"divkit/public/client/flutter/divkit/test/goldens/framework/framework.dart", - "client/flutter/divkit/test/goldens/framework/golden_test_for_ci.dart":"divkit/public/client/flutter/divkit/test/goldens/framework/golden_test_for_ci.dart", + "client/flutter/divkit/test/goldens/framework/mock_images/enable_http.dart":"divkit/public/client/flutter/divkit/test/goldens/framework/mock_images/enable_http.dart", + "client/flutter/divkit/test/goldens/framework/mock_images/mock_and_load_network_images.dart":"divkit/public/client/flutter/divkit/test/goldens/framework/mock_images/mock_and_load_network_images.dart", + "client/flutter/divkit/test/goldens/framework/mock_images/mock_images_utils.dart":"divkit/public/client/flutter/divkit/test/goldens/framework/mock_images/mock_images_utils.dart", "client/flutter/divkit/test/goldens/framework/screen_matches_golden.dart":"divkit/public/client/flutter/divkit/test/goldens/framework/screen_matches_golden.dart", "client/flutter/divkit/test/goldens/framework/screen_settings.dart":"divkit/public/client/flutter/divkit/test/goldens/framework/screen_settings.dart", + "client/flutter/divkit/test/goldens/goldens/div-background.scale_stretch.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-background.scale_stretch.png", "client/flutter/divkit/test/goldens/goldens/div-container.alignment-center-with-paddings.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.alignment-center-with-paddings.png", "client/flutter/divkit/test/goldens/goldens/div-container.alpha-and-background.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.alpha-and-background.png", "client/flutter/divkit/test/goldens/goldens/div-container.aspect.fixed-width-wrap-layout_mode-vertical.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.aspect.fixed-width-wrap-layout_mode-vertical.png", @@ -10808,20 +10811,36 @@ "client/flutter/divkit/test/goldens/goldens/div-container.fixed-size-with-paddings.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.fixed-size-with-paddings.png", "client/flutter/divkit/test/goldens/goldens/div-container.horizontal-match-parent-inside-wrap-content-on-both-axis.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-match-parent-inside-wrap-content-on-both-axis.png", "client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-alignments.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-alignments.png", + "client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-bottom-horizontal-alignment.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-bottom-horizontal-alignment.png", + "client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-bottom-vertical-alignment.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-bottom-vertical-alignment.png", + "client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-center-horizontal-alignment.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-center-horizontal-alignment.png", + "client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-center-vertical-alignment.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-center-vertical-alignment.png", "client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-fixed-child.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-fixed-child.png", "client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-min-size.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-min-size.png", + "client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-space-around-alignment.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-space-around-alignment.png", + "client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-space-between-alignment.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-space-between-alignment.png", + "client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-space-evenly-alignment.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-space-evenly-alignment.png", "client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation.png", "client/flutter/divkit/test/goldens/goldens/div-container.match-parent-lesser-than-paddings.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.match-parent-lesser-than-paddings.png", "client/flutter/divkit/test/goldens/goldens/div-container.match-parent-with-padding.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.match-parent-with-padding.png", + "client/flutter/divkit/test/goldens/goldens/div-container.no-scale-background.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.no-scale-background.png", "client/flutter/divkit/test/goldens/goldens/div-container.overlap-container-child-wrap-containers.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.overlap-container-child-wrap-containers.png", "client/flutter/divkit/test/goldens/goldens/div-container.overlap-orientation-min-size.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.overlap-orientation-min-size.png", + "client/flutter/divkit/test/goldens/goldens/div-container.overlap-orientation.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.overlap-orientation.png", + "client/flutter/divkit/test/goldens/goldens/div-container.overlap-with-match-parent-child.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.overlap-with-match-parent-child.png", "client/flutter/divkit/test/goldens/goldens/div-container.overlap-with-match-parent-in-match-parent.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.overlap-with-match-parent-in-match-parent.png", + "client/flutter/divkit/test/goldens/goldens/div-container.size_unit.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.size_unit.png", "client/flutter/divkit/test/goldens/goldens/div-container.space-evenly-alignment-with-gone-items.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.space-evenly-alignment-with-gone-items.png", + "client/flutter/divkit/test/goldens/goldens/div-container.vertical-composite-background.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.vertical-composite-background.png", "client/flutter/divkit/test/goldens/goldens/div-container.vertical-custom-margins.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.vertical-custom-margins.png", "client/flutter/divkit/test/goldens/goldens/div-container.vertical-custom-paddings.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.vertical-custom-paddings.png", + "client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-center-alignment.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-center-alignment.png", "client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-fixed-height.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-fixed-height.png", "client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-match_parent-child.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-match_parent-child.png", "client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-min-size.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-min-size.png", + "client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-space-around-alignment.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-space-around-alignment.png", + "client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-space-between-alignment.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-space-between-alignment.png", + "client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-space-evenly-alignment.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-space-evenly-alignment.png", "client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation.png", "client/flutter/divkit/test/goldens/goldens/div-container.wrap.baseline.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.wrap.baseline.png", "client/flutter/divkit/test/goldens/goldens/div-container.wrap.horizontal-orientation-alignments-center-bottom.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-container.wrap.horizontal-orientation-alignments-center-bottom.png", @@ -10881,6 +10900,40 @@ "client/flutter/divkit/test/goldens/goldens/div-gallery.horizontal-grid-gallery-wrapped-item-spacing.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-gallery.horizontal-grid-gallery-wrapped-item-spacing.png", "client/flutter/divkit/test/goldens/goldens/div-gallery.rtl_gallery.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-gallery.rtl_gallery.png", "client/flutter/divkit/test/goldens/goldens/div-gallery.vertical-gallery-height-wrap-content.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-gallery.vertical-gallery-height-wrap-content.png", + "client/flutter/divkit/test/goldens/goldens/div-image.aspect-fixed.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.aspect-fixed.png", + "client/flutter/divkit/test/goldens/goldens/div-image.aspect-match_parent.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.aspect-match_parent.png", + "client/flutter/divkit/test/goldens/goldens/div-image.aspect-wrap_content.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.aspect-wrap_content.png", + "client/flutter/divkit/test/goldens/goldens/div-image.blur-with-big-radius.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.blur-with-big-radius.png", + "client/flutter/divkit/test/goldens/goldens/div-image.blur.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.blur.png", + "client/flutter/divkit/test/goldens/goldens/div-image.border-with-stroke.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.border-with-stroke.png", + "client/flutter/divkit/test/goldens/goldens/div-image.composite-background.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.composite-background.png", + "client/flutter/divkit/test/goldens/goldens/div-image.content-horizontal-alignment-end.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.content-horizontal-alignment-end.png", + "client/flutter/divkit/test/goldens/goldens/div-image.content-horizontal-alignment-start.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.content-horizontal-alignment-start.png", + "client/flutter/divkit/test/goldens/goldens/div-image.corner-radius.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.corner-radius.png", + "client/flutter/divkit/test/goldens/goldens/div-image.corners_radius.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.corners_radius.png", + "client/flutter/divkit/test/goldens/goldens/div-image.custom-alpha.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.custom-alpha.png", + "client/flutter/divkit/test/goldens/goldens/div-image.custom-height.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.custom-height.png", + "client/flutter/divkit/test/goldens/goldens/div-image.custom-margins.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.custom-margins.png", + "client/flutter/divkit/test/goldens/goldens/div-image.custom-paddings.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.custom-paddings.png", + "client/flutter/divkit/test/goldens/goldens/div-image.custom-tint-color.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.custom-tint-color.png", + "client/flutter/divkit/test/goldens/goldens/div-image.custom-width.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.custom-width.png", + "client/flutter/divkit/test/goldens/goldens/div-image.no_scale.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.no_scale.png", + "client/flutter/divkit/test/goldens/goldens/div-image.no_scale_bottom_right.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.no_scale_bottom_right.png", + "client/flutter/divkit/test/goldens/goldens/div-image.no_scale_top_left.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.no_scale_top_left.png", + "client/flutter/divkit/test/goldens/goldens/div-image.rtl-filter.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.rtl-filter.png", + "client/flutter/divkit/test/goldens/goldens/div-image.rtl-image-content-horizontal-alignment-end.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.rtl-image-content-horizontal-alignment-end.png", + "client/flutter/divkit/test/goldens/goldens/div-image.rtl-image-content-horizontal-alignment-start.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.rtl-image-content-horizontal-alignment-start.png", + "client/flutter/divkit/test/goldens/goldens/div-image.scale_fill.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.scale_fill.png", + "client/flutter/divkit/test/goldens/goldens/div-image.scale_fill_bottom.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.scale_fill_bottom.png", + "client/flutter/divkit/test/goldens/goldens/div-image.scale_fill_right.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.scale_fill_right.png", + "client/flutter/divkit/test/goldens/goldens/div-image.scale_fit.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.scale_fit.png", + "client/flutter/divkit/test/goldens/goldens/div-image.scale_fit_bottom.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.scale_fit_bottom.png", + "client/flutter/divkit/test/goldens/goldens/div-image.scale_fit_left.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.scale_fit_left.png", + "client/flutter/divkit/test/goldens/goldens/div-image.scale_fit_right.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.scale_fit_right.png", + "client/flutter/divkit/test/goldens/goldens/div-image.scale_fit_top.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.scale_fit_top.png", + "client/flutter/divkit/test/goldens/goldens/div-image.scale_stretch.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.scale_stretch.png", + "client/flutter/divkit/test/goldens/goldens/div-image.shadow.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.shadow.png", + "client/flutter/divkit/test/goldens/goldens/div-image.wrap-content-width-by-height.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-image.wrap-content-width-by-height.png", "client/flutter/divkit/test/goldens/goldens/div-input.all-attributes.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-input.all-attributes.png", "client/flutter/divkit/test/goldens/goldens/div-input.min-height.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-input.min-height.png", "client/flutter/divkit/test/goldens/goldens/div-input.rtl-input.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-input.rtl-input.png", @@ -10905,6 +10958,10 @@ "client/flutter/divkit/test/goldens/goldens/div-pager.vertical-pager-match-parent-width-with-paddings.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-pager.vertical-pager-match-parent-width-with-paddings.png", "client/flutter/divkit/test/goldens/goldens/div-pager.vertical-pager-resizable-height.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-pager.vertical-pager-resizable-height.png", "client/flutter/divkit/test/goldens/goldens/div-pager.vertical-pager-wrap-content-width-with-paddings.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-pager.vertical-pager-wrap-content-width-with-paddings.png", + "client/flutter/divkit/test/goldens/goldens/div-shadow.shadow-with-alpha.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-shadow.shadow-with-alpha.png", + "client/flutter/divkit/test/goldens/goldens/div-shadow.shadow-with-blur.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-shadow.shadow-with-blur.png", + "client/flutter/divkit/test/goldens/goldens/div-shadow.shadow-with-color.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-shadow.shadow-with-color.png", + "client/flutter/divkit/test/goldens/goldens/div-shadow.shadow-with-offset.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-shadow.shadow-with-offset.png", "client/flutter/divkit/test/goldens/goldens/div-size.wrap-content.text-min-max-constrained-false-layout-mode-wrap-horizontal.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-size.wrap-content.text-min-max-constrained-false-layout-mode-wrap-horizontal.png", "client/flutter/divkit/test/goldens/goldens/div-size.wrap-content.text-min-max-constrained-false-layout-mode-wrap-vertical.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-size.wrap-content.text-min-max-constrained-false-layout-mode-wrap-vertical.png", "client/flutter/divkit/test/goldens/goldens/div-size.wrap-content.text-min-max-constrained-false-vertical.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-size.wrap-content.text-min-max-constrained-false-vertical.png", @@ -10913,6 +10970,7 @@ "client/flutter/divkit/test/goldens/goldens/div-text.auto-ellipsize-by-max-lines.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-text.auto-ellipsize-by-max-lines.png", "client/flutter/divkit/test/goldens/goldens/div-text.auto-ellipsize-with-line-height-less-than-font-size.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-text.auto-ellipsize-with-line-height-less-than-font-size.png", "client/flutter/divkit/test/goldens/goldens/div-text.border-with-stroke.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-text.border-with-stroke.png", + "client/flutter/divkit/test/goldens/goldens/div-text.composite-background.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-text.composite-background.png", "client/flutter/divkit/test/goldens/goldens/div-text.corner-radius-clamp.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-text.corner-radius-clamp.png", "client/flutter/divkit/test/goldens/goldens/div-text.corner-radius.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-text.corner-radius.png", "client/flutter/divkit/test/goldens/goldens/div-text.corners_radius.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-text.corners_radius.png", @@ -10932,6 +10990,7 @@ "client/flutter/divkit/test/goldens/goldens/div-text.font_weight.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-text.font_weight.png", "client/flutter/divkit/test/goldens/goldens/div-text.gradient-background.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-text.gradient-background.png", "client/flutter/divkit/test/goldens/goldens/div-text.gradient-color-text.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-text.gradient-color-text.png", + "client/flutter/divkit/test/goldens/goldens/div-text.image-background.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-text.image-background.png", "client/flutter/divkit/test/goldens/goldens/div-text.images_hyphenation.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-text.images_hyphenation.png", "client/flutter/divkit/test/goldens/goldens/div-text.line-height.multi-line-text-with-image.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-text.line-height.multi-line-text-with-image.png", "client/flutter/divkit/test/goldens/goldens/div-text.line-height.multi-line-text-with-text-size-ranges.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-text.line-height.multi-line-text-with-text-size-ranges.png", @@ -10955,6 +11014,17 @@ "client/flutter/divkit/test/goldens/goldens/div-text.vertical-alignments.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-text.vertical-alignments.png", "client/flutter/divkit/test/goldens/goldens/div-text.visibility-gone.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-text.visibility-gone.png", "client/flutter/divkit/test/goldens/goldens/div-text.visibility-invisible.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-text.visibility-invisible.png", + "client/flutter/divkit/test/goldens/goldens/div-transform.transform_identity.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-transform.transform_identity.png", + "client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_bottom_center.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_bottom_center.png", + "client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_bottom_left_corner.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_bottom_left_corner.png", + "client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_bottom_right_corner.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_bottom_right_corner.png", + "client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_center.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_center.png", + "client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_left_center.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_left_center.png", + "client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_right_center.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_right_center.png", + "client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_top_center.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_top_center.png", + "client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_top_left_corner.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_top_left_corner.png", + "client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_top_right_corner.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_top_right_corner.png", + "client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_90_around_center.png":"divkit/public/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_90_around_center.png", "client/flutter/divkit/test/goldens/main_goldens_test.dart":"divkit/public/client/flutter/divkit/test/goldens/main_goldens_test.dart", "client/flutter/divkit/test/goldens/models/snapshot_test_model.dart":"divkit/public/client/flutter/divkit/test/goldens/models/snapshot_test_model.dart", "client/flutter/divkit/test/goldens/models/test_files.dart":"divkit/public/client/flutter/divkit/test/goldens/models/test_files.dart", diff --git a/client/flutter/divkit/pubspec.yaml b/client/flutter/divkit/pubspec.yaml index 4cea3c61e..062b99a06 100644 --- a/client/flutter/divkit/pubspec.yaml +++ b/client/flutter/divkit/pubspec.yaml @@ -33,3 +33,7 @@ dev_dependencies: path: ^1.8.2 golden_toolkit: ^0.15.0 fake_async: ^1.3.1 + http: ^0.13.5 + mocktail_image_network: ^1.2.0 + sqflite: ^2.2.5 + sqflite_common_ffi: ^2.2.5 diff --git a/client/flutter/divkit/test/goldens/config/skipped_tests.dart b/client/flutter/divkit/test/goldens/config/skipped_tests.dart index 5bfa49786..c9bb95884 100644 --- a/client/flutter/divkit/test/goldens/config/skipped_tests.dart +++ b/client/flutter/divkit/test/goldens/config/skipped_tests.dart @@ -13,6 +13,12 @@ class _SkipTest { enum _Reason { divNotSupported, haveToLoadNetworkImage, + // SVG images crash, or test stucks on forever + // We need to support mocking them + // https://st.yandex-team.ru/YXPRODELIVERY-4382 + svgImage, + // One or more sides of the image happened to be 0 + invalidImageDimensions, crashesOnImageDimensions, crashesOnAspectRatio, crashesOnRenderFlexOverflow, @@ -308,31 +314,6 @@ final skippedTests = [ ), ), - ...[ - 'test_data/snapshot_test_data/div-container/horizontal-orientation-bottom-horizontal-alignment.json', - 'test_data/snapshot_test_data/div-container/horizontal-orientation-bottom-vertical-alignment.json', - 'test_data/snapshot_test_data/div-container/horizontal-orientation-center-horizontal-alignment.json', - 'test_data/snapshot_test_data/div-container/horizontal-orientation-center-vertical-alignment.json', - 'test_data/snapshot_test_data/div-container/horizontal-orientation-space-around-alignment.json', - 'test_data/snapshot_test_data/div-container/horizontal-orientation-space-between-alignment.json', - 'test_data/snapshot_test_data/div-container/horizontal-orientation-space-evenly-alignment.json', - 'test_data/snapshot_test_data/div-container/overlap-orientation.json', - 'test_data/snapshot_test_data/div-container/overlap-with-match-parent-child.json', - 'test_data/snapshot_test_data/div-container/size_unit.json', - 'test_data/snapshot_test_data/div-container/vertical-orientation-center-alignment.json', - 'test_data/snapshot_test_data/div-container/vertical-orientation-space-around-alignment.json', - 'test_data/snapshot_test_data/div-container/vertical-orientation-space-between-alignment.json', - 'test_data/snapshot_test_data/div-container/vertical-orientation-space-evenly-alignment.json', - 'test_data/snapshot_test_data/div-background/scale_stretch.json', - 'test_data/snapshot_test_data/div-container/no-scale-background.json', - ].map( - (e) => _SkipTest( - e, - _Reason.haveToLoadNetworkImage, - 'Framework can not load load network images during testing', - ), - ), - ...[ 'test_data/snapshot_test_data/div-container/overlap-container-alignment.json', 'test_data/snapshot_test_data/div-container/overlap-orientation-default-alignments.json', @@ -483,43 +464,8 @@ final skippedTests = [ ...[ 'test_data/snapshot_test_data/div-image/custom-preview.json', - 'test_data/snapshot_test_data/div-image/custom-tint-color.json', 'test_data/snapshot_test_data/div-image/placeholder-color.json', 'test_data/snapshot_test_data/div-image/preview.json', - 'test_data/snapshot_test_data/div-image/tint-mode.json', - 'test_data/snapshot_test_data/div-image/aspect-fixed.json', - 'test_data/snapshot_test_data/div-image/aspect-match_parent.json', - 'test_data/snapshot_test_data/div-image/aspect-wrap_content.json', - 'test_data/snapshot_test_data/div-image/blur-with-big-radius.json', - 'test_data/snapshot_test_data/div-image/blur.json', - 'test_data/snapshot_test_data/div-image/border-with-stroke.json', - 'test_data/snapshot_test_data/div-image/composite-background.json', - 'test_data/snapshot_test_data/div-image/content-horizontal-alignment-end.json', - 'test_data/snapshot_test_data/div-image/content-horizontal-alignment-start.json', - 'test_data/snapshot_test_data/div-image/corner-radius.json', - 'test_data/snapshot_test_data/div-image/corners_radius.json', - 'test_data/snapshot_test_data/div-image/custom-alpha.json', - 'test_data/snapshot_test_data/div-image/custom-height.json', - 'test_data/snapshot_test_data/div-image/custom-margins.json', - 'test_data/snapshot_test_data/div-image/custom-paddings.json', - 'test_data/snapshot_test_data/div-image/custom-width.json', - 'test_data/snapshot_test_data/div-image/no_scale.json', - 'test_data/snapshot_test_data/div-image/no_scale_bottom_right.json', - 'test_data/snapshot_test_data/div-image/no_scale_top_left.json', - 'test_data/snapshot_test_data/div-image/rtl-filter.json', - 'test_data/snapshot_test_data/div-image/rtl-image-content-horizontal-alignment-end.json', - 'test_data/snapshot_test_data/div-image/rtl-image-content-horizontal-alignment-start.json', - 'test_data/snapshot_test_data/div-image/scale_fill.json', - 'test_data/snapshot_test_data/div-image/scale_fill_bottom.json', - 'test_data/snapshot_test_data/div-image/scale_fill_right.json', - 'test_data/snapshot_test_data/div-image/scale_fit.json', - 'test_data/snapshot_test_data/div-image/scale_fit_bottom.json', - 'test_data/snapshot_test_data/div-image/scale_fit_left.json', - 'test_data/snapshot_test_data/div-image/scale_fit_right.json', - 'test_data/snapshot_test_data/div-image/scale_fit_top.json', - 'test_data/snapshot_test_data/div-image/scale_stretch.json', - 'test_data/snapshot_test_data/div-image/shadow.json', - 'test_data/snapshot_test_data/div-image/wrap-content-width-by-height.json', ].map( (e) => _SkipTest( e, @@ -527,6 +473,15 @@ final skippedTests = [ ), ), + ...[ + 'test_data/snapshot_test_data/div-image/tint-mode.json', + ].map( + (e) => _SkipTest( + e, + _Reason.invalidImageDimensions, + ), + ), + // # div-indicator ...[ @@ -646,20 +601,6 @@ final skippedTests = [ ), ), -// # div-shadow - - ...[ - 'test_data/snapshot_test_data/div-shadow/shadow-with-alpha.json', - 'test_data/snapshot_test_data/div-shadow/shadow-with-blur.json', - 'test_data/snapshot_test_data/div-shadow/shadow-with-color.json', - 'test_data/snapshot_test_data/div-shadow/shadow-with-offset.json', - ].map( - (e) => _SkipTest( - e, - _Reason.haveToLoadNetworkImage, - ), - ), - // # div-size ...[ @@ -821,19 +762,9 @@ final skippedTests = [ ), const _SkipTest( 'test_data/snapshot_test_data/div-text/blur-background.json', - _Reason.haveToLoadNetworkImage, + _Reason.invalidImageDimensions, 'https://paste.yandex-team.ru/3e965301-f3ac-4ff3-ba62-c81665108399', ), - const _SkipTest( - 'test_data/snapshot_test_data/div-text/composite-background.json', - _Reason.haveToLoadNetworkImage, - 'https://paste.yandex-team.ru/04b3d5a3-5e4f-49d6-89b5-f5544e6e7242', - ), - const _SkipTest( - 'test_data/snapshot_test_data/div-text/image-background.json', - _Reason.haveToLoadNetworkImage, - 'https://paste.yandex-team.ru/15650b63-7b14-4c08-9259-db6f5b3de7b6', - ), const _SkipTest( 'test_data/snapshot_test_data/div-text/images.json', _Reason.crashesOnRenderFlexLayout, @@ -862,29 +793,28 @@ final skippedTests = [ _Reason.divNotSupported, ), ), - ...[ - 'test_data/snapshot_test_data/div-transform/transform_identity.json', - 'test_data/snapshot_test_data/div-transform/transform_turn_45_around_bottom_center.json', - 'test_data/snapshot_test_data/div-transform/transform_turn_45_around_bottom_left_corner.json', - 'test_data/snapshot_test_data/div-transform/transform_turn_45_around_bottom_right_corner.json', - 'test_data/snapshot_test_data/div-transform/transform_turn_45_around_center.json', - 'test_data/snapshot_test_data/div-transform/transform_turn_45_around_left_center.json', - 'test_data/snapshot_test_data/div-transform/transform_turn_45_around_right_center.json', - 'test_data/snapshot_test_data/div-transform/transform_turn_45_around_top_center.json', - 'test_data/snapshot_test_data/div-transform/transform_turn_45_around_top_left_corner.json', - 'test_data/snapshot_test_data/div-transform/transform_turn_45_around_top_right_corner.json', - 'test_data/snapshot_test_data/div-transform/transform_turn_90_around_center.json', + _SkipTest( 'test_data/snapshot_test_data/div-text/custom-image-tint-color.json', - 'test_data/snapshot_test_data/div-text/custom-text-alignment-with-attachments.json', - 'test_data/snapshot_test_data/div-text/ellipsis-with-image.json', - 'test_data/snapshot_test_data/div-text/all_attributes.json', - 'test_data/snapshot_test_data/div-container/vertical-composite-background.json', - ].map( - (e) => _SkipTest( - e, - _Reason.haveToLoadNetworkImage, - ), + _Reason.divNotSupported, + 'https://a.yandex-team.ru/review/6756853/files/5#comment-9971090', ), + _SkipTest( + 'test_data/snapshot_test_data/div-text/custom-text-alignment-with-attachment.json', + _Reason.divNotSupported, + 'https://a.yandex-team.ru/review/6756853/files/5#comment-9971092', + ), + _SkipTest( + 'test_data/snapshot_test_data/div-text/ellipsis-with-image.json', + _Reason.divNotSupported, + 'https://a.yandex-team.ru/review/6756853/details#comment-9971095', + ), + _SkipTest( + 'test_data/snapshot_test_data/div-text/all_attributes.json', + _Reason.divNotSupported, + 'https://a.yandex-team.ru/review/6756853/details#comment-9971087', + ), + +// # div-svg ...[ 'test_data/snapshot_test_data/div-svg/svg_background.json', @@ -894,7 +824,8 @@ final skippedTests = [ ].map( (e) => _SkipTest( e, - _Reason.haveToLoadNetworkImage, + _Reason.svgImage, + 'https://paste.yandex-team.ru/db093d74-d606-40ab-9649-94ec071e12eb', ), ), ]; diff --git a/client/flutter/divkit/test/goldens/config/test_maker.dart b/client/flutter/divkit/test/goldens/config/test_maker.dart index 5a00a4cef..48052be48 100644 --- a/client/flutter/divkit/test/goldens/config/test_maker.dart +++ b/client/flutter/divkit/test/goldens/config/test_maker.dart @@ -10,19 +10,23 @@ void makeGoldenTest({ CustomPump? customPump, }) { testGoldens(description, (tester) async { - await tester.pumpAutoSizeWidgetBuilder( - builder: builder, - afterBuild: () => enhancedScreenMatchesGolden( - tester, - fileName, - customPump: customPump, - ), - device: Devices.phone375x500, - wrapper: (child) => MaterialApp( - supportedLocales: const [Locale('en')], - debugShowCheckedModeBanner: false, - home: child, + await loadAllNetworkImages( + tester, + builder: () async => tester.pumpAutoSizeWidgetBuilder( + builder: builder, + device: Devices.phone375x500, + wrapper: (child) => MaterialApp( + supportedLocales: const [Locale('en')], + debugShowCheckedModeBanner: false, + home: child, + ), ), ); + await enhancedScreenMatchesGolden( + tester, + fileName, + customPump: customPump, + ); + await cleanUpNetworkImageMocks(tester); }); } diff --git a/client/flutter/divkit/test/goldens/framework/auto_size_widget_tester_extension.dart b/client/flutter/divkit/test/goldens/framework/auto_size_widget_tester_extension.dart index 4486ac9b4..3d03bb406 100644 --- a/client/flutter/divkit/test/goldens/framework/auto_size_widget_tester_extension.dart +++ b/client/flutter/divkit/test/goldens/framework/auto_size_widget_tester_extension.dart @@ -1,4 +1,3 @@ -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:golden_toolkit/golden_toolkit.dart'; @@ -7,7 +6,6 @@ extension AutoSizeWidgetTesterExtension on WidgetTester { /// Pumps a widget and adjusts screen size to its size. Future pumpAutoSizeWidgetBuilder({ required ValueGetter builder, - required AsyncCallback afterBuild, WidgetWrapper? wrapper, Device? device, }) async { @@ -35,7 +33,17 @@ extension AutoSizeWidgetTesterExtension on WidgetTester { ), ), ), - wrapper: wrapper, + wrapper: (child) => Builder( + builder: (context) { + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + // A hack, until https://github.com/eBay/flutter_glove_box/pull/193 is merged + binding.window.devicePixelRatioTestValue = + device?.devicePixelRatio ?? 1; + }); + + return wrapper?.call(child) ?? materialAppWrapper()(child); + }, + ), ); await pumpAndSettle(); @@ -43,19 +51,14 @@ extension AutoSizeWidgetTesterExtension on WidgetTester { find.firstDescendant(of: find.byKey(childKey)), ); - try { - await binding.setSurfaceSize(childSize); - binding.window.physicalSizeTestValue = childSize; - if (device != null) { - binding.window.devicePixelRatioTestValue = device.devicePixelRatio; - } - - await afterBuild(); - } finally { + addTearDown(() async { await binding.setSurfaceSize(null); binding.window.clearPhysicalSizeTestValue(); binding.window.clearDevicePixelRatioTestValue(); - } + }); + + await binding.setSurfaceSize(childSize); + binding.window.physicalSizeTestValue = childSize; } } diff --git a/client/flutter/divkit/test/goldens/framework/framework.dart b/client/flutter/divkit/test/goldens/framework/framework.dart index c7040c199..afb0b7502 100644 --- a/client/flutter/divkit/test/goldens/framework/framework.dart +++ b/client/flutter/divkit/test/goldens/framework/framework.dart @@ -1,5 +1,6 @@ export 'package:golden_toolkit/golden_toolkit.dart'; +export 'mock_images/mock_and_load_network_images.dart'; export 'auto_size_widget_tester_extension.dart'; export 'enhanced_file_comparator.dart'; export 'flutter_test_config.dart'; diff --git a/client/flutter/divkit/test/goldens/framework/golden_test_for_ci.dart b/client/flutter/divkit/test/goldens/framework/golden_test_for_ci.dart deleted file mode 100644 index d53b37838..000000000 --- a/client/flutter/divkit/test/goldens/framework/golden_test_for_ci.dart +++ /dev/null @@ -1,87 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:golden_toolkit/golden_toolkit.dart'; -import 'package:meta/meta.dart'; - -import 'screen_matches_golden.dart'; - -@isTest -Future goldenTestForCI({ - required String description, - required String testFileName, - required Device device, - required ValueGetter builder, -}) async { - testGoldens( - description, - (WidgetTester tester) async { - final constraints = BoxConstraints( - maxHeight: device.size.height, - maxWidth: device.size.width, - ); - - final childKey = UniqueKey(); - await tester.pumpWidgetBuilder( - Center( - child: OverflowBox( - minWidth: constraints.minWidth, - minHeight: constraints.minHeight, - maxWidth: constraints.maxWidth, - maxHeight: constraints.maxHeight, - child: Center( - child: KeyedSubtree( - key: childKey, - child: builder(), - ), - ), - ), - ), - wrapper: (child) => MaterialApp( - supportedLocales: const [Locale('en')], - debugShowCheckedModeBanner: false, - home: child, - ), - ); - await tester.pumpAndSettle(); - - final childSize = tester.getSize( - find.firstDescendant(of: find.byKey(childKey)), - ); - - try { - await tester.binding.setSurfaceSize(childSize); - tester.binding.window.physicalSizeTestValue = childSize; - tester.binding.window.devicePixelRatioTestValue = - device.devicePixelRatio; - - await enhancedScreenMatchesGolden( - tester, - testFileName, - ); - } finally { - await tester.binding.setSurfaceSize(null); - tester.binding.window.clearPhysicalSizeTestValue(); - tester.binding.window.clearDevicePixelRatioTestValue(); - } - }, - ); -} - -extension on CommonFinders { - Finder firstDescendant({ - required Finder of, - bool skipOffstage = true, - }) { - final acenstor = of; - final Iterable ancestorElements = acenstor.evaluate(); - final List candidates = ancestorElements - .expand( - (Element element) => - collectAllElementsFrom(element, skipOffstage: skipOffstage), - ) - .toSet() - .toList(); - final builtChild = candidates.first; - return find.byElementPredicate((element) => element == builtChild); - } -} diff --git a/client/flutter/divkit/test/goldens/framework/mock_images/enable_http.dart b/client/flutter/divkit/test/goldens/framework/mock_images/enable_http.dart new file mode 100644 index 000000000..ca182353a --- /dev/null +++ b/client/flutter/divkit/test/goldens/framework/mock_images/enable_http.dart @@ -0,0 +1,11 @@ +import 'dart:io'; + +/// Enables network calls in tests with the [body]. +/// +/// Will not work if [body] itself creates other overrides. +R enableHttpInTests(R Function() body) => HttpOverrides.runWithHttpOverrides( + body, + _MyHttpOverrides(), + ); + +class _MyHttpOverrides extends HttpOverrides {} diff --git a/client/flutter/divkit/test/goldens/framework/mock_images/mock_and_load_network_images.dart b/client/flutter/divkit/test/goldens/framework/mock_images/mock_and_load_network_images.dart new file mode 100644 index 000000000..6bc1ce643 --- /dev/null +++ b/client/flutter/divkit/test/goldens/framework/mock_images/mock_and_load_network_images.dart @@ -0,0 +1,335 @@ +import 'dart:async'; +import 'dart:io'; +import 'dart:math'; +import 'dart:ui' as ui; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:http/http.dart' as http; +import 'package:mocktail_image_network/mocktail_image_network.dart'; +import 'package:sqflite_common_ffi/sqflite_ffi.dart'; + +import 'enable_http.dart'; +import 'mock_images_utils.dart'; + +/// Loads all network image ([CachedNetworkImage] as well). +/// +/// Enables HTTP locally for this operation. +/// +/// You must call [cleanUpNetworkImageMocks] in the very end of the test, if you use +/// this function. +Future loadAllNetworkImages( + WidgetTester tester, { + required AsyncCallback builder, +}) => + _mockAllNetworkImages( + tester, + builder, + _downloadImage, + ); + +/// Must be called in the very end of the test, whenever +/// this test contained calls to [loadAllNetworkImages] or [mockAllNetworkImages]. +/// +/// This contract is needed, because this clean up has to occur +/// before the test ends and thus cannot be done in [tearDown]. +Future cleanUpNetworkImageMocks(WidgetTester tester) => + _CleanUpRegistry.instance.cleanUp(tester); + +class _CleanUpRegistry { + static final instance = _CleanUpRegistry(); + + final _testerCleanedUpData = {}; + + void register(WidgetTester tester) { + _testerCleanedUpData[tester] = false; + addTearDown(() { + _verifyCleanedUp(tester); + }); + } + + Future cleanUp(WidgetTester tester) async { + final cleanedUp = _testerCleanedUpData[tester]; + if (cleanedUp != true) { + await tester.runAsync(pumpEventQueue); + await tester.binding.delayed(const Duration(days: 999)); + + _testerCleanedUpData[tester] = true; + } + } + + void _verifyCleanedUp(WidgetTester tester) { + final cleanedUp = _testerCleanedUpData.remove(tester); + assert( + cleanedUp != null, + 'verifyCleanedUp called without register, or cleanUp has failed', + ); + if (cleanedUp != true) { + fail('cleanUpNetworkImageMocks must be called in the end of test'); + } + } +} + +Future _mockAllNetworkImages( + WidgetTester tester, + AsyncCallback builder, + _ImageBuilder imageBuilder, +) async { + _CleanUpRegistry.instance.register(tester); + + _mockPlatformChannels(tester); + // Additionally wrap into to mock requests from initial pump + // and be sure they don't turn into errors. + await mockNetworkImages(() async { + await builder(); + }); + + tester.binding.imageCache.clear(); + tester.binding.imageCache.clearLiveImages(); + + await _mockAllNetworkImageWidgets(tester, imageBuilder); + await _mockAllCachedNetworkImages(tester, imageBuilder); + + await tester.pumpWidget(const SizedBox()); + + await builder(); +} + +void _mockPlatformChannels(WidgetTester tester) { + final tempRelativePath = './temp${Random().nextInt(10000)}'; + final dir = Directory(tempRelativePath); + + tester.binding.defaultBinaryMessenger.setMockMethodCallHandler( + const MethodChannel('plugins.flutter.io/path_provider'), + (methodCall) async { + if (methodCall.method == 'getTemporaryDirectory' || + methodCall.method == 'getApplicationSupportDirectory') { + return tempRelativePath; + } + return {}; + }, + ); + + _mockSqflite(); + + addTearDown(() { + if (dir.existsSync()) { + dir.deleteSync(recursive: true); + } + }); +} + +void _mockSqflite() { + databaseFactoryOrNull = databaseFactoryFfi; +} + +typedef _ImageBuilder = Future Function( + String url, + Map? headers, + int width, + int height, +); + +Future _mockAllCachedNetworkImages( + WidgetTester tester, + _ImageBuilder imageBuilder, +) async { + final imageElements = find.byType(Image, skipOffstage: false).evaluate(); + final containerElements = + find.byType(DecoratedBox, skipOffstage: false).evaluate(); + final cachedNetworkImageElements = + find.byType(CachedNetworkImage, skipOffstage: false).evaluate().toList(); + + await tester.runAsync(() async { + for (final cachedNetworkImageElement in cachedNetworkImageElements) { + final widget = cachedNetworkImageElement.widget; + if (widget is CachedNetworkImage) { + ImageProvider imageProvider = CachedNetworkImageProvider( + widget.imageUrl, + cacheKey: widget.cacheKey, + maxWidth: widget.maxWidthDiskCache, + maxHeight: widget.maxHeightDiskCache, + ); + imageProvider = ResizeImage.resizeIfNeeded( + widget.memCacheWidth, + widget.memCacheHeight, + imageProvider, + ); + final imageConfig = + await extractImageConfig( + imageProvider, + cachedNetworkImageElement, + ); + if (imageConfig != null) { + final image = await imageBuilder( + widget.imageUrl, + widget.httpHeaders, + imageConfig.width, + imageConfig.height, + ); + // There is a problem here. + // Actually CachedNetworkImageProvider hashCode looks like this: + // ``` + // Object.hash(cacheKey ?? url, scale, maxHeight, maxWidth) + // ``` + // But scale is not a parameter of the widget and we cannot get it here, so + // theoretically this could break at some point in the future. + _mockNetworkImage(tester, imageConfig.cacheKey, image); + } + } + } + for (final imageElement in imageElements) { + final widget = imageElement.widget; + if (widget is Image) { + final imageConfig = + await extractImageConfig( + widget.image, + imageElement, + ); + if (imageConfig != null) { + final image = await imageBuilder( + imageConfig.image.url, + imageConfig.image.headers, + imageConfig.width, + imageConfig.height, + ); + _mockNetworkImage(tester, imageConfig.cacheKey, image); + } + } + } + for (final containerElement in containerElements) { + final widget = containerElement.widget as DecoratedBox; + final decoration = widget.decoration; + if (decoration is BoxDecoration) { + final imageConfig = + await extractImageConfig( + decoration.image?.image, + containerElement, + ); + if (imageConfig != null) { + final image = await imageBuilder( + imageConfig.image.url, + imageConfig.image.headers, + imageConfig.width, + imageConfig.height, + ); + _mockNetworkImage(tester, imageConfig.cacheKey, image); + } + } + } + }); +} + +Future _mockAllNetworkImageWidgets( + WidgetTester tester, + _ImageBuilder imageBuilder, +) async { + final imageElements = find.byType(Image, skipOffstage: false).evaluate(); + final containerElements = + find.byType(DecoratedBox, skipOffstage: false).evaluate(); + + await tester.runAsync(() async { + for (final imageElement in imageElements) { + final widget = imageElement.widget; + if (widget is Image) { + final imageConfig = await extractImageConfig( + widget.image, + imageElement, + ); + if (imageConfig != null) { + final image = await imageBuilder( + imageConfig.image.url, + imageConfig.image.headers, + imageConfig.width, + imageConfig.height, + ); + _mockNetworkImage(tester, imageConfig.cacheKey, image); + } + } + } + for (final containerElement in containerElements) { + final widget = containerElement.widget as DecoratedBox; + final decoration = widget.decoration; + if (decoration is BoxDecoration) { + final imageConfig = await extractImageConfig( + decoration.image?.image, + containerElement, + ); + if (imageConfig != null) { + final image = await imageBuilder( + imageConfig.image.url, + imageConfig.image.headers, + imageConfig.width, + imageConfig.height, + ); + _mockNetworkImage(tester, imageConfig.cacheKey, image); + } + } + } + }); +} + +final Map> _downloadCache = {}; + +Future _downloadImage( + String url, + Map? headers, + int width, + int height, +) async { + final int cacheKey = Object.hash(url, width, height); + final cached = _downloadCache[cacheKey]; + if (cached != null) { + final bytes8List = await cached.future; + return _decodeImageFromListWithSize(bytes8List, width, height); + } + final completer = Completer(); + _downloadCache[cacheKey] = completer; + + return enableHttpInTests( + () async { + final httpClient = http.Client(); + final req = http.Request('GET', Uri.parse(url)); + if (headers != null) { + req.headers.addAll(headers); + } + final httpResponse = await httpClient.send(req); + final response = await http.Response.fromStream(httpResponse); + final bytes8List = Uint8List.fromList(response.bodyBytes); + completer.complete(bytes8List); + return _decodeImageFromListWithSize(bytes8List, width, height); + }, + ); +} + +/// See also [decodeImageFromList]. +Future _decodeImageFromListWithSize( + Uint8List bytes, + int cacheWidth, + int cacheHeight, +) async { + final buffer = await ui.ImmutableBuffer.fromUint8List(bytes); + + final codec = await PaintingBinding.instance.instantiateImageCodecFromBuffer( + buffer, + cacheWidth: cacheWidth, + cacheHeight: cacheHeight, + ); + final ui.FrameInfo frameInfo = await codec.getNextFrame(); + return frameInfo.image; +} + +void _mockNetworkImage( + WidgetTester tester, + Object key, + ui.Image image, +) => + tester.binding.imageCache.putIfAbsent( + key, + () => OneFrameImageStreamCompleter( + Future.value(ImageInfo(image: image)), + ), + ); diff --git a/client/flutter/divkit/test/goldens/framework/mock_images/mock_images_utils.dart b/client/flutter/divkit/test/goldens/framework/mock_images/mock_images_utils.dart new file mode 100644 index 000000000..2a6633aa1 --- /dev/null +++ b/client/flutter/divkit/test/goldens/framework/mock_images/mock_images_utils.dart @@ -0,0 +1,44 @@ +import 'package:flutter/widgets.dart'; + +class _ImageConfig { + final int width; + final int height; + final T image; + final Object cacheKey; + + _ImageConfig( + this.width, + this.height, + this.image, + this.cacheKey, + ); +} + +Future<_ImageConfig?> extractImageConfig( + ImageProvider? imageProvider, + Element imageElement, +) async { + final renderBox = imageElement.renderObject! as RenderBox; + if (imageProvider is ResizeImage && + imageProvider.imageProvider is T && + imageProvider.width != null && + imageProvider.height != null) { + return _ImageConfig( + imageProvider.width!, + imageProvider.height!, + imageProvider.imageProvider as T, + await imageProvider + .obtainKey(createLocalImageConfiguration(imageElement)), + ); + } + if (imageProvider is T) { + return _ImageConfig( + renderBox.size.width.ceil(), + renderBox.size.height.ceil(), + imageProvider, + await imageProvider + .obtainKey(createLocalImageConfiguration(imageElement)), + ); + } + return null; +} diff --git a/client/flutter/divkit/test/goldens/framework/screen_settings.dart b/client/flutter/divkit/test/goldens/framework/screen_settings.dart index 7e4f102dc..77df99289 100644 --- a/client/flutter/divkit/test/goldens/framework/screen_settings.dart +++ b/client/flutter/divkit/test/goldens/framework/screen_settings.dart @@ -3,14 +3,6 @@ import 'dart:ui'; import 'framework.dart'; abstract class Devices { - static const iphone3 = Device( - name: 'iphone3', - size: Size( - 320, - 480, - ), - devicePixelRatio: 2.0, - ); static const phone375x500 = Device( name: 'phone375x500', size: Size( diff --git a/client/flutter/divkit/test/goldens/goldens/div-background.scale_stretch.png b/client/flutter/divkit/test/goldens/goldens/div-background.scale_stretch.png new file mode 100644 index 000000000..edbacdbe2 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-background.scale_stretch.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-bottom-horizontal-alignment.png b/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-bottom-horizontal-alignment.png new file mode 100644 index 000000000..f6f826380 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-bottom-horizontal-alignment.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-bottom-vertical-alignment.png b/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-bottom-vertical-alignment.png new file mode 100644 index 000000000..925f72166 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-bottom-vertical-alignment.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-center-horizontal-alignment.png b/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-center-horizontal-alignment.png new file mode 100644 index 000000000..b5bb03396 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-center-horizontal-alignment.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-center-vertical-alignment.png b/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-center-vertical-alignment.png new file mode 100644 index 000000000..372dab161 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-center-vertical-alignment.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-space-around-alignment.png b/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-space-around-alignment.png new file mode 100644 index 000000000..812200015 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-space-around-alignment.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-space-between-alignment.png b/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-space-between-alignment.png new file mode 100644 index 000000000..33c8a05dd Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-space-between-alignment.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-space-evenly-alignment.png b/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-space-evenly-alignment.png new file mode 100644 index 000000000..b341ef185 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-container.horizontal-orientation-space-evenly-alignment.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-container.no-scale-background.png b/client/flutter/divkit/test/goldens/goldens/div-container.no-scale-background.png new file mode 100644 index 000000000..8861a3f1f Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-container.no-scale-background.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-container.overlap-orientation.png b/client/flutter/divkit/test/goldens/goldens/div-container.overlap-orientation.png new file mode 100644 index 000000000..ff38307ad Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-container.overlap-orientation.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-container.overlap-with-match-parent-child.png b/client/flutter/divkit/test/goldens/goldens/div-container.overlap-with-match-parent-child.png new file mode 100644 index 000000000..8cc38c091 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-container.overlap-with-match-parent-child.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-container.size_unit.png b/client/flutter/divkit/test/goldens/goldens/div-container.size_unit.png new file mode 100644 index 000000000..1ab7bcdac Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-container.size_unit.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-container.vertical-composite-background.png b/client/flutter/divkit/test/goldens/goldens/div-container.vertical-composite-background.png new file mode 100644 index 000000000..8cc91e7e5 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-container.vertical-composite-background.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-center-alignment.png b/client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-center-alignment.png new file mode 100644 index 000000000..e1f5b3383 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-center-alignment.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-space-around-alignment.png b/client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-space-around-alignment.png new file mode 100644 index 000000000..766ce3c5b Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-space-around-alignment.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-space-between-alignment.png b/client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-space-between-alignment.png new file mode 100644 index 000000000..83910eae7 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-space-between-alignment.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-space-evenly-alignment.png b/client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-space-evenly-alignment.png new file mode 100644 index 000000000..2fe937c37 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-container.vertical-orientation-space-evenly-alignment.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.aspect-fixed.png b/client/flutter/divkit/test/goldens/goldens/div-image.aspect-fixed.png new file mode 100644 index 000000000..5bfd61c86 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.aspect-fixed.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.aspect-match_parent.png b/client/flutter/divkit/test/goldens/goldens/div-image.aspect-match_parent.png new file mode 100644 index 000000000..0fdd7bcee Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.aspect-match_parent.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.aspect-wrap_content.png b/client/flutter/divkit/test/goldens/goldens/div-image.aspect-wrap_content.png new file mode 100644 index 000000000..ef3eace68 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.aspect-wrap_content.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.blur-with-big-radius.png b/client/flutter/divkit/test/goldens/goldens/div-image.blur-with-big-radius.png new file mode 100644 index 000000000..8d8438894 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.blur-with-big-radius.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.blur.png b/client/flutter/divkit/test/goldens/goldens/div-image.blur.png new file mode 100644 index 000000000..27b3ba7a3 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.blur.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.border-with-stroke.png b/client/flutter/divkit/test/goldens/goldens/div-image.border-with-stroke.png new file mode 100644 index 000000000..07a4ccb81 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.border-with-stroke.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.composite-background.png b/client/flutter/divkit/test/goldens/goldens/div-image.composite-background.png new file mode 100644 index 000000000..75c9ee681 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.composite-background.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.content-horizontal-alignment-end.png b/client/flutter/divkit/test/goldens/goldens/div-image.content-horizontal-alignment-end.png new file mode 100644 index 000000000..26551d978 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.content-horizontal-alignment-end.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.content-horizontal-alignment-start.png b/client/flutter/divkit/test/goldens/goldens/div-image.content-horizontal-alignment-start.png new file mode 100644 index 000000000..8905aa405 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.content-horizontal-alignment-start.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.corner-radius.png b/client/flutter/divkit/test/goldens/goldens/div-image.corner-radius.png new file mode 100644 index 000000000..6be95a9eb Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.corner-radius.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.corners_radius.png b/client/flutter/divkit/test/goldens/goldens/div-image.corners_radius.png new file mode 100644 index 000000000..51fb75a9c Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.corners_radius.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.custom-alpha.png b/client/flutter/divkit/test/goldens/goldens/div-image.custom-alpha.png new file mode 100644 index 000000000..62409d1ea Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.custom-alpha.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.custom-height.png b/client/flutter/divkit/test/goldens/goldens/div-image.custom-height.png new file mode 100644 index 000000000..1f09aa69d Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.custom-height.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.custom-margins.png b/client/flutter/divkit/test/goldens/goldens/div-image.custom-margins.png new file mode 100644 index 000000000..cca76afda Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.custom-margins.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.custom-paddings.png b/client/flutter/divkit/test/goldens/goldens/div-image.custom-paddings.png new file mode 100644 index 000000000..cee844e3e Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.custom-paddings.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.custom-tint-color.png b/client/flutter/divkit/test/goldens/goldens/div-image.custom-tint-color.png new file mode 100644 index 000000000..dfd5633bf Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.custom-tint-color.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.custom-width.png b/client/flutter/divkit/test/goldens/goldens/div-image.custom-width.png new file mode 100644 index 000000000..27f1c8543 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.custom-width.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.no_scale.png b/client/flutter/divkit/test/goldens/goldens/div-image.no_scale.png new file mode 100644 index 000000000..99ef4f855 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.no_scale.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.no_scale_bottom_right.png b/client/flutter/divkit/test/goldens/goldens/div-image.no_scale_bottom_right.png new file mode 100644 index 000000000..43f0c53b2 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.no_scale_bottom_right.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.no_scale_top_left.png b/client/flutter/divkit/test/goldens/goldens/div-image.no_scale_top_left.png new file mode 100644 index 000000000..de155f6f9 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.no_scale_top_left.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.rtl-filter.png b/client/flutter/divkit/test/goldens/goldens/div-image.rtl-filter.png new file mode 100644 index 000000000..414618db7 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.rtl-filter.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.rtl-image-content-horizontal-alignment-end.png b/client/flutter/divkit/test/goldens/goldens/div-image.rtl-image-content-horizontal-alignment-end.png new file mode 100644 index 000000000..8905aa405 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.rtl-image-content-horizontal-alignment-end.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.rtl-image-content-horizontal-alignment-start.png b/client/flutter/divkit/test/goldens/goldens/div-image.rtl-image-content-horizontal-alignment-start.png new file mode 100644 index 000000000..26551d978 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.rtl-image-content-horizontal-alignment-start.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.scale_fill.png b/client/flutter/divkit/test/goldens/goldens/div-image.scale_fill.png new file mode 100644 index 000000000..9e387c696 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.scale_fill.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.scale_fill_bottom.png b/client/flutter/divkit/test/goldens/goldens/div-image.scale_fill_bottom.png new file mode 100644 index 000000000..8b6950cd9 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.scale_fill_bottom.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.scale_fill_right.png b/client/flutter/divkit/test/goldens/goldens/div-image.scale_fill_right.png new file mode 100644 index 000000000..bbfd66b4f Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.scale_fill_right.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.scale_fit.png b/client/flutter/divkit/test/goldens/goldens/div-image.scale_fit.png new file mode 100644 index 000000000..f9a2c7a26 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.scale_fit.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.scale_fit_bottom.png b/client/flutter/divkit/test/goldens/goldens/div-image.scale_fit_bottom.png new file mode 100644 index 000000000..307c76593 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.scale_fit_bottom.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.scale_fit_left.png b/client/flutter/divkit/test/goldens/goldens/div-image.scale_fit_left.png new file mode 100644 index 000000000..f9a2c7a26 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.scale_fit_left.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.scale_fit_right.png b/client/flutter/divkit/test/goldens/goldens/div-image.scale_fit_right.png new file mode 100644 index 000000000..f9a2c7a26 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.scale_fit_right.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.scale_fit_top.png b/client/flutter/divkit/test/goldens/goldens/div-image.scale_fit_top.png new file mode 100644 index 000000000..307c76593 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.scale_fit_top.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.scale_stretch.png b/client/flutter/divkit/test/goldens/goldens/div-image.scale_stretch.png new file mode 100644 index 000000000..7fc678e75 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.scale_stretch.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.shadow.png b/client/flutter/divkit/test/goldens/goldens/div-image.shadow.png new file mode 100644 index 000000000..b03540773 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.shadow.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-image.wrap-content-width-by-height.png b/client/flutter/divkit/test/goldens/goldens/div-image.wrap-content-width-by-height.png new file mode 100644 index 000000000..4e068350a Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-image.wrap-content-width-by-height.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-shadow.shadow-with-alpha.png b/client/flutter/divkit/test/goldens/goldens/div-shadow.shadow-with-alpha.png new file mode 100644 index 000000000..977e58e4b Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-shadow.shadow-with-alpha.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-shadow.shadow-with-blur.png b/client/flutter/divkit/test/goldens/goldens/div-shadow.shadow-with-blur.png new file mode 100644 index 000000000..2099f2200 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-shadow.shadow-with-blur.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-shadow.shadow-with-color.png b/client/flutter/divkit/test/goldens/goldens/div-shadow.shadow-with-color.png new file mode 100644 index 000000000..cf304d9a4 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-shadow.shadow-with-color.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-shadow.shadow-with-offset.png b/client/flutter/divkit/test/goldens/goldens/div-shadow.shadow-with-offset.png new file mode 100644 index 000000000..4bea9a733 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-shadow.shadow-with-offset.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-text.composite-background.png b/client/flutter/divkit/test/goldens/goldens/div-text.composite-background.png new file mode 100644 index 000000000..6622db99d Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-text.composite-background.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-text.image-background.png b/client/flutter/divkit/test/goldens/goldens/div-text.image-background.png new file mode 100644 index 000000000..66f9f32d5 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-text.image-background.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-transform.transform_identity.png b/client/flutter/divkit/test/goldens/goldens/div-transform.transform_identity.png new file mode 100644 index 000000000..14ef94901 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-transform.transform_identity.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_bottom_center.png b/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_bottom_center.png new file mode 100644 index 000000000..14ef94901 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_bottom_center.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_bottom_left_corner.png b/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_bottom_left_corner.png new file mode 100644 index 000000000..14ef94901 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_bottom_left_corner.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_bottom_right_corner.png b/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_bottom_right_corner.png new file mode 100644 index 000000000..14ef94901 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_bottom_right_corner.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_center.png b/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_center.png new file mode 100644 index 000000000..14ef94901 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_center.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_left_center.png b/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_left_center.png new file mode 100644 index 000000000..14ef94901 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_left_center.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_right_center.png b/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_right_center.png new file mode 100644 index 000000000..14ef94901 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_right_center.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_top_center.png b/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_top_center.png new file mode 100644 index 000000000..14ef94901 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_top_center.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_top_left_corner.png b/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_top_left_corner.png new file mode 100644 index 000000000..14ef94901 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_top_left_corner.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_top_right_corner.png b/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_top_right_corner.png new file mode 100644 index 000000000..14ef94901 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_45_around_top_right_corner.png differ diff --git a/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_90_around_center.png b/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_90_around_center.png new file mode 100644 index 000000000..14ef94901 Binary files /dev/null and b/client/flutter/divkit/test/goldens/goldens/div-transform.transform_turn_90_around_center.png differ diff --git a/client/flutter/divkit/test/goldens/main_goldens_test.dart b/client/flutter/divkit/test/goldens/main_goldens_test.dart index 2b091efd1..d6fb09f8d 100644 --- a/client/flutter/divkit/test/goldens/main_goldens_test.dart +++ b/client/flutter/divkit/test/goldens/main_goldens_test.dart @@ -12,9 +12,9 @@ void main() async { if (kDebugMode) { print('Running tests...'); print('Will skip ${skippedTests.length} tests'); + print('All tests: ${tests.length}'); } - print('All tests: ${tests.length}'); await runTests(tests); } } diff --git a/client/flutter/divkit/tool/replace_goldens.sh b/client/flutter/divkit/tool/replace_goldens.sh index a91097ee3..15b348679 100755 --- a/client/flutter/divkit/tool/replace_goldens.sh +++ b/client/flutter/divkit/tool/replace_goldens.sh @@ -1,9 +1,7 @@ #!/bin/bash INPUT_PATH=$1 -GOLDENS_DIR="test/goldens/goldens" -FAILURES_DIR="test/goldens/failures" -TEMP_DIR="temp_extracted_to_replace" +TEMP_DIR="$(dirname $INPUT_PATH)/temp_extracted_to_replace" TEST_FILE_POSTFIX="_testImage" ZIP_FILE=false @@ -31,7 +29,7 @@ if [[ $ZIP_FILE = true ]]; then unzip -o "$INPUT_PATH" -d $WORK_FOLDER echo else - WORK_FOLDER=$FAILURES_DIR + WORK_FOLDER=$INPUT_PATH fi function testImageFiles() { @@ -48,10 +46,24 @@ echo "Found ${#FILES_ARRAY[@]} test files" echo for FILE in $FILES; do - # Remove substring to match golden file name + # Here convert string like "/Users/username/Downloads/test/goldens/failures/testName_testImage.png" + # To string like "test/goldens/failures/testName.png" + # And then move it to this path + + # Remove "_test" substring to match golden file name GOLDEN_FILE_NAME=${FILE//$TEST_FILE_POSTFIX/} + # Remove start path, but keep the "test" part, if we have it + TO_KEEP="test/*" + TO_REMOVE_PREFIX="$WORK_FOLDER/" + TO_REMOVE_PREFIX=${TO_REMOVE_PREFIX//$TO_KEEP/} + GOLDENS_DIR=${GOLDEN_FILE_NAME//$TO_REMOVE_PREFIX/} + # Change postfix to "goldens" + TO_REMOVE_POSTFIX="failures/*" + TO_ADD_POSTFIX="goldens/" + GOLDENS_DIR=${GOLDENS_DIR//$TO_REMOVE_POSTFIX/$TO_ADD_POSTFIX} + echo "Moving $GOLDEN_FILE_NAME" - mv "$FILE" "$GOLDEN_FILE_NAME" + cp "$FILE" "$GOLDEN_FILE_NAME" mkdir -p $GOLDENS_DIR mv "$GOLDEN_FILE_NAME" $GOLDENS_DIR done