diff --git a/test/providers/camera_provider_test.dart b/test/providers/camera_provider_test.dart index 72a291c..d4fdbd2 100644 --- a/test/providers/camera_provider_test.dart +++ b/test/providers/camera_provider_test.dart @@ -252,45 +252,48 @@ void main() { TestWidgetsFlutterBinding.ensureInitialized(); + // 各テストごとに新しいフェイク一式を生成する(setUp は各テスト前に実行される + // ため,従来の `final f = _Fakes();` と同じく独立したインスタンスが得られる). + // プロバイダ生成前のフェイク事前設定はテストごとに異なるため,プロバイダ生成 + // (_makeProvider)は各テスト内に残す. + late _Fakes f; + + setUp(() { + f = _Fakes(); + }); + group('CameraProvider 初期状態', () { test('初期状態では isInitialized が false である', () { - final f = _Fakes(); final provider = _makeProvider(f); expect(provider.isInitialized, isFalse); }); test('初期状態では isSaving が false である', () { - final f = _Fakes(); final provider = _makeProvider(f); expect(provider.isSaving, isFalse); }); test('初期状態では lastSavedFileName が null である', () { - final f = _Fakes(); final provider = _makeProvider(f); expect(provider.lastSavedFileName, isNull); }); test('初期状態では errorMessage が null である', () { - final f = _Fakes(); final provider = _makeProvider(f); expect(provider.errorMessage, isNull); }); test('初期状態では previewRegion がフル領域である', () { - final f = _Fakes(); final provider = _makeProvider(f); expect(provider.previewRegion.isFull, isTrue); }); test('初期状態では permissionDenied が false である', () { - final f = _Fakes(); final provider = _makeProvider(f); expect(provider.permissionDenied, isFalse); }); test('isSoundEnabled は注入した SoundService の値を反映する', () { - final f = _Fakes(); f.sound.soundEnabled = false; final provider = _makeProvider(f); expect(provider.isSoundEnabled, isFalse); @@ -299,7 +302,6 @@ group('CameraProvider.takePicture ガード条件(未初期化)', () { test('未初期化のとき,takePicture は captureQuantitativeDng を呼ばない', () async { - final f = _Fakes(); final provider = _makeProvider(f); await provider.takePicture( @@ -310,7 +312,6 @@ }); test('未初期化のとき,takePicture は generateQuantitativeBaseName を呼ばない', () async { - final f = _Fakes(); final provider = _makeProvider(f); await provider.takePicture(); @@ -319,7 +320,6 @@ }); test('未初期化のとき,takePicture は requestStorage を呼ばない', () async { - final f = _Fakes(); final provider = _makeProvider(f); await provider.takePicture(); @@ -328,7 +328,6 @@ }); test('未初期化のとき,takePicture は何も保存せず isSaving は false のままである', () async { - final f = _Fakes(); final provider = _makeProvider(f); await provider.takePicture(); @@ -341,7 +340,6 @@ }); test('未初期化のとき,takePicture は lastSavedFileName を変更しない', () async { - final f = _Fakes(); final provider = _makeProvider(f); await provider.takePicture(); @@ -350,7 +348,6 @@ }); test('未初期化のとき,takePicture は errorMessage を設定しない', () async { - final f = _Fakes(); final provider = _makeProvider(f); await provider.takePicture(); @@ -359,7 +356,6 @@ }); test('未初期化のとき,takePicture はサービスを一切呼ばない(ログが空)', () async { - final f = _Fakes(); final provider = _makeProvider(f); await provider.takePicture(); @@ -370,7 +366,6 @@ group('CameraProvider.toggleSound', () { test('toggleSound は SoundService.toggleSound に委譲する', () async { - final f = _Fakes(); final provider = _makeProvider(f); await provider.toggleSound(); @@ -379,7 +374,6 @@ }); test('toggleSound 後に isSoundEnabled が反転する', () async { - final f = _Fakes(); f.sound.soundEnabled = true; final provider = _makeProvider(f); @@ -389,7 +383,6 @@ }); test('toggleSound はリスナーへ通知する', () async { - final f = _Fakes(); final provider = _makeProvider(f); var notified = 0; provider.addListener(() => notified++); @@ -402,7 +395,6 @@ group('CameraProvider.playShutterSound', () { test('playShutterSound は SoundService.playShutterSound に委譲する', () async { - final f = _Fakes(); final provider = _makeProvider(f); await provider.playShutterSound(); @@ -413,7 +405,6 @@ group('CameraProvider.openSettings', () { test('openSettings は PermissionService.openSettings に委譲する', () async { - final f = _Fakes(); final provider = _makeProvider(f); await provider.openSettings(); @@ -424,7 +415,6 @@ group('CameraProvider.capturePreviewSnapshot', () { test('最新フレームがない場合,null を返す', () async { - final f = _Fakes(); final provider = _makeProvider(f); final result = await provider.capturePreviewSnapshot(); @@ -435,7 +425,6 @@ group('CameraProvider.disposeCamera', () { test('disposeCamera 後に isInitialized が false である', () async { - final f = _Fakes(); final provider = _makeProvider(f); await provider.disposeCamera(); @@ -444,7 +433,6 @@ }); test('disposeCamera はリスナーへ通知する', () async { - final f = _Fakes(); final provider = _makeProvider(f); var notified = 0; provider.addListener(() => notified++); @@ -457,7 +445,6 @@ group('CameraProvider.initialize(権限拒否で early-return)', () { test('カメラ権限が拒否されると errorMessage に「カメラの権限が必要です」が入る', () async { - final f = _Fakes(); f.permission.cameraGranted = false; final provider = _makeProvider(f); @@ -467,7 +454,6 @@ }); test('カメラ権限が拒否されると permissionDenied が true になる', () async { - final f = _Fakes(); f.permission.cameraGranted = false; final provider = _makeProvider(f); @@ -477,7 +463,6 @@ }); test('カメラ権限が拒否されると isInitialized は false のままである', () async { - final f = _Fakes(); f.permission.cameraGranted = false; final provider = _makeProvider(f); @@ -489,7 +474,6 @@ test( 'initialize は SoundService.init と PreviewRegionService.load を呼ぶ', () async { - final f = _Fakes(); f.permission.cameraGranted = false; final provider = _makeProvider(f); @@ -503,7 +487,6 @@ test( 'initialize は PreviewRegionService が返した領域を previewRegion に反映する', () async { - final f = _Fakes(); f.permission.cameraGranted = false; f.previewRegion.regionToReturn = const PreviewRegion( left: 0.1, @@ -521,7 +504,6 @@ ); test('権限永久拒否のとき permissionPermanentlyDenied が true になる', () async { - final f = _Fakes(); f.permission.cameraGranted = false; f.permission.cameraPermanentlyDenied = true; final provider = _makeProvider(f); @@ -538,7 +520,6 @@ // 実カメラ(availableCameras())に到達させない. test('previewBytes あり: 保存処理が定義順で 1 回ずつ呼ばれる', () async { - final f = _Fakes(); f.permission.cameraGranted = false; final provider = _makeProvider(f); provider.debugSetInitializedForTest(); @@ -576,7 +557,6 @@ test( 'previewBytes あり: scanFile が dng → meta → preview の順で 3 回呼ばれる', () async { - final f = _Fakes(); f.permission.cameraGranted = false; final provider = _makeProvider(f); provider.debugSetInitializedForTest(); @@ -594,7 +574,6 @@ ); test('previewBytes あり: 各保存サービスがちょうど 1 回呼ばれる', () async { - final f = _Fakes(); f.permission.cameraGranted = false; final provider = _makeProvider(f); provider.debugSetInitializedForTest(); @@ -613,7 +592,6 @@ test( 'previewBytes が null: savePreviewJpeg を呼ばず scanFile は 2 回のみ', () async { - final f = _Fakes(); f.permission.cameraGranted = false; final provider = _makeProvider(f); provider.debugSetInitializedForTest(); @@ -629,7 +607,6 @@ ); test('正常系完了後: isSaving が false に戻る', () async { - final f = _Fakes(); f.permission.cameraGranted = false; final provider = _makeProvider(f); provider.debugSetInitializedForTest(); @@ -646,7 +623,6 @@ // notifyListeners() するが,直後に末尾 initialize() が cameraGranted=false で // errorMessage を 'カメラの権限が必要です' に上書きする. // そのため await 完了後の最終値ではなく,保存完了通知時点の履歴で確認する. - final f = _Fakes(); f.permission.cameraGranted = false; final provider = _makeProvider(f); provider.debugSetInitializedForTest(); @@ -666,7 +642,6 @@ // 特性化: 保存成功後も末尾 initialize() が requestCamera=false で // early-return し errorMessage を 'カメラの権限が必要です' に上書きする. // takePicture の最終状態としてはこのメッセージが残る(現状の実装挙動). - final f = _Fakes(); f.permission.cameraGranted = false; final provider = _makeProvider(f); provider.debugSetInitializedForTest(); @@ -679,7 +654,6 @@ }); test('正常系完了後: lastSavedFileName が dngPath のファイル名末尾に一致する', () async { - final f = _Fakes(); f.permission.cameraGranted = false; f.raw.resultToReturn = const QuantitativeCaptureResult( dngPath: '/test/dir/MiniTIAS_QM_20260623_153000.dng', @@ -697,7 +671,6 @@ }); test('保存中に isSaving が true になる(リスナー観測)', () async { - final f = _Fakes(); f.permission.cameraGranted = false; final provider = _makeProvider(f); provider.debugSetInitializedForTest(); @@ -715,7 +688,6 @@ }); test('ストレージ権限拒否: errorMessage が「ストレージの権限が必要です」になる', () async { - final f = _Fakes(); f.permission.cameraGranted = false; f.permission.storageGranted = false; final provider = _makeProvider(f); @@ -733,7 +705,6 @@ test( 'キャプチャ例外: 撮影フローが「撮影に失敗しました」を設定し lastSavedFileName が null になる', () async { - final f = _Fakes(); f.permission.cameraGranted = false; f.raw.captureShouldThrow = true; final provider = _makeProvider(f); @@ -769,7 +740,6 @@ // 特性化: catch で '撮影に失敗しました' を設定後,takePicture 末尾の // initialize() が requestCamera=false で early-return し errorMessage を // 'カメラの権限が必要です' に上書きする.現状の実装挙動を固定する. - final f = _Fakes(); f.permission.cameraGranted = false; f.raw.captureShouldThrow = true; final provider = _makeProvider(f);