From 21a0638bf0fdccf12b24c5372d92ab81e49f2844 Mon Sep 17 00:00:00 2001 From: insleker Date: Tue, 9 Sep 2025 22:26:33 +0800 Subject: [PATCH] feat: partially implement new feature test --- integration_test/export_flow_test.dart | 4 +- lib/data/model/model.dart | 49 ++++++----- lib/data/services/export_service.dart | 8 +- .../pdf/view_model/pdf_controller.dart | 10 +-- .../pdf/widgets/signature_drawer.dart | 10 ++- .../pdf/widgets/signature_overlay.dart | 4 +- .../view_model/signature_controller.dart | 4 +- .../step/a_created_signature_card.dart | 6 ++ ...ins_at_least_one_signature_placement.dart} | 22 ++--- ...ced_signature_placements_across_pages.dart | 38 +++++++++ ..._with_no_signature_placements_placed.dart} | 10 ++- ...ocument_page_is_selected_for_signing.dart} | 8 +- ...dart => a_multipage_document_is_open.dart} | 17 ++-- ...fied_full_path_location_and_file_name.dart | 7 ++ ...fied_full_path_location_and_file_name.dart | 15 ---- ...ontains_at_least_one_placed_signature.dart | 26 ------ ...ltiple_placed_signatures_across_pages.dart | 32 -------- ...pdf_is_open_with_no_signatures_placed.dart | 17 ---- ...ltipage_document5_pages_is_available.dart} | 8 +- .../step/a_signature_asset_is_created.dart | 6 ++ .../a_signature_asset_is_loaded_or_drawn.dart | 6 ++ ...signature_asset_is_placed_on_the_page.dart | 6 ++ .../step/a_signature_asset_is_selected.dart | 6 ++ ..._drawn_is_wrapped_in_a_signature_card.dart | 23 ++++++ .../step/a_signature_image_is_created.dart | 10 --- .../a_signature_image_is_loaded_or_drawn.dart | 14 ---- .../step/a_signature_image_is_selected.dart | 28 ------- .../step/a_signature_is_placed_on_page.dart | 25 ------ ...osition_and_size_relative_to_the_page.dart | 37 --------- ..._the_page_based_on_the_signature_card.dart | 7 ++ ...ignature_placement_is_placed_on_page.dart} | 18 ++-- ...osition_and_size_relative_to_the_page.dart | 21 +++++ ...e_instance_does_not_affect_the_others.dart | 2 +- ...placements_does_not_affect_the_others.dart | 7 ++ ...eir_corresponding_pages_in_the_output.dart | 18 ++++ ...eir_corresponding_pages_in_the_output.dart | 17 ---- ...s_are_shown_on_their_respective_pages.dart | 14 ++++ ...s_are_shown_on_their_respective_pages.dart | 15 ---- ...esizing_one_does_not_change_the_other.dart | 2 +- ..._be_dragged_and_resized_independently.dart | 19 ----- ..._be_dragged_and_resized_independently.dart | 14 ++++ ...re_placements_appear_in_each_location.dart | 16 ++++ .../it_is_placed_on_the_selected_page.dart | 10 --- ...nly_the_selected_signature_is_removed.dart | 11 --- ...lected_signature_placement_is_removed.dart | 14 ++++ .../resize_to_fit_within_bounding_box.dart | 6 ++ ...placement_occurs_on_the_selected_page.dart | 7 ++ .../the_app_attempts_to_load_the_asset.dart | 6 ++ .../the_app_attempts_to_load_the_image.dart | 6 -- ...loaded_and_shown_as_a_signature_asset.dart | 7 ++ ..._loaded_and_shown_as_a_signature_card.dart | 7 ++ ...he_asset_is_not_added_to_the_document.dart | 6 ++ ...loaded_and_shown_as_a_signature_asset.dart | 14 ---- ...he_image_is_not_added_to_the_document.dart | 11 --- .../step/the_image_scales_proportionally.dart | 12 --- ...signature_placements_remain_unchanged.dart | 7 ++ ...the_other_signatures_remain_unchanged.dart | 12 --- ...e_exact_pdf_page_coordinates_and_size.dart | 15 ---- .../step/the_signature_on_page_remains.dart | 12 --- ...e_exact_pdf_page_coordinates_and_size.dart | 7 ++ ...re_placement_on_page_is_shown_on_page.dart | 16 ++++ ...e_signature_placement_on_page_remains.dart | 15 ++++ ...lacement_remains_within_the_page_area.dart | 7 ++ ...otates_around_its_center_in_real_time.dart | 7 ++ ..._the_corresponding_page_in_the_output.dart | 7 ++ ...ignature_remains_within_the_page_area.dart | 14 ---- ..._the_corresponding_page_in_the_output.dart | 17 ---- ...ses_a_image_file_as_a_signature_asset.dart | 7 ++ ...ure_asset_to_created_a_signature_card.dart | 7 ++ ...e_user_chooses_a_signature_image_file.dart | 82 ------------------- ...e_user_deletes_one_selected_signature.dart | 11 --- ...etes_one_selected_signature_placement.dart | 17 ++++ ...in_multiple_locations_in_the_document.dart | 37 +++++++++ ...cument_to_place_a_signature_placement.dart | 8 ++ ...enables_aspect_ratio_lock_and_resizes.dart | 16 ---- ..._to_page_and_places_another_signature.dart | 35 -------- ...nd_places_another_signature_placement.dart | 23 ++++++ ...aces_a_signature_from_picture_on_page.dart | 58 ------------- .../the_user_places_a_signature_on_page.dart | 34 -------- ...ignature_placement_from_asset_on_page.dart | 36 ++++++++ ..._places_a_signature_placement_on_page.dart | 22 +++++ ...signature_placements_on_the_same_page.dart | 29 +++++++ ...laces_two_signatures_on_the_same_page.dart | 24 ------ .../the_user_savesexports_the_document.dart | 19 ++++- .../step/the_user_uses_rotate_controls.dart | 6 ++ ...ements_are_placed_on_the_current_page.dart | 40 +++++++++ test/widget/regression_signature_tests.dart | 3 +- 87 files changed, 661 insertions(+), 732 deletions(-) create mode 100644 test/features/step/a_created_signature_card.dart rename test/features/step/{the_signature_on_page_is_shown_on_page.dart => a_document_is_open_and_contains_at_least_one_signature_placement.dart} (51%) create mode 100644 test/features/step/a_document_is_open_and_contains_multiple_placed_signature_placements_across_pages.dart rename test/features/step/{a_sample_multipage_pdf5_pages_is_available.dart => a_document_is_open_with_no_signature_placements_placed.dart} (59%) rename test/features/step/{a_pdf_page_is_selected_for_signing.dart => a_document_page_is_selected_for_signing.dart} (63%) rename test/features/step/{a_signature_image_is_placed_on_the_page.dart => a_multipage_document_is_open.dart} (51%) create mode 100644 test/features/step/a_new_document_file_is_saved_at_specified_full_path_location_and_file_name.dart delete mode 100644 test/features/step/a_new_pdf_file_is_saved_at_specified_full_path_location_and_file_name.dart delete mode 100644 test/features/step/a_pdf_is_open_and_contains_at_least_one_placed_signature.dart delete mode 100644 test/features/step/a_pdf_is_open_and_contains_multiple_placed_signatures_across_pages.dart delete mode 100644 test/features/step/a_pdf_is_open_with_no_signatures_placed.dart rename test/features/step/{a_multipage_pdf_is_open.dart => a_sample_multipage_document5_pages_is_available.dart} (63%) create mode 100644 test/features/step/a_signature_asset_is_created.dart create mode 100644 test/features/step/a_signature_asset_is_loaded_or_drawn.dart create mode 100644 test/features/step/a_signature_asset_is_placed_on_the_page.dart create mode 100644 test/features/step/a_signature_asset_is_selected.dart create mode 100644 test/features/step/a_signature_asset_loaded_or_drawn_is_wrapped_in_a_signature_card.dart delete mode 100644 test/features/step/a_signature_image_is_created.dart delete mode 100644 test/features/step/a_signature_image_is_loaded_or_drawn.dart delete mode 100644 test/features/step/a_signature_image_is_selected.dart delete mode 100644 test/features/step/a_signature_is_placed_on_page.dart delete mode 100644 test/features/step/a_signature_is_placed_with_a_position_and_size_relative_to_the_page.dart create mode 100644 test/features/step/a_signature_placement_appears_on_the_page_based_on_the_signature_card.dart rename test/features/step/{three_signatures_are_placed_on_the_current_page.dart => a_signature_placement_is_placed_on_page.dart} (50%) create mode 100644 test/features/step/a_signature_placement_is_placed_with_a_position_and_size_relative_to_the_page.dart create mode 100644 test/features/step/adjusting_one_of_the_signature_placements_does_not_affect_the_others.dart create mode 100644 test/features/step/all_placed_signature_placements_appear_on_their_corresponding_pages_in_the_output.dart delete mode 100644 test/features/step/all_placed_signatures_appear_on_their_corresponding_pages_in_the_output.dart create mode 100644 test/features/step/both_signature_placements_are_shown_on_their_respective_pages.dart delete mode 100644 test/features/step/both_signatures_are_shown_on_their_respective_pages.dart delete mode 100644 test/features/step/each_signature_can_be_dragged_and_resized_independently.dart create mode 100644 test/features/step/each_signature_placement_can_be_dragged_and_resized_independently.dart create mode 100644 test/features/step/identical_signature_placements_appear_in_each_location.dart delete mode 100644 test/features/step/it_is_placed_on_the_selected_page.dart delete mode 100644 test/features/step/only_the_selected_signature_is_removed.dart create mode 100644 test/features/step/only_the_selected_signature_placement_is_removed.dart create mode 100644 test/features/step/resize_to_fit_within_bounding_box.dart create mode 100644 test/features/step/signature_placement_occurs_on_the_selected_page.dart create mode 100644 test/features/step/the_app_attempts_to_load_the_asset.dart delete mode 100644 test/features/step/the_app_attempts_to_load_the_image.dart create mode 100644 test/features/step/the_asset_is_loaded_and_shown_as_a_signature_asset.dart create mode 100644 test/features/step/the_asset_is_loaded_and_shown_as_a_signature_card.dart create mode 100644 test/features/step/the_asset_is_not_added_to_the_document.dart delete mode 100644 test/features/step/the_image_is_loaded_and_shown_as_a_signature_asset.dart delete mode 100644 test/features/step/the_image_is_not_added_to_the_document.dart delete mode 100644 test/features/step/the_image_scales_proportionally.dart create mode 100644 test/features/step/the_other_signature_placements_remain_unchanged.dart delete mode 100644 test/features/step/the_other_signatures_remain_unchanged.dart delete mode 100644 test/features/step/the_signature_is_stamped_at_the_exact_pdf_page_coordinates_and_size.dart delete mode 100644 test/features/step/the_signature_on_page_remains.dart create mode 100644 test/features/step/the_signature_placement_is_stamped_at_the_exact_pdf_page_coordinates_and_size.dart create mode 100644 test/features/step/the_signature_placement_on_page_is_shown_on_page.dart create mode 100644 test/features/step/the_signature_placement_on_page_remains.dart create mode 100644 test/features/step/the_signature_placement_remains_within_the_page_area.dart create mode 100644 test/features/step/the_signature_placement_rotates_around_its_center_in_real_time.dart create mode 100644 test/features/step/the_signature_placements_appear_on_the_corresponding_page_in_the_output.dart delete mode 100644 test/features/step/the_signature_remains_within_the_page_area.dart delete mode 100644 test/features/step/the_signatures_appear_on_the_corresponding_page_in_the_output.dart create mode 100644 test/features/step/the_user_chooses_a_image_file_as_a_signature_asset.dart create mode 100644 test/features/step/the_user_chooses_a_signature_asset_to_created_a_signature_card.dart delete mode 100644 test/features/step/the_user_chooses_a_signature_image_file.dart delete mode 100644 test/features/step/the_user_deletes_one_selected_signature.dart create mode 100644 test/features/step/the_user_deletes_one_selected_signature_placement.dart create mode 100644 test/features/step/the_user_drags_it_on_the_page_of_the_document_to_place_signature_placements_in_multiple_locations_in_the_document.dart create mode 100644 test/features/step/the_user_drags_this_signature_card_on_the_page_of_the_document_to_place_a_signature_placement.dart delete mode 100644 test/features/step/the_user_enables_aspect_ratio_lock_and_resizes.dart delete mode 100644 test/features/step/the_user_navigates_to_page_and_places_another_signature.dart create mode 100644 test/features/step/the_user_navigates_to_page_and_places_another_signature_placement.dart delete mode 100644 test/features/step/the_user_places_a_signature_from_picture_on_page.dart delete mode 100644 test/features/step/the_user_places_a_signature_on_page.dart create mode 100644 test/features/step/the_user_places_a_signature_placement_from_asset_on_page.dart create mode 100644 test/features/step/the_user_places_a_signature_placement_on_page.dart create mode 100644 test/features/step/the_user_places_two_signature_placements_on_the_same_page.dart delete mode 100644 test/features/step/the_user_places_two_signatures_on_the_same_page.dart create mode 100644 test/features/step/the_user_uses_rotate_controls.dart create mode 100644 test/features/step/three_signature_placements_are_placed_on_the_current_page.dart diff --git a/integration_test/export_flow_test.dart b/integration_test/export_flow_test.dart index 00a5d8d..3bfc68f 100644 --- a/integration_test/export_flow_test.dart +++ b/integration_test/export_flow_test.dart @@ -122,11 +122,11 @@ void main() { final sigState = container.read(signatureProvider); final r = sigState.rect!; final lib = container.read(signatureLibraryProvider); - final imageId = lib.isNotEmpty ? lib.first.id : 'default.png'; + final imageId = lib.isNotEmpty ? lib.first.id : ''; final pdf = container.read(pdfProvider); container .read(pdfProvider.notifier) - .addPlacement(page: pdf.currentPage, rect: r, imageId: imageId); + .addPlacement(page: pdf.currentPage, rect: r, assetId: imageId); container.read(signatureProvider.notifier).clearActiveOverlay(); await tester.pumpAndSettle(); diff --git a/lib/data/model/model.dart b/lib/data/model/model.dart index 6fab8d3..252515b 100644 --- a/lib/data/model/model.dart +++ b/lib/data/model/model.dart @@ -38,11 +38,23 @@ class GraphicAdjust { class SignatureCard { final double rotationDeg; final SignatureAsset asset; + final GraphicAdjust graphicAdjust; - GraphicAdjust graphicAdjust; + const SignatureCard({ + required this.rotationDeg, + required this.asset, + this.graphicAdjust = const GraphicAdjust(), + }); - SignatureCard({required this.rotationDeg, required this.asset}) - : graphicAdjust = GraphicAdjust(); + SignatureCard copyWith({ + double? rotationDeg, + SignatureAsset? asset, + GraphicAdjust? graphicAdjust, + }) => SignatureCard( + rotationDeg: rotationDeg ?? this.rotationDeg, + asset: asset ?? this.asset, + graphicAdjust: graphicAdjust ?? this.graphicAdjust, + ); } /// Represents a single signature placement on a page combining both the @@ -52,29 +64,28 @@ class SignaturePlacement { // The bounding box of this placement in UI coordinate space, implies scaling and position. final Rect rect; - /// from `SignatureCard` /// Rotation in degrees to apply when rendering/exporting this placement. final double rotationDeg; - GraphicAdjust graphicAdjust; - final SignatureAsset asset; + final GraphicAdjust graphicAdjust; + final String assetId; // ID of the signature asset - SignaturePlacement({ + const SignaturePlacement({ required this.rect, - required this.asset, + required this.assetId, this.rotationDeg = 0.0, - GraphicAdjust graphicAdjust = const GraphicAdjust(), - }) : graphicAdjust = graphicAdjust; + this.graphicAdjust = const GraphicAdjust(), + }); SignaturePlacement copyWith({ - required Rect rect, - required SignatureAsset asset, - double rotationDeg = 0.0, - GraphicAdjust graphicAdjust = const GraphicAdjust(), + Rect? rect, + String? assetId, + double? rotationDeg, + GraphicAdjust? graphicAdjust, }) => SignaturePlacement( - rect: rect, - asset: asset, - rotationDeg: rotationDeg, - graphicAdjust: graphicAdjust, + rect: rect ?? this.rect, + assetId: assetId ?? this.assetId, + rotationDeg: rotationDeg ?? this.rotationDeg, + graphicAdjust: graphicAdjust ?? this.graphicAdjust, ); } @@ -85,7 +96,7 @@ class PdfState { final String? pickedPdfPath; final Uint8List? pickedPdfBytes; final int? signedPage; - // Multiple signature placements per page, each combines geometry and optional image id. + // Multiple signature placements per page, each combines geometry and asset id. final Map> placementsByPage; // UI state: selected placement index on the current page (if any) final int? selectedPlacementIndex; diff --git a/lib/data/services/export_service.dart b/lib/data/services/export_service.dart index 0ace6a8..aa95bc0 100644 --- a/lib/data/services/export_service.dart +++ b/lib/data/services/export_service.dart @@ -148,8 +148,8 @@ class ExportService { final w = r.width / uiPageSize.width * widthPts; final h = r.height / uiPageSize.height * heightPts; Uint8List? bytes; - final id = placement.imageId; - if (id != null) { + final id = placement.assetId; + if (id.isNotEmpty) { bytes = libraryBytes?[id]; } bytes ??= signatureImageBytes; // fallback @@ -275,8 +275,8 @@ class ExportService { final w = r.width / uiPageSize.width * widthPts; final h = r.height / uiPageSize.height * heightPts; Uint8List? bytes; - final id = placement.imageId; - if (id != null) { + final id = placement.assetId; + if (id.isNotEmpty) { bytes = libraryBytes?[id]; } bytes ??= signatureImageBytes; // fallback diff --git a/lib/ui/features/pdf/view_model/pdf_controller.dart b/lib/ui/features/pdf/view_model/pdf_controller.dart index ece2a5d..4b0f9c5 100644 --- a/lib/ui/features/pdf/view_model/pdf_controller.dart +++ b/lib/ui/features/pdf/view_model/pdf_controller.dart @@ -65,7 +65,7 @@ class PdfController extends StateNotifier { void addPlacement({ required int page, required Rect rect, - String? imageId = 'default.png', + String? assetId, double rotationDeg = 0.0, }) { if (!state.loaded) return; @@ -75,7 +75,7 @@ class PdfController extends StateNotifier { list.add( SignaturePlacement( rect: rect, - imageId: imageId, + assetId: assetId ?? '', rotationDeg: rotationDeg, ), ); @@ -165,11 +165,11 @@ class PdfController extends StateNotifier { // NOTE: Programmatic reassignment of images has been removed. - // Convenience to get image name for a placement - String? imageOfPlacement({required int page, required int index}) { + // Convenience to get asset id for a placement + String? assetIdOfPlacement({required int page, required int index}) { final list = state.placementsByPage[page] ?? const []; if (index < 0 || index >= list.length) return null; - return list[index].imageId; + return list[index].assetId; } } diff --git a/lib/ui/features/pdf/widgets/signature_drawer.dart b/lib/ui/features/pdf/widgets/signature_drawer.dart index 3bca4b2..aacdd31 100644 --- a/lib/ui/features/pdf/widgets/signature_drawer.dart +++ b/lib/ui/features/pdf/widgets/signature_drawer.dart @@ -2,7 +2,7 @@ import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:pdf_signature/l10n/app_localizations.dart'; -import 'package:pdf_signature/data/model/model.dart'; +import 'package:pdf_signature/data/model/model.dart' as model; import '../../../../data/services/export_providers.dart'; import '../../signature/view_model/signature_controller.dart'; @@ -54,7 +54,7 @@ class _SignatureDrawerState extends ConsumerState { key: ValueKey('sig_card_${a.id}'), asset: (sig.assetId == a.id) - ? SignatureAsset( + ? model.SignatureAsset( id: a.id, bytes: (processed ?? a.bytes), name: a.name, @@ -97,7 +97,11 @@ class _SignatureDrawerState extends ConsumerState { bytes == null ? Text(l.noSignatureLoaded) : SignatureCard( - asset: SignatureAsset(id: '', bytes: bytes, name: ''), + asset: model.SignatureAsset( + id: '', + bytes: bytes, + name: '', + ), rotationDeg: sig.rotation, disabled: disabled, useCurrentBytesForDrag: true, diff --git a/lib/ui/features/pdf/widgets/signature_overlay.dart b/lib/ui/features/pdf/widgets/signature_overlay.dart index e5fed3d..b94b2c3 100644 --- a/lib/ui/features/pdf/widgets/signature_overlay.dart +++ b/lib/ui/features/pdf/widgets/signature_overlay.dart @@ -245,8 +245,8 @@ class _SignatureImage extends ConsumerWidget { (placementList != null && placedIndex! < placementList.length) ? placementList[placedIndex!] : null; - final imgId = placement?.imageId; - if (imgId != null) { + final imgId = placement?.assetId; + if (imgId != null && imgId.isNotEmpty) { final lib = ref.watch(signatureLibraryProvider); for (final a in lib) { if (a.id == imgId) { diff --git a/lib/ui/features/signature/view_model/signature_controller.dart b/lib/ui/features/signature/view_model/signature_controller.dart index 4454c0f..1a0d11a 100644 --- a/lib/ui/features/signature/view_model/signature_controller.dart +++ b/lib/ui/features/signature/view_model/signature_controller.dart @@ -188,7 +188,7 @@ class SignatureController extends StateNotifier { .addPlacement( page: pdf.currentPage, rect: r, - imageId: id, + assetId: id, rotationDeg: state.rotation, ); // Newly placed index is the last one on the page @@ -220,7 +220,7 @@ class SignatureController extends StateNotifier { .addPlacement( page: pdf.currentPage, rect: r, - imageId: id, + assetId: id, rotationDeg: state.rotation, ); final idx = diff --git a/test/features/step/a_created_signature_card.dart b/test/features/step/a_created_signature_card.dart new file mode 100644 index 0000000..476831a --- /dev/null +++ b/test/features/step/a_created_signature_card.dart @@ -0,0 +1,6 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Usage: a created signature card +Future aCreatedSignatureCard(WidgetTester tester) async { + throw UnimplementedError(); +} diff --git a/test/features/step/the_signature_on_page_is_shown_on_page.dart b/test/features/step/a_document_is_open_and_contains_at_least_one_signature_placement.dart similarity index 51% rename from test/features/step/the_signature_on_page_is_shown_on_page.dart rename to test/features/step/a_document_is_open_and_contains_at_least_one_signature_placement.dart index f66b5c7..f22d88c 100644 --- a/test/features/step/the_signature_on_page_is_shown_on_page.dart +++ b/test/features/step/a_document_is_open_and_contains_at_least_one_signature_placement.dart @@ -1,23 +1,23 @@ +import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; import '_world.dart'; -/// Usage: the signature on page {5} is shown on page {5} -Future theSignatureOnPageIsShownOnPage( +/// Usage: a document is open and contains at least one signature placement +Future aDocumentIsOpenAndContainsAtLeastOneSignaturePlacement( WidgetTester tester, - num sourcePage, - num targetPage, ) async { final container = TestWorld.container ?? ProviderContainer(); TestWorld.container = container; - final srcList = container + container .read(pdfProvider.notifier) - .placementsOn(sourcePage.toInt()); - final tgtList = container + .openPicked(path: 'test.pdf', pageCount: 5); + container .read(pdfProvider.notifier) - .placementsOn(targetPage.toInt()); - // At least one exists on both - expect(srcList, isNotEmpty); - expect(tgtList, isNotEmpty); + .addPlacement( + page: 1, + rect: Rect.fromLTWH(10, 10, 100, 50), + assetId: 'sig.png', + ); } diff --git a/test/features/step/a_document_is_open_and_contains_multiple_placed_signature_placements_across_pages.dart b/test/features/step/a_document_is_open_and_contains_multiple_placed_signature_placements_across_pages.dart new file mode 100644 index 0000000..89e6a2e --- /dev/null +++ b/test/features/step/a_document_is_open_and_contains_multiple_placed_signature_placements_across_pages.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; +import '_world.dart'; + +/// Usage: a document is open and contains multiple placed signature placements across pages +Future +aDocumentIsOpenAndContainsMultiplePlacedSignaturePlacementsAcrossPages( + WidgetTester tester, +) async { + final container = TestWorld.container ?? ProviderContainer(); + TestWorld.container = container; + container + .read(pdfProvider.notifier) + .openPicked(path: 'multi.pdf', pageCount: 5); + container + .read(pdfProvider.notifier) + .addPlacement( + page: 1, + rect: Rect.fromLTWH(10, 10, 100, 50), + assetId: 'sig1.png', + ); + container + .read(pdfProvider.notifier) + .addPlacement( + page: 2, + rect: Rect.fromLTWH(20, 20, 100, 50), + assetId: 'sig2.png', + ); + container + .read(pdfProvider.notifier) + .addPlacement( + page: 3, + rect: Rect.fromLTWH(30, 30, 100, 50), + assetId: 'sig3.png', + ); +} diff --git a/test/features/step/a_sample_multipage_pdf5_pages_is_available.dart b/test/features/step/a_document_is_open_with_no_signature_placements_placed.dart similarity index 59% rename from test/features/step/a_sample_multipage_pdf5_pages_is_available.dart rename to test/features/step/a_document_is_open_with_no_signature_placements_placed.dart index e4f501a..4ef729c 100644 --- a/test/features/step/a_sample_multipage_pdf5_pages_is_available.dart +++ b/test/features/step/a_document_is_open_with_no_signature_placements_placed.dart @@ -3,12 +3,14 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; import '_world.dart'; -/// Usage: a sample multi-page PDF (5 pages) is available -Future aSampleMultipagePdf5PagesIsAvailable(WidgetTester tester) async { +/// Usage: a document is open with no signature placements placed +Future aDocumentIsOpenWithNoSignaturePlacementsPlaced( + WidgetTester tester, +) async { final container = TestWorld.container ?? ProviderContainer(); TestWorld.container = container; - // Open a mock document with 5 pages container .read(pdfProvider.notifier) - .openPicked(path: 'mock.pdf', pageCount: 5); + .openPicked(path: 'empty.pdf', pageCount: 5); + // No placements added } diff --git a/test/features/step/a_pdf_page_is_selected_for_signing.dart b/test/features/step/a_document_page_is_selected_for_signing.dart similarity index 63% rename from test/features/step/a_pdf_page_is_selected_for_signing.dart rename to test/features/step/a_document_page_is_selected_for_signing.dart index 471cf35..9cfdd12 100644 --- a/test/features/step/a_pdf_page_is_selected_for_signing.dart +++ b/test/features/step/a_document_page_is_selected_for_signing.dart @@ -3,12 +3,10 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; import '_world.dart'; -/// Usage: a PDF page is selected for signing -Future aPdfPageIsSelectedForSigning(WidgetTester tester) async { +/// Usage: a document page is selected for signing +Future aDocumentPageIsSelectedForSigning(WidgetTester tester) async { final container = TestWorld.container ?? ProviderContainer(); TestWorld.container = container; - container - .read(pdfProvider.notifier) - .openPicked(path: 'mock.pdf', pageCount: 1); container.read(pdfProvider.notifier).setSignedPage(1); + container.read(pdfProvider.notifier).jumpTo(1); } diff --git a/test/features/step/a_signature_image_is_placed_on_the_page.dart b/test/features/step/a_multipage_document_is_open.dart similarity index 51% rename from test/features/step/a_signature_image_is_placed_on_the_page.dart rename to test/features/step/a_multipage_document_is_open.dart index 6dd3bd3..01e9b49 100644 --- a/test/features/step/a_signature_image_is_placed_on_the_page.dart +++ b/test/features/step/a_multipage_document_is_open.dart @@ -1,20 +1,19 @@ -import 'dart:typed_data'; import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; +import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; +import 'package:pdf_signature/ui/features/signature/view_model/signature_library.dart'; +import 'package:pdf_signature/data/model/model.dart'; import '_world.dart'; -/// Usage: a signature image is placed on the page -Future aSignatureImageIsPlacedOnThePage(WidgetTester tester) async { +/// Usage: a multi-page document is open +Future aMultipageDocumentIsOpen(WidgetTester tester) async { final container = TestWorld.container ?? ProviderContainer(); TestWorld.container = container; + container.read(signatureLibraryProvider.notifier).state = []; + container.read(pdfProvider.notifier).state = PdfState.initial(); + container.read(signatureProvider.notifier).state = SignatureState.initial(); container .read(pdfProvider.notifier) .openPicked(path: 'mock.pdf', pageCount: 5); - container.read(pdfProvider.notifier).setSignedPage(1); - // Set an image to ensure rect exists - container - .read(signatureProvider.notifier) - .setImageBytes(Uint8List.fromList([1, 2, 3])); } diff --git a/test/features/step/a_new_document_file_is_saved_at_specified_full_path_location_and_file_name.dart b/test/features/step/a_new_document_file_is_saved_at_specified_full_path_location_and_file_name.dart new file mode 100644 index 0000000..ef72ac1 --- /dev/null +++ b/test/features/step/a_new_document_file_is_saved_at_specified_full_path_location_and_file_name.dart @@ -0,0 +1,7 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Usage: a new document file is saved at specified full path, location and file name +Future aNewDocumentFileIsSavedAtSpecifiedFullPathLocationAndFileName( + WidgetTester tester) async { + throw UnimplementedError(); +} diff --git a/test/features/step/a_new_pdf_file_is_saved_at_specified_full_path_location_and_file_name.dart b/test/features/step/a_new_pdf_file_is_saved_at_specified_full_path_location_and_file_name.dart deleted file mode 100644 index 6675fbb..0000000 --- a/test/features/step/a_new_pdf_file_is_saved_at_specified_full_path_location_and_file_name.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'dart:io'; -import 'package:flutter_test/flutter_test.dart'; -import '_world.dart'; - -/// Usage: a new PDF file is saved at specified full path, location and file name -Future aNewPdfFileIsSavedAtSpecifiedFullPathLocationAndFileName( - WidgetTester tester, -) async { - if (TestWorld.lastSavedPath != null) { - expect(File(TestWorld.lastSavedPath!).existsSync(), isTrue); - } else { - expect(TestWorld.lastExportBytes, isNotNull); - expect(TestWorld.lastExportBytes!.isNotEmpty, isTrue); - } -} diff --git a/test/features/step/a_pdf_is_open_and_contains_at_least_one_placed_signature.dart b/test/features/step/a_pdf_is_open_and_contains_at_least_one_placed_signature.dart deleted file mode 100644 index 7bae6f9..0000000 --- a/test/features/step/a_pdf_is_open_and_contains_at_least_one_placed_signature.dart +++ /dev/null @@ -1,26 +0,0 @@ -import 'dart:typed_data'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; -import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; -import '_world.dart'; - -/// Usage: a PDF is open and contains at least one placed signature -Future aPdfIsOpenAndContainsAtLeastOnePlacedSignature( - WidgetTester tester, -) async { - final container = TestWorld.container ?? ProviderContainer(); - TestWorld.container = container; - container - .read(pdfProvider.notifier) - .openPicked( - path: 'mock.pdf', - pageCount: 2, - bytes: Uint8List.fromList([1, 2, 3]), - ); - container.read(pdfProvider.notifier).setSignedPage(1); - container.read(signatureProvider.notifier).placeDefaultRect(); - container - .read(signatureProvider.notifier) - .setImageBytes(Uint8List.fromList([1, 2, 3])); -} diff --git a/test/features/step/a_pdf_is_open_and_contains_multiple_placed_signatures_across_pages.dart b/test/features/step/a_pdf_is_open_and_contains_multiple_placed_signatures_across_pages.dart deleted file mode 100644 index f7fa7d9..0000000 --- a/test/features/step/a_pdf_is_open_and_contains_multiple_placed_signatures_across_pages.dart +++ /dev/null @@ -1,32 +0,0 @@ -import 'dart:typed_data'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter/material.dart'; -import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; -import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; -import '_world.dart'; - -/// Usage: a PDF is open and contains multiple placed signatures across pages -Future aPdfIsOpenAndContainsMultiplePlacedSignaturesAcrossPages( - WidgetTester tester, -) async { - final container = TestWorld.container ?? ProviderContainer(); - TestWorld.container = container; - container - .read(pdfProvider.notifier) - .openPicked(path: 'mock.pdf', pageCount: 6); - // Ensure signature image exists - container - .read(signatureProvider.notifier) - .setImageBytes(Uint8List.fromList([1, 2, 3])); - // Place on two pages - container - .read(pdfProvider.notifier) - .addPlacement(page: 1, rect: const Rect.fromLTWH(10, 10, 80, 40)); - container - .read(pdfProvider.notifier) - .addPlacement(page: 4, rect: const Rect.fromLTWH(120, 200, 100, 50)); - // Keep backward compatibility with existing export step expectations - container.read(pdfProvider.notifier).setSignedPage(1); - container.read(signatureProvider.notifier).placeDefaultRect(); -} diff --git a/test/features/step/a_pdf_is_open_with_no_signatures_placed.dart b/test/features/step/a_pdf_is_open_with_no_signatures_placed.dart deleted file mode 100644 index 7a1b206..0000000 --- a/test/features/step/a_pdf_is_open_with_no_signatures_placed.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; -import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; -import '_world.dart'; - -/// Usage: a PDF is open with no signatures placed -Future aPdfIsOpenWithNoSignaturesPlaced(WidgetTester tester) async { - // Fresh world for this scenario to avoid leftover rect/image from previous tests - TestWorld.reset(); - final container = ProviderContainer(); - TestWorld.container = container; - container - .read(pdfProvider.notifier) - .openPicked(path: 'mock.pdf', pageCount: 1); - container.read(signatureProvider.notifier).resetForNewPage(); -} diff --git a/test/features/step/a_multipage_pdf_is_open.dart b/test/features/step/a_sample_multipage_document5_pages_is_available.dart similarity index 63% rename from test/features/step/a_multipage_pdf_is_open.dart rename to test/features/step/a_sample_multipage_document5_pages_is_available.dart index ade0143..3c40522 100644 --- a/test/features/step/a_multipage_pdf_is_open.dart +++ b/test/features/step/a_sample_multipage_document5_pages_is_available.dart @@ -3,11 +3,13 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; import '_world.dart'; -/// Usage: a multi-page PDF is open -Future aMultipagePdfIsOpen(WidgetTester tester) async { +/// Usage: a sample multi-page document (5 pages) is available +Future aSampleMultipageDocument5PagesIsAvailable( + WidgetTester tester, +) async { final container = TestWorld.container ?? ProviderContainer(); TestWorld.container = container; container .read(pdfProvider.notifier) - .openPicked(path: 'sample.pdf', pageCount: 10); + .openPicked(path: 'sample.pdf', pageCount: 5); } diff --git a/test/features/step/a_signature_asset_is_created.dart b/test/features/step/a_signature_asset_is_created.dart new file mode 100644 index 0000000..41c03c1 --- /dev/null +++ b/test/features/step/a_signature_asset_is_created.dart @@ -0,0 +1,6 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Usage: a signature asset is created +Future aSignatureAssetIsCreated(WidgetTester tester) async { + throw UnimplementedError(); +} diff --git a/test/features/step/a_signature_asset_is_loaded_or_drawn.dart b/test/features/step/a_signature_asset_is_loaded_or_drawn.dart new file mode 100644 index 0000000..307b05b --- /dev/null +++ b/test/features/step/a_signature_asset_is_loaded_or_drawn.dart @@ -0,0 +1,6 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Usage: a signature asset is loaded or drawn +Future aSignatureAssetIsLoadedOrDrawn(WidgetTester tester) async { + throw UnimplementedError(); +} diff --git a/test/features/step/a_signature_asset_is_placed_on_the_page.dart b/test/features/step/a_signature_asset_is_placed_on_the_page.dart new file mode 100644 index 0000000..77a0684 --- /dev/null +++ b/test/features/step/a_signature_asset_is_placed_on_the_page.dart @@ -0,0 +1,6 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Usage: a signature asset is placed on the page +Future aSignatureAssetIsPlacedOnThePage(WidgetTester tester) async { + throw UnimplementedError(); +} diff --git a/test/features/step/a_signature_asset_is_selected.dart b/test/features/step/a_signature_asset_is_selected.dart new file mode 100644 index 0000000..7fea4ad --- /dev/null +++ b/test/features/step/a_signature_asset_is_selected.dart @@ -0,0 +1,6 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Usage: a signature asset is selected +Future aSignatureAssetIsSelected(WidgetTester tester) async { + throw UnimplementedError(); +} diff --git a/test/features/step/a_signature_asset_loaded_or_drawn_is_wrapped_in_a_signature_card.dart b/test/features/step/a_signature_asset_loaded_or_drawn_is_wrapped_in_a_signature_card.dart new file mode 100644 index 0000000..b236d54 --- /dev/null +++ b/test/features/step/a_signature_asset_loaded_or_drawn_is_wrapped_in_a_signature_card.dart @@ -0,0 +1,23 @@ +import 'dart:typed_data'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:pdf_signature/ui/features/signature/view_model/signature_library.dart'; +import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; +import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; +import 'package:pdf_signature/data/model/model.dart'; +import '_world.dart'; + +/// Usage: a signature asset loaded or drawn is wrapped in a signature card +Future aSignatureAssetLoadedOrDrawnIsWrappedInASignatureCard( + WidgetTester tester, +) async { + final container = TestWorld.container ?? ProviderContainer(); + TestWorld.container = container; + container.read(signatureLibraryProvider.notifier).state = []; + container.read(pdfProvider.notifier).state = PdfState.initial(); + container.read(signatureProvider.notifier).state = SignatureState.initial(); + final bytes = Uint8List.fromList([1, 2, 3, 4, 5]); + container + .read(signatureLibraryProvider.notifier) + .add(bytes, name: 'test.png'); +} diff --git a/test/features/step/a_signature_image_is_created.dart b/test/features/step/a_signature_image_is_created.dart deleted file mode 100644 index e024ac8..0000000 --- a/test/features/step/a_signature_image_is_created.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; -import '_world.dart'; - -/// Usage: a signature image is created -Future aSignatureImageIsCreated(WidgetTester tester) async { - final container = TestWorld.container ?? ProviderContainer(); - expect(container.read(signatureProvider).imageBytes, isNotNull); -} diff --git a/test/features/step/a_signature_image_is_loaded_or_drawn.dart b/test/features/step/a_signature_image_is_loaded_or_drawn.dart deleted file mode 100644 index 8172637..0000000 --- a/test/features/step/a_signature_image_is_loaded_or_drawn.dart +++ /dev/null @@ -1,14 +0,0 @@ -import 'dart:typed_data'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; -import '_world.dart'; - -/// Usage: a signature image is loaded or drawn -Future aSignatureImageIsLoadedOrDrawn(WidgetTester tester) async { - final container = TestWorld.container ?? ProviderContainer(); - TestWorld.container = container; - container - .read(signatureProvider.notifier) - .setImageBytes(Uint8List.fromList([1, 2, 3])); -} diff --git a/test/features/step/a_signature_image_is_selected.dart b/test/features/step/a_signature_image_is_selected.dart deleted file mode 100644 index b9f7460..0000000 --- a/test/features/step/a_signature_image_is_selected.dart +++ /dev/null @@ -1,28 +0,0 @@ -import 'dart:typed_data'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; -import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; -import '_world.dart'; - -/// Usage: a signature image is selected -Future aSignatureImageIsSelected(WidgetTester tester) async { - final container = TestWorld.container ?? ProviderContainer(); - TestWorld.container = container; - container - .read(pdfProvider.notifier) - .openPicked(path: 'mock.pdf', pageCount: 2); - container.read(pdfProvider.notifier).setSignedPage(1); - container - .read(signatureProvider.notifier) - .setImageBytes(Uint8List.fromList([1, 2, 3])); - // Allow provider scheduler to process queued updates fully - await tester.pumpAndSettle(); - // Extra pump with a non-zero duration to flush zero-delay timers - await tester.pump(const Duration(milliseconds: 1)); - // Teardown to avoid pending timers from Riverpod's scheduler - addTearDown(() { - TestWorld.container?.dispose(); - TestWorld.container = null; - }); -} diff --git a/test/features/step/a_signature_is_placed_on_page.dart b/test/features/step/a_signature_is_placed_on_page.dart deleted file mode 100644 index 7f7b0bb..0000000 --- a/test/features/step/a_signature_is_placed_on_page.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'dart:typed_data'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter/material.dart'; -import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; -import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; -import '_world.dart'; - -/// Usage: a signature is placed on page {2} -Future aSignatureIsPlacedOnPage(WidgetTester tester, num page) async { - final container = TestWorld.container ?? ProviderContainer(); - TestWorld.container = container; - container - .read(pdfProvider.notifier) - .openPicked(path: 'mock.pdf', pageCount: 6); - // Ensure image and rect - container - .read(signatureProvider.notifier) - .setImageBytes(Uint8List.fromList([1, 2, 3])); - container.read(signatureProvider.notifier).placeDefaultRect(); - final Rect r = container.read(signatureProvider).rect!; - container - .read(pdfProvider.notifier) - .addPlacement(page: page.toInt(), rect: r, imageId: 'default.png'); -} diff --git a/test/features/step/a_signature_is_placed_with_a_position_and_size_relative_to_the_page.dart b/test/features/step/a_signature_is_placed_with_a_position_and_size_relative_to_the_page.dart deleted file mode 100644 index d504b8e..0000000 --- a/test/features/step/a_signature_is_placed_with_a_position_and_size_relative_to_the_page.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'dart:typed_data'; -import 'dart:ui'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; -import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; -import '_world.dart'; - -/// Usage: a signature is placed with a position and size relative to the page -Future aSignatureIsPlacedWithAPositionAndSizeRelativeToThePage( - WidgetTester tester, -) async { - final container = TestWorld.container ?? ProviderContainer(); - TestWorld.container = container; - container - .read(pdfProvider.notifier) - .openPicked( - path: 'mock.pdf', - pageCount: 2, - bytes: Uint8List.fromList([1, 2, 3]), - ); - container.read(pdfProvider.notifier).setSignedPage(1); - final r = Rect.fromLTWH(50, 100, 120, 60); - final sigN = container.read(signatureProvider.notifier); - sigN.placeDefaultRect(); - // overwrite to desired rect - final sig = container.read(signatureProvider); - sigN - ..toggleAspect(true) - ..resize(Offset(r.width - sig.rect!.width, r.height - sig.rect!.height)); - // move to target top-left - final movedDelta = Offset(r.left - sig.rect!.left, r.top - sig.rect!.top); - sigN.drag(movedDelta); - container - .read(signatureProvider.notifier) - .setImageBytes(Uint8List.fromList([4, 5, 6])); -} diff --git a/test/features/step/a_signature_placement_appears_on_the_page_based_on_the_signature_card.dart b/test/features/step/a_signature_placement_appears_on_the_page_based_on_the_signature_card.dart new file mode 100644 index 0000000..3d530ca --- /dev/null +++ b/test/features/step/a_signature_placement_appears_on_the_page_based_on_the_signature_card.dart @@ -0,0 +1,7 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Usage: a signature placement appears on the page based on the signature card +Future aSignaturePlacementAppearsOnThePageBasedOnTheSignatureCard( + WidgetTester tester) async { + throw UnimplementedError(); +} diff --git a/test/features/step/three_signatures_are_placed_on_the_current_page.dart b/test/features/step/a_signature_placement_is_placed_on_page.dart similarity index 50% rename from test/features/step/three_signatures_are_placed_on_the_current_page.dart rename to test/features/step/a_signature_placement_is_placed_on_page.dart index e12e2a4..ee1b371 100644 --- a/test/features/step/three_signatures_are_placed_on_the_current_page.dart +++ b/test/features/step/a_signature_placement_is_placed_on_page.dart @@ -1,20 +1,22 @@ +import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter/material.dart'; import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; import '_world.dart'; -/// Usage: three signatures are placed on the current page -Future threeSignaturesArePlacedOnTheCurrentPage( +/// Usage: a signature placement is placed on page {2} +Future aSignaturePlacementIsPlacedOnPage( WidgetTester tester, + num param1, ) async { final container = TestWorld.container ?? ProviderContainer(); TestWorld.container = container; + final page = param1.toInt(); container .read(pdfProvider.notifier) - .openPicked(path: 'mock.pdf', pageCount: 5); - final n = container.read(pdfProvider.notifier); - n.addPlacement(page: 1, rect: const Rect.fromLTWH(10, 10, 80, 40)); - n.addPlacement(page: 1, rect: const Rect.fromLTWH(100, 50, 80, 40)); - n.addPlacement(page: 1, rect: const Rect.fromLTWH(200, 90, 80, 40)); + .addPlacement( + page: page, + rect: Rect.fromLTWH(20, 20, 100, 50), + assetId: 'test.png', + ); } diff --git a/test/features/step/a_signature_placement_is_placed_with_a_position_and_size_relative_to_the_page.dart b/test/features/step/a_signature_placement_is_placed_with_a_position_and_size_relative_to_the_page.dart new file mode 100644 index 0000000..09d631c --- /dev/null +++ b/test/features/step/a_signature_placement_is_placed_with_a_position_and_size_relative_to_the_page.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; +import '_world.dart'; + +/// Usage: a signature placement is placed with a position and size relative to the page +Future aSignaturePlacementIsPlacedWithAPositionAndSizeRelativeToThePage( + WidgetTester tester, +) async { + final container = TestWorld.container ?? ProviderContainer(); + TestWorld.container = container; + final pdf = container.read(pdfProvider); + container + .read(pdfProvider.notifier) + .addPlacement( + page: pdf.currentPage, + rect: Rect.fromLTWH(50, 50, 200, 100), + assetId: 'test.png', + ); +} diff --git a/test/features/step/adjusting_one_instance_does_not_affect_the_others.dart b/test/features/step/adjusting_one_instance_does_not_affect_the_others.dart index 0171449..a91512b 100644 --- a/test/features/step/adjusting_one_instance_does_not_affect_the_others.dart +++ b/test/features/step/adjusting_one_instance_does_not_affect_the_others.dart @@ -14,7 +14,7 @@ Future adjustingOneInstanceDoesNotAffectTheOthers( container.read(pdfProvider.notifier).removePlacement(page: 2, index: 0); container .read(pdfProvider.notifier) - .addPlacement(page: 2, rect: modified, imageId: before[0].imageId); + .addPlacement(page: 2, rect: modified, assetId: before[0].assetId); final after = container.read(pdfProvider.notifier).placementsOn(2); expect(after.any((p) => p.rect == before[1].rect), isTrue); } diff --git a/test/features/step/adjusting_one_of_the_signature_placements_does_not_affect_the_others.dart b/test/features/step/adjusting_one_of_the_signature_placements_does_not_affect_the_others.dart new file mode 100644 index 0000000..ce0d5c4 --- /dev/null +++ b/test/features/step/adjusting_one_of_the_signature_placements_does_not_affect_the_others.dart @@ -0,0 +1,7 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Usage: adjusting one of the signature placements does not affect the others +Future adjustingOneOfTheSignaturePlacementsDoesNotAffectTheOthers( + WidgetTester tester) async { + throw UnimplementedError(); +} diff --git a/test/features/step/all_placed_signature_placements_appear_on_their_corresponding_pages_in_the_output.dart b/test/features/step/all_placed_signature_placements_appear_on_their_corresponding_pages_in_the_output.dart new file mode 100644 index 0000000..69723f3 --- /dev/null +++ b/test/features/step/all_placed_signature_placements_appear_on_their_corresponding_pages_in_the_output.dart @@ -0,0 +1,18 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; +import '_world.dart'; + +/// Usage: all placed signature placements appear on their corresponding pages in the output +Future +allPlacedSignaturePlacementsAppearOnTheirCorrespondingPagesInTheOutput( + WidgetTester tester, +) async { + final container = TestWorld.container ?? ProviderContainer(); + final pdf = container.read(pdfProvider); + final totalPlacements = pdf.placementsByPage.values.fold( + 0, + (sum, list) => sum + list.length, + ); + expect(totalPlacements, greaterThan(1)); +} diff --git a/test/features/step/all_placed_signatures_appear_on_their_corresponding_pages_in_the_output.dart b/test/features/step/all_placed_signatures_appear_on_their_corresponding_pages_in_the_output.dart deleted file mode 100644 index 75e5128..0000000 --- a/test/features/step/all_placed_signatures_appear_on_their_corresponding_pages_in_the_output.dart +++ /dev/null @@ -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/pdf_controller.dart'; -import '_world.dart'; - -/// Usage: all placed signatures appear on their corresponding pages in the output -Future allPlacedSignaturesAppearOnTheirCorrespondingPagesInTheOutput( - WidgetTester tester, -) async { - final container = TestWorld.container ?? ProviderContainer(); - expect(container.read(pdfProvider.notifier).placementsOn(1), isNotEmpty); - // One of 4 or 5 depending on scenario - final p4 = container.read(pdfProvider.notifier).placementsOn(4); - final p5 = container.read(pdfProvider.notifier).placementsOn(5); - expect(p4.isNotEmpty || p5.isNotEmpty, isTrue); - expect(TestWorld.lastExportBytes, isNotNull); -} diff --git a/test/features/step/both_signature_placements_are_shown_on_their_respective_pages.dart b/test/features/step/both_signature_placements_are_shown_on_their_respective_pages.dart new file mode 100644 index 0000000..9ed59e5 --- /dev/null +++ b/test/features/step/both_signature_placements_are_shown_on_their_respective_pages.dart @@ -0,0 +1,14 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; +import '_world.dart'; + +/// Usage: both signature placements are shown on their respective pages +Future bothSignaturePlacementsAreShownOnTheirRespectivePages( + WidgetTester tester, +) async { + final container = TestWorld.container ?? ProviderContainer(); + final pdf = container.read(pdfProvider); + expect(pdf.placementsByPage[1], isNotEmpty); + expect(pdf.placementsByPage[3], isNotEmpty); +} diff --git a/test/features/step/both_signatures_are_shown_on_their_respective_pages.dart b/test/features/step/both_signatures_are_shown_on_their_respective_pages.dart deleted file mode 100644 index 2e5ad40..0000000 --- a/test/features/step/both_signatures_are_shown_on_their_respective_pages.dart +++ /dev/null @@ -1,15 +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/pdf_controller.dart'; -import '_world.dart'; - -/// Usage: both signatures are shown on their respective pages -Future bothSignaturesAreShownOnTheirRespectivePages( - WidgetTester tester, -) async { - final container = TestWorld.container ?? ProviderContainer(); - final p1 = container.read(pdfProvider.notifier).placementsOn(1); - final p3 = container.read(pdfProvider.notifier).placementsOn(3); - expect(p1, isNotEmpty); - expect(p3, isNotEmpty); -} diff --git a/test/features/step/dragging_or_resizing_one_does_not_change_the_other.dart b/test/features/step/dragging_or_resizing_one_does_not_change_the_other.dart index 3285d78..cf1169d 100644 --- a/test/features/step/dragging_or_resizing_one_does_not_change_the_other.dart +++ b/test/features/step/dragging_or_resizing_one_does_not_change_the_other.dart @@ -20,7 +20,7 @@ Future draggingOrResizingOneDoesNotChangeTheOther( .addPlacement( page: 1, rect: changed, - imageId: list[1].imageId, + assetId: list[1].assetId, rotationDeg: list[1].rotationDeg, ); final after = container.read(pdfProvider.notifier).placementsOn(1); diff --git a/test/features/step/each_signature_can_be_dragged_and_resized_independently.dart b/test/features/step/each_signature_can_be_dragged_and_resized_independently.dart deleted file mode 100644 index 882d2c6..0000000 --- a/test/features/step/each_signature_can_be_dragged_and_resized_independently.dart +++ /dev/null @@ -1,19 +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/pdf_controller.dart'; -import '_world.dart'; - -/// Usage: each signature can be dragged and resized independently -Future eachSignatureCanBeDraggedAndResizedIndependently( - WidgetTester tester, -) async { - final container = TestWorld.container ?? ProviderContainer(); - final list = container.read(pdfProvider.notifier).placementsOn(1); - expect(list.length, greaterThanOrEqualTo(2)); - // Independence is modeled by distinct rects; ensure not equal and both within page - expect(list[0].rect, isNot(equals(list[1].rect))); - for (final p in list.take(2)) { - expect(p.rect.left, greaterThanOrEqualTo(0)); - expect(p.rect.top, greaterThanOrEqualTo(0)); - } -} diff --git a/test/features/step/each_signature_placement_can_be_dragged_and_resized_independently.dart b/test/features/step/each_signature_placement_can_be_dragged_and_resized_independently.dart new file mode 100644 index 0000000..4eab42c --- /dev/null +++ b/test/features/step/each_signature_placement_can_be_dragged_and_resized_independently.dart @@ -0,0 +1,14 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; +import '_world.dart'; + +/// Usage: each signature placement can be dragged and resized independently +Future eachSignaturePlacementCanBeDraggedAndResizedIndependently( + WidgetTester tester, +) async { + final container = TestWorld.container ?? ProviderContainer(); + final pdf = container.read(pdfProvider); + final placements = pdf.placementsByPage[pdf.currentPage] ?? []; + expect(placements.length, greaterThan(1)); +} diff --git a/test/features/step/identical_signature_placements_appear_in_each_location.dart b/test/features/step/identical_signature_placements_appear_in_each_location.dart new file mode 100644 index 0000000..7d49ad8 --- /dev/null +++ b/test/features/step/identical_signature_placements_appear_in_each_location.dart @@ -0,0 +1,16 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; +import '_world.dart'; + +/// Usage: identical signature placements appear in each location +Future identicalSignaturePlacementsAppearInEachLocation( + WidgetTester tester, +) async { + final container = TestWorld.container!; + final pdf = container.read(pdfProvider); + final allPlacements = + pdf.placementsByPage.values.expand((list) => list).toList(); + final assetIds = allPlacements.map((p) => p.assetId).toSet(); + expect(assetIds.length, 1); // All the same +} diff --git a/test/features/step/it_is_placed_on_the_selected_page.dart b/test/features/step/it_is_placed_on_the_selected_page.dart deleted file mode 100644 index 77654fa..0000000 --- a/test/features/step/it_is_placed_on_the_selected_page.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; -import '_world.dart'; - -/// Usage: it is placed on the selected page -Future itIsPlacedOnTheSelectedPage(WidgetTester tester) async { - final container = TestWorld.container ?? ProviderContainer(); - expect(container.read(signatureProvider).imageBytes, isNotNull); -} diff --git a/test/features/step/only_the_selected_signature_is_removed.dart b/test/features/step/only_the_selected_signature_is_removed.dart deleted file mode 100644 index 3754267..0000000 --- a/test/features/step/only_the_selected_signature_is_removed.dart +++ /dev/null @@ -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/pdf_controller.dart'; -import '_world.dart'; - -/// Usage: only the selected signature is removed -Future onlyTheSelectedSignatureIsRemoved(WidgetTester tester) async { - final container = TestWorld.container ?? ProviderContainer(); - final list = container.read(pdfProvider.notifier).placementsOn(1); - expect(list.length, 2); -} diff --git a/test/features/step/only_the_selected_signature_placement_is_removed.dart b/test/features/step/only_the_selected_signature_placement_is_removed.dart new file mode 100644 index 0000000..a8d9717 --- /dev/null +++ b/test/features/step/only_the_selected_signature_placement_is_removed.dart @@ -0,0 +1,14 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; +import '_world.dart'; + +/// Usage: only the selected signature placement is removed +Future onlyTheSelectedSignaturePlacementIsRemoved( + WidgetTester tester, +) async { + final container = TestWorld.container ?? ProviderContainer(); + final pdf = container.read(pdfProvider); + final placements = pdf.placementsByPage[pdf.currentPage] ?? []; + expect(placements.length, lessThan(3)); // Assuming started with 3, removed 1 +} diff --git a/test/features/step/resize_to_fit_within_bounding_box.dart b/test/features/step/resize_to_fit_within_bounding_box.dart new file mode 100644 index 0000000..10be84f --- /dev/null +++ b/test/features/step/resize_to_fit_within_bounding_box.dart @@ -0,0 +1,6 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Usage: resize to fit within bounding box +Future resizeToFitWithinBoundingBox(WidgetTester tester) async { + throw UnimplementedError(); +} diff --git a/test/features/step/signature_placement_occurs_on_the_selected_page.dart b/test/features/step/signature_placement_occurs_on_the_selected_page.dart new file mode 100644 index 0000000..81b4c16 --- /dev/null +++ b/test/features/step/signature_placement_occurs_on_the_selected_page.dart @@ -0,0 +1,7 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Usage: signature placement occurs on the selected page +Future signaturePlacementOccursOnTheSelectedPage( + WidgetTester tester) async { + throw UnimplementedError(); +} diff --git a/test/features/step/the_app_attempts_to_load_the_asset.dart b/test/features/step/the_app_attempts_to_load_the_asset.dart new file mode 100644 index 0000000..32a4402 --- /dev/null +++ b/test/features/step/the_app_attempts_to_load_the_asset.dart @@ -0,0 +1,6 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Usage: the app attempts to load the asset +Future theAppAttemptsToLoadTheAsset(WidgetTester tester) async { + throw UnimplementedError(); +} diff --git a/test/features/step/the_app_attempts_to_load_the_image.dart b/test/features/step/the_app_attempts_to_load_the_image.dart deleted file mode 100644 index a064c0c..0000000 --- a/test/features/step/the_app_attempts_to_load_the_image.dart +++ /dev/null @@ -1,6 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; - -/// Usage: the app attempts to load the image -Future theAppAttemptsToLoadTheImage(WidgetTester tester) async { - // No-op for logic-level test; selection step already applied state. -} diff --git a/test/features/step/the_asset_is_loaded_and_shown_as_a_signature_asset.dart b/test/features/step/the_asset_is_loaded_and_shown_as_a_signature_asset.dart new file mode 100644 index 0000000..2322627 --- /dev/null +++ b/test/features/step/the_asset_is_loaded_and_shown_as_a_signature_asset.dart @@ -0,0 +1,7 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Usage: the asset is loaded and shown as a signature asset +Future theAssetIsLoadedAndShownAsASignatureAsset( + WidgetTester tester) async { + throw UnimplementedError(); +} diff --git a/test/features/step/the_asset_is_loaded_and_shown_as_a_signature_card.dart b/test/features/step/the_asset_is_loaded_and_shown_as_a_signature_card.dart new file mode 100644 index 0000000..e3ba272 --- /dev/null +++ b/test/features/step/the_asset_is_loaded_and_shown_as_a_signature_card.dart @@ -0,0 +1,7 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Usage: the asset is loaded and shown as a signature card +Future theAssetIsLoadedAndShownAsASignatureCard( + WidgetTester tester) async { + throw UnimplementedError(); +} diff --git a/test/features/step/the_asset_is_not_added_to_the_document.dart b/test/features/step/the_asset_is_not_added_to_the_document.dart new file mode 100644 index 0000000..111c36d --- /dev/null +++ b/test/features/step/the_asset_is_not_added_to_the_document.dart @@ -0,0 +1,6 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Usage: the asset is not added to the document +Future theAssetIsNotAddedToTheDocument(WidgetTester tester) async { + throw UnimplementedError(); +} diff --git a/test/features/step/the_image_is_loaded_and_shown_as_a_signature_asset.dart b/test/features/step/the_image_is_loaded_and_shown_as_a_signature_asset.dart deleted file mode 100644 index 5fbcc26..0000000 --- a/test/features/step/the_image_is_loaded_and_shown_as_a_signature_asset.dart +++ /dev/null @@ -1,14 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; -import '_world.dart'; - -/// Usage: the image is loaded and shown as a signature asset -Future theImageIsLoadedAndShownAsASignatureAsset( - WidgetTester tester, -) async { - final container = TestWorld.container ?? ProviderContainer(); - final sig = container.read(signatureProvider); - expect(sig.imageBytes, isNotNull); - expect(sig.rect, isNotNull); -} diff --git a/test/features/step/the_image_is_not_added_to_the_document.dart b/test/features/step/the_image_is_not_added_to_the_document.dart deleted file mode 100644 index ca88e7b..0000000 --- a/test/features/step/the_image_is_not_added_to_the_document.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; -import '_world.dart'; - -/// Usage: the image is not added to the document -Future theImageIsNotAddedToTheDocument(WidgetTester tester) async { - final container = TestWorld.container ?? ProviderContainer(); - final sig = container.read(signatureProvider); - expect(sig.rect, isNull); -} diff --git a/test/features/step/the_image_scales_proportionally.dart b/test/features/step/the_image_scales_proportionally.dart deleted file mode 100644 index 96d1d47..0000000 --- a/test/features/step/the_image_scales_proportionally.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; -import '_world.dart'; - -/// Usage: the image scales proportionally -Future theImageScalesProportionally(WidgetTester tester) async { - final container = TestWorld.container ?? ProviderContainer(); - final sig = container.read(signatureProvider); - final aspect = sig.rect!.width / sig.rect!.height; - expect((aspect - (TestWorld.prevAspect ?? aspect)).abs() < 0.05, isTrue); -} diff --git a/test/features/step/the_other_signature_placements_remain_unchanged.dart b/test/features/step/the_other_signature_placements_remain_unchanged.dart new file mode 100644 index 0000000..a58e31c --- /dev/null +++ b/test/features/step/the_other_signature_placements_remain_unchanged.dart @@ -0,0 +1,7 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Usage: the other signature placements remain unchanged +Future theOtherSignaturePlacementsRemainUnchanged( + WidgetTester tester) async { + throw UnimplementedError(); +} diff --git a/test/features/step/the_other_signatures_remain_unchanged.dart b/test/features/step/the_other_signatures_remain_unchanged.dart deleted file mode 100644 index 5642bc4..0000000 --- a/test/features/step/the_other_signatures_remain_unchanged.dart +++ /dev/null @@ -1,12 +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/pdf_controller.dart'; -import '_world.dart'; - -/// Usage: the other signatures remain unchanged -Future theOtherSignaturesRemainUnchanged(WidgetTester tester) async { - final container = TestWorld.container ?? ProviderContainer(); - final list = container.read(pdfProvider.notifier).placementsOn(1); - // After deleting index 1, two should remain - expect(list.length, 2); -} diff --git a/test/features/step/the_signature_is_stamped_at_the_exact_pdf_page_coordinates_and_size.dart b/test/features/step/the_signature_is_stamped_at_the_exact_pdf_page_coordinates_and_size.dart deleted file mode 100644 index fd26ca2..0000000 --- a/test/features/step/the_signature_is_stamped_at_the_exact_pdf_page_coordinates_and_size.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; -import '_world.dart'; - -/// Usage: the signature is stamped at the exact PDF page coordinates and size -Future theSignatureIsStampedAtTheExactPdfPageCoordinatesAndSize( - WidgetTester tester, -) async { - final container = TestWorld.container ?? ProviderContainer(); - final sig = container.read(signatureProvider); - expect(sig.rect, isNotNull); - expect(sig.rect!.width, greaterThan(0)); - expect(sig.rect!.height, greaterThan(0)); -} diff --git a/test/features/step/the_signature_on_page_remains.dart b/test/features/step/the_signature_on_page_remains.dart deleted file mode 100644 index 26f55cc..0000000 --- a/test/features/step/the_signature_on_page_remains.dart +++ /dev/null @@ -1,12 +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/pdf_controller.dart'; -import '_world.dart'; - -/// Usage: the signature on page {2} remains -Future theSignatureOnPageRemains(WidgetTester tester, num page) async { - final container = TestWorld.container ?? ProviderContainer(); - TestWorld.container = container; - final list = container.read(pdfProvider.notifier).placementsOn(page.toInt()); - expect(list, isNotEmpty); -} diff --git a/test/features/step/the_signature_placement_is_stamped_at_the_exact_pdf_page_coordinates_and_size.dart b/test/features/step/the_signature_placement_is_stamped_at_the_exact_pdf_page_coordinates_and_size.dart new file mode 100644 index 0000000..9d5bd42 --- /dev/null +++ b/test/features/step/the_signature_placement_is_stamped_at_the_exact_pdf_page_coordinates_and_size.dart @@ -0,0 +1,7 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Usage: the signature placement is stamped at the exact PDF page coordinates and size +Future theSignaturePlacementIsStampedAtTheExactPdfPageCoordinatesAndSize( + WidgetTester tester) async { + throw UnimplementedError(); +} diff --git a/test/features/step/the_signature_placement_on_page_is_shown_on_page.dart b/test/features/step/the_signature_placement_on_page_is_shown_on_page.dart new file mode 100644 index 0000000..c370125 --- /dev/null +++ b/test/features/step/the_signature_placement_on_page_is_shown_on_page.dart @@ -0,0 +1,16 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; +import '_world.dart'; + +/// Usage: the signature placement on page {5} is shown on page {5} +Future theSignaturePlacementOnPageIsShownOnPage( + WidgetTester tester, + num param1, + num param2, +) async { + final container = TestWorld.container ?? ProviderContainer(); + final pdf = container.read(pdfProvider); + final page = param1.toInt(); + expect(pdf.placementsByPage[page], isNotEmpty); +} diff --git a/test/features/step/the_signature_placement_on_page_remains.dart b/test/features/step/the_signature_placement_on_page_remains.dart new file mode 100644 index 0000000..aab1e08 --- /dev/null +++ b/test/features/step/the_signature_placement_on_page_remains.dart @@ -0,0 +1,15 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; +import '_world.dart'; + +/// Usage: the signature placement on page {2} remains +Future theSignaturePlacementOnPageRemains( + WidgetTester tester, + num param1, +) async { + final container = TestWorld.container ?? ProviderContainer(); + final pdf = container.read(pdfProvider); + final page = param1.toInt(); + expect(pdf.placementsByPage[page], isNotEmpty); +} diff --git a/test/features/step/the_signature_placement_remains_within_the_page_area.dart b/test/features/step/the_signature_placement_remains_within_the_page_area.dart new file mode 100644 index 0000000..2384265 --- /dev/null +++ b/test/features/step/the_signature_placement_remains_within_the_page_area.dart @@ -0,0 +1,7 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Usage: the signature placement remains within the page area +Future theSignaturePlacementRemainsWithinThePageArea( + WidgetTester tester) async { + throw UnimplementedError(); +} diff --git a/test/features/step/the_signature_placement_rotates_around_its_center_in_real_time.dart b/test/features/step/the_signature_placement_rotates_around_its_center_in_real_time.dart new file mode 100644 index 0000000..205d832 --- /dev/null +++ b/test/features/step/the_signature_placement_rotates_around_its_center_in_real_time.dart @@ -0,0 +1,7 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Usage: the signature placement rotates around its center in real time +Future theSignaturePlacementRotatesAroundItsCenterInRealTime( + WidgetTester tester) async { + throw UnimplementedError(); +} diff --git a/test/features/step/the_signature_placements_appear_on_the_corresponding_page_in_the_output.dart b/test/features/step/the_signature_placements_appear_on_the_corresponding_page_in_the_output.dart new file mode 100644 index 0000000..95cebae --- /dev/null +++ b/test/features/step/the_signature_placements_appear_on_the_corresponding_page_in_the_output.dart @@ -0,0 +1,7 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Usage: the signature placements appear on the corresponding page in the output +Future theSignaturePlacementsAppearOnTheCorrespondingPageInTheOutput( + WidgetTester tester) async { + throw UnimplementedError(); +} diff --git a/test/features/step/the_signature_remains_within_the_page_area.dart b/test/features/step/the_signature_remains_within_the_page_area.dart deleted file mode 100644 index c96ba2a..0000000 --- a/test/features/step/the_signature_remains_within_the_page_area.dart +++ /dev/null @@ -1,14 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; -import '_world.dart'; - -/// Usage: the signature remains within the page area -Future theSignatureRemainsWithinThePageArea(WidgetTester tester) async { - final container = TestWorld.container ?? ProviderContainer(); - final sig = container.read(signatureProvider); - final r = sig.rect!; - expect(r.left >= 0 && r.top >= 0, isTrue); - expect(r.right <= SignatureController.pageSize.width, isTrue); - expect(r.bottom <= SignatureController.pageSize.height, isTrue); -} diff --git a/test/features/step/the_signatures_appear_on_the_corresponding_page_in_the_output.dart b/test/features/step/the_signatures_appear_on_the_corresponding_page_in_the_output.dart deleted file mode 100644 index bc9277c..0000000 --- a/test/features/step/the_signatures_appear_on_the_corresponding_page_in_the_output.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; -import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; -import '_world.dart'; - -/// Usage: the signatures appear on the corresponding page in the output -Future theSignaturesAppearOnTheCorrespondingPageInTheOutput( - WidgetTester tester, -) async { - final container = TestWorld.container ?? ProviderContainer(); - final pdf = container.read(pdfProvider); - final sig = container.read(signatureProvider); - expect(pdf.signedPage, isNotNull); - expect(sig.rect, isNotNull); - expect(sig.imageBytes, isNotNull); -} diff --git a/test/features/step/the_user_chooses_a_image_file_as_a_signature_asset.dart b/test/features/step/the_user_chooses_a_image_file_as_a_signature_asset.dart new file mode 100644 index 0000000..8e61855 --- /dev/null +++ b/test/features/step/the_user_chooses_a_image_file_as_a_signature_asset.dart @@ -0,0 +1,7 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Usage: the user chooses a image file as a signature asset +Future theUserChoosesAImageFileAsASignatureAsset( + WidgetTester tester) async { + throw UnimplementedError(); +} diff --git a/test/features/step/the_user_chooses_a_signature_asset_to_created_a_signature_card.dart b/test/features/step/the_user_chooses_a_signature_asset_to_created_a_signature_card.dart new file mode 100644 index 0000000..19a18db --- /dev/null +++ b/test/features/step/the_user_chooses_a_signature_asset_to_created_a_signature_card.dart @@ -0,0 +1,7 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Usage: the user chooses a signature asset to created a signature card +Future theUserChoosesASignatureAssetToCreatedASignatureCard( + WidgetTester tester) async { + throw UnimplementedError(); +} diff --git a/test/features/step/the_user_chooses_a_signature_image_file.dart b/test/features/step/the_user_chooses_a_signature_image_file.dart deleted file mode 100644 index f9b8eb1..0000000 --- a/test/features/step/the_user_chooses_a_signature_image_file.dart +++ /dev/null @@ -1,82 +0,0 @@ -import 'dart:typed_data'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; -import '_world.dart'; - -/// Usage: the user chooses a signature image file -Future theUserChoosesASignatureImageFile(WidgetTester tester) async { - final container = TestWorld.container ?? ProviderContainer(); - TestWorld.container = container; - // Simulate loading a tiny valid PNG/JPEG bytes; using 1x1 transparent PNG - final bytes = Uint8List.fromList([ - 0x89, - 0x50, - 0x4E, - 0x47, - 0x0D, - 0x0A, - 0x1A, - 0x0A, - 0x00, - 0x00, - 0x00, - 0x0D, - 0x49, - 0x48, - 0x44, - 0x52, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x01, - 0x08, - 0x06, - 0x00, - 0x00, - 0x00, - 0x1F, - 0x15, - 0xC4, - 0x89, - 0x00, - 0x00, - 0x00, - 0x0A, - 0x49, - 0x44, - 0x41, - 0x54, - 0x78, - 0x9C, - 0x63, - 0x00, - 0x01, - 0x00, - 0x00, - 0x05, - 0x00, - 0x01, - 0x0D, - 0x0A, - 0x2D, - 0xB4, - 0x00, - 0x00, - 0x00, - 0x00, - 0x49, - 0x45, - 0x4E, - 0x44, - 0xAE, - 0x42, - 0x60, - 0x82, - ]); - container.read(signatureProvider.notifier).setImageBytes(bytes); -} diff --git a/test/features/step/the_user_deletes_one_selected_signature.dart b/test/features/step/the_user_deletes_one_selected_signature.dart deleted file mode 100644 index 922910b..0000000 --- a/test/features/step/the_user_deletes_one_selected_signature.dart +++ /dev/null @@ -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/pdf_controller.dart'; -import '_world.dart'; - -/// Usage: the user deletes one selected signature -Future theUserDeletesOneSelectedSignature(WidgetTester tester) async { - final container = TestWorld.container ?? ProviderContainer(); - // Remove the middle one (index 1) - container.read(pdfProvider.notifier).removePlacement(page: 1, index: 1); -} diff --git a/test/features/step/the_user_deletes_one_selected_signature_placement.dart b/test/features/step/the_user_deletes_one_selected_signature_placement.dart new file mode 100644 index 0000000..bc5c095 --- /dev/null +++ b/test/features/step/the_user_deletes_one_selected_signature_placement.dart @@ -0,0 +1,17 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; +import '_world.dart'; + +/// Usage: the user deletes one selected signature placement +Future theUserDeletesOneSelectedSignaturePlacement( + WidgetTester tester, +) async { + final container = TestWorld.container ?? ProviderContainer(); + TestWorld.container = container; + final pdf = container.read(pdfProvider); + if (pdf.selectedPlacementIndex == null) { + container.read(pdfProvider.notifier).selectPlacement(0); + } + container.read(pdfProvider.notifier).deleteSelectedPlacement(); +} diff --git a/test/features/step/the_user_drags_it_on_the_page_of_the_document_to_place_signature_placements_in_multiple_locations_in_the_document.dart b/test/features/step/the_user_drags_it_on_the_page_of_the_document_to_place_signature_placements_in_multiple_locations_in_the_document.dart new file mode 100644 index 0000000..bce4951 --- /dev/null +++ b/test/features/step/the_user_drags_it_on_the_page_of_the_document_to_place_signature_placements_in_multiple_locations_in_the_document.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; +import 'package:pdf_signature/ui/features/signature/view_model/signature_library.dart'; +import '_world.dart'; + +/// Usage: the user drags it on the page of the document to place signature placements in multiple locations in the document +Future +theUserDragsItOnThePageOfTheDocumentToPlaceSignaturePlacementsInMultipleLocationsInTheDocument( + WidgetTester tester, +) async { + final container = TestWorld.container!; + final lib = container.read(signatureLibraryProvider); + final assetId = lib.isNotEmpty ? lib.first.id : 'shared.png'; + container + .read(pdfProvider.notifier) + .addPlacement( + page: 1, + rect: Rect.fromLTWH(10, 10, 100, 50), + assetId: assetId, + ); + container + .read(pdfProvider.notifier) + .addPlacement( + page: 2, + rect: Rect.fromLTWH(20, 20, 100, 50), + assetId: assetId, + ); + container + .read(pdfProvider.notifier) + .addPlacement( + page: 3, + rect: Rect.fromLTWH(30, 30, 100, 50), + assetId: assetId, + ); +} diff --git a/test/features/step/the_user_drags_this_signature_card_on_the_page_of_the_document_to_place_a_signature_placement.dart b/test/features/step/the_user_drags_this_signature_card_on_the_page_of_the_document_to_place_a_signature_placement.dart new file mode 100644 index 0000000..aa79546 --- /dev/null +++ b/test/features/step/the_user_drags_this_signature_card_on_the_page_of_the_document_to_place_a_signature_placement.dart @@ -0,0 +1,8 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Usage: the user drags this signature card on the page of the document to place a signature placement +Future + theUserDragsThisSignatureCardOnThePageOfTheDocumentToPlaceASignaturePlacement( + WidgetTester tester) async { + throw UnimplementedError(); +} diff --git a/test/features/step/the_user_enables_aspect_ratio_lock_and_resizes.dart b/test/features/step/the_user_enables_aspect_ratio_lock_and_resizes.dart deleted file mode 100644 index f48ce69..0000000 --- a/test/features/step/the_user_enables_aspect_ratio_lock_and_resizes.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; -import '_world.dart'; - -/// Usage: the user enables aspect ratio lock and resizes -Future theUserEnablesAspectRatioLockAndResizes( - WidgetTester tester, -) async { - final container = TestWorld.container ?? ProviderContainer(); - final sigN = container.read(signatureProvider.notifier); - final sig = container.read(signatureProvider); - TestWorld.prevAspect = sig.rect!.width / sig.rect!.height; - sigN.toggleAspect(true); - sigN.resize(const Offset(100, 50)); -} diff --git a/test/features/step/the_user_navigates_to_page_and_places_another_signature.dart b/test/features/step/the_user_navigates_to_page_and_places_another_signature.dart deleted file mode 100644 index 6a9eefa..0000000 --- a/test/features/step/the_user_navigates_to_page_and_places_another_signature.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'dart:typed_data'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter/material.dart'; -import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; -import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; -import '_world.dart'; - -/// Usage: the user navigates to page {3} and places another signature -Future theUserNavigatesToPageAndPlacesAnotherSignature( - WidgetTester tester, - num page, -) async { - final container = TestWorld.container ?? ProviderContainer(); - TestWorld.container = container; - // Ensure doc open - final pdf = container.read(pdfProvider); - if (!pdf.loaded) { - container - .read(pdfProvider.notifier) - .openPicked(path: 'mock.pdf', pageCount: 6); - } - container.read(pdfProvider.notifier).jumpTo(page.toInt()); - // Ensure an image is loaded - if (container.read(signatureProvider).imageBytes == null) { - container - .read(signatureProvider.notifier) - .setImageBytes(Uint8List.fromList([1, 2, 3])); - } - container.read(signatureProvider.notifier).placeDefaultRect(); - final Rect r = container.read(signatureProvider).rect!; - container - .read(pdfProvider.notifier) - .addPlacement(page: page.toInt(), rect: r, imageId: 'default.png'); -} diff --git a/test/features/step/the_user_navigates_to_page_and_places_another_signature_placement.dart b/test/features/step/the_user_navigates_to_page_and_places_another_signature_placement.dart new file mode 100644 index 0000000..a9dcca5 --- /dev/null +++ b/test/features/step/the_user_navigates_to_page_and_places_another_signature_placement.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; +import '_world.dart'; + +/// Usage: the user navigates to page {5} and places another signature placement +Future theUserNavigatesToPageAndPlacesAnotherSignaturePlacement( + WidgetTester tester, + num param1, +) async { + final container = TestWorld.container ?? ProviderContainer(); + TestWorld.container = container; + final page = param1.toInt(); + container.read(pdfProvider.notifier).jumpTo(page); + container + .read(pdfProvider.notifier) + .addPlacement( + page: page, + rect: Rect.fromLTWH(40, 40, 100, 50), + assetId: 'another.png', + ); +} diff --git a/test/features/step/the_user_places_a_signature_from_picture_on_page.dart b/test/features/step/the_user_places_a_signature_from_picture_on_page.dart deleted file mode 100644 index a43ff9d..0000000 --- a/test/features/step/the_user_places_a_signature_from_picture_on_page.dart +++ /dev/null @@ -1,58 +0,0 @@ -import 'dart:typed_data'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter/material.dart'; -import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; -import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; -import '_world.dart'; - -/// Usage: the user places a signature from picture on page -Future theUserPlacesASignatureFromPictureOnPage( - WidgetTester tester, [ - dynamic imageName, - dynamic pageNumber, -]) async { - final container = TestWorld.container ?? ProviderContainer(); - TestWorld.container = container; - // Ensure a document is open - final pdf = container.read(pdfProvider); - if (!pdf.loaded) { - container - .read(pdfProvider.notifier) - .openPicked(path: 'mock.pdf', pageCount: 6); - } - // Load image bytes based on provided name - if (imageName == null) { - // Alternate between alice/bob for the first two calls to match Examples - final idx = TestWorld.placeFromPictureCallCount++; - imageName = (idx % 2 == 0) ? 'alice.png' : 'bob.png'; - } - final String name = - imageName is String - ? imageName - : (imageName?.toString() ?? 'default.png'); - Uint8List bytes; - switch (name) { - case 'alice.png': - bytes = Uint8List.fromList([1, 2, 3]); - break; - case 'bob.png': - bytes = Uint8List.fromList([4, 5, 6]); - break; - default: - bytes = Uint8List.fromList([7, 8, 9]); - } - container.read(signatureProvider.notifier).setImageBytes(bytes); - // Place default rect and add placement on target page with image name - container.read(signatureProvider.notifier).placeDefaultRect(); - final Rect r = container.read(signatureProvider).rect!; - final int page = - (pageNumber is num) - ? pageNumber.toInt() - : int.tryParse(pageNumber?.toString() ?? '') ?? - // Default pages for the two calls in the scenario: 1 then 3 - ((TestWorld.placeFromPictureCallCount <= 1) ? 1 : 3); - container - .read(pdfProvider.notifier) - .addPlacement(page: page, rect: r, imageId: name); -} diff --git a/test/features/step/the_user_places_a_signature_on_page.dart b/test/features/step/the_user_places_a_signature_on_page.dart deleted file mode 100644 index b980692..0000000 --- a/test/features/step/the_user_places_a_signature_on_page.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'dart:typed_data'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter/material.dart'; -import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; -import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; -import '_world.dart'; - -/// Usage: the user places a signature on page {1} -Future theUserPlacesASignatureOnPage( - WidgetTester tester, - num page, -) async { - final container = TestWorld.container ?? ProviderContainer(); - TestWorld.container = container; - // Ensure doc open - final pdf = container.read(pdfProvider); - if (!pdf.loaded) { - container - .read(pdfProvider.notifier) - .openPicked(path: 'mock.pdf', pageCount: 6); - } - // Ensure an image is loaded - if (container.read(signatureProvider).imageBytes == null) { - container - .read(signatureProvider.notifier) - .setImageBytes(Uint8List.fromList([1, 2, 3])); - } - container.read(signatureProvider.notifier).placeDefaultRect(); - final Rect r = container.read(signatureProvider).rect!; - container - .read(pdfProvider.notifier) - .addPlacement(page: page.toInt(), rect: r, imageId: 'default.png'); -} diff --git a/test/features/step/the_user_places_a_signature_placement_from_asset_on_page.dart b/test/features/step/the_user_places_a_signature_placement_from_asset_on_page.dart new file mode 100644 index 0000000..3e21b65 --- /dev/null +++ b/test/features/step/the_user_places_a_signature_placement_from_asset_on_page.dart @@ -0,0 +1,36 @@ +import 'dart:typed_data'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; +import 'package:pdf_signature/ui/features/signature/view_model/signature_library.dart'; +import 'package:pdf_signature/data/model/model.dart'; +import '_world.dart'; + +/// Usage: the user places a signature placement from asset on page +Future theUserPlacesASignaturePlacementFromAssetOnPage( + WidgetTester tester, + String assetName, + int page, +) async { + final container = TestWorld.container ?? ProviderContainer(); + TestWorld.container = container; + final library = container.read(signatureLibraryProvider); + var asset = library.where((a) => a.name == assetName).firstOrNull; + if (asset == null) { + // add dummy asset + final id = container + .read(signatureLibraryProvider.notifier) + .add(Uint8List(0), name: assetName); + asset = container + .read(signatureLibraryProvider) + .firstWhere((a) => a.id == id); + } + container + .read(pdfProvider.notifier) + .addPlacement( + page: page, + rect: Rect.fromLTWH(10, 10, 50, 50), + assetId: asset.id, + ); +} diff --git a/test/features/step/the_user_places_a_signature_placement_on_page.dart b/test/features/step/the_user_places_a_signature_placement_on_page.dart new file mode 100644 index 0000000..06318ff --- /dev/null +++ b/test/features/step/the_user_places_a_signature_placement_on_page.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; +import '_world.dart'; + +/// Usage: the user places a signature placement on page {1} +Future theUserPlacesASignaturePlacementOnPage( + WidgetTester tester, + num param1, +) async { + final container = TestWorld.container ?? ProviderContainer(); + TestWorld.container = container; + final page = param1.toInt(); + container + .read(pdfProvider.notifier) + .addPlacement( + page: page, + rect: Rect.fromLTWH(20, 20, 100, 50), + assetId: 'test.png', + ); +} diff --git a/test/features/step/the_user_places_two_signature_placements_on_the_same_page.dart b/test/features/step/the_user_places_two_signature_placements_on_the_same_page.dart new file mode 100644 index 0000000..72059ae --- /dev/null +++ b/test/features/step/the_user_places_two_signature_placements_on_the_same_page.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; +import '_world.dart'; + +/// Usage: the user places two signature placements on the same page +Future theUserPlacesTwoSignaturePlacementsOnTheSamePage( + WidgetTester tester, +) async { + final container = TestWorld.container ?? ProviderContainer(); + TestWorld.container = container; + final pdf = container.read(pdfProvider); + final page = pdf.currentPage; + container + .read(pdfProvider.notifier) + .addPlacement( + page: page, + rect: Rect.fromLTWH(10, 10, 100, 50), + assetId: 'sig1.png', + ); + container + .read(pdfProvider.notifier) + .addPlacement( + page: page, + rect: Rect.fromLTWH(120, 10, 100, 50), + assetId: 'sig2.png', + ); +} diff --git a/test/features/step/the_user_places_two_signatures_on_the_same_page.dart b/test/features/step/the_user_places_two_signatures_on_the_same_page.dart deleted file mode 100644 index c501843..0000000 --- a/test/features/step/the_user_places_two_signatures_on_the_same_page.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'dart:typed_data'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; -import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; -import '_world.dart'; - -/// Usage: the user places two signatures on the same page -Future theUserPlacesTwoSignaturesOnTheSamePage( - WidgetTester tester, -) async { - final container = TestWorld.container ?? ProviderContainer(); - TestWorld.container = container; - container - .read(signatureProvider.notifier) - .setImageBytes(Uint8List.fromList([1, 2, 3])); - // First - container.read(signatureProvider.notifier).placeDefaultRect(); - final r1 = container.read(signatureProvider).rect!; - container.read(pdfProvider.notifier).addPlacement(page: 1, rect: r1); - // Second (offset a bit) - final r2 = r1.shift(const Offset(30, 30)); - container.read(pdfProvider.notifier).addPlacement(page: 1, rect: r2); -} diff --git a/test/features/step/the_user_savesexports_the_document.dart b/test/features/step/the_user_savesexports_the_document.dart index 969fbc9..6989a9f 100644 --- a/test/features/step/the_user_savesexports_the_document.dart +++ b/test/features/step/the_user_savesexports_the_document.dart @@ -15,9 +15,22 @@ Future theUserSavesexportsTheDocument(WidgetTester tester) async { final pdf = container.read(pdfProvider); final sig = container.read(signatureProvider); expect(pdf.loaded, isTrue, reason: 'PDF must be loaded before export'); - expect(pdf.signedPage, isNotNull, reason: 'A signed page must be selected'); - expect(sig.rect, isNotNull, reason: 'Signature rect must exist'); - expect(sig.imageBytes, isNotNull, reason: 'Signature image must exist'); + // Check if there are placements + final hasPlacements = pdf.placementsByPage.values.any( + (list) => list.isNotEmpty, + ); + if (!hasPlacements) { + expect( + sig.rect, + isNotNull, + reason: 'Signature rect must exist if no placements', + ); + expect( + sig.imageBytes, + isNotNull, + reason: 'Signature image must exist if no placements', + ); + } // Simulate output TestWorld.lastExportBytes = diff --git a/test/features/step/the_user_uses_rotate_controls.dart b/test/features/step/the_user_uses_rotate_controls.dart new file mode 100644 index 0000000..1c824a3 --- /dev/null +++ b/test/features/step/the_user_uses_rotate_controls.dart @@ -0,0 +1,6 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Usage: the user uses rotate controls +Future theUserUsesRotateControls(WidgetTester tester) async { + throw UnimplementedError(); +} diff --git a/test/features/step/three_signature_placements_are_placed_on_the_current_page.dart b/test/features/step/three_signature_placements_are_placed_on_the_current_page.dart new file mode 100644 index 0000000..16f44bb --- /dev/null +++ b/test/features/step/three_signature_placements_are_placed_on_the_current_page.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:pdf_signature/ui/features/pdf/view_model/pdf_controller.dart'; +import 'package:pdf_signature/ui/features/signature/view_model/signature_library.dart'; +import 'package:pdf_signature/ui/features/signature/view_model/signature_controller.dart'; +import 'package:pdf_signature/data/model/model.dart'; +import '_world.dart'; + +/// Usage: three signature placements are placed on the current page +Future threeSignaturePlacementsArePlacedOnTheCurrentPage( + WidgetTester tester, +) async { + final container = TestWorld.container ?? ProviderContainer(); + TestWorld.container = container; + container.read(signatureLibraryProvider.notifier).state = []; + container.read(pdfProvider.notifier).state = PdfState.initial(); + container.read(signatureProvider.notifier).state = SignatureState.initial(); + container + .read(pdfProvider.notifier) + .openPicked(path: 'mock.pdf', pageCount: 5); + final pdfN = container.read(pdfProvider.notifier); + final pdf = container.read(pdfProvider); + final page = pdf.currentPage; + pdfN.addPlacement( + page: page, + rect: Rect.fromLTWH(10, 10, 50, 50), + assetId: 'test1', + ); + pdfN.addPlacement( + page: page, + rect: Rect.fromLTWH(70, 10, 50, 50), + assetId: 'test2', + ); + pdfN.addPlacement( + page: page, + rect: Rect.fromLTWH(130, 10, 50, 50), + assetId: 'test3', + ); +} diff --git a/test/widget/regression_signature_tests.dart b/test/widget/regression_signature_tests.dart index 30f33a8..0da8ec5 100644 --- a/test/widget/regression_signature_tests.dart +++ b/test/widget/regression_signature_tests.dart @@ -119,8 +119,9 @@ void main() { final processed = container3.read(processedSignatureImageProvider); expect(processed, isNotNull); final pdf = container3.read(pdfProvider); - final imgId = pdf.placementsByPage[pdf.currentPage]?.first.imageId; + final imgId = pdf.placementsByPage[pdf.currentPage]?.first.assetId; expect(imgId, isNotNull); + expect(imgId, isNotEmpty); final lib = container3.read(signatureLibraryProvider); final match = lib.firstWhere((a) => a.id == imgId); expect(match.bytes, equals(processed));