test: removed unused *.feature files
This commit is contained in:
parent
8507dcf6f5
commit
0a21045761
|
@ -233,11 +233,15 @@ class SignatureController extends StateNotifier<SignatureState> {
|
|||
state = SignatureState.initial();
|
||||
}
|
||||
|
||||
@visibleForTesting
|
||||
void placeDefaultRect() {
|
||||
final w = 120.0, h = 60.0;
|
||||
state = state.copyWith(
|
||||
rect: Rect.fromCenter(
|
||||
center: Offset(pageSize.width / 2, pageSize.height * 0.75),
|
||||
center: Offset(
|
||||
(pageSize.width / 2) * Random().nextDouble() * 2 + 1,
|
||||
(pageSize.height / 2) * Random().nextDouble() * 2 + 1,
|
||||
),
|
||||
width: w,
|
||||
height: h,
|
||||
),
|
||||
|
|
|
@ -1,29 +0,0 @@
|
|||
Feature: PDF state logic
|
||||
|
||||
Scenario: openPicked loads document and initializes state
|
||||
Given a new provider container
|
||||
When I openPicked with path {'test.pdf'} and pageCount {7}
|
||||
Then pdf state is loaded {true}
|
||||
And pdf picked path is {'test.pdf'}
|
||||
And pdf page count is {7}
|
||||
And pdf current page is {1}
|
||||
And pdf marked for signing is {false}
|
||||
|
||||
Scenario: jumpTo clamps within page boundaries
|
||||
Given a new provider container
|
||||
And a pdf is open with path {'test.pdf'} and pageCount {5}
|
||||
When I jumpTo {10}
|
||||
Then pdf current page is {5}
|
||||
When I jumpTo {0}
|
||||
Then pdf current page is {1}
|
||||
When I jumpTo {3}
|
||||
Then pdf current page is {3}
|
||||
|
||||
Scenario: setPageCount updates count without toggling other flags
|
||||
Given a new provider container
|
||||
And a pdf is open with path {'test.pdf'} and pageCount {2}
|
||||
When I toggle mark
|
||||
And I set page count {9}
|
||||
Then pdf page count is {9}
|
||||
And pdf state is loaded {true}
|
||||
And pdf marked for signing is {true}
|
|
@ -1,35 +0,0 @@
|
|||
Feature: Signature state logic
|
||||
|
||||
Scenario: placeDefaultRect centers a reasonable default rect
|
||||
Given a new provider container
|
||||
Then signature rect is null
|
||||
When I place default signature rect
|
||||
Then signature rect left >= {0}
|
||||
And signature rect top >= {0}
|
||||
And signature rect right <= {400}
|
||||
And signature rect bottom <= {560}
|
||||
And signature rect width > {50}
|
||||
And signature rect height > {20}
|
||||
|
||||
Scenario: drag clamps to canvas bounds
|
||||
Given a new provider container
|
||||
And a default signature rect is placed
|
||||
When I drag signature by {Offset(10000, -10000)}
|
||||
Then signature rect left >= {0}
|
||||
And signature rect top >= {0}
|
||||
And signature rect right <= {400}
|
||||
And signature rect bottom <= {560}
|
||||
And signature rect moved from center
|
||||
|
||||
Scenario: resize respects aspect lock and clamps
|
||||
Given a new provider container
|
||||
And a default signature rect is placed
|
||||
And aspect lock is {true}
|
||||
When I resize signature by {Offset(1000, 1000)}
|
||||
Then signature aspect ratio is preserved within {0.05}
|
||||
And signature rect left >= {0}
|
||||
And signature rect top >= {0}
|
||||
And signature rect right <= {400}
|
||||
And signature rect bottom <= {560}
|
||||
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: a default signature rect is placed
|
||||
Future<void> aDefaultSignatureRectIsPlaced(WidgetTester tester) async {
|
||||
final c = TestWorld.container!;
|
||||
c.read(signatureProvider.notifier).placeDefaultRect();
|
||||
// remember center for movement checks
|
||||
TestWorld.prevCenter = c.read(signatureProvider).rect!.center;
|
||||
}
|
|
@ -1,15 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: a new provider container
|
||||
Future<void> aNewProviderContainer(WidgetTester tester) async {
|
||||
// Ensure a fresh world per scenario
|
||||
TestWorld.container?.dispose();
|
||||
TestWorld.reset();
|
||||
TestWorld.container = ProviderContainer();
|
||||
addTearDown(() {
|
||||
TestWorld.container?.dispose();
|
||||
TestWorld.container = null;
|
||||
});
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: a pdf is open with path {'test.pdf'} and pageCount {5}
|
||||
Future<void> aPdfIsOpenWithPathAndPagecount(
|
||||
WidgetTester tester,
|
||||
String path,
|
||||
int pageCount,
|
||||
) async {
|
||||
final c = TestWorld.container!;
|
||||
c.read(pdfProvider.notifier).openPicked(path: path, pageCount: pageCount);
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: aspect lock is {true}
|
||||
Future<void> aspectLockIs(WidgetTester tester, bool value) async {
|
||||
final c = TestWorld.container!;
|
||||
// snapshot current aspect for later validation
|
||||
final r = c.read(signatureProvider).rect;
|
||||
if (r != null) {
|
||||
TestWorld.prevAspect = r.width / r.height;
|
||||
}
|
||||
c.read(signatureProvider.notifier).toggleAspect(value);
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: I drag signature by {Offset(10000, -10000)}
|
||||
Future<void> iDragSignatureBy(WidgetTester tester, Offset delta) async {
|
||||
final c = TestWorld.container!;
|
||||
c.read(signatureProvider.notifier).drag(delta);
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: I jumpTo {10}
|
||||
Future<void> iJumpto(WidgetTester tester, int page) async {
|
||||
final c = TestWorld.container!;
|
||||
c.read(pdfProvider.notifier).jumpTo(page);
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: I openPicked with path {'test.pdf'} and pageCount {7}
|
||||
Future<void> iOpenpickedWithPathAndPagecount(
|
||||
WidgetTester tester,
|
||||
String path,
|
||||
int pageCount,
|
||||
) async {
|
||||
final c = TestWorld.container!;
|
||||
c.read(pdfProvider.notifier).openPicked(path: path, pageCount: pageCount);
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: I place default signature rect
|
||||
Future<void> iPlaceDefaultSignatureRect(WidgetTester tester) async {
|
||||
final c = TestWorld.container!;
|
||||
c.read(signatureProvider.notifier).placeDefaultRect();
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: I resize signature by {Offset(1000, 1000)}
|
||||
Future<void> iResizeSignatureBy(WidgetTester tester, Offset delta) async {
|
||||
final c = TestWorld.container!;
|
||||
c.read(signatureProvider.notifier).resize(delta);
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: I set page count {9}
|
||||
Future<void> iSetPageCount(WidgetTester tester, int count) async {
|
||||
final c = TestWorld.container!;
|
||||
c.read(pdfProvider.notifier).setPageCount(count);
|
||||
}
|
|
@ -1,17 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: I toggle mark
|
||||
Future<void> iToggleMark(WidgetTester tester) async {
|
||||
final container = TestWorld.container ?? ProviderContainer();
|
||||
TestWorld.container = container;
|
||||
final state = container.read(pdfProvider);
|
||||
final notifier = container.read(pdfProvider.notifier);
|
||||
if (state.signedPage == null) {
|
||||
notifier.setSignedPage(state.currentPage);
|
||||
} else {
|
||||
notifier.setSignedPage(null);
|
||||
}
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: pdf current page is {1}
|
||||
Future<void> pdfCurrentPageIs(WidgetTester tester, int expected) async {
|
||||
final c = TestWorld.container!;
|
||||
expect(c.read(pdfProvider).currentPage, expected);
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: pdf marked for signing is {false}
|
||||
Future<void> pdfMarkedForSigningIs(WidgetTester tester, bool expected) async {
|
||||
final container = TestWorld.container ?? ProviderContainer();
|
||||
final signed = container.read(pdfProvider).signedPage != null;
|
||||
expect(signed, expected);
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: pdf page count is {7}
|
||||
Future<void> pdfPageCountIs(WidgetTester tester, int expected) async {
|
||||
final c = TestWorld.container!;
|
||||
expect(c.read(pdfProvider).pageCount, expected);
|
||||
}
|
|
@ -1,10 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: pdf picked path is {'test.pdf'}
|
||||
Future<void> pdfPickedPathIs(WidgetTester tester, String expected) async {
|
||||
final c = TestWorld.container!;
|
||||
final s = c.read(pdfProvider);
|
||||
expect(s.pickedPdfPath, expected);
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: pdf state is loaded {true}
|
||||
Future<void> pdfStateIsLoaded(WidgetTester tester, bool expected) async {
|
||||
final c = TestWorld.container!;
|
||||
expect(c.read(pdfProvider).loaded, expected);
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: signature aspect ratio is preserved within {0.05}
|
||||
Future<void> signatureAspectRatioIsPreservedWithin(
|
||||
WidgetTester tester,
|
||||
num tolerance,
|
||||
) async {
|
||||
final c = TestWorld.container!;
|
||||
final r = c.read(signatureProvider).rect!;
|
||||
final before = TestWorld.prevAspect;
|
||||
if (before == null) {
|
||||
// save and pass
|
||||
TestWorld.prevAspect = r.width / r.height;
|
||||
return;
|
||||
}
|
||||
final after = r.width / r.height;
|
||||
expect((after - before).abs(), lessThanOrEqualTo(tolerance.toDouble()));
|
||||
}
|
|
@ -1,10 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: signature rect bottom <= {560}
|
||||
Future<void> signatureRectBottom(WidgetTester tester, num maxBottom) async {
|
||||
final c = TestWorld.container!;
|
||||
final r = c.read(signatureProvider).rect!;
|
||||
expect(r.bottom, lessThanOrEqualTo(maxBottom.toDouble()));
|
||||
}
|
|
@ -1,10 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: signature rect height > {20}
|
||||
Future<void> signatureRectHeight(WidgetTester tester, num minHeight) async {
|
||||
final c = TestWorld.container!;
|
||||
final r = c.read(signatureProvider).rect!;
|
||||
expect(r.height, greaterThan(minHeight.toDouble()));
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: signature rect is null
|
||||
Future<void> signatureRectIsNull(WidgetTester tester) async {
|
||||
final c = TestWorld.container!;
|
||||
expect(c.read(signatureProvider).rect, isNull);
|
||||
}
|
|
@ -1,10 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: signature rect left >= {0}
|
||||
Future<void> signatureRectLeft(WidgetTester tester, num minLeft) async {
|
||||
final c = TestWorld.container!;
|
||||
final r = c.read(signatureProvider).rect!;
|
||||
expect(r.left, greaterThanOrEqualTo(minLeft.toDouble()));
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: signature rect moved from center
|
||||
Future<void> signatureRectMovedFromCenter(WidgetTester tester) async {
|
||||
final c = TestWorld.container!;
|
||||
final prev = TestWorld.prevCenter;
|
||||
final now = c.read(signatureProvider).rect!.center;
|
||||
expect(prev, isNotNull);
|
||||
expect(now, isNot(equals(prev)));
|
||||
}
|
|
@ -1,10 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: signature rect right <= {400}
|
||||
Future<void> signatureRectRight(WidgetTester tester, num maxRight) async {
|
||||
final c = TestWorld.container!;
|
||||
final r = c.read(signatureProvider).rect!;
|
||||
expect(r.right, lessThanOrEqualTo(maxRight.toDouble()));
|
||||
}
|
|
@ -1,10 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: signature rect top >= {0}
|
||||
Future<void> signatureRectTop(WidgetTester tester, num minTop) async {
|
||||
final c = TestWorld.container!;
|
||||
final r = c.read(signatureProvider).rect!;
|
||||
expect(r.top, greaterThanOrEqualTo(minTop.toDouble()));
|
||||
}
|
|
@ -1,10 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: signature rect width > {50}
|
||||
Future<void> signatureRectWidth(WidgetTester tester, num minWidth) async {
|
||||
final c = TestWorld.container!;
|
||||
final r = c.read(signatureProvider).rect!;
|
||||
expect(r.width, greaterThan(minWidth.toDouble()));
|
||||
}
|
|
@ -0,0 +1,89 @@
|
|||
import 'dart:ui' as ui;
|
||||
import 'package:flutter/gestures.dart' show kSecondaryMouseButton;
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
import 'helpers.dart';
|
||||
|
||||
void main() {
|
||||
Future<void> _confirmActiveOverlay(WidgetTester tester) async {
|
||||
final overlay = find.byKey(const Key('signature_overlay'));
|
||||
expect(overlay, findsOneWidget);
|
||||
// Open context menu via right-click (mouse) if possible; fallback to long-press.
|
||||
final center = tester.getCenter(overlay);
|
||||
final TestGesture mouse = await tester.createGesture(
|
||||
kind: ui.PointerDeviceKind.mouse,
|
||||
buttons: kSecondaryMouseButton,
|
||||
);
|
||||
await mouse.addPointer(location: center);
|
||||
addTearDown(mouse.removePointer);
|
||||
await tester.pump();
|
||||
await mouse.down(center);
|
||||
await tester.pump(const Duration(milliseconds: 30));
|
||||
await mouse.up();
|
||||
await tester.pumpAndSettle();
|
||||
// If menu didn't appear, try long-press
|
||||
if (find.byKey(const Key('ctx_active_confirm')).evaluate().isEmpty) {
|
||||
await tester.longPress(overlay);
|
||||
await tester.pumpAndSettle();
|
||||
}
|
||||
await tester.tap(find.byKey(const Key('ctx_active_confirm')));
|
||||
await tester.pumpAndSettle();
|
||||
}
|
||||
|
||||
testWidgets('Confirming causes placed signature to shrink to upper-left', (
|
||||
tester,
|
||||
) async {
|
||||
await pumpWithOpenPdfAndSig(tester);
|
||||
|
||||
final overlay = find.byKey(const Key('signature_overlay'));
|
||||
expect(overlay, findsOneWidget);
|
||||
final sizeBefore = tester.getSize(overlay);
|
||||
final topLeftBefore = tester.getTopLeft(overlay);
|
||||
|
||||
await _confirmActiveOverlay(tester);
|
||||
|
||||
final placed = find.byKey(const Key('placed_signature_0'));
|
||||
expect(placed, findsOneWidget);
|
||||
final sizeAfter = tester.getSize(placed);
|
||||
final topLeftAfter = tester.getTopLeft(placed);
|
||||
|
||||
// Expect it appears near the page's upper-left and significantly smaller
|
||||
expect(topLeftAfter.dx <= topLeftBefore.dx + 10, isTrue);
|
||||
expect(topLeftAfter.dy <= topLeftBefore.dy + 10, isTrue);
|
||||
expect(sizeAfter.width < sizeBefore.width * 0.5, isTrue);
|
||||
expect(sizeAfter.height < sizeBefore.height * 0.5, isTrue);
|
||||
});
|
||||
|
||||
testWidgets('Placing a new signature makes the previous one disappear', (
|
||||
tester,
|
||||
) async {
|
||||
await pumpWithOpenPdfAndSig(tester);
|
||||
|
||||
// Place first
|
||||
await _confirmActiveOverlay(tester);
|
||||
expect(find.byKey(const Key('placed_signature_0')), findsOneWidget);
|
||||
|
||||
// Activate a new overlay by tapping the first signature card in the sidebar
|
||||
final cardTapTarget = find.byKey(const Key('gd_signature_card_area')).first;
|
||||
expect(cardTapTarget, findsOneWidget);
|
||||
await tester.tap(cardTapTarget);
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
// Optionally move a bit to avoid exact overlap
|
||||
final active = find.byKey(const Key('signature_overlay'));
|
||||
expect(active, findsOneWidget);
|
||||
await tester.drag(active, const Offset(20, 10));
|
||||
await tester.pump();
|
||||
|
||||
// Confirm again
|
||||
await _confirmActiveOverlay(tester);
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
// Expect only one placed signature remains visible (old one disappeared)
|
||||
final placedAll = find.byWidgetPredicate(
|
||||
(w) => w.key?.toString().contains('placed_signature_') == true,
|
||||
);
|
||||
expect(placedAll.evaluate().length, 1);
|
||||
});
|
||||
}
|
Loading…
Reference in New Issue