app['Illuminate\Contracts\Console\Kernel']->registerCommand(new ProbeCommand); } public function test_no_interaction_returns_default_no(): void { $this->artisan('test:probe-confirm --default=no --no-interaction') ->expectsOutput('result=no') ->assertExitCode(0); } public function test_no_interaction_returns_default_yes(): void { $this->artisan('test:probe-confirm --default=yes --no-interaction') ->expectsOutput('result=yes') ->assertExitCode(0); } public function test_yes_input_resolves_immediately(): void { $this->artisan('test:probe-confirm --default=no') ->expectsQuestion('진행할까요? (yes/no) [no]', 'yes') ->expectsOutput('result=yes') ->assertExitCode(0); } public function test_no_input_resolves_immediately_when_default_yes(): void { $this->artisan('test:probe-confirm --default=yes') ->expectsQuestion('진행할까요? (yes/no) [yes]', 'no') ->expectsOutput('result=no') ->assertExitCode(0); } public function test_short_y_resolves_to_yes(): void { $this->artisan('test:probe-confirm --default=no') ->expectsQuestion('진행할까요? (yes/no) [no]', 'y') ->expectsOutput('result=yes') ->assertExitCode(0); } public function test_uppercase_yes_resolves_to_yes(): void { $this->artisan('test:probe-confirm --default=no') ->expectsQuestion('진행할까요? (yes/no) [no]', 'YES') ->expectsOutput('result=yes') ->assertExitCode(0); } public function test_empty_input_uses_default_yes(): void { $this->artisan('test:probe-confirm --default=yes') ->expectsQuestion('진행할까요? (yes/no) [yes]', '') ->expectsOutput('result=yes') ->assertExitCode(0); } public function test_empty_input_uses_default_no(): void { $this->artisan('test:probe-confirm --default=no') ->expectsQuestion('진행할까요? (yes/no) [no]', '') ->expectsOutput('result=no') ->assertExitCode(0); } public function test_invalid_input_loops_until_valid(): void { $this->artisan('test:probe-confirm --default=no') ->expectsQuestion('진행할까요? (yes/no) [no]', 'yell_no') ->expectsOutput(' yes, y, no, n 중 하나로 입력해 주세요.') ->expectsQuestion('진행할까요? (yes/no) [no]', 'y') ->expectsOutput('result=yes') ->assertExitCode(0); } public function test_multiple_invalid_inputs_loop_then_resolve(): void { $this->artisan('test:probe-confirm --default=yes') ->expectsQuestion('진행할까요? (yes/no) [yes]', 'foo') ->expectsOutput(' yes, y, no, n 중 하나로 입력해 주세요.') ->expectsQuestion('진행할까요? (yes/no) [yes]', 'bar') ->expectsOutput(' yes, y, no, n 중 하나로 입력해 주세요.') ->expectsQuestion('진행할까요? (yes/no) [yes]', 'no') ->expectsOutput('result=no') ->assertExitCode(0); } } /** * 테스트 전용 Probe 커맨드 — unifiedConfirm 결과를 stdout 으로 그대로 출력한다. */ class ProbeCommand extends Command { use HasUnifiedConfirm; protected $signature = 'test:probe-confirm {--default=no : 기본값 (yes|no)}'; protected $description = '회귀 테스트용 confirm 프로브'; public function handle(): int { $default = $this->option('default') === 'yes'; $result = $this->unifiedConfirm('진행할까요?', $default); $this->line('result='.($result ? 'yes' : 'no')); return self::SUCCESS; } }