From cfb3c72ce1cdba2253479bef7ebbe5127834d214 Mon Sep 17 00:00:00 2001 From: wonjun Date: Sun, 12 Nov 2023 21:05:47 +0900 Subject: [PATCH 01/89] docs: add feature list --- docs/README.md | 149 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) diff --git a/docs/README.md b/docs/README.md index e69de29..85c2c20 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,149 @@ +# πŸŽ… 크리슀마슀 ν”„λ‘œλͺ¨μ…˜ + +## πŸ‘¨β€πŸ’» κΈ°λŠ₯ λͺ©λ‘ + +## πŸ’» [ μž…λ ₯ 및 μž…λ ₯κ°’ 검증 κΈ°λŠ₯ ] + +> ### πŸ—“ μ˜ˆμ•½ λ‚ μ§œ μž…λ ₯ 및 μž…λ ₯κ°’ 검증 + +- [] `μ˜ˆμ•½ λ‚ μ§œ` μž…λ ₯ μš”μ²­ 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. +
+- [] μ‚¬μš©μžμ—κ²Œ `μ˜ˆμ•½ λ‚ μ§œ`λ₯Ό μž…λ ₯λ°›λŠ”λ‹€. + - [] λ‚ μ§œκ°€ λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. + - [] λ‚ μ§œμ˜ μ•ž 뒀에 곡백이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. + - [] 곡백이 μ•ž 뒀에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•œλ‹€. + - [] 곡백이 κΈ€μž 쀑간에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•΄ 곡백 사이λ₯Ό 이어쀀닀. + - [] 곡백 제거 ν›„ κΈ€μž 길이가 3 μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. + - [] μ˜ˆμ•½ λ‚ μ§œκ°€ 숫자 ν˜•μ‹μΈμ§€ ν™•μΈν•œλ‹€. + - [] μ˜ˆμ•½ λ‚ μ§œκ°€ μ–‘μˆ˜μΈμ§€ ν™•μΈν•œλ‹€. + - [] λ‚ μ§œκ°€ 1 이상 31 μ΄ν•˜μ˜ μˆ«μžμΈμ§€ ν™•μΈν•œλ‹€. + - [] 1 이상 31 μ΄ν•˜μ˜ μˆ«μžκ°€ μ•„λ‹Œ 경우, "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”." 의 λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œλ‹€. +- [] μœ„ 경우λ₯Ό λ§Œμ‘±ν•˜μ§€ λͺ»ν•˜λŠ” 경우 `DayInputException`을 λ°œμƒμ‹œν‚€κ³ ,
+ "[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ˜ˆμ•½ λ‚ μ§œ` μž…λ ₯을 λ°›λŠ”λ‹€. + +> ### πŸ”– μ£Όλ¬Έ λ‚΄μ—­ μž…λ ₯ 및 μž…λ ₯κ°’ 검증 + +- [] `μ£Όλ¬Έ λ‚΄μ—­` μž…λ ₯ μš”μ²­ 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. +- [] μ‚¬μš©μžμ—κ²Œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯λ°›λŠ”λ‹€. + - [] `μ£Όλ¬Έ`은 `메뉴 이름`κ³Ό `메뉴 개수`둜 이루어진닀. + - [] `μ£Όλ¬Έ`은 μ‰Όν‘œ(,)λ₯Ό κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„ν•œλ‹€. + - [] `메뉴 이름`와 `메뉴 개수`λŠ” λŒ€μ‹œ(-)λ₯Ό κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„ν•œλ‹€. + +> #### i) πŸ™‹`μ£Όλ¬Έ`에 λŒ€ν•œ μž…λ ₯κ°’ 검증 + +- [] `μ£Όλ¬Έ`이 λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. +- [] `μ£Όλ¬Έ`이 λŒ€μ‹œ(-)λ₯Ό ν¬ν•¨ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€. +- [] `μ£Όλ¬Έ` μ•ž 뒀에 곡백이 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€. + - [] 곡백이 μ•žλ’€μ— ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•œλ‹€. + - [] 곡백이 κΈ€μž 쀑간에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•΄ 곡백 사이λ₯Ό 이어쀀닀. +- [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `OrdersInputException`을 λ°œμƒμ‹œν‚€κ³ ,
+ "[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. + +> #### ii) βœ‰οΈ`메뉴 이름`에 λŒ€ν•œ μž…λ ₯κ°’ 검증 + +- [] `메뉴 이름`이 λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. +- [] κΈ€μž μˆ˜κ°€ 40κΈ€μž μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. +- [] ν•΄λ‹Ή 메뉴 이름이 λ©”λ‰΄νŒμ— μžˆλŠ” 메뉴인지 ν™•μΈν•œλ‹€. +- [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `MenuNameInputException`을 λ°œμƒμ‹œν‚€κ³ ,
+ "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”." λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. + +> #### iii) `메뉴 개수`에 λŒ€ν•œ μž…λ ₯κ°’ 검증 + +- [] `메뉴 개수`κ°€ λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. +- [] `메뉴 개수`κ°€ 2κΈ€μž μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. +- [] `메뉴 개수`κ°€ 숫자 ν˜•μ‹μΈμ§€ ν™•μΈν•œλ‹€. +- [] `메뉴 개수`κ°€ 1 이상 μ •μˆ˜ 인지 ν™•μΈν•œλ‹€. +- [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `MenuCountInputException`을 λ°œμƒμ‹œν‚€κ³ ,
+ "[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. + +> ### πŸ”– iv) μ£Όλ¬Έ λ‚΄μ—­ μž…λ ₯κ°’ μž¬κ²€μ¦ + +- [] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, 쀑볡 메뉴가 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€. +- [] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ μˆ˜λŸ‰μ΄ `20개`κ°€ λ„˜μ–΄κ°€λŠ”μ§€ ν™•μΈν•œλ‹€. +- [] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ 내역이 음료수만 μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. +- [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `OrdersInputException`을 λ°œμƒμ‹œν‚€κ³ ,
+ "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”." λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. + +## 🧩 [ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 κ΄€λ ¨ κΈ°λŠ₯ ] + +> ### πŸ—“ λ‚ μ§œμ— λŒ€ν•œ 적용 κ°€λŠ₯ν•œ 이벀트 νŒλ‹¨ 도메인 둜직 + +- [] μ‚¬μš©μžμ—κ²Œ μž…λ ₯받은 λ‚ μ§œμ— λŒ€ν•΄ + - [] ν•΄λ‹Ή λ‚ μ§œκ°€ 크리슀마슀 D-Day ν”„λ‘œλͺ¨μ…˜ λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. + - [] 평일 할인 λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. + - [] 주말 할인 λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. + - [] νŠΉλ³„ 할인 λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. + +> ### πŸ”– μ£Όλ¬Έ 내역에 λ”°λ₯Έ 이벀트 적용 μ—¬λΆ€ νŒλ‹¨ 도메인 둜직 + +- [] μ‚¬μš©μžμ—κ²Œ μž…λ ₯받은 μ£Όλ¬Έ λ‚΄μ—­( 메뉴 이름과 μˆ˜λŸ‰ )에 λŒ€ν•΄ + - [] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ κΈˆμ•‘μ΄ `10000원` μ΄ν•˜μ΄λ©΄, 할인 이벀트 적용 λŒ€μƒμ—μ„œ μ œμ™Έμ‹œν‚¨λ‹€. + - [] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ κΈˆμ•‘μ΄ `12λ§Œμ› 이상`일 μ‹œ, `μƒ΄νŽ˜μΈ 1개` λ₯Ό μ¦μ •ν•œλ‹€. + - [] μ£Όλ¬Έ 내역을 μ΄μš©ν•΄μ„œ `할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘`을 계산할 수 μžˆλ‹€. + +> ### πŸŽ„ μ£Όλ¬Έ 내역에 λŒ€ν•œ 이벀트 적용 κ²°κ³Ό μ‚°μΆœ 도메인 둜직 + +- [] μ£Όλ¬Έ λ‚΄μ—­κ³Ό λ‚ μ§œλ₯Ό λΉ„κ΅ν•΄μ„œ, `ν˜œνƒ λ‚΄μ—­`을 μƒμ‚°ν•œλ‹€. + - [] μ£Όλ¬Έ 내역에 λ‚ μ§œμ— λ”°λ₯Έ 할인 적용 μ—¬λΆ€λ₯Ό μ μš©ν•΄μ„œ, `할인 κΈˆμ•‘`을 κ³„μ‚°ν•œλ‹€. + - [] ν˜œνƒ λ‚΄μ—­μ˜ κΈˆμ•‘μ„ ν•©μ³μ„œ, `총 ν˜œνƒ κΈˆμ•‘`을 κ³„μ‚°ν•œλ‹€. + - [] μ£Όλ¬Έ 내역에 증정 μ΄λ²€νŠΈκ°€ ν¬ν•¨λ˜μ–΄ μžˆμ„ μ‹œ, μ¦μ •ν’ˆμ˜ κ°€κ²©κΉŒμ§€ `총 ν˜œνƒ κΈˆμ•‘`에 ν¬ν•¨μ‹œν‚¨λ‹€. + - [] 총 ν˜œνƒ κΈˆμ•‘μ„ 기반으둜 12μ›” 이벀트 λ°°μ§€λ₯Ό λ°œκΈ‰ν•œλ‹€. + - [] ν˜œνƒ κΈˆμ•‘μ΄ `5000원` 이상일 μ‹œ, `별` +
ν˜œνƒ κΈˆμ•‘μ΄ `1λ§Œμ›` 이상일 μ‹œ, `트리` +
ν˜œνƒ κΈˆμ•‘μ΄ `2λ§Œμ›` 이상일 μ‹œ, `산타` + - [] `할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘` μ—μ„œ `할인 κΈˆμ•‘`을 λΉΌμ„œ `할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘`을 κ³„μ‚°ν•œλ‹€. + +## πŸ–¨ [ 좜λ ₯ κΈ°λŠ₯ ] + +- [] 좜λ ₯ μˆœμ„œλŠ”
`μ£Όλ¬Έ 메뉴` - `할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘` - `증정 메뉴` - `ν˜œνƒ λ‚΄μ—­`
- `μ΄ν˜œνƒ κΈˆμ•‘` - `할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘` - `12μ›” 이벀트 λ°°μ§€` 순으둜 ν•œλ‹€. + +> ### πŸ™‹β€β™‚οΈ μ£Όλ¬Έ 메뉴 좜λ ₯ + +- [] μ£Όλ¬Έ 메뉴λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. +- [] μ£Όλ¬Έ λ©”λ‰΄λŠ” `${메뉴이름} ${λ©”λ‰΄κ°œμˆ˜} 개` ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. +- [] μ£Όλ¬Έν•œ 메뉴 전체λ₯Ό μœ„μ™€ 같은 ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. +- [] 좜λ ₯ μˆœμ„œλŠ” 자유둭게 ν•œλ‹€. ( 에피타이저 - 메인 메뉴 - λ””μ €νŠΈ - 음료 순으둜 좜λ ₯ν•˜λŠ” 것을 κ³ λ €ν•΄λ³Έλ‹€. ) + +> ### πŸ’° 할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘ 좜λ ₯ + +- [] 할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘μ„ λ‚˜νƒ€λ‚΄λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. +- [] `할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘`을 λ‚˜νƒ€λ‚Έλ‹€. + - [] κΈˆμ•‘μ˜ μ„Έμžλ¦¬ μˆ˜λ§ˆλ‹€ `,`을 λΆ™μ΄λŠ” ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. + +> ### 🎁 증정 메뉴 좜λ ₯ + +- [] 증정 메뉴λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. +- [] 증정 메뉴가 μžˆλŠ” 경우 `${증정 메뉴 이름} ${증정 메뉴 개수} 개` ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. +- [] 증정 메뉴가 μ—†λŠ” 경우 `μ—†μŒ`으둜 좜λ ₯ν•œλ‹€. + +> ### πŸ‘ ν˜œνƒ λ‚΄μ—­ 좜λ ₯ + +- [] ν˜œνƒ 내역을 λ‚˜νƒ€λ‚΄λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. +- [] μ μš©λ˜λŠ” 할인 μ΄λ²€νŠΈλ³„ 이름 및 ν˜œνƒ κΈˆμ•‘μ„ μ •λ¦¬ν•΄μ„œ λ‚˜νƒ€λ‚Έλ‹€. + - [] `${적용 ν˜œνƒ 이벀트 이름}: -${ν˜œνƒ κΈˆμ•‘}원` ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. + - []`ν˜œνƒ κΈˆμ•‘`의 μ„Έμžλ¦¬ μˆ˜λ§ˆλ‹€ `,`을 λΆ™μ΄λŠ” ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. + - [] 적용된 ν˜œνƒμ΄ μ—†μœΌλ©΄ `μ—†μŒ`으둜 좜λ ₯ν•œλ‹€. +- [] μ—¬λŸ¬ 개의 μ΄λ²€νŠΈκ°€ μ μš©λ˜μ—ˆμœΌλ©΄, 좜λ ₯ μˆœμ„œλŠ” 자유둭게 ν•œλ‹€. + +> ### πŸ“‰ 총 ν˜œνƒ κΈˆμ•‘ 좜λ ₯ + +- [] 총 ν˜œνƒ κΈˆμ•‘μ„ λ‚˜νƒ€λ‚΄λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. +- [] `총 ν˜œνƒ κΈˆμ•‘`은 `ν˜œνƒ λ‚΄μ—­`에 적용된 ν˜œνƒ κΈˆμ•‘μ„ λͺ¨λ‘ λ”ν•œ 값을 좜λ ₯ν•œλ‹€. + - [] `-${ν˜œνƒ κΈˆμ•‘}원` ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. + - [] `ν˜œνƒ κΈˆμ•‘`의 μ„Έμžλ¦¬ μˆ˜λ§ˆλ‹€ `,`λ₯Ό λΆ™μ΄λŠ” ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. +- [] `총 ν˜œνƒ κΈˆμ•‘`이 0원이면 `0원`으둜 좜λ ₯ν•œλ‹€. + +> ### πŸ’΅ 할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘ 좜λ ₯ + +- [] 할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘μ„ λ‚˜νƒ€λ‚΄λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. +- [] `할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘`은 `할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘`μ—μ„œ `총 ν˜œνƒ κΈˆμ•‘`을 λΊ€ 값을 좜λ ₯ν•œλ‹€. + - [] `${할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘}원` ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. + - [] `할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘`의 μ„Έμžλ¦¬ μˆ˜λ§ˆλ‹€ `,`λ₯Ό λΆ™μ΄λŠ” ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. + +> ### β­πŸŽ„πŸŽ… 12μ›” 이벀트 λ°°μ§€ 좜λ ₯ + +- [] 12μ›” 이벀트 λ°°μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. +- [] `λ°°μ§€ 이름` 의 ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. + - [] `12μ›” 이벀트 λ°°μ§€`λŠ” `총 ν˜œνƒ κΈˆμ•‘`의 값에 따라 λ‹€λ₯΄κ²Œ 값을 λ‹€λ₯΄κ²Œ 좜λ ₯ν•œλ‹€. + - [] 5000원 이상은 `별`, 10000원 이상은 `트리`, 20000원 이상은 `산타`둜 좜λ ₯ν•œλ‹€. +- [] 이벀트 λ°°μ§€κ°€ λΆ€μ—¬λ˜μ§€ μ•ŠμœΌλ©΄ `μ—†μŒ`을 좜λ ₯ν•œλ‹€. \ No newline at end of file From d7f9b867a51f20004ee31e4929709574dae1aefb Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 10:34:23 +0900 Subject: [PATCH 02/89] feat: add skeleton code for application --- src/main/java/christmas/Application.java | 7 ++- .../controller/PromotionController.java | 7 +++ .../java/christmas/domain/DayPerMonth.java | 9 ++++ .../java/christmas/domain/DecemberDay.java | 35 ++++++++++++ src/main/java/christmas/domain/Order.java | 22 ++++++++ src/main/java/christmas/domain/Orders.java | 19 +++++++ .../domain/constant/DayConstant.java | 17 ++++++ .../christmas/domain/constant/FoodType.java | 25 +++++++++ .../java/christmas/domain/constant/Menu.java | 54 +++++++++++++++++++ .../christmas/domain/constant/Promotion.java | 19 +++++++ .../java/christmas/view/input/InputView.java | 25 +++++++++ .../view/input/parser/InputParser.java | 4 ++ .../christmas/view/output/OutputView.java | 18 +++++++ .../view/output/constant/OutputConstant.java | 5 ++ 14 files changed, 264 insertions(+), 2 deletions(-) create mode 100644 src/main/java/christmas/controller/PromotionController.java create mode 100644 src/main/java/christmas/domain/DayPerMonth.java create mode 100644 src/main/java/christmas/domain/DecemberDay.java create mode 100644 src/main/java/christmas/domain/Order.java create mode 100644 src/main/java/christmas/domain/Orders.java create mode 100644 src/main/java/christmas/domain/constant/DayConstant.java create mode 100644 src/main/java/christmas/domain/constant/FoodType.java create mode 100644 src/main/java/christmas/domain/constant/Menu.java create mode 100644 src/main/java/christmas/domain/constant/Promotion.java create mode 100644 src/main/java/christmas/view/input/InputView.java create mode 100644 src/main/java/christmas/view/input/parser/InputParser.java create mode 100644 src/main/java/christmas/view/output/OutputView.java create mode 100644 src/main/java/christmas/view/output/constant/OutputConstant.java diff --git a/src/main/java/christmas/Application.java b/src/main/java/christmas/Application.java index b9ba6a2..efa09ea 100644 --- a/src/main/java/christmas/Application.java +++ b/src/main/java/christmas/Application.java @@ -1,7 +1,10 @@ package christmas; +import christmas.controller.PromotionController; + public class Application { public static void main(String[] args) { - // TODO: ν”„λ‘œκ·Έλž¨ κ΅¬ν˜„ + PromotionController promotionController = new PromotionController(); + promotionController.run(); } -} +} \ No newline at end of file diff --git a/src/main/java/christmas/controller/PromotionController.java b/src/main/java/christmas/controller/PromotionController.java new file mode 100644 index 0000000..96bd1e0 --- /dev/null +++ b/src/main/java/christmas/controller/PromotionController.java @@ -0,0 +1,7 @@ +package christmas.controller; + +public class PromotionController { + public void run() { + + } +} diff --git a/src/main/java/christmas/domain/DayPerMonth.java b/src/main/java/christmas/domain/DayPerMonth.java new file mode 100644 index 0000000..af21826 --- /dev/null +++ b/src/main/java/christmas/domain/DayPerMonth.java @@ -0,0 +1,9 @@ +package christmas.domain; + +public abstract class DayPerMonth { + protected int FIRST_DAY; + protected int LAST_DAY; + + public DayPerMonth() { + } +} \ No newline at end of file diff --git a/src/main/java/christmas/domain/DecemberDay.java b/src/main/java/christmas/domain/DecemberDay.java new file mode 100644 index 0000000..324e0ea --- /dev/null +++ b/src/main/java/christmas/domain/DecemberDay.java @@ -0,0 +1,35 @@ +package christmas.domain; + +import static christmas.domain.constant.DayConstant.DECEMBER_FIRST_DAY; +import static christmas.domain.constant.DayConstant.DECEMBER_LAST_DAY; + +public class DecemberDay extends DayPerMonth { + private final boolean isChristmasPromotionApplicable; + private final boolean isWeekend; + private final boolean hasStar; + + private DecemberDay(final boolean isChristmasPromotionApplicable, final boolean isWeekend, final boolean hasStar) { + super(); + this.FIRST_DAY = DECEMBER_FIRST_DAY.getDay(); + this.LAST_DAY = DECEMBER_LAST_DAY.getDay(); + this.isChristmasPromotionApplicable = isChristmasPromotionApplicable; + this.isWeekend = isWeekend; + this.hasStar = hasStar; + } + + public static DecemberDay from(int day) { + return new DecemberDay(judgeIsChristmasPromotionApplicable(day), judgeIsWeekend(day), judgeHasStar(day)); + } + + private static boolean judgeIsChristmasPromotionApplicable(int day) { + return true; + } + + private static boolean judgeIsWeekend(int day) { + return true; + } + + private static boolean judgeHasStar(int day) { + return true; + } +} \ No newline at end of file diff --git a/src/main/java/christmas/domain/Order.java b/src/main/java/christmas/domain/Order.java new file mode 100644 index 0000000..e09b9cf --- /dev/null +++ b/src/main/java/christmas/domain/Order.java @@ -0,0 +1,22 @@ +package christmas.domain; + +import christmas.domain.constant.Menu; + +public class Order { + private final Menu menu; + private final int count; + + private Order(Menu menu, final int count) { + this.menu = menu; + this.count = count; + } + + public static Order of(Menu menu, final int count) { + validate(menu, count); + return new Order(menu, count); + } + + private static void validate(Menu menu, final int count) { + + } +} \ No newline at end of file diff --git a/src/main/java/christmas/domain/Orders.java b/src/main/java/christmas/domain/Orders.java new file mode 100644 index 0000000..ac4620c --- /dev/null +++ b/src/main/java/christmas/domain/Orders.java @@ -0,0 +1,19 @@ +package christmas.domain; + +import java.util.List; + +public class Orders { + private final List orders; + + private Orders(List orders) { + this.orders = orders; + } + + private static Orders from(List orders) { + validate(orders); + return new Orders(orders); + } + + private static void validate(List orders) { + } +} \ No newline at end of file diff --git a/src/main/java/christmas/domain/constant/DayConstant.java b/src/main/java/christmas/domain/constant/DayConstant.java new file mode 100644 index 0000000..14b77b3 --- /dev/null +++ b/src/main/java/christmas/domain/constant/DayConstant.java @@ -0,0 +1,17 @@ +package christmas.domain.constant; + +public enum DayConstant { + + DECEMBER_FIRST_DAY(1), + DECEMBER_LAST_DAY(31); + + private final int day; + + DayConstant(final int day) { + this.day = day; + } + + public int getDay() { + return day; + } +} \ No newline at end of file diff --git a/src/main/java/christmas/domain/constant/FoodType.java b/src/main/java/christmas/domain/constant/FoodType.java new file mode 100644 index 0000000..ca4bfe5 --- /dev/null +++ b/src/main/java/christmas/domain/constant/FoodType.java @@ -0,0 +1,25 @@ +package christmas.domain.constant; + +public enum FoodType { + + APPETIZER(false, false), + MAIN(false, true), + DESSERT(true, false), + BEVERAGE(false, false); + + private final boolean isWeekdayPromotionApplicable; + private final boolean isWeekendPromotionApplicable; + + FoodType(final boolean isWeekdayPromotionApplicable, final boolean isWeekendPromotionApplicable) { + this.isWeekdayPromotionApplicable = isWeekdayPromotionApplicable; + this.isWeekendPromotionApplicable = isWeekendPromotionApplicable; + } + + public boolean isWeekdayPromotionApplicable() { + return isWeekdayPromotionApplicable; + } + + public boolean isWeekendPromotionApplicable() { + return isWeekendPromotionApplicable; + } +} \ No newline at end of file diff --git a/src/main/java/christmas/domain/constant/Menu.java b/src/main/java/christmas/domain/constant/Menu.java new file mode 100644 index 0000000..f3293e8 --- /dev/null +++ b/src/main/java/christmas/domain/constant/Menu.java @@ -0,0 +1,54 @@ +package christmas.domain.constant; + +import static christmas.domain.constant.FoodType.APPETIZER; +import static christmas.domain.constant.FoodType.BEVERAGE; +import static christmas.domain.constant.FoodType.DESSERT; +import static christmas.domain.constant.FoodType.MAIN; + +public enum Menu { + MUSHROOM_SOUP("μ–‘μ†‘μ΄μˆ˜ν”„", 6000, APPETIZER), + TAPAS("νƒ€νŒŒμŠ€", 5500, APPETIZER), + CAESAR_SALAD("μ‹œμ €μƒλŸ¬λ“œ", 8000, APPETIZER), + + T_BONE_STAKE("ν‹°λ³ΈμŠ€ν…Œμ΄ν¬", 55_000, MAIN), + BARBECUE_RIB("바비큐립", 54_000, MAIN), + SEAFOOD_PASTA("ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€", 35_000, MAIN), + CHRISTMAS_PASTA("ν¬λ¦¬μŠ€λ§ˆμŠ€νŒŒμŠ€νƒ€", 25_000, MAIN), + + CHOCHLATE_CAKE("μ΄ˆμ½”μΌ€μ΄ν¬", 15_000, DESSERT), + ICE_CREAM("μ•„μ΄μŠ€ν¬λ¦Ό", 5000, DESSERT), + + ZERO_COKE("제둜콜라", 3000, BEVERAGE), + RED_WINE("λ ˆλ“œμ™€μΈ", 60_000, BEVERAGE), + CAHAMPAGNE("μƒ΄νŽ˜μΈ", 25_000, BEVERAGE); + + private final String name; + private final int price; + private final FoodType foodType; + + Menu(final String name, final int price, final FoodType foodType) { + this.name = name; + this.price = price; + this.foodType = foodType; + } + + public String getName() { + return name; + } + + public int getPrice() { + return price; + } + + public boolean isWeekDayPromotionApplicable() { + return foodType.isWeekdayPromotionApplicable(); + } + + public boolean isWeekendPromotionApplicable() { + return foodType.isWeekendPromotionApplicable(); + } + + public static Menu findByName(final String name) { + return Menu.valueOf(name); + } +} \ No newline at end of file diff --git a/src/main/java/christmas/domain/constant/Promotion.java b/src/main/java/christmas/domain/constant/Promotion.java new file mode 100644 index 0000000..c7bec01 --- /dev/null +++ b/src/main/java/christmas/domain/constant/Promotion.java @@ -0,0 +1,19 @@ +package christmas.domain.constant; + +public enum Promotion { + CHRISTMAS_D_DAY_PROMOTION("크리슀마슀 디데이 할인"), + WEEKDAY_PROMOTION("평일 할인"), + WEEKEND_PROMOTION("주말 할인"), + SPECIAL_STAR_PROMOTION("νŠΉλ³„ 할인"), + GIFT_PROMOTION("증정 이벀트"); + + private final String name; + + Promotion(final String name) { + this.name = name; + } + + public String getName() { + return name; + } +} \ No newline at end of file diff --git a/src/main/java/christmas/view/input/InputView.java b/src/main/java/christmas/view/input/InputView.java new file mode 100644 index 0000000..f43d44c --- /dev/null +++ b/src/main/java/christmas/view/input/InputView.java @@ -0,0 +1,25 @@ +package christmas.view.input; + +import camp.nextstep.edu.missionutils.Console; +import christmas.view.input.parser.InputParser; +import java.util.Map; + +public class InputView { + private final InputParser inputParser; + + public InputView() { + inputParser = new InputParser(); + } + + public int getDay() { + return 0; + } + + public Map getOrders() { + return null; + } + + private String readLine() { + return Console.readLine(); + } +} diff --git a/src/main/java/christmas/view/input/parser/InputParser.java b/src/main/java/christmas/view/input/parser/InputParser.java new file mode 100644 index 0000000..b93201e --- /dev/null +++ b/src/main/java/christmas/view/input/parser/InputParser.java @@ -0,0 +1,4 @@ +package christmas.view.input.parser; + +public class InputParser { +} \ No newline at end of file diff --git a/src/main/java/christmas/view/output/OutputView.java b/src/main/java/christmas/view/output/OutputView.java new file mode 100644 index 0000000..4470ed7 --- /dev/null +++ b/src/main/java/christmas/view/output/OutputView.java @@ -0,0 +1,18 @@ +package christmas.view.output; + +import static christmas.view.output.constant.OutputConstant.NEW_LINE; + +public class OutputView { + + public void printLine() { + System.out.print(NEW_LINE); + } + + public void printErrorMessage(final String message) { + printMessage(message); + } + + private void printMessage(final T message) { + System.out.print(message); + } +} \ No newline at end of file diff --git a/src/main/java/christmas/view/output/constant/OutputConstant.java b/src/main/java/christmas/view/output/constant/OutputConstant.java new file mode 100644 index 0000000..eef02c3 --- /dev/null +++ b/src/main/java/christmas/view/output/constant/OutputConstant.java @@ -0,0 +1,5 @@ +package christmas.view.output.constant; + +public class OutputConstant { + public static String NEW_LINE = System.lineSeparator(); +} \ No newline at end of file From 61aa904eb4a2f06068432c2231ed64c963efe4fa Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 11:20:14 +0900 Subject: [PATCH 03/89] feat: add feature to print statement for user to insert reservation day --- docs/README.md | 3 +-- .../controller/PromotionController.java | 5 ++++- .../christmas/global/PromotionConstant.java | 5 +++++ .../christmas/view/output/OutputView.java | 6 ++++++ .../view/output/constant/OutputMessage.java | 19 +++++++++++++++++++ 5 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 src/main/java/christmas/global/PromotionConstant.java create mode 100644 src/main/java/christmas/view/output/constant/OutputMessage.java diff --git a/docs/README.md b/docs/README.md index 85c2c20..f513a5d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -6,8 +6,7 @@ > ### πŸ—“ μ˜ˆμ•½ λ‚ μ§œ μž…λ ₯ 및 μž…λ ₯κ°’ 검증 -- [] `μ˜ˆμ•½ λ‚ μ§œ` μž…λ ₯ μš”μ²­ 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. -
+- [x] `μ˜ˆμ•½ λ‚ μ§œ` μž…λ ₯ μš”μ²­ 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. - [] μ‚¬μš©μžμ—κ²Œ `μ˜ˆμ•½ λ‚ μ§œ`λ₯Ό μž…λ ₯λ°›λŠ”λ‹€. - [] λ‚ μ§œκ°€ λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. - [] λ‚ μ§œμ˜ μ•ž 뒀에 곡백이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. diff --git a/src/main/java/christmas/controller/PromotionController.java b/src/main/java/christmas/controller/PromotionController.java index 96bd1e0..c9e543a 100644 --- a/src/main/java/christmas/controller/PromotionController.java +++ b/src/main/java/christmas/controller/PromotionController.java @@ -1,7 +1,10 @@ package christmas.controller; +import christmas.view.output.OutputView; + public class PromotionController { public void run() { - + OutputView outputView = new OutputView(); + outputView.askUserToInsertReservationDay(); } } diff --git a/src/main/java/christmas/global/PromotionConstant.java b/src/main/java/christmas/global/PromotionConstant.java new file mode 100644 index 0000000..dda72f1 --- /dev/null +++ b/src/main/java/christmas/global/PromotionConstant.java @@ -0,0 +1,5 @@ +package christmas.global; + +public class PromotionConstant { + public static int CURRENT_PROMOTION_MONTH = 12; +} \ No newline at end of file diff --git a/src/main/java/christmas/view/output/OutputView.java b/src/main/java/christmas/view/output/OutputView.java index 4470ed7..e0184ba 100644 --- a/src/main/java/christmas/view/output/OutputView.java +++ b/src/main/java/christmas/view/output/OutputView.java @@ -1,9 +1,15 @@ package christmas.view.output; import static christmas.view.output.constant.OutputConstant.NEW_LINE; +import static christmas.view.output.constant.OutputMessage.INSERT_RESERVATION_DAY; public class OutputView { + public void askUserToInsertReservationDay() { + printMessage(INSERT_RESERVATION_DAY.getMessage()); + } + + public void printLine() { System.out.print(NEW_LINE); } diff --git a/src/main/java/christmas/view/output/constant/OutputMessage.java b/src/main/java/christmas/view/output/constant/OutputMessage.java new file mode 100644 index 0000000..a6e2ffc --- /dev/null +++ b/src/main/java/christmas/view/output/constant/OutputMessage.java @@ -0,0 +1,19 @@ +package christmas.view.output.constant; + +import static christmas.global.PromotionConstant.CURRENT_PROMOTION_MONTH; +import static christmas.view.output.constant.OutputConstant.NEW_LINE; + +public enum OutputMessage { + INSERT_RESERVATION_DAY("μ•ˆλ…•ν•˜μ„Έμš”! μš°ν…Œμ½” 식당 12μ›” 이벀트 ν”Œλž˜λ„ˆμž…λ‹ˆλ‹€." + NEW_LINE + + CURRENT_PROMOTION_MONTH + "μ›” 쀑 식당 λ°©λ¬Έ λ‚ μ§œλŠ” μ–Έμ œμΈκ°€μš”? (숫자만 μž…λ ₯ν•΄ μ£Όμ„Έμš”!)"); + + private final String message; + + OutputMessage(final String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} \ No newline at end of file From ba4d32b6b60f13f82c0a22d080e351a24ccbf58d Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 11:40:34 +0900 Subject: [PATCH 04/89] feat: add feature to check user input about reservation day is in appropriate range --- docs/README.md | 4 ++-- src/main/java/christmas/domain/DayPerMonth.java | 17 ++++++++++++++++- src/main/java/christmas/domain/DecemberDay.java | 15 ++++++++------- .../domain/exception/InvalidDayException.java | 13 +++++++++++++ .../message/InvalidDayExceptionMessage.java | 17 +++++++++++++++++ .../christmas/global/ApplicationConstant.java | 6 ++++++ .../christmas/global/PromotionConstant.java | 5 ----- .../view/output/constant/OutputMessage.java | 2 +- 8 files changed, 63 insertions(+), 16 deletions(-) create mode 100644 src/main/java/christmas/domain/exception/InvalidDayException.java create mode 100644 src/main/java/christmas/domain/exception/message/InvalidDayExceptionMessage.java create mode 100644 src/main/java/christmas/global/ApplicationConstant.java delete mode 100644 src/main/java/christmas/global/PromotionConstant.java diff --git a/docs/README.md b/docs/README.md index f513a5d..204bd87 100644 --- a/docs/README.md +++ b/docs/README.md @@ -15,8 +15,8 @@ - [] 곡백 제거 ν›„ κΈ€μž 길이가 3 μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. - [] μ˜ˆμ•½ λ‚ μ§œκ°€ 숫자 ν˜•μ‹μΈμ§€ ν™•μΈν•œλ‹€. - [] μ˜ˆμ•½ λ‚ μ§œκ°€ μ–‘μˆ˜μΈμ§€ ν™•μΈν•œλ‹€. - - [] λ‚ μ§œκ°€ 1 이상 31 μ΄ν•˜μ˜ μˆ«μžμΈμ§€ ν™•μΈν•œλ‹€. - - [] 1 이상 31 μ΄ν•˜μ˜ μˆ«μžκ°€ μ•„λ‹Œ 경우, "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”." 의 λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œλ‹€. + - [x] λ‚ μ§œκ°€ 1 이상 31 μ΄ν•˜μ˜ μˆ«μžμΈμ§€ ν™•μΈν•œλ‹€. + - [x] 1 이상 31 μ΄ν•˜μ˜ μˆ«μžκ°€ μ•„λ‹Œ 경우, "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”." 의 λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œλ‹€. - [] μœ„ 경우λ₯Ό λ§Œμ‘±ν•˜μ§€ λͺ»ν•˜λŠ” 경우 `DayInputException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ˜ˆμ•½ λ‚ μ§œ` μž…λ ₯을 λ°›λŠ”λ‹€. diff --git a/src/main/java/christmas/domain/DayPerMonth.java b/src/main/java/christmas/domain/DayPerMonth.java index af21826..bc1cfe8 100644 --- a/src/main/java/christmas/domain/DayPerMonth.java +++ b/src/main/java/christmas/domain/DayPerMonth.java @@ -1,9 +1,24 @@ package christmas.domain; +import static christmas.domain.exception.message.InvalidDayExceptionMessage.NOT_IN_APPROPRIATE_RANGE; + +import christmas.domain.exception.InvalidDayException; + public abstract class DayPerMonth { protected int FIRST_DAY; protected int LAST_DAY; - public DayPerMonth() { + public DayPerMonth(final int day) { + validate(day); + } + + protected void validate(final int day) { + if (!isInAppropriateRange(day)) { + throw InvalidDayException.of(NOT_IN_APPROPRIATE_RANGE); + } + } + + protected boolean isInAppropriateRange(final int day) { + return day >= FIRST_DAY && day <= LAST_DAY; } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/DecemberDay.java b/src/main/java/christmas/domain/DecemberDay.java index 324e0ea..1f63045 100644 --- a/src/main/java/christmas/domain/DecemberDay.java +++ b/src/main/java/christmas/domain/DecemberDay.java @@ -8,8 +8,9 @@ public class DecemberDay extends DayPerMonth { private final boolean isWeekend; private final boolean hasStar; - private DecemberDay(final boolean isChristmasPromotionApplicable, final boolean isWeekend, final boolean hasStar) { - super(); + private DecemberDay(final int day, final boolean isChristmasPromotionApplicable, final boolean isWeekend, + final boolean hasStar) { + super(day); this.FIRST_DAY = DECEMBER_FIRST_DAY.getDay(); this.LAST_DAY = DECEMBER_LAST_DAY.getDay(); this.isChristmasPromotionApplicable = isChristmasPromotionApplicable; @@ -17,19 +18,19 @@ private DecemberDay(final boolean isChristmasPromotionApplicable, final boolean this.hasStar = hasStar; } - public static DecemberDay from(int day) { - return new DecemberDay(judgeIsChristmasPromotionApplicable(day), judgeIsWeekend(day), judgeHasStar(day)); + public static DecemberDay from(final int day) { + return new DecemberDay(day, judgeIsChristmasPromotionApplicable(day), judgeIsWeekend(day), judgeHasStar(day)); } - private static boolean judgeIsChristmasPromotionApplicable(int day) { + private static boolean judgeIsChristmasPromotionApplicable(final int day) { return true; } - private static boolean judgeIsWeekend(int day) { + private static boolean judgeIsWeekend(final int day) { return true; } - private static boolean judgeHasStar(int day) { + private static boolean judgeHasStar(final int day) { return true; } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/exception/InvalidDayException.java b/src/main/java/christmas/domain/exception/InvalidDayException.java new file mode 100644 index 0000000..2dbf278 --- /dev/null +++ b/src/main/java/christmas/domain/exception/InvalidDayException.java @@ -0,0 +1,13 @@ +package christmas.domain.exception; + +import christmas.domain.exception.message.InvalidDayExceptionMessage; + +public class InvalidDayException extends IllegalArgumentException { + private InvalidDayException(final InvalidDayExceptionMessage invalidDayExceptionMessage) { + super(invalidDayExceptionMessage.getMesage()); + } + + public static InvalidDayException of(final InvalidDayExceptionMessage userMoneyInputExceptionMessage) { + return new InvalidDayException(userMoneyInputExceptionMessage); + } +} \ No newline at end of file diff --git a/src/main/java/christmas/domain/exception/message/InvalidDayExceptionMessage.java b/src/main/java/christmas/domain/exception/message/InvalidDayExceptionMessage.java new file mode 100644 index 0000000..19dc6a0 --- /dev/null +++ b/src/main/java/christmas/domain/exception/message/InvalidDayExceptionMessage.java @@ -0,0 +1,17 @@ +package christmas.domain.exception.message; + +import static christmas.global.ApplicationConstant.ERROR_PREFIX; + +public enum InvalidDayExceptionMessage { + NOT_IN_APPROPRIATE_RANGE(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); + + private final String mesage; + + InvalidDayExceptionMessage(final String mesage) { + this.mesage = mesage; + } + + public String getMesage() { + return mesage; + } +} diff --git a/src/main/java/christmas/global/ApplicationConstant.java b/src/main/java/christmas/global/ApplicationConstant.java new file mode 100644 index 0000000..9d2a188 --- /dev/null +++ b/src/main/java/christmas/global/ApplicationConstant.java @@ -0,0 +1,6 @@ +package christmas.global; + +public class ApplicationConstant { + public static int CURRENT_PROMOTION_MONTH = 12; + public static String ERROR_PREFIX = "[ERROR] "; +} \ No newline at end of file diff --git a/src/main/java/christmas/global/PromotionConstant.java b/src/main/java/christmas/global/PromotionConstant.java deleted file mode 100644 index dda72f1..0000000 --- a/src/main/java/christmas/global/PromotionConstant.java +++ /dev/null @@ -1,5 +0,0 @@ -package christmas.global; - -public class PromotionConstant { - public static int CURRENT_PROMOTION_MONTH = 12; -} \ No newline at end of file diff --git a/src/main/java/christmas/view/output/constant/OutputMessage.java b/src/main/java/christmas/view/output/constant/OutputMessage.java index a6e2ffc..17111f3 100644 --- a/src/main/java/christmas/view/output/constant/OutputMessage.java +++ b/src/main/java/christmas/view/output/constant/OutputMessage.java @@ -1,6 +1,6 @@ package christmas.view.output.constant; -import static christmas.global.PromotionConstant.CURRENT_PROMOTION_MONTH; +import static christmas.global.ApplicationConstant.CURRENT_PROMOTION_MONTH; import static christmas.view.output.constant.OutputConstant.NEW_LINE; public enum OutputMessage { From 31990b9f678acc3ac19f713f8268cf1ee00ab05c Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 12:02:25 +0900 Subject: [PATCH 05/89] feat: add feature for user to insert reservation day --- docs/README.md | 2 +- .../controller/PromotionController.java | 12 +++++++++++- .../java/christmas/view/input/InputView.java | 2 +- .../christmas/view/input/parser/InputParser.java | 16 ++++++++++++++++ .../view/input/validator/DayInputValidator.java | 7 +++++++ .../java/christmas/view/output/OutputView.java | 1 + 6 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 src/main/java/christmas/view/input/validator/DayInputValidator.java diff --git a/docs/README.md b/docs/README.md index 204bd87..c9854da 100644 --- a/docs/README.md +++ b/docs/README.md @@ -7,7 +7,7 @@ > ### πŸ—“ μ˜ˆμ•½ λ‚ μ§œ μž…λ ₯ 및 μž…λ ₯κ°’ 검증 - [x] `μ˜ˆμ•½ λ‚ μ§œ` μž…λ ₯ μš”μ²­ 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. -- [] μ‚¬μš©μžμ—κ²Œ `μ˜ˆμ•½ λ‚ μ§œ`λ₯Ό μž…λ ₯λ°›λŠ”λ‹€. +- [x] μ‚¬μš©μžμ—κ²Œ `μ˜ˆμ•½ λ‚ μ§œ`λ₯Ό μž…λ ₯λ°›λŠ”λ‹€. - [] λ‚ μ§œκ°€ λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. - [] λ‚ μ§œμ˜ μ•ž 뒀에 곡백이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. - [] 곡백이 μ•ž 뒀에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•œλ‹€. diff --git a/src/main/java/christmas/controller/PromotionController.java b/src/main/java/christmas/controller/PromotionController.java index c9e543a..9622175 100644 --- a/src/main/java/christmas/controller/PromotionController.java +++ b/src/main/java/christmas/controller/PromotionController.java @@ -1,10 +1,20 @@ package christmas.controller; +import christmas.view.input.InputView; import christmas.view.output.OutputView; public class PromotionController { + private final InputView inputView; + private final OutputView outputView; + + public PromotionController() { + this.inputView = new InputView(); + this.outputView = new OutputView(); + } + public void run() { - OutputView outputView = new OutputView(); outputView.askUserToInsertReservationDay(); + int day = inputView.getDay(); + System.out.println(day); } } diff --git a/src/main/java/christmas/view/input/InputView.java b/src/main/java/christmas/view/input/InputView.java index f43d44c..3846969 100644 --- a/src/main/java/christmas/view/input/InputView.java +++ b/src/main/java/christmas/view/input/InputView.java @@ -12,7 +12,7 @@ public InputView() { } public int getDay() { - return 0; + return inputParser.parseDay(readLine()); } public Map getOrders() { diff --git a/src/main/java/christmas/view/input/parser/InputParser.java b/src/main/java/christmas/view/input/parser/InputParser.java index b93201e..957314d 100644 --- a/src/main/java/christmas/view/input/parser/InputParser.java +++ b/src/main/java/christmas/view/input/parser/InputParser.java @@ -1,4 +1,20 @@ package christmas.view.input.parser; +import christmas.view.input.validator.DayInputValidator; + public class InputParser { + private final DayInputValidator dayInputValidator; + + public InputParser() { + this.dayInputValidator = new DayInputValidator(); + } + + public int parseDay(String userInput) { + dayInputValidator.validate(userInput); + return parseToInt(userInput); + } + + private int parseToInt(String userInput) { + return Integer.parseInt(userInput); + } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/DayInputValidator.java b/src/main/java/christmas/view/input/validator/DayInputValidator.java new file mode 100644 index 0000000..b1fe288 --- /dev/null +++ b/src/main/java/christmas/view/input/validator/DayInputValidator.java @@ -0,0 +1,7 @@ +package christmas.view.input.validator; + +public class DayInputValidator { + public void validate(String day) { + + } +} \ No newline at end of file diff --git a/src/main/java/christmas/view/output/OutputView.java b/src/main/java/christmas/view/output/OutputView.java index e0184ba..40227bb 100644 --- a/src/main/java/christmas/view/output/OutputView.java +++ b/src/main/java/christmas/view/output/OutputView.java @@ -7,6 +7,7 @@ public class OutputView { public void askUserToInsertReservationDay() { printMessage(INSERT_RESERVATION_DAY.getMessage()); + printLine(); } From c3cafdfe6c4a394d59b992a268eb9d4810f999fe Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 12:47:57 +0900 Subject: [PATCH 06/89] feat: add feature to check user input about reservation day is not empty --- docs/README.md | 2 +- .../controller/PromotionController.java | 25 +++++++++++++++++-- .../java/christmas/domain/DayPerMonth.java | 9 ++++--- .../java/christmas/domain/DecemberDay.java | 6 ++--- .../domain/constant/DayConstant.java | 3 ++- .../java/christmas/service/DayService.java | 9 +++++++ .../input/exception/BasicInputException.java | 14 +++++++++++ .../message/BasicInputExceptionMessage.java | 17 +++++++++++++ .../view/input/validator/BasicValidator.java | 12 +++++++++ .../input/validator/DayInputValidator.java | 4 +-- .../christmas/view/output/OutputView.java | 8 +++++- .../view/output/constant/OutputMessage.java | 5 ++-- 12 files changed, 97 insertions(+), 17 deletions(-) create mode 100644 src/main/java/christmas/service/DayService.java create mode 100644 src/main/java/christmas/view/input/exception/BasicInputException.java create mode 100644 src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java create mode 100644 src/main/java/christmas/view/input/validator/BasicValidator.java diff --git a/docs/README.md b/docs/README.md index c9854da..366c5d8 100644 --- a/docs/README.md +++ b/docs/README.md @@ -8,7 +8,7 @@ - [x] `μ˜ˆμ•½ λ‚ μ§œ` μž…λ ₯ μš”μ²­ 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. - [x] μ‚¬μš©μžμ—κ²Œ `μ˜ˆμ•½ λ‚ μ§œ`λ₯Ό μž…λ ₯λ°›λŠ”λ‹€. - - [] λ‚ μ§œκ°€ λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. + - [x] λ‚ μ§œκ°€ λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. - [] λ‚ μ§œμ˜ μ•ž 뒀에 곡백이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. - [] 곡백이 μ•ž 뒀에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•œλ‹€. - [] 곡백이 κΈ€μž 쀑간에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•΄ 곡백 사이λ₯Ό 이어쀀닀. diff --git a/src/main/java/christmas/controller/PromotionController.java b/src/main/java/christmas/controller/PromotionController.java index 9622175..fd9792a 100644 --- a/src/main/java/christmas/controller/PromotionController.java +++ b/src/main/java/christmas/controller/PromotionController.java @@ -1,20 +1,41 @@ package christmas.controller; +import christmas.domain.DecemberDay; +import christmas.domain.exception.InvalidDayException; +import christmas.service.DayService; import christmas.view.input.InputView; +import christmas.view.input.exception.BasicInputException; import christmas.view.output.OutputView; public class PromotionController { private final InputView inputView; private final OutputView outputView; + private final DayService dayService; public PromotionController() { this.inputView = new InputView(); this.outputView = new OutputView(); + this.dayService = new DayService(); } public void run() { - outputView.askUserToInsertReservationDay(); - int day = inputView.getDay(); + outputView.printGreetingMessage(); + DecemberDay day = insertDay(); System.out.println(day); } + + private DecemberDay insertDay() { + try { + int reservationDay = askToInsertReservationDay(); + return dayService.createDay(reservationDay); + } catch (BasicInputException | InvalidDayException e) { + outputView.printErrorMessage(e.getMessage()); + return insertDay(); + } + } + + private int askToInsertReservationDay() { + outputView.askToInsertReservationDay(); + return inputView.getDay(); + } } diff --git a/src/main/java/christmas/domain/DayPerMonth.java b/src/main/java/christmas/domain/DayPerMonth.java index bc1cfe8..4a17d9b 100644 --- a/src/main/java/christmas/domain/DayPerMonth.java +++ b/src/main/java/christmas/domain/DayPerMonth.java @@ -1,15 +1,16 @@ package christmas.domain; +import static christmas.domain.constant.DayConstant.DEFAULT_FIRST_DAY; +import static christmas.domain.constant.DayConstant.DEFAULT_LAST_DAY; import static christmas.domain.exception.message.InvalidDayExceptionMessage.NOT_IN_APPROPRIATE_RANGE; import christmas.domain.exception.InvalidDayException; public abstract class DayPerMonth { - protected int FIRST_DAY; - protected int LAST_DAY; + protected final int FIRST_DAY = DEFAULT_FIRST_DAY.getDay(); + protected final int LAST_DAY = DEFAULT_LAST_DAY.getDay(); - public DayPerMonth(final int day) { - validate(day); + public DayPerMonth() { } protected void validate(final int day) { diff --git a/src/main/java/christmas/domain/DecemberDay.java b/src/main/java/christmas/domain/DecemberDay.java index 1f63045..3914921 100644 --- a/src/main/java/christmas/domain/DecemberDay.java +++ b/src/main/java/christmas/domain/DecemberDay.java @@ -4,15 +4,15 @@ import static christmas.domain.constant.DayConstant.DECEMBER_LAST_DAY; public class DecemberDay extends DayPerMonth { + private final int FIRST_DAY = DECEMBER_FIRST_DAY.getDay(); + private final int LAST_DAY = DECEMBER_LAST_DAY.getDay(); private final boolean isChristmasPromotionApplicable; private final boolean isWeekend; private final boolean hasStar; private DecemberDay(final int day, final boolean isChristmasPromotionApplicable, final boolean isWeekend, final boolean hasStar) { - super(day); - this.FIRST_DAY = DECEMBER_FIRST_DAY.getDay(); - this.LAST_DAY = DECEMBER_LAST_DAY.getDay(); + validate(day); this.isChristmasPromotionApplicable = isChristmasPromotionApplicable; this.isWeekend = isWeekend; this.hasStar = hasStar; diff --git a/src/main/java/christmas/domain/constant/DayConstant.java b/src/main/java/christmas/domain/constant/DayConstant.java index 14b77b3..143dd80 100644 --- a/src/main/java/christmas/domain/constant/DayConstant.java +++ b/src/main/java/christmas/domain/constant/DayConstant.java @@ -1,7 +1,8 @@ package christmas.domain.constant; public enum DayConstant { - + DEFAULT_FIRST_DAY(1), + DEFAULT_LAST_DAY(30), DECEMBER_FIRST_DAY(1), DECEMBER_LAST_DAY(31); diff --git a/src/main/java/christmas/service/DayService.java b/src/main/java/christmas/service/DayService.java new file mode 100644 index 0000000..b65fcf4 --- /dev/null +++ b/src/main/java/christmas/service/DayService.java @@ -0,0 +1,9 @@ +package christmas.service; + +import christmas.domain.DecemberDay; + +public class DayService { + public DecemberDay createDay(final int day) { + return DecemberDay.from(day); + } +} \ No newline at end of file diff --git a/src/main/java/christmas/view/input/exception/BasicInputException.java b/src/main/java/christmas/view/input/exception/BasicInputException.java new file mode 100644 index 0000000..f770dec --- /dev/null +++ b/src/main/java/christmas/view/input/exception/BasicInputException.java @@ -0,0 +1,14 @@ +package christmas.view.input.exception; + +import christmas.domain.exception.message.InvalidDayExceptionMessage; +import christmas.view.input.exception.message.BasicInputExceptionMessage; + +public class BasicInputException extends IllegalArgumentException { + private BasicInputException(final InvalidDayExceptionMessage invalidDayExceptionMessage) { + super(invalidDayExceptionMessage.getMesage()); + } + + public static BasicInputException of(final BasicInputExceptionMessage basicInputExceptionMessage) { + return BasicInputException.of(basicInputExceptionMessage); + } +} \ No newline at end of file diff --git a/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java b/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java new file mode 100644 index 0000000..65492b4 --- /dev/null +++ b/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java @@ -0,0 +1,17 @@ +package christmas.view.input.exception.message; + +import static christmas.global.ApplicationConstant.ERROR_PREFIX; + +public enum BasicInputExceptionMessage { + EMPTY(ERROR_PREFIX + "λΉ„μ–΄μžˆλŠ” μž…λ ₯κ°’μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); + + private final String mesage; + + BasicInputExceptionMessage(final String mesage) { + this.mesage = mesage; + } + + public String getMesage() { + return mesage; + } +} \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/BasicValidator.java b/src/main/java/christmas/view/input/validator/BasicValidator.java new file mode 100644 index 0000000..03e324f --- /dev/null +++ b/src/main/java/christmas/view/input/validator/BasicValidator.java @@ -0,0 +1,12 @@ +package christmas.view.input.validator; + +import christmas.view.input.exception.BasicInputException; +import christmas.view.input.exception.message.BasicInputExceptionMessage; + +public abstract class BasicValidator { + protected void validateNotEmpty(final String userInput) { + if (userInput.isEmpty()) { + throw BasicInputException.of(BasicInputExceptionMessage.EMPTY); + } + } +} \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/DayInputValidator.java b/src/main/java/christmas/view/input/validator/DayInputValidator.java index b1fe288..a195ba7 100644 --- a/src/main/java/christmas/view/input/validator/DayInputValidator.java +++ b/src/main/java/christmas/view/input/validator/DayInputValidator.java @@ -1,7 +1,7 @@ package christmas.view.input.validator; -public class DayInputValidator { +public class DayInputValidator extends BasicValidator { public void validate(String day) { - + validateNotEmpty(day); } } \ No newline at end of file diff --git a/src/main/java/christmas/view/output/OutputView.java b/src/main/java/christmas/view/output/OutputView.java index 40227bb..d70598e 100644 --- a/src/main/java/christmas/view/output/OutputView.java +++ b/src/main/java/christmas/view/output/OutputView.java @@ -1,11 +1,16 @@ package christmas.view.output; import static christmas.view.output.constant.OutputConstant.NEW_LINE; +import static christmas.view.output.constant.OutputMessage.GREETING; import static christmas.view.output.constant.OutputMessage.INSERT_RESERVATION_DAY; public class OutputView { + public void printGreetingMessage() { + printMessage(GREETING.getMessage()); + printLine(); + } - public void askUserToInsertReservationDay() { + public void askToInsertReservationDay() { printMessage(INSERT_RESERVATION_DAY.getMessage()); printLine(); } @@ -17,6 +22,7 @@ public void printLine() { public void printErrorMessage(final String message) { printMessage(message); + printLine(); } private void printMessage(final T message) { diff --git a/src/main/java/christmas/view/output/constant/OutputMessage.java b/src/main/java/christmas/view/output/constant/OutputMessage.java index 17111f3..44c3611 100644 --- a/src/main/java/christmas/view/output/constant/OutputMessage.java +++ b/src/main/java/christmas/view/output/constant/OutputMessage.java @@ -1,11 +1,10 @@ package christmas.view.output.constant; import static christmas.global.ApplicationConstant.CURRENT_PROMOTION_MONTH; -import static christmas.view.output.constant.OutputConstant.NEW_LINE; public enum OutputMessage { - INSERT_RESERVATION_DAY("μ•ˆλ…•ν•˜μ„Έμš”! μš°ν…Œμ½” 식당 12μ›” 이벀트 ν”Œλž˜λ„ˆμž…λ‹ˆλ‹€." + NEW_LINE - + CURRENT_PROMOTION_MONTH + "μ›” 쀑 식당 λ°©λ¬Έ λ‚ μ§œλŠ” μ–Έμ œμΈκ°€μš”? (숫자만 μž…λ ₯ν•΄ μ£Όμ„Έμš”!)"); + GREETING("μ•ˆλ…•ν•˜μ„Έμš”! μš°ν…Œμ½” 식당 12μ›” 이벀트 ν”Œλž˜λ„ˆμž…λ‹ˆλ‹€."), + INSERT_RESERVATION_DAY(CURRENT_PROMOTION_MONTH + "μ›” 쀑 식당 λ°©λ¬Έ λ‚ μ§œλŠ” μ–Έμ œμΈκ°€μš”? (숫자만 μž…λ ₯ν•΄ μ£Όμ„Έμš”!)"); private final String message; From 851a890710103fa29c5f29f369ed81e0c07521b6 Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 13:34:14 +0900 Subject: [PATCH 07/89] fix: fix error when invalid input about reservation day is inserted --- src/main/java/christmas/domain/DayPerMonth.java | 7 ++----- src/main/java/christmas/domain/DecemberDay.java | 7 +++++-- .../view/input/exception/BasicInputException.java | 5 ++--- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/christmas/domain/DayPerMonth.java b/src/main/java/christmas/domain/DayPerMonth.java index 4a17d9b..2fc92ab 100644 --- a/src/main/java/christmas/domain/DayPerMonth.java +++ b/src/main/java/christmas/domain/DayPerMonth.java @@ -1,15 +1,12 @@ package christmas.domain; +import static christmas.domain.constant.DayConstant.DECEMBER_LAST_DAY; import static christmas.domain.constant.DayConstant.DEFAULT_FIRST_DAY; -import static christmas.domain.constant.DayConstant.DEFAULT_LAST_DAY; import static christmas.domain.exception.message.InvalidDayExceptionMessage.NOT_IN_APPROPRIATE_RANGE; import christmas.domain.exception.InvalidDayException; public abstract class DayPerMonth { - protected final int FIRST_DAY = DEFAULT_FIRST_DAY.getDay(); - protected final int LAST_DAY = DEFAULT_LAST_DAY.getDay(); - public DayPerMonth() { } @@ -20,6 +17,6 @@ protected void validate(final int day) { } protected boolean isInAppropriateRange(final int day) { - return day >= FIRST_DAY && day <= LAST_DAY; + return day >= DEFAULT_FIRST_DAY.getDay() && day <= DECEMBER_LAST_DAY.getDay(); } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/DecemberDay.java b/src/main/java/christmas/domain/DecemberDay.java index 3914921..d0be53c 100644 --- a/src/main/java/christmas/domain/DecemberDay.java +++ b/src/main/java/christmas/domain/DecemberDay.java @@ -4,8 +4,6 @@ import static christmas.domain.constant.DayConstant.DECEMBER_LAST_DAY; public class DecemberDay extends DayPerMonth { - private final int FIRST_DAY = DECEMBER_FIRST_DAY.getDay(); - private final int LAST_DAY = DECEMBER_LAST_DAY.getDay(); private final boolean isChristmasPromotionApplicable; private final boolean isWeekend; private final boolean hasStar; @@ -33,4 +31,9 @@ private static boolean judgeIsWeekend(final int day) { private static boolean judgeHasStar(final int day) { return true; } + + @Override + protected boolean isInAppropriateRange(final int day) { + return day >= DECEMBER_FIRST_DAY.getDay() && day <= DECEMBER_LAST_DAY.getDay(); + } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/exception/BasicInputException.java b/src/main/java/christmas/view/input/exception/BasicInputException.java index f770dec..7a9d874 100644 --- a/src/main/java/christmas/view/input/exception/BasicInputException.java +++ b/src/main/java/christmas/view/input/exception/BasicInputException.java @@ -1,14 +1,13 @@ package christmas.view.input.exception; -import christmas.domain.exception.message.InvalidDayExceptionMessage; import christmas.view.input.exception.message.BasicInputExceptionMessage; public class BasicInputException extends IllegalArgumentException { - private BasicInputException(final InvalidDayExceptionMessage invalidDayExceptionMessage) { + private BasicInputException(final BasicInputExceptionMessage invalidDayExceptionMessage) { super(invalidDayExceptionMessage.getMesage()); } public static BasicInputException of(final BasicInputExceptionMessage basicInputExceptionMessage) { - return BasicInputException.of(basicInputExceptionMessage); + return new BasicInputException(basicInputExceptionMessage); } } \ No newline at end of file From f941f33f7604b5ac2be2fc2242f69b9bd391baf3 Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 13:44:55 +0900 Subject: [PATCH 08/89] feat: add feature to remove blank in user input about reservation day --- docs/README.md | 6 +++--- .../christmas/view/input/constant/InputConstant.java | 6 ++++++ .../java/christmas/view/input/parser/InputParser.java | 11 +++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 src/main/java/christmas/view/input/constant/InputConstant.java diff --git a/docs/README.md b/docs/README.md index 366c5d8..992e4e3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -9,9 +9,9 @@ - [x] `μ˜ˆμ•½ λ‚ μ§œ` μž…λ ₯ μš”μ²­ 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. - [x] μ‚¬μš©μžμ—κ²Œ `μ˜ˆμ•½ λ‚ μ§œ`λ₯Ό μž…λ ₯λ°›λŠ”λ‹€. - [x] λ‚ μ§œκ°€ λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. - - [] λ‚ μ§œμ˜ μ•ž 뒀에 곡백이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. - - [] 곡백이 μ•ž 뒀에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•œλ‹€. - - [] 곡백이 κΈ€μž 쀑간에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•΄ 곡백 사이λ₯Ό 이어쀀닀. + - [x] λ‚ μ§œμ˜ μ•ž 뒀에 곡백이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. + - [x] 곡백이 μ•ž 뒀에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•œλ‹€. + - [x] 곡백이 κΈ€μž 쀑간에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•΄ 곡백 사이λ₯Ό 이어쀀닀. - [] 곡백 제거 ν›„ κΈ€μž 길이가 3 μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. - [] μ˜ˆμ•½ λ‚ μ§œκ°€ 숫자 ν˜•μ‹μΈμ§€ ν™•μΈν•œλ‹€. - [] μ˜ˆμ•½ λ‚ μ§œκ°€ μ–‘μˆ˜μΈμ§€ ν™•μΈν•œλ‹€. diff --git a/src/main/java/christmas/view/input/constant/InputConstant.java b/src/main/java/christmas/view/input/constant/InputConstant.java new file mode 100644 index 0000000..2fd2168 --- /dev/null +++ b/src/main/java/christmas/view/input/constant/InputConstant.java @@ -0,0 +1,6 @@ +package christmas.view.input.constant; + +public class InputConstant { + public static String BLANK = " "; + public static String VOID = ""; +} \ No newline at end of file diff --git a/src/main/java/christmas/view/input/parser/InputParser.java b/src/main/java/christmas/view/input/parser/InputParser.java index 957314d..c20e591 100644 --- a/src/main/java/christmas/view/input/parser/InputParser.java +++ b/src/main/java/christmas/view/input/parser/InputParser.java @@ -1,5 +1,8 @@ package christmas.view.input.parser; +import static christmas.view.input.constant.InputConstant.BLANK; +import static christmas.view.input.constant.InputConstant.VOID; + import christmas.view.input.validator.DayInputValidator; public class InputParser { @@ -10,6 +13,7 @@ public InputParser() { } public int parseDay(String userInput) { + userInput = removeBlank(userInput); dayInputValidator.validate(userInput); return parseToInt(userInput); } @@ -17,4 +21,11 @@ public int parseDay(String userInput) { private int parseToInt(String userInput) { return Integer.parseInt(userInput); } + + private String removeBlank(String userInput) { + if (userInput.contains(BLANK)) { + userInput = userInput.replace(BLANK, VOID); + } + return userInput; + } } \ No newline at end of file From ef06b197c42bc4ef345b47bc2f40e56bc9f016d6 Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 14:03:31 +0900 Subject: [PATCH 09/89] feat: add feature to check user input length about reservation day is not more than 2 without blank --- docs/README.md | 2 +- src/main/java/christmas/domain/DayPerMonth.java | 2 +- .../domain/exception/InvalidDayException.java | 8 +++----- .../view/input/constant/InputConstant.java | 1 + .../view/input/exception/BasicInputException.java | 8 +++----- .../message/BasicInputExceptionMessage.java | 3 ++- .../view/input/validator/BasicValidator.java | 14 +++++++++++++- .../view/input/validator/DayInputValidator.java | 4 +++- 8 files changed, 27 insertions(+), 15 deletions(-) diff --git a/docs/README.md b/docs/README.md index 992e4e3..cb38570 100644 --- a/docs/README.md +++ b/docs/README.md @@ -12,7 +12,7 @@ - [x] λ‚ μ§œμ˜ μ•ž 뒀에 곡백이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. - [x] 곡백이 μ•ž 뒀에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•œλ‹€. - [x] 곡백이 κΈ€μž 쀑간에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•΄ 곡백 사이λ₯Ό 이어쀀닀. - - [] 곡백 제거 ν›„ κΈ€μž 길이가 3 μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. + - [x] 곡백 제거 ν›„ κΈ€μž 길이가 2 μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. - [] μ˜ˆμ•½ λ‚ μ§œκ°€ 숫자 ν˜•μ‹μΈμ§€ ν™•μΈν•œλ‹€. - [] μ˜ˆμ•½ λ‚ μ§œκ°€ μ–‘μˆ˜μΈμ§€ ν™•μΈν•œλ‹€. - [x] λ‚ μ§œκ°€ 1 이상 31 μ΄ν•˜μ˜ μˆ«μžμΈμ§€ ν™•μΈν•œλ‹€. diff --git a/src/main/java/christmas/domain/DayPerMonth.java b/src/main/java/christmas/domain/DayPerMonth.java index 2fc92ab..1bc3b01 100644 --- a/src/main/java/christmas/domain/DayPerMonth.java +++ b/src/main/java/christmas/domain/DayPerMonth.java @@ -12,7 +12,7 @@ public DayPerMonth() { protected void validate(final int day) { if (!isInAppropriateRange(day)) { - throw InvalidDayException.of(NOT_IN_APPROPRIATE_RANGE); + throw InvalidDayException.of(NOT_IN_APPROPRIATE_RANGE.getMesage()); } } diff --git a/src/main/java/christmas/domain/exception/InvalidDayException.java b/src/main/java/christmas/domain/exception/InvalidDayException.java index 2dbf278..0a41c4b 100644 --- a/src/main/java/christmas/domain/exception/InvalidDayException.java +++ b/src/main/java/christmas/domain/exception/InvalidDayException.java @@ -1,13 +1,11 @@ package christmas.domain.exception; -import christmas.domain.exception.message.InvalidDayExceptionMessage; - public class InvalidDayException extends IllegalArgumentException { - private InvalidDayException(final InvalidDayExceptionMessage invalidDayExceptionMessage) { - super(invalidDayExceptionMessage.getMesage()); + private InvalidDayException(final String invalidDayExceptionMessage) { + super(invalidDayExceptionMessage); } - public static InvalidDayException of(final InvalidDayExceptionMessage userMoneyInputExceptionMessage) { + public static InvalidDayException of(final String userMoneyInputExceptionMessage) { return new InvalidDayException(userMoneyInputExceptionMessage); } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/constant/InputConstant.java b/src/main/java/christmas/view/input/constant/InputConstant.java index 2fd2168..606266c 100644 --- a/src/main/java/christmas/view/input/constant/InputConstant.java +++ b/src/main/java/christmas/view/input/constant/InputConstant.java @@ -3,4 +3,5 @@ public class InputConstant { public static String BLANK = " "; public static String VOID = ""; + public static int DAY_MAX_INPUT_LENGTH = 2; } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/exception/BasicInputException.java b/src/main/java/christmas/view/input/exception/BasicInputException.java index 7a9d874..23d5a58 100644 --- a/src/main/java/christmas/view/input/exception/BasicInputException.java +++ b/src/main/java/christmas/view/input/exception/BasicInputException.java @@ -1,13 +1,11 @@ package christmas.view.input.exception; -import christmas.view.input.exception.message.BasicInputExceptionMessage; - public class BasicInputException extends IllegalArgumentException { - private BasicInputException(final BasicInputExceptionMessage invalidDayExceptionMessage) { - super(invalidDayExceptionMessage.getMesage()); + private BasicInputException(final String invalidDayExceptionMessage) { + super(invalidDayExceptionMessage); } - public static BasicInputException of(final BasicInputExceptionMessage basicInputExceptionMessage) { + public static BasicInputException of(final String basicInputExceptionMessage) { return new BasicInputException(basicInputExceptionMessage); } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java b/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java index 65492b4..04d96ec 100644 --- a/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java +++ b/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java @@ -3,7 +3,8 @@ import static christmas.global.ApplicationConstant.ERROR_PREFIX; public enum BasicInputExceptionMessage { - EMPTY(ERROR_PREFIX + "λΉ„μ–΄μžˆλŠ” μž…λ ₯κ°’μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); + EMPTY(ERROR_PREFIX + "λΉ„μ–΄μžˆλŠ” μž…λ ₯κ°’μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + TOO_LONG(ERROR_PREFIX + "μ œν•œ κΈ€μž μž…λ ₯을 μ΄ˆκ³Όν–ˆμŠ΅λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”.(곡백 μ œμ™Έ μ΅œλŒ€ %dκΈ€μž μž…λ ₯ κ°€λŠ₯)"); private final String mesage; diff --git a/src/main/java/christmas/view/input/validator/BasicValidator.java b/src/main/java/christmas/view/input/validator/BasicValidator.java index 03e324f..a98326a 100644 --- a/src/main/java/christmas/view/input/validator/BasicValidator.java +++ b/src/main/java/christmas/view/input/validator/BasicValidator.java @@ -4,9 +4,21 @@ import christmas.view.input.exception.message.BasicInputExceptionMessage; public abstract class BasicValidator { + + protected void validate(final String userInput, final int maxLength) { + validateNotEmpty(userInput); + validateLengthUnderMaxLength(userInput, maxLength); + } + protected void validateNotEmpty(final String userInput) { if (userInput.isEmpty()) { - throw BasicInputException.of(BasicInputExceptionMessage.EMPTY); + throw BasicInputException.of(BasicInputExceptionMessage.EMPTY.getMesage()); + } + } + + protected void validateLengthUnderMaxLength(final String userInput, final int maxLength) { + if (userInput.length() > maxLength) { + throw BasicInputException.of(String.format(BasicInputExceptionMessage.TOO_LONG.getMesage(), maxLength)); } } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/DayInputValidator.java b/src/main/java/christmas/view/input/validator/DayInputValidator.java index a195ba7..acc9e92 100644 --- a/src/main/java/christmas/view/input/validator/DayInputValidator.java +++ b/src/main/java/christmas/view/input/validator/DayInputValidator.java @@ -1,7 +1,9 @@ package christmas.view.input.validator; +import static christmas.view.input.constant.InputConstant.DAY_MAX_INPUT_LENGTH; + public class DayInputValidator extends BasicValidator { public void validate(String day) { - validateNotEmpty(day); + super.validate(day, DAY_MAX_INPUT_LENGTH); } } \ No newline at end of file From 221e83b95d72e96403294c9407930d13c503abe7 Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 14:18:58 +0900 Subject: [PATCH 10/89] feat: add feature to check user input about reservation day is convertible to numeric type --- docs/README.md | 2 +- .../controller/PromotionController.java | 3 ++- .../view/input/exception/DayInputException.java | 11 +++++++++++ .../message/BasicInputExceptionMessage.java | 10 +++++----- .../message/DayInputExceptionMessage.java | 17 +++++++++++++++++ .../view/input/validator/BasicValidator.java | 4 ++-- .../view/input/validator/DayInputValidator.java | 17 +++++++++++++++-- .../input/validator/NumericTypeCheckable.java | 5 +++++ 8 files changed, 58 insertions(+), 11 deletions(-) create mode 100644 src/main/java/christmas/view/input/exception/DayInputException.java create mode 100644 src/main/java/christmas/view/input/exception/message/DayInputExceptionMessage.java create mode 100644 src/main/java/christmas/view/input/validator/NumericTypeCheckable.java diff --git a/docs/README.md b/docs/README.md index cb38570..f29246b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -13,7 +13,7 @@ - [x] 곡백이 μ•ž 뒀에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•œλ‹€. - [x] 곡백이 κΈ€μž 쀑간에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•΄ 곡백 사이λ₯Ό 이어쀀닀. - [x] 곡백 제거 ν›„ κΈ€μž 길이가 2 μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. - - [] μ˜ˆμ•½ λ‚ μ§œκ°€ 숫자 ν˜•μ‹μΈμ§€ ν™•μΈν•œλ‹€. + - [x] μ˜ˆμ•½ λ‚ μ§œκ°€ 숫자 ν˜•μ‹μΈμ§€ ν™•μΈν•œλ‹€. - [] μ˜ˆμ•½ λ‚ μ§œκ°€ μ–‘μˆ˜μΈμ§€ ν™•μΈν•œλ‹€. - [x] λ‚ μ§œκ°€ 1 이상 31 μ΄ν•˜μ˜ μˆ«μžμΈμ§€ ν™•μΈν•œλ‹€. - [x] 1 이상 31 μ΄ν•˜μ˜ μˆ«μžκ°€ μ•„λ‹Œ 경우, "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”." 의 λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œλ‹€. diff --git a/src/main/java/christmas/controller/PromotionController.java b/src/main/java/christmas/controller/PromotionController.java index fd9792a..9ac7f55 100644 --- a/src/main/java/christmas/controller/PromotionController.java +++ b/src/main/java/christmas/controller/PromotionController.java @@ -5,6 +5,7 @@ import christmas.service.DayService; import christmas.view.input.InputView; import christmas.view.input.exception.BasicInputException; +import christmas.view.input.exception.DayInputException; import christmas.view.output.OutputView; public class PromotionController { @@ -28,7 +29,7 @@ private DecemberDay insertDay() { try { int reservationDay = askToInsertReservationDay(); return dayService.createDay(reservationDay); - } catch (BasicInputException | InvalidDayException e) { + } catch (BasicInputException | DayInputException | InvalidDayException e) { outputView.printErrorMessage(e.getMessage()); return insertDay(); } diff --git a/src/main/java/christmas/view/input/exception/DayInputException.java b/src/main/java/christmas/view/input/exception/DayInputException.java new file mode 100644 index 0000000..6820be7 --- /dev/null +++ b/src/main/java/christmas/view/input/exception/DayInputException.java @@ -0,0 +1,11 @@ +package christmas.view.input.exception; + +public class DayInputException extends IllegalArgumentException { + private DayInputException(final String dayInputExceptionMessage) { + super(dayInputExceptionMessage); + } + + public static DayInputException of(final String dayInputExceptionMessage) { + return new DayInputException(dayInputExceptionMessage); + } +} \ No newline at end of file diff --git a/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java b/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java index 04d96ec..27d4eac 100644 --- a/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java +++ b/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java @@ -6,13 +6,13 @@ public enum BasicInputExceptionMessage { EMPTY(ERROR_PREFIX + "λΉ„μ–΄μžˆλŠ” μž…λ ₯κ°’μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), TOO_LONG(ERROR_PREFIX + "μ œν•œ κΈ€μž μž…λ ₯을 μ΄ˆκ³Όν–ˆμŠ΅λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”.(곡백 μ œμ™Έ μ΅œλŒ€ %dκΈ€μž μž…λ ₯ κ°€λŠ₯)"); - private final String mesage; + private final String message; - BasicInputExceptionMessage(final String mesage) { - this.mesage = mesage; + BasicInputExceptionMessage(final String message) { + this.message = message; } - public String getMesage() { - return mesage; + public String getMessage() { + return message; } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/exception/message/DayInputExceptionMessage.java b/src/main/java/christmas/view/input/exception/message/DayInputExceptionMessage.java new file mode 100644 index 0000000..5364506 --- /dev/null +++ b/src/main/java/christmas/view/input/exception/message/DayInputExceptionMessage.java @@ -0,0 +1,17 @@ +package christmas.view.input.exception.message; + +import static christmas.global.ApplicationConstant.ERROR_PREFIX; + +public enum DayInputExceptionMessage { + NOT_NUMERIC_TYPE(ERROR_PREFIX + "숫자 ν˜•μ‹ μž…λ ₯이 μ•„λ‹™λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); + + private final String message; + + DayInputExceptionMessage(final String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/BasicValidator.java b/src/main/java/christmas/view/input/validator/BasicValidator.java index a98326a..cf9a5e3 100644 --- a/src/main/java/christmas/view/input/validator/BasicValidator.java +++ b/src/main/java/christmas/view/input/validator/BasicValidator.java @@ -12,13 +12,13 @@ protected void validate(final String userInput, final int maxLength) { protected void validateNotEmpty(final String userInput) { if (userInput.isEmpty()) { - throw BasicInputException.of(BasicInputExceptionMessage.EMPTY.getMesage()); + throw BasicInputException.of(BasicInputExceptionMessage.EMPTY.getMessage()); } } protected void validateLengthUnderMaxLength(final String userInput, final int maxLength) { if (userInput.length() > maxLength) { - throw BasicInputException.of(String.format(BasicInputExceptionMessage.TOO_LONG.getMesage(), maxLength)); + throw BasicInputException.of(String.format(BasicInputExceptionMessage.TOO_LONG.getMessage(), maxLength)); } } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/DayInputValidator.java b/src/main/java/christmas/view/input/validator/DayInputValidator.java index acc9e92..4e2d1b2 100644 --- a/src/main/java/christmas/view/input/validator/DayInputValidator.java +++ b/src/main/java/christmas/view/input/validator/DayInputValidator.java @@ -1,9 +1,22 @@ package christmas.view.input.validator; import static christmas.view.input.constant.InputConstant.DAY_MAX_INPUT_LENGTH; +import static christmas.view.input.exception.message.DayInputExceptionMessage.NOT_NUMERIC_TYPE; -public class DayInputValidator extends BasicValidator { - public void validate(String day) { +import christmas.view.input.exception.DayInputException; + +public class DayInputValidator extends BasicValidator implements NumericTypeCheckable { + public void validate(final String day) { super.validate(day, DAY_MAX_INPUT_LENGTH); + validateNumeric(day); + } + + @Override + public void validateNumeric(final String userInput) { + try { + Integer.parseInt(userInput); + } catch (NumberFormatException e) { + throw DayInputException.of(NOT_NUMERIC_TYPE.getMessage()); + } } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/NumericTypeCheckable.java b/src/main/java/christmas/view/input/validator/NumericTypeCheckable.java new file mode 100644 index 0000000..8ecc476 --- /dev/null +++ b/src/main/java/christmas/view/input/validator/NumericTypeCheckable.java @@ -0,0 +1,5 @@ +package christmas.view.input.validator; + +public interface NumericTypeCheckable { + void validateNumeric(final String userInput); +} \ No newline at end of file From 0e47ef085df42f5fdc04209dae17ce86446e48cb Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 14:30:08 +0900 Subject: [PATCH 11/89] feat: add feature to check user input about reservation day is positive integer --- docs/README.md | 2 +- .../view/input/constant/InputConstant.java | 1 + .../message/DayInputExceptionMessage.java | 3 ++- .../input/validator/DayInputValidator.java | 19 +++++++++++++++++-- .../input/validator/NumericTypeCheckable.java | 5 ----- .../validator/PositiveIntegerCheckable.java | 7 +++++++ 6 files changed, 28 insertions(+), 9 deletions(-) delete mode 100644 src/main/java/christmas/view/input/validator/NumericTypeCheckable.java create mode 100644 src/main/java/christmas/view/input/validator/PositiveIntegerCheckable.java diff --git a/docs/README.md b/docs/README.md index f29246b..9d308a9 100644 --- a/docs/README.md +++ b/docs/README.md @@ -14,7 +14,7 @@ - [x] 곡백이 κΈ€μž 쀑간에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•΄ 곡백 사이λ₯Ό 이어쀀닀. - [x] 곡백 제거 ν›„ κΈ€μž 길이가 2 μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. - [x] μ˜ˆμ•½ λ‚ μ§œκ°€ 숫자 ν˜•μ‹μΈμ§€ ν™•μΈν•œλ‹€. - - [] μ˜ˆμ•½ λ‚ μ§œκ°€ μ–‘μˆ˜μΈμ§€ ν™•μΈν•œλ‹€. + - [x] μ˜ˆμ•½ λ‚ μ§œκ°€ μ–‘μˆ˜μΈμ§€ ν™•μΈν•œλ‹€. - [x] λ‚ μ§œκ°€ 1 이상 31 μ΄ν•˜μ˜ μˆ«μžμΈμ§€ ν™•μΈν•œλ‹€. - [x] 1 이상 31 μ΄ν•˜μ˜ μˆ«μžκ°€ μ•„λ‹Œ 경우, "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”." 의 λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œλ‹€. - [] μœ„ 경우λ₯Ό λ§Œμ‘±ν•˜μ§€ λͺ»ν•˜λŠ” 경우 `DayInputException`을 λ°œμƒμ‹œν‚€κ³ ,
diff --git a/src/main/java/christmas/view/input/constant/InputConstant.java b/src/main/java/christmas/view/input/constant/InputConstant.java index 606266c..3f3738d 100644 --- a/src/main/java/christmas/view/input/constant/InputConstant.java +++ b/src/main/java/christmas/view/input/constant/InputConstant.java @@ -4,4 +4,5 @@ public class InputConstant { public static String BLANK = " "; public static String VOID = ""; public static int DAY_MAX_INPUT_LENGTH = 2; + public static int POSITIVE_BOUNDARY_VALUE = 0; } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/exception/message/DayInputExceptionMessage.java b/src/main/java/christmas/view/input/exception/message/DayInputExceptionMessage.java index 5364506..c296513 100644 --- a/src/main/java/christmas/view/input/exception/message/DayInputExceptionMessage.java +++ b/src/main/java/christmas/view/input/exception/message/DayInputExceptionMessage.java @@ -3,7 +3,8 @@ import static christmas.global.ApplicationConstant.ERROR_PREFIX; public enum DayInputExceptionMessage { - NOT_NUMERIC_TYPE(ERROR_PREFIX + "숫자 ν˜•μ‹ μž…λ ₯이 μ•„λ‹™λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); + NOT_NUMERIC_TYPE(ERROR_PREFIX + "λ‚ μ§œ μž…λ ₯은 숫자 ν˜•μ‹μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + NOT_POSITIVE(ERROR_PREFIX + "λ‚ μ§œ μž…λ ₯은 μ–‘μˆ˜μ—¬μ•Ό ν•©λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); private final String message; diff --git a/src/main/java/christmas/view/input/validator/DayInputValidator.java b/src/main/java/christmas/view/input/validator/DayInputValidator.java index 4e2d1b2..9e36dca 100644 --- a/src/main/java/christmas/view/input/validator/DayInputValidator.java +++ b/src/main/java/christmas/view/input/validator/DayInputValidator.java @@ -1,22 +1,37 @@ package christmas.view.input.validator; import static christmas.view.input.constant.InputConstant.DAY_MAX_INPUT_LENGTH; +import static christmas.view.input.constant.InputConstant.POSITIVE_BOUNDARY_VALUE; import static christmas.view.input.exception.message.DayInputExceptionMessage.NOT_NUMERIC_TYPE; +import static christmas.view.input.exception.message.DayInputExceptionMessage.NOT_POSITIVE; import christmas.view.input.exception.DayInputException; -public class DayInputValidator extends BasicValidator implements NumericTypeCheckable { +public class DayInputValidator extends BasicValidator implements PositiveIntegerCheckable { public void validate(final String day) { super.validate(day, DAY_MAX_INPUT_LENGTH); validateNumeric(day); + validatePositive(day); } @Override public void validateNumeric(final String userInput) { try { - Integer.parseInt(userInput); + parseToInt(userInput); } catch (NumberFormatException e) { throw DayInputException.of(NOT_NUMERIC_TYPE.getMessage()); } } + + @Override + public void validatePositive(final String userInput) { + int day = parseToInt(userInput); + if (day < POSITIVE_BOUNDARY_VALUE) { + throw DayInputException.of(NOT_POSITIVE.getMessage()); + } + } + + private int parseToInt(final String userInput) { + return Integer.parseInt(userInput); + } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/NumericTypeCheckable.java b/src/main/java/christmas/view/input/validator/NumericTypeCheckable.java deleted file mode 100644 index 8ecc476..0000000 --- a/src/main/java/christmas/view/input/validator/NumericTypeCheckable.java +++ /dev/null @@ -1,5 +0,0 @@ -package christmas.view.input.validator; - -public interface NumericTypeCheckable { - void validateNumeric(final String userInput); -} \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/PositiveIntegerCheckable.java b/src/main/java/christmas/view/input/validator/PositiveIntegerCheckable.java new file mode 100644 index 0000000..e203f43 --- /dev/null +++ b/src/main/java/christmas/view/input/validator/PositiveIntegerCheckable.java @@ -0,0 +1,7 @@ +package christmas.view.input.validator; + +public interface PositiveIntegerCheckable { + void validateNumeric(final String userInput); + + void validatePositive(final String userInput); +} \ No newline at end of file From 5fbe30730a4103db232b058b4b72b95bad214628 Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 14:34:45 +0900 Subject: [PATCH 12/89] docs: rearrange feature list --- docs/README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/README.md b/docs/README.md index 9d308a9..b3fa6ce 100644 --- a/docs/README.md +++ b/docs/README.md @@ -15,9 +15,7 @@ - [x] 곡백 제거 ν›„ κΈ€μž 길이가 2 μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. - [x] μ˜ˆμ•½ λ‚ μ§œκ°€ 숫자 ν˜•μ‹μΈμ§€ ν™•μΈν•œλ‹€. - [x] μ˜ˆμ•½ λ‚ μ§œκ°€ μ–‘μˆ˜μΈμ§€ ν™•μΈν•œλ‹€. - - [x] λ‚ μ§œκ°€ 1 이상 31 μ΄ν•˜μ˜ μˆ«μžμΈμ§€ ν™•μΈν•œλ‹€. - - [x] 1 이상 31 μ΄ν•˜μ˜ μˆ«μžκ°€ μ•„λ‹Œ 경우, "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”." 의 λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œλ‹€. -- [] μœ„ 경우λ₯Ό λ§Œμ‘±ν•˜μ§€ λͺ»ν•˜λŠ” 경우 `DayInputException`을 λ°œμƒμ‹œν‚€κ³ ,
+- [x] μœ„ 경우λ₯Ό λ§Œμ‘±ν•˜μ§€ λͺ»ν•˜λŠ” 경우 `DayInputException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ˜ˆμ•½ λ‚ μ§œ` μž…λ ₯을 λ°›λŠ”λ‹€. > ### πŸ”– μ£Όλ¬Έ λ‚΄μ—­ μž…λ ₯ 및 μž…λ ₯κ°’ 검증 @@ -67,7 +65,10 @@ > ### πŸ—“ λ‚ μ§œμ— λŒ€ν•œ 적용 κ°€λŠ₯ν•œ 이벀트 νŒλ‹¨ 도메인 둜직 -- [] μ‚¬μš©μžμ—κ²Œ μž…λ ₯받은 λ‚ μ§œμ— λŒ€ν•΄ +- μ‚¬μš©μžμ—κ²Œ μž…λ ₯받은 λ‚ μ§œμ— λŒ€ν•΄ + - [x] λ‚ μ§œκ°€ 1 이상 31 μ΄ν•˜μ˜ μˆ«μžμΈμ§€ ν™•μΈν•œλ‹€. + - [x] 1 이상 31 μ΄ν•˜μ˜ μˆ«μžκ°€ μ•„λ‹Œ 경우, `InvalidDayException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”." 의 λ©”μ‹œμ§€λ₯Ό + 좜λ ₯ν•œλ‹€. - [] ν•΄λ‹Ή λ‚ μ§œκ°€ 크리슀마슀 D-Day ν”„λ‘œλͺ¨μ…˜ λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. - [] 평일 할인 λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. - [] 주말 할인 λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. @@ -75,7 +76,7 @@ > ### πŸ”– μ£Όλ¬Έ 내역에 λ”°λ₯Έ 이벀트 적용 μ—¬λΆ€ νŒλ‹¨ 도메인 둜직 -- [] μ‚¬μš©μžμ—κ²Œ μž…λ ₯받은 μ£Όλ¬Έ λ‚΄μ—­( 메뉴 이름과 μˆ˜λŸ‰ )에 λŒ€ν•΄ +- μ‚¬μš©μžμ—κ²Œ μž…λ ₯받은 μ£Όλ¬Έ λ‚΄μ—­( 메뉴 이름과 μˆ˜λŸ‰ )에 λŒ€ν•΄ - [] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ κΈˆμ•‘μ΄ `10000원` μ΄ν•˜μ΄λ©΄, 할인 이벀트 적용 λŒ€μƒμ—μ„œ μ œμ™Έμ‹œν‚¨λ‹€. - [] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ κΈˆμ•‘μ΄ `12λ§Œμ› 이상`일 μ‹œ, `μƒ΄νŽ˜μΈ 1개` λ₯Ό μ¦μ •ν•œλ‹€. - [] μ£Όλ¬Έ 내역을 μ΄μš©ν•΄μ„œ `할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘`을 계산할 수 μžˆλ‹€. From a9aca2e276d6151305ffccc87408edaae044d8fe Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 17:34:42 +0900 Subject: [PATCH 13/89] feat: add feature to print statement for user to insert orders --- docs/README.md | 2 +- .../christmas/controller/PromotionController.java | 3 ++- .../java/christmas/view/output/OutputView.java | 14 ++++++++++---- .../view/output/constant/OutputMessage.java | 5 +++-- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/docs/README.md b/docs/README.md index b3fa6ce..6a38cbf 100644 --- a/docs/README.md +++ b/docs/README.md @@ -20,7 +20,7 @@ > ### πŸ”– μ£Όλ¬Έ λ‚΄μ—­ μž…λ ₯ 및 μž…λ ₯κ°’ 검증 -- [] `μ£Όλ¬Έ λ‚΄μ—­` μž…λ ₯ μš”μ²­ 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. +- [x] `μ£Όλ¬Έ λ‚΄μ—­` μž…λ ₯ μš”μ²­ 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. - [] μ‚¬μš©μžμ—κ²Œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯λ°›λŠ”λ‹€. - [] `μ£Όλ¬Έ`은 `메뉴 이름`κ³Ό `메뉴 개수`둜 이루어진닀. - [] `μ£Όλ¬Έ`은 μ‰Όν‘œ(,)λ₯Ό κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„ν•œλ‹€. diff --git a/src/main/java/christmas/controller/PromotionController.java b/src/main/java/christmas/controller/PromotionController.java index 9ac7f55..e70a5f1 100644 --- a/src/main/java/christmas/controller/PromotionController.java +++ b/src/main/java/christmas/controller/PromotionController.java @@ -22,7 +22,8 @@ public PromotionController() { public void run() { outputView.printGreetingMessage(); DecemberDay day = insertDay(); - System.out.println(day); + + outputView.askToInsertOrders(); } private DecemberDay insertDay() { diff --git a/src/main/java/christmas/view/output/OutputView.java b/src/main/java/christmas/view/output/OutputView.java index d70598e..4a78b65 100644 --- a/src/main/java/christmas/view/output/OutputView.java +++ b/src/main/java/christmas/view/output/OutputView.java @@ -2,16 +2,22 @@ import static christmas.view.output.constant.OutputConstant.NEW_LINE; import static christmas.view.output.constant.OutputMessage.GREETING; +import static christmas.view.output.constant.OutputMessage.INSERT_ORDERS; import static christmas.view.output.constant.OutputMessage.INSERT_RESERVATION_DAY; public class OutputView { public void printGreetingMessage() { - printMessage(GREETING.getMessage()); + print(GREETING.getMessage()); printLine(); } public void askToInsertReservationDay() { - printMessage(INSERT_RESERVATION_DAY.getMessage()); + print(INSERT_RESERVATION_DAY.getMessage()); + printLine(); + } + + public void askToInsertOrders() { + print(INSERT_ORDERS.getMessage()); printLine(); } @@ -21,11 +27,11 @@ public void printLine() { } public void printErrorMessage(final String message) { - printMessage(message); + print(message); printLine(); } - private void printMessage(final T message) { + private void print(final T message) { System.out.print(message); } } \ No newline at end of file diff --git a/src/main/java/christmas/view/output/constant/OutputMessage.java b/src/main/java/christmas/view/output/constant/OutputMessage.java index 44c3611..3a2c744 100644 --- a/src/main/java/christmas/view/output/constant/OutputMessage.java +++ b/src/main/java/christmas/view/output/constant/OutputMessage.java @@ -3,8 +3,9 @@ import static christmas.global.ApplicationConstant.CURRENT_PROMOTION_MONTH; public enum OutputMessage { - GREETING("μ•ˆλ…•ν•˜μ„Έμš”! μš°ν…Œμ½” 식당 12μ›” 이벀트 ν”Œλž˜λ„ˆμž…λ‹ˆλ‹€."), - INSERT_RESERVATION_DAY(CURRENT_PROMOTION_MONTH + "μ›” 쀑 식당 λ°©λ¬Έ λ‚ μ§œλŠ” μ–Έμ œμΈκ°€μš”? (숫자만 μž…λ ₯ν•΄ μ£Όμ„Έμš”!)"); + GREETING("μ•ˆλ…•ν•˜μ„Έμš”! μš°ν…Œμ½” 식당 " + CURRENT_PROMOTION_MONTH + "μ›” 이벀트 ν”Œλž˜λ„ˆμž…λ‹ˆλ‹€."), + INSERT_RESERVATION_DAY(CURRENT_PROMOTION_MONTH + "μ›” 쀑 식당 λ°©λ¬Έ λ‚ μ§œλŠ” μ–Έμ œμΈκ°€μš”? (숫자만 μž…λ ₯ν•΄ μ£Όμ„Έμš”!)"), + INSERT_ORDERS("μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1)"); private final String message; From d864f3cbf44db0c5e9920dd56039523abd08ccf4 Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 18:12:22 +0900 Subject: [PATCH 14/89] refactor: indicate method handling exception throws specific type of exception --- src/main/java/christmas/controller/PromotionController.java | 2 +- src/main/java/christmas/service/DayService.java | 3 ++- src/main/java/christmas/view/input/InputView.java | 4 +++- src/main/java/christmas/view/input/parser/InputParser.java | 4 +++- .../christmas/view/input/validator/DayInputValidator.java | 5 +++-- 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/christmas/controller/PromotionController.java b/src/main/java/christmas/controller/PromotionController.java index e70a5f1..428a5db 100644 --- a/src/main/java/christmas/controller/PromotionController.java +++ b/src/main/java/christmas/controller/PromotionController.java @@ -36,7 +36,7 @@ private DecemberDay insertDay() { } } - private int askToInsertReservationDay() { + private int askToInsertReservationDay() throws BasicInputException, DayInputException { outputView.askToInsertReservationDay(); return inputView.getDay(); } diff --git a/src/main/java/christmas/service/DayService.java b/src/main/java/christmas/service/DayService.java index b65fcf4..0789e9f 100644 --- a/src/main/java/christmas/service/DayService.java +++ b/src/main/java/christmas/service/DayService.java @@ -1,9 +1,10 @@ package christmas.service; import christmas.domain.DecemberDay; +import christmas.domain.exception.InvalidDayException; public class DayService { - public DecemberDay createDay(final int day) { + public DecemberDay createDay(final int day) throws InvalidDayException { return DecemberDay.from(day); } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/InputView.java b/src/main/java/christmas/view/input/InputView.java index 3846969..dea83a9 100644 --- a/src/main/java/christmas/view/input/InputView.java +++ b/src/main/java/christmas/view/input/InputView.java @@ -1,6 +1,8 @@ package christmas.view.input; import camp.nextstep.edu.missionutils.Console; +import christmas.view.input.exception.BasicInputException; +import christmas.view.input.exception.DayInputException; import christmas.view.input.parser.InputParser; import java.util.Map; @@ -11,7 +13,7 @@ public InputView() { inputParser = new InputParser(); } - public int getDay() { + public int getDay() throws BasicInputException, DayInputException { return inputParser.parseDay(readLine()); } diff --git a/src/main/java/christmas/view/input/parser/InputParser.java b/src/main/java/christmas/view/input/parser/InputParser.java index c20e591..4a555c3 100644 --- a/src/main/java/christmas/view/input/parser/InputParser.java +++ b/src/main/java/christmas/view/input/parser/InputParser.java @@ -3,6 +3,8 @@ import static christmas.view.input.constant.InputConstant.BLANK; import static christmas.view.input.constant.InputConstant.VOID; +import christmas.view.input.exception.BasicInputException; +import christmas.view.input.exception.DayInputException; import christmas.view.input.validator.DayInputValidator; public class InputParser { @@ -12,7 +14,7 @@ public InputParser() { this.dayInputValidator = new DayInputValidator(); } - public int parseDay(String userInput) { + public int parseDay(String userInput) throws BasicInputException, DayInputException { userInput = removeBlank(userInput); dayInputValidator.validate(userInput); return parseToInt(userInput); diff --git a/src/main/java/christmas/view/input/validator/DayInputValidator.java b/src/main/java/christmas/view/input/validator/DayInputValidator.java index 9e36dca..51baac6 100644 --- a/src/main/java/christmas/view/input/validator/DayInputValidator.java +++ b/src/main/java/christmas/view/input/validator/DayInputValidator.java @@ -5,10 +5,11 @@ import static christmas.view.input.exception.message.DayInputExceptionMessage.NOT_NUMERIC_TYPE; import static christmas.view.input.exception.message.DayInputExceptionMessage.NOT_POSITIVE; +import christmas.view.input.exception.BasicInputException; import christmas.view.input.exception.DayInputException; public class DayInputValidator extends BasicValidator implements PositiveIntegerCheckable { - public void validate(final String day) { + public void validate(final String day) throws BasicInputException, DayInputException { super.validate(day, DAY_MAX_INPUT_LENGTH); validateNumeric(day); validatePositive(day); @@ -30,7 +31,7 @@ public void validatePositive(final String userInput) { throw DayInputException.of(NOT_POSITIVE.getMessage()); } } - + private int parseToInt(final String userInput) { return Integer.parseInt(userInput); } From 00f755847d0c081d56636395619405b79508bf52 Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 19:20:32 +0900 Subject: [PATCH 15/89] feat: add feature for user to insert orders --- docs/README.md | 8 +++---- .../controller/PromotionController.java | 23 +++++++++++++++++- .../java/christmas/service/OrdersService.java | 10 ++++++++ .../java/christmas/view/input/InputView.java | 2 +- .../view/input/constant/InputConstant.java | 4 ++++ .../view/input/parser/InputParser.java | 24 +++++++++++++++++++ .../input/validator/OrdersInputValidator.java | 6 +++++ 7 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 src/main/java/christmas/service/OrdersService.java create mode 100644 src/main/java/christmas/view/input/validator/OrdersInputValidator.java diff --git a/docs/README.md b/docs/README.md index 6a38cbf..3eafa45 100644 --- a/docs/README.md +++ b/docs/README.md @@ -21,10 +21,10 @@ > ### πŸ”– μ£Όλ¬Έ λ‚΄μ—­ μž…λ ₯ 및 μž…λ ₯κ°’ 검증 - [x] `μ£Όλ¬Έ λ‚΄μ—­` μž…λ ₯ μš”μ²­ 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. -- [] μ‚¬μš©μžμ—κ²Œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯λ°›λŠ”λ‹€. - - [] `μ£Όλ¬Έ`은 `메뉴 이름`κ³Ό `메뉴 개수`둜 이루어진닀. - - [] `μ£Όλ¬Έ`은 μ‰Όν‘œ(,)λ₯Ό κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„ν•œλ‹€. - - [] `메뉴 이름`와 `메뉴 개수`λŠ” λŒ€μ‹œ(-)λ₯Ό κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„ν•œλ‹€. +- [x] μ‚¬μš©μžμ—κ²Œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯λ°›λŠ”λ‹€. + - [x] `μ£Όλ¬Έ`은 `메뉴 이름`κ³Ό `메뉴 개수`둜 이루어진닀. + - [x] `μ£Όλ¬Έ`은 μ‰Όν‘œ(,)λ₯Ό κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„ν•œλ‹€. + - [x] `메뉴 이름`와 `메뉴 개수`λŠ” λŒ€μ‹œ(-)λ₯Ό κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„ν•œλ‹€. > #### i) πŸ™‹`μ£Όλ¬Έ`에 λŒ€ν•œ μž…λ ₯κ°’ 검증 diff --git a/src/main/java/christmas/controller/PromotionController.java b/src/main/java/christmas/controller/PromotionController.java index 428a5db..3e8636d 100644 --- a/src/main/java/christmas/controller/PromotionController.java +++ b/src/main/java/christmas/controller/PromotionController.java @@ -1,27 +1,33 @@ package christmas.controller; import christmas.domain.DecemberDay; +import christmas.domain.Orders; import christmas.domain.exception.InvalidDayException; import christmas.service.DayService; +import christmas.service.OrdersService; import christmas.view.input.InputView; import christmas.view.input.exception.BasicInputException; import christmas.view.input.exception.DayInputException; import christmas.view.output.OutputView; +import java.util.Map; public class PromotionController { private final InputView inputView; private final OutputView outputView; private final DayService dayService; + private final OrdersService ordersService; public PromotionController() { this.inputView = new InputView(); this.outputView = new OutputView(); this.dayService = new DayService(); + this.ordersService = new OrdersService(); } public void run() { outputView.printGreetingMessage(); DecemberDay day = insertDay(); + Orders orders = insertOrders(); outputView.askToInsertOrders(); } @@ -40,4 +46,19 @@ private int askToInsertReservationDay() throws BasicInputException, DayInputExce outputView.askToInsertReservationDay(); return inputView.getDay(); } -} + + private Orders insertOrders() { + try { + Map orders = askToInsertOrders(); + return ordersService.createOrders(orders); + } catch (BasicInputException e) { + outputView.printErrorMessage(e.getMessage()); + return insertOrders(); + } + } + + private Map askToInsertOrders() { + outputView.askToInsertOrders(); + return inputView.getOrders(); + } +} \ No newline at end of file diff --git a/src/main/java/christmas/service/OrdersService.java b/src/main/java/christmas/service/OrdersService.java new file mode 100644 index 0000000..d8b20b9 --- /dev/null +++ b/src/main/java/christmas/service/OrdersService.java @@ -0,0 +1,10 @@ +package christmas.service; + +import christmas.domain.Orders; +import java.util.Map; + +public class OrdersService { + public Orders createOrders(Map orders) { + return null; + } +} \ No newline at end of file diff --git a/src/main/java/christmas/view/input/InputView.java b/src/main/java/christmas/view/input/InputView.java index dea83a9..1943924 100644 --- a/src/main/java/christmas/view/input/InputView.java +++ b/src/main/java/christmas/view/input/InputView.java @@ -18,7 +18,7 @@ public int getDay() throws BasicInputException, DayInputException { } public Map getOrders() { - return null; + return inputParser.parseOrders(readLine()); } private String readLine() { diff --git a/src/main/java/christmas/view/input/constant/InputConstant.java b/src/main/java/christmas/view/input/constant/InputConstant.java index 3f3738d..16fbf7e 100644 --- a/src/main/java/christmas/view/input/constant/InputConstant.java +++ b/src/main/java/christmas/view/input/constant/InputConstant.java @@ -5,4 +5,8 @@ public class InputConstant { public static String VOID = ""; public static int DAY_MAX_INPUT_LENGTH = 2; public static int POSITIVE_BOUNDARY_VALUE = 0; + public static String ORDERS_DELIMITER = ","; + public static String ORDER_DELIMITER = "-"; + public static int ORDER_NAME_INDEX = 0; + public static int ORDER_COUNT_INDEX = 1; } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/parser/InputParser.java b/src/main/java/christmas/view/input/parser/InputParser.java index 4a555c3..8c9163d 100644 --- a/src/main/java/christmas/view/input/parser/InputParser.java +++ b/src/main/java/christmas/view/input/parser/InputParser.java @@ -1,17 +1,27 @@ package christmas.view.input.parser; import static christmas.view.input.constant.InputConstant.BLANK; +import static christmas.view.input.constant.InputConstant.ORDERS_DELIMITER; +import static christmas.view.input.constant.InputConstant.ORDER_COUNT_INDEX; +import static christmas.view.input.constant.InputConstant.ORDER_DELIMITER; +import static christmas.view.input.constant.InputConstant.ORDER_NAME_INDEX; import static christmas.view.input.constant.InputConstant.VOID; import christmas.view.input.exception.BasicInputException; import christmas.view.input.exception.DayInputException; import christmas.view.input.validator.DayInputValidator; +import christmas.view.input.validator.OrdersInputValidator; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; public class InputParser { private final DayInputValidator dayInputValidator; + private final OrdersInputValidator ordersInputValidator; public InputParser() { this.dayInputValidator = new DayInputValidator(); + this.ordersInputValidator = new OrdersInputValidator(); } public int parseDay(String userInput) throws BasicInputException, DayInputException { @@ -20,6 +30,11 @@ public int parseDay(String userInput) throws BasicInputException, DayInputExcept return parseToInt(userInput); } + public Map parseOrders(String userInput) { + ordersInputValidator.validate(userInput); + return parseToOrderMap(userInput); + } + private int parseToInt(String userInput) { return Integer.parseInt(userInput); } @@ -30,4 +45,13 @@ private String removeBlank(String userInput) { } return userInput; } + + private Map parseToOrderMap(String userInput) { + return Arrays.stream(userInput.split(ORDERS_DELIMITER)) + .map(orders -> orders.split(ORDER_DELIMITER)) + .collect(Collectors.toMap( + order -> order[ORDER_NAME_INDEX], + order -> parseToInt(order[ORDER_COUNT_INDEX]) + )); + } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/OrdersInputValidator.java b/src/main/java/christmas/view/input/validator/OrdersInputValidator.java new file mode 100644 index 0000000..15be94d --- /dev/null +++ b/src/main/java/christmas/view/input/validator/OrdersInputValidator.java @@ -0,0 +1,6 @@ +package christmas.view.input.validator; + +public class OrdersInputValidator extends BasicValidator { + public void validate(String orders) { + } +} \ No newline at end of file From c904585749e6cc264c52c5f26c5bd55907f1119b Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 19:34:18 +0900 Subject: [PATCH 16/89] docs: add constraint to user input about orders --- docs/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/README.md b/docs/README.md index 3eafa45..b61b7b3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -22,6 +22,9 @@ - [x] `μ£Όλ¬Έ λ‚΄μ—­` μž…λ ₯ μš”μ²­ 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. - [x] μ‚¬μš©μžμ—κ²Œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯λ°›λŠ”λ‹€. + - [] `μ£Όλ¬Έ λ‚΄μ—­`이 1000κΈ€μž μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. + - [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `OrdersInputException`을 λ°œμƒμ‹œν‚€κ³ ,
+ "[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. - [x] `μ£Όλ¬Έ`은 `메뉴 이름`κ³Ό `메뉴 개수`둜 이루어진닀. - [x] `μ£Όλ¬Έ`은 μ‰Όν‘œ(,)λ₯Ό κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„ν•œλ‹€. - [x] `메뉴 이름`와 `메뉴 개수`λŠ” λŒ€μ‹œ(-)λ₯Ό κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„ν•œλ‹€. From 4d8912457216bbec7fb0904e99fc1617a8961ab5 Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 19:38:10 +0900 Subject: [PATCH 17/89] feat: add feature to check user input about orders is in appropriate range --- docs/README.md | 5 +++-- .../controller/PromotionController.java | 3 ++- .../view/input/constant/InputConstant.java | 1 + .../input/exception/OrdersInputException.java | 11 +++++++++++ .../exception/message/OrderInputException.java | 4 ++++ .../message/OrdersInputExceptionMessage.java | 17 +++++++++++++++++ .../input/validator/OrdersInputValidator.java | 7 ++++++- 7 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 src/main/java/christmas/view/input/exception/OrdersInputException.java create mode 100644 src/main/java/christmas/view/input/exception/message/OrderInputException.java create mode 100644 src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java diff --git a/docs/README.md b/docs/README.md index b61b7b3..f81039e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -22,8 +22,9 @@ - [x] `μ£Όλ¬Έ λ‚΄μ—­` μž…λ ₯ μš”μ²­ 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. - [x] μ‚¬μš©μžμ—κ²Œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯λ°›λŠ”λ‹€. - - [] `μ£Όλ¬Έ λ‚΄μ—­`이 1000κΈ€μž μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. - - [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `OrdersInputException`을 λ°œμƒμ‹œν‚€κ³ ,
+ - [x] `μ£Όλ¬Έ λ‚΄μ—­`이 1000κΈ€μž μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. + - [x] `μ£Όλ¬Έ λ‚΄μ—­`이 λΉ„μ–΄μžˆμ§€ μ•Šμ€μ§€ ν™•μΈν•œλ‹€. + - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `BasicInputException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. - [x] `μ£Όλ¬Έ`은 `메뉴 이름`κ³Ό `메뉴 개수`둜 이루어진닀. - [x] `μ£Όλ¬Έ`은 μ‰Όν‘œ(,)λ₯Ό κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„ν•œλ‹€. diff --git a/src/main/java/christmas/controller/PromotionController.java b/src/main/java/christmas/controller/PromotionController.java index 3e8636d..3e69441 100644 --- a/src/main/java/christmas/controller/PromotionController.java +++ b/src/main/java/christmas/controller/PromotionController.java @@ -8,6 +8,7 @@ import christmas.view.input.InputView; import christmas.view.input.exception.BasicInputException; import christmas.view.input.exception.DayInputException; +import christmas.view.input.exception.OrdersInputException; import christmas.view.output.OutputView; import java.util.Map; @@ -51,7 +52,7 @@ private Orders insertOrders() { try { Map orders = askToInsertOrders(); return ordersService.createOrders(orders); - } catch (BasicInputException e) { + } catch (BasicInputException | OrdersInputException e) { outputView.printErrorMessage(e.getMessage()); return insertOrders(); } diff --git a/src/main/java/christmas/view/input/constant/InputConstant.java b/src/main/java/christmas/view/input/constant/InputConstant.java index 16fbf7e..d14812d 100644 --- a/src/main/java/christmas/view/input/constant/InputConstant.java +++ b/src/main/java/christmas/view/input/constant/InputConstant.java @@ -9,4 +9,5 @@ public class InputConstant { public static String ORDER_DELIMITER = "-"; public static int ORDER_NAME_INDEX = 0; public static int ORDER_COUNT_INDEX = 1; + public static int ORDERS_MAX_INPUT_LENGTH = 1000; } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/exception/OrdersInputException.java b/src/main/java/christmas/view/input/exception/OrdersInputException.java new file mode 100644 index 0000000..3c94983 --- /dev/null +++ b/src/main/java/christmas/view/input/exception/OrdersInputException.java @@ -0,0 +1,11 @@ +package christmas.view.input.exception; + +public class OrdersInputException extends IllegalArgumentException { + private OrdersInputException(final String ordersInputExceptionMessage) { + super(ordersInputExceptionMessage); + } + + public static OrdersInputException of(final String ordersInputExceptionMessage) { + return new OrdersInputException(ordersInputExceptionMessage); + } +} \ No newline at end of file diff --git a/src/main/java/christmas/view/input/exception/message/OrderInputException.java b/src/main/java/christmas/view/input/exception/message/OrderInputException.java new file mode 100644 index 0000000..8c87214 --- /dev/null +++ b/src/main/java/christmas/view/input/exception/message/OrderInputException.java @@ -0,0 +1,4 @@ +package christmas.view.input.exception.message; + +public class OrderInputException { +} \ No newline at end of file diff --git a/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java b/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java new file mode 100644 index 0000000..4300509 --- /dev/null +++ b/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java @@ -0,0 +1,17 @@ +package christmas.view.input.exception.message; + +import static christmas.global.ApplicationConstant.ERROR_PREFIX; + +public enum OrdersInputExceptionMessage { + INVALID_FORMAT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έ ν˜•μ‹μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); + + private final String message; + + OrdersInputExceptionMessage(final String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/OrdersInputValidator.java b/src/main/java/christmas/view/input/validator/OrdersInputValidator.java index 15be94d..875ec68 100644 --- a/src/main/java/christmas/view/input/validator/OrdersInputValidator.java +++ b/src/main/java/christmas/view/input/validator/OrdersInputValidator.java @@ -1,6 +1,11 @@ package christmas.view.input.validator; +import static christmas.view.input.constant.InputConstant.ORDERS_MAX_INPUT_LENGTH; + +import christmas.view.input.exception.BasicInputException; + public class OrdersInputValidator extends BasicValidator { - public void validate(String orders) { + public void validate(final String orders) throws BasicInputException { + super.validate(orders, ORDERS_MAX_INPUT_LENGTH); } } \ No newline at end of file From 47ee9c2c4486d3fc58f3a3e52717a3c7631ff418 Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 20:45:26 +0900 Subject: [PATCH 18/89] docs: add constraint to user input about orders --- docs/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index f81039e..e4ba25c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -9,7 +9,7 @@ - [x] `μ˜ˆμ•½ λ‚ μ§œ` μž…λ ₯ μš”μ²­ 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. - [x] μ‚¬μš©μžμ—κ²Œ `μ˜ˆμ•½ λ‚ μ§œ`λ₯Ό μž…λ ₯λ°›λŠ”λ‹€. - [x] λ‚ μ§œκ°€ λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. - - [x] λ‚ μ§œμ˜ μ•ž 뒀에 곡백이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. + - [x] λ‚ μ§œμ— 곡백이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. - [x] 곡백이 μ•ž 뒀에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•œλ‹€. - [x] 곡백이 κΈ€μž 쀑간에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•΄ 곡백 사이λ₯Ό 이어쀀닀. - [x] 곡백 제거 ν›„ κΈ€μž 길이가 2 μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. @@ -26,6 +26,9 @@ - [x] `μ£Όλ¬Έ λ‚΄μ—­`이 λΉ„μ–΄μžˆμ§€ μ•Šμ€μ§€ ν™•μΈν•œλ‹€. - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `BasicInputException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. + - [] μ£Όλ¬Έ 내역에 곡백이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. + - [] 곡백이 μ•ž 뒀에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•œλ‹€. + - [] 곡백이 κΈ€μž 쀑간에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•΄ 곡백 사이λ₯Ό 이어쀀닀. - [x] `μ£Όλ¬Έ`은 `메뉴 이름`κ³Ό `메뉴 개수`둜 이루어진닀. - [x] `μ£Όλ¬Έ`은 μ‰Όν‘œ(,)λ₯Ό κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„ν•œλ‹€. - [x] `메뉴 이름`와 `메뉴 개수`λŠ” λŒ€μ‹œ(-)λ₯Ό κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„ν•œλ‹€. From 863c565649de8fcf08ecff55ebac3695a69fbebd Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 20:49:03 +0900 Subject: [PATCH 19/89] feat: add feature to remove blank in user input about orders --- docs/README.md | 20 +++++++++---------- .../view/input/parser/InputParser.java | 4 ++++ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/docs/README.md b/docs/README.md index e4ba25c..ec60358 100644 --- a/docs/README.md +++ b/docs/README.md @@ -26,9 +26,9 @@ - [x] `μ£Όλ¬Έ λ‚΄μ—­`이 λΉ„μ–΄μžˆμ§€ μ•Šμ€μ§€ ν™•μΈν•œλ‹€. - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `BasicInputException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. - - [] μ£Όλ¬Έ 내역에 곡백이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. - - [] 곡백이 μ•ž 뒀에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•œλ‹€. - - [] 곡백이 κΈ€μž 쀑간에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•΄ 곡백 사이λ₯Ό 이어쀀닀. + - [x] μ£Όλ¬Έ 내역에 곡백이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. + - [x] 곡백이 μ•ž 뒀에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•œλ‹€. + - [x] 곡백이 κΈ€μž 쀑간에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•΄ 곡백 사이λ₯Ό 이어쀀닀. - [x] `μ£Όλ¬Έ`은 `메뉴 이름`κ³Ό `메뉴 개수`둜 이루어진닀. - [x] `μ£Όλ¬Έ`은 μ‰Όν‘œ(,)λ₯Ό κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„ν•œλ‹€. - [x] `메뉴 이름`와 `메뉴 개수`λŠ” λŒ€μ‹œ(-)λ₯Ό κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„ν•œλ‹€. @@ -37,9 +37,9 @@ - [] `μ£Όλ¬Έ`이 λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. - [] `μ£Όλ¬Έ`이 λŒ€μ‹œ(-)λ₯Ό ν¬ν•¨ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€. -- [] `μ£Όλ¬Έ` μ•ž 뒀에 곡백이 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€. - - [] 곡백이 μ•žλ’€μ— ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•œλ‹€. - - [] 곡백이 κΈ€μž 쀑간에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•΄ 곡백 사이λ₯Ό 이어쀀닀. +- [x] `μ£Όλ¬Έ` μ•ž 뒀에 곡백이 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€. + - [x] 곡백이 μ•žλ’€μ— ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•œλ‹€. + - [x] 곡백이 κΈ€μž 쀑간에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•΄ 곡백 사이λ₯Ό 이어쀀닀. - [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `OrdersInputException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. @@ -60,11 +60,11 @@ - [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `MenuCountInputException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. -> ### πŸ”– iv) μ£Όλ¬Έ λ‚΄μ—­ μž…λ ₯κ°’ μž¬κ²€μ¦ +> #### πŸ”– iv) `μ£Όλ¬Έ λ‚΄μ—­` μž…λ ₯κ°’ μž¬κ²€μ¦ -- [] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, 쀑볡 메뉴가 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€. -- [] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ μˆ˜λŸ‰μ΄ `20개`κ°€ λ„˜μ–΄κ°€λŠ”μ§€ ν™•μΈν•œλ‹€. -- [] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ 내역이 음료수만 μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. +- [] `μ£Όλ¬Έ λ‚΄μ—­`을 μ·¨ν•©ν–ˆμ„ λ•Œ, 쀑볡 메뉴가 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€. +- [] `μ£Όλ¬Έ λ‚΄μ—­`을 μ·¨ν•©ν–ˆμ„ λ•Œ, `메뉴 개수`κ°€ `20개`κ°€ λ„˜μ–΄κ°€λŠ”μ§€ ν™•μΈν•œλ‹€. +- [] `μ£Όλ¬Έ λ‚΄μ—­`을 μ·¨ν•©ν–ˆμ„ λ•Œ, `μ£Όλ¬Έ λ‚΄μ—­`에 음료수만 μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. - [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `OrdersInputException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”." λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. diff --git a/src/main/java/christmas/view/input/parser/InputParser.java b/src/main/java/christmas/view/input/parser/InputParser.java index 8c9163d..9ba3825 100644 --- a/src/main/java/christmas/view/input/parser/InputParser.java +++ b/src/main/java/christmas/view/input/parser/InputParser.java @@ -10,6 +10,7 @@ import christmas.view.input.exception.BasicInputException; import christmas.view.input.exception.DayInputException; import christmas.view.input.validator.DayInputValidator; +import christmas.view.input.validator.OrderInputValidator; import christmas.view.input.validator.OrdersInputValidator; import java.util.Arrays; import java.util.Map; @@ -18,10 +19,12 @@ public class InputParser { private final DayInputValidator dayInputValidator; private final OrdersInputValidator ordersInputValidator; + private final OrderInputValidator orderInputValidator; public InputParser() { this.dayInputValidator = new DayInputValidator(); this.ordersInputValidator = new OrdersInputValidator(); + this.orderInputValidator = new OrderInputValidator(); } public int parseDay(String userInput) throws BasicInputException, DayInputException { @@ -31,6 +34,7 @@ public int parseDay(String userInput) throws BasicInputException, DayInputExcept } public Map parseOrders(String userInput) { + userInput = removeBlank(userInput); ordersInputValidator.validate(userInput); return parseToOrderMap(userInput); } From 49830adceaea0ec89e15d3100e7543dd03804d4d Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 20:59:51 +0900 Subject: [PATCH 20/89] feat: add feature to check user input about order is not empty --- docs/README.md | 2 +- .../christmas/view/input/constant/InputConstant.java | 1 + .../java/christmas/view/input/parser/InputParser.java | 6 ++++++ .../view/input/validator/OrderInputValidator.java | 9 +++++++++ 4 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 src/main/java/christmas/view/input/validator/OrderInputValidator.java diff --git a/docs/README.md b/docs/README.md index ec60358..5685e46 100644 --- a/docs/README.md +++ b/docs/README.md @@ -35,7 +35,7 @@ > #### i) πŸ™‹`μ£Όλ¬Έ`에 λŒ€ν•œ μž…λ ₯κ°’ 검증 -- [] `μ£Όλ¬Έ`이 λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. +- [x] `μ£Όλ¬Έ`이 λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. - [] `μ£Όλ¬Έ`이 λŒ€μ‹œ(-)λ₯Ό ν¬ν•¨ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€. - [x] `μ£Όλ¬Έ` μ•ž 뒀에 곡백이 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€. - [x] 곡백이 μ•žλ’€μ— ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•œλ‹€. diff --git a/src/main/java/christmas/view/input/constant/InputConstant.java b/src/main/java/christmas/view/input/constant/InputConstant.java index d14812d..876e2eb 100644 --- a/src/main/java/christmas/view/input/constant/InputConstant.java +++ b/src/main/java/christmas/view/input/constant/InputConstant.java @@ -10,4 +10,5 @@ public class InputConstant { public static int ORDER_NAME_INDEX = 0; public static int ORDER_COUNT_INDEX = 1; public static int ORDERS_MAX_INPUT_LENGTH = 1000; + public static int ORDER_MAX_INPUT_LENGTH = 50; } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/parser/InputParser.java b/src/main/java/christmas/view/input/parser/InputParser.java index 9ba3825..bc3a548 100644 --- a/src/main/java/christmas/view/input/parser/InputParser.java +++ b/src/main/java/christmas/view/input/parser/InputParser.java @@ -36,6 +36,7 @@ public int parseDay(String userInput) throws BasicInputException, DayInputExcept public Map parseOrders(String userInput) { userInput = removeBlank(userInput); ordersInputValidator.validate(userInput); + validateEachOrder(userInput); return parseToOrderMap(userInput); } @@ -50,6 +51,11 @@ private String removeBlank(String userInput) { return userInput; } + private void validateEachOrder(final String userInput) { + Arrays.stream(userInput.split(ORDERS_DELIMITER)) + .forEach(orderInputValidator::validate); + } + private Map parseToOrderMap(String userInput) { return Arrays.stream(userInput.split(ORDERS_DELIMITER)) .map(orders -> orders.split(ORDER_DELIMITER)) diff --git a/src/main/java/christmas/view/input/validator/OrderInputValidator.java b/src/main/java/christmas/view/input/validator/OrderInputValidator.java new file mode 100644 index 0000000..4603f70 --- /dev/null +++ b/src/main/java/christmas/view/input/validator/OrderInputValidator.java @@ -0,0 +1,9 @@ +package christmas.view.input.validator; + +import static christmas.view.input.constant.InputConstant.ORDER_MAX_INPUT_LENGTH; + +public class OrderInputValidator extends BasicValidator { + public void validate(final String order) { + super.validate(order, ORDER_MAX_INPUT_LENGTH); + } +} \ No newline at end of file From b1616ac4344b810f7621b05a6d9a4d183ee9e9d8 Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 21:08:02 +0900 Subject: [PATCH 21/89] docs: update feature list --- docs/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/README.md b/docs/README.md index 5685e46..b3ef931 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,6 +4,10 @@ ## πŸ’» [ μž…λ ₯ 및 μž…λ ₯κ°’ 검증 κΈ°λŠ₯ ] +- [] λͺ¨λ“  μ‚¬μš©μž μž…λ ₯값은 곡백 포함 길이 2000κΈ€μž μ΄ν•˜λ‘œ ν•œλ‹€. + - [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `BasicInputException`을 λ°œμƒμ‹œν‚€κ³ ,
+ "[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ μž…λ ₯을 λ°›λŠ”λ‹€. + > ### πŸ—“ μ˜ˆμ•½ λ‚ μ§œ μž…λ ₯ 및 μž…λ ₯κ°’ 검증 - [x] `μ˜ˆμ•½ λ‚ μ§œ` μž…λ ₯ μš”μ²­ 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. @@ -36,6 +40,7 @@ > #### i) πŸ™‹`μ£Όλ¬Έ`에 λŒ€ν•œ μž…λ ₯κ°’ 검증 - [x] `μ£Όλ¬Έ`이 λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. +- [] `μ£Όλ¬Έ`이 50κΈ€μž μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. - [] `μ£Όλ¬Έ`이 λŒ€μ‹œ(-)λ₯Ό ν¬ν•¨ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€. - [x] `μ£Όλ¬Έ` μ•ž 뒀에 곡백이 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€. - [x] 곡백이 μ•žλ’€μ— ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•œλ‹€. From 245b009e584503f23a9961838355f96fbcfe07ca Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 21:21:51 +0900 Subject: [PATCH 22/89] feat: add feature to check all user input length is under limit(2000), even considering that it contains blanks --- docs/README.md | 8 +++++--- .../christmas/view/input/constant/InputConstant.java | 1 + .../exception/message/BasicInputExceptionMessage.java | 3 +++ .../java/christmas/view/input/parser/InputParser.java | 10 ++++++++++ 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index b3ef931..346a6d3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,8 +4,10 @@ ## πŸ’» [ μž…λ ₯ 및 μž…λ ₯κ°’ 검증 κΈ°λŠ₯ ] -- [] λͺ¨λ“  μ‚¬μš©μž μž…λ ₯값은 곡백 포함 길이 2000κΈ€μž μ΄ν•˜λ‘œ ν•œλ‹€. - - [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `BasicInputException`을 λ°œμƒμ‹œν‚€κ³ ,
+> ### 🎯 λͺ¨λ“  μ’…λ₯˜ μž…λ ₯값에 λŒ€ν•œ 검증 + +- [x] λͺ¨λ“  μ‚¬μš©μž μž…λ ₯값은 곡백 포함 길이 2000κΈ€μž μ΄ν•˜λ‘œ ν•œλ‹€. + - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `BasicInputException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ μž…λ ₯을 λ°›λŠ”λ‹€. > ### πŸ—“ μ˜ˆμ•½ λ‚ μ§œ μž…λ ₯ 및 μž…λ ₯κ°’ 검증 @@ -40,7 +42,7 @@ > #### i) πŸ™‹`μ£Όλ¬Έ`에 λŒ€ν•œ μž…λ ₯κ°’ 검증 - [x] `μ£Όλ¬Έ`이 λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. -- [] `μ£Όλ¬Έ`이 50κΈ€μž μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. +- [x] `μ£Όλ¬Έ`이 50κΈ€μž μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. - [] `μ£Όλ¬Έ`이 λŒ€μ‹œ(-)λ₯Ό ν¬ν•¨ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€. - [x] `μ£Όλ¬Έ` μ•ž 뒀에 곡백이 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€. - [x] 곡백이 μ•žλ’€μ— ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•œλ‹€. diff --git a/src/main/java/christmas/view/input/constant/InputConstant.java b/src/main/java/christmas/view/input/constant/InputConstant.java index 876e2eb..fea24da 100644 --- a/src/main/java/christmas/view/input/constant/InputConstant.java +++ b/src/main/java/christmas/view/input/constant/InputConstant.java @@ -3,6 +3,7 @@ public class InputConstant { public static String BLANK = " "; public static String VOID = ""; + public static int APPLICATION_MAX_INPUT_LENGTH = 2000; public static int DAY_MAX_INPUT_LENGTH = 2; public static int POSITIVE_BOUNDARY_VALUE = 0; public static String ORDERS_DELIMITER = ","; diff --git a/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java b/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java index 27d4eac..b9f57d0 100644 --- a/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java +++ b/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java @@ -1,8 +1,11 @@ package christmas.view.input.exception.message; import static christmas.global.ApplicationConstant.ERROR_PREFIX; +import static christmas.view.input.constant.InputConstant.APPLICATION_MAX_INPUT_LENGTH; public enum BasicInputExceptionMessage { + TOO_LONG_WITH_BLANKS( + ERROR_PREFIX + "μ œν•œ κΈ€μž μž…λ ₯을 μ΄ˆκ³Όν–ˆμŠ΅λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”.(곡백 포함 μ΅œλŒ€" + APPLICATION_MAX_INPUT_LENGTH + "κΈ€μž μž…λ ₯ κ°€λŠ₯)"), EMPTY(ERROR_PREFIX + "λΉ„μ–΄μžˆλŠ” μž…λ ₯κ°’μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), TOO_LONG(ERROR_PREFIX + "μ œν•œ κΈ€μž μž…λ ₯을 μ΄ˆκ³Όν–ˆμŠ΅λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”.(곡백 μ œμ™Έ μ΅œλŒ€ %dκΈ€μž μž…λ ₯ κ°€λŠ₯)"); diff --git a/src/main/java/christmas/view/input/parser/InputParser.java b/src/main/java/christmas/view/input/parser/InputParser.java index bc3a548..324a1de 100644 --- a/src/main/java/christmas/view/input/parser/InputParser.java +++ b/src/main/java/christmas/view/input/parser/InputParser.java @@ -1,11 +1,13 @@ package christmas.view.input.parser; +import static christmas.view.input.constant.InputConstant.APPLICATION_MAX_INPUT_LENGTH; import static christmas.view.input.constant.InputConstant.BLANK; import static christmas.view.input.constant.InputConstant.ORDERS_DELIMITER; import static christmas.view.input.constant.InputConstant.ORDER_COUNT_INDEX; import static christmas.view.input.constant.InputConstant.ORDER_DELIMITER; import static christmas.view.input.constant.InputConstant.ORDER_NAME_INDEX; import static christmas.view.input.constant.InputConstant.VOID; +import static christmas.view.input.exception.message.BasicInputExceptionMessage.TOO_LONG_WITH_BLANKS; import christmas.view.input.exception.BasicInputException; import christmas.view.input.exception.DayInputException; @@ -28,18 +30,26 @@ public InputParser() { } public int parseDay(String userInput) throws BasicInputException, DayInputException { + checkLengthIsUnderUpperLimit(userInput); userInput = removeBlank(userInput); dayInputValidator.validate(userInput); return parseToInt(userInput); } public Map parseOrders(String userInput) { + checkLengthIsUnderUpperLimit(userInput); userInput = removeBlank(userInput); ordersInputValidator.validate(userInput); validateEachOrder(userInput); return parseToOrderMap(userInput); } + private void checkLengthIsUnderUpperLimit(final String userInput) { + if (userInput.length() > APPLICATION_MAX_INPUT_LENGTH) { + throw BasicInputException.of(TOO_LONG_WITH_BLANKS.getMessage()); + } + } + private int parseToInt(String userInput) { return Integer.parseInt(userInput); } From 6e68e485177690165860bc7b15749cfd27925a15 Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 21:50:23 +0900 Subject: [PATCH 23/89] feat: add feature to check user input about order contains delimiter('-') --- docs/README.md | 8 ++++--- .../message/OrdersInputExceptionMessage.java | 3 ++- .../validator/MenuCountInputValidator.java | 4 ++++ .../validator/MenuNameInputValidator.java | 4 ++++ .../input/validator/OrderInputValidator.java | 23 +++++++++++++++++++ 5 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 src/main/java/christmas/view/input/validator/MenuCountInputValidator.java create mode 100644 src/main/java/christmas/view/input/validator/MenuNameInputValidator.java diff --git a/docs/README.md b/docs/README.md index 346a6d3..3bb5860 100644 --- a/docs/README.md +++ b/docs/README.md @@ -28,8 +28,8 @@ - [x] `μ£Όλ¬Έ λ‚΄μ—­` μž…λ ₯ μš”μ²­ 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. - [x] μ‚¬μš©μžμ—κ²Œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯λ°›λŠ”λ‹€. - - [x] `μ£Όλ¬Έ λ‚΄μ—­`이 1000κΈ€μž μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. - [x] `μ£Όλ¬Έ λ‚΄μ—­`이 λΉ„μ–΄μžˆμ§€ μ•Šμ€μ§€ ν™•μΈν•œλ‹€. + - [x] `μ£Όλ¬Έ λ‚΄μ—­`이 1000κΈ€μž μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `BasicInputException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. - [x] μ£Όλ¬Έ 내역에 곡백이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. @@ -43,11 +43,13 @@ - [x] `μ£Όλ¬Έ`이 λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. - [x] `μ£Όλ¬Έ`이 50κΈ€μž μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. -- [] `μ£Όλ¬Έ`이 λŒ€μ‹œ(-)λ₯Ό ν¬ν•¨ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€. + - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `BasicInputException`을 λ°œμƒμ‹œν‚€κ³ ,
+ "[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. +- [x] `μ£Όλ¬Έ`이 λŒ€μ‹œ(-)λ₯Ό ν¬ν•¨ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€. - [x] `μ£Όλ¬Έ` μ•ž 뒀에 곡백이 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€. - [x] 곡백이 μ•žλ’€μ— ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•œλ‹€. - [x] 곡백이 κΈ€μž 쀑간에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•΄ 곡백 사이λ₯Ό 이어쀀닀. -- [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `OrdersInputException`을 λ°œμƒμ‹œν‚€κ³ ,
+- [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `OrdersInputException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. > #### ii) βœ‰οΈ`메뉴 이름`에 λŒ€ν•œ μž…λ ₯κ°’ 검증 diff --git a/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java b/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java index 4300509..e37a0ac 100644 --- a/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java +++ b/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java @@ -1,9 +1,10 @@ package christmas.view.input.exception.message; import static christmas.global.ApplicationConstant.ERROR_PREFIX; +import static christmas.view.input.constant.InputConstant.ORDER_DELIMITER; public enum OrdersInputExceptionMessage { - INVALID_FORMAT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έ ν˜•μ‹μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); + INVALID_ORDER_FORMAT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έ ν˜•μ‹μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”.(주문에 '" + ORDER_DELIMITER + "'λ₯Ό 포함해주셔야 ν•©λ‹ˆλ‹€.)"); private final String message; diff --git a/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java b/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java new file mode 100644 index 0000000..dc232cd --- /dev/null +++ b/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java @@ -0,0 +1,4 @@ +package christmas.view.input.validator; + +public class MenuCountInputValidator { +} diff --git a/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java b/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java new file mode 100644 index 0000000..aca21d1 --- /dev/null +++ b/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java @@ -0,0 +1,4 @@ +package christmas.view.input.validator; + +public class MenuNameInputValidator { +} diff --git a/src/main/java/christmas/view/input/validator/OrderInputValidator.java b/src/main/java/christmas/view/input/validator/OrderInputValidator.java index 4603f70..3ed482c 100644 --- a/src/main/java/christmas/view/input/validator/OrderInputValidator.java +++ b/src/main/java/christmas/view/input/validator/OrderInputValidator.java @@ -1,9 +1,32 @@ package christmas.view.input.validator; +import static christmas.view.input.constant.InputConstant.ORDER_DELIMITER; import static christmas.view.input.constant.InputConstant.ORDER_MAX_INPUT_LENGTH; +import static christmas.view.input.exception.message.OrdersInputExceptionMessage.INVALID_ORDER_FORMAT; + +import christmas.view.input.exception.OrdersInputException; public class OrderInputValidator extends BasicValidator { + private final MenuNameInputValidator menuNameInputValidator; + private final MenuCountInputValidator menuCountInputValidator; + + public OrderInputValidator() { + this.menuNameInputValidator = new MenuNameInputValidator(); + this.menuCountInputValidator = new MenuCountInputValidator(); + } + public void validate(final String order) { super.validate(order, ORDER_MAX_INPUT_LENGTH); + validateContainingDelimiter(order); + } + + private void validateContainingDelimiter(final String order) { + if (!containsDelimiter(order)) { + throw OrdersInputException.of(INVALID_ORDER_FORMAT.getMessage()); + } + } + + private boolean containsDelimiter(final String order) { + return order.contains(ORDER_DELIMITER); } } \ No newline at end of file From 55ba4f0cae4e81345df45d3e53bb06e25d334a03 Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 23:34:32 +0900 Subject: [PATCH 24/89] feat: add feature to check user input about menu name length is in appropriate range --- docs/README.md | 14 ++++++++------ .../controller/PromotionController.java | 2 -- .../view/input/constant/InputConstant.java | 5 +++-- .../christmas/view/input/parser/InputParser.java | 8 ++++---- .../input/validator/MenuCountInputValidator.java | 7 +++++-- .../input/validator/MenuNameInputValidator.java | 9 +++++++-- .../input/validator/OrderInputValidator.java | 16 ++++++++++++++++ 7 files changed, 43 insertions(+), 18 deletions(-) diff --git a/docs/README.md b/docs/README.md index 3bb5860..8c20312 100644 --- a/docs/README.md +++ b/docs/README.md @@ -54,11 +54,13 @@ > #### ii) βœ‰οΈ`메뉴 이름`에 λŒ€ν•œ μž…λ ₯κ°’ 검증 -- [] `메뉴 이름`이 λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. -- [] κΈ€μž μˆ˜κ°€ 40κΈ€μž μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. -- [] ν•΄λ‹Ή 메뉴 이름이 λ©”λ‰΄νŒμ— μžˆλŠ” 메뉴인지 ν™•μΈν•œλ‹€. -- [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `MenuNameInputException`을 λ°œμƒμ‹œν‚€κ³ ,
- "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”." λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. +- [x] `메뉴 이름`이 λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. +- [x] `메뉴 이름`이 30κΈ€μž μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. + - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `BasicInputException`을 λ°œμƒμ‹œν‚€κ³ ,
+ "[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. +- [] `메뉴 이름`이 λ©”λ‰΄νŒμ— μžˆλŠ” 메뉴인지 ν™•μΈν•œλ‹€. + - [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `OrdersInputException`을 λ°œμƒμ‹œν‚€κ³ ,
+ "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”." λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. > #### iii) `메뉴 개수`에 λŒ€ν•œ μž…λ ₯κ°’ 검증 @@ -66,7 +68,7 @@ - [] `메뉴 개수`κ°€ 2κΈ€μž μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. - [] `메뉴 개수`κ°€ 숫자 ν˜•μ‹μΈμ§€ ν™•μΈν•œλ‹€. - [] `메뉴 개수`κ°€ 1 이상 μ •μˆ˜ 인지 ν™•μΈν•œλ‹€. -- [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `MenuCountInputException`을 λ°œμƒμ‹œν‚€κ³ ,
+- [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `OrdersInputException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. > #### πŸ”– iv) `μ£Όλ¬Έ λ‚΄μ—­` μž…λ ₯κ°’ μž¬κ²€μ¦ diff --git a/src/main/java/christmas/controller/PromotionController.java b/src/main/java/christmas/controller/PromotionController.java index 3e69441..dcb752d 100644 --- a/src/main/java/christmas/controller/PromotionController.java +++ b/src/main/java/christmas/controller/PromotionController.java @@ -29,8 +29,6 @@ public void run() { outputView.printGreetingMessage(); DecemberDay day = insertDay(); Orders orders = insertOrders(); - - outputView.askToInsertOrders(); } private DecemberDay insertDay() { diff --git a/src/main/java/christmas/view/input/constant/InputConstant.java b/src/main/java/christmas/view/input/constant/InputConstant.java index fea24da..6bfb61c 100644 --- a/src/main/java/christmas/view/input/constant/InputConstant.java +++ b/src/main/java/christmas/view/input/constant/InputConstant.java @@ -8,8 +8,9 @@ public class InputConstant { public static int POSITIVE_BOUNDARY_VALUE = 0; public static String ORDERS_DELIMITER = ","; public static String ORDER_DELIMITER = "-"; - public static int ORDER_NAME_INDEX = 0; - public static int ORDER_COUNT_INDEX = 1; + public static int MENU_NAME_INDEX = 0; + public static int MENU_COUNT_INDEX = 1; public static int ORDERS_MAX_INPUT_LENGTH = 1000; public static int ORDER_MAX_INPUT_LENGTH = 50; + public static int MENU_NAME_MAX_INPUT_LENGTH = 30; } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/parser/InputParser.java b/src/main/java/christmas/view/input/parser/InputParser.java index 324a1de..6eb5901 100644 --- a/src/main/java/christmas/view/input/parser/InputParser.java +++ b/src/main/java/christmas/view/input/parser/InputParser.java @@ -2,10 +2,10 @@ import static christmas.view.input.constant.InputConstant.APPLICATION_MAX_INPUT_LENGTH; import static christmas.view.input.constant.InputConstant.BLANK; +import static christmas.view.input.constant.InputConstant.MENU_COUNT_INDEX; +import static christmas.view.input.constant.InputConstant.MENU_NAME_INDEX; import static christmas.view.input.constant.InputConstant.ORDERS_DELIMITER; -import static christmas.view.input.constant.InputConstant.ORDER_COUNT_INDEX; import static christmas.view.input.constant.InputConstant.ORDER_DELIMITER; -import static christmas.view.input.constant.InputConstant.ORDER_NAME_INDEX; import static christmas.view.input.constant.InputConstant.VOID; import static christmas.view.input.exception.message.BasicInputExceptionMessage.TOO_LONG_WITH_BLANKS; @@ -70,8 +70,8 @@ private Map parseToOrderMap(String userInput) { return Arrays.stream(userInput.split(ORDERS_DELIMITER)) .map(orders -> orders.split(ORDER_DELIMITER)) .collect(Collectors.toMap( - order -> order[ORDER_NAME_INDEX], - order -> parseToInt(order[ORDER_COUNT_INDEX]) + order -> order[MENU_NAME_INDEX], + order -> parseToInt(order[MENU_COUNT_INDEX]) )); } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java b/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java index dc232cd..3cb6f17 100644 --- a/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java +++ b/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java @@ -1,4 +1,7 @@ package christmas.view.input.validator; -public class MenuCountInputValidator { -} +public class MenuCountInputValidator extends BasicValidator { + public void validate(final String count) { + + } +} \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java b/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java index aca21d1..5a52b60 100644 --- a/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java +++ b/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java @@ -1,4 +1,9 @@ package christmas.view.input.validator; -public class MenuNameInputValidator { -} +import static christmas.view.input.constant.InputConstant.MENU_NAME_MAX_INPUT_LENGTH; + +public class MenuNameInputValidator extends BasicValidator { + public void validate(final String name) { + super.validate(name, MENU_NAME_MAX_INPUT_LENGTH); + } +} \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/OrderInputValidator.java b/src/main/java/christmas/view/input/validator/OrderInputValidator.java index 3ed482c..469ed8b 100644 --- a/src/main/java/christmas/view/input/validator/OrderInputValidator.java +++ b/src/main/java/christmas/view/input/validator/OrderInputValidator.java @@ -1,10 +1,15 @@ package christmas.view.input.validator; +import static christmas.view.input.constant.InputConstant.MENU_COUNT_INDEX; +import static christmas.view.input.constant.InputConstant.MENU_NAME_INDEX; import static christmas.view.input.constant.InputConstant.ORDER_DELIMITER; import static christmas.view.input.constant.InputConstant.ORDER_MAX_INPUT_LENGTH; import static christmas.view.input.exception.message.OrdersInputExceptionMessage.INVALID_ORDER_FORMAT; import christmas.view.input.exception.OrdersInputException; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; public class OrderInputValidator extends BasicValidator { private final MenuNameInputValidator menuNameInputValidator; @@ -18,6 +23,7 @@ public OrderInputValidator() { public void validate(final String order) { super.validate(order, ORDER_MAX_INPUT_LENGTH); validateContainingDelimiter(order); + validateMenu(splitToMenu(order)); } private void validateContainingDelimiter(final String order) { @@ -29,4 +35,14 @@ private void validateContainingDelimiter(final String order) { private boolean containsDelimiter(final String order) { return order.contains(ORDER_DELIMITER); } + + private List splitToMenu(final String order) { + return Arrays.stream(order.split(ORDER_DELIMITER)) + .collect(Collectors.toList()); + } + + private void validateMenu(List menus) { + menuNameInputValidator.validate(menus.get(MENU_NAME_INDEX)); + menuCountInputValidator.validate(menus.get(MENU_COUNT_INDEX)); + } } \ No newline at end of file From 937363f3785e4ba0ec5d23b9b0ed5def4b0d168a Mon Sep 17 00:00:00 2001 From: wonjun Date: Mon, 13 Nov 2023 23:53:30 +0900 Subject: [PATCH 25/89] refactor: change input constant values to be enum --- .../view/input/constant/InputConstant.java | 16 ---------- .../input/constant/InputNumberConstant.java | 22 ++++++++++++++ .../input/constant/InputSymbolConstant.java | 18 +++++++++++ .../message/BasicInputExceptionMessage.java | 2 +- .../message/OrdersInputExceptionMessage.java | 5 ++-- .../view/input/parser/InputParser.java | 30 +++++++++---------- .../input/validator/DayInputValidator.java | 8 ++--- .../validator/MenuNameInputValidator.java | 4 +-- .../input/validator/OrderInputValidator.java | 18 +++++------ .../input/validator/OrdersInputValidator.java | 4 +-- 10 files changed, 76 insertions(+), 51 deletions(-) delete mode 100644 src/main/java/christmas/view/input/constant/InputConstant.java create mode 100644 src/main/java/christmas/view/input/constant/InputNumberConstant.java create mode 100644 src/main/java/christmas/view/input/constant/InputSymbolConstant.java diff --git a/src/main/java/christmas/view/input/constant/InputConstant.java b/src/main/java/christmas/view/input/constant/InputConstant.java deleted file mode 100644 index 6bfb61c..0000000 --- a/src/main/java/christmas/view/input/constant/InputConstant.java +++ /dev/null @@ -1,16 +0,0 @@ -package christmas.view.input.constant; - -public class InputConstant { - public static String BLANK = " "; - public static String VOID = ""; - public static int APPLICATION_MAX_INPUT_LENGTH = 2000; - public static int DAY_MAX_INPUT_LENGTH = 2; - public static int POSITIVE_BOUNDARY_VALUE = 0; - public static String ORDERS_DELIMITER = ","; - public static String ORDER_DELIMITER = "-"; - public static int MENU_NAME_INDEX = 0; - public static int MENU_COUNT_INDEX = 1; - public static int ORDERS_MAX_INPUT_LENGTH = 1000; - public static int ORDER_MAX_INPUT_LENGTH = 50; - public static int MENU_NAME_MAX_INPUT_LENGTH = 30; -} \ No newline at end of file diff --git a/src/main/java/christmas/view/input/constant/InputNumberConstant.java b/src/main/java/christmas/view/input/constant/InputNumberConstant.java new file mode 100644 index 0000000..d6a99cc --- /dev/null +++ b/src/main/java/christmas/view/input/constant/InputNumberConstant.java @@ -0,0 +1,22 @@ +package christmas.view.input.constant; + +public enum InputNumberConstant { + APPLICATION_MAX_INPUT_LENGTH(2000), + ORDERS_MAX_INPUT_LENGTH(1000), + ORDER_MAX_INPUT_LENGTH(50), + MENU_NAME_MAX_INPUT_LENGTH(30), + DAY_MAX_INPUT_LENGTH(2), + MENU_NAME_INDEX(0), + MENU_COUNT_INDEX(1), + POSITIVE_BOUNDARY_VALUE(0); + + private final int value; + + InputNumberConstant(final int value) { + this.value = value; + } + + public int getValue() { + return value; + } +} \ No newline at end of file diff --git a/src/main/java/christmas/view/input/constant/InputSymbolConstant.java b/src/main/java/christmas/view/input/constant/InputSymbolConstant.java new file mode 100644 index 0000000..3e2212f --- /dev/null +++ b/src/main/java/christmas/view/input/constant/InputSymbolConstant.java @@ -0,0 +1,18 @@ +package christmas.view.input.constant; + +public enum InputSymbolConstant { + BLANK(" "), + VOID(""), + ORDERS_DELIMITER(","), + ORDER_DELIMITER("-"); + + private final String symbol; + + InputSymbolConstant(final String symbol) { + this.symbol = symbol; + } + + public String getSymbol() { + return symbol; + } +} \ No newline at end of file diff --git a/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java b/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java index b9f57d0..a5bd8d2 100644 --- a/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java +++ b/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java @@ -1,7 +1,7 @@ package christmas.view.input.exception.message; import static christmas.global.ApplicationConstant.ERROR_PREFIX; -import static christmas.view.input.constant.InputConstant.APPLICATION_MAX_INPUT_LENGTH; +import static christmas.view.input.constant.InputNumberConstant.APPLICATION_MAX_INPUT_LENGTH; public enum BasicInputExceptionMessage { TOO_LONG_WITH_BLANKS( diff --git a/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java b/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java index e37a0ac..df41e2f 100644 --- a/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java +++ b/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java @@ -1,10 +1,11 @@ package christmas.view.input.exception.message; import static christmas.global.ApplicationConstant.ERROR_PREFIX; -import static christmas.view.input.constant.InputConstant.ORDER_DELIMITER; +import static christmas.view.input.constant.InputSymbolConstant.ORDER_DELIMITER; public enum OrdersInputExceptionMessage { - INVALID_ORDER_FORMAT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έ ν˜•μ‹μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”.(주문에 '" + ORDER_DELIMITER + "'λ₯Ό 포함해주셔야 ν•©λ‹ˆλ‹€.)"); + INVALID_ORDER_FORMAT( + ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έ ν˜•μ‹μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”.(주문에 '" + ORDER_DELIMITER.getSymbol() + "'λ₯Ό 포함해주셔야 ν•©λ‹ˆλ‹€.)"); private final String message; diff --git a/src/main/java/christmas/view/input/parser/InputParser.java b/src/main/java/christmas/view/input/parser/InputParser.java index 6eb5901..5688b21 100644 --- a/src/main/java/christmas/view/input/parser/InputParser.java +++ b/src/main/java/christmas/view/input/parser/InputParser.java @@ -1,12 +1,12 @@ package christmas.view.input.parser; -import static christmas.view.input.constant.InputConstant.APPLICATION_MAX_INPUT_LENGTH; -import static christmas.view.input.constant.InputConstant.BLANK; -import static christmas.view.input.constant.InputConstant.MENU_COUNT_INDEX; -import static christmas.view.input.constant.InputConstant.MENU_NAME_INDEX; -import static christmas.view.input.constant.InputConstant.ORDERS_DELIMITER; -import static christmas.view.input.constant.InputConstant.ORDER_DELIMITER; -import static christmas.view.input.constant.InputConstant.VOID; +import static christmas.view.input.constant.InputNumberConstant.APPLICATION_MAX_INPUT_LENGTH; +import static christmas.view.input.constant.InputNumberConstant.MENU_COUNT_INDEX; +import static christmas.view.input.constant.InputNumberConstant.MENU_NAME_INDEX; +import static christmas.view.input.constant.InputSymbolConstant.BLANK; +import static christmas.view.input.constant.InputSymbolConstant.ORDERS_DELIMITER; +import static christmas.view.input.constant.InputSymbolConstant.ORDER_DELIMITER; +import static christmas.view.input.constant.InputSymbolConstant.VOID; import static christmas.view.input.exception.message.BasicInputExceptionMessage.TOO_LONG_WITH_BLANKS; import christmas.view.input.exception.BasicInputException; @@ -45,7 +45,7 @@ public Map parseOrders(String userInput) { } private void checkLengthIsUnderUpperLimit(final String userInput) { - if (userInput.length() > APPLICATION_MAX_INPUT_LENGTH) { + if (userInput.length() > APPLICATION_MAX_INPUT_LENGTH.getValue()) { throw BasicInputException.of(TOO_LONG_WITH_BLANKS.getMessage()); } } @@ -55,23 +55,23 @@ private int parseToInt(String userInput) { } private String removeBlank(String userInput) { - if (userInput.contains(BLANK)) { - userInput = userInput.replace(BLANK, VOID); + if (userInput.contains(BLANK.getSymbol())) { + userInput = userInput.replace(BLANK.getSymbol(), VOID.getSymbol()); } return userInput; } private void validateEachOrder(final String userInput) { - Arrays.stream(userInput.split(ORDERS_DELIMITER)) + Arrays.stream(userInput.split(ORDERS_DELIMITER.getSymbol())) .forEach(orderInputValidator::validate); } private Map parseToOrderMap(String userInput) { - return Arrays.stream(userInput.split(ORDERS_DELIMITER)) - .map(orders -> orders.split(ORDER_DELIMITER)) + return Arrays.stream(userInput.split(ORDERS_DELIMITER.getSymbol())) + .map(orders -> orders.split(ORDER_DELIMITER.getSymbol())) .collect(Collectors.toMap( - order -> order[MENU_NAME_INDEX], - order -> parseToInt(order[MENU_COUNT_INDEX]) + order -> order[MENU_NAME_INDEX.getValue()], + order -> parseToInt(order[MENU_COUNT_INDEX.getValue()]) )); } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/DayInputValidator.java b/src/main/java/christmas/view/input/validator/DayInputValidator.java index 51baac6..57b78a7 100644 --- a/src/main/java/christmas/view/input/validator/DayInputValidator.java +++ b/src/main/java/christmas/view/input/validator/DayInputValidator.java @@ -1,7 +1,7 @@ package christmas.view.input.validator; -import static christmas.view.input.constant.InputConstant.DAY_MAX_INPUT_LENGTH; -import static christmas.view.input.constant.InputConstant.POSITIVE_BOUNDARY_VALUE; +import static christmas.view.input.constant.InputNumberConstant.DAY_MAX_INPUT_LENGTH; +import static christmas.view.input.constant.InputNumberConstant.POSITIVE_BOUNDARY_VALUE; import static christmas.view.input.exception.message.DayInputExceptionMessage.NOT_NUMERIC_TYPE; import static christmas.view.input.exception.message.DayInputExceptionMessage.NOT_POSITIVE; @@ -10,7 +10,7 @@ public class DayInputValidator extends BasicValidator implements PositiveIntegerCheckable { public void validate(final String day) throws BasicInputException, DayInputException { - super.validate(day, DAY_MAX_INPUT_LENGTH); + super.validate(day, DAY_MAX_INPUT_LENGTH.getValue()); validateNumeric(day); validatePositive(day); } @@ -27,7 +27,7 @@ public void validateNumeric(final String userInput) { @Override public void validatePositive(final String userInput) { int day = parseToInt(userInput); - if (day < POSITIVE_BOUNDARY_VALUE) { + if (day < POSITIVE_BOUNDARY_VALUE.getValue()) { throw DayInputException.of(NOT_POSITIVE.getMessage()); } } diff --git a/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java b/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java index 5a52b60..c7679b7 100644 --- a/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java +++ b/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java @@ -1,9 +1,9 @@ package christmas.view.input.validator; -import static christmas.view.input.constant.InputConstant.MENU_NAME_MAX_INPUT_LENGTH; +import static christmas.view.input.constant.InputNumberConstant.MENU_NAME_MAX_INPUT_LENGTH; public class MenuNameInputValidator extends BasicValidator { public void validate(final String name) { - super.validate(name, MENU_NAME_MAX_INPUT_LENGTH); + super.validate(name, MENU_NAME_MAX_INPUT_LENGTH.getValue()); } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/OrderInputValidator.java b/src/main/java/christmas/view/input/validator/OrderInputValidator.java index 469ed8b..64f89be 100644 --- a/src/main/java/christmas/view/input/validator/OrderInputValidator.java +++ b/src/main/java/christmas/view/input/validator/OrderInputValidator.java @@ -1,9 +1,9 @@ package christmas.view.input.validator; -import static christmas.view.input.constant.InputConstant.MENU_COUNT_INDEX; -import static christmas.view.input.constant.InputConstant.MENU_NAME_INDEX; -import static christmas.view.input.constant.InputConstant.ORDER_DELIMITER; -import static christmas.view.input.constant.InputConstant.ORDER_MAX_INPUT_LENGTH; +import static christmas.view.input.constant.InputNumberConstant.MENU_COUNT_INDEX; +import static christmas.view.input.constant.InputNumberConstant.MENU_NAME_INDEX; +import static christmas.view.input.constant.InputNumberConstant.ORDER_MAX_INPUT_LENGTH; +import static christmas.view.input.constant.InputSymbolConstant.ORDER_DELIMITER; import static christmas.view.input.exception.message.OrdersInputExceptionMessage.INVALID_ORDER_FORMAT; import christmas.view.input.exception.OrdersInputException; @@ -21,7 +21,7 @@ public OrderInputValidator() { } public void validate(final String order) { - super.validate(order, ORDER_MAX_INPUT_LENGTH); + super.validate(order, ORDER_MAX_INPUT_LENGTH.getValue()); validateContainingDelimiter(order); validateMenu(splitToMenu(order)); } @@ -33,16 +33,16 @@ private void validateContainingDelimiter(final String order) { } private boolean containsDelimiter(final String order) { - return order.contains(ORDER_DELIMITER); + return order.contains(ORDER_DELIMITER.getSymbol()); } private List splitToMenu(final String order) { - return Arrays.stream(order.split(ORDER_DELIMITER)) + return Arrays.stream(order.split(ORDER_DELIMITER.getSymbol())) .collect(Collectors.toList()); } private void validateMenu(List menus) { - menuNameInputValidator.validate(menus.get(MENU_NAME_INDEX)); - menuCountInputValidator.validate(menus.get(MENU_COUNT_INDEX)); + menuNameInputValidator.validate(menus.get(MENU_NAME_INDEX.getValue())); + menuCountInputValidator.validate(menus.get(MENU_COUNT_INDEX.getValue())); } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/OrdersInputValidator.java b/src/main/java/christmas/view/input/validator/OrdersInputValidator.java index 875ec68..8780bcd 100644 --- a/src/main/java/christmas/view/input/validator/OrdersInputValidator.java +++ b/src/main/java/christmas/view/input/validator/OrdersInputValidator.java @@ -1,11 +1,11 @@ package christmas.view.input.validator; -import static christmas.view.input.constant.InputConstant.ORDERS_MAX_INPUT_LENGTH; +import static christmas.view.input.constant.InputNumberConstant.ORDERS_MAX_INPUT_LENGTH; import christmas.view.input.exception.BasicInputException; public class OrdersInputValidator extends BasicValidator { public void validate(final String orders) throws BasicInputException { - super.validate(orders, ORDERS_MAX_INPUT_LENGTH); + super.validate(orders, ORDERS_MAX_INPUT_LENGTH.getValue()); } } \ No newline at end of file From 5745b52547ac9a60d01001eb659c1fe320b9c568 Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 00:08:54 +0900 Subject: [PATCH 26/89] refactor: change empty input notification to contain information about what content user input missed --- .../view/input/constant/InputSymbolConstant.java | 7 ++++++- .../message/BasicInputExceptionMessage.java | 4 ++-- .../view/input/validator/BasicValidator.java | 12 +++++++----- .../view/input/validator/DayInputValidator.java | 3 ++- .../view/input/validator/MenuNameInputValidator.java | 3 ++- .../view/input/validator/OrderInputValidator.java | 3 ++- .../view/input/validator/OrdersInputValidator.java | 3 ++- 7 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/main/java/christmas/view/input/constant/InputSymbolConstant.java b/src/main/java/christmas/view/input/constant/InputSymbolConstant.java index 3e2212f..5eb2444 100644 --- a/src/main/java/christmas/view/input/constant/InputSymbolConstant.java +++ b/src/main/java/christmas/view/input/constant/InputSymbolConstant.java @@ -4,7 +4,12 @@ public enum InputSymbolConstant { BLANK(" "), VOID(""), ORDERS_DELIMITER(","), - ORDER_DELIMITER("-"); + ORDER_DELIMITER("-"), + DAY_SYMBOL("λ‚ μ§œ"), + ORDERS_SYMBOL("μ£Όλ¬Έ λ‚΄μ—­"), + ORDER_SYMBOL("μ£Όλ¬Έ"), + MENU_NAME_SYMBOL("메뉴 이름"), + MENU_COUNT_SYMBOL("메뉴 개수"); private final String symbol; diff --git a/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java b/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java index a5bd8d2..7ec15aa 100644 --- a/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java +++ b/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java @@ -6,8 +6,8 @@ public enum BasicInputExceptionMessage { TOO_LONG_WITH_BLANKS( ERROR_PREFIX + "μ œν•œ κΈ€μž μž…λ ₯을 μ΄ˆκ³Όν–ˆμŠ΅λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”.(곡백 포함 μ΅œλŒ€" + APPLICATION_MAX_INPUT_LENGTH + "κΈ€μž μž…λ ₯ κ°€λŠ₯)"), - EMPTY(ERROR_PREFIX + "λΉ„μ–΄μžˆλŠ” μž…λ ₯κ°’μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), - TOO_LONG(ERROR_PREFIX + "μ œν•œ κΈ€μž μž…λ ₯을 μ΄ˆκ³Όν–ˆμŠ΅λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”.(곡백 μ œμ™Έ μ΅œλŒ€ %dκΈ€μž μž…λ ₯ κ°€λŠ₯)"); + EMPTY_FORMAT(ERROR_PREFIX + "λΉ„μ–΄μžˆλŠ” %s μž…λ ₯κ°’μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + TOO_LONG_FORMAT(ERROR_PREFIX + "μ œν•œ κΈ€μž μž…λ ₯을 μ΄ˆκ³Όν–ˆμŠ΅λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”.(곡백 μ œμ™Έ μ΅œλŒ€ %dκΈ€μž μž…λ ₯ κ°€λŠ₯)"); private final String message; diff --git a/src/main/java/christmas/view/input/validator/BasicValidator.java b/src/main/java/christmas/view/input/validator/BasicValidator.java index cf9a5e3..3924b4b 100644 --- a/src/main/java/christmas/view/input/validator/BasicValidator.java +++ b/src/main/java/christmas/view/input/validator/BasicValidator.java @@ -5,20 +5,22 @@ public abstract class BasicValidator { - protected void validate(final String userInput, final int maxLength) { - validateNotEmpty(userInput); + protected void validate(final String userInput, final String inputName, final int maxLength) { + validateNotEmpty(userInput, inputName); validateLengthUnderMaxLength(userInput, maxLength); } - protected void validateNotEmpty(final String userInput) { + protected void validateNotEmpty(final String userInput, final String inputName) { if (userInput.isEmpty()) { - throw BasicInputException.of(BasicInputExceptionMessage.EMPTY.getMessage()); + throw BasicInputException.of( + String.format(BasicInputExceptionMessage.EMPTY_FORMAT.getMessage(), inputName)); } } protected void validateLengthUnderMaxLength(final String userInput, final int maxLength) { if (userInput.length() > maxLength) { - throw BasicInputException.of(String.format(BasicInputExceptionMessage.TOO_LONG.getMessage(), maxLength)); + throw BasicInputException.of( + String.format(BasicInputExceptionMessage.TOO_LONG_FORMAT.getMessage(), maxLength)); } } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/DayInputValidator.java b/src/main/java/christmas/view/input/validator/DayInputValidator.java index 57b78a7..e3bbdb1 100644 --- a/src/main/java/christmas/view/input/validator/DayInputValidator.java +++ b/src/main/java/christmas/view/input/validator/DayInputValidator.java @@ -2,6 +2,7 @@ import static christmas.view.input.constant.InputNumberConstant.DAY_MAX_INPUT_LENGTH; import static christmas.view.input.constant.InputNumberConstant.POSITIVE_BOUNDARY_VALUE; +import static christmas.view.input.constant.InputSymbolConstant.DAY_SYMBOL; import static christmas.view.input.exception.message.DayInputExceptionMessage.NOT_NUMERIC_TYPE; import static christmas.view.input.exception.message.DayInputExceptionMessage.NOT_POSITIVE; @@ -10,7 +11,7 @@ public class DayInputValidator extends BasicValidator implements PositiveIntegerCheckable { public void validate(final String day) throws BasicInputException, DayInputException { - super.validate(day, DAY_MAX_INPUT_LENGTH.getValue()); + super.validate(day, DAY_SYMBOL.getSymbol(), DAY_MAX_INPUT_LENGTH.getValue()); validateNumeric(day); validatePositive(day); } diff --git a/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java b/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java index c7679b7..40a6e06 100644 --- a/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java +++ b/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java @@ -1,9 +1,10 @@ package christmas.view.input.validator; import static christmas.view.input.constant.InputNumberConstant.MENU_NAME_MAX_INPUT_LENGTH; +import static christmas.view.input.constant.InputSymbolConstant.MENU_NAME_SYMBOL; public class MenuNameInputValidator extends BasicValidator { public void validate(final String name) { - super.validate(name, MENU_NAME_MAX_INPUT_LENGTH.getValue()); + super.validate(name, MENU_NAME_SYMBOL.getSymbol(), MENU_NAME_MAX_INPUT_LENGTH.getValue()); } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/OrderInputValidator.java b/src/main/java/christmas/view/input/validator/OrderInputValidator.java index 64f89be..4deb72a 100644 --- a/src/main/java/christmas/view/input/validator/OrderInputValidator.java +++ b/src/main/java/christmas/view/input/validator/OrderInputValidator.java @@ -4,6 +4,7 @@ import static christmas.view.input.constant.InputNumberConstant.MENU_NAME_INDEX; import static christmas.view.input.constant.InputNumberConstant.ORDER_MAX_INPUT_LENGTH; import static christmas.view.input.constant.InputSymbolConstant.ORDER_DELIMITER; +import static christmas.view.input.constant.InputSymbolConstant.ORDER_SYMBOL; import static christmas.view.input.exception.message.OrdersInputExceptionMessage.INVALID_ORDER_FORMAT; import christmas.view.input.exception.OrdersInputException; @@ -21,7 +22,7 @@ public OrderInputValidator() { } public void validate(final String order) { - super.validate(order, ORDER_MAX_INPUT_LENGTH.getValue()); + super.validate(order, ORDER_SYMBOL.getSymbol(), ORDER_MAX_INPUT_LENGTH.getValue()); validateContainingDelimiter(order); validateMenu(splitToMenu(order)); } diff --git a/src/main/java/christmas/view/input/validator/OrdersInputValidator.java b/src/main/java/christmas/view/input/validator/OrdersInputValidator.java index 8780bcd..49fe20d 100644 --- a/src/main/java/christmas/view/input/validator/OrdersInputValidator.java +++ b/src/main/java/christmas/view/input/validator/OrdersInputValidator.java @@ -1,11 +1,12 @@ package christmas.view.input.validator; import static christmas.view.input.constant.InputNumberConstant.ORDERS_MAX_INPUT_LENGTH; +import static christmas.view.input.constant.InputSymbolConstant.ORDERS_SYMBOL; import christmas.view.input.exception.BasicInputException; public class OrdersInputValidator extends BasicValidator { public void validate(final String orders) throws BasicInputException { - super.validate(orders, ORDERS_MAX_INPUT_LENGTH.getValue()); + super.validate(orders, ORDERS_SYMBOL.getSymbol(), ORDERS_MAX_INPUT_LENGTH.getValue()); } } \ No newline at end of file From 4d81ca6a19fd4c1ce43a8749c2dbca76cb58a53f Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 00:32:02 +0900 Subject: [PATCH 27/89] feat: add feature to check user input about menu count is not empty --- docs/README.md | 2 +- .../message/OrdersInputExceptionMessage.java | 4 +++- .../view/input/validator/OrderInputValidator.java | 12 ++++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index 8c20312..961c743 100644 --- a/docs/README.md +++ b/docs/README.md @@ -64,7 +64,7 @@ > #### iii) `메뉴 개수`에 λŒ€ν•œ μž…λ ₯κ°’ 검증 -- [] `메뉴 개수`κ°€ λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. +- [x] `메뉴 개수`κ°€ λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. - [] `메뉴 개수`κ°€ 2κΈ€μž μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. - [] `메뉴 개수`κ°€ 숫자 ν˜•μ‹μΈμ§€ ν™•μΈν•œλ‹€. - [] `메뉴 개수`κ°€ 1 이상 μ •μˆ˜ 인지 ν™•μΈν•œλ‹€. diff --git a/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java b/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java index df41e2f..33f5c1f 100644 --- a/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java +++ b/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java @@ -5,7 +5,9 @@ public enum OrdersInputExceptionMessage { INVALID_ORDER_FORMAT( - ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έ ν˜•μ‹μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”.(주문에 '" + ORDER_DELIMITER.getSymbol() + "'λ₯Ό 포함해주셔야 ν•©λ‹ˆλ‹€.)"); + ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έ ν˜•μ‹μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”.(주문에 '" + ORDER_DELIMITER.getSymbol() + "'λ₯Ό 포함해주셔야 ν•©λ‹ˆλ‹€.)"), + EMPTY_MENU_COUNT( + ERROR_PREFIX + "λΉ„μ–΄μžˆλŠ” 메뉴 개수 μž…λ ₯κ°’μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”.('" + ORDER_DELIMITER.getSymbol() + "' 뒀에 숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.)"); private final String message; diff --git a/src/main/java/christmas/view/input/validator/OrderInputValidator.java b/src/main/java/christmas/view/input/validator/OrderInputValidator.java index 4deb72a..5328cf5 100644 --- a/src/main/java/christmas/view/input/validator/OrderInputValidator.java +++ b/src/main/java/christmas/view/input/validator/OrderInputValidator.java @@ -5,6 +5,7 @@ import static christmas.view.input.constant.InputNumberConstant.ORDER_MAX_INPUT_LENGTH; import static christmas.view.input.constant.InputSymbolConstant.ORDER_DELIMITER; import static christmas.view.input.constant.InputSymbolConstant.ORDER_SYMBOL; +import static christmas.view.input.exception.message.OrdersInputExceptionMessage.EMPTY_MENU_COUNT; import static christmas.view.input.exception.message.OrdersInputExceptionMessage.INVALID_ORDER_FORMAT; import christmas.view.input.exception.OrdersInputException; @@ -24,6 +25,7 @@ public OrderInputValidator() { public void validate(final String order) { super.validate(order, ORDER_SYMBOL.getSymbol(), ORDER_MAX_INPUT_LENGTH.getValue()); validateContainingDelimiter(order); + validateEndsWithDelimiter(order); validateMenu(splitToMenu(order)); } @@ -37,6 +39,16 @@ private boolean containsDelimiter(final String order) { return order.contains(ORDER_DELIMITER.getSymbol()); } + private void validateEndsWithDelimiter(final String order) { + if (endsWithDelimiter(order)) { + throw OrdersInputException.of(EMPTY_MENU_COUNT.getMessage()); + } + } + + private boolean endsWithDelimiter(final String order) { + return order.endsWith(ORDER_DELIMITER.getSymbol()); + } + private List splitToMenu(final String order) { return Arrays.stream(order.split(ORDER_DELIMITER.getSymbol())) .collect(Collectors.toList()); From fa00100de640e5e25901abf277e9bbc4e54126e2 Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 00:38:30 +0900 Subject: [PATCH 28/89] feat: add feature to check user input about menu count length is not more than 2 --- docs/README.md | 4 +++- .../christmas/view/input/constant/InputNumberConstant.java | 1 + .../input/exception/message/OrdersInputExceptionMessage.java | 4 +++- .../view/input/validator/MenuCountInputValidator.java | 5 ++++- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index 961c743..c9675bb 100644 --- a/docs/README.md +++ b/docs/README.md @@ -65,7 +65,9 @@ > #### iii) `메뉴 개수`에 λŒ€ν•œ μž…λ ₯κ°’ 검증 - [x] `메뉴 개수`κ°€ λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. -- [] `메뉴 개수`κ°€ 2κΈ€μž μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. +- [x] `메뉴 개수`κ°€ 2κΈ€μž μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. + - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `BasicInputException`을 λ°œμƒμ‹œν‚€κ³ ,
+ "[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. - [] `메뉴 개수`κ°€ 숫자 ν˜•μ‹μΈμ§€ ν™•μΈν•œλ‹€. - [] `메뉴 개수`κ°€ 1 이상 μ •μˆ˜ 인지 ν™•μΈν•œλ‹€. - [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `OrdersInputException`을 λ°œμƒμ‹œν‚€κ³ ,
diff --git a/src/main/java/christmas/view/input/constant/InputNumberConstant.java b/src/main/java/christmas/view/input/constant/InputNumberConstant.java index d6a99cc..099b5c0 100644 --- a/src/main/java/christmas/view/input/constant/InputNumberConstant.java +++ b/src/main/java/christmas/view/input/constant/InputNumberConstant.java @@ -5,6 +5,7 @@ public enum InputNumberConstant { ORDERS_MAX_INPUT_LENGTH(1000), ORDER_MAX_INPUT_LENGTH(50), MENU_NAME_MAX_INPUT_LENGTH(30), + MENU_COUNT_MAX_INPUT_LENGTH(2), DAY_MAX_INPUT_LENGTH(2), MENU_NAME_INDEX(0), MENU_COUNT_INDEX(1), diff --git a/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java b/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java index 33f5c1f..ade55db 100644 --- a/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java +++ b/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java @@ -1,13 +1,15 @@ package christmas.view.input.exception.message; import static christmas.global.ApplicationConstant.ERROR_PREFIX; +import static christmas.view.input.constant.InputSymbolConstant.MENU_COUNT_SYMBOL; import static christmas.view.input.constant.InputSymbolConstant.ORDER_DELIMITER; public enum OrdersInputExceptionMessage { INVALID_ORDER_FORMAT( ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έ ν˜•μ‹μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”.(주문에 '" + ORDER_DELIMITER.getSymbol() + "'λ₯Ό 포함해주셔야 ν•©λ‹ˆλ‹€.)"), EMPTY_MENU_COUNT( - ERROR_PREFIX + "λΉ„μ–΄μžˆλŠ” 메뉴 개수 μž…λ ₯κ°’μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”.('" + ORDER_DELIMITER.getSymbol() + "' 뒀에 숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.)"); + ERROR_PREFIX + "λΉ„μ–΄μžˆλŠ” " + MENU_COUNT_SYMBOL.getSymbol() + " μž…λ ₯κ°’μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”.('" + + ORDER_DELIMITER.getSymbol() + "' 뒀에 숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.)"); private final String message; diff --git a/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java b/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java index 3cb6f17..24ea20f 100644 --- a/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java +++ b/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java @@ -1,7 +1,10 @@ package christmas.view.input.validator; +import static christmas.view.input.constant.InputNumberConstant.MENU_COUNT_MAX_INPUT_LENGTH; +import static christmas.view.input.constant.InputSymbolConstant.MENU_COUNT_SYMBOL; + public class MenuCountInputValidator extends BasicValidator { public void validate(final String count) { - + super.validate(count, MENU_COUNT_SYMBOL.getSymbol(), MENU_COUNT_MAX_INPUT_LENGTH.getValue()); } } \ No newline at end of file From f011be9d20561cdfc82f7f316188cc34306bb9c8 Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 09:39:08 +0900 Subject: [PATCH 29/89] feat: add feature to check user input about menu name exists in menu list --- docs/README.md | 4 ++-- src/main/java/christmas/domain/DayPerMonth.java | 2 +- src/main/java/christmas/domain/Order.java | 12 ++++++++---- .../java/christmas/domain/constant/Menu.java | 15 +++++++++++++-- .../domain/exception/InvalidDayException.java | 4 ++-- .../domain/exception/InvalidMenuException.java | 11 +++++++++++ .../message/InvalidDayExceptionMessage.java | 12 ++++++------ .../message/InvalidMenuExceptionMessage.java | 17 +++++++++++++++++ .../message/OrdersInputExceptionMessage.java | 4 +--- 9 files changed, 61 insertions(+), 20 deletions(-) create mode 100644 src/main/java/christmas/domain/exception/InvalidMenuException.java create mode 100644 src/main/java/christmas/domain/exception/message/InvalidMenuExceptionMessage.java diff --git a/docs/README.md b/docs/README.md index c9675bb..a2954d1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -58,8 +58,8 @@ - [x] `메뉴 이름`이 30κΈ€μž μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `BasicInputException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. -- [] `메뉴 이름`이 λ©”λ‰΄νŒμ— μžˆλŠ” 메뉴인지 ν™•μΈν•œλ‹€. - - [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `OrdersInputException`을 λ°œμƒμ‹œν‚€κ³ ,
+- [x] `메뉴 이름`이 λ©”λ‰΄νŒμ— μžˆλŠ” 메뉴인지 ν™•μΈν•œλ‹€. + - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `InvalidMenuException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”." λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. > #### iii) `메뉴 개수`에 λŒ€ν•œ μž…λ ₯κ°’ 검증 diff --git a/src/main/java/christmas/domain/DayPerMonth.java b/src/main/java/christmas/domain/DayPerMonth.java index 1bc3b01..5cc6b64 100644 --- a/src/main/java/christmas/domain/DayPerMonth.java +++ b/src/main/java/christmas/domain/DayPerMonth.java @@ -12,7 +12,7 @@ public DayPerMonth() { protected void validate(final int day) { if (!isInAppropriateRange(day)) { - throw InvalidDayException.of(NOT_IN_APPROPRIATE_RANGE.getMesage()); + throw InvalidDayException.of(NOT_IN_APPROPRIATE_RANGE.getMessage()); } } diff --git a/src/main/java/christmas/domain/Order.java b/src/main/java/christmas/domain/Order.java index e09b9cf..6d290a7 100644 --- a/src/main/java/christmas/domain/Order.java +++ b/src/main/java/christmas/domain/Order.java @@ -11,12 +11,16 @@ private Order(Menu menu, final int count) { this.count = count; } - public static Order of(Menu menu, final int count) { - validate(menu, count); - return new Order(menu, count); + public static Order of(final String menuName, final int count) { + validate(menuName, count); + return new Order(Menu.valueOf(menuName), count); } - private static void validate(Menu menu, final int count) { + private static void validate(final String menuName, final int count) { + validateExistMenu(menuName); + } + private static void validateExistMenu(final String menuName) { + Menu menu = Menu.searchByName(menuName); } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/constant/Menu.java b/src/main/java/christmas/domain/constant/Menu.java index f3293e8..ff5545f 100644 --- a/src/main/java/christmas/domain/constant/Menu.java +++ b/src/main/java/christmas/domain/constant/Menu.java @@ -5,6 +5,12 @@ import static christmas.domain.constant.FoodType.DESSERT; import static christmas.domain.constant.FoodType.MAIN; +import christmas.domain.exception.InvalidDayException; +import christmas.domain.exception.InvalidMenuException; +import christmas.domain.exception.message.InvalidDayExceptionMessage; +import christmas.domain.exception.message.InvalidMenuExceptionMessage; +import java.util.Arrays; + public enum Menu { MUSHROOM_SOUP("μ–‘μ†‘μ΄μˆ˜ν”„", 6000, APPETIZER), TAPAS("νƒ€νŒŒμŠ€", 5500, APPETIZER), @@ -48,7 +54,12 @@ public boolean isWeekendPromotionApplicable() { return foodType.isWeekendPromotionApplicable(); } - public static Menu findByName(final String name) { - return Menu.valueOf(name); + public static Menu searchByName(final String name) { + return Arrays.stream(Menu.values()) + .filter(menu -> menu.name().equalsIgnoreCase(name)) + .findFirst() + .orElseThrow(() -> InvalidMenuException.of(InvalidMenuExceptionMessage.NOT_EXISTING_MENU.getMessage())); } + + private } \ No newline at end of file diff --git a/src/main/java/christmas/domain/exception/InvalidDayException.java b/src/main/java/christmas/domain/exception/InvalidDayException.java index 0a41c4b..06fc278 100644 --- a/src/main/java/christmas/domain/exception/InvalidDayException.java +++ b/src/main/java/christmas/domain/exception/InvalidDayException.java @@ -5,7 +5,7 @@ private InvalidDayException(final String invalidDayExceptionMessage) { super(invalidDayExceptionMessage); } - public static InvalidDayException of(final String userMoneyInputExceptionMessage) { - return new InvalidDayException(userMoneyInputExceptionMessage); + public static InvalidDayException of(final String invalidDayExceptionMessage) { + return new InvalidDayException(invalidDayExceptionMessage); } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/exception/InvalidMenuException.java b/src/main/java/christmas/domain/exception/InvalidMenuException.java new file mode 100644 index 0000000..06dd78d --- /dev/null +++ b/src/main/java/christmas/domain/exception/InvalidMenuException.java @@ -0,0 +1,11 @@ +package christmas.domain.exception; + +public class InvalidMenuException extends IllegalArgumentException { + private InvalidMenuException(final String invalidMenuExceptionMessage) { + super(invalidMenuExceptionMessage); + } + + public static InvalidMenuException of(final String invalidMenuExceptionMessage) { + return new InvalidMenuException(invalidMenuExceptionMessage); + } +} \ No newline at end of file diff --git a/src/main/java/christmas/domain/exception/message/InvalidDayExceptionMessage.java b/src/main/java/christmas/domain/exception/message/InvalidDayExceptionMessage.java index 19dc6a0..bce7205 100644 --- a/src/main/java/christmas/domain/exception/message/InvalidDayExceptionMessage.java +++ b/src/main/java/christmas/domain/exception/message/InvalidDayExceptionMessage.java @@ -5,13 +5,13 @@ public enum InvalidDayExceptionMessage { NOT_IN_APPROPRIATE_RANGE(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); - private final String mesage; + private final String message; - InvalidDayExceptionMessage(final String mesage) { - this.mesage = mesage; + InvalidDayExceptionMessage(final String message) { + this.message = message; } - public String getMesage() { - return mesage; + public String getMessage() { + return message; } -} +} \ No newline at end of file diff --git a/src/main/java/christmas/domain/exception/message/InvalidMenuExceptionMessage.java b/src/main/java/christmas/domain/exception/message/InvalidMenuExceptionMessage.java new file mode 100644 index 0000000..c481234 --- /dev/null +++ b/src/main/java/christmas/domain/exception/message/InvalidMenuExceptionMessage.java @@ -0,0 +1,17 @@ +package christmas.domain.exception.message; + +import static christmas.global.ApplicationConstant.ERROR_PREFIX; + +public enum InvalidMenuExceptionMessage { + NOT_EXISTING_MENU(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); + + private final String message; + + InvalidMenuExceptionMessage(final String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} \ No newline at end of file diff --git a/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java b/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java index ade55db..b50583c 100644 --- a/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java +++ b/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java @@ -1,15 +1,13 @@ package christmas.view.input.exception.message; import static christmas.global.ApplicationConstant.ERROR_PREFIX; -import static christmas.view.input.constant.InputSymbolConstant.MENU_COUNT_SYMBOL; import static christmas.view.input.constant.InputSymbolConstant.ORDER_DELIMITER; public enum OrdersInputExceptionMessage { INVALID_ORDER_FORMAT( ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έ ν˜•μ‹μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”.(주문에 '" + ORDER_DELIMITER.getSymbol() + "'λ₯Ό 포함해주셔야 ν•©λ‹ˆλ‹€.)"), EMPTY_MENU_COUNT( - ERROR_PREFIX + "λΉ„μ–΄μžˆλŠ” " + MENU_COUNT_SYMBOL.getSymbol() + " μž…λ ₯κ°’μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”.('" - + ORDER_DELIMITER.getSymbol() + "' 뒀에 숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.)"); + ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); private final String message; From 8f75c9479916a9833fe70738e11cee743df79fb2 Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 09:48:08 +0900 Subject: [PATCH 30/89] docs: change constraint about error message format to meet requirement --- docs/README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/README.md b/docs/README.md index a2954d1..357838a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -22,7 +22,7 @@ - [x] μ˜ˆμ•½ λ‚ μ§œκ°€ 숫자 ν˜•μ‹μΈμ§€ ν™•μΈν•œλ‹€. - [x] μ˜ˆμ•½ λ‚ μ§œκ°€ μ–‘μˆ˜μΈμ§€ ν™•μΈν•œλ‹€. - [x] μœ„ 경우λ₯Ό λ§Œμ‘±ν•˜μ§€ λͺ»ν•˜λŠ” 경우 `DayInputException`을 λ°œμƒμ‹œν‚€κ³ ,
- "[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ˜ˆμ•½ λ‚ μ§œ` μž…λ ₯을 λ°›λŠ”λ‹€. + "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œλ‹€.
이후 λ‹€μ‹œ `μ˜ˆμ•½ λ‚ μ§œ` μž…λ ₯을 λ°›λŠ”λ‹€. > ### πŸ”– μ£Όλ¬Έ λ‚΄μ—­ μž…λ ₯ 및 μž…λ ₯κ°’ 검증 @@ -31,7 +31,7 @@ - [x] `μ£Όλ¬Έ λ‚΄μ—­`이 λΉ„μ–΄μžˆμ§€ μ•Šμ€μ§€ ν™•μΈν•œλ‹€. - [x] `μ£Όλ¬Έ λ‚΄μ—­`이 1000κΈ€μž μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `BasicInputException`을 λ°œμƒμ‹œν‚€κ³ ,
- "[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. + "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. - [x] μ£Όλ¬Έ 내역에 곡백이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. - [x] 곡백이 μ•ž 뒀에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•œλ‹€. - [x] 곡백이 κΈ€μž 쀑간에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•΄ 곡백 사이λ₯Ό 이어쀀닀. @@ -44,20 +44,20 @@ - [x] `μ£Όλ¬Έ`이 λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. - [x] `μ£Όλ¬Έ`이 50κΈ€μž μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `BasicInputException`을 λ°œμƒμ‹œν‚€κ³ ,
- "[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. + "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. - [x] `μ£Όλ¬Έ`이 λŒ€μ‹œ(-)λ₯Ό ν¬ν•¨ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€. - [x] `μ£Όλ¬Έ` μ•ž 뒀에 곡백이 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€. - [x] 곡백이 μ•žλ’€μ— ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•œλ‹€. - [x] 곡백이 κΈ€μž 쀑간에 ν¬ν•¨λ˜μ–΄ μžˆμ„ 경우, 곡백을 μ œκ±°ν•΄ 곡백 사이λ₯Ό 이어쀀닀. - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `OrdersInputException`을 λ°œμƒμ‹œν‚€κ³ ,
- "[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. + "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. > #### ii) βœ‰οΈ`메뉴 이름`에 λŒ€ν•œ μž…λ ₯κ°’ 검증 - [x] `메뉴 이름`이 λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. - [x] `메뉴 이름`이 30κΈ€μž μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `BasicInputException`을 λ°œμƒμ‹œν‚€κ³ ,
- "[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. + "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. - [x] `메뉴 이름`이 λ©”λ‰΄νŒμ— μžˆλŠ” 메뉴인지 ν™•μΈν•œλ‹€. - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `InvalidMenuException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”." λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. @@ -67,11 +67,11 @@ - [x] `메뉴 개수`κ°€ λΉ„μ–΄μžˆλŠ” 값이 μ•„λ‹˜μ„ ν™•μΈν•œλ‹€. - [x] `메뉴 개수`κ°€ 2κΈ€μž μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `BasicInputException`을 λ°œμƒμ‹œν‚€κ³ ,
- "[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. + "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. - [] `메뉴 개수`κ°€ 숫자 ν˜•μ‹μΈμ§€ ν™•μΈν•œλ‹€. - [] `메뉴 개수`κ°€ 1 이상 μ •μˆ˜ 인지 ν™•μΈν•œλ‹€. - [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `OrdersInputException`을 λ°œμƒμ‹œν‚€κ³ ,
- "[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. + "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. > #### πŸ”– iv) `μ£Όλ¬Έ λ‚΄μ—­` μž…λ ₯κ°’ μž¬κ²€μ¦ @@ -79,7 +79,7 @@ - [] `μ£Όλ¬Έ λ‚΄μ—­`을 μ·¨ν•©ν–ˆμ„ λ•Œ, `메뉴 개수`κ°€ `20개`κ°€ λ„˜μ–΄κ°€λŠ”μ§€ ν™•μΈν•œλ‹€. - [] `μ£Όλ¬Έ λ‚΄μ—­`을 μ·¨ν•©ν–ˆμ„ λ•Œ, `μ£Όλ¬Έ λ‚΄μ—­`에 음료수만 μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. - [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `OrdersInputException`을 λ°œμƒμ‹œν‚€κ³ ,
- "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”." λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. + "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. ## 🧩 [ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 κ΄€λ ¨ κΈ°λŠ₯ ] @@ -87,7 +87,7 @@ - μ‚¬μš©μžμ—κ²Œ μž…λ ₯받은 λ‚ μ§œμ— λŒ€ν•΄ - [x] λ‚ μ§œκ°€ 1 이상 31 μ΄ν•˜μ˜ μˆ«μžμΈμ§€ ν™•μΈν•œλ‹€. - - [x] 1 이상 31 μ΄ν•˜μ˜ μˆ«μžκ°€ μ•„λ‹Œ 경우, `InvalidDayException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”." 의 λ©”μ‹œμ§€λ₯Ό + - [x] 1 이상 31 μ΄ν•˜μ˜ μˆ«μžκ°€ μ•„λ‹Œ 경우, `InvalidDayException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œλ‹€. - [] ν•΄λ‹Ή λ‚ μ§œκ°€ 크리슀마슀 D-Day ν”„λ‘œλͺ¨μ…˜ λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. - [] 평일 할인 λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. From add32f1b62a5b1fcd39c6b046169850112ac20b6 Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 10:05:37 +0900 Subject: [PATCH 31/89] refactor: change error message format to meet requirement --- .../java/christmas/domain/constant/Menu.java | 8 ++------ .../view/input/constant/InputSymbolConstant.java | 5 +---- .../message/BasicInputExceptionMessage.java | 7 +++---- .../message/DayInputExceptionMessage.java | 4 ++-- .../message/OrdersInputExceptionMessage.java | 7 ++----- .../christmas/view/input/parser/InputParser.java | 16 ++++++++++++---- .../view/input/validator/BasicValidator.java | 14 +++++++------- .../input/validator/MenuCountInputValidator.java | 4 ++-- .../input/validator/MenuNameInputValidator.java | 4 ++-- .../input/validator/OrdersInputValidator.java | 4 ++-- 10 files changed, 35 insertions(+), 38 deletions(-) diff --git a/src/main/java/christmas/domain/constant/Menu.java b/src/main/java/christmas/domain/constant/Menu.java index ff5545f..34cbdc1 100644 --- a/src/main/java/christmas/domain/constant/Menu.java +++ b/src/main/java/christmas/domain/constant/Menu.java @@ -5,9 +5,7 @@ import static christmas.domain.constant.FoodType.DESSERT; import static christmas.domain.constant.FoodType.MAIN; -import christmas.domain.exception.InvalidDayException; import christmas.domain.exception.InvalidMenuException; -import christmas.domain.exception.message.InvalidDayExceptionMessage; import christmas.domain.exception.message.InvalidMenuExceptionMessage; import java.util.Arrays; @@ -21,12 +19,12 @@ public enum Menu { SEAFOOD_PASTA("ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€", 35_000, MAIN), CHRISTMAS_PASTA("ν¬λ¦¬μŠ€λ§ˆμŠ€νŒŒμŠ€νƒ€", 25_000, MAIN), - CHOCHLATE_CAKE("μ΄ˆμ½”μΌ€μ΄ν¬", 15_000, DESSERT), + CHOCOLATE_CAKE("μ΄ˆμ½”μΌ€μ΄ν¬", 15_000, DESSERT), ICE_CREAM("μ•„μ΄μŠ€ν¬λ¦Ό", 5000, DESSERT), ZERO_COKE("제둜콜라", 3000, BEVERAGE), RED_WINE("λ ˆλ“œμ™€μΈ", 60_000, BEVERAGE), - CAHAMPAGNE("μƒ΄νŽ˜μΈ", 25_000, BEVERAGE); + CHAMPAGNE("μƒ΄νŽ˜μΈ", 25_000, BEVERAGE); private final String name; private final int price; @@ -60,6 +58,4 @@ public static Menu searchByName(final String name) { .findFirst() .orElseThrow(() -> InvalidMenuException.of(InvalidMenuExceptionMessage.NOT_EXISTING_MENU.getMessage())); } - - private } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/constant/InputSymbolConstant.java b/src/main/java/christmas/view/input/constant/InputSymbolConstant.java index 5eb2444..f7b9bee 100644 --- a/src/main/java/christmas/view/input/constant/InputSymbolConstant.java +++ b/src/main/java/christmas/view/input/constant/InputSymbolConstant.java @@ -6,10 +6,7 @@ public enum InputSymbolConstant { ORDERS_DELIMITER(","), ORDER_DELIMITER("-"), DAY_SYMBOL("λ‚ μ§œ"), - ORDERS_SYMBOL("μ£Όλ¬Έ λ‚΄μ—­"), - ORDER_SYMBOL("μ£Όλ¬Έ"), - MENU_NAME_SYMBOL("메뉴 이름"), - MENU_COUNT_SYMBOL("메뉴 개수"); + ORDER_SYMBOL("μ£Όλ¬Έ"); private final String symbol; diff --git a/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java b/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java index 7ec15aa..9cb470a 100644 --- a/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java +++ b/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java @@ -1,13 +1,12 @@ package christmas.view.input.exception.message; import static christmas.global.ApplicationConstant.ERROR_PREFIX; -import static christmas.view.input.constant.InputNumberConstant.APPLICATION_MAX_INPUT_LENGTH; public enum BasicInputExceptionMessage { TOO_LONG_WITH_BLANKS( - ERROR_PREFIX + "μ œν•œ κΈ€μž μž…λ ₯을 μ΄ˆκ³Όν–ˆμŠ΅λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”.(곡백 포함 μ΅œλŒ€" + APPLICATION_MAX_INPUT_LENGTH + "κΈ€μž μž…λ ₯ κ°€λŠ₯)"), - EMPTY_FORMAT(ERROR_PREFIX + "λΉ„μ–΄μžˆλŠ” %s μž…λ ₯κ°’μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), - TOO_LONG_FORMAT(ERROR_PREFIX + "μ œν•œ κΈ€μž μž…λ ₯을 μ΄ˆκ³Όν–ˆμŠ΅λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”.(곡백 μ œμ™Έ μ΅œλŒ€ %dκΈ€μž μž…λ ₯ κ°€λŠ₯)"); + ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ %sμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + EMPTY_FORMAT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ %sμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + TOO_LONG_FORMAT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ %sμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); private final String message; diff --git a/src/main/java/christmas/view/input/exception/message/DayInputExceptionMessage.java b/src/main/java/christmas/view/input/exception/message/DayInputExceptionMessage.java index c296513..c2baba3 100644 --- a/src/main/java/christmas/view/input/exception/message/DayInputExceptionMessage.java +++ b/src/main/java/christmas/view/input/exception/message/DayInputExceptionMessage.java @@ -3,8 +3,8 @@ import static christmas.global.ApplicationConstant.ERROR_PREFIX; public enum DayInputExceptionMessage { - NOT_NUMERIC_TYPE(ERROR_PREFIX + "λ‚ μ§œ μž…λ ₯은 숫자 ν˜•μ‹μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), - NOT_POSITIVE(ERROR_PREFIX + "λ‚ μ§œ μž…λ ₯은 μ–‘μˆ˜μ—¬μ•Ό ν•©λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); + NOT_NUMERIC_TYPE(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + NOT_POSITIVE(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); private final String message; diff --git a/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java b/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java index b50583c..1b6100d 100644 --- a/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java +++ b/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java @@ -1,13 +1,10 @@ package christmas.view.input.exception.message; import static christmas.global.ApplicationConstant.ERROR_PREFIX; -import static christmas.view.input.constant.InputSymbolConstant.ORDER_DELIMITER; public enum OrdersInputExceptionMessage { - INVALID_ORDER_FORMAT( - ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έ ν˜•μ‹μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”.(주문에 '" + ORDER_DELIMITER.getSymbol() + "'λ₯Ό 포함해주셔야 ν•©λ‹ˆλ‹€.)"), - EMPTY_MENU_COUNT( - ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); + INVALID_ORDER_FORMAT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + EMPTY_MENU_COUNT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); private final String message; diff --git a/src/main/java/christmas/view/input/parser/InputParser.java b/src/main/java/christmas/view/input/parser/InputParser.java index 5688b21..5a2da1e 100644 --- a/src/main/java/christmas/view/input/parser/InputParser.java +++ b/src/main/java/christmas/view/input/parser/InputParser.java @@ -4,8 +4,10 @@ import static christmas.view.input.constant.InputNumberConstant.MENU_COUNT_INDEX; import static christmas.view.input.constant.InputNumberConstant.MENU_NAME_INDEX; import static christmas.view.input.constant.InputSymbolConstant.BLANK; +import static christmas.view.input.constant.InputSymbolConstant.DAY_SYMBOL; import static christmas.view.input.constant.InputSymbolConstant.ORDERS_DELIMITER; import static christmas.view.input.constant.InputSymbolConstant.ORDER_DELIMITER; +import static christmas.view.input.constant.InputSymbolConstant.ORDER_SYMBOL; import static christmas.view.input.constant.InputSymbolConstant.VOID; import static christmas.view.input.exception.message.BasicInputExceptionMessage.TOO_LONG_WITH_BLANKS; @@ -30,23 +32,29 @@ public InputParser() { } public int parseDay(String userInput) throws BasicInputException, DayInputException { - checkLengthIsUnderUpperLimit(userInput); + checkDayLengthIsUnderUpperLimit(userInput); userInput = removeBlank(userInput); dayInputValidator.validate(userInput); return parseToInt(userInput); } public Map parseOrders(String userInput) { - checkLengthIsUnderUpperLimit(userInput); + checkOrdersLengthIsUnderUpperLimit(userInput); userInput = removeBlank(userInput); ordersInputValidator.validate(userInput); validateEachOrder(userInput); return parseToOrderMap(userInput); } - private void checkLengthIsUnderUpperLimit(final String userInput) { + private void checkDayLengthIsUnderUpperLimit(final String userInput) { if (userInput.length() > APPLICATION_MAX_INPUT_LENGTH.getValue()) { - throw BasicInputException.of(TOO_LONG_WITH_BLANKS.getMessage()); + throw BasicInputException.of(String.format(TOO_LONG_WITH_BLANKS.getMessage(), DAY_SYMBOL.getSymbol())); + } + } + + private void checkOrdersLengthIsUnderUpperLimit(final String userInput) { + if (userInput.length() > APPLICATION_MAX_INPUT_LENGTH.getValue()) { + throw BasicInputException.of(String.format(TOO_LONG_WITH_BLANKS.getMessage(), ORDER_SYMBOL.getSymbol())); } } diff --git a/src/main/java/christmas/view/input/validator/BasicValidator.java b/src/main/java/christmas/view/input/validator/BasicValidator.java index 3924b4b..fef9a8a 100644 --- a/src/main/java/christmas/view/input/validator/BasicValidator.java +++ b/src/main/java/christmas/view/input/validator/BasicValidator.java @@ -5,22 +5,22 @@ public abstract class BasicValidator { - protected void validate(final String userInput, final String inputName, final int maxLength) { - validateNotEmpty(userInput, inputName); - validateLengthUnderMaxLength(userInput, maxLength); + protected void validate(final String userInput, final String inputType, final int maxLength) { + validateNotEmpty(userInput, inputType); + validateLengthUnderMaxLength(userInput, inputType, maxLength); } - protected void validateNotEmpty(final String userInput, final String inputName) { + protected void validateNotEmpty(final String userInput, final String inputType) { if (userInput.isEmpty()) { throw BasicInputException.of( - String.format(BasicInputExceptionMessage.EMPTY_FORMAT.getMessage(), inputName)); + String.format(BasicInputExceptionMessage.EMPTY_FORMAT.getMessage(), inputType)); } } - protected void validateLengthUnderMaxLength(final String userInput, final int maxLength) { + protected void validateLengthUnderMaxLength(final String userInput, final String inputType, final int maxLength) { if (userInput.length() > maxLength) { throw BasicInputException.of( - String.format(BasicInputExceptionMessage.TOO_LONG_FORMAT.getMessage(), maxLength)); + String.format(BasicInputExceptionMessage.TOO_LONG_FORMAT.getMessage(), inputType)); } } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java b/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java index 24ea20f..f7d897f 100644 --- a/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java +++ b/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java @@ -1,10 +1,10 @@ package christmas.view.input.validator; import static christmas.view.input.constant.InputNumberConstant.MENU_COUNT_MAX_INPUT_LENGTH; -import static christmas.view.input.constant.InputSymbolConstant.MENU_COUNT_SYMBOL; +import static christmas.view.input.constant.InputSymbolConstant.ORDER_SYMBOL; public class MenuCountInputValidator extends BasicValidator { public void validate(final String count) { - super.validate(count, MENU_COUNT_SYMBOL.getSymbol(), MENU_COUNT_MAX_INPUT_LENGTH.getValue()); + super.validate(count, ORDER_SYMBOL.getSymbol(), MENU_COUNT_MAX_INPUT_LENGTH.getValue()); } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java b/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java index 40a6e06..511b2e6 100644 --- a/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java +++ b/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java @@ -1,10 +1,10 @@ package christmas.view.input.validator; import static christmas.view.input.constant.InputNumberConstant.MENU_NAME_MAX_INPUT_LENGTH; -import static christmas.view.input.constant.InputSymbolConstant.MENU_NAME_SYMBOL; +import static christmas.view.input.constant.InputSymbolConstant.ORDER_SYMBOL; public class MenuNameInputValidator extends BasicValidator { public void validate(final String name) { - super.validate(name, MENU_NAME_SYMBOL.getSymbol(), MENU_NAME_MAX_INPUT_LENGTH.getValue()); + super.validate(name, ORDER_SYMBOL.getSymbol(), MENU_NAME_MAX_INPUT_LENGTH.getValue()); } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/OrdersInputValidator.java b/src/main/java/christmas/view/input/validator/OrdersInputValidator.java index 49fe20d..dac57ab 100644 --- a/src/main/java/christmas/view/input/validator/OrdersInputValidator.java +++ b/src/main/java/christmas/view/input/validator/OrdersInputValidator.java @@ -1,12 +1,12 @@ package christmas.view.input.validator; import static christmas.view.input.constant.InputNumberConstant.ORDERS_MAX_INPUT_LENGTH; -import static christmas.view.input.constant.InputSymbolConstant.ORDERS_SYMBOL; +import static christmas.view.input.constant.InputSymbolConstant.ORDER_SYMBOL; import christmas.view.input.exception.BasicInputException; public class OrdersInputValidator extends BasicValidator { public void validate(final String orders) throws BasicInputException { - super.validate(orders, ORDERS_SYMBOL.getSymbol(), ORDERS_MAX_INPUT_LENGTH.getValue()); + super.validate(orders, ORDER_SYMBOL.getSymbol(), ORDERS_MAX_INPUT_LENGTH.getValue()); } } \ No newline at end of file From c2e1fe8005820b1b7ad53e2a2afb98c480995f6f Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 10:40:18 +0900 Subject: [PATCH 32/89] fix: fix problem that exception is not thrown when menu name input is not in application menu list --- docs/README.md | 6 ++++-- .../christmas/controller/PromotionController.java | 3 ++- src/main/java/christmas/domain/DecemberDay.java | 4 +++- src/main/java/christmas/domain/Order.java | 14 +++----------- src/main/java/christmas/domain/Orders.java | 2 +- src/main/java/christmas/domain/constant/Menu.java | 6 +++--- src/main/java/christmas/service/OrdersService.java | 12 +++++++++++- 7 files changed, 27 insertions(+), 20 deletions(-) diff --git a/docs/README.md b/docs/README.md index 357838a..1d6a1da 100644 --- a/docs/README.md +++ b/docs/README.md @@ -8,7 +8,9 @@ - [x] λͺ¨λ“  μ‚¬μš©μž μž…λ ₯값은 곡백 포함 길이 2000κΈ€μž μ΄ν•˜λ‘œ ν•œλ‹€. - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `BasicInputException`을 λ°œμƒμ‹œν‚€κ³ ,
- "[ERROR]" 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ μž…λ ₯을 λ°›λŠ”λ‹€. + μž…λ ₯ μ’…λ₯˜μ— 따라 "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”." λ˜λŠ”
"[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ + ν•΄λ‹Ή μž…λ ₯ + μ’…λ₯˜(λ‚ μ§œ ν˜Ήμ€ μ£Όλ¬Έ)을 λ°›λŠ”λ‹€. > ### πŸ—“ μ˜ˆμ•½ λ‚ μ§œ μž…λ ₯ 및 μž…λ ₯κ°’ 검증 @@ -22,7 +24,7 @@ - [x] μ˜ˆμ•½ λ‚ μ§œκ°€ 숫자 ν˜•μ‹μΈμ§€ ν™•μΈν•œλ‹€. - [x] μ˜ˆμ•½ λ‚ μ§œκ°€ μ–‘μˆ˜μΈμ§€ ν™•μΈν•œλ‹€. - [x] μœ„ 경우λ₯Ό λ§Œμ‘±ν•˜μ§€ λͺ»ν•˜λŠ” 경우 `DayInputException`을 λ°œμƒμ‹œν‚€κ³ ,
- "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œλ‹€.
이후 λ‹€μ‹œ `μ˜ˆμ•½ λ‚ μ§œ` μž…λ ₯을 λ°›λŠ”λ‹€. + "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ˜ˆμ•½ λ‚ μ§œ` μž…λ ₯을 λ°›λŠ”λ‹€. > ### πŸ”– μ£Όλ¬Έ λ‚΄μ—­ μž…λ ₯ 및 μž…λ ₯κ°’ 검증 diff --git a/src/main/java/christmas/controller/PromotionController.java b/src/main/java/christmas/controller/PromotionController.java index dcb752d..3e1451c 100644 --- a/src/main/java/christmas/controller/PromotionController.java +++ b/src/main/java/christmas/controller/PromotionController.java @@ -3,6 +3,7 @@ import christmas.domain.DecemberDay; import christmas.domain.Orders; import christmas.domain.exception.InvalidDayException; +import christmas.domain.exception.InvalidMenuException; import christmas.service.DayService; import christmas.service.OrdersService; import christmas.view.input.InputView; @@ -50,7 +51,7 @@ private Orders insertOrders() { try { Map orders = askToInsertOrders(); return ordersService.createOrders(orders); - } catch (BasicInputException | OrdersInputException e) { + } catch (BasicInputException | OrdersInputException | InvalidMenuException e) { outputView.printErrorMessage(e.getMessage()); return insertOrders(); } diff --git a/src/main/java/christmas/domain/DecemberDay.java b/src/main/java/christmas/domain/DecemberDay.java index d0be53c..c14eade 100644 --- a/src/main/java/christmas/domain/DecemberDay.java +++ b/src/main/java/christmas/domain/DecemberDay.java @@ -3,6 +3,8 @@ import static christmas.domain.constant.DayConstant.DECEMBER_FIRST_DAY; import static christmas.domain.constant.DayConstant.DECEMBER_LAST_DAY; +import christmas.domain.exception.InvalidDayException; + public class DecemberDay extends DayPerMonth { private final boolean isChristmasPromotionApplicable; private final boolean isWeekend; @@ -16,7 +18,7 @@ private DecemberDay(final int day, final boolean isChristmasPromotionApplicable, this.hasStar = hasStar; } - public static DecemberDay from(final int day) { + public static DecemberDay from(final int day) throws InvalidDayException { return new DecemberDay(day, judgeIsChristmasPromotionApplicable(day), judgeIsWeekend(day), judgeHasStar(day)); } diff --git a/src/main/java/christmas/domain/Order.java b/src/main/java/christmas/domain/Order.java index 6d290a7..98c3ec2 100644 --- a/src/main/java/christmas/domain/Order.java +++ b/src/main/java/christmas/domain/Order.java @@ -1,6 +1,7 @@ package christmas.domain; import christmas.domain.constant.Menu; +import christmas.domain.exception.InvalidMenuException; public class Order { private final Menu menu; @@ -11,16 +12,7 @@ private Order(Menu menu, final int count) { this.count = count; } - public static Order of(final String menuName, final int count) { - validate(menuName, count); - return new Order(Menu.valueOf(menuName), count); - } - - private static void validate(final String menuName, final int count) { - validateExistMenu(menuName); - } - - private static void validateExistMenu(final String menuName) { - Menu menu = Menu.searchByName(menuName); + public static Order of(final String menuName, final int count) throws InvalidMenuException { + return new Order(Menu.searchByName(menuName), count); } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/Orders.java b/src/main/java/christmas/domain/Orders.java index ac4620c..00c0d10 100644 --- a/src/main/java/christmas/domain/Orders.java +++ b/src/main/java/christmas/domain/Orders.java @@ -9,7 +9,7 @@ private Orders(List orders) { this.orders = orders; } - private static Orders from(List orders) { + public static Orders from(List orders) { validate(orders); return new Orders(orders); } diff --git a/src/main/java/christmas/domain/constant/Menu.java b/src/main/java/christmas/domain/constant/Menu.java index 34cbdc1..59b30d8 100644 --- a/src/main/java/christmas/domain/constant/Menu.java +++ b/src/main/java/christmas/domain/constant/Menu.java @@ -4,9 +4,9 @@ import static christmas.domain.constant.FoodType.BEVERAGE; import static christmas.domain.constant.FoodType.DESSERT; import static christmas.domain.constant.FoodType.MAIN; +import static christmas.domain.exception.message.InvalidMenuExceptionMessage.NOT_EXISTING_MENU; import christmas.domain.exception.InvalidMenuException; -import christmas.domain.exception.message.InvalidMenuExceptionMessage; import java.util.Arrays; public enum Menu { @@ -54,8 +54,8 @@ public boolean isWeekendPromotionApplicable() { public static Menu searchByName(final String name) { return Arrays.stream(Menu.values()) - .filter(menu -> menu.name().equalsIgnoreCase(name)) + .filter(menu -> menu.name.equalsIgnoreCase(name)) .findFirst() - .orElseThrow(() -> InvalidMenuException.of(InvalidMenuExceptionMessage.NOT_EXISTING_MENU.getMessage())); + .orElseThrow(() -> InvalidMenuException.of(NOT_EXISTING_MENU.getMessage())); } } \ No newline at end of file diff --git a/src/main/java/christmas/service/OrdersService.java b/src/main/java/christmas/service/OrdersService.java index d8b20b9..0f7532a 100644 --- a/src/main/java/christmas/service/OrdersService.java +++ b/src/main/java/christmas/service/OrdersService.java @@ -1,10 +1,20 @@ package christmas.service; +import christmas.domain.Order; import christmas.domain.Orders; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public class OrdersService { public Orders createOrders(Map orders) { - return null; + List menusAndCounts = orders.entrySet().stream() + .map(order -> createOrder(order.getKey(), order.getValue())) + .collect(Collectors.toList()); + return Orders.from(menusAndCounts); + } + + private Order createOrder(final String menuName, final int menuCount) { + return Order.of(menuName, menuCount); } } \ No newline at end of file From 71152b8ea2f41b7fc5fa1f556b8af18d83216565 Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 10:59:45 +0900 Subject: [PATCH 33/89] feat: add feature to check user input about menu count is convertible to numeric type --- docs/README.md | 2 +- .../message/OrderInputException.java | 4 ---- .../message/OrdersInputExceptionMessage.java | 3 ++- .../view/input/parser/InputParser.java | 2 +- .../validator/MenuCountInputValidator.java | 24 ++++++++++++++++++- .../input/validator/OrderInputValidator.java | 10 ++++---- 6 files changed, 32 insertions(+), 13 deletions(-) delete mode 100644 src/main/java/christmas/view/input/exception/message/OrderInputException.java diff --git a/docs/README.md b/docs/README.md index 1d6a1da..9d7c7a8 100644 --- a/docs/README.md +++ b/docs/README.md @@ -70,7 +70,7 @@ - [x] `메뉴 개수`κ°€ 2κΈ€μž μ΄ν•˜μΈμ§€ ν™•μΈν•œλ‹€. - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `BasicInputException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. -- [] `메뉴 개수`κ°€ 숫자 ν˜•μ‹μΈμ§€ ν™•μΈν•œλ‹€. +- [x] `메뉴 개수`κ°€ 숫자 ν˜•μ‹μΈμ§€ ν™•μΈν•œλ‹€. - [] `메뉴 개수`κ°€ 1 이상 μ •μˆ˜ 인지 ν™•μΈν•œλ‹€. - [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `OrdersInputException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. diff --git a/src/main/java/christmas/view/input/exception/message/OrderInputException.java b/src/main/java/christmas/view/input/exception/message/OrderInputException.java deleted file mode 100644 index 8c87214..0000000 --- a/src/main/java/christmas/view/input/exception/message/OrderInputException.java +++ /dev/null @@ -1,4 +0,0 @@ -package christmas.view.input.exception.message; - -public class OrderInputException { -} \ No newline at end of file diff --git a/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java b/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java index 1b6100d..be743b9 100644 --- a/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java +++ b/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java @@ -4,7 +4,8 @@ public enum OrdersInputExceptionMessage { INVALID_ORDER_FORMAT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), - EMPTY_MENU_COUNT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); + EMPTY_MENU_COUNT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + NOT_NUMERIC_TYPE(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); private final String message; diff --git a/src/main/java/christmas/view/input/parser/InputParser.java b/src/main/java/christmas/view/input/parser/InputParser.java index 5a2da1e..fcc424f 100644 --- a/src/main/java/christmas/view/input/parser/InputParser.java +++ b/src/main/java/christmas/view/input/parser/InputParser.java @@ -74,7 +74,7 @@ private void validateEachOrder(final String userInput) { .forEach(orderInputValidator::validate); } - private Map parseToOrderMap(String userInput) { + private Map parseToOrderMap(final String userInput) { return Arrays.stream(userInput.split(ORDERS_DELIMITER.getSymbol())) .map(orders -> orders.split(ORDER_DELIMITER.getSymbol())) .collect(Collectors.toMap( diff --git a/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java b/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java index f7d897f..e86397d 100644 --- a/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java +++ b/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java @@ -2,9 +2,31 @@ import static christmas.view.input.constant.InputNumberConstant.MENU_COUNT_MAX_INPUT_LENGTH; import static christmas.view.input.constant.InputSymbolConstant.ORDER_SYMBOL; +import static christmas.view.input.exception.message.OrdersInputExceptionMessage.NOT_NUMERIC_TYPE; -public class MenuCountInputValidator extends BasicValidator { +import christmas.view.input.exception.OrdersInputException; + +public class MenuCountInputValidator extends BasicValidator implements PositiveIntegerCheckable { public void validate(final String count) { super.validate(count, ORDER_SYMBOL.getSymbol(), MENU_COUNT_MAX_INPUT_LENGTH.getValue()); + validateNumeric(count); + } + + @Override + public void validateNumeric(String userInput) { + try { + parseToInt(userInput); + } catch (NumberFormatException e) { + throw OrdersInputException.of(NOT_NUMERIC_TYPE.getMessage()); + } + } + + @Override + public void validatePositive(String userInput) { + + } + + private int parseToInt(final String userInput) { + return Integer.parseInt(userInput); } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/OrderInputValidator.java b/src/main/java/christmas/view/input/validator/OrderInputValidator.java index 5328cf5..17e1624 100644 --- a/src/main/java/christmas/view/input/validator/OrderInputValidator.java +++ b/src/main/java/christmas/view/input/validator/OrderInputValidator.java @@ -25,7 +25,7 @@ public OrderInputValidator() { public void validate(final String order) { super.validate(order, ORDER_SYMBOL.getSymbol(), ORDER_MAX_INPUT_LENGTH.getValue()); validateContainingDelimiter(order); - validateEndsWithDelimiter(order); + validateNotEndsWithDelimiter(order); validateMenu(splitToMenu(order)); } @@ -39,7 +39,7 @@ private boolean containsDelimiter(final String order) { return order.contains(ORDER_DELIMITER.getSymbol()); } - private void validateEndsWithDelimiter(final String order) { + private void validateNotEndsWithDelimiter(final String order) { if (endsWithDelimiter(order)) { throw OrdersInputException.of(EMPTY_MENU_COUNT.getMessage()); } @@ -54,8 +54,8 @@ private List splitToMenu(final String order) { .collect(Collectors.toList()); } - private void validateMenu(List menus) { - menuNameInputValidator.validate(menus.get(MENU_NAME_INDEX.getValue())); - menuCountInputValidator.validate(menus.get(MENU_COUNT_INDEX.getValue())); + private void validateMenu(List menu) { + menuNameInputValidator.validate(menu.get(MENU_NAME_INDEX.getValue())); + menuCountInputValidator.validate(menu.get(MENU_COUNT_INDEX.getValue())); } } \ No newline at end of file From 87333c1bc11d57f028a5752b8f3c5111cee86fd1 Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 11:13:10 +0900 Subject: [PATCH 34/89] feat: add feature to check user input about menu count is positive integer --- docs/README.md | 6 ++-- .../message/OrdersInputExceptionMessage.java | 3 +- .../input/validator/DayInputValidator.java | 20 +++++------ .../validator/MenuCountInputValidator.java | 23 +++++++----- .../validator/MenuNameInputValidator.java | 4 +-- .../input/validator/OrderInputValidator.java | 36 +++++++++---------- .../input/validator/OrdersInputValidator.java | 4 +-- 7 files changed, 51 insertions(+), 45 deletions(-) diff --git a/docs/README.md b/docs/README.md index 9d7c7a8..df99200 100644 --- a/docs/README.md +++ b/docs/README.md @@ -71,9 +71,9 @@ - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `BasicInputException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. - [x] `메뉴 개수`κ°€ 숫자 ν˜•μ‹μΈμ§€ ν™•μΈν•œλ‹€. -- [] `메뉴 개수`κ°€ 1 이상 μ •μˆ˜ 인지 ν™•μΈν•œλ‹€. -- [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `OrdersInputException`을 λ°œμƒμ‹œν‚€κ³ ,
- "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. +- [x] `메뉴 개수`κ°€ 1 이상 μ •μˆ˜ 인지 ν™•μΈν•œλ‹€. + - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `OrdersInputException`을 λ°œμƒμ‹œν‚€κ³ ,
+ "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. > #### πŸ”– iv) `μ£Όλ¬Έ λ‚΄μ—­` μž…λ ₯κ°’ μž¬κ²€μ¦ diff --git a/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java b/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java index be743b9..150425d 100644 --- a/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java +++ b/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java @@ -5,7 +5,8 @@ public enum OrdersInputExceptionMessage { INVALID_ORDER_FORMAT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), EMPTY_MENU_COUNT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), - NOT_NUMERIC_TYPE(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); + NOT_NUMERIC_TYPE(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + NOT_POSITIVE(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); private final String message; diff --git a/src/main/java/christmas/view/input/validator/DayInputValidator.java b/src/main/java/christmas/view/input/validator/DayInputValidator.java index e3bbdb1..a5b2f30 100644 --- a/src/main/java/christmas/view/input/validator/DayInputValidator.java +++ b/src/main/java/christmas/view/input/validator/DayInputValidator.java @@ -10,30 +10,30 @@ import christmas.view.input.exception.DayInputException; public class DayInputValidator extends BasicValidator implements PositiveIntegerCheckable { - public void validate(final String day) throws BasicInputException, DayInputException { - super.validate(day, DAY_SYMBOL.getSymbol(), DAY_MAX_INPUT_LENGTH.getValue()); - validateNumeric(day); - validatePositive(day); + public void validate(final String dayInput) throws BasicInputException, DayInputException { + super.validate(dayInput, DAY_SYMBOL.getSymbol(), DAY_MAX_INPUT_LENGTH.getValue()); + validateNumeric(dayInput); + validatePositive(dayInput); } @Override - public void validateNumeric(final String userInput) { + public void validateNumeric(final String dayInput) { try { - parseToInt(userInput); + parseToInt(dayInput); } catch (NumberFormatException e) { throw DayInputException.of(NOT_NUMERIC_TYPE.getMessage()); } } @Override - public void validatePositive(final String userInput) { - int day = parseToInt(userInput); + public void validatePositive(final String dayInput) { + int day = parseToInt(dayInput); if (day < POSITIVE_BOUNDARY_VALUE.getValue()) { throw DayInputException.of(NOT_POSITIVE.getMessage()); } } - private int parseToInt(final String userInput) { - return Integer.parseInt(userInput); + private int parseToInt(final String dayInput) { + return Integer.parseInt(dayInput); } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java b/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java index e86397d..f499332 100644 --- a/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java +++ b/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java @@ -1,32 +1,37 @@ package christmas.view.input.validator; import static christmas.view.input.constant.InputNumberConstant.MENU_COUNT_MAX_INPUT_LENGTH; +import static christmas.view.input.constant.InputNumberConstant.POSITIVE_BOUNDARY_VALUE; import static christmas.view.input.constant.InputSymbolConstant.ORDER_SYMBOL; import static christmas.view.input.exception.message.OrdersInputExceptionMessage.NOT_NUMERIC_TYPE; +import static christmas.view.input.exception.message.OrdersInputExceptionMessage.NOT_POSITIVE; import christmas.view.input.exception.OrdersInputException; public class MenuCountInputValidator extends BasicValidator implements PositiveIntegerCheckable { - public void validate(final String count) { - super.validate(count, ORDER_SYMBOL.getSymbol(), MENU_COUNT_MAX_INPUT_LENGTH.getValue()); - validateNumeric(count); + public void validate(final String menuCountInput) { + super.validate(menuCountInput, ORDER_SYMBOL.getSymbol(), MENU_COUNT_MAX_INPUT_LENGTH.getValue()); + validateNumeric(menuCountInput); } @Override - public void validateNumeric(String userInput) { + public void validateNumeric(final String menuCountInput) { try { - parseToInt(userInput); + parseToInt(menuCountInput); } catch (NumberFormatException e) { throw OrdersInputException.of(NOT_NUMERIC_TYPE.getMessage()); } } @Override - public void validatePositive(String userInput) { - + public void validatePositive(final String menuCountInput) { + int menuCount = parseToInt(menuCountInput); + if (menuCount < POSITIVE_BOUNDARY_VALUE.getValue()) { + throw OrdersInputException.of(NOT_POSITIVE.getMessage()); + } } - private int parseToInt(final String userInput) { - return Integer.parseInt(userInput); + private int parseToInt(final String menuCountInput) { + return Integer.parseInt(menuCountInput); } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java b/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java index 511b2e6..ad3bf7b 100644 --- a/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java +++ b/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java @@ -4,7 +4,7 @@ import static christmas.view.input.constant.InputSymbolConstant.ORDER_SYMBOL; public class MenuNameInputValidator extends BasicValidator { - public void validate(final String name) { - super.validate(name, ORDER_SYMBOL.getSymbol(), MENU_NAME_MAX_INPUT_LENGTH.getValue()); + public void validate(final String menuNameInput) { + super.validate(menuNameInput, ORDER_SYMBOL.getSymbol(), MENU_NAME_MAX_INPUT_LENGTH.getValue()); } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/OrderInputValidator.java b/src/main/java/christmas/view/input/validator/OrderInputValidator.java index 17e1624..096ffdb 100644 --- a/src/main/java/christmas/view/input/validator/OrderInputValidator.java +++ b/src/main/java/christmas/view/input/validator/OrderInputValidator.java @@ -22,40 +22,40 @@ public OrderInputValidator() { this.menuCountInputValidator = new MenuCountInputValidator(); } - public void validate(final String order) { - super.validate(order, ORDER_SYMBOL.getSymbol(), ORDER_MAX_INPUT_LENGTH.getValue()); - validateContainingDelimiter(order); - validateNotEndsWithDelimiter(order); - validateMenu(splitToMenu(order)); + public void validate(final String orderInput) { + super.validate(orderInput, ORDER_SYMBOL.getSymbol(), ORDER_MAX_INPUT_LENGTH.getValue()); + validateContainingDelimiter(orderInput); + validateNotEndsWithDelimiter(orderInput); + validateMenu(splitToMenuInput(orderInput)); } - private void validateContainingDelimiter(final String order) { - if (!containsDelimiter(order)) { + private void validateContainingDelimiter(final String orderInput) { + if (!containsDelimiter(orderInput)) { throw OrdersInputException.of(INVALID_ORDER_FORMAT.getMessage()); } } - private boolean containsDelimiter(final String order) { - return order.contains(ORDER_DELIMITER.getSymbol()); + private boolean containsDelimiter(final String orderInput) { + return orderInput.contains(ORDER_DELIMITER.getSymbol()); } - private void validateNotEndsWithDelimiter(final String order) { - if (endsWithDelimiter(order)) { + private void validateNotEndsWithDelimiter(final String orderInput) { + if (endsWithDelimiter(orderInput)) { throw OrdersInputException.of(EMPTY_MENU_COUNT.getMessage()); } } - private boolean endsWithDelimiter(final String order) { - return order.endsWith(ORDER_DELIMITER.getSymbol()); + private boolean endsWithDelimiter(final String orderInput) { + return orderInput.endsWith(ORDER_DELIMITER.getSymbol()); } - private List splitToMenu(final String order) { - return Arrays.stream(order.split(ORDER_DELIMITER.getSymbol())) + private List splitToMenuInput(final String orderInput) { + return Arrays.stream(orderInput.split(ORDER_DELIMITER.getSymbol())) .collect(Collectors.toList()); } - private void validateMenu(List menu) { - menuNameInputValidator.validate(menu.get(MENU_NAME_INDEX.getValue())); - menuCountInputValidator.validate(menu.get(MENU_COUNT_INDEX.getValue())); + private void validateMenu(List menuInput) { + menuNameInputValidator.validate(menuInput.get(MENU_NAME_INDEX.getValue())); + menuCountInputValidator.validate(menuInput.get(MENU_COUNT_INDEX.getValue())); } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/OrdersInputValidator.java b/src/main/java/christmas/view/input/validator/OrdersInputValidator.java index dac57ab..4fed53d 100644 --- a/src/main/java/christmas/view/input/validator/OrdersInputValidator.java +++ b/src/main/java/christmas/view/input/validator/OrdersInputValidator.java @@ -6,7 +6,7 @@ import christmas.view.input.exception.BasicInputException; public class OrdersInputValidator extends BasicValidator { - public void validate(final String orders) throws BasicInputException { - super.validate(orders, ORDER_SYMBOL.getSymbol(), ORDERS_MAX_INPUT_LENGTH.getValue()); + public void validate(final String ordersInput) throws BasicInputException { + super.validate(ordersInput, ORDER_SYMBOL.getSymbol(), ORDERS_MAX_INPUT_LENGTH.getValue()); } } \ No newline at end of file From 143d6dacae88f591ebf476816fdd8671449642d0 Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 12:32:24 +0900 Subject: [PATCH 35/89] feat: add feature to check user input about orders does not have duplicated menus --- docs/README.md | 12 ++++--- src/main/java/christmas/domain/Order.java | 4 +++ src/main/java/christmas/domain/Orders.java | 1 + .../message/OrdersInputExceptionMessage.java | 3 +- .../view/input/parser/InputParser.java | 3 +- .../input/validator/OrdersInputValidator.java | 31 ++++++++++++++++++- 6 files changed, 46 insertions(+), 8 deletions(-) diff --git a/docs/README.md b/docs/README.md index df99200..d54c814 100644 --- a/docs/README.md +++ b/docs/README.md @@ -77,11 +77,9 @@ > #### πŸ”– iv) `μ£Όλ¬Έ λ‚΄μ—­` μž…λ ₯κ°’ μž¬κ²€μ¦ -- [] `μ£Όλ¬Έ λ‚΄μ—­`을 μ·¨ν•©ν–ˆμ„ λ•Œ, 쀑볡 메뉴가 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€. -- [] `μ£Όλ¬Έ λ‚΄μ—­`을 μ·¨ν•©ν–ˆμ„ λ•Œ, `메뉴 개수`κ°€ `20개`κ°€ λ„˜μ–΄κ°€λŠ”μ§€ ν™•μΈν•œλ‹€. -- [] `μ£Όλ¬Έ λ‚΄μ—­`을 μ·¨ν•©ν–ˆμ„ λ•Œ, `μ£Όλ¬Έ λ‚΄μ—­`에 음료수만 μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. -- [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `OrdersInputException`을 λ°œμƒμ‹œν‚€κ³ ,
- "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. +- [x] `μ£Όλ¬Έ λ‚΄μ—­`을 μ·¨ν•©ν–ˆμ„ λ•Œ, 쀑볡 메뉴가 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€. + - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `OrdersInputException`을 λ°œμƒμ‹œν‚€κ³ ,
+ "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. ## 🧩 [ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 κ΄€λ ¨ κΈ°λŠ₯ ] @@ -99,6 +97,10 @@ > ### πŸ”– μ£Όλ¬Έ 내역에 λ”°λ₯Έ 이벀트 적용 μ—¬λΆ€ νŒλ‹¨ 도메인 둜직 - μ‚¬μš©μžμ—κ²Œ μž…λ ₯받은 μ£Όλ¬Έ λ‚΄μ—­( 메뉴 이름과 μˆ˜λŸ‰ )에 λŒ€ν•΄ + - [] `μ£Όλ¬Έ λ‚΄μ—­`을 μ·¨ν•©ν–ˆμ„ λ•Œ, `메뉴 개수`κ°€ `20개`κ°€ λ„˜μ–΄κ°€λŠ”μ§€ ν™•μΈν•œλ‹€. + - [] `μ£Όλ¬Έ λ‚΄μ—­`을 μ·¨ν•©ν–ˆμ„ λ•Œ, `μ£Όλ¬Έ λ‚΄μ—­`에 음료수만 μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. + - [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `OrdersInputException`을 λ°œμƒμ‹œν‚€κ³ ,
+ "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. - [] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ κΈˆμ•‘μ΄ `10000원` μ΄ν•˜μ΄λ©΄, 할인 이벀트 적용 λŒ€μƒμ—μ„œ μ œμ™Έμ‹œν‚¨λ‹€. - [] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ κΈˆμ•‘μ΄ `12λ§Œμ› 이상`일 μ‹œ, `μƒ΄νŽ˜μΈ 1개` λ₯Ό μ¦μ •ν•œλ‹€. - [] μ£Όλ¬Έ 내역을 μ΄μš©ν•΄μ„œ `할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘`을 계산할 수 μžˆλ‹€. diff --git a/src/main/java/christmas/domain/Order.java b/src/main/java/christmas/domain/Order.java index 98c3ec2..f35bc86 100644 --- a/src/main/java/christmas/domain/Order.java +++ b/src/main/java/christmas/domain/Order.java @@ -15,4 +15,8 @@ private Order(Menu menu, final int count) { public static Order of(final String menuName, final int count) throws InvalidMenuException { return new Order(Menu.searchByName(menuName), count); } + + public String getMenuName() { + return menu.getName(); + } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/Orders.java b/src/main/java/christmas/domain/Orders.java index 00c0d10..5242f1b 100644 --- a/src/main/java/christmas/domain/Orders.java +++ b/src/main/java/christmas/domain/Orders.java @@ -1,5 +1,6 @@ package christmas.domain; + import java.util.List; public class Orders { diff --git a/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java b/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java index 150425d..42c5ce9 100644 --- a/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java +++ b/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java @@ -6,7 +6,8 @@ public enum OrdersInputExceptionMessage { INVALID_ORDER_FORMAT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), EMPTY_MENU_COUNT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), NOT_NUMERIC_TYPE(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), - NOT_POSITIVE(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); + NOT_POSITIVE(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + DUPLICATED_MENUS(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); private final String message; diff --git a/src/main/java/christmas/view/input/parser/InputParser.java b/src/main/java/christmas/view/input/parser/InputParser.java index fcc424f..89fb46c 100644 --- a/src/main/java/christmas/view/input/parser/InputParser.java +++ b/src/main/java/christmas/view/input/parser/InputParser.java @@ -41,8 +41,9 @@ public int parseDay(String userInput) throws BasicInputException, DayInputExcept public Map parseOrders(String userInput) { checkOrdersLengthIsUnderUpperLimit(userInput); userInput = removeBlank(userInput); - ordersInputValidator.validate(userInput); + ordersInputValidator.preValidate(userInput); validateEachOrder(userInput); + ordersInputValidator.postValidate(userInput); return parseToOrderMap(userInput); } diff --git a/src/main/java/christmas/view/input/validator/OrdersInputValidator.java b/src/main/java/christmas/view/input/validator/OrdersInputValidator.java index 4fed53d..7923fc0 100644 --- a/src/main/java/christmas/view/input/validator/OrdersInputValidator.java +++ b/src/main/java/christmas/view/input/validator/OrdersInputValidator.java @@ -1,12 +1,41 @@ package christmas.view.input.validator; +import static christmas.view.input.constant.InputNumberConstant.MENU_NAME_INDEX; import static christmas.view.input.constant.InputNumberConstant.ORDERS_MAX_INPUT_LENGTH; +import static christmas.view.input.constant.InputSymbolConstant.ORDERS_DELIMITER; +import static christmas.view.input.constant.InputSymbolConstant.ORDER_DELIMITER; import static christmas.view.input.constant.InputSymbolConstant.ORDER_SYMBOL; import christmas.view.input.exception.BasicInputException; +import christmas.view.input.exception.OrdersInputException; +import christmas.view.input.exception.message.OrdersInputExceptionMessage; +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; public class OrdersInputValidator extends BasicValidator { - public void validate(final String ordersInput) throws BasicInputException { + public void preValidate(final String ordersInput) throws BasicInputException { super.validate(ordersInput, ORDER_SYMBOL.getSymbol(), ORDERS_MAX_INPUT_LENGTH.getValue()); } + + public void postValidate(final String ordersInput) { + validateNotExistDuplicatedMenus(ordersInput); + } + + private void validateNotExistDuplicatedMenus(final String ordersInput) { + Set uniqueMenuNames = makeUniqueMenuNames(ordersInput); + if (haveDuplicatedMenus(ordersInput, uniqueMenuNames)) { + throw OrdersInputException.of(OrdersInputExceptionMessage.DUPLICATED_MENUS.getMessage()); + } + } + + private Set makeUniqueMenuNames(final String ordersInput) { + return Arrays.stream(ordersInput.split(ORDERS_DELIMITER.getSymbol())) + .map(order -> order.split(ORDER_DELIMITER.getSymbol())[MENU_NAME_INDEX.getValue()]) + .collect(Collectors.toSet()); + } + + private boolean haveDuplicatedMenus(final String ordersInput, Set uniqueMenuNames) { + return uniqueMenuNames.size() < ordersInput.split(ORDERS_DELIMITER.getSymbol()).length; + } } \ No newline at end of file From 1e257cd12825f836299029b12b9c70758befded4 Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 13:19:59 +0900 Subject: [PATCH 36/89] feat: add feature to check sum of ordered menus does not exceed upper limit(20) --- docs/README.md | 6 +++--- .../controller/PromotionController.java | 4 ++-- src/main/java/christmas/domain/Order.java | 8 ++++++-- src/main/java/christmas/domain/Orders.java | 16 ++++++++++++++++ .../java/christmas/domain/constant/Menu.java | 6 +++--- .../domain/constant/OrdersConstant.java | 15 +++++++++++++++ .../domain/exception/InvalidMenuException.java | 11 ----------- .../domain/exception/InvalidOrdersException.java | 11 +++++++++++ ...e.java => InvalidOrdersExceptionMessage.java} | 7 ++++--- 9 files changed, 60 insertions(+), 24 deletions(-) create mode 100644 src/main/java/christmas/domain/constant/OrdersConstant.java delete mode 100644 src/main/java/christmas/domain/exception/InvalidMenuException.java create mode 100644 src/main/java/christmas/domain/exception/InvalidOrdersException.java rename src/main/java/christmas/domain/exception/message/{InvalidMenuExceptionMessage.java => InvalidOrdersExceptionMessage.java} (54%) diff --git a/docs/README.md b/docs/README.md index d54c814..bb9635b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -61,7 +61,7 @@ - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `BasicInputException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. - [x] `메뉴 이름`이 λ©”λ‰΄νŒμ— μžˆλŠ” 메뉴인지 ν™•μΈν•œλ‹€. - - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `InvalidMenuException`을 λ°œμƒμ‹œν‚€κ³ ,
+ - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `InvalidOrdersException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”." λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. > #### iii) `메뉴 개수`에 λŒ€ν•œ μž…λ ₯κ°’ 검증 @@ -97,9 +97,9 @@ > ### πŸ”– μ£Όλ¬Έ 내역에 λ”°λ₯Έ 이벀트 적용 μ—¬λΆ€ νŒλ‹¨ 도메인 둜직 - μ‚¬μš©μžμ—κ²Œ μž…λ ₯받은 μ£Όλ¬Έ λ‚΄μ—­( 메뉴 이름과 μˆ˜λŸ‰ )에 λŒ€ν•΄ - - [] `μ£Όλ¬Έ λ‚΄μ—­`을 μ·¨ν•©ν–ˆμ„ λ•Œ, `메뉴 개수`κ°€ `20개`κ°€ λ„˜μ–΄κ°€λŠ”μ§€ ν™•μΈν•œλ‹€. + - [x] `μ£Όλ¬Έ λ‚΄μ—­`을 μ·¨ν•©ν–ˆμ„ λ•Œ, `메뉴 개수`κ°€ `20개`κ°€ λ„˜μ–΄κ°€λŠ”μ§€ ν™•μΈν•œλ‹€. - [] `μ£Όλ¬Έ λ‚΄μ—­`을 μ·¨ν•©ν–ˆμ„ λ•Œ, `μ£Όλ¬Έ λ‚΄μ—­`에 음료수만 μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. - - [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `OrdersInputException`을 λ°œμƒμ‹œν‚€κ³ ,
+ - [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `InvalidOrdersException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. - [] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ κΈˆμ•‘μ΄ `10000원` μ΄ν•˜μ΄λ©΄, 할인 이벀트 적용 λŒ€μƒμ—μ„œ μ œμ™Έμ‹œν‚¨λ‹€. - [] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ κΈˆμ•‘μ΄ `12λ§Œμ› 이상`일 μ‹œ, `μƒ΄νŽ˜μΈ 1개` λ₯Ό μ¦μ •ν•œλ‹€. diff --git a/src/main/java/christmas/controller/PromotionController.java b/src/main/java/christmas/controller/PromotionController.java index 3e1451c..0adf8a8 100644 --- a/src/main/java/christmas/controller/PromotionController.java +++ b/src/main/java/christmas/controller/PromotionController.java @@ -3,7 +3,7 @@ import christmas.domain.DecemberDay; import christmas.domain.Orders; import christmas.domain.exception.InvalidDayException; -import christmas.domain.exception.InvalidMenuException; +import christmas.domain.exception.InvalidOrdersException; import christmas.service.DayService; import christmas.service.OrdersService; import christmas.view.input.InputView; @@ -51,7 +51,7 @@ private Orders insertOrders() { try { Map orders = askToInsertOrders(); return ordersService.createOrders(orders); - } catch (BasicInputException | OrdersInputException | InvalidMenuException e) { + } catch (BasicInputException | OrdersInputException | InvalidOrdersException e) { outputView.printErrorMessage(e.getMessage()); return insertOrders(); } diff --git a/src/main/java/christmas/domain/Order.java b/src/main/java/christmas/domain/Order.java index f35bc86..b6dcd81 100644 --- a/src/main/java/christmas/domain/Order.java +++ b/src/main/java/christmas/domain/Order.java @@ -1,7 +1,7 @@ package christmas.domain; import christmas.domain.constant.Menu; -import christmas.domain.exception.InvalidMenuException; +import christmas.domain.exception.InvalidOrdersException; public class Order { private final Menu menu; @@ -12,11 +12,15 @@ private Order(Menu menu, final int count) { this.count = count; } - public static Order of(final String menuName, final int count) throws InvalidMenuException { + public static Order of(final String menuName, final int count) throws InvalidOrdersException { return new Order(Menu.searchByName(menuName), count); } public String getMenuName() { return menu.getName(); } + + public int getMenuCount() { + return count; + } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/Orders.java b/src/main/java/christmas/domain/Orders.java index 5242f1b..bf53c8c 100644 --- a/src/main/java/christmas/domain/Orders.java +++ b/src/main/java/christmas/domain/Orders.java @@ -1,6 +1,9 @@ package christmas.domain; +import static christmas.domain.constant.OrdersConstant.MAX_MENU_COUNTS; +import static christmas.domain.exception.message.InvalidOrdersExceptionMessage.EXCEED_MENU_COUNTS_UPPER_LIMIT; +import christmas.domain.exception.InvalidOrdersException; import java.util.List; public class Orders { @@ -16,5 +19,18 @@ public static Orders from(List orders) { } private static void validate(List orders) { + validateSumOfMenuCountsNotExceedUpperLimit(orders); + } + + private static void validateSumOfMenuCountsNotExceedUpperLimit(List orders) { + if (sumOfMenuCountsExceedUpperLimit(orders)) { + throw InvalidOrdersException.of(EXCEED_MENU_COUNTS_UPPER_LIMIT.getMessage()); + } + } + + private static boolean sumOfMenuCountsExceedUpperLimit(List orders) { + return orders.stream() + .mapToInt(Order::getMenuCount) + .sum() > MAX_MENU_COUNTS.getValue(); } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/constant/Menu.java b/src/main/java/christmas/domain/constant/Menu.java index 59b30d8..a988e13 100644 --- a/src/main/java/christmas/domain/constant/Menu.java +++ b/src/main/java/christmas/domain/constant/Menu.java @@ -4,9 +4,9 @@ import static christmas.domain.constant.FoodType.BEVERAGE; import static christmas.domain.constant.FoodType.DESSERT; import static christmas.domain.constant.FoodType.MAIN; -import static christmas.domain.exception.message.InvalidMenuExceptionMessage.NOT_EXISTING_MENU; +import static christmas.domain.exception.message.InvalidOrdersExceptionMessage.NOT_EXISTING_MENU; -import christmas.domain.exception.InvalidMenuException; +import christmas.domain.exception.InvalidOrdersException; import java.util.Arrays; public enum Menu { @@ -56,6 +56,6 @@ public static Menu searchByName(final String name) { return Arrays.stream(Menu.values()) .filter(menu -> menu.name.equalsIgnoreCase(name)) .findFirst() - .orElseThrow(() -> InvalidMenuException.of(NOT_EXISTING_MENU.getMessage())); + .orElseThrow(() -> InvalidOrdersException.of(NOT_EXISTING_MENU.getMessage())); } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/constant/OrdersConstant.java b/src/main/java/christmas/domain/constant/OrdersConstant.java new file mode 100644 index 0000000..fd6eef4 --- /dev/null +++ b/src/main/java/christmas/domain/constant/OrdersConstant.java @@ -0,0 +1,15 @@ +package christmas.domain.constant; + +public enum OrdersConstant { + MAX_MENU_COUNTS(20); + + private final int value; + + OrdersConstant(final int value) { + this.value = value; + } + + public int getValue() { + return value; + } +} \ No newline at end of file diff --git a/src/main/java/christmas/domain/exception/InvalidMenuException.java b/src/main/java/christmas/domain/exception/InvalidMenuException.java deleted file mode 100644 index 06dd78d..0000000 --- a/src/main/java/christmas/domain/exception/InvalidMenuException.java +++ /dev/null @@ -1,11 +0,0 @@ -package christmas.domain.exception; - -public class InvalidMenuException extends IllegalArgumentException { - private InvalidMenuException(final String invalidMenuExceptionMessage) { - super(invalidMenuExceptionMessage); - } - - public static InvalidMenuException of(final String invalidMenuExceptionMessage) { - return new InvalidMenuException(invalidMenuExceptionMessage); - } -} \ No newline at end of file diff --git a/src/main/java/christmas/domain/exception/InvalidOrdersException.java b/src/main/java/christmas/domain/exception/InvalidOrdersException.java new file mode 100644 index 0000000..e0e25ae --- /dev/null +++ b/src/main/java/christmas/domain/exception/InvalidOrdersException.java @@ -0,0 +1,11 @@ +package christmas.domain.exception; + +public class InvalidOrdersException extends IllegalArgumentException { + private InvalidOrdersException(final String invalidMenuExceptionMessage) { + super(invalidMenuExceptionMessage); + } + + public static InvalidOrdersException of(final String invalidMenuExceptionMessage) { + return new InvalidOrdersException(invalidMenuExceptionMessage); + } +} \ No newline at end of file diff --git a/src/main/java/christmas/domain/exception/message/InvalidMenuExceptionMessage.java b/src/main/java/christmas/domain/exception/message/InvalidOrdersExceptionMessage.java similarity index 54% rename from src/main/java/christmas/domain/exception/message/InvalidMenuExceptionMessage.java rename to src/main/java/christmas/domain/exception/message/InvalidOrdersExceptionMessage.java index c481234..b96eabb 100644 --- a/src/main/java/christmas/domain/exception/message/InvalidMenuExceptionMessage.java +++ b/src/main/java/christmas/domain/exception/message/InvalidOrdersExceptionMessage.java @@ -2,12 +2,13 @@ import static christmas.global.ApplicationConstant.ERROR_PREFIX; -public enum InvalidMenuExceptionMessage { - NOT_EXISTING_MENU(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); +public enum InvalidOrdersExceptionMessage { + NOT_EXISTING_MENU(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + EXCEED_MENU_COUNTS_UPPER_LIMIT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); private final String message; - InvalidMenuExceptionMessage(final String message) { + InvalidOrdersExceptionMessage(final String message) { this.message = message; } From a381715a512bb6161989b4c40c4c35b6a8dfe61c Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 13:32:59 +0900 Subject: [PATCH 37/89] feat: add feature to check user input about ordered menus does not only contain beverage --- docs/README.md | 4 ++-- src/main/java/christmas/domain/Order.java | 5 +++++ src/main/java/christmas/domain/Orders.java | 14 ++++++++++++++ src/main/java/christmas/domain/constant/Menu.java | 4 ++++ .../message/InvalidOrdersExceptionMessage.java | 3 ++- 5 files changed, 27 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index bb9635b..bb6a62f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -98,8 +98,8 @@ - μ‚¬μš©μžμ—κ²Œ μž…λ ₯받은 μ£Όλ¬Έ λ‚΄μ—­( 메뉴 이름과 μˆ˜λŸ‰ )에 λŒ€ν•΄ - [x] `μ£Όλ¬Έ λ‚΄μ—­`을 μ·¨ν•©ν–ˆμ„ λ•Œ, `메뉴 개수`κ°€ `20개`κ°€ λ„˜μ–΄κ°€λŠ”μ§€ ν™•μΈν•œλ‹€. - - [] `μ£Όλ¬Έ λ‚΄μ—­`을 μ·¨ν•©ν–ˆμ„ λ•Œ, `μ£Όλ¬Έ λ‚΄μ—­`에 음료수만 μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. - - [] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `InvalidOrdersException`을 λ°œμƒμ‹œν‚€κ³ ,
+ - [x] `μ£Όλ¬Έ λ‚΄μ—­`을 μ·¨ν•©ν–ˆμ„ λ•Œ, `μ£Όλ¬Έ λ‚΄μ—­`에 음료수만 μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. + - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `InvalidOrdersException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. - [] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ κΈˆμ•‘μ΄ `10000원` μ΄ν•˜μ΄λ©΄, 할인 이벀트 적용 λŒ€μƒμ—μ„œ μ œμ™Έμ‹œν‚¨λ‹€. - [] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ κΈˆμ•‘μ΄ `12λ§Œμ› 이상`일 μ‹œ, `μƒ΄νŽ˜μΈ 1개` λ₯Ό μ¦μ •ν•œλ‹€. diff --git a/src/main/java/christmas/domain/Order.java b/src/main/java/christmas/domain/Order.java index b6dcd81..c656ace 100644 --- a/src/main/java/christmas/domain/Order.java +++ b/src/main/java/christmas/domain/Order.java @@ -1,5 +1,6 @@ package christmas.domain; +import christmas.domain.constant.FoodType; import christmas.domain.constant.Menu; import christmas.domain.exception.InvalidOrdersException; @@ -23,4 +24,8 @@ public String getMenuName() { public int getMenuCount() { return count; } + + public FoodType getFoodType() { + return menu.getFoodType(); + } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/Orders.java b/src/main/java/christmas/domain/Orders.java index bf53c8c..50c44c0 100644 --- a/src/main/java/christmas/domain/Orders.java +++ b/src/main/java/christmas/domain/Orders.java @@ -2,7 +2,9 @@ import static christmas.domain.constant.OrdersConstant.MAX_MENU_COUNTS; import static christmas.domain.exception.message.InvalidOrdersExceptionMessage.EXCEED_MENU_COUNTS_UPPER_LIMIT; +import static christmas.domain.exception.message.InvalidOrdersExceptionMessage.MENUS_ONLY_CONTAIN_BEVERAGE; +import christmas.domain.constant.FoodType; import christmas.domain.exception.InvalidOrdersException; import java.util.List; @@ -20,6 +22,7 @@ public static Orders from(List orders) { private static void validate(List orders) { validateSumOfMenuCountsNotExceedUpperLimit(orders); + validateOrderedMenusNotOnlyContainBeverage(orders); } private static void validateSumOfMenuCountsNotExceedUpperLimit(List orders) { @@ -33,4 +36,15 @@ private static boolean sumOfMenuCountsExceedUpperLimit(List orders) { .mapToInt(Order::getMenuCount) .sum() > MAX_MENU_COUNTS.getValue(); } + + private static void validateOrderedMenusNotOnlyContainBeverage(List orders) { + if (orderedMenusOnlyContainBeverage(orders)) { + throw InvalidOrdersException.of(MENUS_ONLY_CONTAIN_BEVERAGE.getMessage()); + } + } + + private static boolean orderedMenusOnlyContainBeverage(List orders) { + return orders.stream() + .allMatch(order -> order.getFoodType() == FoodType.BEVERAGE); + } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/constant/Menu.java b/src/main/java/christmas/domain/constant/Menu.java index a988e13..616d234 100644 --- a/src/main/java/christmas/domain/constant/Menu.java +++ b/src/main/java/christmas/domain/constant/Menu.java @@ -44,6 +44,10 @@ public int getPrice() { return price; } + public FoodType getFoodType() { + return foodType; + } + public boolean isWeekDayPromotionApplicable() { return foodType.isWeekdayPromotionApplicable(); } diff --git a/src/main/java/christmas/domain/exception/message/InvalidOrdersExceptionMessage.java b/src/main/java/christmas/domain/exception/message/InvalidOrdersExceptionMessage.java index b96eabb..bee9376 100644 --- a/src/main/java/christmas/domain/exception/message/InvalidOrdersExceptionMessage.java +++ b/src/main/java/christmas/domain/exception/message/InvalidOrdersExceptionMessage.java @@ -4,7 +4,8 @@ public enum InvalidOrdersExceptionMessage { NOT_EXISTING_MENU(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), - EXCEED_MENU_COUNTS_UPPER_LIMIT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); + EXCEED_MENU_COUNTS_UPPER_LIMIT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + MENUS_ONLY_CONTAIN_BEVERAGE(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); private final String message; From c218e24c37f3becb706b19d290fdbb000a8d9c27 Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 14:04:28 +0900 Subject: [PATCH 38/89] feat: add feature to calculate total price of ordered menus before discount --- docs/README.md | 2 +- .../java/christmas/controller/PromotionController.java | 1 + src/main/java/christmas/domain/Order.java | 8 ++++---- src/main/java/christmas/domain/Orders.java | 6 ++++++ 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/docs/README.md b/docs/README.md index bb6a62f..92e1b02 100644 --- a/docs/README.md +++ b/docs/README.md @@ -103,7 +103,7 @@ "[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. - [] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ κΈˆμ•‘μ΄ `10000원` μ΄ν•˜μ΄λ©΄, 할인 이벀트 적용 λŒ€μƒμ—μ„œ μ œμ™Έμ‹œν‚¨λ‹€. - [] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ κΈˆμ•‘μ΄ `12λ§Œμ› 이상`일 μ‹œ, `μƒ΄νŽ˜μΈ 1개` λ₯Ό μ¦μ •ν•œλ‹€. - - [] μ£Όλ¬Έ 내역을 μ΄μš©ν•΄μ„œ `할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘`을 계산할 수 μžˆλ‹€. + - [x] μ£Όλ¬Έ 내역을 μ΄μš©ν•΄μ„œ `할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘`을 계산할 수 μžˆλ‹€. > ### πŸŽ„ μ£Όλ¬Έ 내역에 λŒ€ν•œ 이벀트 적용 κ²°κ³Ό μ‚°μΆœ 도메인 둜직 diff --git a/src/main/java/christmas/controller/PromotionController.java b/src/main/java/christmas/controller/PromotionController.java index 0adf8a8..2b5d5dd 100644 --- a/src/main/java/christmas/controller/PromotionController.java +++ b/src/main/java/christmas/controller/PromotionController.java @@ -30,6 +30,7 @@ public void run() { outputView.printGreetingMessage(); DecemberDay day = insertDay(); Orders orders = insertOrders(); + System.out.println(orders.calculateTotalAmount()); } private DecemberDay insertDay() { diff --git a/src/main/java/christmas/domain/Order.java b/src/main/java/christmas/domain/Order.java index c656ace..3744bc5 100644 --- a/src/main/java/christmas/domain/Order.java +++ b/src/main/java/christmas/domain/Order.java @@ -17,10 +17,6 @@ public static Order of(final String menuName, final int count) throws InvalidOrd return new Order(Menu.searchByName(menuName), count); } - public String getMenuName() { - return menu.getName(); - } - public int getMenuCount() { return count; } @@ -28,4 +24,8 @@ public int getMenuCount() { public FoodType getFoodType() { return menu.getFoodType(); } + + public int getTotalPrice() { + return menu.getPrice() * count; + } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/Orders.java b/src/main/java/christmas/domain/Orders.java index 50c44c0..4c059a1 100644 --- a/src/main/java/christmas/domain/Orders.java +++ b/src/main/java/christmas/domain/Orders.java @@ -47,4 +47,10 @@ private static boolean orderedMenusOnlyContainBeverage(List orders) { return orders.stream() .allMatch(order -> order.getFoodType() == FoodType.BEVERAGE); } + + public int calculateTotalAmount() { + return orders.stream() + .mapToInt(Order::getTotalPrice) + .sum(); + } } \ No newline at end of file From 60c439545c7665299579ecbaf05b1e9d4ee6cbf3 Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 14:16:41 +0900 Subject: [PATCH 39/89] feat: add feature to judge the given day is Christmas D-Day Promotion aplicable or not --- docs/README.md | 2 +- .../controller/PromotionController.java | 1 + .../java/christmas/domain/DecemberDay.java | 18 +++++++----------- .../christmas/domain/constant/DayConstant.java | 3 ++- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/docs/README.md b/docs/README.md index 92e1b02..3d7a4d3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -89,7 +89,7 @@ - [x] λ‚ μ§œκ°€ 1 이상 31 μ΄ν•˜μ˜ μˆ«μžμΈμ§€ ν™•μΈν•œλ‹€. - [x] 1 이상 31 μ΄ν•˜μ˜ μˆ«μžκ°€ μ•„λ‹Œ 경우, `InvalidDayException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œλ‹€. - - [] ν•΄λ‹Ή λ‚ μ§œκ°€ 크리슀마슀 D-Day ν”„λ‘œλͺ¨μ…˜ λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. + - [x] ν•΄λ‹Ή λ‚ μ§œκ°€ 크리슀마슀 D-Day ν”„λ‘œλͺ¨μ…˜ λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. - [] 평일 할인 λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. - [] 주말 할인 λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. - [] νŠΉλ³„ 할인 λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. diff --git a/src/main/java/christmas/controller/PromotionController.java b/src/main/java/christmas/controller/PromotionController.java index 2b5d5dd..7b4c392 100644 --- a/src/main/java/christmas/controller/PromotionController.java +++ b/src/main/java/christmas/controller/PromotionController.java @@ -31,6 +31,7 @@ public void run() { DecemberDay day = insertDay(); Orders orders = insertOrders(); System.out.println(orders.calculateTotalAmount()); + System.out.println(day.isChristmasPromotionApplicable()); } private DecemberDay insertDay() { diff --git a/src/main/java/christmas/domain/DecemberDay.java b/src/main/java/christmas/domain/DecemberDay.java index c14eade..0dc08b7 100644 --- a/src/main/java/christmas/domain/DecemberDay.java +++ b/src/main/java/christmas/domain/DecemberDay.java @@ -1,29 +1,25 @@ package christmas.domain; +import static christmas.domain.constant.DayConstant.DECEMBER_CHRISTMAS_DAY; import static christmas.domain.constant.DayConstant.DECEMBER_FIRST_DAY; import static christmas.domain.constant.DayConstant.DECEMBER_LAST_DAY; import christmas.domain.exception.InvalidDayException; public class DecemberDay extends DayPerMonth { - private final boolean isChristmasPromotionApplicable; - private final boolean isWeekend; - private final boolean hasStar; + private final int day; - private DecemberDay(final int day, final boolean isChristmasPromotionApplicable, final boolean isWeekend, - final boolean hasStar) { + private DecemberDay(final int day) { validate(day); - this.isChristmasPromotionApplicable = isChristmasPromotionApplicable; - this.isWeekend = isWeekend; - this.hasStar = hasStar; + this.day = day; } public static DecemberDay from(final int day) throws InvalidDayException { - return new DecemberDay(day, judgeIsChristmasPromotionApplicable(day), judgeIsWeekend(day), judgeHasStar(day)); + return new DecemberDay(day); } - private static boolean judgeIsChristmasPromotionApplicable(final int day) { - return true; + public boolean isChristmasPromotionApplicable() { + return day >= DECEMBER_FIRST_DAY.getDay() && day <= DECEMBER_CHRISTMAS_DAY.getDay(); } private static boolean judgeIsWeekend(final int day) { diff --git a/src/main/java/christmas/domain/constant/DayConstant.java b/src/main/java/christmas/domain/constant/DayConstant.java index 143dd80..2664c0d 100644 --- a/src/main/java/christmas/domain/constant/DayConstant.java +++ b/src/main/java/christmas/domain/constant/DayConstant.java @@ -4,7 +4,8 @@ public enum DayConstant { DEFAULT_FIRST_DAY(1), DEFAULT_LAST_DAY(30), DECEMBER_FIRST_DAY(1), - DECEMBER_LAST_DAY(31); + DECEMBER_LAST_DAY(31), + DECEMBER_CHRISTMAS_DAY(25); private final int day; From 2430ccff9bab1783f7c7b4a279f356097cc72e67 Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 14:22:59 +0900 Subject: [PATCH 40/89] refactor: split createOrders method to make code more easy to read --- src/main/java/christmas/service/OrdersService.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/christmas/service/OrdersService.java b/src/main/java/christmas/service/OrdersService.java index 0f7532a..f0ddd01 100644 --- a/src/main/java/christmas/service/OrdersService.java +++ b/src/main/java/christmas/service/OrdersService.java @@ -8,10 +8,13 @@ public class OrdersService { public Orders createOrders(Map orders) { - List menusAndCounts = orders.entrySet().stream() + return Orders.from(makeOrders(orders)); + } + + private List makeOrders(Map orders) { + return orders.entrySet().stream() .map(order -> createOrder(order.getKey(), order.getValue())) .collect(Collectors.toList()); - return Orders.from(menusAndCounts); } private Order createOrder(final String menuName, final int menuCount) { From 87a82ae219b7530ee47fb9b77b300efec3de1556 Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 14:36:39 +0900 Subject: [PATCH 41/89] feat: add feature to judge the given day is Weekend Promotion applicable or not --- docs/README.md | 2 +- .../controller/PromotionController.java | 1 + src/main/java/christmas/domain/DayPerMonth.java | 2 +- src/main/java/christmas/domain/DecemberDay.java | 16 ++++++++++++---- .../christmas/domain/constant/DayConstant.java | 16 ++++++++++------ 5 files changed, 25 insertions(+), 12 deletions(-) diff --git a/docs/README.md b/docs/README.md index 3d7a4d3..b05f3b7 100644 --- a/docs/README.md +++ b/docs/README.md @@ -91,7 +91,7 @@ 좜λ ₯ν•œλ‹€. - [x] ν•΄λ‹Ή λ‚ μ§œκ°€ 크리슀마슀 D-Day ν”„λ‘œλͺ¨μ…˜ λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. - [] 평일 할인 λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. - - [] 주말 할인 λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. + - [x] 주말 할인 λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. - [] νŠΉλ³„ 할인 λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. > ### πŸ”– μ£Όλ¬Έ 내역에 λ”°λ₯Έ 이벀트 적용 μ—¬λΆ€ νŒλ‹¨ 도메인 둜직 diff --git a/src/main/java/christmas/controller/PromotionController.java b/src/main/java/christmas/controller/PromotionController.java index 7b4c392..4837894 100644 --- a/src/main/java/christmas/controller/PromotionController.java +++ b/src/main/java/christmas/controller/PromotionController.java @@ -32,6 +32,7 @@ public void run() { Orders orders = insertOrders(); System.out.println(orders.calculateTotalAmount()); System.out.println(day.isChristmasPromotionApplicable()); + System.out.println(day.isWeekendPromotionApplicable()); } private DecemberDay insertDay() { diff --git a/src/main/java/christmas/domain/DayPerMonth.java b/src/main/java/christmas/domain/DayPerMonth.java index 5cc6b64..eb07a1d 100644 --- a/src/main/java/christmas/domain/DayPerMonth.java +++ b/src/main/java/christmas/domain/DayPerMonth.java @@ -17,6 +17,6 @@ protected void validate(final int day) { } protected boolean isInAppropriateRange(final int day) { - return day >= DEFAULT_FIRST_DAY.getDay() && day <= DECEMBER_LAST_DAY.getDay(); + return day >= DEFAULT_FIRST_DAY.getValue() && day <= DECEMBER_LAST_DAY.getValue(); } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/DecemberDay.java b/src/main/java/christmas/domain/DecemberDay.java index 0dc08b7..5054103 100644 --- a/src/main/java/christmas/domain/DecemberDay.java +++ b/src/main/java/christmas/domain/DecemberDay.java @@ -3,6 +3,9 @@ import static christmas.domain.constant.DayConstant.DECEMBER_CHRISTMAS_DAY; import static christmas.domain.constant.DayConstant.DECEMBER_FIRST_DAY; import static christmas.domain.constant.DayConstant.DECEMBER_LAST_DAY; +import static christmas.domain.constant.DayConstant.FRIDAY_VALUE; +import static christmas.domain.constant.DayConstant.SATURDAY_VALUE; +import static christmas.domain.constant.DayConstant.WEEKDAY_LENGTH; import christmas.domain.exception.InvalidDayException; @@ -19,11 +22,16 @@ public static DecemberDay from(final int day) throws InvalidDayException { } public boolean isChristmasPromotionApplicable() { - return day >= DECEMBER_FIRST_DAY.getDay() && day <= DECEMBER_CHRISTMAS_DAY.getDay(); + return day >= DECEMBER_FIRST_DAY.getValue() && day <= DECEMBER_CHRISTMAS_DAY.getValue(); } - private static boolean judgeIsWeekend(final int day) { - return true; + public boolean isWeekendPromotionApplicable() { + return isWeekend(); + } + + private boolean isWeekend() { + return day % WEEKDAY_LENGTH.getValue() == FRIDAY_VALUE.getValue() + || day % WEEKDAY_LENGTH.getValue() == SATURDAY_VALUE.getValue(); } private static boolean judgeHasStar(final int day) { @@ -32,6 +40,6 @@ private static boolean judgeHasStar(final int day) { @Override protected boolean isInAppropriateRange(final int day) { - return day >= DECEMBER_FIRST_DAY.getDay() && day <= DECEMBER_LAST_DAY.getDay(); + return day >= DECEMBER_FIRST_DAY.getValue() && day <= DECEMBER_LAST_DAY.getValue(); } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/constant/DayConstant.java b/src/main/java/christmas/domain/constant/DayConstant.java index 2664c0d..5af7613 100644 --- a/src/main/java/christmas/domain/constant/DayConstant.java +++ b/src/main/java/christmas/domain/constant/DayConstant.java @@ -5,15 +5,19 @@ public enum DayConstant { DEFAULT_LAST_DAY(30), DECEMBER_FIRST_DAY(1), DECEMBER_LAST_DAY(31), - DECEMBER_CHRISTMAS_DAY(25); + DECEMBER_CHRISTMAS_DAY(25), + WEEKDAY_LENGTH(7), + FRIDAY_VALUE(1), + SATURDAY_VALUE(2), + SUNDAY_VALUE(3); - private final int day; + private final int value; - DayConstant(final int day) { - this.day = day; + DayConstant(final int value) { + this.value = value; } - public int getDay() { - return day; + public int getValue() { + return value; } } \ No newline at end of file From 7b7d2fadf652fcf6d7d3d3951d98d92309d86042 Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 14:37:14 +0900 Subject: [PATCH 42/89] feat: add feature to judge the given day is Weekday Promotion applicable or not --- docs/README.md | 2 +- src/main/java/christmas/domain/DecemberDay.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index b05f3b7..cc3224c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -90,7 +90,7 @@ - [x] 1 이상 31 μ΄ν•˜μ˜ μˆ«μžκ°€ μ•„λ‹Œ 경우, `InvalidDayException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œλ‹€. - [x] ν•΄λ‹Ή λ‚ μ§œκ°€ 크리슀마슀 D-Day ν”„λ‘œλͺ¨μ…˜ λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. - - [] 평일 할인 λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. + - [x] 평일 할인 λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. - [x] 주말 할인 λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. - [] νŠΉλ³„ 할인 λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. diff --git a/src/main/java/christmas/domain/DecemberDay.java b/src/main/java/christmas/domain/DecemberDay.java index 5054103..3603164 100644 --- a/src/main/java/christmas/domain/DecemberDay.java +++ b/src/main/java/christmas/domain/DecemberDay.java @@ -25,6 +25,10 @@ public boolean isChristmasPromotionApplicable() { return day >= DECEMBER_FIRST_DAY.getValue() && day <= DECEMBER_CHRISTMAS_DAY.getValue(); } + public boolean isWeekdayPromotionApplicable() { + return !isWeekend(); + } + public boolean isWeekendPromotionApplicable() { return isWeekend(); } From e2b34497f1188fee8e1ea29d9981cf7be511a482 Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 14:42:34 +0900 Subject: [PATCH 43/89] feat: add feature to judge the given day is Special Promotion applicable or not --- docs/README.md | 2 +- src/main/java/christmas/controller/PromotionController.java | 6 ++++-- src/main/java/christmas/domain/DecemberDay.java | 5 +++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/README.md b/docs/README.md index cc3224c..e47ec2b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -92,7 +92,7 @@ - [x] ν•΄λ‹Ή λ‚ μ§œκ°€ 크리슀마슀 D-Day ν”„λ‘œλͺ¨μ…˜ λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. - [x] 평일 할인 λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. - [x] 주말 할인 λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. - - [] νŠΉλ³„ 할인 λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. + - [x] νŠΉλ³„ 할인 λŒ€μƒ λ‚ μ§œμΈμ§€ ν™•μΈν•œλ‹€. > ### πŸ”– μ£Όλ¬Έ 내역에 λ”°λ₯Έ 이벀트 적용 μ—¬λΆ€ νŒλ‹¨ 도메인 둜직 diff --git a/src/main/java/christmas/controller/PromotionController.java b/src/main/java/christmas/controller/PromotionController.java index 4837894..6ebc55d 100644 --- a/src/main/java/christmas/controller/PromotionController.java +++ b/src/main/java/christmas/controller/PromotionController.java @@ -31,8 +31,10 @@ public void run() { DecemberDay day = insertDay(); Orders orders = insertOrders(); System.out.println(orders.calculateTotalAmount()); - System.out.println(day.isChristmasPromotionApplicable()); - System.out.println(day.isWeekendPromotionApplicable()); + System.out.println("크리슀마슀 : " + day.isChristmasPromotionApplicable()); + System.out.println("주말 : " + day.isWeekendPromotionApplicable()); + System.out.println("평일 : " + day.isWeekdayPromotionApplicable()); + System.out.println("νŠΉλ³„ : " + day.isSpecialPromotionApplicable()); } private DecemberDay insertDay() { diff --git a/src/main/java/christmas/domain/DecemberDay.java b/src/main/java/christmas/domain/DecemberDay.java index 3603164..4faf304 100644 --- a/src/main/java/christmas/domain/DecemberDay.java +++ b/src/main/java/christmas/domain/DecemberDay.java @@ -5,6 +5,7 @@ import static christmas.domain.constant.DayConstant.DECEMBER_LAST_DAY; import static christmas.domain.constant.DayConstant.FRIDAY_VALUE; import static christmas.domain.constant.DayConstant.SATURDAY_VALUE; +import static christmas.domain.constant.DayConstant.SUNDAY_VALUE; import static christmas.domain.constant.DayConstant.WEEKDAY_LENGTH; import christmas.domain.exception.InvalidDayException; @@ -38,8 +39,8 @@ private boolean isWeekend() { || day % WEEKDAY_LENGTH.getValue() == SATURDAY_VALUE.getValue(); } - private static boolean judgeHasStar(final int day) { - return true; + public boolean isSpecialPromotionApplicable() { + return day % WEEKDAY_LENGTH.getValue() == SUNDAY_VALUE.getValue() || day == DECEMBER_CHRISTMAS_DAY.getValue(); } @Override From 106f6522622217d4f193a7bfcb4d91c5716fc6a9 Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 15:01:21 +0900 Subject: [PATCH 44/89] refactor: divide one controller to many controller to make domains more independent from each other --- src/main/java/christmas/Application.java | 9 ++- .../java/christmas/DecemberPromotion.java | 36 +++++++++++ .../christmas/controller/DayController.java | 36 +++++++++++ .../controller/OrdersController.java | 37 +++++++++++ .../controller/PromotionController.java | 61 +------------------ 5 files changed, 118 insertions(+), 61 deletions(-) create mode 100644 src/main/java/christmas/DecemberPromotion.java create mode 100644 src/main/java/christmas/controller/DayController.java create mode 100644 src/main/java/christmas/controller/OrdersController.java diff --git a/src/main/java/christmas/Application.java b/src/main/java/christmas/Application.java index efa09ea..716a72a 100644 --- a/src/main/java/christmas/Application.java +++ b/src/main/java/christmas/Application.java @@ -1,10 +1,13 @@ package christmas; -import christmas.controller.PromotionController; +import christmas.view.input.InputView; +import christmas.view.output.OutputView; public class Application { public static void main(String[] args) { - PromotionController promotionController = new PromotionController(); - promotionController.run(); + InputView inputView = new InputView(); + OutputView outputView = new OutputView(); + DecemberPromotion decemberPromotion = new DecemberPromotion(inputView, outputView); + decemberPromotion.run(); } } \ No newline at end of file diff --git a/src/main/java/christmas/DecemberPromotion.java b/src/main/java/christmas/DecemberPromotion.java new file mode 100644 index 0000000..fd0c317 --- /dev/null +++ b/src/main/java/christmas/DecemberPromotion.java @@ -0,0 +1,36 @@ +package christmas; + +import christmas.controller.DayController; +import christmas.controller.OrdersController; +import christmas.controller.PromotionController; +import christmas.domain.DecemberDay; +import christmas.domain.Orders; +import christmas.view.input.InputView; +import christmas.view.output.OutputView; + +public class DecemberPromotion { + private final InputView inputView; + private final OutputView outputView; + private final DayController dayController; + private final OrdersController ordersController; + private final PromotionController promotionController; + + public DecemberPromotion(InputView inputView, OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + dayController = new DayController(inputView, outputView); + ordersController = new OrdersController(inputView, outputView); + promotionController = new PromotionController(inputView, outputView); + } + + public void run() { + outputView.printGreetingMessage(); + DecemberDay day = dayController.insertDay(); + Orders orders = ordersController.insertOrders(); + System.out.println(orders.calculateTotalAmount()); + System.out.println("크리슀마슀 : " + day.isChristmasPromotionApplicable()); + System.out.println("주말 : " + day.isWeekendPromotionApplicable()); + System.out.println("평일 : " + day.isWeekdayPromotionApplicable()); + System.out.println("νŠΉλ³„ : " + day.isSpecialPromotionApplicable()); + } +} \ No newline at end of file diff --git a/src/main/java/christmas/controller/DayController.java b/src/main/java/christmas/controller/DayController.java new file mode 100644 index 0000000..cac91d5 --- /dev/null +++ b/src/main/java/christmas/controller/DayController.java @@ -0,0 +1,36 @@ +package christmas.controller; + +import christmas.domain.DecemberDay; +import christmas.domain.exception.InvalidDayException; +import christmas.service.DayService; +import christmas.view.input.InputView; +import christmas.view.input.exception.BasicInputException; +import christmas.view.input.exception.DayInputException; +import christmas.view.output.OutputView; + +public class DayController { + private final InputView inputView; + private final OutputView outputView; + private final DayService dayService; + + public DayController(final InputView inputView, final OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + dayService = new DayService(); + } + + public DecemberDay insertDay() { + try { + int reservationDay = askToInsertReservationDay(); + return dayService.createDay(reservationDay); + } catch (BasicInputException | DayInputException | InvalidDayException e) { + outputView.printErrorMessage(e.getMessage()); + return insertDay(); + } + } + + private int askToInsertReservationDay() throws BasicInputException, DayInputException { + outputView.askToInsertReservationDay(); + return inputView.getDay(); + } +} \ No newline at end of file diff --git a/src/main/java/christmas/controller/OrdersController.java b/src/main/java/christmas/controller/OrdersController.java new file mode 100644 index 0000000..5228e0b --- /dev/null +++ b/src/main/java/christmas/controller/OrdersController.java @@ -0,0 +1,37 @@ +package christmas.controller; + +import christmas.domain.Orders; +import christmas.domain.exception.InvalidOrdersException; +import christmas.service.OrdersService; +import christmas.view.input.InputView; +import christmas.view.input.exception.BasicInputException; +import christmas.view.input.exception.OrdersInputException; +import christmas.view.output.OutputView; +import java.util.Map; + +public class OrdersController { + private final InputView inputView; + private final OutputView outputView; + private final OrdersService ordersService; + + public OrdersController(InputView inputView, OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + ordersService = new OrdersService(); + } + + public Orders insertOrders() { + try { + Map orders = askToInsertOrders(); + return ordersService.createOrders(orders); + } catch (BasicInputException | OrdersInputException | InvalidOrdersException e) { + outputView.printErrorMessage(e.getMessage()); + return insertOrders(); + } + } + + private Map askToInsertOrders() { + outputView.askToInsertOrders(); + return inputView.getOrders(); + } +} \ No newline at end of file diff --git a/src/main/java/christmas/controller/PromotionController.java b/src/main/java/christmas/controller/PromotionController.java index 6ebc55d..edab2ca 100644 --- a/src/main/java/christmas/controller/PromotionController.java +++ b/src/main/java/christmas/controller/PromotionController.java @@ -1,69 +1,14 @@ package christmas.controller; -import christmas.domain.DecemberDay; -import christmas.domain.Orders; -import christmas.domain.exception.InvalidDayException; -import christmas.domain.exception.InvalidOrdersException; -import christmas.service.DayService; -import christmas.service.OrdersService; import christmas.view.input.InputView; -import christmas.view.input.exception.BasicInputException; -import christmas.view.input.exception.DayInputException; -import christmas.view.input.exception.OrdersInputException; import christmas.view.output.OutputView; -import java.util.Map; public class PromotionController { private final InputView inputView; private final OutputView outputView; - private final DayService dayService; - private final OrdersService ordersService; - public PromotionController() { - this.inputView = new InputView(); - this.outputView = new OutputView(); - this.dayService = new DayService(); - this.ordersService = new OrdersService(); - } - - public void run() { - outputView.printGreetingMessage(); - DecemberDay day = insertDay(); - Orders orders = insertOrders(); - System.out.println(orders.calculateTotalAmount()); - System.out.println("크리슀마슀 : " + day.isChristmasPromotionApplicable()); - System.out.println("주말 : " + day.isWeekendPromotionApplicable()); - System.out.println("평일 : " + day.isWeekdayPromotionApplicable()); - System.out.println("νŠΉλ³„ : " + day.isSpecialPromotionApplicable()); - } - - private DecemberDay insertDay() { - try { - int reservationDay = askToInsertReservationDay(); - return dayService.createDay(reservationDay); - } catch (BasicInputException | DayInputException | InvalidDayException e) { - outputView.printErrorMessage(e.getMessage()); - return insertDay(); - } - } - - private int askToInsertReservationDay() throws BasicInputException, DayInputException { - outputView.askToInsertReservationDay(); - return inputView.getDay(); - } - - private Orders insertOrders() { - try { - Map orders = askToInsertOrders(); - return ordersService.createOrders(orders); - } catch (BasicInputException | OrdersInputException | InvalidOrdersException e) { - outputView.printErrorMessage(e.getMessage()); - return insertOrders(); - } - } - - private Map askToInsertOrders() { - outputView.askToInsertOrders(); - return inputView.getOrders(); + public PromotionController(final InputView inputView, final OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; } } \ No newline at end of file From 8eb9fcaa66f3959d3caa780f5589bf8910ab9f34 Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 18:22:34 +0900 Subject: [PATCH 45/89] feat: add feature to determine whether event is applicable to the total amount of orders or not --- docs/README.md | 2 +- src/main/java/christmas/Application.java | 6 ++-- .../java/christmas/DecemberPromotion.java | 36 ------------------- src/main/java/christmas/EventPlanner.java | 29 +++++++++++++++ .../controller/PromotionController.java | 14 -------- src/main/java/christmas/domain/Orders.java | 7 +++- .../domain/constant/EventConstant.java | 15 ++++++++ .../java/christmas/service/EventService.java | 4 +++ 8 files changed, 57 insertions(+), 56 deletions(-) delete mode 100644 src/main/java/christmas/DecemberPromotion.java create mode 100644 src/main/java/christmas/EventPlanner.java delete mode 100644 src/main/java/christmas/controller/PromotionController.java create mode 100644 src/main/java/christmas/domain/constant/EventConstant.java create mode 100644 src/main/java/christmas/service/EventService.java diff --git a/docs/README.md b/docs/README.md index e47ec2b..cd7ed83 100644 --- a/docs/README.md +++ b/docs/README.md @@ -101,7 +101,7 @@ - [x] `μ£Όλ¬Έ λ‚΄μ—­`을 μ·¨ν•©ν–ˆμ„ λ•Œ, `μ£Όλ¬Έ λ‚΄μ—­`에 음료수만 μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `InvalidOrdersException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. - - [] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ κΈˆμ•‘μ΄ `10000원` μ΄ν•˜μ΄λ©΄, 할인 이벀트 적용 λŒ€μƒμ—μ„œ μ œμ™Έμ‹œν‚¨λ‹€. + - [x] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ κΈˆμ•‘μ΄ `10000원` μ΄ν•˜μ΄λ©΄, 할인 이벀트 적용 λŒ€μƒμ—μ„œ μ œμ™Έμ‹œν‚¨λ‹€. - [] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ κΈˆμ•‘μ΄ `12λ§Œμ› 이상`일 μ‹œ, `μƒ΄νŽ˜μΈ 1개` λ₯Ό μ¦μ •ν•œλ‹€. - [x] μ£Όλ¬Έ 내역을 μ΄μš©ν•΄μ„œ `할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘`을 계산할 수 μžˆλ‹€. diff --git a/src/main/java/christmas/Application.java b/src/main/java/christmas/Application.java index 716a72a..579e42e 100644 --- a/src/main/java/christmas/Application.java +++ b/src/main/java/christmas/Application.java @@ -5,9 +5,7 @@ public class Application { public static void main(String[] args) { - InputView inputView = new InputView(); - OutputView outputView = new OutputView(); - DecemberPromotion decemberPromotion = new DecemberPromotion(inputView, outputView); - decemberPromotion.run(); + EventPlanner eventPlanner = new EventPlanner(new InputView(), new OutputView()); + eventPlanner.execute(); } } \ No newline at end of file diff --git a/src/main/java/christmas/DecemberPromotion.java b/src/main/java/christmas/DecemberPromotion.java deleted file mode 100644 index fd0c317..0000000 --- a/src/main/java/christmas/DecemberPromotion.java +++ /dev/null @@ -1,36 +0,0 @@ -package christmas; - -import christmas.controller.DayController; -import christmas.controller.OrdersController; -import christmas.controller.PromotionController; -import christmas.domain.DecemberDay; -import christmas.domain.Orders; -import christmas.view.input.InputView; -import christmas.view.output.OutputView; - -public class DecemberPromotion { - private final InputView inputView; - private final OutputView outputView; - private final DayController dayController; - private final OrdersController ordersController; - private final PromotionController promotionController; - - public DecemberPromotion(InputView inputView, OutputView outputView) { - this.inputView = inputView; - this.outputView = outputView; - dayController = new DayController(inputView, outputView); - ordersController = new OrdersController(inputView, outputView); - promotionController = new PromotionController(inputView, outputView); - } - - public void run() { - outputView.printGreetingMessage(); - DecemberDay day = dayController.insertDay(); - Orders orders = ordersController.insertOrders(); - System.out.println(orders.calculateTotalAmount()); - System.out.println("크리슀마슀 : " + day.isChristmasPromotionApplicable()); - System.out.println("주말 : " + day.isWeekendPromotionApplicable()); - System.out.println("평일 : " + day.isWeekdayPromotionApplicable()); - System.out.println("νŠΉλ³„ : " + day.isSpecialPromotionApplicable()); - } -} \ No newline at end of file diff --git a/src/main/java/christmas/EventPlanner.java b/src/main/java/christmas/EventPlanner.java new file mode 100644 index 0000000..93e523b --- /dev/null +++ b/src/main/java/christmas/EventPlanner.java @@ -0,0 +1,29 @@ +package christmas; + +import christmas.controller.DayController; +import christmas.controller.OrdersController; +import christmas.domain.DecemberDay; +import christmas.domain.Orders; +import christmas.service.EventService; +import christmas.view.input.InputView; +import christmas.view.output.OutputView; + +public class EventPlanner { + private final OutputView outputView; + private final DayController dayController; + private final OrdersController ordersController; + private final EventService eventService; + + public EventPlanner(InputView inputView, OutputView outputView) { + this.outputView = outputView; + dayController = new DayController(inputView, outputView); + ordersController = new OrdersController(inputView, outputView); + eventService = new EventService(); + outputView.printGreetingMessage(); + } + + public void execute() { + DecemberDay day = dayController.insertDay(); + Orders orders = ordersController.insertOrders(); + } +} \ No newline at end of file diff --git a/src/main/java/christmas/controller/PromotionController.java b/src/main/java/christmas/controller/PromotionController.java deleted file mode 100644 index edab2ca..0000000 --- a/src/main/java/christmas/controller/PromotionController.java +++ /dev/null @@ -1,14 +0,0 @@ -package christmas.controller; - -import christmas.view.input.InputView; -import christmas.view.output.OutputView; - -public class PromotionController { - private final InputView inputView; - private final OutputView outputView; - - public PromotionController(final InputView inputView, final OutputView outputView) { - this.inputView = inputView; - this.outputView = outputView; - } -} \ No newline at end of file diff --git a/src/main/java/christmas/domain/Orders.java b/src/main/java/christmas/domain/Orders.java index 4c059a1..406003f 100644 --- a/src/main/java/christmas/domain/Orders.java +++ b/src/main/java/christmas/domain/Orders.java @@ -1,5 +1,6 @@ package christmas.domain; +import static christmas.domain.constant.EventConstant.EVENT_APPLICABLE_AMOUNT; import static christmas.domain.constant.OrdersConstant.MAX_MENU_COUNTS; import static christmas.domain.exception.message.InvalidOrdersExceptionMessage.EXCEED_MENU_COUNTS_UPPER_LIMIT; import static christmas.domain.exception.message.InvalidOrdersExceptionMessage.MENUS_ONLY_CONTAIN_BEVERAGE; @@ -48,9 +49,13 @@ private static boolean orderedMenusOnlyContainBeverage(List orders) { .allMatch(order -> order.getFoodType() == FoodType.BEVERAGE); } - public int calculateTotalAmount() { + public int calculateTotalAmountWithoutDiscount() { return orders.stream() .mapToInt(Order::getTotalPrice) .sum(); } + + public boolean isEventApplicable() { + return calculateTotalAmountWithoutDiscount() >= EVENT_APPLICABLE_AMOUNT.getValue(); + } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/constant/EventConstant.java b/src/main/java/christmas/domain/constant/EventConstant.java new file mode 100644 index 0000000..e95cf80 --- /dev/null +++ b/src/main/java/christmas/domain/constant/EventConstant.java @@ -0,0 +1,15 @@ +package christmas.domain.constant; + +public enum EventConstant { + EVENT_APPLICABLE_AMOUNT(10000); + + private final int value; + + EventConstant(final int value) { + this.value = value; + } + + public int getValue() { + return value; + } +} \ No newline at end of file diff --git a/src/main/java/christmas/service/EventService.java b/src/main/java/christmas/service/EventService.java new file mode 100644 index 0000000..e347ed4 --- /dev/null +++ b/src/main/java/christmas/service/EventService.java @@ -0,0 +1,4 @@ +package christmas.service; + +public class EventService { +} \ No newline at end of file From 80b5feb94157170b8c74c05e59f11fbe81432f72 Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 18:30:25 +0900 Subject: [PATCH 46/89] feat: add feature to determine whether gift event is applicable to the total amount of orders or not --- docs/README.md | 2 +- src/main/java/christmas/domain/Orders.java | 5 +++++ .../java/christmas/domain/constant/EventConstant.java | 3 ++- src/main/java/christmas/domain/constant/Menu.java | 10 +++++----- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/docs/README.md b/docs/README.md index cd7ed83..1cfa80c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -102,7 +102,7 @@ - [x] μœ„ 경우λ₯Ό λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λŠ” 경우 `InvalidOrdersException`을 λ°œμƒμ‹œν‚€κ³ ,
"[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."λΌλŠ” λ©”μ‹œμ§€λ₯Ό 내보낸닀.
이후 λ‹€μ‹œ `μ£Όλ¬Έ λ‚΄μ—­`을 μž…λ ₯을 λ°›λŠ”λ‹€. - [x] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ κΈˆμ•‘μ΄ `10000원` μ΄ν•˜μ΄λ©΄, 할인 이벀트 적용 λŒ€μƒμ—μ„œ μ œμ™Έμ‹œν‚¨λ‹€. - - [] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ κΈˆμ•‘μ΄ `12λ§Œμ› 이상`일 μ‹œ, `μƒ΄νŽ˜μΈ 1개` λ₯Ό μ¦μ •ν•œλ‹€. + - [x] μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ κΈˆμ•‘μ΄ `12λ§Œμ› 이상`일 μ‹œ, `μƒ΄νŽ˜μΈ 1개` λ₯Ό μ¦μ •ν•œλ‹€. - [x] μ£Όλ¬Έ 내역을 μ΄μš©ν•΄μ„œ `할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘`을 계산할 수 μžˆλ‹€. > ### πŸŽ„ μ£Όλ¬Έ 내역에 λŒ€ν•œ 이벀트 적용 κ²°κ³Ό μ‚°μΆœ 도메인 둜직 diff --git a/src/main/java/christmas/domain/Orders.java b/src/main/java/christmas/domain/Orders.java index 406003f..f2990ab 100644 --- a/src/main/java/christmas/domain/Orders.java +++ b/src/main/java/christmas/domain/Orders.java @@ -1,6 +1,7 @@ package christmas.domain; import static christmas.domain.constant.EventConstant.EVENT_APPLICABLE_AMOUNT; +import static christmas.domain.constant.EventConstant.GIFT_EVENT_APPLICABLE_AMOUNT; import static christmas.domain.constant.OrdersConstant.MAX_MENU_COUNTS; import static christmas.domain.exception.message.InvalidOrdersExceptionMessage.EXCEED_MENU_COUNTS_UPPER_LIMIT; import static christmas.domain.exception.message.InvalidOrdersExceptionMessage.MENUS_ONLY_CONTAIN_BEVERAGE; @@ -58,4 +59,8 @@ public int calculateTotalAmountWithoutDiscount() { public boolean isEventApplicable() { return calculateTotalAmountWithoutDiscount() >= EVENT_APPLICABLE_AMOUNT.getValue(); } + + public boolean isGiftEventApplicable() { + return calculateTotalAmountWithoutDiscount() >= GIFT_EVENT_APPLICABLE_AMOUNT.getValue(); + } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/constant/EventConstant.java b/src/main/java/christmas/domain/constant/EventConstant.java index e95cf80..2ede1f9 100644 --- a/src/main/java/christmas/domain/constant/EventConstant.java +++ b/src/main/java/christmas/domain/constant/EventConstant.java @@ -1,7 +1,8 @@ package christmas.domain.constant; public enum EventConstant { - EVENT_APPLICABLE_AMOUNT(10000); + EVENT_APPLICABLE_AMOUNT(10_000), + GIFT_EVENT_APPLICABLE_AMOUNT(120_000); private final int value; diff --git a/src/main/java/christmas/domain/constant/Menu.java b/src/main/java/christmas/domain/constant/Menu.java index 616d234..c103a07 100644 --- a/src/main/java/christmas/domain/constant/Menu.java +++ b/src/main/java/christmas/domain/constant/Menu.java @@ -10,9 +10,9 @@ import java.util.Arrays; public enum Menu { - MUSHROOM_SOUP("μ–‘μ†‘μ΄μˆ˜ν”„", 6000, APPETIZER), - TAPAS("νƒ€νŒŒμŠ€", 5500, APPETIZER), - CAESAR_SALAD("μ‹œμ €μƒλŸ¬λ“œ", 8000, APPETIZER), + MUSHROOM_SOUP("μ–‘μ†‘μ΄μˆ˜ν”„", 6_000, APPETIZER), + TAPAS("νƒ€νŒŒμŠ€", 5_500, APPETIZER), + CAESAR_SALAD("μ‹œμ €μƒλŸ¬λ“œ", 8_000, APPETIZER), T_BONE_STAKE("ν‹°λ³ΈμŠ€ν…Œμ΄ν¬", 55_000, MAIN), BARBECUE_RIB("바비큐립", 54_000, MAIN), @@ -20,9 +20,9 @@ public enum Menu { CHRISTMAS_PASTA("ν¬λ¦¬μŠ€λ§ˆμŠ€νŒŒμŠ€νƒ€", 25_000, MAIN), CHOCOLATE_CAKE("μ΄ˆμ½”μΌ€μ΄ν¬", 15_000, DESSERT), - ICE_CREAM("μ•„μ΄μŠ€ν¬λ¦Ό", 5000, DESSERT), + ICE_CREAM("μ•„μ΄μŠ€ν¬λ¦Ό", 5_000, DESSERT), - ZERO_COKE("제둜콜라", 3000, BEVERAGE), + ZERO_COKE("제둜콜라", 3_000, BEVERAGE), RED_WINE("λ ˆλ“œμ™€μΈ", 60_000, BEVERAGE), CHAMPAGNE("μƒ΄νŽ˜μΈ", 25_000, BEVERAGE); From 948ccbdd8bf6df055c5544d11f8fabbd8850306a Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 19:35:40 +0900 Subject: [PATCH 47/89] docs: update feature list to have new feature that application print brief intro message when result starts to be printed --- docs/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 1cfa80c..aa6aaeb 100644 --- a/docs/README.md +++ b/docs/README.md @@ -119,7 +119,9 @@ ## πŸ–¨ [ 좜λ ₯ κΈ°λŠ₯ ] -- [] 좜λ ₯ μˆœμ„œλŠ”
`μ£Όλ¬Έ 메뉴` - `할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘` - `증정 메뉴` - `ν˜œνƒ λ‚΄μ—­`
- `μ΄ν˜œνƒ κΈˆμ•‘` - `할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘` - `12μ›” 이벀트 λ°°μ§€` 순으둜 ν•œλ‹€. +> ### πŸŽ™οΈ 이벀트 ν˜œνƒ 미리 보기 μ•Œλ¦Ό 좜λ ₯ + +- [] μž…λ ₯받은 λ‚ μ§œμ— ν•΄λ‹Ήν•˜λŠ” 이벀트 ν˜œνƒ 미리보기 μ•Œλ¦Ό 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. > ### πŸ™‹β€β™‚οΈ μ£Όλ¬Έ 메뉴 좜λ ₯ From 4c03076976efdf352de39e373e799a35cc22b16e Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 19:38:35 +0900 Subject: [PATCH 48/89] feat: add feature to print breif intro message when result starts to be printed --- docs/README.md | 2 +- src/main/java/christmas/EventPlanner.java | 13 +++++++++++++ src/main/java/christmas/view/output/OutputView.java | 7 ++++++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index aa6aaeb..3210f5b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -121,7 +121,7 @@ > ### πŸŽ™οΈ 이벀트 ν˜œνƒ 미리 보기 μ•Œλ¦Ό 좜λ ₯ -- [] μž…λ ₯받은 λ‚ μ§œμ— ν•΄λ‹Ήν•˜λŠ” 이벀트 ν˜œνƒ 미리보기 μ•Œλ¦Ό 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. +- [x] μž…λ ₯받은 λ‚ μ§œμ— ν•΄λ‹Ήν•˜λŠ” 이벀트 ν˜œνƒ 미리보기 μ•Œλ¦Ό 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. > ### πŸ™‹β€β™‚οΈ μ£Όλ¬Έ 메뉴 좜λ ₯ diff --git a/src/main/java/christmas/EventPlanner.java b/src/main/java/christmas/EventPlanner.java index 93e523b..0b2e25a 100644 --- a/src/main/java/christmas/EventPlanner.java +++ b/src/main/java/christmas/EventPlanner.java @@ -25,5 +25,18 @@ public EventPlanner(InputView inputView, OutputView outputView) { public void execute() { DecemberDay day = dayController.insertDay(); Orders orders = ordersController.insertOrders(); + printResult(day, orders); + } + + private void printResult(final DecemberDay day, final Orders orders) { + printIntroMessage(day); + } + + private void printIntroMessage(final DecemberDay day) { + outputView.announceIntroMessage(getDay(day)); + } + + private int getDay(DecemberDay day) { + return day.getDay(); } } \ No newline at end of file diff --git a/src/main/java/christmas/view/output/OutputView.java b/src/main/java/christmas/view/output/OutputView.java index 4a78b65..dbc2f7d 100644 --- a/src/main/java/christmas/view/output/OutputView.java +++ b/src/main/java/christmas/view/output/OutputView.java @@ -4,6 +4,7 @@ import static christmas.view.output.constant.OutputMessage.GREETING; import static christmas.view.output.constant.OutputMessage.INSERT_ORDERS; import static christmas.view.output.constant.OutputMessage.INSERT_RESERVATION_DAY; +import static christmas.view.output.constant.OutputMessage.SHOW_RESULT_INTRO_FORMAT; public class OutputView { public void printGreetingMessage() { @@ -21,7 +22,11 @@ public void askToInsertOrders() { printLine(); } - + public void announceIntroMessage(final int day) { + print(String.format(SHOW_RESULT_INTRO_FORMAT.getMessage(), day)); + printLine(); + } + public void printLine() { System.out.print(NEW_LINE); } From 9b76e0d34f6841aa06a0ed526bca26433a70cb42 Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 19:58:36 +0900 Subject: [PATCH 49/89] feat: add feature to print statement notifying about ordered menus --- docs/README.md | 2 +- src/main/java/christmas/EventPlanner.java | 5 +++++ .../controller/OrdersController.java | 5 +++++ .../java/christmas/domain/DecemberDay.java | 4 ++++ src/main/java/christmas/domain/Order.java | 4 ++++ src/main/java/christmas/domain/Orders.java | 4 ++++ .../java/christmas/dto/OrderedMenusDto.java | 15 +++++++++++++ .../java/christmas/service/OrdersService.java | 13 +++++++++++ .../christmas/view/output/OutputView.java | 22 +++++++++++++------ .../view/output/constant/OutputConstant.java | 5 ----- ...essage.java => OutputMessageConstant.java} | 7 +++--- .../output/constant/OutputSymbolConstant.java | 16 ++++++++++++++ 12 files changed, 86 insertions(+), 16 deletions(-) create mode 100644 src/main/java/christmas/dto/OrderedMenusDto.java delete mode 100644 src/main/java/christmas/view/output/constant/OutputConstant.java rename src/main/java/christmas/view/output/constant/{OutputMessage.java => OutputMessageConstant.java} (73%) create mode 100644 src/main/java/christmas/view/output/constant/OutputSymbolConstant.java diff --git a/docs/README.md b/docs/README.md index 3210f5b..4963cff 100644 --- a/docs/README.md +++ b/docs/README.md @@ -125,7 +125,7 @@ > ### πŸ™‹β€β™‚οΈ μ£Όλ¬Έ 메뉴 좜λ ₯ -- [] μ£Όλ¬Έ 메뉴λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. +- [x] μ£Όλ¬Έ 메뉴λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. - [] μ£Όλ¬Έ λ©”λ‰΄λŠ” `${메뉴이름} ${λ©”λ‰΄κ°œμˆ˜} 개` ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. - [] μ£Όλ¬Έν•œ 메뉴 전체λ₯Ό μœ„μ™€ 같은 ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. - [] 좜λ ₯ μˆœμ„œλŠ” 자유둭게 ν•œλ‹€. ( 에피타이저 - 메인 메뉴 - λ””μ €νŠΈ - 음료 순으둜 좜λ ₯ν•˜λŠ” 것을 κ³ λ €ν•΄λ³Έλ‹€. ) diff --git a/src/main/java/christmas/EventPlanner.java b/src/main/java/christmas/EventPlanner.java index 0b2e25a..af5d026 100644 --- a/src/main/java/christmas/EventPlanner.java +++ b/src/main/java/christmas/EventPlanner.java @@ -30,6 +30,7 @@ public void execute() { private void printResult(final DecemberDay day, final Orders orders) { printIntroMessage(day); + printOrderedMenus(orders); } private void printIntroMessage(final DecemberDay day) { @@ -39,4 +40,8 @@ private void printIntroMessage(final DecemberDay day) { private int getDay(DecemberDay day) { return day.getDay(); } + + public void printOrderedMenus(final Orders orders) { + outputView.printOrderedMenus(ordersController.createOrderedMenusDto(orders)); + } } \ No newline at end of file diff --git a/src/main/java/christmas/controller/OrdersController.java b/src/main/java/christmas/controller/OrdersController.java index 5228e0b..4a6ecaf 100644 --- a/src/main/java/christmas/controller/OrdersController.java +++ b/src/main/java/christmas/controller/OrdersController.java @@ -2,6 +2,7 @@ import christmas.domain.Orders; import christmas.domain.exception.InvalidOrdersException; +import christmas.dto.OrderedMenusDto; import christmas.service.OrdersService; import christmas.view.input.InputView; import christmas.view.input.exception.BasicInputException; @@ -34,4 +35,8 @@ private Map askToInsertOrders() { outputView.askToInsertOrders(); return inputView.getOrders(); } + + public OrderedMenusDto createOrderedMenusDto(Orders orders) { + return ordersService.createOrdersHistoryDto(orders); + } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/DecemberDay.java b/src/main/java/christmas/domain/DecemberDay.java index 4faf304..4826ba4 100644 --- a/src/main/java/christmas/domain/DecemberDay.java +++ b/src/main/java/christmas/domain/DecemberDay.java @@ -43,6 +43,10 @@ public boolean isSpecialPromotionApplicable() { return day % WEEKDAY_LENGTH.getValue() == SUNDAY_VALUE.getValue() || day == DECEMBER_CHRISTMAS_DAY.getValue(); } + public int getDay() { + return day; + } + @Override protected boolean isInAppropriateRange(final int day) { return day >= DECEMBER_FIRST_DAY.getValue() && day <= DECEMBER_LAST_DAY.getValue(); diff --git a/src/main/java/christmas/domain/Order.java b/src/main/java/christmas/domain/Order.java index 3744bc5..e36e529 100644 --- a/src/main/java/christmas/domain/Order.java +++ b/src/main/java/christmas/domain/Order.java @@ -17,6 +17,10 @@ public static Order of(final String menuName, final int count) throws InvalidOrd return new Order(Menu.searchByName(menuName), count); } + public String getMenuName() { + return menu.getName(); + } + public int getMenuCount() { return count; } diff --git a/src/main/java/christmas/domain/Orders.java b/src/main/java/christmas/domain/Orders.java index f2990ab..32c1cb3 100644 --- a/src/main/java/christmas/domain/Orders.java +++ b/src/main/java/christmas/domain/Orders.java @@ -63,4 +63,8 @@ public boolean isEventApplicable() { public boolean isGiftEventApplicable() { return calculateTotalAmountWithoutDiscount() >= GIFT_EVENT_APPLICABLE_AMOUNT.getValue(); } + + public List getOrders() { + return orders; + } } \ No newline at end of file diff --git a/src/main/java/christmas/dto/OrderedMenusDto.java b/src/main/java/christmas/dto/OrderedMenusDto.java new file mode 100644 index 0000000..8085066 --- /dev/null +++ b/src/main/java/christmas/dto/OrderedMenusDto.java @@ -0,0 +1,15 @@ +package christmas.dto; + +import java.util.Map; + +public class OrderedMenusDto { + private Map orders; + + public OrderedMenusDto(Map orders) { + this.orders = orders; + } + + public static OrderedMenusDto from(Map orders) { + return new OrderedMenusDto(orders); + } +} \ No newline at end of file diff --git a/src/main/java/christmas/service/OrdersService.java b/src/main/java/christmas/service/OrdersService.java index f0ddd01..034065e 100644 --- a/src/main/java/christmas/service/OrdersService.java +++ b/src/main/java/christmas/service/OrdersService.java @@ -2,6 +2,7 @@ import christmas.domain.Order; import christmas.domain.Orders; +import christmas.dto.OrderedMenusDto; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -20,4 +21,16 @@ private List makeOrders(Map orders) { private Order createOrder(final String menuName, final int menuCount) { return Order.of(menuName, menuCount); } + + public OrderedMenusDto createOrdersHistoryDto(Orders orders) { + return OrderedMenusDto.from(makeOrdersHistory(orders)); + } + + private Map makeOrdersHistory(Orders orders) { + return orders.getOrders().stream() + .collect(Collectors.toMap( + Order::getMenuName, + Order::getMenuCount + )); + } } \ No newline at end of file diff --git a/src/main/java/christmas/view/output/OutputView.java b/src/main/java/christmas/view/output/OutputView.java index dbc2f7d..82df5dc 100644 --- a/src/main/java/christmas/view/output/OutputView.java +++ b/src/main/java/christmas/view/output/OutputView.java @@ -1,10 +1,13 @@ package christmas.view.output; -import static christmas.view.output.constant.OutputConstant.NEW_LINE; -import static christmas.view.output.constant.OutputMessage.GREETING; -import static christmas.view.output.constant.OutputMessage.INSERT_ORDERS; -import static christmas.view.output.constant.OutputMessage.INSERT_RESERVATION_DAY; -import static christmas.view.output.constant.OutputMessage.SHOW_RESULT_INTRO_FORMAT; +import static christmas.view.output.constant.OutputMessageConstant.GREETING; +import static christmas.view.output.constant.OutputMessageConstant.INSERT_ORDERS; +import static christmas.view.output.constant.OutputMessageConstant.INSERT_RESERVATION_DAY; +import static christmas.view.output.constant.OutputMessageConstant.SHOW_RESULT_INTRO_FORMAT; +import static christmas.view.output.constant.OutputSymbolConstant.NEW_LINE; +import static christmas.view.output.constant.OutputSymbolConstant.ORDERED_MENUS; + +import christmas.dto.OrderedMenusDto; public class OutputView { public void printGreetingMessage() { @@ -26,9 +29,14 @@ public void announceIntroMessage(final int day) { print(String.format(SHOW_RESULT_INTRO_FORMAT.getMessage(), day)); printLine(); } - + + public void printOrderedMenus(OrderedMenusDto orderedMenusDto) { + print(ORDERED_MENUS.getSymbol()); + + } + public void printLine() { - System.out.print(NEW_LINE); + System.out.print(NEW_LINE.getSymbol()); } public void printErrorMessage(final String message) { diff --git a/src/main/java/christmas/view/output/constant/OutputConstant.java b/src/main/java/christmas/view/output/constant/OutputConstant.java deleted file mode 100644 index eef02c3..0000000 --- a/src/main/java/christmas/view/output/constant/OutputConstant.java +++ /dev/null @@ -1,5 +0,0 @@ -package christmas.view.output.constant; - -public class OutputConstant { - public static String NEW_LINE = System.lineSeparator(); -} \ No newline at end of file diff --git a/src/main/java/christmas/view/output/constant/OutputMessage.java b/src/main/java/christmas/view/output/constant/OutputMessageConstant.java similarity index 73% rename from src/main/java/christmas/view/output/constant/OutputMessage.java rename to src/main/java/christmas/view/output/constant/OutputMessageConstant.java index 3a2c744..549b19f 100644 --- a/src/main/java/christmas/view/output/constant/OutputMessage.java +++ b/src/main/java/christmas/view/output/constant/OutputMessageConstant.java @@ -2,14 +2,15 @@ import static christmas.global.ApplicationConstant.CURRENT_PROMOTION_MONTH; -public enum OutputMessage { +public enum OutputMessageConstant { GREETING("μ•ˆλ…•ν•˜μ„Έμš”! μš°ν…Œμ½” 식당 " + CURRENT_PROMOTION_MONTH + "μ›” 이벀트 ν”Œλž˜λ„ˆμž…λ‹ˆλ‹€."), INSERT_RESERVATION_DAY(CURRENT_PROMOTION_MONTH + "μ›” 쀑 식당 λ°©λ¬Έ λ‚ μ§œλŠ” μ–Έμ œμΈκ°€μš”? (숫자만 μž…λ ₯ν•΄ μ£Όμ„Έμš”!)"), - INSERT_ORDERS("μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1)"); + INSERT_ORDERS("μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1)"), + SHOW_RESULT_INTRO_FORMAT(CURRENT_PROMOTION_MONTH + "μ›” %d일에 μš°ν…Œμ½” μ‹λ‹Ήμ—μ„œ 받을 이벀트 ν˜œνƒ 미리 보기!"); private final String message; - OutputMessage(final String message) { + OutputMessageConstant(final String message) { this.message = message; } diff --git a/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java b/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java new file mode 100644 index 0000000..0002438 --- /dev/null +++ b/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java @@ -0,0 +1,16 @@ +package christmas.view.output.constant; + +public enum OutputSymbolConstant { + NEW_LINE(System.lineSeparator()), + ORDERED_MENUS("<μ£Όλ¬Έ 메뉴>"); + + private final String symbol; + + OutputSymbolConstant(final String symbol) { + this.symbol = symbol; + } + + public String getSymbol() { + return symbol; + } +} \ No newline at end of file From f04383676a65417da18bd20e9e245703bc01a784 Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 20:11:52 +0900 Subject: [PATCH 50/89] feat: add feature to print ordered menu using appropriate format --- docs/README.md | 6 +++--- .../java/christmas/dto/OrderedMenusDto.java | 4 ++++ .../java/christmas/view/output/OutputView.java | 12 ++++++++++-- .../output/constant/OutputFormatConstant.java | 18 ++++++++++++++++++ .../output/constant/OutputMessageConstant.java | 3 +-- 5 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 src/main/java/christmas/view/output/constant/OutputFormatConstant.java diff --git a/docs/README.md b/docs/README.md index 4963cff..6425873 100644 --- a/docs/README.md +++ b/docs/README.md @@ -126,9 +126,9 @@ > ### πŸ™‹β€β™‚οΈ μ£Όλ¬Έ 메뉴 좜λ ₯ - [x] μ£Όλ¬Έ 메뉴λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. -- [] μ£Όλ¬Έ λ©”λ‰΄λŠ” `${메뉴이름} ${λ©”λ‰΄κ°œμˆ˜} 개` ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. -- [] μ£Όλ¬Έν•œ 메뉴 전체λ₯Ό μœ„μ™€ 같은 ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. -- [] 좜λ ₯ μˆœμ„œλŠ” 자유둭게 ν•œλ‹€. ( 에피타이저 - 메인 메뉴 - λ””μ €νŠΈ - 음료 순으둜 좜λ ₯ν•˜λŠ” 것을 κ³ λ €ν•΄λ³Έλ‹€. ) +- [x] μ£Όλ¬Έ λ©”λ‰΄λŠ” `${메뉴이름} ${λ©”λ‰΄κ°œμˆ˜} 개` ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. +- [x] μ£Όλ¬Έν•œ 메뉴 전체λ₯Ό μœ„μ™€ 같은 ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. +- [x] 좜λ ₯ μˆœμ„œλŠ” 자유둭게 ν•œλ‹€. > ### πŸ’° 할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘ 좜λ ₯ diff --git a/src/main/java/christmas/dto/OrderedMenusDto.java b/src/main/java/christmas/dto/OrderedMenusDto.java index 8085066..332ce26 100644 --- a/src/main/java/christmas/dto/OrderedMenusDto.java +++ b/src/main/java/christmas/dto/OrderedMenusDto.java @@ -12,4 +12,8 @@ public OrderedMenusDto(Map orders) { public static OrderedMenusDto from(Map orders) { return new OrderedMenusDto(orders); } + + public Map getOrders() { + return orders; + } } \ No newline at end of file diff --git a/src/main/java/christmas/view/output/OutputView.java b/src/main/java/christmas/view/output/OutputView.java index 82df5dc..ddbf890 100644 --- a/src/main/java/christmas/view/output/OutputView.java +++ b/src/main/java/christmas/view/output/OutputView.java @@ -1,9 +1,10 @@ package christmas.view.output; +import static christmas.view.output.constant.OutputFormatConstant.ORDERED_MENUS_PRINT_FORMAT; +import static christmas.view.output.constant.OutputFormatConstant.SHOW_RESULT_INTRO_FORMAT; import static christmas.view.output.constant.OutputMessageConstant.GREETING; import static christmas.view.output.constant.OutputMessageConstant.INSERT_ORDERS; import static christmas.view.output.constant.OutputMessageConstant.INSERT_RESERVATION_DAY; -import static christmas.view.output.constant.OutputMessageConstant.SHOW_RESULT_INTRO_FORMAT; import static christmas.view.output.constant.OutputSymbolConstant.NEW_LINE; import static christmas.view.output.constant.OutputSymbolConstant.ORDERED_MENUS; @@ -26,13 +27,20 @@ public void askToInsertOrders() { } public void announceIntroMessage(final int day) { - print(String.format(SHOW_RESULT_INTRO_FORMAT.getMessage(), day)); + print(String.format(SHOW_RESULT_INTRO_FORMAT.getFormat(), day)); + printLine(); printLine(); } public void printOrderedMenus(OrderedMenusDto orderedMenusDto) { print(ORDERED_MENUS.getSymbol()); + printLine(); + orderedMenusDto.getOrders().forEach(this::printOrderedMenu); + } + private void printOrderedMenu(final String menuName, final int menuCount) { + print(String.format(ORDERED_MENUS_PRINT_FORMAT.getFormat(), menuName, menuCount)); + printLine(); } public void printLine() { diff --git a/src/main/java/christmas/view/output/constant/OutputFormatConstant.java b/src/main/java/christmas/view/output/constant/OutputFormatConstant.java new file mode 100644 index 0000000..37f9b2e --- /dev/null +++ b/src/main/java/christmas/view/output/constant/OutputFormatConstant.java @@ -0,0 +1,18 @@ +package christmas.view.output.constant; + +import static christmas.global.ApplicationConstant.CURRENT_PROMOTION_MONTH; + +public enum OutputFormatConstant { + SHOW_RESULT_INTRO_FORMAT(CURRENT_PROMOTION_MONTH + "μ›” %d일에 μš°ν…Œμ½” μ‹λ‹Ήμ—μ„œ 받을 이벀트 ν˜œνƒ 미리 보기!"), + ORDERED_MENUS_PRINT_FORMAT("%s %d개"); + + private final String format; + + OutputFormatConstant(final String format) { + this.format = format; + } + + public String getFormat() { + return format; + } +} diff --git a/src/main/java/christmas/view/output/constant/OutputMessageConstant.java b/src/main/java/christmas/view/output/constant/OutputMessageConstant.java index 549b19f..5c825ba 100644 --- a/src/main/java/christmas/view/output/constant/OutputMessageConstant.java +++ b/src/main/java/christmas/view/output/constant/OutputMessageConstant.java @@ -5,8 +5,7 @@ public enum OutputMessageConstant { GREETING("μ•ˆλ…•ν•˜μ„Έμš”! μš°ν…Œμ½” 식당 " + CURRENT_PROMOTION_MONTH + "μ›” 이벀트 ν”Œλž˜λ„ˆμž…λ‹ˆλ‹€."), INSERT_RESERVATION_DAY(CURRENT_PROMOTION_MONTH + "μ›” 쀑 식당 λ°©λ¬Έ λ‚ μ§œλŠ” μ–Έμ œμΈκ°€μš”? (숫자만 μž…λ ₯ν•΄ μ£Όμ„Έμš”!)"), - INSERT_ORDERS("μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1)"), - SHOW_RESULT_INTRO_FORMAT(CURRENT_PROMOTION_MONTH + "μ›” %d일에 μš°ν…Œμ½” μ‹λ‹Ήμ—μ„œ 받을 이벀트 ν˜œνƒ 미리 보기!"); + INSERT_ORDERS("μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1)"); private final String message; From 1113983df5e184fa26774fb6a521be22cd40cbce Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 20:51:33 +0900 Subject: [PATCH 51/89] feat: add feature to print statement notifying about total amount with no discount --- docs/README.md | 2 +- src/main/java/christmas/EventPlanner.java | 7 ++++++- .../christmas/controller/OrdersController.java | 5 +++++ src/main/java/christmas/domain/Orders.java | 6 +++--- .../java/christmas/dto/OrderedMenusDto.java | 2 +- .../dto/TotalAmountWithNoDiscountDto.java | 17 +++++++++++++++++ .../java/christmas/service/OrdersService.java | 5 +++++ .../java/christmas/view/output/OutputView.java | 18 +++++++++++++++--- .../output/constant/OutputSymbolConstant.java | 3 ++- 9 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 src/main/java/christmas/dto/TotalAmountWithNoDiscountDto.java diff --git a/docs/README.md b/docs/README.md index 6425873..c5e6dc8 100644 --- a/docs/README.md +++ b/docs/README.md @@ -132,7 +132,7 @@ > ### πŸ’° 할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘ 좜λ ₯ -- [] 할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘μ„ λ‚˜νƒ€λ‚΄λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. +- [x] 할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘μ„ λ‚˜νƒ€λ‚΄λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. - [] `할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘`을 λ‚˜νƒ€λ‚Έλ‹€. - [] κΈˆμ•‘μ˜ μ„Έμžλ¦¬ μˆ˜λ§ˆλ‹€ `,`을 λΆ™μ΄λŠ” ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. diff --git a/src/main/java/christmas/EventPlanner.java b/src/main/java/christmas/EventPlanner.java index af5d026..4704c5a 100644 --- a/src/main/java/christmas/EventPlanner.java +++ b/src/main/java/christmas/EventPlanner.java @@ -31,6 +31,7 @@ public void execute() { private void printResult(final DecemberDay day, final Orders orders) { printIntroMessage(day); printOrderedMenus(orders); + printTotalAmountWithNoDiscount(orders); } private void printIntroMessage(final DecemberDay day) { @@ -41,7 +42,11 @@ private int getDay(DecemberDay day) { return day.getDay(); } - public void printOrderedMenus(final Orders orders) { + private void printOrderedMenus(final Orders orders) { outputView.printOrderedMenus(ordersController.createOrderedMenusDto(orders)); } + + private void printTotalAmountWithNoDiscount(final Orders orders) { + outputView.printTotalAmountWithNoDiscount(ordersController.createTotalAmountWithNoDiscountDto(orders)); + } } \ No newline at end of file diff --git a/src/main/java/christmas/controller/OrdersController.java b/src/main/java/christmas/controller/OrdersController.java index 4a6ecaf..dbb6e9f 100644 --- a/src/main/java/christmas/controller/OrdersController.java +++ b/src/main/java/christmas/controller/OrdersController.java @@ -3,6 +3,7 @@ import christmas.domain.Orders; import christmas.domain.exception.InvalidOrdersException; import christmas.dto.OrderedMenusDto; +import christmas.dto.TotalAmountWithNoDiscountDto; import christmas.service.OrdersService; import christmas.view.input.InputView; import christmas.view.input.exception.BasicInputException; @@ -39,4 +40,8 @@ private Map askToInsertOrders() { public OrderedMenusDto createOrderedMenusDto(Orders orders) { return ordersService.createOrdersHistoryDto(orders); } + + public TotalAmountWithNoDiscountDto createTotalAmountWithNoDiscountDto(Orders orders) { + return ordersService.createTotalAmountWithNoDiscountDto(orders); + } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/Orders.java b/src/main/java/christmas/domain/Orders.java index 32c1cb3..c8df89a 100644 --- a/src/main/java/christmas/domain/Orders.java +++ b/src/main/java/christmas/domain/Orders.java @@ -50,18 +50,18 @@ private static boolean orderedMenusOnlyContainBeverage(List orders) { .allMatch(order -> order.getFoodType() == FoodType.BEVERAGE); } - public int calculateTotalAmountWithoutDiscount() { + public int calculateTotalAmountWithNoDiscount() { return orders.stream() .mapToInt(Order::getTotalPrice) .sum(); } public boolean isEventApplicable() { - return calculateTotalAmountWithoutDiscount() >= EVENT_APPLICABLE_AMOUNT.getValue(); + return calculateTotalAmountWithNoDiscount() >= EVENT_APPLICABLE_AMOUNT.getValue(); } public boolean isGiftEventApplicable() { - return calculateTotalAmountWithoutDiscount() >= GIFT_EVENT_APPLICABLE_AMOUNT.getValue(); + return calculateTotalAmountWithNoDiscount() >= GIFT_EVENT_APPLICABLE_AMOUNT.getValue(); } public List getOrders() { diff --git a/src/main/java/christmas/dto/OrderedMenusDto.java b/src/main/java/christmas/dto/OrderedMenusDto.java index 332ce26..a7193ed 100644 --- a/src/main/java/christmas/dto/OrderedMenusDto.java +++ b/src/main/java/christmas/dto/OrderedMenusDto.java @@ -3,7 +3,7 @@ import java.util.Map; public class OrderedMenusDto { - private Map orders; + private final Map orders; public OrderedMenusDto(Map orders) { this.orders = orders; diff --git a/src/main/java/christmas/dto/TotalAmountWithNoDiscountDto.java b/src/main/java/christmas/dto/TotalAmountWithNoDiscountDto.java new file mode 100644 index 0000000..5cabde5 --- /dev/null +++ b/src/main/java/christmas/dto/TotalAmountWithNoDiscountDto.java @@ -0,0 +1,17 @@ +package christmas.dto; + +public class TotalAmountWithNoDiscountDto { + private final int amount; + + public TotalAmountWithNoDiscountDto(final int amount) { + this.amount = amount; + } + + public static TotalAmountWithNoDiscountDto from(final int amount) { + return new TotalAmountWithNoDiscountDto(amount); + } + + public int getAmount() { + return amount; + } +} \ No newline at end of file diff --git a/src/main/java/christmas/service/OrdersService.java b/src/main/java/christmas/service/OrdersService.java index 034065e..40925f3 100644 --- a/src/main/java/christmas/service/OrdersService.java +++ b/src/main/java/christmas/service/OrdersService.java @@ -3,6 +3,7 @@ import christmas.domain.Order; import christmas.domain.Orders; import christmas.dto.OrderedMenusDto; +import christmas.dto.TotalAmountWithNoDiscountDto; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -33,4 +34,8 @@ private Map makeOrdersHistory(Orders orders) { Order::getMenuCount )); } + + public TotalAmountWithNoDiscountDto createTotalAmountWithNoDiscountDto(Orders orders) { + return TotalAmountWithNoDiscountDto.from(orders.calculateTotalAmountWithNoDiscount()); + } } \ No newline at end of file diff --git a/src/main/java/christmas/view/output/OutputView.java b/src/main/java/christmas/view/output/OutputView.java index ddbf890..a8c56c6 100644 --- a/src/main/java/christmas/view/output/OutputView.java +++ b/src/main/java/christmas/view/output/OutputView.java @@ -7,8 +7,10 @@ import static christmas.view.output.constant.OutputMessageConstant.INSERT_RESERVATION_DAY; import static christmas.view.output.constant.OutputSymbolConstant.NEW_LINE; import static christmas.view.output.constant.OutputSymbolConstant.ORDERED_MENUS; +import static christmas.view.output.constant.OutputSymbolConstant.TOTAL_AMOUNT_WITH_NO_DISCOUNT; import christmas.dto.OrderedMenusDto; +import christmas.dto.TotalAmountWithNoDiscountDto; public class OutputView { public void printGreetingMessage() { @@ -27,7 +29,7 @@ public void askToInsertOrders() { } public void announceIntroMessage(final int day) { - print(String.format(SHOW_RESULT_INTRO_FORMAT.getFormat(), day)); + printFormatted(SHOW_RESULT_INTRO_FORMAT.getFormat(), day); printLine(); printLine(); } @@ -39,7 +41,13 @@ public void printOrderedMenus(OrderedMenusDto orderedMenusDto) { } private void printOrderedMenu(final String menuName, final int menuCount) { - print(String.format(ORDERED_MENUS_PRINT_FORMAT.getFormat(), menuName, menuCount)); + printFormatted(ORDERED_MENUS_PRINT_FORMAT.getFormat(), menuName, menuCount); + printLine(); + } + + public void printTotalAmountWithNoDiscount(TotalAmountWithNoDiscountDto totalAmountWithNoDiscountDto) { + printLine(); + print(TOTAL_AMOUNT_WITH_NO_DISCOUNT.getSymbol()); printLine(); } @@ -52,7 +60,11 @@ public void printErrorMessage(final String message) { printLine(); } - private void print(final T message) { + private void print(final String message) { System.out.print(message); } + + private void printFormatted(final String format, final Object... args) { + print(String.format(format, args)); + } } \ No newline at end of file diff --git a/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java b/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java index 0002438..806d085 100644 --- a/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java +++ b/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java @@ -2,7 +2,8 @@ public enum OutputSymbolConstant { NEW_LINE(System.lineSeparator()), - ORDERED_MENUS("<μ£Όλ¬Έ 메뉴>"); + ORDERED_MENUS("<μ£Όλ¬Έ 메뉴>"), + TOTAL_AMOUNT_WITH_NO_DISCOUNT("<할인 μ „ 총주문 κΈˆμ•‘>"); private final String symbol; From 16d37bd4d8b696b0315bfd1b7e67130548fe6477 Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 21:10:51 +0900 Subject: [PATCH 52/89] refactor: rename class name DecemberDay to ReservationDay to imply it can be used not only for December but also other month promotion --- src/main/java/christmas/EventPlanner.java | 14 +++++--------- .../christmas/controller/DayController.java | 9 +++++++-- .../{DecemberDay.java => ReservationDay.java} | 8 ++++---- .../christmas/dto/EventBenefitsPreviewDto.java | 17 +++++++++++++++++ .../christmas/global/ApplicationConstant.java | 3 +++ src/main/java/christmas/service/DayService.java | 11 ++++++++--- .../java/christmas/view/output/OutputView.java | 5 +++-- 7 files changed, 47 insertions(+), 20 deletions(-) rename src/main/java/christmas/domain/{DecemberDay.java => ReservationDay.java} (88%) create mode 100644 src/main/java/christmas/dto/EventBenefitsPreviewDto.java diff --git a/src/main/java/christmas/EventPlanner.java b/src/main/java/christmas/EventPlanner.java index 4704c5a..0907bac 100644 --- a/src/main/java/christmas/EventPlanner.java +++ b/src/main/java/christmas/EventPlanner.java @@ -2,8 +2,8 @@ import christmas.controller.DayController; import christmas.controller.OrdersController; -import christmas.domain.DecemberDay; import christmas.domain.Orders; +import christmas.domain.ReservationDay; import christmas.service.EventService; import christmas.view.input.InputView; import christmas.view.output.OutputView; @@ -23,23 +23,19 @@ public EventPlanner(InputView inputView, OutputView outputView) { } public void execute() { - DecemberDay day = dayController.insertDay(); + ReservationDay day = dayController.insertDay(); Orders orders = ordersController.insertOrders(); printResult(day, orders); } - private void printResult(final DecemberDay day, final Orders orders) { + private void printResult(final ReservationDay day, final Orders orders) { printIntroMessage(day); printOrderedMenus(orders); printTotalAmountWithNoDiscount(orders); } - private void printIntroMessage(final DecemberDay day) { - outputView.announceIntroMessage(getDay(day)); - } - - private int getDay(DecemberDay day) { - return day.getDay(); + private void printIntroMessage(final ReservationDay day) { + outputView.printIntroMessage(dayController.createEventBenefitsPreviousDto(day)); } private void printOrderedMenus(final Orders orders) { diff --git a/src/main/java/christmas/controller/DayController.java b/src/main/java/christmas/controller/DayController.java index cac91d5..a2a87f9 100644 --- a/src/main/java/christmas/controller/DayController.java +++ b/src/main/java/christmas/controller/DayController.java @@ -1,7 +1,8 @@ package christmas.controller; -import christmas.domain.DecemberDay; +import christmas.domain.ReservationDay; import christmas.domain.exception.InvalidDayException; +import christmas.dto.EventBenefitsPreviewDto; import christmas.service.DayService; import christmas.view.input.InputView; import christmas.view.input.exception.BasicInputException; @@ -19,7 +20,7 @@ public DayController(final InputView inputView, final OutputView outputView) { dayService = new DayService(); } - public DecemberDay insertDay() { + public ReservationDay insertDay() { try { int reservationDay = askToInsertReservationDay(); return dayService.createDay(reservationDay); @@ -33,4 +34,8 @@ private int askToInsertReservationDay() throws BasicInputException, DayInputExce outputView.askToInsertReservationDay(); return inputView.getDay(); } + + public EventBenefitsPreviewDto createEventBenefitsPreviousDto(ReservationDay day) { + return dayService.createEvenetBenefitsPreviewDto(day); + } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/DecemberDay.java b/src/main/java/christmas/domain/ReservationDay.java similarity index 88% rename from src/main/java/christmas/domain/DecemberDay.java rename to src/main/java/christmas/domain/ReservationDay.java index 4826ba4..f832a5d 100644 --- a/src/main/java/christmas/domain/DecemberDay.java +++ b/src/main/java/christmas/domain/ReservationDay.java @@ -10,16 +10,16 @@ import christmas.domain.exception.InvalidDayException; -public class DecemberDay extends DayPerMonth { +public class ReservationDay extends DayPerMonth { private final int day; - private DecemberDay(final int day) { + private ReservationDay(final int day) { validate(day); this.day = day; } - public static DecemberDay from(final int day) throws InvalidDayException { - return new DecemberDay(day); + public static ReservationDay from(final int day) throws InvalidDayException { + return new ReservationDay(day); } public boolean isChristmasPromotionApplicable() { diff --git a/src/main/java/christmas/dto/EventBenefitsPreviewDto.java b/src/main/java/christmas/dto/EventBenefitsPreviewDto.java new file mode 100644 index 0000000..9fc1315 --- /dev/null +++ b/src/main/java/christmas/dto/EventBenefitsPreviewDto.java @@ -0,0 +1,17 @@ +package christmas.dto; + +public class EventBenefitsPreviewDto { + private final int day; + + public EventBenefitsPreviewDto(final int day) { + this.day = day; + } + + public static EventBenefitsPreviewDto from(final int day) { + return new EventBenefitsPreviewDto(day); + } + + public int getDay() { + return day; + } +} \ No newline at end of file diff --git a/src/main/java/christmas/global/ApplicationConstant.java b/src/main/java/christmas/global/ApplicationConstant.java index 9d2a188..88b6009 100644 --- a/src/main/java/christmas/global/ApplicationConstant.java +++ b/src/main/java/christmas/global/ApplicationConstant.java @@ -3,4 +3,7 @@ public class ApplicationConstant { public static int CURRENT_PROMOTION_MONTH = 12; public static String ERROR_PREFIX = "[ERROR] "; + + private ApplicationConstant() { + } } \ No newline at end of file diff --git a/src/main/java/christmas/service/DayService.java b/src/main/java/christmas/service/DayService.java index 0789e9f..8f11288 100644 --- a/src/main/java/christmas/service/DayService.java +++ b/src/main/java/christmas/service/DayService.java @@ -1,10 +1,15 @@ package christmas.service; -import christmas.domain.DecemberDay; +import christmas.domain.ReservationDay; import christmas.domain.exception.InvalidDayException; +import christmas.dto.EventBenefitsPreviewDto; public class DayService { - public DecemberDay createDay(final int day) throws InvalidDayException { - return DecemberDay.from(day); + public ReservationDay createDay(final int day) throws InvalidDayException { + return ReservationDay.from(day); + } + + public EventBenefitsPreviewDto createEvenetBenefitsPreviewDto(ReservationDay day) { + return EventBenefitsPreviewDto.from(day.getDay()); } } \ No newline at end of file diff --git a/src/main/java/christmas/view/output/OutputView.java b/src/main/java/christmas/view/output/OutputView.java index a8c56c6..cb418d9 100644 --- a/src/main/java/christmas/view/output/OutputView.java +++ b/src/main/java/christmas/view/output/OutputView.java @@ -9,6 +9,7 @@ import static christmas.view.output.constant.OutputSymbolConstant.ORDERED_MENUS; import static christmas.view.output.constant.OutputSymbolConstant.TOTAL_AMOUNT_WITH_NO_DISCOUNT; +import christmas.dto.EventBenefitsPreviewDto; import christmas.dto.OrderedMenusDto; import christmas.dto.TotalAmountWithNoDiscountDto; @@ -28,8 +29,8 @@ public void askToInsertOrders() { printLine(); } - public void announceIntroMessage(final int day) { - printFormatted(SHOW_RESULT_INTRO_FORMAT.getFormat(), day); + public void printIntroMessage(EventBenefitsPreviewDto eventBenefitsPreviewDto) { + printFormatted(SHOW_RESULT_INTRO_FORMAT.getFormat(), eventBenefitsPreviewDto.getDay()); printLine(); printLine(); } From 1da8219ccab69dcaf846793eabc5632d8ac8f29e Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 21:26:39 +0900 Subject: [PATCH 53/89] feat: add feature to print total amount with no discount using appropriate format --- docs/README.md | 4 ++-- .../java/christmas/view/output/OutputView.java | 14 ++++++++++++++ .../view/output/constant/OutputFormatConstant.java | 6 ++++-- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/docs/README.md b/docs/README.md index c5e6dc8..69a40b1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -133,8 +133,8 @@ > ### πŸ’° 할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘ 좜λ ₯ - [x] 할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘μ„ λ‚˜νƒ€λ‚΄λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. -- [] `할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘`을 λ‚˜νƒ€λ‚Έλ‹€. - - [] κΈˆμ•‘μ˜ μ„Έμžλ¦¬ μˆ˜λ§ˆλ‹€ `,`을 λΆ™μ΄λŠ” ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. +- [x] `할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘`을 λ‚˜νƒ€λ‚Έλ‹€. + - [x] κΈˆμ•‘μ˜ μ„Έμžλ¦¬ μˆ˜λ§ˆλ‹€ `,`을 λΆ™μ΄λŠ” ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. > ### 🎁 증정 메뉴 좜λ ₯ diff --git a/src/main/java/christmas/view/output/OutputView.java b/src/main/java/christmas/view/output/OutputView.java index cb418d9..e1e78ae 100644 --- a/src/main/java/christmas/view/output/OutputView.java +++ b/src/main/java/christmas/view/output/OutputView.java @@ -1,7 +1,9 @@ package christmas.view.output; import static christmas.view.output.constant.OutputFormatConstant.ORDERED_MENUS_PRINT_FORMAT; +import static christmas.view.output.constant.OutputFormatConstant.PRICE_FORMAT_STYLE; import static christmas.view.output.constant.OutputFormatConstant.SHOW_RESULT_INTRO_FORMAT; +import static christmas.view.output.constant.OutputFormatConstant.TOTAL_AMOUNT_WITH_NO_DISCOUNT_PRINT_FORMAT; import static christmas.view.output.constant.OutputMessageConstant.GREETING; import static christmas.view.output.constant.OutputMessageConstant.INSERT_ORDERS; import static christmas.view.output.constant.OutputMessageConstant.INSERT_RESERVATION_DAY; @@ -12,6 +14,7 @@ import christmas.dto.EventBenefitsPreviewDto; import christmas.dto.OrderedMenusDto; import christmas.dto.TotalAmountWithNoDiscountDto; +import java.text.DecimalFormat; public class OutputView { public void printGreetingMessage() { @@ -50,6 +53,8 @@ public void printTotalAmountWithNoDiscount(TotalAmountWithNoDiscountDto totalAmo printLine(); print(TOTAL_AMOUNT_WITH_NO_DISCOUNT.getSymbol()); printLine(); + printFormattedWithPrice(TOTAL_AMOUNT_WITH_NO_DISCOUNT_PRINT_FORMAT.getFormat(), + formatPrice(totalAmountWithNoDiscountDto.getAmount())); } public void printLine() { @@ -68,4 +73,13 @@ private void print(final String message) { private void printFormatted(final String format, final Object... args) { print(String.format(format, args)); } + + private String formatPrice(final int price) { + return new DecimalFormat(PRICE_FORMAT_STYLE.getFormat()) + .format(price); + } + + private void printFormattedWithPrice(final String format, final String formattedPrice, final Object... args) { + print(String.format(String.format(format, formattedPrice), args)); + } } \ No newline at end of file diff --git a/src/main/java/christmas/view/output/constant/OutputFormatConstant.java b/src/main/java/christmas/view/output/constant/OutputFormatConstant.java index 37f9b2e..401c556 100644 --- a/src/main/java/christmas/view/output/constant/OutputFormatConstant.java +++ b/src/main/java/christmas/view/output/constant/OutputFormatConstant.java @@ -4,8 +4,10 @@ public enum OutputFormatConstant { SHOW_RESULT_INTRO_FORMAT(CURRENT_PROMOTION_MONTH + "μ›” %d일에 μš°ν…Œμ½” μ‹λ‹Ήμ—μ„œ 받을 이벀트 ν˜œνƒ 미리 보기!"), - ORDERED_MENUS_PRINT_FORMAT("%s %d개"); - + ORDERED_MENUS_PRINT_FORMAT("%s %d개"), + TOTAL_AMOUNT_WITH_NO_DISCOUNT_PRINT_FORMAT("%s원"), + PRICE_FORMAT_STYLE("###,###"); + private final String format; OutputFormatConstant(final String format) { From b37453aafb83dc6b3f46897ebc154bcec20d42f3 Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 22:03:09 +0900 Subject: [PATCH 54/89] test: add test to check ReservationDay domain logic --- .../christmas/domain/ReservationDayTest.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/test/java/christmas/domain/ReservationDayTest.java diff --git a/src/test/java/christmas/domain/ReservationDayTest.java b/src/test/java/christmas/domain/ReservationDayTest.java new file mode 100644 index 0000000..1df0c8f --- /dev/null +++ b/src/test/java/christmas/domain/ReservationDayTest.java @@ -0,0 +1,66 @@ +package christmas.domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import christmas.domain.exception.InvalidDayException; +import christmas.domain.exception.message.InvalidDayExceptionMessage; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; + +public class ReservationDayTest { + + @DisplayName("μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œ ( 1 ~ 31 μ‚¬μ΄μ˜ μˆ«μžκ°€ μ•„λ‹Œ 숫자 )λ₯Ό μž…λ ₯ν•˜λ©΄ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.") + @ParameterizedTest + @ValueSource(ints = {0, -1, -10, 300, 350, 500, 32}) + void μœ νš¨ν•˜μ§€_μ•Šμ€_λ‚ μ§œ_μž…λ ₯μ‹œ_μ˜ˆμ™Έ_λ°œμƒ(int day) { + assertThatThrownBy(() -> ReservationDay.from(day)) + .isInstanceOf(InvalidDayException.class) + .hasMessageContaining(InvalidDayExceptionMessage.NOT_IN_APPROPRIATE_RANGE.getMessage()); + } + + @DisplayName("λ‚ μ§œλ₯Ό μž…λ ₯ν•˜λ©΄ 크리슀마슀 D-Day ν”„λ‘œλͺ¨μ…˜μ΄ 적용 κ°€λŠ₯ν•œμ§€ μ—¬λΆ€λ₯Ό νŒλ‹¨ κ°€λŠ₯ν•˜λ‹€.") + @ParameterizedTest + @CsvSource(value = {"1:true", "10:true", "24:true", "31:false", "25:true", "26:false"}, delimiter = ':') + void λ‚ μ§œ_μž…λ ₯μ‹œ_크리슀마슀_디데이_ν”„λ‘œλͺ¨μ…˜_적용_κ°€λŠ₯_μ—¬λΆ€_νŒλ‹¨_κ°€λŠ₯(int day, boolean expected) { + // given, when + ReservationDay reservationDay = ReservationDay.from(day); + // then + assertThat(reservationDay.isChristmasPromotionApplicable()).isEqualTo(expected); + } + + @DisplayName("λ‚ μ§œλ₯Ό μž…λ ₯ν•˜λ©΄ 평일 할인이 적용 κ°€λŠ₯ν•œμ§€ μ—¬λΆ€λ₯Ό νŒλ‹¨ κ°€λŠ₯ν•˜λ‹€.") + @ParameterizedTest + @CsvSource(value = {"5:true", "6:true", "7:true", "8:false", "25:true", "29:false", "30:false", + "31:true"}, delimiter = ':') + void λ‚ μ§œ_μž…λ ₯μ‹œ_평일_할인_적용_κ°€λŠ₯_μ—¬λΆ€_νŒλ‹¨_κ°€λŠ₯(int day, boolean expected) { + // given, when + ReservationDay reservationDay = ReservationDay.from(day); + // then + assertThat(reservationDay.isWeekdayPromotionApplicable()).isEqualTo(expected); + } + + @DisplayName("λ‚ μ§œλ₯Ό μž…λ ₯ν•˜λ©΄ 주말 할인이 적용 κ°€λŠ₯ν•œμ§€ μ—¬λΆ€λ₯Ό νŒλ‹¨ κ°€λŠ₯ν•˜λ‹€.") + @ParameterizedTest + @CsvSource(value = {"1:true", "9:true", "15:true", "24:false", "30:true", "28:false", "31:false", + "23:true"}, delimiter = ':') + void λ‚ μ§œ_μž…λ ₯μ‹œ_주말_할인_적용_κ°€λŠ₯_μ—¬λΆ€_νŒλ‹¨_κ°€λŠ₯(int day, boolean expected) { + // given, when + ReservationDay reservationDay = ReservationDay.from(day); + // then + assertThat(reservationDay.isWeekendPromotionApplicable()).isEqualTo(expected); + } + + @DisplayName("λ‚ μ§œλ₯Ό μž…λ ₯ν•˜λ©΄ νŠΉλ³„ 할인이 적용 κ°€λŠ₯ν•œμ§€ μ—¬λΆ€λ₯Ό νŒλ‹¨ κ°€λŠ₯ν•˜λ‹€.") + @ParameterizedTest + @CsvSource(value = {"3:true", "10:true", "24:true", "26:false", "25:true", "27:false", "14:false", + "17:true", "31:true"}, delimiter = ':') + void λ‚ μ§œ_μž…λ ₯μ‹œ_νŠΉλ³„_할인_적용_κ°€λŠ₯_μ—¬λΆ€_νŒλ‹¨_κ°€λŠ₯(int day, boolean expected) { + // given, when + ReservationDay reservationDay = ReservationDay.from(day); + // then + assertThat(reservationDay.isSpecialPromotionApplicable()).isEqualTo(expected); + } +} \ No newline at end of file From 8e776f63a22f919491a27b4e5cdf4da0ac0ef88b Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 22:21:57 +0900 Subject: [PATCH 55/89] test: add test to check Order domain logic --- src/test/java/christmas/domain/OrderTest.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/test/java/christmas/domain/OrderTest.java diff --git a/src/test/java/christmas/domain/OrderTest.java b/src/test/java/christmas/domain/OrderTest.java new file mode 100644 index 0000000..88f000e --- /dev/null +++ b/src/test/java/christmas/domain/OrderTest.java @@ -0,0 +1,31 @@ +package christmas.domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import christmas.domain.exception.InvalidOrdersException; +import christmas.domain.exception.message.InvalidOrdersExceptionMessage; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +public class OrderTest { + @DisplayName("λ©”λ‰΄νŒμ— μžˆλŠ” 메뉴 이름과 μˆ˜λŸ‰μ„ μ£Όλ¬Έν•˜λ©΄ 주문이 μƒμ„±λœλ‹€.") + @ParameterizedTest + @CsvSource(value = {"μ–‘μ†‘μ΄μˆ˜ν”„-10", "νƒ€νŒŒμŠ€-3", "λ ˆλ“œμ™€μΈ-5", "제둜콜라-3", "μƒ΄νŽ˜μΈ-7", "바비큐립-10"}, delimiter = '-') + void λ©”λ‰΄νŒμ—_μžˆλŠ”_메뉴_이름과_μˆ˜λŸ‰μ„_μ£Όλ¬Έμ‹œ_μ£Όλ¬Έ_생성(String menuName, int count) { + // given, when + Order order = Order.of(menuName, count); + // then + assertThat(order).isInstanceOf(Order.class); + } + + @DisplayName("λ©”λ‰΄νŒμ— μ—†λŠ” 메뉴λ₯Ό μ£Όλ¬Έν•˜λ©΄ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @ParameterizedTest + @CsvSource(value = {"μ‹œμ ΈμƒλŸ¬λ“œ-10", "ν‹°μŠ€ν…Œμ΄ν¬-3", "μ‚°λ‚˜λ¬ΌνŒŒμŠ€νƒ€-2", "λ…Όμ•Œμ½œμ½œλΌ-3", "λ‹¨μ˜€νŒŒμŠ€νƒ€-7", "연근케이크-10"}, delimiter = '-') + void λ©”λ‰΄νŒμ—_μ—†λŠ”_λ©”λ‰΄μ΄λ¦„μœΌλ‘œ_μ£Όλ¬Έμ‹œ_μ˜ˆμ™Έ_λ°œμƒ(String menuName, int count) { + assertThatThrownBy(() -> Order.of(menuName, count)) + .isInstanceOf(InvalidOrdersException.class) + .hasMessageContaining(InvalidOrdersExceptionMessage.NOT_EXISTING_MENU.getMessage()); + } +} \ No newline at end of file From b05d5930fbce6fa4305216bc177aa44a860db1c7 Mon Sep 17 00:00:00 2001 From: wonjun Date: Tue, 14 Nov 2023 23:18:11 +0900 Subject: [PATCH 56/89] test: add test to check Orders domain logic --- .../java/christmas/domain/OrdersTest.java | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 src/test/java/christmas/domain/OrdersTest.java diff --git a/src/test/java/christmas/domain/OrdersTest.java b/src/test/java/christmas/domain/OrdersTest.java new file mode 100644 index 0000000..9f77ad6 --- /dev/null +++ b/src/test/java/christmas/domain/OrdersTest.java @@ -0,0 +1,114 @@ +package christmas.domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import christmas.domain.exception.InvalidOrdersException; +import christmas.domain.exception.message.InvalidOrdersExceptionMessage; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class OrdersTest { + + @DisplayName("μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, 메뉴 κ°œμˆ˜κ°€ 20κ°œκ°€ λ„˜μ–΄κ°€λ©΄ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @Test + public void μ£Όλ¬Έ_내역을_μ·¨ν•©ν–ˆμ„λ•Œ_메뉴_κ°œμˆ˜κ°€_20κ°œκ°€_λ„˜μ–΄κ°€λ©΄_μ˜ˆμ™Έ_λ°œμƒ() { + // given + List orders = List.of( + Order.of("μ‹œμ €μƒλŸ¬λ“œ", 3), + Order.of("제둜콜라", 10), + Order.of("νƒ€νŒŒμŠ€", 2), + Order.of("ν‹°λ³ΈμŠ€ν…Œμ΄ν¬", 3), + Order.of("μ΄ˆμ½”μΌ€μ΄ν¬", 4) + ); + // when, then + assertThatThrownBy(() -> Orders.from(orders)) + .isInstanceOf(InvalidOrdersException.class) + .hasMessageContaining(InvalidOrdersExceptionMessage.EXCEED_MENU_COUNTS_UPPER_LIMIT.getMessage()); + } + + @DisplayName("μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ 내역에 음료수만 있으면 μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @Test + public void μ£Όλ¬Έ_내역을_μ·¨ν•©ν–ˆμ„λ•Œ_μ£Όλ¬Έ_내역에_음료수만_있으면_μ˜ˆμ™Έ_λ°œμƒ() { + // given + List orders = List.of( + Order.of("λ ˆλ“œμ™€μΈ", 3), + Order.of("제둜콜라", 4), + Order.of("μƒ΄νŽ˜μΈ", 5) + ); + // when, then + assertThatThrownBy(() -> Orders.from(orders)) + .isInstanceOf(InvalidOrdersException.class) + .hasMessageContaining(InvalidOrdersExceptionMessage.MENUS_ONLY_CONTAIN_BEVERAGE.getMessage()); + } + + @DisplayName("μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ κΈˆμ•‘μ΄ 10000원 μ΄ν•˜λ©΄ λͺ¨λ“  이벀트 적용 λŒ€μƒμ—μ„œ μ œμ™Έλœλ‹€.") + @Test + public void μ£Όλ¬Έ_내역을_μ·¨ν•©ν–ˆμ„λ•Œ_μ£Όλ¬Έ_κΈˆμ•‘μ΄_10000원_μ΄ν•˜λ©΄_λͺ¨λ“ _이벀트_적용_λŒ€μƒμ—μ„œ_μ œμ™Έ() { + // given + List orders = List.of( + Order.of("μ–‘μ†‘μ΄μˆ˜ν”„", 1), + Order.of("제둜콜라", 1) + ); + // when, then + assertThat(Orders.from(orders).isEventApplicable()).isEqualTo(false); + } + + @DisplayName("μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ κΈˆμ•‘μ΄ 10000원 초과면 이벀트 적용 λŒ€μƒμ— ν¬ν•¨ν•œλ‹€.") + @Test + public void μ£Όλ¬Έ_내역을_μ·¨ν•©ν–ˆμ„λ•Œ_μ£Όλ¬Έ_κΈˆμ•‘μ΄_10000원_초과면_이벀트_적용_λŒ€μƒμ—_포함() { + // given + List orders = List.of( + Order.of("μ‹œμ €μƒλŸ¬λ“œ", 2), + Order.of("ν‹°λ³ΈμŠ€ν…Œμ΄ν¬", 3) + ); + // when, then + assertThat(Orders.from(orders).isEventApplicable()).isEqualTo(true); + } + + @DisplayName("μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ κΈˆμ•‘μ΄ 12λ§Œμ› 미만이면 증정 이벀트 적용 λŒ€μƒμ— μ œμ™Έλœλ‹€.") + @Test + public void μ£Όλ¬Έ_내역을_μ·¨ν•©ν–ˆμ„λ•Œ_μ£Όλ¬Έ_κΈˆμ•‘μ΄_12λ§Œμ›_미만이면_증정_이벀트_적용_λŒ€μƒμ—_포함() { + // given + List orders = List.of( + Order.of("μ‹œμ €μƒλŸ¬λ“œ", 1), + Order.of("ν¬λ¦¬μŠ€λ§ˆμŠ€νŒŒμŠ€νƒ€", 1), + Order.of("μ•„μ΄μŠ€ν¬λ¦Ό", 1), + Order.of("제둜콜라", 1) + ); + // when, then + assertThat(Orders.from(orders).isGiftEventApplicable()).isEqualTo(false); + } + + + @DisplayName("μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ£Όλ¬Έ κΈˆμ•‘μ΄ 12λ§Œμ› 이상이면 증정 이벀트 적용 λŒ€μƒμ— ν¬ν•¨ν•œλ‹€.") + @Test + public void μ£Όλ¬Έ_내역을_μ·¨ν•©ν–ˆμ„λ•Œ_μ£Όλ¬Έ_κΈˆμ•‘μ΄_12λ§Œμ›_이상이면_증정_이벀트_적용_λŒ€μƒμ—_포함() { + // given + List orders = List.of( + Order.of("μ‹œμ €μƒλŸ¬λ“œ", 2), + Order.of("바비큐립", 2), + Order.of("ν‹°λ³ΈμŠ€ν…Œμ΄ν¬", 1), + Order.of("μ΄ˆμ½”μΌ€μ΄ν¬", 1), + Order.of("λ ˆλ“œμ™€μΈ", 1) + ); + // when, then + assertThat(Orders.from(orders).isGiftEventApplicable()).isEqualTo(true); + } + + @DisplayName("μ£Όλ¬Έ 내역을 μ΄μš©ν•΄μ„œ 할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘μ„ κ³„μ‚°ν•œλ‹€.") + @Test + public void μ£Όλ¬Έ_내역을_μ΄μš©ν•΄μ„œ_할인_μ „_총_μ£Όλ¬Έ_κΈˆμ•‘μ„_계산() { + // given + List orders = List.of( + Order.of("μ‹œμ €μƒλŸ¬λ“œ", 1), + Order.of("ν‹°λ³ΈμŠ€ν…Œμ΄ν¬", 1), + Order.of("μ•„μ΄μŠ€ν¬λ¦Ό", 1), + Order.of("μ΄ˆμ½”μΌ€μ΄ν¬", 1), + Order.of("λ ˆλ“œμ™€μΈ", 1) + ); + // when, then + assertThat(Orders.from(orders).calculateTotalAmountWithNoDiscount()).isEqualTo(143000); + } +} \ No newline at end of file From a5f63024c6cfae1e48715ee13a89b2e2c1134538 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 00:17:20 +0900 Subject: [PATCH 57/89] feat: add feature to print gift menu using appropriate format --- docs/README.md | 6 ++--- src/main/java/christmas/EventPlanner.java | 5 ++++ .../domain/constant/EventConstant.java | 3 ++- src/main/java/christmas/dto/GiftDto.java | 19 +++++++++++++++ .../java/christmas/service/EventService.java | 19 +++++++++++++++ .../christmas/view/output/OutputView.java | 24 +++++++++++++++++++ .../output/constant/OutputFormatConstant.java | 3 ++- .../output/constant/OutputSymbolConstant.java | 5 ++-- 8 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 src/main/java/christmas/dto/GiftDto.java diff --git a/docs/README.md b/docs/README.md index 69a40b1..530c1e6 100644 --- a/docs/README.md +++ b/docs/README.md @@ -138,9 +138,9 @@ > ### 🎁 증정 메뉴 좜λ ₯ -- [] 증정 메뉴λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. -- [] 증정 메뉴가 μžˆλŠ” 경우 `${증정 메뉴 이름} ${증정 메뉴 개수} 개` ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. -- [] 증정 메뉴가 μ—†λŠ” 경우 `μ—†μŒ`으둜 좜λ ₯ν•œλ‹€. +- [x] 증정 메뉴λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. +- [x] 증정 메뉴가 μžˆλŠ” 경우 `${증정 메뉴 이름} ${증정 메뉴 개수}개` ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. +- [x] 증정 메뉴가 μ—†λŠ” 경우 `μ—†μŒ`으둜 좜λ ₯ν•œλ‹€. > ### πŸ‘ ν˜œνƒ λ‚΄μ—­ 좜λ ₯ diff --git a/src/main/java/christmas/EventPlanner.java b/src/main/java/christmas/EventPlanner.java index 0907bac..1cfdc1a 100644 --- a/src/main/java/christmas/EventPlanner.java +++ b/src/main/java/christmas/EventPlanner.java @@ -32,6 +32,7 @@ private void printResult(final ReservationDay day, final Orders orders) { printIntroMessage(day); printOrderedMenus(orders); printTotalAmountWithNoDiscount(orders); + printGiftMenu(orders); } private void printIntroMessage(final ReservationDay day) { @@ -45,4 +46,8 @@ private void printOrderedMenus(final Orders orders) { private void printTotalAmountWithNoDiscount(final Orders orders) { outputView.printTotalAmountWithNoDiscount(ordersController.createTotalAmountWithNoDiscountDto(orders)); } + + private void printGiftMenu(final Orders orders) { + outputView.printGiftMenu(eventService.createGiftDto(orders)); + } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/constant/EventConstant.java b/src/main/java/christmas/domain/constant/EventConstant.java index 2ede1f9..e5d71a4 100644 --- a/src/main/java/christmas/domain/constant/EventConstant.java +++ b/src/main/java/christmas/domain/constant/EventConstant.java @@ -2,7 +2,8 @@ public enum EventConstant { EVENT_APPLICABLE_AMOUNT(10_000), - GIFT_EVENT_APPLICABLE_AMOUNT(120_000); + GIFT_EVENT_APPLICABLE_AMOUNT(120_000), + GIFT_CHAMPAGNE_COUNT(1); private final int value; diff --git a/src/main/java/christmas/dto/GiftDto.java b/src/main/java/christmas/dto/GiftDto.java new file mode 100644 index 0000000..d2f9ae5 --- /dev/null +++ b/src/main/java/christmas/dto/GiftDto.java @@ -0,0 +1,19 @@ +package christmas.dto; + +import java.util.Map; + +public class GiftDto { + private final Map gift; + + private GiftDto(Map gift) { + this.gift = gift; + } + + public static GiftDto from(Map gift) { + return new GiftDto(gift); + } + + public Map getGift() { + return gift; + } +} \ No newline at end of file diff --git a/src/main/java/christmas/service/EventService.java b/src/main/java/christmas/service/EventService.java index e347ed4..076c5f3 100644 --- a/src/main/java/christmas/service/EventService.java +++ b/src/main/java/christmas/service/EventService.java @@ -1,4 +1,23 @@ package christmas.service; +import static christmas.domain.constant.EventConstant.GIFT_CHAMPAGNE_COUNT; + +import christmas.domain.Orders; +import christmas.domain.constant.Menu; +import christmas.dto.GiftDto; +import java.util.Collections; +import java.util.Optional; + public class EventService { + + public Optional createGiftDto(Orders orders) { + if (orders.isGiftEventApplicable()) { + return Optional.of(makeGiftDto()); + } + return Optional.empty(); + } + + private GiftDto makeGiftDto() { + return GiftDto.from(Collections.singletonMap(Menu.CHAMPAGNE.getName(), GIFT_CHAMPAGNE_COUNT.getValue())); + } } \ No newline at end of file diff --git a/src/main/java/christmas/view/output/OutputView.java b/src/main/java/christmas/view/output/OutputView.java index e1e78ae..cbc5a2d 100644 --- a/src/main/java/christmas/view/output/OutputView.java +++ b/src/main/java/christmas/view/output/OutputView.java @@ -1,5 +1,6 @@ package christmas.view.output; +import static christmas.view.output.constant.OutputFormatConstant.GIFT_PRINT_FORMAT; import static christmas.view.output.constant.OutputFormatConstant.ORDERED_MENUS_PRINT_FORMAT; import static christmas.view.output.constant.OutputFormatConstant.PRICE_FORMAT_STYLE; import static christmas.view.output.constant.OutputFormatConstant.SHOW_RESULT_INTRO_FORMAT; @@ -7,14 +8,18 @@ import static christmas.view.output.constant.OutputMessageConstant.GREETING; import static christmas.view.output.constant.OutputMessageConstant.INSERT_ORDERS; import static christmas.view.output.constant.OutputMessageConstant.INSERT_RESERVATION_DAY; +import static christmas.view.output.constant.OutputSymbolConstant.GIFT_MENU; import static christmas.view.output.constant.OutputSymbolConstant.NEW_LINE; +import static christmas.view.output.constant.OutputSymbolConstant.NO_GIFT; import static christmas.view.output.constant.OutputSymbolConstant.ORDERED_MENUS; import static christmas.view.output.constant.OutputSymbolConstant.TOTAL_AMOUNT_WITH_NO_DISCOUNT; import christmas.dto.EventBenefitsPreviewDto; +import christmas.dto.GiftDto; import christmas.dto.OrderedMenusDto; import christmas.dto.TotalAmountWithNoDiscountDto; import java.text.DecimalFormat; +import java.util.Optional; public class OutputView { public void printGreetingMessage() { @@ -55,6 +60,25 @@ public void printTotalAmountWithNoDiscount(TotalAmountWithNoDiscountDto totalAmo printLine(); printFormattedWithPrice(TOTAL_AMOUNT_WITH_NO_DISCOUNT_PRINT_FORMAT.getFormat(), formatPrice(totalAmountWithNoDiscountDto.getAmount())); + printLine(); + } + + public void printGiftMenu(Optional giftDtoOptional) { + printLine(); + print(GIFT_MENU.getSymbol()); + printLine(); + giftDtoOptional.ifPresent(this::printGift); + if (giftDtoOptional.isEmpty()) { + print(NO_GIFT.getSymbol()); + } + } + + private void printGift(GiftDto giftDto) { + giftDto.getGift().forEach((giftName, giftCount) -> { + printFormatted(GIFT_PRINT_FORMAT.getFormat(), giftName, giftCount); + printLine(); + } + ); } public void printLine() { diff --git a/src/main/java/christmas/view/output/constant/OutputFormatConstant.java b/src/main/java/christmas/view/output/constant/OutputFormatConstant.java index 401c556..1a7e28c 100644 --- a/src/main/java/christmas/view/output/constant/OutputFormatConstant.java +++ b/src/main/java/christmas/view/output/constant/OutputFormatConstant.java @@ -6,7 +6,8 @@ public enum OutputFormatConstant { SHOW_RESULT_INTRO_FORMAT(CURRENT_PROMOTION_MONTH + "μ›” %d일에 μš°ν…Œμ½” μ‹λ‹Ήμ—μ„œ 받을 이벀트 ν˜œνƒ 미리 보기!"), ORDERED_MENUS_PRINT_FORMAT("%s %d개"), TOTAL_AMOUNT_WITH_NO_DISCOUNT_PRINT_FORMAT("%s원"), - PRICE_FORMAT_STYLE("###,###"); + PRICE_FORMAT_STYLE("###,###"), + GIFT_PRINT_FORMAT("%s %d개"); private final String format; diff --git a/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java b/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java index 806d085..edc15d5 100644 --- a/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java +++ b/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java @@ -3,8 +3,9 @@ public enum OutputSymbolConstant { NEW_LINE(System.lineSeparator()), ORDERED_MENUS("<μ£Όλ¬Έ 메뉴>"), - TOTAL_AMOUNT_WITH_NO_DISCOUNT("<할인 μ „ 총주문 κΈˆμ•‘>"); - + TOTAL_AMOUNT_WITH_NO_DISCOUNT("<할인 μ „ 총주문 κΈˆμ•‘>"), + GIFT_MENU("<증정 메뉴>"), + NO_GIFT("μ—†μŒ"); private final String symbol; OutputSymbolConstant(final String symbol) { From b99176173ad96290d76643d34ac36b5387c545cd Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 01:50:16 +0900 Subject: [PATCH 58/89] feat: add feature to create benefitsDetails using Orders and ReservationDay --- docs/README.md | 2 +- .../java/christmas/domain/DayPerMonth.java | 4 +- src/main/java/christmas/domain/Order.java | 12 ++- src/main/java/christmas/domain/Orders.java | 8 +- .../java/christmas/domain/ReservationDay.java | 14 +-- .../christmas/domain/constant/Promotion.java | 19 ---- .../constant/{ => day}/DayConstant.java | 2 +- .../constant/event/ChristmasPromotion.java | 23 ++++ .../constant/{ => event}/EventConstant.java | 5 +- .../domain/constant/event/Promotion.java | 24 +++++ .../constant/{ => orders}/FoodType.java | 2 +- .../domain/constant/{ => orders}/Menu.java | 10 +- .../constant/{ => orders}/OrdersConstant.java | 4 +- .../christmas/dto/BenefitsDetailsDto.java | 23 ++++ src/main/java/christmas/dto/GiftDto.java | 4 + .../java/christmas/service/EventService.java | 102 ++++++++++++++++-- .../christmas/view/output/OutputView.java | 11 +- 17 files changed, 211 insertions(+), 58 deletions(-) delete mode 100644 src/main/java/christmas/domain/constant/Promotion.java rename src/main/java/christmas/domain/constant/{ => day}/DayConstant.java (91%) create mode 100644 src/main/java/christmas/domain/constant/event/ChristmasPromotion.java rename src/main/java/christmas/domain/constant/{ => event}/EventConstant.java (69%) create mode 100644 src/main/java/christmas/domain/constant/event/Promotion.java rename src/main/java/christmas/domain/constant/{ => orders}/FoodType.java (94%) rename src/main/java/christmas/domain/constant/{ => orders}/Menu.java (85%) rename src/main/java/christmas/domain/constant/{ => orders}/OrdersConstant.java (83%) create mode 100644 src/main/java/christmas/dto/BenefitsDetailsDto.java diff --git a/docs/README.md b/docs/README.md index 530c1e6..661bf98 100644 --- a/docs/README.md +++ b/docs/README.md @@ -107,7 +107,7 @@ > ### πŸŽ„ μ£Όλ¬Έ 내역에 λŒ€ν•œ 이벀트 적용 κ²°κ³Ό μ‚°μΆœ 도메인 둜직 -- [] μ£Όλ¬Έ λ‚΄μ—­κ³Ό λ‚ μ§œλ₯Ό λΉ„κ΅ν•΄μ„œ, `ν˜œνƒ λ‚΄μ—­`을 μƒμ‚°ν•œλ‹€. +- [x] μ£Όλ¬Έ λ‚΄μ—­κ³Ό λ‚ μ§œλ₯Ό λΉ„κ΅ν•΄μ„œ, `ν˜œνƒ λ‚΄μ—­`을 μƒμ‚°ν•œλ‹€. - [] μ£Όλ¬Έ 내역에 λ‚ μ§œμ— λ”°λ₯Έ 할인 적용 μ—¬λΆ€λ₯Ό μ μš©ν•΄μ„œ, `할인 κΈˆμ•‘`을 κ³„μ‚°ν•œλ‹€. - [] ν˜œνƒ λ‚΄μ—­μ˜ κΈˆμ•‘μ„ ν•©μ³μ„œ, `총 ν˜œνƒ κΈˆμ•‘`을 κ³„μ‚°ν•œλ‹€. - [] μ£Όλ¬Έ 내역에 증정 μ΄λ²€νŠΈκ°€ ν¬ν•¨λ˜μ–΄ μžˆμ„ μ‹œ, μ¦μ •ν’ˆμ˜ κ°€κ²©κΉŒμ§€ `총 ν˜œνƒ κΈˆμ•‘`에 ν¬ν•¨μ‹œν‚¨λ‹€. diff --git a/src/main/java/christmas/domain/DayPerMonth.java b/src/main/java/christmas/domain/DayPerMonth.java index eb07a1d..a1add3d 100644 --- a/src/main/java/christmas/domain/DayPerMonth.java +++ b/src/main/java/christmas/domain/DayPerMonth.java @@ -1,7 +1,7 @@ package christmas.domain; -import static christmas.domain.constant.DayConstant.DECEMBER_LAST_DAY; -import static christmas.domain.constant.DayConstant.DEFAULT_FIRST_DAY; +import static christmas.domain.constant.day.DayConstant.DECEMBER_LAST_DAY; +import static christmas.domain.constant.day.DayConstant.DEFAULT_FIRST_DAY; import static christmas.domain.exception.message.InvalidDayExceptionMessage.NOT_IN_APPROPRIATE_RANGE; import christmas.domain.exception.InvalidDayException; diff --git a/src/main/java/christmas/domain/Order.java b/src/main/java/christmas/domain/Order.java index e36e529..0d1b0b5 100644 --- a/src/main/java/christmas/domain/Order.java +++ b/src/main/java/christmas/domain/Order.java @@ -1,7 +1,7 @@ package christmas.domain; -import christmas.domain.constant.FoodType; -import christmas.domain.constant.Menu; +import christmas.domain.constant.orders.FoodType; +import christmas.domain.constant.orders.Menu; import christmas.domain.exception.InvalidOrdersException; public class Order { @@ -29,6 +29,14 @@ public FoodType getFoodType() { return menu.getFoodType(); } + public boolean isWeekdayPromotionApplicable() { + return menu.isWeekDayPromotionApplicable(); + } + + public boolean isWeekendPromotionApplicable() { + return menu.isWeekendPromotionApplicable(); + } + public int getTotalPrice() { return menu.getPrice() * count; } diff --git a/src/main/java/christmas/domain/Orders.java b/src/main/java/christmas/domain/Orders.java index c8df89a..cf42cc1 100644 --- a/src/main/java/christmas/domain/Orders.java +++ b/src/main/java/christmas/domain/Orders.java @@ -1,12 +1,12 @@ package christmas.domain; -import static christmas.domain.constant.EventConstant.EVENT_APPLICABLE_AMOUNT; -import static christmas.domain.constant.EventConstant.GIFT_EVENT_APPLICABLE_AMOUNT; -import static christmas.domain.constant.OrdersConstant.MAX_MENU_COUNTS; +import static christmas.domain.constant.event.EventConstant.EVENT_APPLICABLE_AMOUNT; +import static christmas.domain.constant.event.EventConstant.GIFT_EVENT_APPLICABLE_AMOUNT; +import static christmas.domain.constant.orders.OrdersConstant.MAX_MENU_COUNTS; import static christmas.domain.exception.message.InvalidOrdersExceptionMessage.EXCEED_MENU_COUNTS_UPPER_LIMIT; import static christmas.domain.exception.message.InvalidOrdersExceptionMessage.MENUS_ONLY_CONTAIN_BEVERAGE; -import christmas.domain.constant.FoodType; +import christmas.domain.constant.orders.FoodType; import christmas.domain.exception.InvalidOrdersException; import java.util.List; diff --git a/src/main/java/christmas/domain/ReservationDay.java b/src/main/java/christmas/domain/ReservationDay.java index f832a5d..38f76cd 100644 --- a/src/main/java/christmas/domain/ReservationDay.java +++ b/src/main/java/christmas/domain/ReservationDay.java @@ -1,12 +1,12 @@ package christmas.domain; -import static christmas.domain.constant.DayConstant.DECEMBER_CHRISTMAS_DAY; -import static christmas.domain.constant.DayConstant.DECEMBER_FIRST_DAY; -import static christmas.domain.constant.DayConstant.DECEMBER_LAST_DAY; -import static christmas.domain.constant.DayConstant.FRIDAY_VALUE; -import static christmas.domain.constant.DayConstant.SATURDAY_VALUE; -import static christmas.domain.constant.DayConstant.SUNDAY_VALUE; -import static christmas.domain.constant.DayConstant.WEEKDAY_LENGTH; +import static christmas.domain.constant.day.DayConstant.DECEMBER_CHRISTMAS_DAY; +import static christmas.domain.constant.day.DayConstant.DECEMBER_FIRST_DAY; +import static christmas.domain.constant.day.DayConstant.DECEMBER_LAST_DAY; +import static christmas.domain.constant.day.DayConstant.FRIDAY_VALUE; +import static christmas.domain.constant.day.DayConstant.SATURDAY_VALUE; +import static christmas.domain.constant.day.DayConstant.SUNDAY_VALUE; +import static christmas.domain.constant.day.DayConstant.WEEKDAY_LENGTH; import christmas.domain.exception.InvalidDayException; diff --git a/src/main/java/christmas/domain/constant/Promotion.java b/src/main/java/christmas/domain/constant/Promotion.java deleted file mode 100644 index c7bec01..0000000 --- a/src/main/java/christmas/domain/constant/Promotion.java +++ /dev/null @@ -1,19 +0,0 @@ -package christmas.domain.constant; - -public enum Promotion { - CHRISTMAS_D_DAY_PROMOTION("크리슀마슀 디데이 할인"), - WEEKDAY_PROMOTION("평일 할인"), - WEEKEND_PROMOTION("주말 할인"), - SPECIAL_STAR_PROMOTION("νŠΉλ³„ 할인"), - GIFT_PROMOTION("증정 이벀트"); - - private final String name; - - Promotion(final String name) { - this.name = name; - } - - public String getName() { - return name; - } -} \ No newline at end of file diff --git a/src/main/java/christmas/domain/constant/DayConstant.java b/src/main/java/christmas/domain/constant/day/DayConstant.java similarity index 91% rename from src/main/java/christmas/domain/constant/DayConstant.java rename to src/main/java/christmas/domain/constant/day/DayConstant.java index 5af7613..3a35e47 100644 --- a/src/main/java/christmas/domain/constant/DayConstant.java +++ b/src/main/java/christmas/domain/constant/day/DayConstant.java @@ -1,4 +1,4 @@ -package christmas.domain.constant; +package christmas.domain.constant.day; public enum DayConstant { DEFAULT_FIRST_DAY(1), diff --git a/src/main/java/christmas/domain/constant/event/ChristmasPromotion.java b/src/main/java/christmas/domain/constant/event/ChristmasPromotion.java new file mode 100644 index 0000000..b1eece4 --- /dev/null +++ b/src/main/java/christmas/domain/constant/event/ChristmasPromotion.java @@ -0,0 +1,23 @@ +package christmas.domain.constant.event; + +import static christmas.domain.constant.event.EventConstant.CHRISTMAS_PROMOTION_INCREASING_AMOUNT; + +public enum ChristmasPromotion { + CHRISTMAS_D_DAY_PROMOTION("크리슀마슀 디데이 할인", 900); + + private final String name; + private final int benefitAmount; + + ChristmasPromotion(final String name, final int benefitAmount) { + this.name = name; + this.benefitAmount = benefitAmount; + } + + public String getName() { + return name; + } + + public int getBenefitAmount(final int day) { + return benefitAmount + day * CHRISTMAS_PROMOTION_INCREASING_AMOUNT.getValue(); + } +} \ No newline at end of file diff --git a/src/main/java/christmas/domain/constant/EventConstant.java b/src/main/java/christmas/domain/constant/event/EventConstant.java similarity index 69% rename from src/main/java/christmas/domain/constant/EventConstant.java rename to src/main/java/christmas/domain/constant/event/EventConstant.java index e5d71a4..2f0bead 100644 --- a/src/main/java/christmas/domain/constant/EventConstant.java +++ b/src/main/java/christmas/domain/constant/event/EventConstant.java @@ -1,9 +1,10 @@ -package christmas.domain.constant; +package christmas.domain.constant.event; public enum EventConstant { EVENT_APPLICABLE_AMOUNT(10_000), GIFT_EVENT_APPLICABLE_AMOUNT(120_000), - GIFT_CHAMPAGNE_COUNT(1); + GIFT_CHAMPAGNE_COUNT(1), + CHRISTMAS_PROMOTION_INCREASING_AMOUNT(100); private final int value; diff --git a/src/main/java/christmas/domain/constant/event/Promotion.java b/src/main/java/christmas/domain/constant/event/Promotion.java new file mode 100644 index 0000000..898c630 --- /dev/null +++ b/src/main/java/christmas/domain/constant/event/Promotion.java @@ -0,0 +1,24 @@ +package christmas.domain.constant.event; + +public enum Promotion { + WEEKDAY_PROMOTION("평일 할인", 2_023), + WEEKEND_PROMOTION("주말 할인", 2_023), + SPECIAL_PROMOTION("νŠΉλ³„ 할인", 1_000), + GIFT_PROMOTION("증정 이벀트", 25_000); + + private final String name; + private final int benefitAmount; + + Promotion(final String name, final int benefitAmount) { + this.name = name; + this.benefitAmount = benefitAmount; + } + + public String getName() { + return name; + } + + public int getBenefitAmount() { + return benefitAmount; + } +} \ No newline at end of file diff --git a/src/main/java/christmas/domain/constant/FoodType.java b/src/main/java/christmas/domain/constant/orders/FoodType.java similarity index 94% rename from src/main/java/christmas/domain/constant/FoodType.java rename to src/main/java/christmas/domain/constant/orders/FoodType.java index ca4bfe5..4679658 100644 --- a/src/main/java/christmas/domain/constant/FoodType.java +++ b/src/main/java/christmas/domain/constant/orders/FoodType.java @@ -1,4 +1,4 @@ -package christmas.domain.constant; +package christmas.domain.constant.orders; public enum FoodType { diff --git a/src/main/java/christmas/domain/constant/Menu.java b/src/main/java/christmas/domain/constant/orders/Menu.java similarity index 85% rename from src/main/java/christmas/domain/constant/Menu.java rename to src/main/java/christmas/domain/constant/orders/Menu.java index c103a07..223997c 100644 --- a/src/main/java/christmas/domain/constant/Menu.java +++ b/src/main/java/christmas/domain/constant/orders/Menu.java @@ -1,9 +1,9 @@ -package christmas.domain.constant; +package christmas.domain.constant.orders; -import static christmas.domain.constant.FoodType.APPETIZER; -import static christmas.domain.constant.FoodType.BEVERAGE; -import static christmas.domain.constant.FoodType.DESSERT; -import static christmas.domain.constant.FoodType.MAIN; +import static christmas.domain.constant.orders.FoodType.APPETIZER; +import static christmas.domain.constant.orders.FoodType.BEVERAGE; +import static christmas.domain.constant.orders.FoodType.DESSERT; +import static christmas.domain.constant.orders.FoodType.MAIN; import static christmas.domain.exception.message.InvalidOrdersExceptionMessage.NOT_EXISTING_MENU; import christmas.domain.exception.InvalidOrdersException; diff --git a/src/main/java/christmas/domain/constant/OrdersConstant.java b/src/main/java/christmas/domain/constant/orders/OrdersConstant.java similarity index 83% rename from src/main/java/christmas/domain/constant/OrdersConstant.java rename to src/main/java/christmas/domain/constant/orders/OrdersConstant.java index fd6eef4..df44a44 100644 --- a/src/main/java/christmas/domain/constant/OrdersConstant.java +++ b/src/main/java/christmas/domain/constant/orders/OrdersConstant.java @@ -1,8 +1,8 @@ -package christmas.domain.constant; +package christmas.domain.constant.orders; public enum OrdersConstant { MAX_MENU_COUNTS(20); - + private final int value; OrdersConstant(final int value) { diff --git a/src/main/java/christmas/dto/BenefitsDetailsDto.java b/src/main/java/christmas/dto/BenefitsDetailsDto.java new file mode 100644 index 0000000..2b8c5e7 --- /dev/null +++ b/src/main/java/christmas/dto/BenefitsDetailsDto.java @@ -0,0 +1,23 @@ +package christmas.dto; + +import java.util.Map; + +public class BenefitsDetailsDto { + private final Map benefitsDetails; + + private BenefitsDetailsDto(Map benefitsDetails) { + this.benefitsDetails = benefitsDetails; + } + + public static BenefitsDetailsDto from(Map benefitsDetails) { + return new BenefitsDetailsDto(benefitsDetails); + } + + public Map getBenefitsDetails() { + return benefitsDetails; + } + + public boolean isEmpty() { + return benefitsDetails.isEmpty(); + } +} \ No newline at end of file diff --git a/src/main/java/christmas/dto/GiftDto.java b/src/main/java/christmas/dto/GiftDto.java index d2f9ae5..6629e4c 100644 --- a/src/main/java/christmas/dto/GiftDto.java +++ b/src/main/java/christmas/dto/GiftDto.java @@ -16,4 +16,8 @@ public static GiftDto from(Map gift) { public Map getGift() { return gift; } + + public boolean isEmpty() { + return gift.isEmpty(); + } } \ No newline at end of file diff --git a/src/main/java/christmas/service/EventService.java b/src/main/java/christmas/service/EventService.java index 076c5f3..84b2bb1 100644 --- a/src/main/java/christmas/service/EventService.java +++ b/src/main/java/christmas/service/EventService.java @@ -1,23 +1,113 @@ package christmas.service; -import static christmas.domain.constant.EventConstant.GIFT_CHAMPAGNE_COUNT; +import static christmas.domain.constant.event.ChristmasPromotion.CHRISTMAS_D_DAY_PROMOTION; +import static christmas.domain.constant.event.EventConstant.GIFT_CHAMPAGNE_COUNT; +import static christmas.domain.constant.event.Promotion.GIFT_PROMOTION; +import static christmas.domain.constant.event.Promotion.SPECIAL_PROMOTION; +import static christmas.domain.constant.event.Promotion.WEEKDAY_PROMOTION; +import static christmas.domain.constant.event.Promotion.WEEKEND_PROMOTION; +import christmas.domain.Order; import christmas.domain.Orders; -import christmas.domain.constant.Menu; +import christmas.domain.ReservationDay; +import christmas.domain.constant.orders.Menu; +import christmas.dto.BenefitsDetailsDto; import christmas.dto.GiftDto; import java.util.Collections; -import java.util.Optional; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.stream.Collectors; public class EventService { - public Optional createGiftDto(Orders orders) { + public GiftDto createGiftDto(Orders orders) { + Map giftDto = new LinkedHashMap<>(); if (orders.isGiftEventApplicable()) { - return Optional.of(makeGiftDto()); + return makeGiftDto(); } - return Optional.empty(); + return GiftDto.from(giftDto); } private GiftDto makeGiftDto() { return GiftDto.from(Collections.singletonMap(Menu.CHAMPAGNE.getName(), GIFT_CHAMPAGNE_COUNT.getValue())); } + + public BenefitsDetailsDto createBenefitsDetailsDto(ReservationDay reservationDay, Orders orders) { + Map benefitsDetails = new LinkedHashMap<>(); + if (orders.isEventApplicable()) { + return makeBenefitsDetailsDto(benefitsDetails, reservationDay, orders); + } + return BenefitsDetailsDto.from(benefitsDetails); + } + + private BenefitsDetailsDto makeBenefitsDetailsDto(Map benefitsDetails, + ReservationDay reservationDay, Orders orders) { + addChristmasPromotionDetails(benefitsDetails, reservationDay); + addWeekdayPromotionDetails(benefitsDetails, reservationDay, orders); + addWeekendPromotionDetails(benefitsDetails, reservationDay, orders); + addSpecialPromotionDetails(benefitsDetails, reservationDay); + addGiftPromotionDetails(benefitsDetails, orders); + return BenefitsDetailsDto.from(benefitsDetails); + } + + private void addChristmasPromotionDetails(Map benefitsDetails, ReservationDay reservationDay) { + if (reservationDay.isChristmasPromotionApplicable()) { + benefitsDetails.put(CHRISTMAS_D_DAY_PROMOTION.getName(), + calculateChristmasPromotionBenefitAmount(reservationDay)); + } + } + + private int calculateChristmasPromotionBenefitAmount(ReservationDay reservationDay) { + return CHRISTMAS_D_DAY_PROMOTION.getBenefitAmount(reservationDay.getDay()); + } + + private void addWeekdayPromotionDetails(Map benefitsDetails, ReservationDay reservationDay, + Orders orders) { + if (reservationDay.isWeekdayPromotionApplicable()) { + benefitsDetails.put(WEEKDAY_PROMOTION.getName(), + calculateWeekdayPromotionBenefitAmount(reservationDay, orders)); + } + } + + private int calculateWeekdayPromotionBenefitAmount(ReservationDay reservationDay, Orders orders) { + int count = orders.getOrders().stream() + .filter(Order::isWeekdayPromotionApplicable) + .collect(Collectors.collectingAndThen(Collectors.counting(), Long::intValue)); + return WEEKDAY_PROMOTION.getBenefitAmount() * count; + } + + private void addWeekendPromotionDetails(Map benefitsDetails, ReservationDay reservationDay, + Orders orders) { + if (reservationDay.isWeekendPromotionApplicable()) { + benefitsDetails.put(WEEKEND_PROMOTION.getName(), + calculateWeekendPromotionBenefitAmount(reservationDay, orders)); + } + } + + private int calculateWeekendPromotionBenefitAmount(ReservationDay reservationDay, Orders orders) { + int count = orders.getOrders().stream() + .filter(Order::isWeekendPromotionApplicable) + .collect(Collectors.collectingAndThen(Collectors.counting(), Long::intValue)); + return WEEKEND_PROMOTION.getBenefitAmount() * count; + } + + private void addSpecialPromotionDetails(Map benefitsDetails, ReservationDay reservationDay) { + if (reservationDay.isSpecialPromotionApplicable()) { + benefitsDetails.put(SPECIAL_PROMOTION.getName(), calculateSpecialPromotionBenefitAmount()); + } + } + + private int calculateSpecialPromotionBenefitAmount() { + return SPECIAL_PROMOTION.getBenefitAmount(); + } + + private void addGiftPromotionDetails(Map benefitsDetails, Orders orders) { + if (orders.isGiftEventApplicable()) { + benefitsDetails.put(GIFT_PROMOTION.getName(), calculateGiftPromotionBenefitAmount()); + } + } + + private int calculateGiftPromotionBenefitAmount() { + return GIFT_PROMOTION.getBenefitAmount(); + } } \ No newline at end of file diff --git a/src/main/java/christmas/view/output/OutputView.java b/src/main/java/christmas/view/output/OutputView.java index cbc5a2d..bb533b2 100644 --- a/src/main/java/christmas/view/output/OutputView.java +++ b/src/main/java/christmas/view/output/OutputView.java @@ -19,7 +19,6 @@ import christmas.dto.OrderedMenusDto; import christmas.dto.TotalAmountWithNoDiscountDto; import java.text.DecimalFormat; -import java.util.Optional; public class OutputView { public void printGreetingMessage() { @@ -63,17 +62,17 @@ public void printTotalAmountWithNoDiscount(TotalAmountWithNoDiscountDto totalAmo printLine(); } - public void printGiftMenu(Optional giftDtoOptional) { + public void printGiftMenu(GiftDto giftDto) { printLine(); print(GIFT_MENU.getSymbol()); printLine(); - giftDtoOptional.ifPresent(this::printGift); - if (giftDtoOptional.isEmpty()) { - print(NO_GIFT.getSymbol()); - } + printGift(giftDto); } private void printGift(GiftDto giftDto) { + if (giftDto.isEmpty()) { + print(NO_GIFT.getSymbol()); + } giftDto.getGift().forEach((giftName, giftCount) -> { printFormatted(GIFT_PRINT_FORMAT.getFormat(), giftName, giftCount); printLine(); From dbd05d42e2958639f2bf3c3f9a5ad625ea97930a Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 02:08:55 +0900 Subject: [PATCH 59/89] refactor: rename classes about ReservationDay from name containing Day to name containing ReservationDay --- src/main/java/christmas/EventPlanner.java | 29 +++++++++++-------- ...ler.java => ReservationDayController.java} | 26 ++++++++--------- .../java/christmas/domain/DayPerMonth.java | 10 +++---- .../java/christmas/domain/ReservationDay.java | 18 ++++++------ .../ReservationDayConstant.java} | 6 ++-- .../domain/exception/InvalidDayException.java | 11 ------- .../InvalidReservationDayException.java | 11 +++++++ ...nvalidReservationDayExceptionMessage.java} | 4 +-- .../java/christmas/service/DayService.java | 15 ---------- .../service/ReservationDayService.java | 15 ++++++++++ .../java/christmas/view/input/InputView.java | 4 +-- .../view/input/parser/InputParser.java | 2 +- .../christmas/view/output/OutputView.java | 5 ++++ .../christmas/domain/ReservationDayTest.java | 8 ++--- 14 files changed, 87 insertions(+), 77 deletions(-) rename src/main/java/christmas/controller/{DayController.java => ReservationDayController.java} (55%) rename src/main/java/christmas/domain/constant/{day/DayConstant.java => reservationday/ReservationDayConstant.java} (72%) delete mode 100644 src/main/java/christmas/domain/exception/InvalidDayException.java create mode 100644 src/main/java/christmas/domain/exception/InvalidReservationDayException.java rename src/main/java/christmas/domain/exception/message/{InvalidDayExceptionMessage.java => InvalidReservationDayExceptionMessage.java} (75%) delete mode 100644 src/main/java/christmas/service/DayService.java create mode 100644 src/main/java/christmas/service/ReservationDayService.java diff --git a/src/main/java/christmas/EventPlanner.java b/src/main/java/christmas/EventPlanner.java index 1cfdc1a..e4e186d 100644 --- a/src/main/java/christmas/EventPlanner.java +++ b/src/main/java/christmas/EventPlanner.java @@ -1,7 +1,7 @@ package christmas; -import christmas.controller.DayController; import christmas.controller.OrdersController; +import christmas.controller.ReservationDayController; import christmas.domain.Orders; import christmas.domain.ReservationDay; import christmas.service.EventService; @@ -10,44 +10,49 @@ public class EventPlanner { private final OutputView outputView; - private final DayController dayController; + private final ReservationDayController reservationDayController; private final OrdersController ordersController; private final EventService eventService; public EventPlanner(InputView inputView, OutputView outputView) { this.outputView = outputView; - dayController = new DayController(inputView, outputView); + reservationDayController = new ReservationDayController(inputView, outputView); ordersController = new OrdersController(inputView, outputView); eventService = new EventService(); outputView.printGreetingMessage(); } public void execute() { - ReservationDay day = dayController.insertDay(); + ReservationDay reservationDay = reservationDayController.insertReservationDay(); Orders orders = ordersController.insertOrders(); - printResult(day, orders); + printResult(reservationDay, orders); } - private void printResult(final ReservationDay day, final Orders orders) { - printIntroMessage(day); + private void printResult(ReservationDay reservationDay, Orders orders) { + printIntroMessage(reservationDay); printOrderedMenus(orders); printTotalAmountWithNoDiscount(orders); printGiftMenu(orders); + printBenefitsDetails(reservationDay, orders); } - private void printIntroMessage(final ReservationDay day) { - outputView.printIntroMessage(dayController.createEventBenefitsPreviousDto(day)); + private void printIntroMessage(ReservationDay reservationDay) { + outputView.printIntroMessage(reservationDayController.createEventBenefitsPreviousDto(reservationDay)); } - private void printOrderedMenus(final Orders orders) { + private void printOrderedMenus(Orders orders) { outputView.printOrderedMenus(ordersController.createOrderedMenusDto(orders)); } - private void printTotalAmountWithNoDiscount(final Orders orders) { + private void printTotalAmountWithNoDiscount(Orders orders) { outputView.printTotalAmountWithNoDiscount(ordersController.createTotalAmountWithNoDiscountDto(orders)); } - private void printGiftMenu(final Orders orders) { + private void printGiftMenu(Orders orders) { outputView.printGiftMenu(eventService.createGiftDto(orders)); } + + private void printBenefitsDetails(ReservationDay reservationDay, Orders orders) { + outputView.printBenefitsDetails(eventService.createBenefitsDetailsDto(reservationDay, orders)); + } } \ No newline at end of file diff --git a/src/main/java/christmas/controller/DayController.java b/src/main/java/christmas/controller/ReservationDayController.java similarity index 55% rename from src/main/java/christmas/controller/DayController.java rename to src/main/java/christmas/controller/ReservationDayController.java index a2a87f9..4029eb1 100644 --- a/src/main/java/christmas/controller/DayController.java +++ b/src/main/java/christmas/controller/ReservationDayController.java @@ -1,41 +1,41 @@ package christmas.controller; import christmas.domain.ReservationDay; -import christmas.domain.exception.InvalidDayException; +import christmas.domain.exception.InvalidReservationDayException; import christmas.dto.EventBenefitsPreviewDto; -import christmas.service.DayService; +import christmas.service.ReservationDayService; import christmas.view.input.InputView; import christmas.view.input.exception.BasicInputException; import christmas.view.input.exception.DayInputException; import christmas.view.output.OutputView; -public class DayController { +public class ReservationDayController { private final InputView inputView; private final OutputView outputView; - private final DayService dayService; + private final ReservationDayService reservationDayService; - public DayController(final InputView inputView, final OutputView outputView) { + public ReservationDayController(final InputView inputView, final OutputView outputView) { this.inputView = inputView; this.outputView = outputView; - dayService = new DayService(); + reservationDayService = new ReservationDayService(); } - public ReservationDay insertDay() { + public ReservationDay insertReservationDay() { try { int reservationDay = askToInsertReservationDay(); - return dayService.createDay(reservationDay); - } catch (BasicInputException | DayInputException | InvalidDayException e) { + return reservationDayService.createReservationDay(reservationDay); + } catch (BasicInputException | DayInputException | InvalidReservationDayException e) { outputView.printErrorMessage(e.getMessage()); - return insertDay(); + return insertReservationDay(); } } private int askToInsertReservationDay() throws BasicInputException, DayInputException { outputView.askToInsertReservationDay(); - return inputView.getDay(); + return inputView.getReservationDay(); } - public EventBenefitsPreviewDto createEventBenefitsPreviousDto(ReservationDay day) { - return dayService.createEvenetBenefitsPreviewDto(day); + public EventBenefitsPreviewDto createEventBenefitsPreviousDto(ReservationDay reservationDay) { + return reservationDayService.createEventBenefitsPreviewDto(reservationDay); } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/DayPerMonth.java b/src/main/java/christmas/domain/DayPerMonth.java index a1add3d..28e4d7a 100644 --- a/src/main/java/christmas/domain/DayPerMonth.java +++ b/src/main/java/christmas/domain/DayPerMonth.java @@ -1,10 +1,10 @@ package christmas.domain; -import static christmas.domain.constant.day.DayConstant.DECEMBER_LAST_DAY; -import static christmas.domain.constant.day.DayConstant.DEFAULT_FIRST_DAY; -import static christmas.domain.exception.message.InvalidDayExceptionMessage.NOT_IN_APPROPRIATE_RANGE; +import static christmas.domain.constant.reservationday.ReservationDayConstant.DECEMBER_LAST_DAY; +import static christmas.domain.constant.reservationday.ReservationDayConstant.DEFAULT_FIRST_DAY; +import static christmas.domain.exception.message.InvalidReservationDayExceptionMessage.NOT_IN_APPROPRIATE_RANGE; -import christmas.domain.exception.InvalidDayException; +import christmas.domain.exception.InvalidReservationDayException; public abstract class DayPerMonth { public DayPerMonth() { @@ -12,7 +12,7 @@ public DayPerMonth() { protected void validate(final int day) { if (!isInAppropriateRange(day)) { - throw InvalidDayException.of(NOT_IN_APPROPRIATE_RANGE.getMessage()); + throw InvalidReservationDayException.of(NOT_IN_APPROPRIATE_RANGE.getMessage()); } } diff --git a/src/main/java/christmas/domain/ReservationDay.java b/src/main/java/christmas/domain/ReservationDay.java index 38f76cd..4224c96 100644 --- a/src/main/java/christmas/domain/ReservationDay.java +++ b/src/main/java/christmas/domain/ReservationDay.java @@ -1,14 +1,14 @@ package christmas.domain; -import static christmas.domain.constant.day.DayConstant.DECEMBER_CHRISTMAS_DAY; -import static christmas.domain.constant.day.DayConstant.DECEMBER_FIRST_DAY; -import static christmas.domain.constant.day.DayConstant.DECEMBER_LAST_DAY; -import static christmas.domain.constant.day.DayConstant.FRIDAY_VALUE; -import static christmas.domain.constant.day.DayConstant.SATURDAY_VALUE; -import static christmas.domain.constant.day.DayConstant.SUNDAY_VALUE; -import static christmas.domain.constant.day.DayConstant.WEEKDAY_LENGTH; +import static christmas.domain.constant.reservationday.ReservationDayConstant.DECEMBER_CHRISTMAS_DAY; +import static christmas.domain.constant.reservationday.ReservationDayConstant.DECEMBER_FIRST_DAY; +import static christmas.domain.constant.reservationday.ReservationDayConstant.DECEMBER_LAST_DAY; +import static christmas.domain.constant.reservationday.ReservationDayConstant.FRIDAY_VALUE; +import static christmas.domain.constant.reservationday.ReservationDayConstant.SATURDAY_VALUE; +import static christmas.domain.constant.reservationday.ReservationDayConstant.SUNDAY_VALUE; +import static christmas.domain.constant.reservationday.ReservationDayConstant.WEEKDAY_LENGTH; -import christmas.domain.exception.InvalidDayException; +import christmas.domain.exception.InvalidReservationDayException; public class ReservationDay extends DayPerMonth { private final int day; @@ -18,7 +18,7 @@ private ReservationDay(final int day) { this.day = day; } - public static ReservationDay from(final int day) throws InvalidDayException { + public static ReservationDay from(final int day) throws InvalidReservationDayException { return new ReservationDay(day); } diff --git a/src/main/java/christmas/domain/constant/day/DayConstant.java b/src/main/java/christmas/domain/constant/reservationday/ReservationDayConstant.java similarity index 72% rename from src/main/java/christmas/domain/constant/day/DayConstant.java rename to src/main/java/christmas/domain/constant/reservationday/ReservationDayConstant.java index 3a35e47..66e9fbc 100644 --- a/src/main/java/christmas/domain/constant/day/DayConstant.java +++ b/src/main/java/christmas/domain/constant/reservationday/ReservationDayConstant.java @@ -1,6 +1,6 @@ -package christmas.domain.constant.day; +package christmas.domain.constant.reservationday; -public enum DayConstant { +public enum ReservationDayConstant { DEFAULT_FIRST_DAY(1), DEFAULT_LAST_DAY(30), DECEMBER_FIRST_DAY(1), @@ -13,7 +13,7 @@ public enum DayConstant { private final int value; - DayConstant(final int value) { + ReservationDayConstant(final int value) { this.value = value; } diff --git a/src/main/java/christmas/domain/exception/InvalidDayException.java b/src/main/java/christmas/domain/exception/InvalidDayException.java deleted file mode 100644 index 06fc278..0000000 --- a/src/main/java/christmas/domain/exception/InvalidDayException.java +++ /dev/null @@ -1,11 +0,0 @@ -package christmas.domain.exception; - -public class InvalidDayException extends IllegalArgumentException { - private InvalidDayException(final String invalidDayExceptionMessage) { - super(invalidDayExceptionMessage); - } - - public static InvalidDayException of(final String invalidDayExceptionMessage) { - return new InvalidDayException(invalidDayExceptionMessage); - } -} \ No newline at end of file diff --git a/src/main/java/christmas/domain/exception/InvalidReservationDayException.java b/src/main/java/christmas/domain/exception/InvalidReservationDayException.java new file mode 100644 index 0000000..e4ff894 --- /dev/null +++ b/src/main/java/christmas/domain/exception/InvalidReservationDayException.java @@ -0,0 +1,11 @@ +package christmas.domain.exception; + +public class InvalidReservationDayException extends IllegalArgumentException { + private InvalidReservationDayException(final String invalidDayExceptionMessage) { + super(invalidDayExceptionMessage); + } + + public static InvalidReservationDayException of(final String invalidDayExceptionMessage) { + return new InvalidReservationDayException(invalidDayExceptionMessage); + } +} \ No newline at end of file diff --git a/src/main/java/christmas/domain/exception/message/InvalidDayExceptionMessage.java b/src/main/java/christmas/domain/exception/message/InvalidReservationDayExceptionMessage.java similarity index 75% rename from src/main/java/christmas/domain/exception/message/InvalidDayExceptionMessage.java rename to src/main/java/christmas/domain/exception/message/InvalidReservationDayExceptionMessage.java index bce7205..2edf14b 100644 --- a/src/main/java/christmas/domain/exception/message/InvalidDayExceptionMessage.java +++ b/src/main/java/christmas/domain/exception/message/InvalidReservationDayExceptionMessage.java @@ -2,12 +2,12 @@ import static christmas.global.ApplicationConstant.ERROR_PREFIX; -public enum InvalidDayExceptionMessage { +public enum InvalidReservationDayExceptionMessage { NOT_IN_APPROPRIATE_RANGE(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); private final String message; - InvalidDayExceptionMessage(final String message) { + InvalidReservationDayExceptionMessage(final String message) { this.message = message; } diff --git a/src/main/java/christmas/service/DayService.java b/src/main/java/christmas/service/DayService.java deleted file mode 100644 index 8f11288..0000000 --- a/src/main/java/christmas/service/DayService.java +++ /dev/null @@ -1,15 +0,0 @@ -package christmas.service; - -import christmas.domain.ReservationDay; -import christmas.domain.exception.InvalidDayException; -import christmas.dto.EventBenefitsPreviewDto; - -public class DayService { - public ReservationDay createDay(final int day) throws InvalidDayException { - return ReservationDay.from(day); - } - - public EventBenefitsPreviewDto createEvenetBenefitsPreviewDto(ReservationDay day) { - return EventBenefitsPreviewDto.from(day.getDay()); - } -} \ No newline at end of file diff --git a/src/main/java/christmas/service/ReservationDayService.java b/src/main/java/christmas/service/ReservationDayService.java new file mode 100644 index 0000000..c2a7cf7 --- /dev/null +++ b/src/main/java/christmas/service/ReservationDayService.java @@ -0,0 +1,15 @@ +package christmas.service; + +import christmas.domain.ReservationDay; +import christmas.domain.exception.InvalidReservationDayException; +import christmas.dto.EventBenefitsPreviewDto; + +public class ReservationDayService { + public ReservationDay createReservationDay(final int day) throws InvalidReservationDayException { + return ReservationDay.from(day); + } + + public EventBenefitsPreviewDto createEventBenefitsPreviewDto(ReservationDay day) { + return EventBenefitsPreviewDto.from(day.getDay()); + } +} \ No newline at end of file diff --git a/src/main/java/christmas/view/input/InputView.java b/src/main/java/christmas/view/input/InputView.java index 1943924..133df31 100644 --- a/src/main/java/christmas/view/input/InputView.java +++ b/src/main/java/christmas/view/input/InputView.java @@ -13,8 +13,8 @@ public InputView() { inputParser = new InputParser(); } - public int getDay() throws BasicInputException, DayInputException { - return inputParser.parseDay(readLine()); + public int getReservationDay() throws BasicInputException, DayInputException { + return inputParser.parseReservationDay(readLine()); } public Map getOrders() { diff --git a/src/main/java/christmas/view/input/parser/InputParser.java b/src/main/java/christmas/view/input/parser/InputParser.java index 89fb46c..bc43662 100644 --- a/src/main/java/christmas/view/input/parser/InputParser.java +++ b/src/main/java/christmas/view/input/parser/InputParser.java @@ -31,7 +31,7 @@ public InputParser() { this.orderInputValidator = new OrderInputValidator(); } - public int parseDay(String userInput) throws BasicInputException, DayInputException { + public int parseReservationDay(String userInput) throws BasicInputException, DayInputException { checkDayLengthIsUnderUpperLimit(userInput); userInput = removeBlank(userInput); dayInputValidator.validate(userInput); diff --git a/src/main/java/christmas/view/output/OutputView.java b/src/main/java/christmas/view/output/OutputView.java index bb533b2..621332e 100644 --- a/src/main/java/christmas/view/output/OutputView.java +++ b/src/main/java/christmas/view/output/OutputView.java @@ -14,6 +14,7 @@ import static christmas.view.output.constant.OutputSymbolConstant.ORDERED_MENUS; import static christmas.view.output.constant.OutputSymbolConstant.TOTAL_AMOUNT_WITH_NO_DISCOUNT; +import christmas.dto.BenefitsDetailsDto; import christmas.dto.EventBenefitsPreviewDto; import christmas.dto.GiftDto; import christmas.dto.OrderedMenusDto; @@ -80,6 +81,10 @@ private void printGift(GiftDto giftDto) { ); } + public void printBenefitsDetails(BenefitsDetailsDto benefitsDetailsDto) { + + } + public void printLine() { System.out.print(NEW_LINE.getSymbol()); } diff --git a/src/test/java/christmas/domain/ReservationDayTest.java b/src/test/java/christmas/domain/ReservationDayTest.java index 1df0c8f..08aa174 100644 --- a/src/test/java/christmas/domain/ReservationDayTest.java +++ b/src/test/java/christmas/domain/ReservationDayTest.java @@ -3,8 +3,8 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import christmas.domain.exception.InvalidDayException; -import christmas.domain.exception.message.InvalidDayExceptionMessage; +import christmas.domain.exception.InvalidReservationDayException; +import christmas.domain.exception.message.InvalidReservationDayExceptionMessage; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; @@ -17,8 +17,8 @@ public class ReservationDayTest { @ValueSource(ints = {0, -1, -10, 300, 350, 500, 32}) void μœ νš¨ν•˜μ§€_μ•Šμ€_λ‚ μ§œ_μž…λ ₯μ‹œ_μ˜ˆμ™Έ_λ°œμƒ(int day) { assertThatThrownBy(() -> ReservationDay.from(day)) - .isInstanceOf(InvalidDayException.class) - .hasMessageContaining(InvalidDayExceptionMessage.NOT_IN_APPROPRIATE_RANGE.getMessage()); + .isInstanceOf(InvalidReservationDayException.class) + .hasMessageContaining(InvalidReservationDayExceptionMessage.NOT_IN_APPROPRIATE_RANGE.getMessage()); } @DisplayName("λ‚ μ§œλ₯Ό μž…λ ₯ν•˜λ©΄ 크리슀마슀 D-Day ν”„λ‘œλͺ¨μ…˜μ΄ 적용 κ°€λŠ₯ν•œμ§€ μ—¬λΆ€λ₯Ό νŒλ‹¨ κ°€λŠ₯ν•˜λ‹€.") From 0ad1b1abb6b3294600bf53dd8652a5d61b0e14f7 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 02:37:04 +0900 Subject: [PATCH 60/89] feat: add feature to print benefits details using appropriate format --- docs/README.md | 12 +++++----- .../java/christmas/service/EventService.java | 7 +++--- .../christmas/view/output/OutputView.java | 24 +++++++++++++++---- .../output/constant/OutputFormatConstant.java | 3 ++- .../output/constant/OutputSymbolConstant.java | 4 +++- 5 files changed, 34 insertions(+), 16 deletions(-) diff --git a/docs/README.md b/docs/README.md index 661bf98..e6af2c3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -144,12 +144,12 @@ > ### πŸ‘ ν˜œνƒ λ‚΄μ—­ 좜λ ₯ -- [] ν˜œνƒ 내역을 λ‚˜νƒ€λ‚΄λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. -- [] μ μš©λ˜λŠ” 할인 μ΄λ²€νŠΈλ³„ 이름 및 ν˜œνƒ κΈˆμ•‘μ„ μ •λ¦¬ν•΄μ„œ λ‚˜νƒ€λ‚Έλ‹€. - - [] `${적용 ν˜œνƒ 이벀트 이름}: -${ν˜œνƒ κΈˆμ•‘}원` ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. - - []`ν˜œνƒ κΈˆμ•‘`의 μ„Έμžλ¦¬ μˆ˜λ§ˆλ‹€ `,`을 λΆ™μ΄λŠ” ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. - - [] 적용된 ν˜œνƒμ΄ μ—†μœΌλ©΄ `μ—†μŒ`으둜 좜λ ₯ν•œλ‹€. -- [] μ—¬λŸ¬ 개의 μ΄λ²€νŠΈκ°€ μ μš©λ˜μ—ˆμœΌλ©΄, 좜λ ₯ μˆœμ„œλŠ” 자유둭게 ν•œλ‹€. +- [x] ν˜œνƒ 내역을 λ‚˜νƒ€λ‚΄λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. +- [x] μ μš©λ˜λŠ” 할인 μ΄λ²€νŠΈλ³„ 이름 및 ν˜œνƒ κΈˆμ•‘μ„ μ •λ¦¬ν•΄μ„œ λ‚˜νƒ€λ‚Έλ‹€. + - [x] `${적용 ν˜œνƒ 이벀트 이름}: -${ν˜œνƒ κΈˆμ•‘}원` ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. + - [x] `ν˜œνƒ κΈˆμ•‘`의 μ„Έμžλ¦¬ μˆ˜λ§ˆλ‹€ `,`을 λΆ™μ΄λŠ” ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. + - [x] 적용된 ν˜œνƒμ΄ μ—†μœΌλ©΄ `μ—†μŒ`으둜 좜λ ₯ν•œλ‹€. +- [x] μ—¬λŸ¬ 개의 μ΄λ²€νŠΈκ°€ μ μš©λ˜μ—ˆμœΌλ©΄, 좜λ ₯ μˆœμ„œλŠ” 자유둭게 ν•œλ‹€. > ### πŸ“‰ 총 ν˜œνƒ κΈˆμ•‘ 좜λ ₯ diff --git a/src/main/java/christmas/service/EventService.java b/src/main/java/christmas/service/EventService.java index 84b2bb1..f2e534d 100644 --- a/src/main/java/christmas/service/EventService.java +++ b/src/main/java/christmas/service/EventService.java @@ -16,7 +16,6 @@ import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; -import java.util.stream.Collectors; public class EventService { @@ -72,7 +71,8 @@ private void addWeekdayPromotionDetails(Map benefitsDetails, Re private int calculateWeekdayPromotionBenefitAmount(ReservationDay reservationDay, Orders orders) { int count = orders.getOrders().stream() .filter(Order::isWeekdayPromotionApplicable) - .collect(Collectors.collectingAndThen(Collectors.counting(), Long::intValue)); + .mapToInt(Order::getMenuCount) + .sum(); return WEEKDAY_PROMOTION.getBenefitAmount() * count; } @@ -87,7 +87,8 @@ private void addWeekendPromotionDetails(Map benefitsDetails, Re private int calculateWeekendPromotionBenefitAmount(ReservationDay reservationDay, Orders orders) { int count = orders.getOrders().stream() .filter(Order::isWeekendPromotionApplicable) - .collect(Collectors.collectingAndThen(Collectors.counting(), Long::intValue)); + .mapToInt(Order::getMenuCount) + .sum(); return WEEKEND_PROMOTION.getBenefitAmount() * count; } diff --git a/src/main/java/christmas/view/output/OutputView.java b/src/main/java/christmas/view/output/OutputView.java index 621332e..25472ff 100644 --- a/src/main/java/christmas/view/output/OutputView.java +++ b/src/main/java/christmas/view/output/OutputView.java @@ -1,5 +1,6 @@ package christmas.view.output; +import static christmas.view.output.constant.OutputFormatConstant.BENEFITS_DETAILS_PRINT_FORMAT; import static christmas.view.output.constant.OutputFormatConstant.GIFT_PRINT_FORMAT; import static christmas.view.output.constant.OutputFormatConstant.ORDERED_MENUS_PRINT_FORMAT; import static christmas.view.output.constant.OutputFormatConstant.PRICE_FORMAT_STYLE; @@ -8,8 +9,10 @@ import static christmas.view.output.constant.OutputMessageConstant.GREETING; import static christmas.view.output.constant.OutputMessageConstant.INSERT_ORDERS; import static christmas.view.output.constant.OutputMessageConstant.INSERT_RESERVATION_DAY; +import static christmas.view.output.constant.OutputSymbolConstant.BENEFITS_DETAILS; import static christmas.view.output.constant.OutputSymbolConstant.GIFT_MENU; import static christmas.view.output.constant.OutputSymbolConstant.NEW_LINE; +import static christmas.view.output.constant.OutputSymbolConstant.NO_BENEFITS; import static christmas.view.output.constant.OutputSymbolConstant.NO_GIFT; import static christmas.view.output.constant.OutputSymbolConstant.ORDERED_MENUS; import static christmas.view.output.constant.OutputSymbolConstant.TOTAL_AMOUNT_WITH_NO_DISCOUNT; @@ -58,7 +61,7 @@ public void printTotalAmountWithNoDiscount(TotalAmountWithNoDiscountDto totalAmo printLine(); print(TOTAL_AMOUNT_WITH_NO_DISCOUNT.getSymbol()); printLine(); - printFormattedWithPrice(TOTAL_AMOUNT_WITH_NO_DISCOUNT_PRINT_FORMAT.getFormat(), + printFormatted(TOTAL_AMOUNT_WITH_NO_DISCOUNT_PRINT_FORMAT.getFormat(), formatPrice(totalAmountWithNoDiscountDto.getAmount())); printLine(); } @@ -73,6 +76,7 @@ public void printGiftMenu(GiftDto giftDto) { private void printGift(GiftDto giftDto) { if (giftDto.isEmpty()) { print(NO_GIFT.getSymbol()); + printLine(); } giftDto.getGift().forEach((giftName, giftCount) -> { printFormatted(GIFT_PRINT_FORMAT.getFormat(), giftName, giftCount); @@ -82,7 +86,21 @@ private void printGift(GiftDto giftDto) { } public void printBenefitsDetails(BenefitsDetailsDto benefitsDetailsDto) { + printLine(); + print(BENEFITS_DETAILS.getSymbol()); + printLine(); + printBenefitNamesAndAmount(benefitsDetailsDto); + } + private void printBenefitNamesAndAmount(BenefitsDetailsDto benefitsDetailsDto) { + if (benefitsDetailsDto.isEmpty()) { + print(NO_BENEFITS.getSymbol()); + } + benefitsDetailsDto.getBenefitsDetails().forEach((benefitName, benefitAmount) -> { + printFormatted(BENEFITS_DETAILS_PRINT_FORMAT.getFormat(), benefitName, formatPrice(benefitAmount)); + printLine(); + } + ); } public void printLine() { @@ -106,8 +124,4 @@ private String formatPrice(final int price) { return new DecimalFormat(PRICE_FORMAT_STYLE.getFormat()) .format(price); } - - private void printFormattedWithPrice(final String format, final String formattedPrice, final Object... args) { - print(String.format(String.format(format, formattedPrice), args)); - } } \ No newline at end of file diff --git a/src/main/java/christmas/view/output/constant/OutputFormatConstant.java b/src/main/java/christmas/view/output/constant/OutputFormatConstant.java index 1a7e28c..e5b14ec 100644 --- a/src/main/java/christmas/view/output/constant/OutputFormatConstant.java +++ b/src/main/java/christmas/view/output/constant/OutputFormatConstant.java @@ -7,7 +7,8 @@ public enum OutputFormatConstant { ORDERED_MENUS_PRINT_FORMAT("%s %d개"), TOTAL_AMOUNT_WITH_NO_DISCOUNT_PRINT_FORMAT("%s원"), PRICE_FORMAT_STYLE("###,###"), - GIFT_PRINT_FORMAT("%s %d개"); + GIFT_PRINT_FORMAT("%s %d개"), + BENEFITS_DETAILS_PRINT_FORMAT("%s: -%s원"); private final String format; diff --git a/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java b/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java index edc15d5..0a4108a 100644 --- a/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java +++ b/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java @@ -5,7 +5,9 @@ public enum OutputSymbolConstant { ORDERED_MENUS("<μ£Όλ¬Έ 메뉴>"), TOTAL_AMOUNT_WITH_NO_DISCOUNT("<할인 μ „ 총주문 κΈˆμ•‘>"), GIFT_MENU("<증정 메뉴>"), - NO_GIFT("μ—†μŒ"); + BENEFITS_DETAILS("<ν˜œνƒ λ‚΄μ—­>"), + NO_GIFT("μ—†μŒ"), + NO_BENEFITS("μ—†μŒ"); private final String symbol; OutputSymbolConstant(final String symbol) { From 6fe1558069c1ae68fce852782826bc1da917fc71 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 03:09:50 +0900 Subject: [PATCH 61/89] fix: fix error that weekday or weekend promotion is applied even when its benefit amount is 0 --- .../domain/constant/event/EventConstant.java | 3 +- .../java/christmas/service/EventService.java | 31 ++++++++++++++----- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/main/java/christmas/domain/constant/event/EventConstant.java b/src/main/java/christmas/domain/constant/event/EventConstant.java index 2f0bead..a008ccf 100644 --- a/src/main/java/christmas/domain/constant/event/EventConstant.java +++ b/src/main/java/christmas/domain/constant/event/EventConstant.java @@ -4,7 +4,8 @@ public enum EventConstant { EVENT_APPLICABLE_AMOUNT(10_000), GIFT_EVENT_APPLICABLE_AMOUNT(120_000), GIFT_CHAMPAGNE_COUNT(1), - CHRISTMAS_PROMOTION_INCREASING_AMOUNT(100); + CHRISTMAS_PROMOTION_INCREASING_AMOUNT(100), + NONE_PROMOTION_APPLIED_AMOUNT(0); private final int value; diff --git a/src/main/java/christmas/service/EventService.java b/src/main/java/christmas/service/EventService.java index f2e534d..cfd4f12 100644 --- a/src/main/java/christmas/service/EventService.java +++ b/src/main/java/christmas/service/EventService.java @@ -2,6 +2,7 @@ import static christmas.domain.constant.event.ChristmasPromotion.CHRISTMAS_D_DAY_PROMOTION; import static christmas.domain.constant.event.EventConstant.GIFT_CHAMPAGNE_COUNT; +import static christmas.domain.constant.event.EventConstant.NONE_PROMOTION_APPLIED_AMOUNT; import static christmas.domain.constant.event.Promotion.GIFT_PROMOTION; import static christmas.domain.constant.event.Promotion.SPECIAL_PROMOTION; import static christmas.domain.constant.event.Promotion.WEEKDAY_PROMOTION; @@ -32,21 +33,25 @@ private GiftDto makeGiftDto() { } public BenefitsDetailsDto createBenefitsDetailsDto(ReservationDay reservationDay, Orders orders) { + return BenefitsDetailsDto.from(createBenefitsDetails(reservationDay, orders)); + } + + public Map createBenefitsDetails(ReservationDay reservationDay, Orders orders) { Map benefitsDetails = new LinkedHashMap<>(); if (orders.isEventApplicable()) { - return makeBenefitsDetailsDto(benefitsDetails, reservationDay, orders); + return makeBenefitsDetails(benefitsDetails, reservationDay, orders); } - return BenefitsDetailsDto.from(benefitsDetails); + return benefitsDetails; } - private BenefitsDetailsDto makeBenefitsDetailsDto(Map benefitsDetails, - ReservationDay reservationDay, Orders orders) { + private Map makeBenefitsDetails(Map benefitsDetails, + ReservationDay reservationDay, Orders orders) { addChristmasPromotionDetails(benefitsDetails, reservationDay); addWeekdayPromotionDetails(benefitsDetails, reservationDay, orders); addWeekendPromotionDetails(benefitsDetails, reservationDay, orders); addSpecialPromotionDetails(benefitsDetails, reservationDay); addGiftPromotionDetails(benefitsDetails, orders); - return BenefitsDetailsDto.from(benefitsDetails); + return benefitsDetails; } private void addChristmasPromotionDetails(Map benefitsDetails, ReservationDay reservationDay) { @@ -62,12 +67,18 @@ private int calculateChristmasPromotionBenefitAmount(ReservationDay reservationD private void addWeekdayPromotionDetails(Map benefitsDetails, ReservationDay reservationDay, Orders orders) { - if (reservationDay.isWeekdayPromotionApplicable()) { + if (canAddWeekdayPromotion(reservationDay, orders)) { benefitsDetails.put(WEEKDAY_PROMOTION.getName(), calculateWeekdayPromotionBenefitAmount(reservationDay, orders)); } } + private boolean canAddWeekdayPromotion(ReservationDay reservationDay, Orders orders) { + return reservationDay.isWeekdayPromotionApplicable() + && calculateWeekdayPromotionBenefitAmount(reservationDay, orders) + > NONE_PROMOTION_APPLIED_AMOUNT.getValue(); + } + private int calculateWeekdayPromotionBenefitAmount(ReservationDay reservationDay, Orders orders) { int count = orders.getOrders().stream() .filter(Order::isWeekdayPromotionApplicable) @@ -78,12 +89,18 @@ private int calculateWeekdayPromotionBenefitAmount(ReservationDay reservationDay private void addWeekendPromotionDetails(Map benefitsDetails, ReservationDay reservationDay, Orders orders) { - if (reservationDay.isWeekendPromotionApplicable()) { + if (canAddWeekendPromotion(reservationDay, orders)) { benefitsDetails.put(WEEKEND_PROMOTION.getName(), calculateWeekendPromotionBenefitAmount(reservationDay, orders)); } } + private boolean canAddWeekendPromotion(ReservationDay reservationDay, Orders orders) { + return reservationDay.isWeekendPromotionApplicable() + && calculateWeekendPromotionBenefitAmount(reservationDay, orders) + > NONE_PROMOTION_APPLIED_AMOUNT.getValue(); + } + private int calculateWeekendPromotionBenefitAmount(ReservationDay reservationDay, Orders orders) { int count = orders.getOrders().stream() .filter(Order::isWeekendPromotionApplicable) From 2dde13c1aff5b31ef336a9fac589265bbda79bb1 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 03:38:28 +0900 Subject: [PATCH 62/89] refactor: move EventService code to EventManager domain to impose responsibility on domain object --- src/main/java/christmas/EventPlanner.java | 21 +-- .../java/christmas/domain/EventManager.java | 122 ++++++++++++++++ .../service/EventManagerService.java | 30 ++++ .../java/christmas/service/EventService.java | 131 ------------------ 4 files changed, 164 insertions(+), 140 deletions(-) create mode 100644 src/main/java/christmas/domain/EventManager.java create mode 100644 src/main/java/christmas/service/EventManagerService.java delete mode 100644 src/main/java/christmas/service/EventService.java diff --git a/src/main/java/christmas/EventPlanner.java b/src/main/java/christmas/EventPlanner.java index e4e186d..8891224 100644 --- a/src/main/java/christmas/EventPlanner.java +++ b/src/main/java/christmas/EventPlanner.java @@ -2,9 +2,10 @@ import christmas.controller.OrdersController; import christmas.controller.ReservationDayController; +import christmas.domain.EventManager; import christmas.domain.Orders; import christmas.domain.ReservationDay; -import christmas.service.EventService; +import christmas.service.EventManagerService; import christmas.view.input.InputView; import christmas.view.output.OutputView; @@ -12,28 +13,30 @@ public class EventPlanner { private final OutputView outputView; private final ReservationDayController reservationDayController; private final OrdersController ordersController; - private final EventService eventService; + private final EventManagerService eventManagerService; public EventPlanner(InputView inputView, OutputView outputView) { this.outputView = outputView; reservationDayController = new ReservationDayController(inputView, outputView); ordersController = new OrdersController(inputView, outputView); - eventService = new EventService(); + eventManagerService = new EventManagerService(); outputView.printGreetingMessage(); } public void execute() { ReservationDay reservationDay = reservationDayController.insertReservationDay(); Orders orders = ordersController.insertOrders(); - printResult(reservationDay, orders); + EventManager eventManager = EventManager.of(reservationDay, orders); + + printResult(reservationDay, orders, eventManager); } - private void printResult(ReservationDay reservationDay, Orders orders) { + private void printResult(ReservationDay reservationDay, Orders orders, EventManager eventManager) { printIntroMessage(reservationDay); printOrderedMenus(orders); printTotalAmountWithNoDiscount(orders); printGiftMenu(orders); - printBenefitsDetails(reservationDay, orders); + printBenefitsDetails(eventManager); } private void printIntroMessage(ReservationDay reservationDay) { @@ -49,10 +52,10 @@ private void printTotalAmountWithNoDiscount(Orders orders) { } private void printGiftMenu(Orders orders) { - outputView.printGiftMenu(eventService.createGiftDto(orders)); + outputView.printGiftMenu(eventManagerService.createGiftDto(orders)); } - private void printBenefitsDetails(ReservationDay reservationDay, Orders orders) { - outputView.printBenefitsDetails(eventService.createBenefitsDetailsDto(reservationDay, orders)); + private void printBenefitsDetails(EventManager eventManager) { + outputView.printBenefitsDetails(eventManagerService.createBenefitsDetailsDto(eventManager)); } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/EventManager.java b/src/main/java/christmas/domain/EventManager.java new file mode 100644 index 0000000..418c4a6 --- /dev/null +++ b/src/main/java/christmas/domain/EventManager.java @@ -0,0 +1,122 @@ +package christmas.domain; + +import static christmas.domain.constant.event.ChristmasPromotion.CHRISTMAS_D_DAY_PROMOTION; +import static christmas.domain.constant.event.EventConstant.NONE_PROMOTION_APPLIED_AMOUNT; +import static christmas.domain.constant.event.Promotion.GIFT_PROMOTION; +import static christmas.domain.constant.event.Promotion.SPECIAL_PROMOTION; +import static christmas.domain.constant.event.Promotion.WEEKDAY_PROMOTION; +import static christmas.domain.constant.event.Promotion.WEEKEND_PROMOTION; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +public class EventManager { + private final ReservationDay reservationDay; + private final Orders orders; + + private EventManager(ReservationDay reservationDay, Orders orders) { + this.reservationDay = reservationDay; + this.orders = orders; + } + + public static EventManager of(ReservationDay reservationDay, Orders orders) { + return new EventManager(reservationDay, orders); + } + + public Map createBenefitsDetails() { + Map benefitsDetails = new LinkedHashMap<>(); + if (orders.isEventApplicable()) { + return makeBenefitsDetails(benefitsDetails); + } + return benefitsDetails; + } + + private Map makeBenefitsDetails(Map benefitsDetails) { + addChristmasPromotionDetails(benefitsDetails); + addWeekdayPromotionDetails(benefitsDetails); + addWeekendPromotionDetails(benefitsDetails); + addSpecialPromotionDetails(benefitsDetails); + addGiftPromotionDetails(benefitsDetails); + return benefitsDetails; + } + + private void addChristmasPromotionDetails(Map benefitsDetails) { + if (reservationDay.isChristmasPromotionApplicable()) { + benefitsDetails.put(CHRISTMAS_D_DAY_PROMOTION.getName(), + calculateChristmasPromotionBenefitAmount()); + } + } + + private int calculateChristmasPromotionBenefitAmount() { + return CHRISTMAS_D_DAY_PROMOTION.getBenefitAmount(reservationDay.getDay()); + } + + private void addWeekdayPromotionDetails(Map benefitsDetails) { + if (canAddWeekdayPromotion()) { + benefitsDetails.put(WEEKDAY_PROMOTION.getName(), + calculateWeekdayPromotionBenefitAmount()); + } + } + + private boolean canAddWeekdayPromotion() { + return reservationDay.isWeekdayPromotionApplicable() + && calculateWeekdayPromotionBenefitAmount() + > NONE_PROMOTION_APPLIED_AMOUNT.getValue(); + } + + private int calculateWeekdayPromotionBenefitAmount() { + int count = orders.getOrders().stream() + .filter(Order::isWeekdayPromotionApplicable) + .mapToInt(Order::getMenuCount) + .sum(); + return WEEKDAY_PROMOTION.getBenefitAmount() * count; + } + + private void addWeekendPromotionDetails(Map benefitsDetails) { + if (canAddWeekendPromotion()) { + benefitsDetails.put(WEEKEND_PROMOTION.getName(), + calculateWeekendPromotionBenefitAmount()); + } + } + + private boolean canAddWeekendPromotion() { + return reservationDay.isWeekendPromotionApplicable() + && calculateWeekendPromotionBenefitAmount() + > NONE_PROMOTION_APPLIED_AMOUNT.getValue(); + } + + private int calculateWeekendPromotionBenefitAmount() { + int count = orders.getOrders().stream() + .filter(Order::isWeekendPromotionApplicable) + .mapToInt(Order::getMenuCount) + .sum(); + return WEEKEND_PROMOTION.getBenefitAmount() * count; + } + + private void addSpecialPromotionDetails(Map benefitsDetails) { + if (reservationDay.isSpecialPromotionApplicable()) { + benefitsDetails.put(SPECIAL_PROMOTION.getName(), calculateSpecialPromotionBenefitAmount()); + } + } + + private int calculateSpecialPromotionBenefitAmount() { + return SPECIAL_PROMOTION.getBenefitAmount(); + } + + private void addGiftPromotionDetails(Map benefitsDetails) { + if (orders.isGiftEventApplicable()) { + benefitsDetails.put(GIFT_PROMOTION.getName(), calculateGiftPromotionBenefitAmount()); + } + } + + private int calculateGiftPromotionBenefitAmount() { + return GIFT_PROMOTION.getBenefitAmount(); + } + + public int calculateTotalBenefitedAmount() { + return makeBenefitsDetails(new HashMap<>()).values().stream() + .mapToInt(Integer::intValue) + .sum(); + } +} \ No newline at end of file diff --git a/src/main/java/christmas/service/EventManagerService.java b/src/main/java/christmas/service/EventManagerService.java new file mode 100644 index 0000000..8abe039 --- /dev/null +++ b/src/main/java/christmas/service/EventManagerService.java @@ -0,0 +1,30 @@ +package christmas.service; + + +import static christmas.domain.constant.event.EventConstant.GIFT_CHAMPAGNE_COUNT; + +import christmas.domain.EventManager; +import christmas.domain.Orders; +import christmas.domain.constant.orders.Menu; +import christmas.dto.BenefitsDetailsDto; +import christmas.dto.GiftDto; +import java.util.LinkedHashMap; +import java.util.Map; + +public class EventManagerService { + public GiftDto createGiftDto(Orders orders) { + Map gifts = new LinkedHashMap<>(); + if (orders.isGiftEventApplicable()) { + makeGifts(gifts); + } + return GiftDto.from(gifts); + } + + private void makeGifts(Map gifts) { + gifts.put(Menu.CHAMPAGNE.getName(), GIFT_CHAMPAGNE_COUNT.getValue()); + } + + public BenefitsDetailsDto createBenefitsDetailsDto(EventManager eventManager) { + return BenefitsDetailsDto.from(eventManager.createBenefitsDetails()); + } +} \ No newline at end of file diff --git a/src/main/java/christmas/service/EventService.java b/src/main/java/christmas/service/EventService.java deleted file mode 100644 index cfd4f12..0000000 --- a/src/main/java/christmas/service/EventService.java +++ /dev/null @@ -1,131 +0,0 @@ -package christmas.service; - -import static christmas.domain.constant.event.ChristmasPromotion.CHRISTMAS_D_DAY_PROMOTION; -import static christmas.domain.constant.event.EventConstant.GIFT_CHAMPAGNE_COUNT; -import static christmas.domain.constant.event.EventConstant.NONE_PROMOTION_APPLIED_AMOUNT; -import static christmas.domain.constant.event.Promotion.GIFT_PROMOTION; -import static christmas.domain.constant.event.Promotion.SPECIAL_PROMOTION; -import static christmas.domain.constant.event.Promotion.WEEKDAY_PROMOTION; -import static christmas.domain.constant.event.Promotion.WEEKEND_PROMOTION; - -import christmas.domain.Order; -import christmas.domain.Orders; -import christmas.domain.ReservationDay; -import christmas.domain.constant.orders.Menu; -import christmas.dto.BenefitsDetailsDto; -import christmas.dto.GiftDto; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; - -public class EventService { - - public GiftDto createGiftDto(Orders orders) { - Map giftDto = new LinkedHashMap<>(); - if (orders.isGiftEventApplicable()) { - return makeGiftDto(); - } - return GiftDto.from(giftDto); - } - - private GiftDto makeGiftDto() { - return GiftDto.from(Collections.singletonMap(Menu.CHAMPAGNE.getName(), GIFT_CHAMPAGNE_COUNT.getValue())); - } - - public BenefitsDetailsDto createBenefitsDetailsDto(ReservationDay reservationDay, Orders orders) { - return BenefitsDetailsDto.from(createBenefitsDetails(reservationDay, orders)); - } - - public Map createBenefitsDetails(ReservationDay reservationDay, Orders orders) { - Map benefitsDetails = new LinkedHashMap<>(); - if (orders.isEventApplicable()) { - return makeBenefitsDetails(benefitsDetails, reservationDay, orders); - } - return benefitsDetails; - } - - private Map makeBenefitsDetails(Map benefitsDetails, - ReservationDay reservationDay, Orders orders) { - addChristmasPromotionDetails(benefitsDetails, reservationDay); - addWeekdayPromotionDetails(benefitsDetails, reservationDay, orders); - addWeekendPromotionDetails(benefitsDetails, reservationDay, orders); - addSpecialPromotionDetails(benefitsDetails, reservationDay); - addGiftPromotionDetails(benefitsDetails, orders); - return benefitsDetails; - } - - private void addChristmasPromotionDetails(Map benefitsDetails, ReservationDay reservationDay) { - if (reservationDay.isChristmasPromotionApplicable()) { - benefitsDetails.put(CHRISTMAS_D_DAY_PROMOTION.getName(), - calculateChristmasPromotionBenefitAmount(reservationDay)); - } - } - - private int calculateChristmasPromotionBenefitAmount(ReservationDay reservationDay) { - return CHRISTMAS_D_DAY_PROMOTION.getBenefitAmount(reservationDay.getDay()); - } - - private void addWeekdayPromotionDetails(Map benefitsDetails, ReservationDay reservationDay, - Orders orders) { - if (canAddWeekdayPromotion(reservationDay, orders)) { - benefitsDetails.put(WEEKDAY_PROMOTION.getName(), - calculateWeekdayPromotionBenefitAmount(reservationDay, orders)); - } - } - - private boolean canAddWeekdayPromotion(ReservationDay reservationDay, Orders orders) { - return reservationDay.isWeekdayPromotionApplicable() - && calculateWeekdayPromotionBenefitAmount(reservationDay, orders) - > NONE_PROMOTION_APPLIED_AMOUNT.getValue(); - } - - private int calculateWeekdayPromotionBenefitAmount(ReservationDay reservationDay, Orders orders) { - int count = orders.getOrders().stream() - .filter(Order::isWeekdayPromotionApplicable) - .mapToInt(Order::getMenuCount) - .sum(); - return WEEKDAY_PROMOTION.getBenefitAmount() * count; - } - - private void addWeekendPromotionDetails(Map benefitsDetails, ReservationDay reservationDay, - Orders orders) { - if (canAddWeekendPromotion(reservationDay, orders)) { - benefitsDetails.put(WEEKEND_PROMOTION.getName(), - calculateWeekendPromotionBenefitAmount(reservationDay, orders)); - } - } - - private boolean canAddWeekendPromotion(ReservationDay reservationDay, Orders orders) { - return reservationDay.isWeekendPromotionApplicable() - && calculateWeekendPromotionBenefitAmount(reservationDay, orders) - > NONE_PROMOTION_APPLIED_AMOUNT.getValue(); - } - - private int calculateWeekendPromotionBenefitAmount(ReservationDay reservationDay, Orders orders) { - int count = orders.getOrders().stream() - .filter(Order::isWeekendPromotionApplicable) - .mapToInt(Order::getMenuCount) - .sum(); - return WEEKEND_PROMOTION.getBenefitAmount() * count; - } - - private void addSpecialPromotionDetails(Map benefitsDetails, ReservationDay reservationDay) { - if (reservationDay.isSpecialPromotionApplicable()) { - benefitsDetails.put(SPECIAL_PROMOTION.getName(), calculateSpecialPromotionBenefitAmount()); - } - } - - private int calculateSpecialPromotionBenefitAmount() { - return SPECIAL_PROMOTION.getBenefitAmount(); - } - - private void addGiftPromotionDetails(Map benefitsDetails, Orders orders) { - if (orders.isGiftEventApplicable()) { - benefitsDetails.put(GIFT_PROMOTION.getName(), calculateGiftPromotionBenefitAmount()); - } - } - - private int calculateGiftPromotionBenefitAmount() { - return GIFT_PROMOTION.getBenefitAmount(); - } -} \ No newline at end of file From 3fd182465688827e804d1c928d9c5c9ae599dd06 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 03:45:23 +0900 Subject: [PATCH 63/89] feat: add feature to calculate total benefited amount --- docs/README.md | 4 ++-- src/main/java/christmas/EventPlanner.java | 5 +++++ .../christmas/dto/TotalBenefitedAmountDto.java | 17 +++++++++++++++++ .../christmas/service/EventManagerService.java | 5 +++++ .../java/christmas/view/output/OutputView.java | 5 +++++ 5 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 src/main/java/christmas/dto/TotalBenefitedAmountDto.java diff --git a/docs/README.md b/docs/README.md index e6af2c3..9292654 100644 --- a/docs/README.md +++ b/docs/README.md @@ -109,8 +109,8 @@ - [x] μ£Όλ¬Έ λ‚΄μ—­κ³Ό λ‚ μ§œλ₯Ό λΉ„κ΅ν•΄μ„œ, `ν˜œνƒ λ‚΄μ—­`을 μƒμ‚°ν•œλ‹€. - [] μ£Όλ¬Έ 내역에 λ‚ μ§œμ— λ”°λ₯Έ 할인 적용 μ—¬λΆ€λ₯Ό μ μš©ν•΄μ„œ, `할인 κΈˆμ•‘`을 κ³„μ‚°ν•œλ‹€. - - [] ν˜œνƒ λ‚΄μ—­μ˜ κΈˆμ•‘μ„ ν•©μ³μ„œ, `총 ν˜œνƒ κΈˆμ•‘`을 κ³„μ‚°ν•œλ‹€. - - [] μ£Όλ¬Έ 내역에 증정 μ΄λ²€νŠΈκ°€ ν¬ν•¨λ˜μ–΄ μžˆμ„ μ‹œ, μ¦μ •ν’ˆμ˜ κ°€κ²©κΉŒμ§€ `총 ν˜œνƒ κΈˆμ•‘`에 ν¬ν•¨μ‹œν‚¨λ‹€. + - [x] ν˜œνƒ λ‚΄μ—­μ˜ κΈˆμ•‘μ„ ν•©μ³μ„œ, `총 ν˜œνƒ κΈˆμ•‘`을 κ³„μ‚°ν•œλ‹€. + - [x] μ£Όλ¬Έ 내역에 증정 μ΄λ²€νŠΈκ°€ ν¬ν•¨λ˜μ–΄ μžˆμ„ μ‹œ, μ¦μ •ν’ˆμ˜ κ°€κ²©κΉŒμ§€ `총 ν˜œνƒ κΈˆμ•‘`에 ν¬ν•¨μ‹œν‚¨λ‹€. - [] 총 ν˜œνƒ κΈˆμ•‘μ„ 기반으둜 12μ›” 이벀트 λ°°μ§€λ₯Ό λ°œκΈ‰ν•œλ‹€. - [] ν˜œνƒ κΈˆμ•‘μ΄ `5000원` 이상일 μ‹œ, `별`
ν˜œνƒ κΈˆμ•‘μ΄ `1λ§Œμ›` 이상일 μ‹œ, `트리` diff --git a/src/main/java/christmas/EventPlanner.java b/src/main/java/christmas/EventPlanner.java index 8891224..de9eedf 100644 --- a/src/main/java/christmas/EventPlanner.java +++ b/src/main/java/christmas/EventPlanner.java @@ -37,6 +37,7 @@ private void printResult(ReservationDay reservationDay, Orders orders, EventMana printTotalAmountWithNoDiscount(orders); printGiftMenu(orders); printBenefitsDetails(eventManager); + printTotalBenefitedAmount(eventManager); } private void printIntroMessage(ReservationDay reservationDay) { @@ -58,4 +59,8 @@ private void printGiftMenu(Orders orders) { private void printBenefitsDetails(EventManager eventManager) { outputView.printBenefitsDetails(eventManagerService.createBenefitsDetailsDto(eventManager)); } + + private void printTotalBenefitedAmount(EventManager eventManager) { + outputView.printTotalBenefitedAmount(eventManagerService.createTotalBenefitedAmountDto(eventManager)); + } } \ No newline at end of file diff --git a/src/main/java/christmas/dto/TotalBenefitedAmountDto.java b/src/main/java/christmas/dto/TotalBenefitedAmountDto.java new file mode 100644 index 0000000..5cbbbbd --- /dev/null +++ b/src/main/java/christmas/dto/TotalBenefitedAmountDto.java @@ -0,0 +1,17 @@ +package christmas.dto; + +public class TotalBenefitedAmountDto { + private final int amount; + + public TotalBenefitedAmountDto(final int amount) { + this.amount = amount; + } + + public static TotalBenefitedAmountDto from(final int amount) { + return new TotalBenefitedAmountDto(amount); + } + + public int getAmount() { + return amount; + } +} \ No newline at end of file diff --git a/src/main/java/christmas/service/EventManagerService.java b/src/main/java/christmas/service/EventManagerService.java index 8abe039..57e3e57 100644 --- a/src/main/java/christmas/service/EventManagerService.java +++ b/src/main/java/christmas/service/EventManagerService.java @@ -8,6 +8,7 @@ import christmas.domain.constant.orders.Menu; import christmas.dto.BenefitsDetailsDto; import christmas.dto.GiftDto; +import christmas.dto.TotalBenefitedAmountDto; import java.util.LinkedHashMap; import java.util.Map; @@ -27,4 +28,8 @@ private void makeGifts(Map gifts) { public BenefitsDetailsDto createBenefitsDetailsDto(EventManager eventManager) { return BenefitsDetailsDto.from(eventManager.createBenefitsDetails()); } + + public TotalBenefitedAmountDto createTotalBenefitedAmountDto(EventManager eventManager) { + return TotalBenefitedAmountDto.from(eventManager.calculateTotalBenefitedAmount()); + } } \ No newline at end of file diff --git a/src/main/java/christmas/view/output/OutputView.java b/src/main/java/christmas/view/output/OutputView.java index 25472ff..9dbce16 100644 --- a/src/main/java/christmas/view/output/OutputView.java +++ b/src/main/java/christmas/view/output/OutputView.java @@ -22,6 +22,7 @@ import christmas.dto.GiftDto; import christmas.dto.OrderedMenusDto; import christmas.dto.TotalAmountWithNoDiscountDto; +import christmas.dto.TotalBenefitedAmountDto; import java.text.DecimalFormat; public class OutputView { @@ -103,6 +104,10 @@ private void printBenefitNamesAndAmount(BenefitsDetailsDto benefitsDetailsDto) { ); } + public void printTotalBenefitedAmount(TotalBenefitedAmountDto totalBenefitedAmountDto) { + + } + public void printLine() { System.out.print(NEW_LINE.getSymbol()); } From dbc6031bdd4006df562cf681c22f02c74e5d2ae4 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 04:04:20 +0900 Subject: [PATCH 64/89] feat: add feature to print total benefited amount using appropriate format --- docs/README.md | 10 +++++----- src/main/java/christmas/domain/EventManager.java | 3 +-- .../domain/constant/event/ChristmasPromotion.java | 8 ++++---- .../java/christmas/dto/TotalBenefitedAmountDto.java | 2 +- src/main/java/christmas/view/output/OutputView.java | 9 ++++++++- .../view/output/constant/OutputFormatConstant.java | 3 ++- .../view/output/constant/OutputSymbolConstant.java | 1 + 7 files changed, 22 insertions(+), 14 deletions(-) diff --git a/docs/README.md b/docs/README.md index 9292654..1668ff6 100644 --- a/docs/README.md +++ b/docs/README.md @@ -153,11 +153,11 @@ > ### πŸ“‰ 총 ν˜œνƒ κΈˆμ•‘ 좜λ ₯ -- [] 총 ν˜œνƒ κΈˆμ•‘μ„ λ‚˜νƒ€λ‚΄λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. -- [] `총 ν˜œνƒ κΈˆμ•‘`은 `ν˜œνƒ λ‚΄μ—­`에 적용된 ν˜œνƒ κΈˆμ•‘μ„ λͺ¨λ‘ λ”ν•œ 값을 좜λ ₯ν•œλ‹€. - - [] `-${ν˜œνƒ κΈˆμ•‘}원` ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. - - [] `ν˜œνƒ κΈˆμ•‘`의 μ„Έμžλ¦¬ μˆ˜λ§ˆλ‹€ `,`λ₯Ό λΆ™μ΄λŠ” ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. -- [] `총 ν˜œνƒ κΈˆμ•‘`이 0원이면 `0원`으둜 좜λ ₯ν•œλ‹€. +- [x] 총 ν˜œνƒ κΈˆμ•‘μ„ λ‚˜νƒ€λ‚΄λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. +- [x] `총 ν˜œνƒ κΈˆμ•‘`은 `ν˜œνƒ λ‚΄μ—­`에 적용된 ν˜œνƒ κΈˆμ•‘μ„ λͺ¨λ‘ λ”ν•œ 값을 좜λ ₯ν•œλ‹€. + - [x] `-${ν˜œνƒ κΈˆμ•‘}원` ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. + - [x] `ν˜œνƒ κΈˆμ•‘`의 μ„Έμžλ¦¬ μˆ˜λ§ˆλ‹€ `,`λ₯Ό λΆ™μ΄λŠ” ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. +- [x] `총 ν˜œνƒ κΈˆμ•‘`이 0원이면 `0원`으둜 좜λ ₯ν•œλ‹€. > ### πŸ’΅ 할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘ 좜λ ₯ diff --git a/src/main/java/christmas/domain/EventManager.java b/src/main/java/christmas/domain/EventManager.java index 418c4a6..23439fd 100644 --- a/src/main/java/christmas/domain/EventManager.java +++ b/src/main/java/christmas/domain/EventManager.java @@ -7,7 +7,6 @@ import static christmas.domain.constant.event.Promotion.WEEKDAY_PROMOTION; import static christmas.domain.constant.event.Promotion.WEEKEND_PROMOTION; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; @@ -115,7 +114,7 @@ private int calculateGiftPromotionBenefitAmount() { } public int calculateTotalBenefitedAmount() { - return makeBenefitsDetails(new HashMap<>()).values().stream() + return createBenefitsDetails().values().stream() .mapToInt(Integer::intValue) .sum(); } diff --git a/src/main/java/christmas/domain/constant/event/ChristmasPromotion.java b/src/main/java/christmas/domain/constant/event/ChristmasPromotion.java index b1eece4..2c08319 100644 --- a/src/main/java/christmas/domain/constant/event/ChristmasPromotion.java +++ b/src/main/java/christmas/domain/constant/event/ChristmasPromotion.java @@ -6,11 +6,11 @@ public enum ChristmasPromotion { CHRISTMAS_D_DAY_PROMOTION("크리슀마슀 디데이 할인", 900); private final String name; - private final int benefitAmount; + private final int startBenefitAmount; - ChristmasPromotion(final String name, final int benefitAmount) { + ChristmasPromotion(final String name, final int startBenefitAmount) { this.name = name; - this.benefitAmount = benefitAmount; + this.startBenefitAmount = startBenefitAmount; } public String getName() { @@ -18,6 +18,6 @@ public String getName() { } public int getBenefitAmount(final int day) { - return benefitAmount + day * CHRISTMAS_PROMOTION_INCREASING_AMOUNT.getValue(); + return startBenefitAmount + day * CHRISTMAS_PROMOTION_INCREASING_AMOUNT.getValue(); } } \ No newline at end of file diff --git a/src/main/java/christmas/dto/TotalBenefitedAmountDto.java b/src/main/java/christmas/dto/TotalBenefitedAmountDto.java index 5cbbbbd..71f0ed0 100644 --- a/src/main/java/christmas/dto/TotalBenefitedAmountDto.java +++ b/src/main/java/christmas/dto/TotalBenefitedAmountDto.java @@ -8,7 +8,7 @@ public TotalBenefitedAmountDto(final int amount) { } public static TotalBenefitedAmountDto from(final int amount) { - return new TotalBenefitedAmountDto(amount); + return new TotalBenefitedAmountDto(-amount); } public int getAmount() { diff --git a/src/main/java/christmas/view/output/OutputView.java b/src/main/java/christmas/view/output/OutputView.java index 9dbce16..ca538c0 100644 --- a/src/main/java/christmas/view/output/OutputView.java +++ b/src/main/java/christmas/view/output/OutputView.java @@ -6,6 +6,7 @@ import static christmas.view.output.constant.OutputFormatConstant.PRICE_FORMAT_STYLE; import static christmas.view.output.constant.OutputFormatConstant.SHOW_RESULT_INTRO_FORMAT; import static christmas.view.output.constant.OutputFormatConstant.TOTAL_AMOUNT_WITH_NO_DISCOUNT_PRINT_FORMAT; +import static christmas.view.output.constant.OutputFormatConstant.TOTAL_BENEFITED_AMOUNT_PRINT_FORMAT; import static christmas.view.output.constant.OutputMessageConstant.GREETING; import static christmas.view.output.constant.OutputMessageConstant.INSERT_ORDERS; import static christmas.view.output.constant.OutputMessageConstant.INSERT_RESERVATION_DAY; @@ -16,6 +17,7 @@ import static christmas.view.output.constant.OutputSymbolConstant.NO_GIFT; import static christmas.view.output.constant.OutputSymbolConstant.ORDERED_MENUS; import static christmas.view.output.constant.OutputSymbolConstant.TOTAL_AMOUNT_WITH_NO_DISCOUNT; +import static christmas.view.output.constant.OutputSymbolConstant.TOTAL_BENEFITED_AMOUNT; import christmas.dto.BenefitsDetailsDto; import christmas.dto.EventBenefitsPreviewDto; @@ -96,6 +98,7 @@ public void printBenefitsDetails(BenefitsDetailsDto benefitsDetailsDto) { private void printBenefitNamesAndAmount(BenefitsDetailsDto benefitsDetailsDto) { if (benefitsDetailsDto.isEmpty()) { print(NO_BENEFITS.getSymbol()); + printLine(); } benefitsDetailsDto.getBenefitsDetails().forEach((benefitName, benefitAmount) -> { printFormatted(BENEFITS_DETAILS_PRINT_FORMAT.getFormat(), benefitName, formatPrice(benefitAmount)); @@ -105,7 +108,11 @@ private void printBenefitNamesAndAmount(BenefitsDetailsDto benefitsDetailsDto) { } public void printTotalBenefitedAmount(TotalBenefitedAmountDto totalBenefitedAmountDto) { - + printLine(); + print(TOTAL_BENEFITED_AMOUNT.getSymbol()); + printLine(); + printFormatted(TOTAL_BENEFITED_AMOUNT_PRINT_FORMAT.getFormat(), + formatPrice(totalBenefitedAmountDto.getAmount())); } public void printLine() { diff --git a/src/main/java/christmas/view/output/constant/OutputFormatConstant.java b/src/main/java/christmas/view/output/constant/OutputFormatConstant.java index e5b14ec..a5c82c6 100644 --- a/src/main/java/christmas/view/output/constant/OutputFormatConstant.java +++ b/src/main/java/christmas/view/output/constant/OutputFormatConstant.java @@ -8,7 +8,8 @@ public enum OutputFormatConstant { TOTAL_AMOUNT_WITH_NO_DISCOUNT_PRINT_FORMAT("%s원"), PRICE_FORMAT_STYLE("###,###"), GIFT_PRINT_FORMAT("%s %d개"), - BENEFITS_DETAILS_PRINT_FORMAT("%s: -%s원"); + BENEFITS_DETAILS_PRINT_FORMAT("%s: -%s원"), + TOTAL_BENEFITED_AMOUNT_PRINT_FORMAT("%s원"); private final String format; diff --git a/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java b/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java index 0a4108a..c990bc8 100644 --- a/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java +++ b/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java @@ -6,6 +6,7 @@ public enum OutputSymbolConstant { TOTAL_AMOUNT_WITH_NO_DISCOUNT("<할인 μ „ 총주문 κΈˆμ•‘>"), GIFT_MENU("<증정 메뉴>"), BENEFITS_DETAILS("<ν˜œνƒ λ‚΄μ—­>"), + TOTAL_BENEFITED_AMOUNT("<μ΄ν˜œνƒ κΈˆμ•‘>"), NO_GIFT("μ—†μŒ"), NO_BENEFITS("μ—†μŒ"); private final String symbol; From 3c7847b0dc4fcf236c08be323ee20414ce3d8cbb Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 04:09:03 +0900 Subject: [PATCH 65/89] feat: add feature to calculate total discounted amount --- docs/README.md | 2 +- src/main/java/christmas/domain/EventManager.java | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 1668ff6..a4dbd1e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -108,7 +108,7 @@ > ### πŸŽ„ μ£Όλ¬Έ 내역에 λŒ€ν•œ 이벀트 적용 κ²°κ³Ό μ‚°μΆœ 도메인 둜직 - [x] μ£Όλ¬Έ λ‚΄μ—­κ³Ό λ‚ μ§œλ₯Ό λΉ„κ΅ν•΄μ„œ, `ν˜œνƒ λ‚΄μ—­`을 μƒμ‚°ν•œλ‹€. - - [] μ£Όλ¬Έ 내역에 λ‚ μ§œμ— λ”°λ₯Έ 할인 적용 μ—¬λΆ€λ₯Ό μ μš©ν•΄μ„œ, `할인 κΈˆμ•‘`을 κ³„μ‚°ν•œλ‹€. + - [x] μ£Όλ¬Έ 내역에 λ‚ μ§œμ— λ”°λ₯Έ 할인 적용 μ—¬λΆ€λ₯Ό μ μš©ν•΄μ„œ, `할인 κΈˆμ•‘`을 κ³„μ‚°ν•œλ‹€. - [x] ν˜œνƒ λ‚΄μ—­μ˜ κΈˆμ•‘μ„ ν•©μ³μ„œ, `총 ν˜œνƒ κΈˆμ•‘`을 κ³„μ‚°ν•œλ‹€. - [x] μ£Όλ¬Έ 내역에 증정 μ΄λ²€νŠΈκ°€ ν¬ν•¨λ˜μ–΄ μžˆμ„ μ‹œ, μ¦μ •ν’ˆμ˜ κ°€κ²©κΉŒμ§€ `총 ν˜œνƒ κΈˆμ•‘`에 ν¬ν•¨μ‹œν‚¨λ‹€. - [] 총 ν˜œνƒ κΈˆμ•‘μ„ 기반으둜 12μ›” 이벀트 λ°°μ§€λ₯Ό λ°œκΈ‰ν•œλ‹€. diff --git a/src/main/java/christmas/domain/EventManager.java b/src/main/java/christmas/domain/EventManager.java index 23439fd..c90fb62 100644 --- a/src/main/java/christmas/domain/EventManager.java +++ b/src/main/java/christmas/domain/EventManager.java @@ -118,4 +118,11 @@ public int calculateTotalBenefitedAmount() { .mapToInt(Integer::intValue) .sum(); } + + public int calculateTotalDiscountedAmount() { + if (orders.isGiftEventApplicable()) { + return calculateTotalBenefitedAmount() - calculateGiftPromotionBenefitAmount(); + } + return calculateTotalBenefitedAmount(); + } } \ No newline at end of file From b17acb1c7d394cf0ed9d2140b7a61ca5e39b62d1 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 04:12:23 +0900 Subject: [PATCH 66/89] feat: add feature to calculate estimated amount with discount --- docs/README.md | 2 +- src/main/java/christmas/domain/EventManager.java | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index a4dbd1e..2bcfca8 100644 --- a/docs/README.md +++ b/docs/README.md @@ -115,7 +115,7 @@ - [] ν˜œνƒ κΈˆμ•‘μ΄ `5000원` 이상일 μ‹œ, `별`
ν˜œνƒ κΈˆμ•‘μ΄ `1λ§Œμ›` 이상일 μ‹œ, `트리`
ν˜œνƒ κΈˆμ•‘μ΄ `2λ§Œμ›` 이상일 μ‹œ, `산타` - - [] `할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘` μ—μ„œ `할인 κΈˆμ•‘`을 λΉΌμ„œ `할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘`을 κ³„μ‚°ν•œλ‹€. + - [x] `할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘` μ—μ„œ `할인 κΈˆμ•‘`을 λΉΌμ„œ `할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘`을 κ³„μ‚°ν•œλ‹€. ## πŸ–¨ [ 좜λ ₯ κΈ°λŠ₯ ] diff --git a/src/main/java/christmas/domain/EventManager.java b/src/main/java/christmas/domain/EventManager.java index c90fb62..ac7b62d 100644 --- a/src/main/java/christmas/domain/EventManager.java +++ b/src/main/java/christmas/domain/EventManager.java @@ -119,7 +119,11 @@ public int calculateTotalBenefitedAmount() { .sum(); } - public int calculateTotalDiscountedAmount() { + public int calculateEstimatedOrdersAmountWithDiscount() { + return orders.calculateTotalAmountWithNoDiscount() - calculateTotalDiscountedAmount(); + } + + private int calculateTotalDiscountedAmount() { if (orders.isGiftEventApplicable()) { return calculateTotalBenefitedAmount() - calculateGiftPromotionBenefitAmount(); } From f587dcf2dda967af9136b03c1455a344c402b194 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 04:49:14 +0900 Subject: [PATCH 67/89] feat: add feature to print estimated amount with discount using appropriate format --- docs/README.md | 8 ++++---- src/main/java/christmas/EventPlanner.java | 6 ++++++ .../dto/EstimatedAmountWithDiscountDto.java | 17 +++++++++++++++++ .../christmas/service/EventManagerService.java | 5 +++++ .../java/christmas/view/output/OutputView.java | 13 +++++++++++++ .../output/constant/OutputFormatConstant.java | 3 ++- .../output/constant/OutputSymbolConstant.java | 1 + 7 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 src/main/java/christmas/dto/EstimatedAmountWithDiscountDto.java diff --git a/docs/README.md b/docs/README.md index 2bcfca8..a5f2a41 100644 --- a/docs/README.md +++ b/docs/README.md @@ -161,10 +161,10 @@ > ### πŸ’΅ 할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘ 좜λ ₯ -- [] 할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘μ„ λ‚˜νƒ€λ‚΄λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. -- [] `할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘`은 `할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘`μ—μ„œ `총 ν˜œνƒ κΈˆμ•‘`을 λΊ€ 값을 좜λ ₯ν•œλ‹€. - - [] `${할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘}원` ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. - - [] `할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘`의 μ„Έμžλ¦¬ μˆ˜λ§ˆλ‹€ `,`λ₯Ό λΆ™μ΄λŠ” ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. +- [x] 할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘μ„ λ‚˜νƒ€λ‚΄λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. +- [x] `할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘`은 `할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘`μ—μ„œ `총 ν˜œνƒ κΈˆμ•‘`을 λΊ€ 값을 좜λ ₯ν•œλ‹€. + - [x] `${할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘}원` ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. + - [x] `할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘`의 μ„Έμžλ¦¬ μˆ˜λ§ˆλ‹€ `,`λ₯Ό λΆ™μ΄λŠ” ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. > ### β­πŸŽ„πŸŽ… 12μ›” 이벀트 λ°°μ§€ 좜λ ₯ diff --git a/src/main/java/christmas/EventPlanner.java b/src/main/java/christmas/EventPlanner.java index de9eedf..81b666c 100644 --- a/src/main/java/christmas/EventPlanner.java +++ b/src/main/java/christmas/EventPlanner.java @@ -38,6 +38,7 @@ private void printResult(ReservationDay reservationDay, Orders orders, EventMana printGiftMenu(orders); printBenefitsDetails(eventManager); printTotalBenefitedAmount(eventManager); + printEstimatedAmountWithDiscount(eventManager); } private void printIntroMessage(ReservationDay reservationDay) { @@ -63,4 +64,9 @@ private void printBenefitsDetails(EventManager eventManager) { private void printTotalBenefitedAmount(EventManager eventManager) { outputView.printTotalBenefitedAmount(eventManagerService.createTotalBenefitedAmountDto(eventManager)); } + + private void printEstimatedAmountWithDiscount(EventManager eventManager) { + outputView.printEstimatedAmountWithDiscount( + eventManagerService.createEstimatedAmountWithDiscountDto(eventManager)); + } } \ No newline at end of file diff --git a/src/main/java/christmas/dto/EstimatedAmountWithDiscountDto.java b/src/main/java/christmas/dto/EstimatedAmountWithDiscountDto.java new file mode 100644 index 0000000..6e459e7 --- /dev/null +++ b/src/main/java/christmas/dto/EstimatedAmountWithDiscountDto.java @@ -0,0 +1,17 @@ +package christmas.dto; + +public class EstimatedAmountWithDiscountDto { + private final int amount; + + public EstimatedAmountWithDiscountDto(final int amount) { + this.amount = amount; + } + + public static EstimatedAmountWithDiscountDto from(final int amount) { + return new EstimatedAmountWithDiscountDto(amount); + } + + public int getAmount() { + return amount; + } +} \ No newline at end of file diff --git a/src/main/java/christmas/service/EventManagerService.java b/src/main/java/christmas/service/EventManagerService.java index 57e3e57..ed64f0e 100644 --- a/src/main/java/christmas/service/EventManagerService.java +++ b/src/main/java/christmas/service/EventManagerService.java @@ -7,6 +7,7 @@ import christmas.domain.Orders; import christmas.domain.constant.orders.Menu; import christmas.dto.BenefitsDetailsDto; +import christmas.dto.EstimatedAmountWithDiscountDto; import christmas.dto.GiftDto; import christmas.dto.TotalBenefitedAmountDto; import java.util.LinkedHashMap; @@ -32,4 +33,8 @@ public BenefitsDetailsDto createBenefitsDetailsDto(EventManager eventManager) { public TotalBenefitedAmountDto createTotalBenefitedAmountDto(EventManager eventManager) { return TotalBenefitedAmountDto.from(eventManager.calculateTotalBenefitedAmount()); } + + public EstimatedAmountWithDiscountDto createEstimatedAmountWithDiscountDto(EventManager eventManager) { + return EstimatedAmountWithDiscountDto.from(eventManager.calculateEstimatedOrdersAmountWithDiscount()); + } } \ No newline at end of file diff --git a/src/main/java/christmas/view/output/OutputView.java b/src/main/java/christmas/view/output/OutputView.java index ca538c0..3f5a4bf 100644 --- a/src/main/java/christmas/view/output/OutputView.java +++ b/src/main/java/christmas/view/output/OutputView.java @@ -1,6 +1,7 @@ package christmas.view.output; import static christmas.view.output.constant.OutputFormatConstant.BENEFITS_DETAILS_PRINT_FORMAT; +import static christmas.view.output.constant.OutputFormatConstant.ESTIMATED_AMOUNT_WITH_DISCOUNT_PRINT_FORMAT; import static christmas.view.output.constant.OutputFormatConstant.GIFT_PRINT_FORMAT; import static christmas.view.output.constant.OutputFormatConstant.ORDERED_MENUS_PRINT_FORMAT; import static christmas.view.output.constant.OutputFormatConstant.PRICE_FORMAT_STYLE; @@ -11,6 +12,7 @@ import static christmas.view.output.constant.OutputMessageConstant.INSERT_ORDERS; import static christmas.view.output.constant.OutputMessageConstant.INSERT_RESERVATION_DAY; import static christmas.view.output.constant.OutputSymbolConstant.BENEFITS_DETAILS; +import static christmas.view.output.constant.OutputSymbolConstant.ESTIMATED_AMOUNT_WITH_DISCOUNT; import static christmas.view.output.constant.OutputSymbolConstant.GIFT_MENU; import static christmas.view.output.constant.OutputSymbolConstant.NEW_LINE; import static christmas.view.output.constant.OutputSymbolConstant.NO_BENEFITS; @@ -20,6 +22,7 @@ import static christmas.view.output.constant.OutputSymbolConstant.TOTAL_BENEFITED_AMOUNT; import christmas.dto.BenefitsDetailsDto; +import christmas.dto.EstimatedAmountWithDiscountDto; import christmas.dto.EventBenefitsPreviewDto; import christmas.dto.GiftDto; import christmas.dto.OrderedMenusDto; @@ -113,6 +116,16 @@ public void printTotalBenefitedAmount(TotalBenefitedAmountDto totalBenefitedAmou printLine(); printFormatted(TOTAL_BENEFITED_AMOUNT_PRINT_FORMAT.getFormat(), formatPrice(totalBenefitedAmountDto.getAmount())); + printLine(); + } + + public void printEstimatedAmountWithDiscount(EstimatedAmountWithDiscountDto estimatedAmountWithDiscountDto) { + printLine(); + print(ESTIMATED_AMOUNT_WITH_DISCOUNT.getSymbol()); + printLine(); + printFormatted(ESTIMATED_AMOUNT_WITH_DISCOUNT_PRINT_FORMAT.getFormat(), + formatPrice(estimatedAmountWithDiscountDto.getAmount())); + printLine(); } public void printLine() { diff --git a/src/main/java/christmas/view/output/constant/OutputFormatConstant.java b/src/main/java/christmas/view/output/constant/OutputFormatConstant.java index a5c82c6..aec9904 100644 --- a/src/main/java/christmas/view/output/constant/OutputFormatConstant.java +++ b/src/main/java/christmas/view/output/constant/OutputFormatConstant.java @@ -9,7 +9,8 @@ public enum OutputFormatConstant { PRICE_FORMAT_STYLE("###,###"), GIFT_PRINT_FORMAT("%s %d개"), BENEFITS_DETAILS_PRINT_FORMAT("%s: -%s원"), - TOTAL_BENEFITED_AMOUNT_PRINT_FORMAT("%s원"); + TOTAL_BENEFITED_AMOUNT_PRINT_FORMAT("%s원"), + ESTIMATED_AMOUNT_WITH_DISCOUNT_PRINT_FORMAT("%s원"); private final String format; diff --git a/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java b/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java index c990bc8..54f6797 100644 --- a/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java +++ b/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java @@ -7,6 +7,7 @@ public enum OutputSymbolConstant { GIFT_MENU("<증정 메뉴>"), BENEFITS_DETAILS("<ν˜œνƒ λ‚΄μ—­>"), TOTAL_BENEFITED_AMOUNT("<μ΄ν˜œνƒ κΈˆμ•‘>"), + ESTIMATED_AMOUNT_WITH_DISCOUNT("<할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘>"), NO_GIFT("μ—†μŒ"), NO_BENEFITS("μ—†μŒ"); private final String symbol; From 8608a6054c9ea459f9c30daba9402dfc1644a684 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 04:50:54 +0900 Subject: [PATCH 68/89] feat: add feature to issue event badge based on total benefited amount --- docs/README.md | 4 +- .../domain/constant/event/EventBadge.java | 48 +++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 src/main/java/christmas/domain/constant/event/EventBadge.java diff --git a/docs/README.md b/docs/README.md index a5f2a41..804a3fb 100644 --- a/docs/README.md +++ b/docs/README.md @@ -111,8 +111,8 @@ - [x] μ£Όλ¬Έ 내역에 λ‚ μ§œμ— λ”°λ₯Έ 할인 적용 μ—¬λΆ€λ₯Ό μ μš©ν•΄μ„œ, `할인 κΈˆμ•‘`을 κ³„μ‚°ν•œλ‹€. - [x] ν˜œνƒ λ‚΄μ—­μ˜ κΈˆμ•‘μ„ ν•©μ³μ„œ, `총 ν˜œνƒ κΈˆμ•‘`을 κ³„μ‚°ν•œλ‹€. - [x] μ£Όλ¬Έ 내역에 증정 μ΄λ²€νŠΈκ°€ ν¬ν•¨λ˜μ–΄ μžˆμ„ μ‹œ, μ¦μ •ν’ˆμ˜ κ°€κ²©κΉŒμ§€ `총 ν˜œνƒ κΈˆμ•‘`에 ν¬ν•¨μ‹œν‚¨λ‹€. - - [] 총 ν˜œνƒ κΈˆμ•‘μ„ 기반으둜 12μ›” 이벀트 λ°°μ§€λ₯Ό λ°œκΈ‰ν•œλ‹€. - - [] ν˜œνƒ κΈˆμ•‘μ΄ `5000원` 이상일 μ‹œ, `별` + - [x] 총 ν˜œνƒ κΈˆμ•‘μ„ 기반으둜 12μ›” 이벀트 λ°°μ§€λ₯Ό λ°œκΈ‰ν•œλ‹€. + - [x] ν˜œνƒ κΈˆμ•‘μ΄ `5000원` 이상일 μ‹œ, `별`
ν˜œνƒ κΈˆμ•‘μ΄ `1λ§Œμ›` 이상일 μ‹œ, `트리`
ν˜œνƒ κΈˆμ•‘μ΄ `2λ§Œμ›` 이상일 μ‹œ, `산타` - [x] `할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘` μ—μ„œ `할인 κΈˆμ•‘`을 λΉΌμ„œ `할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘`을 κ³„μ‚°ν•œλ‹€. diff --git a/src/main/java/christmas/domain/constant/event/EventBadge.java b/src/main/java/christmas/domain/constant/event/EventBadge.java new file mode 100644 index 0000000..bf479c9 --- /dev/null +++ b/src/main/java/christmas/domain/constant/event/EventBadge.java @@ -0,0 +1,48 @@ +package christmas.domain.constant.event; + +public enum EventBadge { + STAR("별", 5_000), + TREE("트리", 10_000), + SANTA("산타", 20_000), + NONE("μ—†μŒ", 0); + + private final String name; + private final int minimumTotalBenefitedPrice; + + EventBadge(final String name, final int minimumTotalBenefitedPrice) { + this.name = name; + this.minimumTotalBenefitedPrice = minimumTotalBenefitedPrice; + } + + public static EventBadge getBadgeByBenefitedPrice(final int totalBenefitedPrice) { + if (isNone(totalBenefitedPrice)) { + return NONE; + } + if (isStar(totalBenefitedPrice)) { + return STAR; + } + if (isTree(totalBenefitedPrice)) { + return TREE; + } + return SANTA; + } + + private static boolean isNone(final int totalBenefitedPrice) { + return totalBenefitedPrice >= NONE.minimumTotalBenefitedPrice + || totalBenefitedPrice < STAR.minimumTotalBenefitedPrice; + } + + private static boolean isStar(final int totalBenefitedPrice) { + return totalBenefitedPrice >= STAR.minimumTotalBenefitedPrice + || totalBenefitedPrice < TREE.minimumTotalBenefitedPrice; + } + + private static boolean isTree(final int totalBenefitedPrice) { + return totalBenefitedPrice >= TREE.minimumTotalBenefitedPrice + || totalBenefitedPrice < SANTA.minimumTotalBenefitedPrice; + } + + public String getName() { + return name; + } +} \ No newline at end of file From 81231c9d971ea6ad9f0eaa0b081d296ffcce3ad5 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 05:14:02 +0900 Subject: [PATCH 69/89] feat: add feature to print event badge using appropriate format --- docs/README.md | 10 +++++----- src/main/java/christmas/EventPlanner.java | 5 +++++ .../java/christmas/domain/EventManager.java | 5 +++++ .../domain/constant/event/EventBadge.java | 20 ++++++++----------- .../java/christmas/dto/EventBadgeDto.java | 17 ++++++++++++++++ .../service/EventManagerService.java | 5 +++++ .../christmas/view/output/OutputView.java | 9 +++++++++ .../output/constant/OutputSymbolConstant.java | 1 + 8 files changed, 55 insertions(+), 17 deletions(-) create mode 100644 src/main/java/christmas/dto/EventBadgeDto.java diff --git a/docs/README.md b/docs/README.md index 804a3fb..a65da36 100644 --- a/docs/README.md +++ b/docs/README.md @@ -168,8 +168,8 @@ > ### β­πŸŽ„πŸŽ… 12μ›” 이벀트 λ°°μ§€ 좜λ ₯ -- [] 12μ›” 이벀트 λ°°μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. -- [] `λ°°μ§€ 이름` 의 ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. - - [] `12μ›” 이벀트 λ°°μ§€`λŠ” `총 ν˜œνƒ κΈˆμ•‘`의 값에 따라 λ‹€λ₯΄κ²Œ 값을 λ‹€λ₯΄κ²Œ 좜λ ₯ν•œλ‹€. - - [] 5000원 이상은 `별`, 10000원 이상은 `트리`, 20000원 이상은 `산타`둜 좜λ ₯ν•œλ‹€. -- [] 이벀트 λ°°μ§€κ°€ λΆ€μ—¬λ˜μ§€ μ•ŠμœΌλ©΄ `μ—†μŒ`을 좜λ ₯ν•œλ‹€. \ No newline at end of file +- [x] 12μ›” 이벀트 λ°°μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. +- [x] `λ°°μ§€ 이름` 의 ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. + - [x] `12μ›” 이벀트 λ°°μ§€`λŠ” `총 ν˜œνƒ κΈˆμ•‘`의 값에 따라 λ‹€λ₯΄κ²Œ 값을 λ‹€λ₯΄κ²Œ 좜λ ₯ν•œλ‹€. + - [x] 5000원 이상은 `별`, 10000원 이상은 `트리`, 20000원 이상은 `산타`둜 좜λ ₯ν•œλ‹€. +- [x] 이벀트 λ°°μ§€κ°€ λΆ€μ—¬λ˜μ§€ μ•ŠμœΌλ©΄ `μ—†μŒ`을 좜λ ₯ν•œλ‹€. \ No newline at end of file diff --git a/src/main/java/christmas/EventPlanner.java b/src/main/java/christmas/EventPlanner.java index 81b666c..4341969 100644 --- a/src/main/java/christmas/EventPlanner.java +++ b/src/main/java/christmas/EventPlanner.java @@ -39,6 +39,7 @@ private void printResult(ReservationDay reservationDay, Orders orders, EventMana printBenefitsDetails(eventManager); printTotalBenefitedAmount(eventManager); printEstimatedAmountWithDiscount(eventManager); + printEventBadge(eventManager); } private void printIntroMessage(ReservationDay reservationDay) { @@ -69,4 +70,8 @@ private void printEstimatedAmountWithDiscount(EventManager eventManager) { outputView.printEstimatedAmountWithDiscount( eventManagerService.createEstimatedAmountWithDiscountDto(eventManager)); } + + private void printEventBadge(EventManager eventManager) { + outputView.printEventBadge(eventManagerService.createEventBadgeDto(eventManager)); + } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/EventManager.java b/src/main/java/christmas/domain/EventManager.java index ac7b62d..ca42ab6 100644 --- a/src/main/java/christmas/domain/EventManager.java +++ b/src/main/java/christmas/domain/EventManager.java @@ -7,6 +7,7 @@ import static christmas.domain.constant.event.Promotion.WEEKDAY_PROMOTION; import static christmas.domain.constant.event.Promotion.WEEKEND_PROMOTION; +import christmas.domain.constant.event.EventBadge; import java.util.LinkedHashMap; import java.util.Map; @@ -129,4 +130,8 @@ private int calculateTotalDiscountedAmount() { } return calculateTotalBenefitedAmount(); } + + public String issueEventBadge() { + return EventBadge.getBadgeNameByBenefitedPrice(calculateTotalBenefitedAmount()); + } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/constant/event/EventBadge.java b/src/main/java/christmas/domain/constant/event/EventBadge.java index bf479c9..f7f610c 100644 --- a/src/main/java/christmas/domain/constant/event/EventBadge.java +++ b/src/main/java/christmas/domain/constant/event/EventBadge.java @@ -14,35 +14,31 @@ public enum EventBadge { this.minimumTotalBenefitedPrice = minimumTotalBenefitedPrice; } - public static EventBadge getBadgeByBenefitedPrice(final int totalBenefitedPrice) { + public static String getBadgeNameByBenefitedPrice(final int totalBenefitedPrice) { if (isNone(totalBenefitedPrice)) { - return NONE; + return NONE.name; } if (isStar(totalBenefitedPrice)) { - return STAR; + return STAR.name; } if (isTree(totalBenefitedPrice)) { - return TREE; + return TREE.name; } - return SANTA; + return SANTA.name; } private static boolean isNone(final int totalBenefitedPrice) { return totalBenefitedPrice >= NONE.minimumTotalBenefitedPrice - || totalBenefitedPrice < STAR.minimumTotalBenefitedPrice; + && totalBenefitedPrice < STAR.minimumTotalBenefitedPrice; } private static boolean isStar(final int totalBenefitedPrice) { return totalBenefitedPrice >= STAR.minimumTotalBenefitedPrice - || totalBenefitedPrice < TREE.minimumTotalBenefitedPrice; + && totalBenefitedPrice < TREE.minimumTotalBenefitedPrice; } private static boolean isTree(final int totalBenefitedPrice) { return totalBenefitedPrice >= TREE.minimumTotalBenefitedPrice - || totalBenefitedPrice < SANTA.minimumTotalBenefitedPrice; - } - - public String getName() { - return name; + && totalBenefitedPrice < SANTA.minimumTotalBenefitedPrice; } } \ No newline at end of file diff --git a/src/main/java/christmas/dto/EventBadgeDto.java b/src/main/java/christmas/dto/EventBadgeDto.java new file mode 100644 index 0000000..763a7ac --- /dev/null +++ b/src/main/java/christmas/dto/EventBadgeDto.java @@ -0,0 +1,17 @@ +package christmas.dto; + +public class EventBadgeDto { + private final String badgeName; + + public EventBadgeDto(final String badgeName) { + this.badgeName = badgeName; + } + + public static EventBadgeDto from(final String badgeName) { + return new EventBadgeDto(badgeName); + } + + public String getBadgeName() { + return badgeName; + } +} \ No newline at end of file diff --git a/src/main/java/christmas/service/EventManagerService.java b/src/main/java/christmas/service/EventManagerService.java index ed64f0e..4004352 100644 --- a/src/main/java/christmas/service/EventManagerService.java +++ b/src/main/java/christmas/service/EventManagerService.java @@ -8,6 +8,7 @@ import christmas.domain.constant.orders.Menu; import christmas.dto.BenefitsDetailsDto; import christmas.dto.EstimatedAmountWithDiscountDto; +import christmas.dto.EventBadgeDto; import christmas.dto.GiftDto; import christmas.dto.TotalBenefitedAmountDto; import java.util.LinkedHashMap; @@ -37,4 +38,8 @@ public TotalBenefitedAmountDto createTotalBenefitedAmountDto(EventManager eventM public EstimatedAmountWithDiscountDto createEstimatedAmountWithDiscountDto(EventManager eventManager) { return EstimatedAmountWithDiscountDto.from(eventManager.calculateEstimatedOrdersAmountWithDiscount()); } + + public EventBadgeDto createEventBadgeDto(EventManager eventManager) { + return EventBadgeDto.from(eventManager.issueEventBadge()); + } } \ No newline at end of file diff --git a/src/main/java/christmas/view/output/OutputView.java b/src/main/java/christmas/view/output/OutputView.java index 3f5a4bf..03d4085 100644 --- a/src/main/java/christmas/view/output/OutputView.java +++ b/src/main/java/christmas/view/output/OutputView.java @@ -13,6 +13,7 @@ import static christmas.view.output.constant.OutputMessageConstant.INSERT_RESERVATION_DAY; import static christmas.view.output.constant.OutputSymbolConstant.BENEFITS_DETAILS; import static christmas.view.output.constant.OutputSymbolConstant.ESTIMATED_AMOUNT_WITH_DISCOUNT; +import static christmas.view.output.constant.OutputSymbolConstant.EVENT_BADGE; import static christmas.view.output.constant.OutputSymbolConstant.GIFT_MENU; import static christmas.view.output.constant.OutputSymbolConstant.NEW_LINE; import static christmas.view.output.constant.OutputSymbolConstant.NO_BENEFITS; @@ -23,6 +24,7 @@ import christmas.dto.BenefitsDetailsDto; import christmas.dto.EstimatedAmountWithDiscountDto; +import christmas.dto.EventBadgeDto; import christmas.dto.EventBenefitsPreviewDto; import christmas.dto.GiftDto; import christmas.dto.OrderedMenusDto; @@ -128,6 +130,13 @@ public void printEstimatedAmountWithDiscount(EstimatedAmountWithDiscountDto esti printLine(); } + public void printEventBadge(EventBadgeDto eventBadgeDto) { + printLine(); + print(EVENT_BADGE.getSymbol()); + printLine(); + print(eventBadgeDto.getBadgeName()); + } + public void printLine() { System.out.print(NEW_LINE.getSymbol()); } diff --git a/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java b/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java index 54f6797..572a898 100644 --- a/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java +++ b/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java @@ -8,6 +8,7 @@ public enum OutputSymbolConstant { BENEFITS_DETAILS("<ν˜œνƒ λ‚΄μ—­>"), TOTAL_BENEFITED_AMOUNT("<μ΄ν˜œνƒ κΈˆμ•‘>"), ESTIMATED_AMOUNT_WITH_DISCOUNT("<할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘>"), + EVENT_BADGE("<12μ›” 이벀트 λ°°μ§€>"), NO_GIFT("μ—†μŒ"), NO_BENEFITS("μ—†μŒ"); private final String symbol; From c01933dcabad1519a2c5dd48f2d453d543cc4a62 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 11:30:09 +0900 Subject: [PATCH 70/89] refactor: make console to be closed when event planner is terminated. --- src/main/java/christmas/EventPlanner.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/christmas/EventPlanner.java b/src/main/java/christmas/EventPlanner.java index 4341969..d5b1d48 100644 --- a/src/main/java/christmas/EventPlanner.java +++ b/src/main/java/christmas/EventPlanner.java @@ -1,5 +1,6 @@ package christmas; +import camp.nextstep.edu.missionutils.Console; import christmas.controller.OrdersController; import christmas.controller.ReservationDayController; import christmas.domain.EventManager; @@ -27,8 +28,8 @@ public void execute() { ReservationDay reservationDay = reservationDayController.insertReservationDay(); Orders orders = ordersController.insertOrders(); EventManager eventManager = EventManager.of(reservationDay, orders); - printResult(reservationDay, orders, eventManager); + terminatePlanner(); } private void printResult(ReservationDay reservationDay, Orders orders, EventManager eventManager) { @@ -74,4 +75,8 @@ private void printEstimatedAmountWithDiscount(EventManager eventManager) { private void printEventBadge(EventManager eventManager) { outputView.printEventBadge(eventManagerService.createEventBadgeDto(eventManager)); } + + private void terminatePlanner() { + Console.close(); + } } \ No newline at end of file From 44b0835c8c42d57bfa1596f14d8ec0f17531edf3 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 12:48:35 +0900 Subject: [PATCH 71/89] refactor: make Collections unmodifiable to prevent from unexpected changes in data --- src/main/java/christmas/domain/EventManager.java | 5 +++-- src/main/java/christmas/domain/Orders.java | 3 ++- .../java/christmas/dto/BenefitsDetailsDto.java | 3 ++- src/main/java/christmas/dto/GiftDto.java | 3 ++- src/main/java/christmas/dto/OrderedMenusDto.java | 3 ++- src/main/java/christmas/service/OrdersService.java | 4 ++-- src/main/java/christmas/view/input/InputView.java | 2 +- ....java => BasicInputExceptionMessageFormat.java} | 14 +++++++------- .../christmas/view/input/parser/InputParser.java | 10 ++++++---- .../view/input/validator/BasicValidator.java | 6 +++--- .../input/validator/MenuCountInputValidator.java | 1 + .../view/input/validator/OrderInputValidator.java | 3 +-- .../view/input/validator/OrdersInputValidator.java | 6 +++--- .../view/output/constant/OutputFormatConstant.java | 2 +- 14 files changed, 36 insertions(+), 29 deletions(-) rename src/main/java/christmas/view/input/exception/message/{BasicInputExceptionMessage.java => BasicInputExceptionMessageFormat.java} (61%) diff --git a/src/main/java/christmas/domain/EventManager.java b/src/main/java/christmas/domain/EventManager.java index ca42ab6..3127f6f 100644 --- a/src/main/java/christmas/domain/EventManager.java +++ b/src/main/java/christmas/domain/EventManager.java @@ -8,6 +8,7 @@ import static christmas.domain.constant.event.Promotion.WEEKEND_PROMOTION; import christmas.domain.constant.event.EventBadge; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; @@ -29,7 +30,7 @@ public Map createBenefitsDetails() { if (orders.isEventApplicable()) { return makeBenefitsDetails(benefitsDetails); } - return benefitsDetails; + return Collections.unmodifiableMap(benefitsDetails); } private Map makeBenefitsDetails(Map benefitsDetails) { @@ -38,7 +39,7 @@ private Map makeBenefitsDetails(Map benefitsDe addWeekendPromotionDetails(benefitsDetails); addSpecialPromotionDetails(benefitsDetails); addGiftPromotionDetails(benefitsDetails); - return benefitsDetails; + return Collections.unmodifiableMap(benefitsDetails); } private void addChristmasPromotionDetails(Map benefitsDetails) { diff --git a/src/main/java/christmas/domain/Orders.java b/src/main/java/christmas/domain/Orders.java index cf42cc1..39c49b2 100644 --- a/src/main/java/christmas/domain/Orders.java +++ b/src/main/java/christmas/domain/Orders.java @@ -8,6 +8,7 @@ import christmas.domain.constant.orders.FoodType; import christmas.domain.exception.InvalidOrdersException; +import java.util.Collections; import java.util.List; public class Orders { @@ -65,6 +66,6 @@ public boolean isGiftEventApplicable() { } public List getOrders() { - return orders; + return Collections.unmodifiableList(orders); } } \ No newline at end of file diff --git a/src/main/java/christmas/dto/BenefitsDetailsDto.java b/src/main/java/christmas/dto/BenefitsDetailsDto.java index 2b8c5e7..44d606f 100644 --- a/src/main/java/christmas/dto/BenefitsDetailsDto.java +++ b/src/main/java/christmas/dto/BenefitsDetailsDto.java @@ -1,5 +1,6 @@ package christmas.dto; +import java.util.Collections; import java.util.Map; public class BenefitsDetailsDto { @@ -14,7 +15,7 @@ public static BenefitsDetailsDto from(Map benefitsDetails) { } public Map getBenefitsDetails() { - return benefitsDetails; + return Collections.unmodifiableMap(benefitsDetails); } public boolean isEmpty() { diff --git a/src/main/java/christmas/dto/GiftDto.java b/src/main/java/christmas/dto/GiftDto.java index 6629e4c..6ffd78a 100644 --- a/src/main/java/christmas/dto/GiftDto.java +++ b/src/main/java/christmas/dto/GiftDto.java @@ -1,5 +1,6 @@ package christmas.dto; +import java.util.Collections; import java.util.Map; public class GiftDto { @@ -14,7 +15,7 @@ public static GiftDto from(Map gift) { } public Map getGift() { - return gift; + return Collections.unmodifiableMap(gift); } public boolean isEmpty() { diff --git a/src/main/java/christmas/dto/OrderedMenusDto.java b/src/main/java/christmas/dto/OrderedMenusDto.java index a7193ed..4b79253 100644 --- a/src/main/java/christmas/dto/OrderedMenusDto.java +++ b/src/main/java/christmas/dto/OrderedMenusDto.java @@ -1,5 +1,6 @@ package christmas.dto; +import java.util.Collections; import java.util.Map; public class OrderedMenusDto { @@ -14,6 +15,6 @@ public static OrderedMenusDto from(Map orders) { } public Map getOrders() { - return orders; + return Collections.unmodifiableMap(orders); } } \ No newline at end of file diff --git a/src/main/java/christmas/service/OrdersService.java b/src/main/java/christmas/service/OrdersService.java index 40925f3..373e759 100644 --- a/src/main/java/christmas/service/OrdersService.java +++ b/src/main/java/christmas/service/OrdersService.java @@ -16,7 +16,7 @@ public Orders createOrders(Map orders) { private List makeOrders(Map orders) { return orders.entrySet().stream() .map(order -> createOrder(order.getKey(), order.getValue())) - .collect(Collectors.toList()); + .toList(); } private Order createOrder(final String menuName, final int menuCount) { @@ -29,7 +29,7 @@ public OrderedMenusDto createOrdersHistoryDto(Orders orders) { private Map makeOrdersHistory(Orders orders) { return orders.getOrders().stream() - .collect(Collectors.toMap( + .collect(Collectors.toUnmodifiableMap( Order::getMenuName, Order::getMenuCount )); diff --git a/src/main/java/christmas/view/input/InputView.java b/src/main/java/christmas/view/input/InputView.java index 133df31..db1d5c6 100644 --- a/src/main/java/christmas/view/input/InputView.java +++ b/src/main/java/christmas/view/input/InputView.java @@ -24,4 +24,4 @@ public Map getOrders() { private String readLine() { return Console.readLine(); } -} +} \ No newline at end of file diff --git a/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java b/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessageFormat.java similarity index 61% rename from src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java rename to src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessageFormat.java index 9cb470a..e7d329f 100644 --- a/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessage.java +++ b/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessageFormat.java @@ -2,19 +2,19 @@ import static christmas.global.ApplicationConstant.ERROR_PREFIX; -public enum BasicInputExceptionMessage { - TOO_LONG_WITH_BLANKS( +public enum BasicInputExceptionMessageFormat { + TOO_LONG_WITH_BLANKS_FORMAT( ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ %sμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), EMPTY_FORMAT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ %sμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), TOO_LONG_FORMAT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ %sμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); - private final String message; + private final String format; - BasicInputExceptionMessage(final String message) { - this.message = message; + BasicInputExceptionMessageFormat(final String format) { + this.format = format; } - public String getMessage() { - return message; + public String getFormat() { + return format; } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/parser/InputParser.java b/src/main/java/christmas/view/input/parser/InputParser.java index bc43662..24694f8 100644 --- a/src/main/java/christmas/view/input/parser/InputParser.java +++ b/src/main/java/christmas/view/input/parser/InputParser.java @@ -9,7 +9,7 @@ import static christmas.view.input.constant.InputSymbolConstant.ORDER_DELIMITER; import static christmas.view.input.constant.InputSymbolConstant.ORDER_SYMBOL; import static christmas.view.input.constant.InputSymbolConstant.VOID; -import static christmas.view.input.exception.message.BasicInputExceptionMessage.TOO_LONG_WITH_BLANKS; +import static christmas.view.input.exception.message.BasicInputExceptionMessageFormat.TOO_LONG_WITH_BLANKS_FORMAT; import christmas.view.input.exception.BasicInputException; import christmas.view.input.exception.DayInputException; @@ -49,13 +49,15 @@ public Map parseOrders(String userInput) { private void checkDayLengthIsUnderUpperLimit(final String userInput) { if (userInput.length() > APPLICATION_MAX_INPUT_LENGTH.getValue()) { - throw BasicInputException.of(String.format(TOO_LONG_WITH_BLANKS.getMessage(), DAY_SYMBOL.getSymbol())); + throw BasicInputException.of( + String.format(TOO_LONG_WITH_BLANKS_FORMAT.getFormat(), DAY_SYMBOL.getSymbol())); } } private void checkOrdersLengthIsUnderUpperLimit(final String userInput) { if (userInput.length() > APPLICATION_MAX_INPUT_LENGTH.getValue()) { - throw BasicInputException.of(String.format(TOO_LONG_WITH_BLANKS.getMessage(), ORDER_SYMBOL.getSymbol())); + throw BasicInputException.of( + String.format(TOO_LONG_WITH_BLANKS_FORMAT.getFormat(), ORDER_SYMBOL.getSymbol())); } } @@ -78,7 +80,7 @@ private void validateEachOrder(final String userInput) { private Map parseToOrderMap(final String userInput) { return Arrays.stream(userInput.split(ORDERS_DELIMITER.getSymbol())) .map(orders -> orders.split(ORDER_DELIMITER.getSymbol())) - .collect(Collectors.toMap( + .collect(Collectors.toUnmodifiableMap( order -> order[MENU_NAME_INDEX.getValue()], order -> parseToInt(order[MENU_COUNT_INDEX.getValue()]) )); diff --git a/src/main/java/christmas/view/input/validator/BasicValidator.java b/src/main/java/christmas/view/input/validator/BasicValidator.java index fef9a8a..e81c062 100644 --- a/src/main/java/christmas/view/input/validator/BasicValidator.java +++ b/src/main/java/christmas/view/input/validator/BasicValidator.java @@ -1,7 +1,7 @@ package christmas.view.input.validator; import christmas.view.input.exception.BasicInputException; -import christmas.view.input.exception.message.BasicInputExceptionMessage; +import christmas.view.input.exception.message.BasicInputExceptionMessageFormat; public abstract class BasicValidator { @@ -13,14 +13,14 @@ protected void validate(final String userInput, final String inputType, final in protected void validateNotEmpty(final String userInput, final String inputType) { if (userInput.isEmpty()) { throw BasicInputException.of( - String.format(BasicInputExceptionMessage.EMPTY_FORMAT.getMessage(), inputType)); + String.format(BasicInputExceptionMessageFormat.EMPTY_FORMAT.getFormat(), inputType)); } } protected void validateLengthUnderMaxLength(final String userInput, final String inputType, final int maxLength) { if (userInput.length() > maxLength) { throw BasicInputException.of( - String.format(BasicInputExceptionMessage.TOO_LONG_FORMAT.getMessage(), inputType)); + String.format(BasicInputExceptionMessageFormat.TOO_LONG_FORMAT.getFormat(), inputType)); } } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java b/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java index f499332..c5fc084 100644 --- a/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java +++ b/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java @@ -12,6 +12,7 @@ public class MenuCountInputValidator extends BasicValidator implements PositiveI public void validate(final String menuCountInput) { super.validate(menuCountInput, ORDER_SYMBOL.getSymbol(), MENU_COUNT_MAX_INPUT_LENGTH.getValue()); validateNumeric(menuCountInput); + validatePositive(menuCountInput); } @Override diff --git a/src/main/java/christmas/view/input/validator/OrderInputValidator.java b/src/main/java/christmas/view/input/validator/OrderInputValidator.java index 096ffdb..7778bef 100644 --- a/src/main/java/christmas/view/input/validator/OrderInputValidator.java +++ b/src/main/java/christmas/view/input/validator/OrderInputValidator.java @@ -11,7 +11,6 @@ import christmas.view.input.exception.OrdersInputException; import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; public class OrderInputValidator extends BasicValidator { private final MenuNameInputValidator menuNameInputValidator; @@ -51,7 +50,7 @@ private boolean endsWithDelimiter(final String orderInput) { private List splitToMenuInput(final String orderInput) { return Arrays.stream(orderInput.split(ORDER_DELIMITER.getSymbol())) - .collect(Collectors.toList()); + .toList(); } private void validateMenu(List menuInput) { diff --git a/src/main/java/christmas/view/input/validator/OrdersInputValidator.java b/src/main/java/christmas/view/input/validator/OrdersInputValidator.java index 7923fc0..7082ec0 100644 --- a/src/main/java/christmas/view/input/validator/OrdersInputValidator.java +++ b/src/main/java/christmas/view/input/validator/OrdersInputValidator.java @@ -5,10 +5,10 @@ import static christmas.view.input.constant.InputSymbolConstant.ORDERS_DELIMITER; import static christmas.view.input.constant.InputSymbolConstant.ORDER_DELIMITER; import static christmas.view.input.constant.InputSymbolConstant.ORDER_SYMBOL; +import static christmas.view.input.exception.message.OrdersInputExceptionMessage.DUPLICATED_MENUS; import christmas.view.input.exception.BasicInputException; import christmas.view.input.exception.OrdersInputException; -import christmas.view.input.exception.message.OrdersInputExceptionMessage; import java.util.Arrays; import java.util.Set; import java.util.stream.Collectors; @@ -25,14 +25,14 @@ public void postValidate(final String ordersInput) { private void validateNotExistDuplicatedMenus(final String ordersInput) { Set uniqueMenuNames = makeUniqueMenuNames(ordersInput); if (haveDuplicatedMenus(ordersInput, uniqueMenuNames)) { - throw OrdersInputException.of(OrdersInputExceptionMessage.DUPLICATED_MENUS.getMessage()); + throw OrdersInputException.of(DUPLICATED_MENUS.getMessage()); } } private Set makeUniqueMenuNames(final String ordersInput) { return Arrays.stream(ordersInput.split(ORDERS_DELIMITER.getSymbol())) .map(order -> order.split(ORDER_DELIMITER.getSymbol())[MENU_NAME_INDEX.getValue()]) - .collect(Collectors.toSet()); + .collect(Collectors.toUnmodifiableSet()); } private boolean haveDuplicatedMenus(final String ordersInput, Set uniqueMenuNames) { diff --git a/src/main/java/christmas/view/output/constant/OutputFormatConstant.java b/src/main/java/christmas/view/output/constant/OutputFormatConstant.java index aec9904..47d4b07 100644 --- a/src/main/java/christmas/view/output/constant/OutputFormatConstant.java +++ b/src/main/java/christmas/view/output/constant/OutputFormatConstant.java @@ -21,4 +21,4 @@ public enum OutputFormatConstant { public String getFormat() { return format; } -} +} \ No newline at end of file From 336dd7590472ecc3996c0ff123eded4a5835dd78 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 13:10:26 +0900 Subject: [PATCH 72/89] refactor: remove NONE EventBadge and make NO_BADGE_SYMBOL to shift responsibility of output from domain to view --- .../java/christmas/domain/EventManager.java | 2 +- src/main/java/christmas/domain/Orders.java | 4 ++-- .../constant/event/ChristmasPromotion.java | 2 +- .../domain/constant/event/EventBadge.java | 22 +++++++++---------- ...Constant.java => EventNumberConstant.java} | 4 ++-- .../constant/event/EventSymbolConstant.java | 14 ++++++++++++ .../java/christmas/dto/EventBadgeDto.java | 4 ++++ .../service/EventManagerService.java | 2 +- .../christmas/view/output/OutputView.java | 12 +++++++++- .../output/constant/OutputSymbolConstant.java | 3 ++- 10 files changed, 49 insertions(+), 20 deletions(-) rename src/main/java/christmas/domain/constant/event/{EventConstant.java => EventNumberConstant.java} (82%) create mode 100644 src/main/java/christmas/domain/constant/event/EventSymbolConstant.java diff --git a/src/main/java/christmas/domain/EventManager.java b/src/main/java/christmas/domain/EventManager.java index 3127f6f..faccf98 100644 --- a/src/main/java/christmas/domain/EventManager.java +++ b/src/main/java/christmas/domain/EventManager.java @@ -1,7 +1,7 @@ package christmas.domain; import static christmas.domain.constant.event.ChristmasPromotion.CHRISTMAS_D_DAY_PROMOTION; -import static christmas.domain.constant.event.EventConstant.NONE_PROMOTION_APPLIED_AMOUNT; +import static christmas.domain.constant.event.EventNumberConstant.NONE_PROMOTION_APPLIED_AMOUNT; import static christmas.domain.constant.event.Promotion.GIFT_PROMOTION; import static christmas.domain.constant.event.Promotion.SPECIAL_PROMOTION; import static christmas.domain.constant.event.Promotion.WEEKDAY_PROMOTION; diff --git a/src/main/java/christmas/domain/Orders.java b/src/main/java/christmas/domain/Orders.java index 39c49b2..5aa333e 100644 --- a/src/main/java/christmas/domain/Orders.java +++ b/src/main/java/christmas/domain/Orders.java @@ -1,7 +1,7 @@ package christmas.domain; -import static christmas.domain.constant.event.EventConstant.EVENT_APPLICABLE_AMOUNT; -import static christmas.domain.constant.event.EventConstant.GIFT_EVENT_APPLICABLE_AMOUNT; +import static christmas.domain.constant.event.EventNumberConstant.EVENT_APPLICABLE_AMOUNT; +import static christmas.domain.constant.event.EventNumberConstant.GIFT_EVENT_APPLICABLE_AMOUNT; import static christmas.domain.constant.orders.OrdersConstant.MAX_MENU_COUNTS; import static christmas.domain.exception.message.InvalidOrdersExceptionMessage.EXCEED_MENU_COUNTS_UPPER_LIMIT; import static christmas.domain.exception.message.InvalidOrdersExceptionMessage.MENUS_ONLY_CONTAIN_BEVERAGE; diff --git a/src/main/java/christmas/domain/constant/event/ChristmasPromotion.java b/src/main/java/christmas/domain/constant/event/ChristmasPromotion.java index 2c08319..3e50d44 100644 --- a/src/main/java/christmas/domain/constant/event/ChristmasPromotion.java +++ b/src/main/java/christmas/domain/constant/event/ChristmasPromotion.java @@ -1,6 +1,6 @@ package christmas.domain.constant.event; -import static christmas.domain.constant.event.EventConstant.CHRISTMAS_PROMOTION_INCREASING_AMOUNT; +import static christmas.domain.constant.event.EventNumberConstant.CHRISTMAS_PROMOTION_INCREASING_AMOUNT; public enum ChristmasPromotion { CHRISTMAS_D_DAY_PROMOTION("크리슀마슀 디데이 할인", 900); diff --git a/src/main/java/christmas/domain/constant/event/EventBadge.java b/src/main/java/christmas/domain/constant/event/EventBadge.java index f7f610c..bac6c4c 100644 --- a/src/main/java/christmas/domain/constant/event/EventBadge.java +++ b/src/main/java/christmas/domain/constant/event/EventBadge.java @@ -1,10 +1,11 @@ package christmas.domain.constant.event; +import static christmas.domain.constant.event.EventSymbolConstant.NO_BADGE_SYMBOL; + public enum EventBadge { STAR("별", 5_000), TREE("트리", 10_000), - SANTA("산타", 20_000), - NONE("μ—†μŒ", 0); + SANTA("산타", 20_000); private final String name; private final int minimumTotalBenefitedPrice; @@ -15,21 +16,16 @@ public enum EventBadge { } public static String getBadgeNameByBenefitedPrice(final int totalBenefitedPrice) { - if (isNone(totalBenefitedPrice)) { - return NONE.name; - } if (isStar(totalBenefitedPrice)) { return STAR.name; } if (isTree(totalBenefitedPrice)) { return TREE.name; } - return SANTA.name; - } - - private static boolean isNone(final int totalBenefitedPrice) { - return totalBenefitedPrice >= NONE.minimumTotalBenefitedPrice - && totalBenefitedPrice < STAR.minimumTotalBenefitedPrice; + if (isSanta(totalBenefitedPrice)) { + return SANTA.name; + } + return NO_BADGE_SYMBOL.getSymbol(); } private static boolean isStar(final int totalBenefitedPrice) { @@ -41,4 +37,8 @@ private static boolean isTree(final int totalBenefitedPrice) { return totalBenefitedPrice >= TREE.minimumTotalBenefitedPrice && totalBenefitedPrice < SANTA.minimumTotalBenefitedPrice; } + + private static boolean isSanta(final int totalBenefitedPrice) { + return totalBenefitedPrice >= SANTA.minimumTotalBenefitedPrice; + } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/constant/event/EventConstant.java b/src/main/java/christmas/domain/constant/event/EventNumberConstant.java similarity index 82% rename from src/main/java/christmas/domain/constant/event/EventConstant.java rename to src/main/java/christmas/domain/constant/event/EventNumberConstant.java index a008ccf..12cecd3 100644 --- a/src/main/java/christmas/domain/constant/event/EventConstant.java +++ b/src/main/java/christmas/domain/constant/event/EventNumberConstant.java @@ -1,6 +1,6 @@ package christmas.domain.constant.event; -public enum EventConstant { +public enum EventNumberConstant { EVENT_APPLICABLE_AMOUNT(10_000), GIFT_EVENT_APPLICABLE_AMOUNT(120_000), GIFT_CHAMPAGNE_COUNT(1), @@ -9,7 +9,7 @@ public enum EventConstant { private final int value; - EventConstant(final int value) { + EventNumberConstant(final int value) { this.value = value; } diff --git a/src/main/java/christmas/domain/constant/event/EventSymbolConstant.java b/src/main/java/christmas/domain/constant/event/EventSymbolConstant.java new file mode 100644 index 0000000..e7fc013 --- /dev/null +++ b/src/main/java/christmas/domain/constant/event/EventSymbolConstant.java @@ -0,0 +1,14 @@ +package christmas.domain.constant.event; + +public enum EventSymbolConstant { + NO_BADGE_SYMBOL(""); + private final String symbol; + + EventSymbolConstant(final String symbol) { + this.symbol = symbol; + } + + public String getSymbol() { + return symbol; + } +} \ No newline at end of file diff --git a/src/main/java/christmas/dto/EventBadgeDto.java b/src/main/java/christmas/dto/EventBadgeDto.java index 763a7ac..038140b 100644 --- a/src/main/java/christmas/dto/EventBadgeDto.java +++ b/src/main/java/christmas/dto/EventBadgeDto.java @@ -14,4 +14,8 @@ public static EventBadgeDto from(final String badgeName) { public String getBadgeName() { return badgeName; } + + public boolean isEmpty() { + return badgeName.isEmpty(); + } } \ No newline at end of file diff --git a/src/main/java/christmas/service/EventManagerService.java b/src/main/java/christmas/service/EventManagerService.java index 4004352..b3e3808 100644 --- a/src/main/java/christmas/service/EventManagerService.java +++ b/src/main/java/christmas/service/EventManagerService.java @@ -1,7 +1,7 @@ package christmas.service; -import static christmas.domain.constant.event.EventConstant.GIFT_CHAMPAGNE_COUNT; +import static christmas.domain.constant.event.EventNumberConstant.GIFT_CHAMPAGNE_COUNT; import christmas.domain.EventManager; import christmas.domain.Orders; diff --git a/src/main/java/christmas/view/output/OutputView.java b/src/main/java/christmas/view/output/OutputView.java index 03d4085..0bed4a9 100644 --- a/src/main/java/christmas/view/output/OutputView.java +++ b/src/main/java/christmas/view/output/OutputView.java @@ -17,6 +17,7 @@ import static christmas.view.output.constant.OutputSymbolConstant.GIFT_MENU; import static christmas.view.output.constant.OutputSymbolConstant.NEW_LINE; import static christmas.view.output.constant.OutputSymbolConstant.NO_BENEFITS; +import static christmas.view.output.constant.OutputSymbolConstant.NO_EVENT_BADGE; import static christmas.view.output.constant.OutputSymbolConstant.NO_GIFT; import static christmas.view.output.constant.OutputSymbolConstant.ORDERED_MENUS; import static christmas.view.output.constant.OutputSymbolConstant.TOTAL_AMOUNT_WITH_NO_DISCOUNT; @@ -134,7 +135,16 @@ public void printEventBadge(EventBadgeDto eventBadgeDto) { printLine(); print(EVENT_BADGE.getSymbol()); printLine(); - print(eventBadgeDto.getBadgeName()); + printEventBadgeName(eventBadgeDto); + } + + private void printEventBadgeName(EventBadgeDto eventBadgeDto) { + if (eventBadgeDto.isEmpty()) { + print(NO_EVENT_BADGE.getSymbol()); + } + if (!eventBadgeDto.isEmpty()) { + print(eventBadgeDto.getBadgeName()); + } } public void printLine() { diff --git a/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java b/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java index 572a898..5849c15 100644 --- a/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java +++ b/src/main/java/christmas/view/output/constant/OutputSymbolConstant.java @@ -10,7 +10,8 @@ public enum OutputSymbolConstant { ESTIMATED_AMOUNT_WITH_DISCOUNT("<할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘>"), EVENT_BADGE("<12μ›” 이벀트 λ°°μ§€>"), NO_GIFT("μ—†μŒ"), - NO_BENEFITS("μ—†μŒ"); + NO_BENEFITS("μ—†μŒ"), + NO_EVENT_BADGE("μ—†μŒ"); private final String symbol; OutputSymbolConstant(final String symbol) { From a257e23b3cb4a93fe4768b90fdaa5692aeba3706 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 13:37:42 +0900 Subject: [PATCH 73/89] refactor: indicate explicitly that what kind of exception can method throw for code readability --- src/main/java/christmas/controller/OrdersController.java | 2 +- src/main/java/christmas/domain/ReservationDay.java | 2 +- src/main/java/christmas/service/OrdersService.java | 7 ++++--- src/main/java/christmas/view/input/InputView.java | 3 ++- src/main/java/christmas/view/input/parser/InputParser.java | 5 +++-- .../christmas/view/input/validator/BasicValidator.java | 3 ++- .../view/input/validator/MenuCountInputValidator.java | 2 +- .../view/input/validator/MenuNameInputValidator.java | 4 +++- .../view/input/validator/OrderInputValidator.java | 5 +++-- .../view/input/validator/OrdersInputValidator.java | 2 +- 10 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/main/java/christmas/controller/OrdersController.java b/src/main/java/christmas/controller/OrdersController.java index dbb6e9f..fa8a313 100644 --- a/src/main/java/christmas/controller/OrdersController.java +++ b/src/main/java/christmas/controller/OrdersController.java @@ -32,7 +32,7 @@ public Orders insertOrders() { } } - private Map askToInsertOrders() { + private Map askToInsertOrders() throws BasicInputException, OrdersInputException { outputView.askToInsertOrders(); return inputView.getOrders(); } diff --git a/src/main/java/christmas/domain/ReservationDay.java b/src/main/java/christmas/domain/ReservationDay.java index 4224c96..1888dc0 100644 --- a/src/main/java/christmas/domain/ReservationDay.java +++ b/src/main/java/christmas/domain/ReservationDay.java @@ -13,7 +13,7 @@ public class ReservationDay extends DayPerMonth { private final int day; - private ReservationDay(final int day) { + private ReservationDay(final int day) throws InvalidReservationDayException { validate(day); this.day = day; } diff --git a/src/main/java/christmas/service/OrdersService.java b/src/main/java/christmas/service/OrdersService.java index 373e759..447ce0f 100644 --- a/src/main/java/christmas/service/OrdersService.java +++ b/src/main/java/christmas/service/OrdersService.java @@ -2,6 +2,7 @@ import christmas.domain.Order; import christmas.domain.Orders; +import christmas.domain.exception.InvalidOrdersException; import christmas.dto.OrderedMenusDto; import christmas.dto.TotalAmountWithNoDiscountDto; import java.util.List; @@ -9,17 +10,17 @@ import java.util.stream.Collectors; public class OrdersService { - public Orders createOrders(Map orders) { + public Orders createOrders(Map orders) throws InvalidOrdersException { return Orders.from(makeOrders(orders)); } - private List makeOrders(Map orders) { + private List makeOrders(Map orders) throws InvalidOrdersException { return orders.entrySet().stream() .map(order -> createOrder(order.getKey(), order.getValue())) .toList(); } - private Order createOrder(final String menuName, final int menuCount) { + private Order createOrder(final String menuName, final int menuCount) throws InvalidOrdersException { return Order.of(menuName, menuCount); } diff --git a/src/main/java/christmas/view/input/InputView.java b/src/main/java/christmas/view/input/InputView.java index db1d5c6..9901e42 100644 --- a/src/main/java/christmas/view/input/InputView.java +++ b/src/main/java/christmas/view/input/InputView.java @@ -3,6 +3,7 @@ import camp.nextstep.edu.missionutils.Console; import christmas.view.input.exception.BasicInputException; import christmas.view.input.exception.DayInputException; +import christmas.view.input.exception.OrdersInputException; import christmas.view.input.parser.InputParser; import java.util.Map; @@ -17,7 +18,7 @@ public int getReservationDay() throws BasicInputException, DayInputException { return inputParser.parseReservationDay(readLine()); } - public Map getOrders() { + public Map getOrders() throws BasicInputException, OrdersInputException { return inputParser.parseOrders(readLine()); } diff --git a/src/main/java/christmas/view/input/parser/InputParser.java b/src/main/java/christmas/view/input/parser/InputParser.java index 24694f8..75e925a 100644 --- a/src/main/java/christmas/view/input/parser/InputParser.java +++ b/src/main/java/christmas/view/input/parser/InputParser.java @@ -13,6 +13,7 @@ import christmas.view.input.exception.BasicInputException; import christmas.view.input.exception.DayInputException; +import christmas.view.input.exception.OrdersInputException; import christmas.view.input.validator.DayInputValidator; import christmas.view.input.validator.OrderInputValidator; import christmas.view.input.validator.OrdersInputValidator; @@ -38,7 +39,7 @@ public int parseReservationDay(String userInput) throws BasicInputException, Day return parseToInt(userInput); } - public Map parseOrders(String userInput) { + public Map parseOrders(String userInput) throws BasicInputException, OrdersInputException { checkOrdersLengthIsUnderUpperLimit(userInput); userInput = removeBlank(userInput); ordersInputValidator.preValidate(userInput); @@ -72,7 +73,7 @@ private String removeBlank(String userInput) { return userInput; } - private void validateEachOrder(final String userInput) { + private void validateEachOrder(final String userInput) throws BasicInputException, OrdersInputException { Arrays.stream(userInput.split(ORDERS_DELIMITER.getSymbol())) .forEach(orderInputValidator::validate); } diff --git a/src/main/java/christmas/view/input/validator/BasicValidator.java b/src/main/java/christmas/view/input/validator/BasicValidator.java index e81c062..16d834d 100644 --- a/src/main/java/christmas/view/input/validator/BasicValidator.java +++ b/src/main/java/christmas/view/input/validator/BasicValidator.java @@ -5,7 +5,8 @@ public abstract class BasicValidator { - protected void validate(final String userInput, final String inputType, final int maxLength) { + protected void validate(final String userInput, final String inputType, final int maxLength) + throws BasicInputException { validateNotEmpty(userInput, inputType); validateLengthUnderMaxLength(userInput, inputType, maxLength); } diff --git a/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java b/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java index c5fc084..cee80cf 100644 --- a/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java +++ b/src/main/java/christmas/view/input/validator/MenuCountInputValidator.java @@ -9,7 +9,7 @@ import christmas.view.input.exception.OrdersInputException; public class MenuCountInputValidator extends BasicValidator implements PositiveIntegerCheckable { - public void validate(final String menuCountInput) { + public void validate(final String menuCountInput) throws OrdersInputException { super.validate(menuCountInput, ORDER_SYMBOL.getSymbol(), MENU_COUNT_MAX_INPUT_LENGTH.getValue()); validateNumeric(menuCountInput); validatePositive(menuCountInput); diff --git a/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java b/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java index ad3bf7b..9f7e071 100644 --- a/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java +++ b/src/main/java/christmas/view/input/validator/MenuNameInputValidator.java @@ -3,8 +3,10 @@ import static christmas.view.input.constant.InputNumberConstant.MENU_NAME_MAX_INPUT_LENGTH; import static christmas.view.input.constant.InputSymbolConstant.ORDER_SYMBOL; +import christmas.view.input.exception.BasicInputException; + public class MenuNameInputValidator extends BasicValidator { - public void validate(final String menuNameInput) { + public void validate(final String menuNameInput) throws BasicInputException { super.validate(menuNameInput, ORDER_SYMBOL.getSymbol(), MENU_NAME_MAX_INPUT_LENGTH.getValue()); } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/validator/OrderInputValidator.java b/src/main/java/christmas/view/input/validator/OrderInputValidator.java index 7778bef..684bcdd 100644 --- a/src/main/java/christmas/view/input/validator/OrderInputValidator.java +++ b/src/main/java/christmas/view/input/validator/OrderInputValidator.java @@ -8,6 +8,7 @@ import static christmas.view.input.exception.message.OrdersInputExceptionMessage.EMPTY_MENU_COUNT; import static christmas.view.input.exception.message.OrdersInputExceptionMessage.INVALID_ORDER_FORMAT; +import christmas.view.input.exception.BasicInputException; import christmas.view.input.exception.OrdersInputException; import java.util.Arrays; import java.util.List; @@ -21,7 +22,7 @@ public OrderInputValidator() { this.menuCountInputValidator = new MenuCountInputValidator(); } - public void validate(final String orderInput) { + public void validate(final String orderInput) throws BasicInputException, OrdersInputException { super.validate(orderInput, ORDER_SYMBOL.getSymbol(), ORDER_MAX_INPUT_LENGTH.getValue()); validateContainingDelimiter(orderInput); validateNotEndsWithDelimiter(orderInput); @@ -53,7 +54,7 @@ private List splitToMenuInput(final String orderInput) { .toList(); } - private void validateMenu(List menuInput) { + private void validateMenu(List menuInput) throws BasicInputException, OrdersInputException { menuNameInputValidator.validate(menuInput.get(MENU_NAME_INDEX.getValue())); menuCountInputValidator.validate(menuInput.get(MENU_COUNT_INDEX.getValue())); } diff --git a/src/main/java/christmas/view/input/validator/OrdersInputValidator.java b/src/main/java/christmas/view/input/validator/OrdersInputValidator.java index 7082ec0..31c3054 100644 --- a/src/main/java/christmas/view/input/validator/OrdersInputValidator.java +++ b/src/main/java/christmas/view/input/validator/OrdersInputValidator.java @@ -18,7 +18,7 @@ public void preValidate(final String ordersInput) throws BasicInputException { super.validate(ordersInput, ORDER_SYMBOL.getSymbol(), ORDERS_MAX_INPUT_LENGTH.getValue()); } - public void postValidate(final String ordersInput) { + public void postValidate(final String ordersInput) throws OrdersInputException { validateNotExistDuplicatedMenus(ordersInput); } From 75fd7dc867e4584c4a1de2b1f3ac1b00dd056bbd Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 13:39:18 +0900 Subject: [PATCH 74/89] refactor: move responsibility of output of total benefited amount from dto to outputView --- src/main/java/christmas/dto/TotalBenefitedAmountDto.java | 2 +- src/main/java/christmas/view/output/OutputView.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/christmas/dto/TotalBenefitedAmountDto.java b/src/main/java/christmas/dto/TotalBenefitedAmountDto.java index 71f0ed0..5cbbbbd 100644 --- a/src/main/java/christmas/dto/TotalBenefitedAmountDto.java +++ b/src/main/java/christmas/dto/TotalBenefitedAmountDto.java @@ -8,7 +8,7 @@ public TotalBenefitedAmountDto(final int amount) { } public static TotalBenefitedAmountDto from(final int amount) { - return new TotalBenefitedAmountDto(-amount); + return new TotalBenefitedAmountDto(amount); } public int getAmount() { diff --git a/src/main/java/christmas/view/output/OutputView.java b/src/main/java/christmas/view/output/OutputView.java index 0bed4a9..3c12b3a 100644 --- a/src/main/java/christmas/view/output/OutputView.java +++ b/src/main/java/christmas/view/output/OutputView.java @@ -118,7 +118,7 @@ public void printTotalBenefitedAmount(TotalBenefitedAmountDto totalBenefitedAmou print(TOTAL_BENEFITED_AMOUNT.getSymbol()); printLine(); printFormatted(TOTAL_BENEFITED_AMOUNT_PRINT_FORMAT.getFormat(), - formatPrice(totalBenefitedAmountDto.getAmount())); + formatPrice(-totalBenefitedAmountDto.getAmount())); printLine(); } From e7944ad188b094a2085930b1f9fc3c805b9c8196 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 13:52:39 +0900 Subject: [PATCH 75/89] refactor: make ApplicationConstant finalized and remove unnecessary final keyword --- .../java/christmas/controller/ReservationDayController.java | 2 +- src/main/java/christmas/global/ApplicationConstant.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/christmas/controller/ReservationDayController.java b/src/main/java/christmas/controller/ReservationDayController.java index 4029eb1..f10378c 100644 --- a/src/main/java/christmas/controller/ReservationDayController.java +++ b/src/main/java/christmas/controller/ReservationDayController.java @@ -14,7 +14,7 @@ public class ReservationDayController { private final OutputView outputView; private final ReservationDayService reservationDayService; - public ReservationDayController(final InputView inputView, final OutputView outputView) { + public ReservationDayController(InputView inputView, OutputView outputView) { this.inputView = inputView; this.outputView = outputView; reservationDayService = new ReservationDayService(); diff --git a/src/main/java/christmas/global/ApplicationConstant.java b/src/main/java/christmas/global/ApplicationConstant.java index 88b6009..d544ca2 100644 --- a/src/main/java/christmas/global/ApplicationConstant.java +++ b/src/main/java/christmas/global/ApplicationConstant.java @@ -1,8 +1,8 @@ package christmas.global; public class ApplicationConstant { - public static int CURRENT_PROMOTION_MONTH = 12; - public static String ERROR_PREFIX = "[ERROR] "; + public static final int CURRENT_PROMOTION_MONTH = 12; + public static final String ERROR_PREFIX = "[ERROR] "; private ApplicationConstant() { } From e46096b3a08f585f5d72fe73032e6f6b7481fdf6 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 14:20:17 +0900 Subject: [PATCH 76/89] refactor: remove redundunt ERROR_PREFIX addition in exception messages --- .../message/InvalidOrdersExceptionMessage.java | 8 ++++---- .../InvalidReservationDayExceptionMessage.java | 4 ++-- .../message/BasicInputExceptionMessageFormat.java | 9 ++++----- .../exception/message/DayInputExceptionMessage.java | 6 +++--- .../message/OrdersInputExceptionMessage.java | 12 ++++++------ src/main/java/christmas/view/output/OutputView.java | 8 ++++---- 6 files changed, 23 insertions(+), 24 deletions(-) diff --git a/src/main/java/christmas/domain/exception/message/InvalidOrdersExceptionMessage.java b/src/main/java/christmas/domain/exception/message/InvalidOrdersExceptionMessage.java index bee9376..b479cb4 100644 --- a/src/main/java/christmas/domain/exception/message/InvalidOrdersExceptionMessage.java +++ b/src/main/java/christmas/domain/exception/message/InvalidOrdersExceptionMessage.java @@ -3,9 +3,9 @@ import static christmas.global.ApplicationConstant.ERROR_PREFIX; public enum InvalidOrdersExceptionMessage { - NOT_EXISTING_MENU(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), - EXCEED_MENU_COUNTS_UPPER_LIMIT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), - MENUS_ONLY_CONTAIN_BEVERAGE(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); + NOT_EXISTING_MENU("μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + EXCEED_MENU_COUNTS_UPPER_LIMIT("μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + MENUS_ONLY_CONTAIN_BEVERAGE("μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); private final String message; @@ -14,6 +14,6 @@ public enum InvalidOrdersExceptionMessage { } public String getMessage() { - return message; + return ERROR_PREFIX + message; } } \ No newline at end of file diff --git a/src/main/java/christmas/domain/exception/message/InvalidReservationDayExceptionMessage.java b/src/main/java/christmas/domain/exception/message/InvalidReservationDayExceptionMessage.java index 2edf14b..23b0f05 100644 --- a/src/main/java/christmas/domain/exception/message/InvalidReservationDayExceptionMessage.java +++ b/src/main/java/christmas/domain/exception/message/InvalidReservationDayExceptionMessage.java @@ -3,7 +3,7 @@ import static christmas.global.ApplicationConstant.ERROR_PREFIX; public enum InvalidReservationDayExceptionMessage { - NOT_IN_APPROPRIATE_RANGE(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); + NOT_IN_APPROPRIATE_RANGE("μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); private final String message; @@ -12,6 +12,6 @@ public enum InvalidReservationDayExceptionMessage { } public String getMessage() { - return message; + return ERROR_PREFIX + message; } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessageFormat.java b/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessageFormat.java index e7d329f..26444fc 100644 --- a/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessageFormat.java +++ b/src/main/java/christmas/view/input/exception/message/BasicInputExceptionMessageFormat.java @@ -3,10 +3,9 @@ import static christmas.global.ApplicationConstant.ERROR_PREFIX; public enum BasicInputExceptionMessageFormat { - TOO_LONG_WITH_BLANKS_FORMAT( - ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ %sμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), - EMPTY_FORMAT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ %sμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), - TOO_LONG_FORMAT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ %sμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); + TOO_LONG_WITH_BLANKS_FORMAT("μœ νš¨ν•˜μ§€ μ•Šμ€ %sμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + EMPTY_FORMAT("μœ νš¨ν•˜μ§€ μ•Šμ€ %sμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + TOO_LONG_FORMAT("μœ νš¨ν•˜μ§€ μ•Šμ€ %sμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); private final String format; @@ -15,6 +14,6 @@ public enum BasicInputExceptionMessageFormat { } public String getFormat() { - return format; + return ERROR_PREFIX + format; } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/exception/message/DayInputExceptionMessage.java b/src/main/java/christmas/view/input/exception/message/DayInputExceptionMessage.java index c2baba3..cb12a99 100644 --- a/src/main/java/christmas/view/input/exception/message/DayInputExceptionMessage.java +++ b/src/main/java/christmas/view/input/exception/message/DayInputExceptionMessage.java @@ -3,8 +3,8 @@ import static christmas.global.ApplicationConstant.ERROR_PREFIX; public enum DayInputExceptionMessage { - NOT_NUMERIC_TYPE(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), - NOT_POSITIVE(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); + NOT_NUMERIC_TYPE("μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + NOT_POSITIVE("μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); private final String message; @@ -13,6 +13,6 @@ public enum DayInputExceptionMessage { } public String getMessage() { - return message; + return ERROR_PREFIX + message; } } \ No newline at end of file diff --git a/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java b/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java index 42c5ce9..322b140 100644 --- a/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java +++ b/src/main/java/christmas/view/input/exception/message/OrdersInputExceptionMessage.java @@ -3,11 +3,11 @@ import static christmas.global.ApplicationConstant.ERROR_PREFIX; public enum OrdersInputExceptionMessage { - INVALID_ORDER_FORMAT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), - EMPTY_MENU_COUNT(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), - NOT_NUMERIC_TYPE(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), - NOT_POSITIVE(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), - DUPLICATED_MENUS(ERROR_PREFIX + "μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); + INVALID_ORDER_FORMAT("μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + EMPTY_MENU_COUNT("μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + NOT_NUMERIC_TYPE("μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + NOT_POSITIVE("μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + DUPLICATED_MENUS("μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); private final String message; @@ -16,6 +16,6 @@ public enum OrdersInputExceptionMessage { } public String getMessage() { - return message; + return ERROR_PREFIX + message; } } \ No newline at end of file diff --git a/src/main/java/christmas/view/output/OutputView.java b/src/main/java/christmas/view/output/OutputView.java index 3c12b3a..c3313ee 100644 --- a/src/main/java/christmas/view/output/OutputView.java +++ b/src/main/java/christmas/view/output/OutputView.java @@ -147,10 +147,6 @@ private void printEventBadgeName(EventBadgeDto eventBadgeDto) { } } - public void printLine() { - System.out.print(NEW_LINE.getSymbol()); - } - public void printErrorMessage(final String message) { print(message); printLine(); @@ -160,6 +156,10 @@ private void print(final String message) { System.out.print(message); } + private void printLine() { + System.out.print(NEW_LINE.getSymbol()); + } + private void printFormatted(final String format, final Object... args) { print(String.format(format, args)); } From c4805f392c123d7dc2e8a99d3a0cff725245f646 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 16:10:38 +0900 Subject: [PATCH 77/89] test: add test to check EventManager domain logic --- docs/README.md | 10 +- .../domain/ChristmasPromotionTest.java | 4 + .../java/christmas/domain/EventBadgeTest.java | 4 + .../christmas/domain/EventManagerTest.java | 102 ++++++++++++++++++ src/test/java/christmas/domain/MenuTest.java | 4 + .../java/christmas/domain/PromotionTest.java | 4 + 6 files changed, 123 insertions(+), 5 deletions(-) create mode 100644 src/test/java/christmas/domain/ChristmasPromotionTest.java create mode 100644 src/test/java/christmas/domain/EventBadgeTest.java create mode 100644 src/test/java/christmas/domain/EventManagerTest.java create mode 100644 src/test/java/christmas/domain/MenuTest.java create mode 100644 src/test/java/christmas/domain/PromotionTest.java diff --git a/docs/README.md b/docs/README.md index a65da36..9017409 100644 --- a/docs/README.md +++ b/docs/README.md @@ -108,13 +108,13 @@ > ### πŸŽ„ μ£Όλ¬Έ 내역에 λŒ€ν•œ 이벀트 적용 κ²°κ³Ό μ‚°μΆœ 도메인 둜직 - [x] μ£Όλ¬Έ λ‚΄μ—­κ³Ό λ‚ μ§œλ₯Ό λΉ„κ΅ν•΄μ„œ, `ν˜œνƒ λ‚΄μ—­`을 μƒμ‚°ν•œλ‹€. - - [x] μ£Όλ¬Έ 내역에 λ‚ μ§œμ— λ”°λ₯Έ 할인 적용 μ—¬λΆ€λ₯Ό μ μš©ν•΄μ„œ, `할인 κΈˆμ•‘`을 κ³„μ‚°ν•œλ‹€. + - [x] μ£Όλ¬Έ 내역에 λ‚ μ§œμ— λ”°λ₯Έ 할인 μ—¬λΆ€λ₯Ό μ μš©ν•΄μ„œ, `할인 κΈˆμ•‘`을 κ³„μ‚°ν•œλ‹€. - [x] ν˜œνƒ λ‚΄μ—­μ˜ κΈˆμ•‘μ„ ν•©μ³μ„œ, `총 ν˜œνƒ κΈˆμ•‘`을 κ³„μ‚°ν•œλ‹€. - [x] μ£Όλ¬Έ 내역에 증정 μ΄λ²€νŠΈκ°€ ν¬ν•¨λ˜μ–΄ μžˆμ„ μ‹œ, μ¦μ •ν’ˆμ˜ κ°€κ²©κΉŒμ§€ `총 ν˜œνƒ κΈˆμ•‘`에 ν¬ν•¨μ‹œν‚¨λ‹€. - - [x] 총 ν˜œνƒ κΈˆμ•‘μ„ 기반으둜 12μ›” 이벀트 λ°°μ§€λ₯Ό λ°œκΈ‰ν•œλ‹€. - - [x] ν˜œνƒ κΈˆμ•‘μ΄ `5000원` 이상일 μ‹œ, `별` -
ν˜œνƒ κΈˆμ•‘μ΄ `1λ§Œμ›` 이상일 μ‹œ, `트리` -
ν˜œνƒ κΈˆμ•‘μ΄ `2λ§Œμ›` 이상일 μ‹œ, `산타` + - [x] 총 ν˜œνƒ κΈˆμ•‘μ„ 기반으둜 12μ›” 이벀트 λ°°μ§€λ₯Ό λ°œκΈ‰ν•œλ‹€. + - [x] ν˜œνƒ κΈˆμ•‘μ΄ `5000원` 이상일 μ‹œ, `별` +
ν˜œνƒ κΈˆμ•‘μ΄ `1λ§Œμ›` 이상일 μ‹œ, `트리` +
ν˜œνƒ κΈˆμ•‘μ΄ `2λ§Œμ›` 이상일 μ‹œ, `산타` - [x] `할인 μ „ 총 μ£Όλ¬Έ κΈˆμ•‘` μ—μ„œ `할인 κΈˆμ•‘`을 λΉΌμ„œ `할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘`을 κ³„μ‚°ν•œλ‹€. ## πŸ–¨ [ 좜λ ₯ κΈ°λŠ₯ ] diff --git a/src/test/java/christmas/domain/ChristmasPromotionTest.java b/src/test/java/christmas/domain/ChristmasPromotionTest.java new file mode 100644 index 0000000..abd6056 --- /dev/null +++ b/src/test/java/christmas/domain/ChristmasPromotionTest.java @@ -0,0 +1,4 @@ +package christmas.domain; + +public class ChristmasPromotionTest { +} diff --git a/src/test/java/christmas/domain/EventBadgeTest.java b/src/test/java/christmas/domain/EventBadgeTest.java new file mode 100644 index 0000000..c1a7f3d --- /dev/null +++ b/src/test/java/christmas/domain/EventBadgeTest.java @@ -0,0 +1,4 @@ +package christmas.domain; + +public class EventBadgeTest { +} diff --git a/src/test/java/christmas/domain/EventManagerTest.java b/src/test/java/christmas/domain/EventManagerTest.java new file mode 100644 index 0000000..a065aa6 --- /dev/null +++ b/src/test/java/christmas/domain/EventManagerTest.java @@ -0,0 +1,102 @@ +package christmas.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +public class EventManagerTest { + @DisplayName("μ£Όλ¬Έ λ‚΄μ—­κ³Ό λ‚ μ§œλ₯Ό λΉ„κ΅ν•΄μ„œ, ν˜œνƒ 내역을 μƒμ‚°ν•œλ‹€.") + @ParameterizedTest + @CsvSource({ + "4, 'μ‹œμ €μƒλŸ¬λ“œ,3|제둜콜라,2|λ ˆλ“œμ™€μΈ,1|ν‹°λ³ΈμŠ€ν…Œμ΄ν¬,3|μ΄ˆμ½”μΌ€μ΄ν¬,4','평일 할인,8092|크리슀마슀 디데이 할인,1300|증정 이벀트,25000'", + "3,'ν‹°λ³ΈμŠ€ν…Œμ΄ν¬,1|바비큐립,1|μ΄ˆμ½”μΌ€μ΄ν¬,2|제둜콜라,1','크리슀마슀 디데이 할인,1200|평일 할인,4046|νŠΉλ³„ 할인,1000|증정 이벀트,25000'", + "25,'νƒ€νŒŒμŠ€,1|ν‹°λ³ΈμŠ€ν…Œμ΄ν¬,1|μ•„μ΄μŠ€ν¬λ¦Ό,3|제둜콜라,3','크리슀마슀 디데이 할인,3400|평일 할인,6069|νŠΉλ³„ 할인,1000'" + }) + void μ£Όλ¬Έ_λ‚΄μ—­κ³Ό_λ‚ μ§œλ₯Ό_λΉ„κ΅ν•΄μ„œ_ν˜œνƒ_내역을_생산(int day, String menuAndCounts, String expectedBenefitDetails) { + // given + ReservationDay reservationDay = ReservationDay.from(day); + Orders orders = Orders.from(parseMenuAndCounts(menuAndCounts)); + EventManager eventManager = EventManager.of(reservationDay, orders); + // when + Map benefitsDetails = eventManager.createBenefitsDetails(); + // then + for (String benefit : expectedBenefitDetails.split("\\|")) { + String[] parts = benefit.split(","); + String benefitName = parts[0]; + int expectedAmount = Integer.parseInt(parts[1]); + assertThat(benefitsDetails.get(benefitName)).isEqualTo(expectedAmount); + } + } + + @DisplayName("μ£Όλ¬Έ 내역에 λ‚ μ§œμ— λ”°λ₯Έ 할인 μ—¬λΆ€λ₯Ό μ μš©ν•΄μ„œ, 할인 κΈˆμ•‘μ„ κ³„μ‚°ν•œλ‹€.") + @ParameterizedTest + @CsvSource({ + "4, 'μ‹œμ €μƒλŸ¬λ“œ,3|제둜콜라,2|λ ˆλ“œμ™€μΈ,1|ν‹°λ³ΈμŠ€ν…Œμ΄ν¬,3|μ΄ˆμ½”μΌ€μ΄ν¬,4','9392'", + "3,'ν‹°λ³ΈμŠ€ν…Œμ΄ν¬,1|바비큐립,1|μ΄ˆμ½”μΌ€μ΄ν¬,2|제둜콜라,1','6246'", + "25,'νƒ€νŒŒμŠ€,1|ν‹°λ³ΈμŠ€ν…Œμ΄ν¬,1|μ•„μ΄μŠ€ν¬λ¦Ό,3|제둜콜라,3','10469'" + }) + void μ£Όλ¬Έ_내역에_λ‚ μ§œμ—_λ”°λ₯Έ_할인_μ—¬λΆ€λ₯Ό_μ μš©ν•΄μ„œ_할인_κΈˆμ•‘_계산(int day, String menuAndCounts, int expectedDiscountAmount) { + // given + ReservationDay reservationDay = ReservationDay.from(day); + Orders orders = Orders.from(parseMenuAndCounts(menuAndCounts)); + EventManager eventManager = EventManager.of(reservationDay, orders); + // when + int discountAmount = + orders.calculateTotalAmountWithNoDiscount() - eventManager.calculateEstimatedOrdersAmountWithDiscount(); + // then + assertThat(discountAmount).isEqualTo(expectedDiscountAmount); + } + + @DisplayName("ν˜œνƒ λ‚΄μ—­μ˜ κΈˆμ•‘μ„ ν•©μ³μ„œ, 총 ν˜œνƒ κΈˆμ•‘μ„ κ³„μ‚°ν•œλ‹€.") + @ParameterizedTest + @CsvSource({ + "4, 'μ‹œμ €μƒλŸ¬λ“œ,3|제둜콜라,2|λ ˆλ“œμ™€μΈ,1|ν‹°λ³ΈμŠ€ν…Œμ΄ν¬,3|μ΄ˆμ½”μΌ€μ΄ν¬,4','34392'", + "3,'ν‹°λ³ΈμŠ€ν…Œμ΄ν¬,1|바비큐립,1|μ΄ˆμ½”μΌ€μ΄ν¬,2|제둜콜라,1','31246'", + "25,'νƒ€νŒŒμŠ€,1|ν‹°λ³ΈμŠ€ν…Œμ΄ν¬,1|μ•„μ΄μŠ€ν¬λ¦Ό,3|제둜콜라,3','10469'" + }) + void ν˜œνƒ_λ‚΄μ—­μ˜_κΈˆμ•‘μ„_ν•©μ³μ„œ_총_ν˜œνƒ_κΈˆμ•‘μ„_계산(int day, String menuAndCounts, int expectedDiscountAmount) { + // given + ReservationDay reservationDay = ReservationDay.from(day); + Orders orders = Orders.from(parseMenuAndCounts(menuAndCounts)); + EventManager eventManager = EventManager.of(reservationDay, orders); + // when + int discountAmount = eventManager.calculateTotalBenefitedAmount(); + // then + assertThat(discountAmount).isEqualTo(expectedDiscountAmount); + } + + @DisplayName("총 ν˜œνƒ κΈˆμ•‘μ„ 기반으둜 12μ›” 이벀트 λ°°μ§€λ₯Ό λ°œκΈ‰ν•œλ‹€.") + @ParameterizedTest + @CsvSource({ + "4, 'μ‹œμ €μƒλŸ¬λ“œ,3|제둜콜라,2|λ ˆλ“œμ™€μΈ,1|ν‹°λ³ΈμŠ€ν…Œμ΄ν¬,3|μ΄ˆμ½”μΌ€μ΄ν¬,4','산타'", + "3,'ν‹°λ³ΈμŠ€ν…Œμ΄ν¬,1|바비큐립,1|μ΄ˆμ½”μΌ€μ΄ν¬,2|제둜콜라,1','산타'", + "25,'νƒ€νŒŒμŠ€,1|ν‹°λ³ΈμŠ€ν…Œμ΄ν¬,1|μ•„μ΄μŠ€ν¬λ¦Ό,3|제둜콜라,3','트리'", + "26,'νƒ€νŒŒμŠ€,1|ν¬λ¦¬μŠ€λ§ˆμŠ€νŒŒμŠ€νƒ€,1|μ•„μ΄μŠ€ν¬λ¦Ό,3|','별'", + "26,'μ–‘μ†‘μ΄μˆ˜ν”„,3|ν¬λ¦¬μŠ€λ§ˆμŠ€νŒŒμŠ€νƒ€,1|μ•„μ΄μŠ€ν¬λ¦Ό,1|',''" + }) + void 총_ν˜œνƒ_κΈˆμ•‘μ„_기반으둜_12μ›”_이벀트_λ°°μ§€λ₯Ό_λ°œκΈ‰(int day, String menuAndCounts, String expectedEventBadge) { + // given + ReservationDay reservationDay = ReservationDay.from(day); + Orders orders = Orders.from(parseMenuAndCounts(menuAndCounts)); + EventManager eventManager = EventManager.of(reservationDay, orders); + // when + String eventBadge = eventManager.issueEventBadge(); + // then + assertThat(eventBadge).isEqualTo(expectedEventBadge); + } + + private List parseMenuAndCounts(String menuAndCounts) { + List orders = new ArrayList<>(); + String[] splitedMenusAndCounts = menuAndCounts.split("\\|"); + for (String splitedMenusAndCount : splitedMenusAndCounts) { + String[] menuNameAndCount = splitedMenusAndCount.split(","); + orders.add(Order.of(menuNameAndCount[0], Integer.parseInt(menuNameAndCount[1]))); + } + return orders; + } +} \ No newline at end of file diff --git a/src/test/java/christmas/domain/MenuTest.java b/src/test/java/christmas/domain/MenuTest.java new file mode 100644 index 0000000..555021d --- /dev/null +++ b/src/test/java/christmas/domain/MenuTest.java @@ -0,0 +1,4 @@ +package christmas.domain; + +public class MenuTest { +} \ No newline at end of file diff --git a/src/test/java/christmas/domain/PromotionTest.java b/src/test/java/christmas/domain/PromotionTest.java new file mode 100644 index 0000000..374e903 --- /dev/null +++ b/src/test/java/christmas/domain/PromotionTest.java @@ -0,0 +1,4 @@ +package christmas.domain; + +public class PromotionTest { +} From 039a1b19effcdaf7130a3329bf48031276b4d1c5 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 16:24:04 +0900 Subject: [PATCH 78/89] test: add test to check Menu domain logic --- src/test/java/christmas/domain/MenuTest.java | 30 ++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/test/java/christmas/domain/MenuTest.java b/src/test/java/christmas/domain/MenuTest.java index 555021d..05b602d 100644 --- a/src/test/java/christmas/domain/MenuTest.java +++ b/src/test/java/christmas/domain/MenuTest.java @@ -1,4 +1,34 @@ package christmas.domain; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import christmas.domain.constant.orders.Menu; +import christmas.domain.exception.InvalidOrdersException; +import christmas.domain.exception.message.InvalidOrdersExceptionMessage; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + public class MenuTest { + @DisplayName("메뉴 이름이 λ©”λ‰΄νŒμ— μ—†μœΌλ©΄ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @ParameterizedTest + @ValueSource(strings = {"μ‹œμΈ„μƒλŸ¬λ“œ", "λ™μ–‘μ†‘μ΄μˆ˜ν”„", "물파슀", "백퍼콜라", "μ™€μ΄λ³ΈμŠ€ν…Œμ΄ν¬", "λ°”λΉ„νμΉ˜ν‚¨", "크림", "당근케이크"}) + void 메뉴_이름이_λ©”λ‰΄νŒμ—_μ—†μœΌλ©΄_μ˜ˆμ™Έ_λ°œμƒ(String menuName) { + assertThatThrownBy(() -> Menu.searchByName(menuName)) + .isInstanceOf(InvalidOrdersException.class) + .hasMessageContaining(InvalidOrdersExceptionMessage.NOT_EXISTING_MENU.getMessage()); + } + + @DisplayName("메뉴 이름이 λ©”λ‰΄νŒμ— 있으면, 메뉴가 μ˜¬λ°”λ₯΄κ²Œ λ°˜ν™˜λœλ‹€.") + @ParameterizedTest + @ValueSource(strings = {"μ‹œμ €μƒλŸ¬λ“œ", "νƒ€νŒŒμŠ€", "μ–‘μ†‘μ΄μˆ˜ν”„", "ν‹°λ³ΈμŠ€ν…Œμ΄ν¬", "바비큐립", "ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€", "ν¬λ¦¬μŠ€λ§ˆμŠ€νŒŒμŠ€νƒ€", "μ΄ˆμ½”μΌ€μ΄ν¬", "μ•„μ΄μŠ€ν¬λ¦Ό", "제둜콜라", + "λ ˆλ“œμ™€μΈ", "μƒ΄νŽ˜μΈ"}) + void 메뉴_이름이_λ©”λ‰΄νŒμ—_있으면_메뉴λ₯Ό_μ˜¬λ°”λ₯΄κ²Œ_λ°˜ν™˜(String menuName) { + // given, when + Menu menu = Menu.searchByName(menuName); + // then + assertThat(menu).isInstanceOf(Menu.class); + assertThat(menu.getName()).isEqualTo(menuName); + } } \ No newline at end of file From 1899ecf530add4766b66ea179cc2e09e66ba6b40 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 16:39:00 +0900 Subject: [PATCH 79/89] test: add test to check EventBadge domain logic --- .../domain/ChristmasPromotionTest.java | 2 +- .../java/christmas/domain/EventBadgeTest.java | 19 ++++++++++++++++++- .../java/christmas/domain/PromotionTest.java | 2 +- .../christmas/domain/ReservationDayTest.java | 1 - 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/test/java/christmas/domain/ChristmasPromotionTest.java b/src/test/java/christmas/domain/ChristmasPromotionTest.java index abd6056..e25cb81 100644 --- a/src/test/java/christmas/domain/ChristmasPromotionTest.java +++ b/src/test/java/christmas/domain/ChristmasPromotionTest.java @@ -1,4 +1,4 @@ package christmas.domain; public class ChristmasPromotionTest { -} +} \ No newline at end of file diff --git a/src/test/java/christmas/domain/EventBadgeTest.java b/src/test/java/christmas/domain/EventBadgeTest.java index c1a7f3d..40f9d14 100644 --- a/src/test/java/christmas/domain/EventBadgeTest.java +++ b/src/test/java/christmas/domain/EventBadgeTest.java @@ -1,4 +1,21 @@ package christmas.domain; +import static org.assertj.core.api.Assertions.assertThat; + +import christmas.domain.constant.event.EventBadge; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + public class EventBadgeTest { -} + @DisplayName("ν˜œνƒ κΈˆμ•‘μ— 따라 이벀트 λ°°μ§€λ₯Ό λ°œκΈ‰ν•œλ‹€.") + @ParameterizedTest + @CsvSource(value = { + "1000:''", "4999:''", "5000:별", "8230:별", "9999:별", "10000:트리", "13200:트리", + "14999:트리", "15000:트리", "19999:트리", "20000:산타", "20001:산타", "83000:산타" + }, delimiter = ':') + void ν˜œνƒ_κΈˆμ•‘μ—_따라_이벀트_λ°°μ§€_λ°œκΈ‰(int totalBenefitedAmount, String eventBadgeName) { + assertThat(EventBadge.getBadgeNameByBenefitedPrice(totalBenefitedAmount)) + .isEqualTo(eventBadgeName); + } +} \ No newline at end of file diff --git a/src/test/java/christmas/domain/PromotionTest.java b/src/test/java/christmas/domain/PromotionTest.java index 374e903..f22017a 100644 --- a/src/test/java/christmas/domain/PromotionTest.java +++ b/src/test/java/christmas/domain/PromotionTest.java @@ -1,4 +1,4 @@ package christmas.domain; public class PromotionTest { -} +} \ No newline at end of file diff --git a/src/test/java/christmas/domain/ReservationDayTest.java b/src/test/java/christmas/domain/ReservationDayTest.java index 08aa174..275520a 100644 --- a/src/test/java/christmas/domain/ReservationDayTest.java +++ b/src/test/java/christmas/domain/ReservationDayTest.java @@ -11,7 +11,6 @@ import org.junit.jupiter.params.provider.ValueSource; public class ReservationDayTest { - @DisplayName("μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œ ( 1 ~ 31 μ‚¬μ΄μ˜ μˆ«μžκ°€ μ•„λ‹Œ 숫자 )λ₯Ό μž…λ ₯ν•˜λ©΄ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.") @ParameterizedTest @ValueSource(ints = {0, -1, -10, 300, 350, 500, 32}) From f48428a832f1d070cff3aa92f6621b76f8736f81 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 16:47:20 +0900 Subject: [PATCH 80/89] test: add test to check ChristmasPromotion domain logic --- .../domain/ChristmasPromotionTest.java | 17 +++++++++++++++++ .../java/christmas/domain/PromotionTest.java | 4 ---- 2 files changed, 17 insertions(+), 4 deletions(-) delete mode 100644 src/test/java/christmas/domain/PromotionTest.java diff --git a/src/test/java/christmas/domain/ChristmasPromotionTest.java b/src/test/java/christmas/domain/ChristmasPromotionTest.java index e25cb81..08a6da6 100644 --- a/src/test/java/christmas/domain/ChristmasPromotionTest.java +++ b/src/test/java/christmas/domain/ChristmasPromotionTest.java @@ -1,4 +1,21 @@ package christmas.domain; +import static christmas.domain.constant.event.ChristmasPromotion.CHRISTMAS_D_DAY_PROMOTION; +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + public class ChristmasPromotionTest { + @DisplayName("25일 μ΄μ „μ˜ λ‚ μ§œκ°€ μž…λ ₯되면, ν•΄λ‹Ήν•˜λŠ” 크리슀마슀 디데이 ν”„λ‘œλͺ¨μ…˜ κΈˆμ•‘μ„ κ³„μ‚°ν•œλ‹€.") + @ParameterizedTest + @CsvSource(value = { + "1:1000", "2:1100", "3:1200", "25:3400", "24:3300", "23:3200", + "15:2400", "16:2500", "19:2800", "7:1600", "11:2000", "13:2200" + }, delimiter = ':') + void λ‚ μ§œκ°€_μž…λ ₯되면_ν•΄λ‹Ήν•˜λŠ”_크리슀마슀_디데이_ν”„λ‘œλͺ¨μ…˜_κΈˆμ•‘μ„_계산(int day, int expectedBenefitAmount) { + assertThat(CHRISTMAS_D_DAY_PROMOTION.getBenefitAmount(day)) + .isEqualTo(expectedBenefitAmount); + } } \ No newline at end of file diff --git a/src/test/java/christmas/domain/PromotionTest.java b/src/test/java/christmas/domain/PromotionTest.java deleted file mode 100644 index f22017a..0000000 --- a/src/test/java/christmas/domain/PromotionTest.java +++ /dev/null @@ -1,4 +0,0 @@ -package christmas.domain; - -public class PromotionTest { -} \ No newline at end of file From 0fd035a8bccabfab1f31ed164a9fc997863a2586 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 16:52:49 +0900 Subject: [PATCH 81/89] refactor: extract duplicated part to method in EventManagerTest --- .../christmas/domain/EventManagerTest.java | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/test/java/christmas/domain/EventManagerTest.java b/src/test/java/christmas/domain/EventManagerTest.java index a065aa6..b45fd57 100644 --- a/src/test/java/christmas/domain/EventManagerTest.java +++ b/src/test/java/christmas/domain/EventManagerTest.java @@ -19,9 +19,7 @@ public class EventManagerTest { }) void μ£Όλ¬Έ_λ‚΄μ—­κ³Ό_λ‚ μ§œλ₯Ό_λΉ„κ΅ν•΄μ„œ_ν˜œνƒ_내역을_생산(int day, String menuAndCounts, String expectedBenefitDetails) { // given - ReservationDay reservationDay = ReservationDay.from(day); - Orders orders = Orders.from(parseMenuAndCounts(menuAndCounts)); - EventManager eventManager = EventManager.of(reservationDay, orders); + EventManager eventManager = createEventManager(day, menuAndCounts); // when Map benefitsDetails = eventManager.createBenefitsDetails(); // then @@ -42,9 +40,8 @@ public class EventManagerTest { }) void μ£Όλ¬Έ_내역에_λ‚ μ§œμ—_λ”°λ₯Έ_할인_μ—¬λΆ€λ₯Ό_μ μš©ν•΄μ„œ_할인_κΈˆμ•‘_계산(int day, String menuAndCounts, int expectedDiscountAmount) { // given - ReservationDay reservationDay = ReservationDay.from(day); Orders orders = Orders.from(parseMenuAndCounts(menuAndCounts)); - EventManager eventManager = EventManager.of(reservationDay, orders); + EventManager eventManager = createEventManager(day, menuAndCounts); // when int discountAmount = orders.calculateTotalAmountWithNoDiscount() - eventManager.calculateEstimatedOrdersAmountWithDiscount(); @@ -61,9 +58,7 @@ public class EventManagerTest { }) void ν˜œνƒ_λ‚΄μ—­μ˜_κΈˆμ•‘μ„_ν•©μ³μ„œ_총_ν˜œνƒ_κΈˆμ•‘μ„_계산(int day, String menuAndCounts, int expectedDiscountAmount) { // given - ReservationDay reservationDay = ReservationDay.from(day); - Orders orders = Orders.from(parseMenuAndCounts(menuAndCounts)); - EventManager eventManager = EventManager.of(reservationDay, orders); + EventManager eventManager = createEventManager(day, menuAndCounts); // when int discountAmount = eventManager.calculateTotalBenefitedAmount(); // then @@ -81,15 +76,19 @@ public class EventManagerTest { }) void 총_ν˜œνƒ_κΈˆμ•‘μ„_기반으둜_12μ›”_이벀트_λ°°μ§€λ₯Ό_λ°œκΈ‰(int day, String menuAndCounts, String expectedEventBadge) { // given - ReservationDay reservationDay = ReservationDay.from(day); - Orders orders = Orders.from(parseMenuAndCounts(menuAndCounts)); - EventManager eventManager = EventManager.of(reservationDay, orders); + EventManager eventManager = createEventManager(day, menuAndCounts); // when String eventBadge = eventManager.issueEventBadge(); // then assertThat(eventBadge).isEqualTo(expectedEventBadge); } + private EventManager createEventManager(int day, String menuAndCounts) { + ReservationDay reservationDay = ReservationDay.from(day); + Orders orders = Orders.from(parseMenuAndCounts(menuAndCounts)); + return EventManager.of(reservationDay, orders); + } + private List parseMenuAndCounts(String menuAndCounts) { List orders = new ArrayList<>(); String[] splitedMenusAndCounts = menuAndCounts.split("\\|"); From d97bae5507729e3d4a1177d73b51baca38faa25e Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 17:46:15 +0900 Subject: [PATCH 82/89] test: add test code for InputParser --- .../christmas/parser/InputParserTest.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/test/java/christmas/parser/InputParserTest.java diff --git a/src/test/java/christmas/parser/InputParserTest.java b/src/test/java/christmas/parser/InputParserTest.java new file mode 100644 index 0000000..840be0e --- /dev/null +++ b/src/test/java/christmas/parser/InputParserTest.java @@ -0,0 +1,73 @@ +package christmas.parser; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import christmas.view.input.exception.BasicInputException; +import christmas.view.input.exception.message.BasicInputExceptionMessageFormat; +import christmas.view.input.parser.InputParser; +import java.util.Collections; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +public class InputParserTest { + private InputParser inputParser; + + @BeforeEach + void setUp() { + inputParser = new InputParser(); + } + + @DisplayName("μ˜ˆμ•½ λ‚ μ§œμ— 곡백이 ν¬ν•¨λœ 경우, 곡백을 μ œκ±°ν•œ 값을 숫자 ν˜•μ‹μœΌλ‘œ λ°”κΎΈμ–΄ λŒλ €μ€€λ‹€.") + @ParameterizedTest + @CsvSource(value = {"1 0:10", "2 3:23", " 1 7:17", "3 1:31", " 1 :1", + " 3 0 :30"}, delimiter = ':') + void μ˜ˆμ•½_λ‚ μ§œμ—_곡백이_ν¬ν•¨λœ_경우_곡백을_μ œκ±°ν•œ_숫자둜_λ°˜ν™˜(String userInput, int expected) { + assertThat(inputParser.parseReservationDay(userInput)).isEqualTo(expected); + } + + @DisplayName("μ£Όλ¬Έ 내역에 곡백이 ν¬ν•¨λœ 경우, 곡백을 μ œκ±°ν•œ 값을 Mapν˜•μ‹μœΌλ‘œ λ°”κΎΈμ–΄ λŒλ €μ€€λ‹€.") + @ParameterizedTest + @CsvSource(value = {"타 파 슀 - 1,νƒ€νŒŒμŠ€,1", " ν‹° λ³Έ μŠ€ν…Œ 이 크 - 2,ν‹°λ³ΈμŠ€ν…Œμ΄ν¬,2", "제둜 콜 라-10,제둜콜라,10"}, delimiter = ',') + void μ£Όλ¬Έ_내역에_곡백이_ν¬ν•¨λœ_경우_곡백을_μ œκ±°ν•œ_값을_맡으둜_λ°˜ν™˜(String userInput, String menuName, int menuCount) { + assertThat(inputParser.parseOrders(userInput)) + .isEqualTo(Collections.singletonMap(menuName, menuCount)); + } + + @DisplayName("곡백 포함 μž…λ ₯κ°’μ˜ 길이가 2000κΈ€μž 이상이면, μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @Test + void 곡백_포함_λ‚ μ§œ_μž…λ ₯값이_2000κΈ€μž_이상이면_μ˜ˆμ™Έ_λ°œμƒ() { + String safeDayInput = "1" + " ".repeat(1000); + String illegalDayInput = "1" + " ".repeat(2000); + assertThat(inputParser.parseReservationDay(safeDayInput)).isEqualTo(1); + assertThatThrownBy(() -> inputParser.parseReservationDay(illegalDayInput)) + .isInstanceOf(BasicInputException.class) + .hasMessageContaining( + String.format(BasicInputExceptionMessageFormat.TOO_LONG_WITH_BLANKS_FORMAT.getFormat(), "λ‚ μ§œ")); + } + + @DisplayName("곡백 제거 ν›„ λ‚ μ§œ 길이가 3κΈ€μž 이상이면, μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @ParameterizedTest + @CsvSource(value = {" 0 3 0 ", "0 0 2", "0 0 0 0 4"}) + void 곡백_제거_ν›„_μž…λ ₯값이_3κΈ€μž_이상이면_μ˜ˆμ™Έ_λ°œμƒ(String userInput) { + assertThatThrownBy(() -> inputParser.parseReservationDay(userInput)) + .isInstanceOf(BasicInputException.class) + .hasMessageContaining( + String.format(BasicInputExceptionMessageFormat.TOO_LONG_FORMAT.getFormat(), "λ‚ μ§œ")); + } + + @DisplayName("곡백 제거 ν›„ μ£Όλ¬Έλ‚΄μ—­ 길이가 1000κΈ€μž 이상이면, μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @Test + void 곡백_포함_μ£Όλ¬Έλ‚΄μ—­_μž…λ ₯값이_1000κΈ€μž_이상이면_μ˜ˆμ™Έ_λ°œμƒ() { + String safeOrdersInput = "타 파 슀 - 4" + " ".repeat(200); + String illegalOrdersInput = "μ‹œμ €μƒλŸ¬λ“œ-3" + "x".repeat(1000); + assertThat(inputParser.parseOrders(safeOrdersInput)).isEqualTo(Collections.singletonMap("νƒ€νŒŒμŠ€", 4)); + assertThatThrownBy(() -> inputParser.parseOrders(illegalOrdersInput)) + .isInstanceOf(BasicInputException.class) + .hasMessageContaining( + BasicInputExceptionMessageFormat.TOO_LONG_WITH_BLANKS_FORMAT.getFormat(), "μ£Όλ¬Έ"); + } +} \ No newline at end of file From ce6e107c5c943bcb1cf9179369bc9baae569828d Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 18:00:22 +0900 Subject: [PATCH 83/89] test: add test code for DayInputValidator --- .../christmas/parser/InputParserTest.java | 10 ---- .../validator/DayInputValidatorTest.java | 59 +++++++++++++++++++ .../MenuCountInputValidatorTest.java | 4 ++ .../validator/MenuNameInputValidatorTest.java | 4 ++ .../validator/OrderInputValidatorTest.java | 4 ++ .../validator/OrdersInputValidatorTest.java | 4 ++ 6 files changed, 75 insertions(+), 10 deletions(-) create mode 100644 src/test/java/christmas/validator/DayInputValidatorTest.java create mode 100644 src/test/java/christmas/validator/MenuCountInputValidatorTest.java create mode 100644 src/test/java/christmas/validator/MenuNameInputValidatorTest.java create mode 100644 src/test/java/christmas/validator/OrderInputValidatorTest.java create mode 100644 src/test/java/christmas/validator/OrdersInputValidatorTest.java diff --git a/src/test/java/christmas/parser/InputParserTest.java b/src/test/java/christmas/parser/InputParserTest.java index 840be0e..3c3d91e 100644 --- a/src/test/java/christmas/parser/InputParserTest.java +++ b/src/test/java/christmas/parser/InputParserTest.java @@ -49,16 +49,6 @@ void setUp() { String.format(BasicInputExceptionMessageFormat.TOO_LONG_WITH_BLANKS_FORMAT.getFormat(), "λ‚ μ§œ")); } - @DisplayName("곡백 제거 ν›„ λ‚ μ§œ 길이가 3κΈ€μž 이상이면, μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") - @ParameterizedTest - @CsvSource(value = {" 0 3 0 ", "0 0 2", "0 0 0 0 4"}) - void 곡백_제거_ν›„_μž…λ ₯값이_3κΈ€μž_이상이면_μ˜ˆμ™Έ_λ°œμƒ(String userInput) { - assertThatThrownBy(() -> inputParser.parseReservationDay(userInput)) - .isInstanceOf(BasicInputException.class) - .hasMessageContaining( - String.format(BasicInputExceptionMessageFormat.TOO_LONG_FORMAT.getFormat(), "λ‚ μ§œ")); - } - @DisplayName("곡백 제거 ν›„ μ£Όλ¬Έλ‚΄μ—­ 길이가 1000κΈ€μž 이상이면, μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") @Test void 곡백_포함_μ£Όλ¬Έλ‚΄μ—­_μž…λ ₯값이_1000κΈ€μž_이상이면_μ˜ˆμ™Έ_λ°œμƒ() { diff --git a/src/test/java/christmas/validator/DayInputValidatorTest.java b/src/test/java/christmas/validator/DayInputValidatorTest.java new file mode 100644 index 0000000..a72def7 --- /dev/null +++ b/src/test/java/christmas/validator/DayInputValidatorTest.java @@ -0,0 +1,59 @@ +package christmas.validator; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import christmas.view.input.exception.BasicInputException; +import christmas.view.input.exception.DayInputException; +import christmas.view.input.exception.message.BasicInputExceptionMessageFormat; +import christmas.view.input.exception.message.DayInputExceptionMessage; +import christmas.view.input.validator.DayInputValidator; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +public class DayInputValidatorTest { + private DayInputValidator dayInputValidator; + + @BeforeEach + void setUp() { + dayInputValidator = new DayInputValidator(); + } + + @DisplayName("μ˜ˆμ•½ λ‚ μ§œκ°€ λΉ„μ–΄μžˆλŠ” μž…λ ₯값일 λ•Œ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @Test + void μ˜ˆμ•½_λ‚ μ§œκ°€_λΉ„μ–΄μžˆλŠ”_κ°’μΌλ•Œ_μ˜ˆμ™Έ_λ°œμƒ() { + assertThatThrownBy(() -> dayInputValidator.validate("")) + .isInstanceOf(BasicInputException.class) + .hasMessageContaining(String.format(BasicInputExceptionMessageFormat.EMPTY_FORMAT.getFormat(), "λ‚ μ§œ")); + } + + @DisplayName("곡백 제거 ν›„ λ‚ μ§œ 길이가 3κΈ€μž 이상이면, μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @ParameterizedTest + @CsvSource(value = {" 0 3 0 ", "0 0 2", "0 0 0 0 4"}) + void 곡백_제거_ν›„_μž…λ ₯값이_3κΈ€μž_이상이면_μ˜ˆμ™Έ_λ°œμƒ(String userInput) { + assertThatThrownBy(() -> dayInputValidator.validate(userInput)) + .isInstanceOf(BasicInputException.class) + .hasMessageContaining( + String.format(BasicInputExceptionMessageFormat.TOO_LONG_FORMAT.getFormat(), "λ‚ μ§œ")); + } + + @DisplayName("μ˜ˆμ•½ λ‚ μ§œκ°€ μˆ«μžν˜•μ‹μ΄ μ•„λ‹Œ μž…λ ₯값일 λ•Œ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @ParameterizedTest + @CsvSource(value = {"1a", "1s", "kw", "@!", "-", "a-", "dy", "!a"}) + void μ˜ˆμ•½_λ‚ μ§œκ°€_숫자_ν˜•μ‹μ΄_μ•„λ‹Œ_μž…λ ₯값이면_μ˜ˆμ™Έ_λ°œμƒ(String userInput) { + assertThatThrownBy(() -> dayInputValidator.validate(userInput)) + .isInstanceOf(DayInputException.class) + .hasMessageContaining(DayInputExceptionMessage.NOT_NUMERIC_TYPE.getMessage()); + } + + @DisplayName("μ˜ˆμ•½ λ‚ μ§œκ°€ μ–‘μˆ˜κ°€ μ•„λ‹Œ 숫자일 λ•Œ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @ParameterizedTest + @CsvSource(value = {"-1", "-2", "-5", "-7", "-9", "-8", "-3", "-4"}) + void μ˜ˆμ•½_λ‚ μ§œκ°€_μ–‘μˆ˜κ°€_μ•„λ‹Œ_숫자이면_μ˜ˆμ™Έ_λ°œμƒ(String userInput) { + assertThatThrownBy(() -> dayInputValidator.validate(userInput)) + .isInstanceOf(DayInputException.class) + .hasMessageContaining(DayInputExceptionMessage.NOT_POSITIVE.getMessage()); + } +} \ No newline at end of file diff --git a/src/test/java/christmas/validator/MenuCountInputValidatorTest.java b/src/test/java/christmas/validator/MenuCountInputValidatorTest.java new file mode 100644 index 0000000..3efe0f3 --- /dev/null +++ b/src/test/java/christmas/validator/MenuCountInputValidatorTest.java @@ -0,0 +1,4 @@ +package christmas.validator; + +public class MenuCountInputValidatorTest { +} diff --git a/src/test/java/christmas/validator/MenuNameInputValidatorTest.java b/src/test/java/christmas/validator/MenuNameInputValidatorTest.java new file mode 100644 index 0000000..e026e65 --- /dev/null +++ b/src/test/java/christmas/validator/MenuNameInputValidatorTest.java @@ -0,0 +1,4 @@ +package christmas.validator; + +public class MenuNameInputValidatorTest { +} diff --git a/src/test/java/christmas/validator/OrderInputValidatorTest.java b/src/test/java/christmas/validator/OrderInputValidatorTest.java new file mode 100644 index 0000000..cad1b5a --- /dev/null +++ b/src/test/java/christmas/validator/OrderInputValidatorTest.java @@ -0,0 +1,4 @@ +package christmas.validator; + +public class OrderInputValidatorTest { +} diff --git a/src/test/java/christmas/validator/OrdersInputValidatorTest.java b/src/test/java/christmas/validator/OrdersInputValidatorTest.java new file mode 100644 index 0000000..c9ecbc1 --- /dev/null +++ b/src/test/java/christmas/validator/OrdersInputValidatorTest.java @@ -0,0 +1,4 @@ +package christmas.validator; + +public class OrdersInputValidatorTest { +} From 3f98a764ff938cf40fcb2b743f80e1e567be2cee Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 18:19:37 +0900 Subject: [PATCH 84/89] test: add test code for OrdersInputValidator --- .../christmas/parser/InputParserTest.java | 12 ----- .../MenuCountInputValidatorTest.java | 2 +- .../validator/MenuNameInputValidatorTest.java | 2 +- .../validator/OrderInputValidatorTest.java | 2 +- .../validator/OrdersInputValidatorTest.java | 53 ++++++++++++++++++- 5 files changed, 55 insertions(+), 16 deletions(-) diff --git a/src/test/java/christmas/parser/InputParserTest.java b/src/test/java/christmas/parser/InputParserTest.java index 3c3d91e..05060d4 100644 --- a/src/test/java/christmas/parser/InputParserTest.java +++ b/src/test/java/christmas/parser/InputParserTest.java @@ -48,16 +48,4 @@ void setUp() { .hasMessageContaining( String.format(BasicInputExceptionMessageFormat.TOO_LONG_WITH_BLANKS_FORMAT.getFormat(), "λ‚ μ§œ")); } - - @DisplayName("곡백 제거 ν›„ μ£Όλ¬Έλ‚΄μ—­ 길이가 1000κΈ€μž 이상이면, μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") - @Test - void 곡백_포함_μ£Όλ¬Έλ‚΄μ—­_μž…λ ₯값이_1000κΈ€μž_이상이면_μ˜ˆμ™Έ_λ°œμƒ() { - String safeOrdersInput = "타 파 슀 - 4" + " ".repeat(200); - String illegalOrdersInput = "μ‹œμ €μƒλŸ¬λ“œ-3" + "x".repeat(1000); - assertThat(inputParser.parseOrders(safeOrdersInput)).isEqualTo(Collections.singletonMap("νƒ€νŒŒμŠ€", 4)); - assertThatThrownBy(() -> inputParser.parseOrders(illegalOrdersInput)) - .isInstanceOf(BasicInputException.class) - .hasMessageContaining( - BasicInputExceptionMessageFormat.TOO_LONG_WITH_BLANKS_FORMAT.getFormat(), "μ£Όλ¬Έ"); - } } \ No newline at end of file diff --git a/src/test/java/christmas/validator/MenuCountInputValidatorTest.java b/src/test/java/christmas/validator/MenuCountInputValidatorTest.java index 3efe0f3..382b99d 100644 --- a/src/test/java/christmas/validator/MenuCountInputValidatorTest.java +++ b/src/test/java/christmas/validator/MenuCountInputValidatorTest.java @@ -1,4 +1,4 @@ package christmas.validator; public class MenuCountInputValidatorTest { -} +} \ No newline at end of file diff --git a/src/test/java/christmas/validator/MenuNameInputValidatorTest.java b/src/test/java/christmas/validator/MenuNameInputValidatorTest.java index e026e65..6e236eb 100644 --- a/src/test/java/christmas/validator/MenuNameInputValidatorTest.java +++ b/src/test/java/christmas/validator/MenuNameInputValidatorTest.java @@ -1,4 +1,4 @@ package christmas.validator; public class MenuNameInputValidatorTest { -} +} \ No newline at end of file diff --git a/src/test/java/christmas/validator/OrderInputValidatorTest.java b/src/test/java/christmas/validator/OrderInputValidatorTest.java index cad1b5a..4af529c 100644 --- a/src/test/java/christmas/validator/OrderInputValidatorTest.java +++ b/src/test/java/christmas/validator/OrderInputValidatorTest.java @@ -1,4 +1,4 @@ package christmas.validator; public class OrderInputValidatorTest { -} +} \ No newline at end of file diff --git a/src/test/java/christmas/validator/OrdersInputValidatorTest.java b/src/test/java/christmas/validator/OrdersInputValidatorTest.java index c9ecbc1..a5e2f8c 100644 --- a/src/test/java/christmas/validator/OrdersInputValidatorTest.java +++ b/src/test/java/christmas/validator/OrdersInputValidatorTest.java @@ -1,4 +1,55 @@ package christmas.validator; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import christmas.view.input.exception.BasicInputException; +import christmas.view.input.exception.OrdersInputException; +import christmas.view.input.exception.message.BasicInputExceptionMessageFormat; +import christmas.view.input.exception.message.OrdersInputExceptionMessage; +import christmas.view.input.validator.OrdersInputValidator; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + public class OrdersInputValidatorTest { -} + private OrdersInputValidator ordersInputValidator; + + @BeforeEach + void setUp() { + ordersInputValidator = new OrdersInputValidator(); + } + + @DisplayName("μ£Όλ¬Έ 내역이 λΉ„μ–΄μžˆλŠ” μž…λ ₯값일 λ•Œ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @Test + void μ£Όλ¬Έ_내역이_λΉ„μ–΄μžˆλŠ”_κ°’μΌλ•Œ_μ˜ˆμ™Έ_λ°œμƒ() { + assertThatThrownBy(() -> ordersInputValidator.preValidate("")) + .isInstanceOf(BasicInputException.class) + .hasMessageContaining(String.format(BasicInputExceptionMessageFormat.EMPTY_FORMAT.getFormat(), "μ£Όλ¬Έ")); + } + + @DisplayName("곡백 제거 ν›„ μ£Όλ¬Έ λ‚΄μ—­ 길이가 1000κΈ€μž 이상이면, μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @Test + void 곡백_제거_ν›„_μ£Όλ¬Έλ‚΄μ—­_μž…λ ₯값이_1000κΈ€μž_이상이면_μ˜ˆμ™Έ_λ°œμƒ() { + String illegalOrdersInput = "μ‹œμ €μƒλŸ¬λ“œ-1,".repeat(200); + assertThatThrownBy(() -> ordersInputValidator.preValidate(illegalOrdersInput)) + .isInstanceOf(BasicInputException.class) + .hasMessageContaining( + BasicInputExceptionMessageFormat.TOO_LONG_FORMAT.getFormat(), "μ£Όλ¬Έ"); + } + + @DisplayName("μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ€‘λ³΅λœ μ£Όλ¬Έ 메뉴가 μ‘΄μž¬ν•˜λ©΄ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @ParameterizedTest + @ValueSource(strings = { + "νƒ€νŒŒμŠ€-1,νƒ€νŒŒμŠ€-4", + "νƒ€νŒŒμŠ€-1,μ΄ˆμ½”μΌ€μ΄ν¬-2,λ ˆλ“œμ™€μΈ-1,μƒ΄νŽ˜μΈ-1,μ•„μ΄μŠ€ν¬λ¦Ό-2,ν‹°λ³ΈμŠ€ν…Œμ΄ν¬-1,μ΄ˆμ½”μΌ€μ΄ν¬-1", + "μ΄ˆμ½”μΌ€μ΄ν¬-1,μ΄ˆμ½”μΌ€μ΄ν¬-1,μ΄ˆμ½”μΌ€μ΄ν¬-1,μ΄ˆμ½”μΌ€μ΄ν¬-1,μ΄ˆμ½”μΌ€μ΄ν¬-1,μ΄ˆμ½”μΌ€μ΄ν¬-1", + "μ‹œμ €μƒλŸ¬λ“œ-1,μ–‘μ†‘μ΄μˆ˜ν”„-1,제둜콜라-1,μƒ΄νŽ˜μΈ-1,ν¬λ¦¬μŠ€λ§ˆμŠ€νŒŒμŠ€νƒ€-2,ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-1,μ‹œμ €μƒλŸ¬λ“œ-4" + }) + void 쀑볡_μ£Όλ¬Έ_메뉴_쑴재_μ‹œ_μ˜ˆμ™Έ_λ°œμƒ(String userInput) { + assertThatThrownBy(() -> ordersInputValidator.postValidate(userInput)) + .isInstanceOf(OrdersInputException.class) + .hasMessageContaining(OrdersInputExceptionMessage.DUPLICATED_MENUS.getMessage()); + } +} \ No newline at end of file From c8ba2efdda3c30e5c689afdc8c8806e7669b63ff Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 18:26:46 +0900 Subject: [PATCH 85/89] test: add test code for MenuNameInputValidator --- .../validator/DayInputValidatorTest.java | 2 +- .../validator/MenuNameInputValidatorTest.java | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/test/java/christmas/validator/DayInputValidatorTest.java b/src/test/java/christmas/validator/DayInputValidatorTest.java index a72def7..89d7526 100644 --- a/src/test/java/christmas/validator/DayInputValidatorTest.java +++ b/src/test/java/christmas/validator/DayInputValidatorTest.java @@ -32,7 +32,7 @@ void setUp() { @DisplayName("곡백 제거 ν›„ λ‚ μ§œ 길이가 3κΈ€μž 이상이면, μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") @ParameterizedTest @CsvSource(value = {" 0 3 0 ", "0 0 2", "0 0 0 0 4"}) - void 곡백_제거_ν›„_μž…λ ₯값이_3κΈ€μž_이상이면_μ˜ˆμ™Έ_λ°œμƒ(String userInput) { + void 곡백_제거_ν›„_μ˜ˆμ•½_λ‚ μ§œ_μž…λ ₯값이_3κΈ€μž_이상이면_μ˜ˆμ™Έ_λ°œμƒ(String userInput) { assertThatThrownBy(() -> dayInputValidator.validate(userInput)) .isInstanceOf(BasicInputException.class) .hasMessageContaining( diff --git a/src/test/java/christmas/validator/MenuNameInputValidatorTest.java b/src/test/java/christmas/validator/MenuNameInputValidatorTest.java index 6e236eb..874a542 100644 --- a/src/test/java/christmas/validator/MenuNameInputValidatorTest.java +++ b/src/test/java/christmas/validator/MenuNameInputValidatorTest.java @@ -1,4 +1,41 @@ package christmas.validator; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import christmas.view.input.exception.BasicInputException; +import christmas.view.input.exception.message.BasicInputExceptionMessageFormat; +import christmas.view.input.validator.MenuNameInputValidator; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + public class MenuNameInputValidatorTest { + private MenuNameInputValidator menuNameInputValidator; + + @BeforeEach + void setUp() { + menuNameInputValidator = new MenuNameInputValidator(); + } + + @DisplayName("메뉴 이름이 λΉ„μ–΄μžˆλŠ” μž…λ ₯값일 λ•Œ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @Test + void 메뉴_이름이_λΉ„μ–΄μžˆλŠ”_κ°’μΌλ•Œ_μ˜ˆμ™Έ_λ°œμƒ() { + assertThatThrownBy(() -> menuNameInputValidator.validate("")) + .isInstanceOf(BasicInputException.class) + .hasMessageContaining(String.format(BasicInputExceptionMessageFormat.EMPTY_FORMAT.getFormat(), "μ£Όλ¬Έ")); + } + + @DisplayName("곡백 제거 ν›„ 메뉴 이름 길이가 31κΈ€μž 이상이면, μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @ParameterizedTest + @ValueSource(strings = {"νƒ€νŒŒμŠ€ νƒ€νŒŒμŠ€ νƒ€νŒŒμŠ€ νƒ€νŒŒμŠ€ νƒ€νŒŒμŠ€ νƒ€νŒŒμŠ€ νƒ€νŒŒμŠ€ νƒ€νŒŒμŠ€ νƒ€νŒŒμŠ€ νƒ€νŒŒμŠ€ νƒ€νŒŒμŠ€ νƒ€νŒŒμŠ€ νƒ€νŒŒμŠ€ νƒ€νŒŒμŠ€ νƒ€νŒŒμŠ€ ", + "ν‹°λ³ΈμŠ€ν…Œμ΄ν¬ ν‹°λ³ΈμŠ€ν…Œμ΄ν¬ ν‹°λ³ΈμŠ€ν…Œμ΄ν¬ ν‹°λ³ΈμŠ€ν…Œμ΄ν¬ ν‹°λ³ΈμŠ€ν…Œμ΄ν¬ ν‹°λ³ΈμŠ€ν…Œμ΄ν¬ ν‹°λ³ΈμŠ€ν…Œμ΄ν¬ " + , "λ ˆλ“œμ™€μΈ λ ˆλ“œμ™€μΈ λ ˆλ“œμ™€μΈ λ ˆλ“œμ™€μΈ λ ˆλ“œμ™€μΈ λ ˆλ“œμ™€μΈ λ ˆλ“œμ™€μΈ λ ˆλ“œμ™€μΈ "}) + void 곡백_제거_ν›„_메뉴_이름_길이가_31κΈ€μž_이상이면_μ˜ˆμ™Έ_λ°œμƒ(String userInput) { + assertThatThrownBy(() -> menuNameInputValidator.validate(userInput)) + .isInstanceOf(BasicInputException.class) + .hasMessageContaining( + String.format(BasicInputExceptionMessageFormat.TOO_LONG_FORMAT.getFormat(), "μ£Όλ¬Έ")); + } } \ No newline at end of file From 22557d662d694412abc7cc91fceb6ed01e6e8c7b Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 18:34:41 +0900 Subject: [PATCH 86/89] test: add test code for MenuCountInputValidator --- .../MenuCountInputValidatorTest.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/src/test/java/christmas/validator/MenuCountInputValidatorTest.java b/src/test/java/christmas/validator/MenuCountInputValidatorTest.java index 382b99d..a735b95 100644 --- a/src/test/java/christmas/validator/MenuCountInputValidatorTest.java +++ b/src/test/java/christmas/validator/MenuCountInputValidatorTest.java @@ -1,4 +1,59 @@ package christmas.validator; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import christmas.view.input.exception.BasicInputException; +import christmas.view.input.exception.OrdersInputException; +import christmas.view.input.exception.message.BasicInputExceptionMessageFormat; +import christmas.view.input.exception.message.OrdersInputExceptionMessage; +import christmas.view.input.validator.MenuCountInputValidator; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + public class MenuCountInputValidatorTest { + private MenuCountInputValidator menuCountInputValidator; + + @BeforeEach + void setUp() { + menuCountInputValidator = new MenuCountInputValidator(); + } + + @DisplayName("메뉴 κ°œμˆ˜κ°€ λΉ„μ–΄μžˆλŠ” μž…λ ₯값일 λ•Œ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @Test + void 메뉴_κ°œμˆ˜κ°€_λΉ„μ–΄μžˆλŠ”_κ°’μΌλ•Œ_μ˜ˆμ™Έ_λ°œμƒ() { + assertThatThrownBy(() -> menuCountInputValidator.validate("")) + .isInstanceOf(BasicInputException.class) + .hasMessageContaining(String.format(BasicInputExceptionMessageFormat.EMPTY_FORMAT.getFormat(), "μ£Όλ¬Έ")); + } + + @DisplayName("곡백 제거 ν›„ 메뉴 κ°œμˆ˜κ°€ 3κΈ€μž 이상이면, μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @ParameterizedTest + @CsvSource(value = {" 1 3 2 ", "4 3 2", "2 5 3 7 4"}) + void 곡백_제거_ν›„_메뉴_개수_μž…λ ₯값이_3κΈ€μž_이상이면_μ˜ˆμ™Έ_λ°œμƒ(String userInput) { + assertThatThrownBy(() -> menuCountInputValidator.validate(userInput)) + .isInstanceOf(BasicInputException.class) + .hasMessageContaining( + String.format(BasicInputExceptionMessageFormat.TOO_LONG_FORMAT.getFormat(), "μ£Όλ¬Έ")); + } + + @DisplayName("메뉴 κ°œμˆ˜κ°€ μˆ«μžν˜•μ‹μ΄ μ•„λ‹Œ μž…λ ₯값일 λ•Œ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @ParameterizedTest + @CsvSource(value = {"a1", "s1", "wk", "!@", "-/", "-a", "yd", "a!"}) + void 메뉴_κ°œμˆ˜κ°€_숫자_ν˜•μ‹μ΄_μ•„λ‹Œ_μž…λ ₯값이면_μ˜ˆμ™Έ_λ°œμƒ(String userInput) { + assertThatThrownBy(() -> menuCountInputValidator.validate(userInput)) + .isInstanceOf(OrdersInputException.class) + .hasMessageContaining(OrdersInputExceptionMessage.NOT_NUMERIC_TYPE.getMessage()); + } + + @DisplayName("메뉴 κ°œμˆ˜κ°€ μ–‘μˆ˜κ°€ μ•„λ‹Œ 숫자일 λ•Œ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @ParameterizedTest + @CsvSource(value = {"-1", "-2", "-5", "-7", "-9", "-8", "-3", "-4"}) + void 메뉴_κ°œμˆ˜κ°€_μ–‘μˆ˜κ°€_μ•„λ‹Œ_숫자이면_μ˜ˆμ™Έ_λ°œμƒ(String userInput) { + assertThatThrownBy(() -> menuCountInputValidator.validate(userInput)) + .isInstanceOf(OrdersInputException.class) + .hasMessageContaining(OrdersInputExceptionMessage.NOT_POSITIVE.getMessage()); + } } \ No newline at end of file From 067626c9cd68170fe41ee978858b0a6d120902e8 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 18:49:03 +0900 Subject: [PATCH 87/89] test: add test code for OrderInputValidator --- .../input/constant/InputNumberConstant.java | 2 +- .../validator/OrderInputValidatorTest.java | 58 +++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/main/java/christmas/view/input/constant/InputNumberConstant.java b/src/main/java/christmas/view/input/constant/InputNumberConstant.java index 099b5c0..d9d8df0 100644 --- a/src/main/java/christmas/view/input/constant/InputNumberConstant.java +++ b/src/main/java/christmas/view/input/constant/InputNumberConstant.java @@ -3,7 +3,7 @@ public enum InputNumberConstant { APPLICATION_MAX_INPUT_LENGTH(2000), ORDERS_MAX_INPUT_LENGTH(1000), - ORDER_MAX_INPUT_LENGTH(50), + ORDER_MAX_INPUT_LENGTH(33), MENU_NAME_MAX_INPUT_LENGTH(30), MENU_COUNT_MAX_INPUT_LENGTH(2), DAY_MAX_INPUT_LENGTH(2), diff --git a/src/test/java/christmas/validator/OrderInputValidatorTest.java b/src/test/java/christmas/validator/OrderInputValidatorTest.java index 4af529c..3822408 100644 --- a/src/test/java/christmas/validator/OrderInputValidatorTest.java +++ b/src/test/java/christmas/validator/OrderInputValidatorTest.java @@ -1,4 +1,62 @@ package christmas.validator; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import christmas.view.input.exception.BasicInputException; +import christmas.view.input.exception.OrdersInputException; +import christmas.view.input.exception.message.BasicInputExceptionMessageFormat; +import christmas.view.input.exception.message.OrdersInputExceptionMessage; +import christmas.view.input.validator.OrderInputValidator; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; + public class OrderInputValidatorTest { + private OrderInputValidator orderInputValidator; + + @BeforeEach + void setUp() { + orderInputValidator = new OrderInputValidator(); + } + + @DisplayName("주문이 λΉ„μ–΄μžˆλŠ” μž…λ ₯값일 λ•Œ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @Test + void 주문이_λΉ„μ–΄μžˆλŠ”_κ°’μΌλ•Œ_μ˜ˆμ™Έ_λ°œμƒ() { + assertThatThrownBy(() -> orderInputValidator.validate("")) + .isInstanceOf(BasicInputException.class) + .hasMessageContaining(String.format(BasicInputExceptionMessageFormat.EMPTY_FORMAT.getFormat(), "μ£Όλ¬Έ")); + } + + @DisplayName("곡백 제거 ν›„ μ£Όλ¬Έ 길이가 34κΈ€μž 이상이면, μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @ParameterizedTest + @CsvSource(value = {"νƒ€νŒŒμŠ€νƒ€νŒŒμŠ€νƒ€νŒŒμŠ€νƒ€νŒŒμŠ€νƒ€νŒŒμŠ€νƒ€νŒŒμŠ€νƒ€νŒŒμŠ€νƒ€νŒŒμŠ€νƒ€νŒŒμŠ€νƒ€νŒŒμŠ€νƒ€νŒŒμŠ€νƒ€νŒŒμŠ€νƒ€νŒŒμŠ€νƒ€νŒŒμŠ€νƒ€νŒŒμŠ€-13", + "ν‹°λ³ΈμŠ€ν…Œμ΄ν¬ν‹°λ³ΈμŠ€ν…Œμ΄ν¬ν‹°λ³ΈμŠ€ν…Œμ΄ν¬ν‹°λ³ΈμŠ€ν…Œμ΄ν¬ν‹°λ³ΈμŠ€ν…Œμ΄ν¬ν‹°λ³ΈμŠ€ν…Œμ΄ν¬-14", + "μ•„μ΄μŠ€ν¬λ¦Όμ•„μ΄μŠ€ν¬λ¦Όμ•„μ΄μŠ€ν¬λ¦Όμ•„μ΄μŠ€ν¬λ¦Όμ•„μ΄μŠ€ν¬λ¦Όμ•„μ΄μŠ€ν¬λ¦Όμ•„μ΄μŠ€ν¬λ¦Όμ•„μ΄μŠ€ν¬λ¦Ό-11"}) + void 곡백_제거_ν›„_μ£Όλ¬Έ_μž…λ ₯값이_34κΈ€μž_이상이면_μ˜ˆμ™Έ_λ°œμƒ(String userInput) { + assertThatThrownBy(() -> orderInputValidator.validate(userInput)) + .isInstanceOf(BasicInputException.class) + .hasMessageContaining( + String.format(BasicInputExceptionMessageFormat.TOO_LONG_FORMAT.getFormat(), "μ£Όλ¬Έ")); + } + + @DisplayName("주문에 κ΅¬λΆ„μž(-)κ°€ ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ©΄ 에외가 λ°œμƒν•œλ‹€.") + @ParameterizedTest + @ValueSource(strings = {"νƒ€νŒŒμŠ€1", "ν‹°λ³ΈμŠ€ν…Œμ΄ν¬~2", "바비큐립@12", "μ•„μ΄μŠ€ν¬λ¦Ό", "μ‹œμ €μƒλŸ¬λ“œ#3", "μ΄ˆμ½”μΌ€μ΄ν¬*4", "제둜콜라!!", "λ ˆλ“œμ™€μΈ$3"}) + void μ£Όλ¬Έ_μž…λ ₯값에_κ΅¬λΆ„μžκ°€_ν¬ν•¨λ˜μ–΄_μžˆμ§€_μ•ŠμœΌλ©΄_μ˜ˆμ™Έ_λ°œμƒ(String userInput) { + assertThatThrownBy(() -> orderInputValidator.validate(userInput)) + .isInstanceOf(OrdersInputException.class) + .hasMessageContaining(OrdersInputExceptionMessage.INVALID_ORDER_FORMAT.getMessage()); + } + + @DisplayName("주문의 λ§ˆμ§€λ§‰ 단어가 κ΅¬λΆ„μž(-)인 경우 μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @ParameterizedTest + @ValueSource(strings = {"νƒ€νŒŒμŠ€1-", "ν‹°λ³ΈμŠ€ν…Œμ΄ν¬-", "ν‹°λ³ΈμŠ€ν…Œμ΄ν¬-1-", "μ‹œμ €μƒλŸ¬λ“œ-", "μ΄ˆμ½”-케이크-"}) + void μ£Όλ¬Έ_μž…λ ₯κ°’μ˜_λ§ˆμ§€λ§‰_단어가_κ΅¬λΆ„μž_이면_μ˜ˆμ™Έ_λ°œμƒ(String userInput) { + assertThatThrownBy(() -> orderInputValidator.validate(userInput)) + .isInstanceOf(OrdersInputException.class) + .hasMessageContaining(OrdersInputExceptionMessage.EMPTY_MENU_COUNT.getMessage()); + } } \ No newline at end of file From 3571d8034b5387abbccdd0e5cf60e1e25cbc8888 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 18:57:24 +0900 Subject: [PATCH 88/89] refactor: remove magic literal in test code --- .../java/christmas/parser/InputParserTest.java | 18 ++++++++++++++++-- .../validator/DayInputValidatorTest.java | 7 +++++-- .../validator/MenuCountInputValidatorTest.java | 7 +++++-- .../validator/MenuNameInputValidatorTest.java | 7 +++++-- .../validator/OrderInputValidatorTest.java | 7 +++++-- .../validator/OrdersInputValidatorTest.java | 6 ++++-- 6 files changed, 40 insertions(+), 12 deletions(-) diff --git a/src/test/java/christmas/parser/InputParserTest.java b/src/test/java/christmas/parser/InputParserTest.java index 05060d4..6a6d205 100644 --- a/src/test/java/christmas/parser/InputParserTest.java +++ b/src/test/java/christmas/parser/InputParserTest.java @@ -1,5 +1,7 @@ package christmas.parser; +import static christmas.view.input.constant.InputSymbolConstant.DAY_SYMBOL; +import static christmas.view.input.constant.InputSymbolConstant.ORDER_SYMBOL; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -37,7 +39,7 @@ void setUp() { .isEqualTo(Collections.singletonMap(menuName, menuCount)); } - @DisplayName("곡백 포함 μž…λ ₯κ°’μ˜ 길이가 2000κΈ€μž 이상이면, μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @DisplayName("곡백 포함 λ‚ μ§œ μž…λ ₯κ°’μ˜ 길이가 2000κΈ€μž 이상이면, μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") @Test void 곡백_포함_λ‚ μ§œ_μž…λ ₯값이_2000κΈ€μž_이상이면_μ˜ˆμ™Έ_λ°œμƒ() { String safeDayInput = "1" + " ".repeat(1000); @@ -46,6 +48,18 @@ void setUp() { assertThatThrownBy(() -> inputParser.parseReservationDay(illegalDayInput)) .isInstanceOf(BasicInputException.class) .hasMessageContaining( - String.format(BasicInputExceptionMessageFormat.TOO_LONG_WITH_BLANKS_FORMAT.getFormat(), "λ‚ μ§œ")); + String.format(BasicInputExceptionMessageFormat.TOO_LONG_WITH_BLANKS_FORMAT.getFormat(), + DAY_SYMBOL.getSymbol())); + } + + @DisplayName("곡백 포함 μ£Όλ¬Έλ‚΄μ—­ μž…λ ₯κ°’μ˜ 길이가 2000κΈ€μž 이상이면, μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @Test + void 곡백_포함_μ£Όλ¬Έλ‚΄μ—­_μž…λ ₯값이_2000κΈ€μž_이상이면_μ˜ˆμ™Έ_λ°œμƒ() { + String userInput = "νƒ€νŒŒμŠ€-1" + " ".repeat(2000); + assertThatThrownBy(() -> inputParser.parseOrders(userInput)) + .isInstanceOf(BasicInputException.class) + .hasMessageContaining( + String.format(BasicInputExceptionMessageFormat.TOO_LONG_WITH_BLANKS_FORMAT.getFormat(), + ORDER_SYMBOL.getSymbol())); } } \ No newline at end of file diff --git a/src/test/java/christmas/validator/DayInputValidatorTest.java b/src/test/java/christmas/validator/DayInputValidatorTest.java index 89d7526..b61452d 100644 --- a/src/test/java/christmas/validator/DayInputValidatorTest.java +++ b/src/test/java/christmas/validator/DayInputValidatorTest.java @@ -1,5 +1,6 @@ package christmas.validator; +import static christmas.view.input.constant.InputSymbolConstant.DAY_SYMBOL; import static org.assertj.core.api.Assertions.assertThatThrownBy; import christmas.view.input.exception.BasicInputException; @@ -26,7 +27,8 @@ void setUp() { void μ˜ˆμ•½_λ‚ μ§œκ°€_λΉ„μ–΄μžˆλŠ”_κ°’μΌλ•Œ_μ˜ˆμ™Έ_λ°œμƒ() { assertThatThrownBy(() -> dayInputValidator.validate("")) .isInstanceOf(BasicInputException.class) - .hasMessageContaining(String.format(BasicInputExceptionMessageFormat.EMPTY_FORMAT.getFormat(), "λ‚ μ§œ")); + .hasMessageContaining(String.format(BasicInputExceptionMessageFormat.EMPTY_FORMAT.getFormat(), + DAY_SYMBOL.getSymbol())); } @DisplayName("곡백 제거 ν›„ λ‚ μ§œ 길이가 3κΈ€μž 이상이면, μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") @@ -36,7 +38,8 @@ void setUp() { assertThatThrownBy(() -> dayInputValidator.validate(userInput)) .isInstanceOf(BasicInputException.class) .hasMessageContaining( - String.format(BasicInputExceptionMessageFormat.TOO_LONG_FORMAT.getFormat(), "λ‚ μ§œ")); + String.format(BasicInputExceptionMessageFormat.TOO_LONG_FORMAT.getFormat(), + DAY_SYMBOL.getSymbol())); } @DisplayName("μ˜ˆμ•½ λ‚ μ§œκ°€ μˆ«μžν˜•μ‹μ΄ μ•„λ‹Œ μž…λ ₯값일 λ•Œ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") diff --git a/src/test/java/christmas/validator/MenuCountInputValidatorTest.java b/src/test/java/christmas/validator/MenuCountInputValidatorTest.java index a735b95..3d6c818 100644 --- a/src/test/java/christmas/validator/MenuCountInputValidatorTest.java +++ b/src/test/java/christmas/validator/MenuCountInputValidatorTest.java @@ -1,5 +1,6 @@ package christmas.validator; +import static christmas.view.input.constant.InputSymbolConstant.ORDER_SYMBOL; import static org.assertj.core.api.Assertions.assertThatThrownBy; import christmas.view.input.exception.BasicInputException; @@ -26,7 +27,8 @@ void setUp() { void 메뉴_κ°œμˆ˜κ°€_λΉ„μ–΄μžˆλŠ”_κ°’μΌλ•Œ_μ˜ˆμ™Έ_λ°œμƒ() { assertThatThrownBy(() -> menuCountInputValidator.validate("")) .isInstanceOf(BasicInputException.class) - .hasMessageContaining(String.format(BasicInputExceptionMessageFormat.EMPTY_FORMAT.getFormat(), "μ£Όλ¬Έ")); + .hasMessageContaining(String.format(BasicInputExceptionMessageFormat.EMPTY_FORMAT.getFormat(), + ORDER_SYMBOL.getSymbol())); } @DisplayName("곡백 제거 ν›„ 메뉴 κ°œμˆ˜κ°€ 3κΈ€μž 이상이면, μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") @@ -36,7 +38,8 @@ void setUp() { assertThatThrownBy(() -> menuCountInputValidator.validate(userInput)) .isInstanceOf(BasicInputException.class) .hasMessageContaining( - String.format(BasicInputExceptionMessageFormat.TOO_LONG_FORMAT.getFormat(), "μ£Όλ¬Έ")); + String.format(BasicInputExceptionMessageFormat.TOO_LONG_FORMAT.getFormat(), + ORDER_SYMBOL.getSymbol())); } @DisplayName("메뉴 κ°œμˆ˜κ°€ μˆ«μžν˜•μ‹μ΄ μ•„λ‹Œ μž…λ ₯값일 λ•Œ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") diff --git a/src/test/java/christmas/validator/MenuNameInputValidatorTest.java b/src/test/java/christmas/validator/MenuNameInputValidatorTest.java index 874a542..ee7878a 100644 --- a/src/test/java/christmas/validator/MenuNameInputValidatorTest.java +++ b/src/test/java/christmas/validator/MenuNameInputValidatorTest.java @@ -1,5 +1,6 @@ package christmas.validator; +import static christmas.view.input.constant.InputSymbolConstant.ORDER_SYMBOL; import static org.assertj.core.api.Assertions.assertThatThrownBy; import christmas.view.input.exception.BasicInputException; @@ -24,7 +25,8 @@ void setUp() { void 메뉴_이름이_λΉ„μ–΄μžˆλŠ”_κ°’μΌλ•Œ_μ˜ˆμ™Έ_λ°œμƒ() { assertThatThrownBy(() -> menuNameInputValidator.validate("")) .isInstanceOf(BasicInputException.class) - .hasMessageContaining(String.format(BasicInputExceptionMessageFormat.EMPTY_FORMAT.getFormat(), "μ£Όλ¬Έ")); + .hasMessageContaining(String.format(BasicInputExceptionMessageFormat.EMPTY_FORMAT.getFormat(), + ORDER_SYMBOL.getSymbol())); } @DisplayName("곡백 제거 ν›„ 메뉴 이름 길이가 31κΈ€μž 이상이면, μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") @@ -36,6 +38,7 @@ void setUp() { assertThatThrownBy(() -> menuNameInputValidator.validate(userInput)) .isInstanceOf(BasicInputException.class) .hasMessageContaining( - String.format(BasicInputExceptionMessageFormat.TOO_LONG_FORMAT.getFormat(), "μ£Όλ¬Έ")); + String.format(BasicInputExceptionMessageFormat.TOO_LONG_FORMAT.getFormat(), + ORDER_SYMBOL.getSymbol())); } } \ No newline at end of file diff --git a/src/test/java/christmas/validator/OrderInputValidatorTest.java b/src/test/java/christmas/validator/OrderInputValidatorTest.java index 3822408..19c1d3a 100644 --- a/src/test/java/christmas/validator/OrderInputValidatorTest.java +++ b/src/test/java/christmas/validator/OrderInputValidatorTest.java @@ -1,5 +1,6 @@ package christmas.validator; +import static christmas.view.input.constant.InputSymbolConstant.ORDER_SYMBOL; import static org.assertj.core.api.Assertions.assertThatThrownBy; import christmas.view.input.exception.BasicInputException; @@ -27,7 +28,8 @@ void setUp() { void 주문이_λΉ„μ–΄μžˆλŠ”_κ°’μΌλ•Œ_μ˜ˆμ™Έ_λ°œμƒ() { assertThatThrownBy(() -> orderInputValidator.validate("")) .isInstanceOf(BasicInputException.class) - .hasMessageContaining(String.format(BasicInputExceptionMessageFormat.EMPTY_FORMAT.getFormat(), "μ£Όλ¬Έ")); + .hasMessageContaining(String.format(BasicInputExceptionMessageFormat.EMPTY_FORMAT.getFormat(), + ORDER_SYMBOL.getSymbol())); } @DisplayName("곡백 제거 ν›„ μ£Όλ¬Έ 길이가 34κΈ€μž 이상이면, μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") @@ -39,7 +41,8 @@ void setUp() { assertThatThrownBy(() -> orderInputValidator.validate(userInput)) .isInstanceOf(BasicInputException.class) .hasMessageContaining( - String.format(BasicInputExceptionMessageFormat.TOO_LONG_FORMAT.getFormat(), "μ£Όλ¬Έ")); + String.format(BasicInputExceptionMessageFormat.TOO_LONG_FORMAT.getFormat(), + ORDER_SYMBOL.getSymbol())); } @DisplayName("주문에 κ΅¬λΆ„μž(-)κ°€ ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ©΄ 에외가 λ°œμƒν•œλ‹€.") diff --git a/src/test/java/christmas/validator/OrdersInputValidatorTest.java b/src/test/java/christmas/validator/OrdersInputValidatorTest.java index a5e2f8c..c24df9d 100644 --- a/src/test/java/christmas/validator/OrdersInputValidatorTest.java +++ b/src/test/java/christmas/validator/OrdersInputValidatorTest.java @@ -1,5 +1,6 @@ package christmas.validator; +import static christmas.view.input.constant.InputSymbolConstant.ORDER_SYMBOL; import static org.assertj.core.api.Assertions.assertThatThrownBy; import christmas.view.input.exception.BasicInputException; @@ -26,7 +27,8 @@ void setUp() { void μ£Όλ¬Έ_내역이_λΉ„μ–΄μžˆλŠ”_κ°’μΌλ•Œ_μ˜ˆμ™Έ_λ°œμƒ() { assertThatThrownBy(() -> ordersInputValidator.preValidate("")) .isInstanceOf(BasicInputException.class) - .hasMessageContaining(String.format(BasicInputExceptionMessageFormat.EMPTY_FORMAT.getFormat(), "μ£Όλ¬Έ")); + .hasMessageContaining(String.format(BasicInputExceptionMessageFormat.EMPTY_FORMAT.getFormat(), + ORDER_SYMBOL.getSymbol())); } @DisplayName("곡백 제거 ν›„ μ£Όλ¬Έ λ‚΄μ—­ 길이가 1000κΈ€μž 이상이면, μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") @@ -36,7 +38,7 @@ void setUp() { assertThatThrownBy(() -> ordersInputValidator.preValidate(illegalOrdersInput)) .isInstanceOf(BasicInputException.class) .hasMessageContaining( - BasicInputExceptionMessageFormat.TOO_LONG_FORMAT.getFormat(), "μ£Όλ¬Έ"); + BasicInputExceptionMessageFormat.TOO_LONG_FORMAT.getFormat(), ORDER_SYMBOL.getSymbol()); } @DisplayName("μ£Όλ¬Έ 내역을 μ·¨ν•©ν–ˆμ„ λ•Œ, μ€‘λ³΅λœ μ£Όλ¬Έ 메뉴가 μ‘΄μž¬ν•˜λ©΄ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") From 6acfacf11ccc1e2eda659a85d1bc7d63dc435238 Mon Sep 17 00:00:00 2001 From: wonjun Date: Wed, 15 Nov 2023 22:08:14 +0900 Subject: [PATCH 89/89] docs: update README to explain about application --- docs/README.md | 443 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 441 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index 9017409..336b510 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,331 @@ # πŸŽ… 크리슀마슀 ν”„λ‘œλͺ¨μ…˜ -## πŸ‘¨β€πŸ’» κΈ°λŠ₯ λͺ©λ‘ +### [ λͺ©μ°¨ ] + +#### 1. [ λΉ„μ¦ˆλ‹ˆμŠ€νŒ€ 전달사항 ](#λΉ„μ¦ˆλ‹ˆμŠ€-νŒ€-전달사항) + +- [ν”„λ‘œκ·Έλž¨ κΈ°λŠ₯ μ„€λͺ…](#ν”„λ‘œκ·Έλž¨-κΈ°λŠ₯-μ„€λͺ…) + - [μ˜ˆμ•½ λ‚ μ§œ μž…λ ₯](#μ˜ˆμ•½-λ‚ μ§œ-μž…λ ₯) + - [μ£Όλ¬Έ λ‚΄μ—­ μž…λ ₯](#μ£Όλ¬Έ-λ‚΄μ—­-μž…λ ₯) + - [μ‹€ν–‰ κ²°κ³Ό μ˜ˆμ‹œ](#μ‹€ν–‰-κ²°κ³Ό-μ˜ˆμ‹œ) + +#### 2. [ κ°œλ°œνŒ€ 전달사항 ](#κ°œλ°œνŒ€-전달사항) + +- [κΈ°λŠ₯ λͺ©λ‘](#κΈ°λŠ₯-λͺ©λ‘) +- [ν”„λ‘œκ·Έλž¨ νŒ¨ν‚€μ§€ ꡬ쑰](#νŒ¨ν‚€μ§€-ꡬ쑰) +- [ν”„λ‘œμ νŠΈ μ•„ν‚€ν…μ²˜](#ν”„λ‘œμ νŠΈ-μ•„ν‚€ν…μ²˜) +- [μΆ”ν›„ ν™•μž₯ 및 μ½”λ“œ μž¬μ‚¬μš© μ‹œ 참고사항](#μΆ”ν›„-ν™•μž₯-및-μ½”λ“œ-μž¬μ‚¬μš©-μ‹œ-참고사항) + +#### 3. [ 곡톡 전달 사항 ] + +- [1주일 λ’€ 개발 νšŒμ˜μ—μ„œ λ…Όμ˜ν•˜λ©΄ 쒋을 사항](#1주일-λ’€-개발-νšŒμ˜μ—μ„œ-λ…Όμ˜ν•˜λ©΄-쒋을-사항) + +--- + +## λΉ„μ¦ˆλ‹ˆμŠ€ νŒ€ 전달사항 + +> ### ν”„λ‘œκ·Έλž¨ κΈ°λŠ₯ μ„€λͺ… + +#### μ˜ˆμ•½ λ‚ μ§œ μž…λ ₯ + +#### 1-1. μ˜ˆμ•½ λ‚ μ§œ μž…λ ₯ ( μœ νš¨ν•˜μ§€ μ•Šμ€ μž…λ ₯κ°’ ) + +```bash +μ•ˆλ…•ν•˜μ„Έμš”! μš°ν…Œμ½” 식당 12μ›” 이벀트 ν”Œλž˜λ„ˆμž…λ‹ˆλ‹€. +12μ›” 쀑 식당 λ°©λ¬Έ λ‚ μ§œλŠ” μ–Έμ œμΈκ°€μš”? (숫자만 μž…λ ₯ν•΄ μ£Όμ„Έμš”!) +> +[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”. +12μ›” 쀑 식당 λ°©λ¬Έ λ‚ μ§œλŠ” μ–Έμ œμΈκ°€μš”? (숫자만 μž…λ ₯ν•΄ μ£Όμ„Έμš”!) +>a +[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”. +12μ›” 쀑 식당 λ°©λ¬Έ λ‚ μ§œλŠ” μ–Έμ œμΈκ°€μš”? (숫자만 μž…λ ₯ν•΄ μ£Όμ„Έμš”!) +>40 +[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”. +12μ›” 쀑 식당 λ°©λ¬Έ λ‚ μ§œλŠ” μ–Έμ œμΈκ°€μš”? (숫자만 μž…λ ₯ν•΄ μ£Όμ„Έμš”!) +>-5 +[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚ μ§œμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”. +12μ›” 쀑 식당 λ°©λ¬Έ λ‚ μ§œλŠ” μ–Έμ œμΈκ°€μš”? (숫자만 μž…λ ₯ν•΄ μ£Όμ„Έμš”!) +``` + +#### μœ νš¨ν•˜μ§€ μ•Šμ€ μ˜ˆμ•½λ‚ μ§œ μž…λ ₯ κΈ°μ€€ + +- μ˜ˆμ•½ λ‚ μ§œ μž…λ ₯에 λ‹€μŒκ³Ό 같은 값을 μž…λ ₯ν•  μ‹œ, +
μ—λŸ¬κ°€ λ°œμƒν•˜κ³  μ˜ˆμ•½ λ‚ μ§œλ₯Ό λ‹€μ‹œ μž…λ ₯λ°›μŠ΅λ‹ˆλ‹€. + - λΉ„μ–΄μžˆλŠ” κ°’ + - 숫자 ν˜•μ‹μ΄ μ•„λ‹Œ μž…λ ₯ κ°’ + - 1λΆ€ν„° 31 사이가 μ•„λ‹Œ κ°’ + - 0보닀 μž‘μ€ 숫자 κ°’ + - 곡백 포함 2000κΈ€μž 이상인 κ°’ + - 곡백 제거 ν›„ 3κΈ€μž 이상인 κ°’ + +#### 1-2. μ˜ˆμ•½ λ‚ μ§œ μž…λ ₯ ( μ˜¬λ°”λ₯Έ μž…λ ₯ κ°’ + 곡백을 ν¬ν•¨ν•œ μž…λ ₯ κ°’ ) + +```bash +12μ›” 쀑 식당 λ°©λ¬Έ λ‚ μ§œλŠ” μ–Έμ œμΈκ°€μš”? (숫자만 μž…λ ₯ν•΄ μ£Όμ„Έμš”!) +>24 +μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1) +> +``` + +```bash +12μ›” 쀑 식당 λ°©λ¬Έ λ‚ μ§œλŠ” μ–Έμ œμΈκ°€μš”? (숫자만 μž…λ ₯ν•΄ μ£Όμ„Έμš”!) +>31 +μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1) +> +``` + +```bash +12μ›” 쀑 식당 λ°©λ¬Έ λ‚ μ§œλŠ” μ–Έμ œμΈκ°€μš”? (숫자만 μž…λ ₯ν•΄ μ£Όμ„Έμš”!) +>2 1 +μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1) +> +``` + +```bash +12μ›” 쀑 식당 λ°©λ¬Έ λ‚ μ§œλŠ” μ–Έμ œμΈκ°€μš”? (숫자만 μž…λ ₯ν•΄ μ£Όμ„Έμš”!) +> 3 1 +μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1) +> +``` + +- μ˜ˆμ•½ λ‚ μ§œ μž…λ ₯이 곡백을 ν¬ν•¨ν•˜λ”λΌλ„
+ [μœ νš¨ν•˜μ§€ μ•Šμ€ κ°’](#μœ νš¨ν•˜μ§€-μ•Šμ€-μ˜ˆμ•½λ‚ μ§œ-μž…λ ₯-κΈ°μ€€)이 μ•„λ‹Œ ν˜•μ‹μ˜ μž…λ ₯이면 μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. + +#### μ£Όλ¬Έ λ‚΄μ—­ μž…λ ₯ + +#### 2-1. μ£Όλ¬Έ λ‚΄μ—­ μž…λ ₯ ( μœ νš¨ν•˜μ§€ μ•Šμ€ μž…λ ₯κ°’ ) + +```bash +μ•ˆλ…•ν•˜μ„Έμš”! μš°ν…Œμ½” 식당 12μ›” 이벀트 ν”Œλž˜λ„ˆμž…λ‹ˆλ‹€. +12μ›” 쀑 식당 λ°©λ¬Έ λ‚ μ§œλŠ” μ–Έμ œμΈκ°€μš”? (숫자만 μž…λ ₯ν•΄ μ£Όμ„Έμš”!) +>1 +μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1) +> +[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”. +μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1) +>νƒ€νŒŒμŠ€- +[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”. +μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1) +>-3 +[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”. +μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1) +>νƒ€νŒŒμŠ€-a +[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”. +μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1) +>ν—ˆλ‹ˆκ°ˆλ¦­μΉ˜ν‚¨-1 +[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”. +μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1) +>μ‹œμ €μƒλŸ¬λ“œ-2,νƒ€νŒŒμŠ€-3,ν‹°λ³ΈμŠ€ν…Œμ΄ν¬-5,제둜콜라-10,ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-5 +[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”. +μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1) +>제둜콜라-3,λ ˆλ“œμ™€μΈ-2,μƒ΄νŽ˜μΈ-1 +[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”. +μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1) +> νƒ€νŒŒμŠ€-1,μ‹œμ €μƒλŸ¬λ“œ-,ν‹°λ³ΈμŠ€ν…Œμ΄ν¬-3 +[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”. +μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1) +> μ•„μ΄μŠ€ν¬λ¦Ό-1,-3,μ΄ˆμ½”μΌ€μ΄ν¬-1 +[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”. +μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1) +> μ‹œμ €μƒλŸ¬λ“œ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1,μ‹œμ €μƒλŸ¬λ“œ-1 +[ERROR] μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄ μ£Όμ„Έμš”. +μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1) +> +``` + +#### μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όλ¬Έλ‚΄μ—­ μž…λ ₯ κΈ°μ€€ + +- μ£Όλ¬Έ 내역에 λ‹€μŒκ³Ό 같은 값을 μž…λ ₯ν•  μ‹œ, +
μ—λŸ¬κ°€ λ°œμƒν•˜κ³  μ£Όλ¬Έ 내역을 λ‹€μ‹œ μž…λ ₯λ°›μŠ΅λ‹ˆλ‹€. + - λΉ„μ–΄μžˆλŠ” κ°’ + - 메뉴 이름이 λΉ„μ–΄μžˆλŠ” κ°’ + - 메뉴 κ°œμˆ˜κ°€ λΉ„μ–΄μžˆλŠ” κ°’ + - 메뉴 κ°œμˆ˜κ°€ 숫자 ν˜•μ‹μ΄ μ•„λ‹Œ κ°’ + - 메뉴 이름이 30κΈ€μž 초과인 κ°’ + - 메뉴 κ°œμˆ˜κ°€ 3κΈ€μž 초과인 κ°’ + - νŒλ§€μ€‘μΈ 메뉴가 μ•„λ‹Œ 메뉴 이름을 ν¬ν•¨ν•œ κ°’ + - 각 주문의 메뉴 개수 합이 20개λ₯Ό μ΄ˆκ³Όν•˜λŠ” κ°’ + - 메뉴 이름이 음료만으둜 이루어진 κ°’ + - 메뉴 이름과 메뉴 개수λ₯Ό λ‚˜λˆ„λŠ” κ΅¬λΆ„μž(-)κ°€ ν¬ν•¨λ˜μ§€ μ•ŠλŠ” κ°’ + - κ΅¬λΆ„μž(-)둜 λλ‚˜λŠ” κ°’ + - 곡백 포함 2000κΈ€μž 초과인 κ°’ + - 곡백 제거 ν›„ 1000κΈ€μž 초과인 κ°’ + +#### 2-2. μ£Όλ¬Έ λ‚΄μ—­ μž…λ ₯ ( μ˜¬λ°”λ₯Έ μž…λ ₯κ°’ + 곡백을 ν¬ν•¨ν•œ μž…λ ₯κ°’ ) + +```bash +μ•ˆλ…•ν•˜μ„Έμš”! μš°ν…Œμ½” 식당 12μ›” 이벀트 ν”Œλž˜λ„ˆμž…λ‹ˆλ‹€. +12μ›” 쀑 식당 λ°©λ¬Έ λ‚ μ§œλŠ” μ–Έμ œμΈκ°€μš”? (숫자만 μž…λ ₯ν•΄ μ£Όμ„Έμš”!) +>31 +μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1) +>νƒ€νŒŒμŠ€-1,ν‹°λ³ΈμŠ€ν…Œμ΄ν¬-1,바비큐립-1,μ•„μ΄μŠ€ν¬λ¦Ό-1,μ΄ˆμ½”μΌ€μ΄ν¬-1,μƒ΄νŽ˜μΈ-1,λ ˆλ“œμ™€μΈ-1 +12μ›” 31일에 μš°ν…Œμ½” μ‹λ‹Ήμ—μ„œ 받을 이벀트 ν˜œνƒ 미리 보기! +... +``` + +```bash +μ•ˆλ…•ν•˜μ„Έμš”! μš°ν…Œμ½” 식당 12μ›” 이벀트 ν”Œλž˜λ„ˆμž…λ‹ˆλ‹€. +12μ›” 쀑 식당 λ°©λ¬Έ λ‚ μ§œλŠ” μ–Έμ œμΈκ°€μš”? (숫자만 μž…λ ₯ν•΄ μ£Όμ„Έμš”!) +>25 +μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1) +>μ–‘ 솑이 수 ν”„ - 1, ν‹° λ³ΈμŠ€ν…Œμ΄ν¬-1,바비큐 립-1, μ΄ˆμ½” 케이크-1, 크리슀마슀 νŒŒμŠ€νƒ€ -1, λ ˆλ“œ 와인-1 +12μ›” 25일에 μš°ν…Œμ½” μ‹λ‹Ήμ—μ„œ 받을 이벀트 ν˜œνƒ 미리 보기! +... +``` + +- μ£Όλ¬Έ λ‚΄μ—­ μž…λ ₯이 곡백을 ν¬ν•¨ν•˜λ”λΌλ„
+ [μœ νš¨ν•˜μ§€ μ•Šμ€ κ°’](#μœ νš¨ν•˜μ§€-μ•Šμ€-μ£Όλ¬Έλ‚΄μ—­-μž…λ ₯-κΈ°μ€€)이 μ•„λ‹Œ ν˜•μ‹μ˜ μž…λ ₯이면 μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. + +#### μ‹€ν–‰ κ²°κ³Ό μ˜ˆμ‹œ + +- λ‹€μŒμ€ 이해λ₯Ό 돕기 μœ„ν•œ λͺ‡κ°€μ§€ μ˜ˆμ‹œ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ κ²°κ³Όμž…λ‹ˆλ‹€. + +#### 3-1. μ£Όλ¬Έ κΈˆμ•‘μ΄ 10000원 미만, 이벀트 적용 λŒ€μƒμ΄ μ•„λ‹Œ μ£Όλ¬Έ + +```bash +μ•ˆλ…•ν•˜μ„Έμš”! μš°ν…Œμ½” 식당 12μ›” 이벀트 ν”Œλž˜λ„ˆμž…λ‹ˆλ‹€. +12μ›” 쀑 식당 λ°©λ¬Έ λ‚ μ§œλŠ” μ–Έμ œμΈκ°€μš”? (숫자만 μž…λ ₯ν•΄ μ£Όμ„Έμš”!) +>1 +μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1) +>νƒ€νŒŒμŠ€-1,제둜콜라-1 +12μ›” 1일에 μš°ν…Œμ½” μ‹λ‹Ήμ—μ„œ 받을 이벀트 ν˜œνƒ 미리 보기! + +<μ£Όλ¬Έ 메뉴> +제둜콜라 1개 +νƒ€νŒŒμŠ€ 1개 + +<할인 μ „ 총주문 κΈˆμ•‘> +8,500원 + +<증정 메뉴> +μ—†μŒ + +<ν˜œνƒ λ‚΄μ—­> +μ—†μŒ + +<μ΄ν˜œνƒ κΈˆμ•‘> +0원 + +<할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘> +8,500원 + +<12μ›” 이벀트 λ°°μ§€> +μ—†μŒ +``` + +#### 3-2. 크리슀마슀 디데이 할인, 평일 할인 적용 μ£Όλ¬Έ μ˜ˆμ‹œ + +```bash +μ•ˆλ…•ν•˜μ„Έμš”! μš°ν…Œμ½” 식당 12μ›” 이벀트 ν”Œλž˜λ„ˆμž…λ‹ˆλ‹€. +12μ›” 쀑 식당 λ°©λ¬Έ λ‚ μ§œλŠ” μ–Έμ œμΈκ°€μš”? (숫자만 μž…λ ₯ν•΄ μ£Όμ„Έμš”!) +>13 +μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1) +>νƒ€νŒŒμŠ€-1,μ‹œμ €μƒλŸ¬λ“œ-1,ν‹°λ³ΈμŠ€ν…Œμ΄ν¬-1,μ΄ˆμ½”μΌ€μ΄ν¬-1,제둜콜라-1 +12μ›” 13일에 μš°ν…Œμ½” μ‹λ‹Ήμ—μ„œ 받을 이벀트 ν˜œνƒ 미리 보기! + +<μ£Όλ¬Έ 메뉴> +μ΄ˆμ½”μΌ€μ΄ν¬ 1개 +제둜콜라 1개 +νƒ€νŒŒμŠ€ 1개 +ν‹°λ³ΈμŠ€ν…Œμ΄ν¬ 1개 +μ‹œμ €μƒλŸ¬λ“œ 1개 + +<할인 μ „ 총주문 κΈˆμ•‘> +86,500원 + +<증정 메뉴> +μ—†μŒ + +<ν˜œνƒ λ‚΄μ—­> +크리슀마슀 디데이 할인: -2,200원 +평일 할인: -2,023원 + +<μ΄ν˜œνƒ κΈˆμ•‘> +-4,223원 + +<할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘> +82,277원 + +<12μ›” 이벀트 λ°°μ§€> +μ—†μŒ +``` + +#### 3-3. 크리슀마슀 디데이 할인, 주말 할인, 증정 이벀트 적용 μ£Όλ¬Έ μ˜ˆμ‹œ + +```bash +μ•ˆλ…•ν•˜μ„Έμš”! μš°ν…Œμ½” 식당 12μ›” 이벀트 ν”Œλž˜λ„ˆμž…λ‹ˆλ‹€. +12μ›” 쀑 식당 λ°©λ¬Έ λ‚ μ§œλŠ” μ–Έμ œμΈκ°€μš”? (숫자만 μž…λ ₯ν•΄ μ£Όμ„Έμš”!) +>23 +μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1) +>νƒ€νŒŒμŠ€-2,ν‹°λ³ΈμŠ€ν…Œμ΄ν¬-1,ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1 +12μ›” 23일에 μš°ν…Œμ½” μ‹λ‹Ήμ—μ„œ 받을 이벀트 ν˜œνƒ 미리 보기! + +<μ£Όλ¬Έ 메뉴> +νƒ€νŒŒμŠ€ 2개 +ν‹°λ³ΈμŠ€ν…Œμ΄ν¬ 1개 +ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€ 2개 +λ ˆλ“œμ™€μΈ 1개 + +<할인 μ „ 총주문 κΈˆμ•‘> +196,000원 + +<증정 메뉴> +μƒ΄νŽ˜μΈ 1개 + +<ν˜œνƒ λ‚΄μ—­> +크리슀마슀 디데이 할인: -3,200원 +주말 할인: -6,069원 +증정 이벀트: -25,000원 + +<μ΄ν˜œνƒ κΈˆμ•‘> +-34,269원 + +<할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘> +186,731원 + +<12μ›” 이벀트 λ°°μ§€> +산타 +``` + +#### 3-4. 평일 ν• μΈλ§Œ 적용된 μ£Όλ¬Έ μ˜ˆμ‹œ + +```bash +μ•ˆλ…•ν•˜μ„Έμš”! μš°ν…Œμ½” 식당 12μ›” 이벀트 ν”Œλž˜λ„ˆμž…λ‹ˆλ‹€. +12μ›” 쀑 식당 λ°©λ¬Έ λ‚ μ§œλŠ” μ–Έμ œμΈκ°€μš”? (숫자만 μž…λ ₯ν•΄ μ£Όμ„Έμš”!) +>28 +μ£Όλ¬Έν•˜μ‹€ 메뉴λ₯Ό 메뉴와 개수λ₯Ό μ•Œλ € μ£Όμ„Έμš”. (e.g. ν•΄μ‚°λ¬ΌνŒŒμŠ€νƒ€-2,λ ˆλ“œμ™€μΈ-1,μ΄ˆμ½”μΌ€μ΄ν¬-1) +>νƒ€νŒŒμŠ€-1,μ•„μ΄μŠ€ν¬λ¦Ό-3,제둜콜라-1 +12μ›” 28일에 μš°ν…Œμ½” μ‹λ‹Ήμ—μ„œ 받을 이벀트 ν˜œνƒ 미리 보기! + +<μ£Όλ¬Έ 메뉴> +제둜콜라 1개 +νƒ€νŒŒμŠ€ 1개 +μ•„μ΄μŠ€ν¬λ¦Ό 3개 + +<할인 μ „ 총주문 κΈˆμ•‘> +23,500원 + +<증정 메뉴> +μ—†μŒ + +<ν˜œνƒ λ‚΄μ—­> +평일 할인: -6,069원 + +<μ΄ν˜œνƒ κΈˆμ•‘> +-6,069원 + +<할인 ν›„ μ˜ˆμƒ 결제 κΈˆμ•‘> +17,431원 + +<12μ›” 이벀트 λ°°μ§€> +별 +``` + +--- + +## κ°œλ°œνŒ€ 전달사항 + +## πŸ‘¨β€πŸ’»κΈ°λŠ₯ λͺ©λ‘ ## πŸ’» [ μž…λ ₯ 및 μž…λ ₯κ°’ 검증 κΈ°λŠ₯ ] @@ -172,4 +497,118 @@ - [x] `λ°°μ§€ 이름` 의 ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. - [x] `12μ›” 이벀트 λ°°μ§€`λŠ” `총 ν˜œνƒ κΈˆμ•‘`의 값에 따라 λ‹€λ₯΄κ²Œ 값을 λ‹€λ₯΄κ²Œ 좜λ ₯ν•œλ‹€. - [x] 5000원 이상은 `별`, 10000원 이상은 `트리`, 20000원 이상은 `산타`둜 좜λ ₯ν•œλ‹€. -- [x] 이벀트 λ°°μ§€κ°€ λΆ€μ—¬λ˜μ§€ μ•ŠμœΌλ©΄ `μ—†μŒ`을 좜λ ₯ν•œλ‹€. \ No newline at end of file +- [x] 이벀트 λ°°μ§€κ°€ λΆ€μ—¬λ˜μ§€ μ•ŠμœΌλ©΄ `μ—†μŒ`을 좜λ ₯ν•œλ‹€. + +--- + +## πŸŽ’νŒ¨ν‚€μ§€ ꡬ쑰 + +```bash +christmas + β”œβ”€β”€ Application.java + β”œβ”€β”€ EventPlanner.java + β”œβ”€β”€ controller + β”‚Β Β  β”œβ”€β”€ OrdersController.java + β”‚Β Β  └── ReservationDayController.java + β”œβ”€β”€ domain + β”‚Β Β  β”œβ”€β”€ DayPerMonth.java + β”‚Β Β  β”œβ”€β”€ EventManager.java + β”‚Β Β  β”œβ”€β”€ Order.java + β”‚Β Β  β”œβ”€β”€ Orders.java + β”‚Β Β  β”œβ”€β”€ ReservationDay.java + β”‚Β Β  β”œβ”€β”€ constant + β”‚Β Β  β”‚Β Β  β”œβ”€β”€ event + β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ChristmasPromotion.java + β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ EventBadge.java + β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ EventNumberConstant.java + β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ EventSymbolConstant.java + β”‚Β Β  β”‚Β Β  β”‚Β Β  └── Promotion.java + β”‚Β Β  β”‚Β Β  β”œβ”€β”€ orders + β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ FoodType.java + β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Menu.java + β”‚Β Β  β”‚Β Β  β”‚Β Β  └── OrdersConstant.java + β”‚Β Β  β”‚Β Β  └── reservationday + β”‚Β Β  β”‚Β Β  └── ReservationDayConstant.java + β”‚Β Β  └── exception + β”‚Β Β  β”œβ”€β”€ InvalidOrdersException.java + β”‚Β Β  β”œβ”€β”€ InvalidReservationDayException.java + β”‚Β Β  └── message + β”‚Β Β  β”œβ”€β”€ InvalidOrdersExceptionMessage.java + β”‚Β Β  └── InvalidReservationDayExceptionMessage.java + β”œβ”€β”€ dto + β”‚Β Β  β”œβ”€β”€ BenefitsDetailsDto.java + β”‚Β Β  β”œβ”€β”€ EstimatedAmountWithDiscountDto.java + β”‚Β Β  β”œβ”€β”€ EventBadgeDto.java + β”‚Β Β  β”œβ”€β”€ EventBenefitsPreviewDto.java + β”‚Β Β  β”œβ”€β”€ GiftDto.java + β”‚Β Β  β”œβ”€β”€ OrderedMenusDto.java + β”‚Β Β  β”œβ”€β”€ TotalAmountWithNoDiscountDto.java + β”‚Β Β  └── TotalBenefitedAmountDto.java + β”œβ”€β”€ global + β”‚Β Β  └── ApplicationConstant.java + β”œβ”€β”€ service + β”‚Β Β  β”œβ”€β”€ EventManagerService.java + β”‚Β Β  β”œβ”€β”€ OrdersService.java + β”‚Β Β  └── ReservationDayService.java + └── view + β”œβ”€β”€ input + β”‚Β Β  β”œβ”€β”€ InputView.java + β”‚Β Β  β”œβ”€β”€ constant + β”‚Β Β  β”‚Β Β  β”œβ”€β”€ InputNumberConstant.java + β”‚Β Β  β”‚Β Β  └── InputSymbolConstant.java + β”‚Β Β  β”œβ”€β”€ exception + β”‚Β Β  β”‚Β Β  β”œβ”€β”€ BasicInputException.java + β”‚Β Β  β”‚Β Β  β”œβ”€β”€ DayInputException.java + β”‚Β Β  β”‚Β Β  β”œβ”€β”€ OrdersInputException.java + β”‚Β Β  β”‚Β Β  └── message + β”‚Β Β  β”‚Β Β  β”œβ”€β”€ BasicInputExceptionMessageFormat.java + β”‚Β Β  β”‚Β Β  β”œβ”€β”€ DayInputExceptionMessage.java + β”‚Β Β  β”‚Β Β  └── OrdersInputExceptionMessage.java + β”‚Β Β  β”œβ”€β”€ parser + β”‚Β Β  β”‚Β Β  └── InputParser.java + β”‚Β Β  └── validator + β”‚Β Β  β”œβ”€β”€ BasicValidator.java + β”‚Β Β  β”œβ”€β”€ DayInputValidator.java + β”‚Β Β  β”œβ”€β”€ MenuCountInputValidator.java + β”‚Β Β  β”œβ”€β”€ MenuNameInputValidator.java + β”‚Β Β  β”œβ”€β”€ OrderInputValidator.java + β”‚Β Β  β”œβ”€β”€ OrdersInputValidator.java + β”‚Β Β  └── PositiveIntegerCheckable.java + └── output + β”œβ”€β”€ OutputView.java + └── constant + β”œβ”€β”€ OutputFormatConstant.java + β”œβ”€β”€ OutputMessageConstant.java + └── OutputSymbolConstant.java +``` + +## ν”„λ‘œμ νŠΈ μ•„ν‚€ν…μ²˜ + + + +## μΆ”ν›„ ν™•μž₯ 및 μ½”λ“œ μž¬μ‚¬μš© μ‹œ 참고사항 + +- `global/ApplicationConstant` 클래슀의
+ `CURRENT_PROMOTION_MONTH`λŠ” μ΄λ²€νŠΈκ°€ μ‹œν–‰λ˜λŠ” μ›”(month)을 μ˜λ―Έν•©λ‹ˆλ‹€. +

+- `ReservationDay` ν΄λž˜μŠ€λŠ” 12μ›”μ˜ λ‚ μ§œ κ°’κ³Ό 12μ›” 이벀트 도메인 λ‘œμ§μ„ μ²˜λ¦¬ν•˜λŠ” ν΄λž˜μŠ€μž…λ‹ˆλ‹€.
+ ν•΄λ‹Ή ν΄λž˜μŠ€λŠ” `DayPerMonth`λΌλŠ” 좔상 클래슀λ₯Ό μƒμ†λ°›μœΌλ©°, 이 ν΄λž˜μŠ€λŠ” 유효 λ‚ μ§œ 검증 λ‘œμ§μ„ κ°€μ§‘λ‹ˆλ‹€.
+ 예λ₯Ό λ“€μ–΄, λ‹€μŒ 달 1μ›” 이벀트λ₯Ό μœ„ν•΄ μ½”λ“œλ₯Ό μž¬μ‚¬μš© ν•˜μ‹ λ‹€λ©΄, λ‹€μŒκ³Ό 같은 μˆœμ„œλ‘œ μ§„ν–‰ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

+ 1. `domain.constant.reservationday.ReservationDayConstant` ν΄λž˜μŠ€μ—μ„œ,
+ `JANUARY_FIRST_DAY`, `JANUARY_LAST_DAY` 값을 μΆ”κ°€ν•©λ‹ˆλ‹€.

+ 2. `ReservationDay` 클래슀의 `isInAppropriateRange`λ©”μ„œλ“œμ˜ DECEMBER κ΄€λ ¨ μƒμˆ˜ 값을 1μ—μ„œ μƒμ„±ν•œ μƒμˆ˜ κ°’μœΌλ‘œ λŒ€μ²΄ν•΄μ€λ‹ˆλ‹€.

+ 3. `ReservationDay` 클래슀의 12μ›” κ΄€λ ¨ 도메인 λ‘œμ§μ„ μ œκ±°ν•˜κ³ ,
1μ›” μ΄λ²€νŠΈμ— λ§žλŠ” 도메인 둜직으둜 클래슀λ₯Ό κ΅¬μ„±ν•©λ‹ˆλ‹€.

+ 4. `EventManager` ν΄λž˜μŠ€λŠ” 이벀트 κ΄€λ ¨ 도메인 λ‘œμ§μ„
μ˜ˆμ•½ λ‚ μ§œμ™€ μ£Όλ¬Έ 내역을 톡해 ν•΄κ²°ν•˜λŠ” ν΄λž˜μŠ€μž…λ‹ˆλ‹€.

+ 5. `ReservationDay`클래슀의 도메인 변경에 λ”°λ₯Έ `EventManager`도메인 λ‘œμ§μ„ μˆ˜μ •ν•΄μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€.이 λ•Œ, `christmas.domain.constant.event` ν΄λ”μ˜ + 이벀트 λ³€μˆ˜ 값을 λ³€κ²½ λ˜λŠ” ν™œμš©ν•΄μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€. + +--- + +### 1주일 λ’€ 개발 νšŒμ˜μ—μ„œ λ…Όμ˜ν•˜λ©΄ 쒋을 사항 + +- 평일 할인 날에 μ•„μ΄μŠ€ν¬λ¦Όλ§Œ 많이 μ‹œμΌœλ¨ΉλŠ” μ†λ‹˜μ΄ 였면 λ§€μΆœμ— λΆˆλ¦¬ν•  것 κ°™μŠ΅λ‹ˆλ‹€.
+ 이에 λŒ€ν•œ λŒ€μ‘μ±…μ΄ ν•„μš”ν•˜μ§€ μ•Šμ„κΉŒμš”?

+- 30일과 31일은 연말이라 μ†λ‹˜μ΄ 많이 λͺ°λ¦΄ μ‹œκΈ°μΈλ°, 이λ₯Ό μœ μΈν• λ§Œν•œ μ΄λ²€νŠΈκ°€ λ‹€μ†Œ λΆ€μ‘±ν•œ 것 κ°™μŠ΅λ‹ˆλ‹€.
+ 연말 이벀트λ₯Ό μΆ”κ°€ν•˜λŠ” λ°©μ•ˆμ€ μ–΄λ–¨κΉŒμš”?

+- 증정 μ΄λ²€νŠΈκ°€ μƒ΄νŽ˜μΈλ§Œ μ œκ³΅ν•΄μ£ΌλŠ” 것 κ°™μ•„, 아이듀과 ν•¨κ»˜ μ˜€λŠ” λΆ€λͺ¨λ‹˜λ“€μ—κ²ŒλŠ” κ·Έλ‹€μ§€ μœ μΈμ±…μ΄ λ˜μ§€ μ•Šμ„ 것 κ°™μŠ΅λ‹ˆλ‹€. +
고객을 μœ μΈν•˜κΈ° μœ„ν•΄ μƒ΄νŽ˜μΈμ„ μ œκ³΅ν•˜λŠ” 것인데, 였히렀 아이듀 μ•žμ—μ„œ 음주 μž₯λ €(?)λ₯Ό ν•˜λŠ” 것 κ°™μ•„ 저희 식당을 μ΄μš©ν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆμ„ κ±° κ°™μŠ΅λ‹ˆλ‹€.μ¦μ •ν’ˆμ„ λ‹€μ–‘ν™”ν•˜λŠ” 것은 μ–΄λ–»κ²Œ μƒκ°ν•˜μ‹œλ‚˜μš”? \ No newline at end of file