| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'package:test/bootstrap/browser.dart'; |
| import 'package:test/test.dart'; |
| import 'package:ui/src/engine.dart'; |
| import 'package:ui/ui.dart'; |
| |
| // TODO(yjbanov): https://github.com/flutter/flutter/issues/76885 |
| const bool issue76885Exists = true; |
| |
| void main() { |
| internalBootstrapBrowserTest(() => testMain); |
| } |
| |
| void testMain() { |
| test('PathRef.getRRect with radius', () { |
| final SurfacePath path = SurfacePath(); |
| final RRect rrect = RRect.fromLTRBR(0, 0, 10, 10, const Radius.circular(2)); |
| path.addRRect(rrect); |
| expect(path.toRoundedRect(), rrect); |
| }); |
| |
| test('PathRef.getRRect with radius larger than rect', () { |
| final SurfacePath path = SurfacePath(); |
| final RRect rrect = RRect.fromLTRBR(0, 0, 10, 10, const Radius.circular(20)); |
| path.addRRect(rrect); |
| expect( |
| path.toRoundedRect(), |
| // Path.addRRect will correct the radius to fit the dimensions, so when |
| // extracting the rrect out of the path we don't get the original. |
| RRect.fromLTRBR(0, 0, 10, 10, const Radius.circular(5)), |
| ); |
| }); |
| |
| test('PathRef.getRRect with zero radius', () { |
| final SurfacePath path = SurfacePath(); |
| final RRect rrect = RRect.fromLTRBR(0, 0, 10, 10, Radius.zero); |
| path.addRRect(rrect); |
| expect(path.toRoundedRect(), isNull); |
| expect(path.toRect(), rrect.outerRect); |
| }); |
| |
| test('PathRef.getRRect elliptical', () { |
| final SurfacePath path = SurfacePath(); |
| final RRect rrect = RRect.fromLTRBR(0, 0, 10, 10, const Radius.elliptical(2, 4)); |
| path.addRRect(rrect); |
| expect(path.toRoundedRect(), rrect); |
| }); |
| |
| test('PathRef.getRRect elliptical zero x', () { |
| final SurfacePath path = SurfacePath(); |
| final RRect rrect = RRect.fromLTRBR(0, 0, 10, 10, const Radius.elliptical(0, 3)); |
| path.addRRect(rrect); |
| expect(path.toRoundedRect(), isNull); |
| expect(path.toRect(), rrect.outerRect); |
| }); |
| |
| test('PathRef.getRRect elliptical zero y', () { |
| final SurfacePath path = SurfacePath(); |
| final RRect rrect = RRect.fromLTRBR(0, 0, 10, 10, const Radius.elliptical(3, 0)); |
| path.addRRect(rrect); |
| expect(path.toRoundedRect(), isNull); |
| expect(path.toRect(), rrect.outerRect); |
| }); |
| |
| test('PathRef.getRect returns a Rect from a valid Path and null otherwise', () { |
| final SurfacePath path = SurfacePath(); |
| // Draw a line |
| path.moveTo(0,0); |
| path.lineTo(10,0); |
| expect(path.pathRef.getRect(), isNull); |
| // Draw two other lines to get a valid rectangle |
| path.lineTo(10,10); |
| path.lineTo(0,10); |
| expect(path.pathRef.getRect(), const Rect.fromLTWH(0, 0, 10, 10)); |
| }); |
| |
| // Regression test for https://github.com/flutter/flutter/issues/111750 |
| test('PathRef.getRect returns Rect with positive width and height', () { |
| final SurfacePath path = SurfacePath(); |
| // Draw a rectangle starting from bottom right corner |
| path.moveTo(10,10); |
| path.lineTo(0,10); |
| path.lineTo(0,0); |
| path.lineTo(10,0); |
| // pathRef.getRect() should return a rectangle with positive height and width |
| expect(path.pathRef.getRect(), const Rect.fromLTWH(0, 0, 10, 10)); |
| }); |
| |
| // This test demonstrates the issue with attempting to reconstruct an RRect |
| // with imprecision introduced by comparing double values. We should fix this |
| // by removing the need to reconstruct rrects: |
| // https://github.com/flutter/flutter/issues/76885 |
| test('PathRef.getRRect with nearly zero corner', () { |
| final SurfacePath path = SurfacePath(); |
| final RRect original = RRect.fromLTRBR(0, 0, 10, 10, const Radius.elliptical(0.00000001, 5)); |
| path.addRRect(original); |
| expect(path.toRoundedRect(), original); |
| }, skip: issue76885Exists); |
| } |