├── .gitignore ├── .npmrc ├── images ├── demo_coin.gif ├── test_result.png ├── beverage_icon.png ├── demo_product.gif └── demo_purchase.gif ├── cypress.json ├── index.html ├── package.json ├── LICENSE ├── test └── app.spec.js └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict = true 2 | -------------------------------------------------------------------------------- /images/demo_coin.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse/javascript-vendingmachine-precourse/HEAD/images/demo_coin.gif -------------------------------------------------------------------------------- /images/test_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse/javascript-vendingmachine-precourse/HEAD/images/test_result.png -------------------------------------------------------------------------------- /images/beverage_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse/javascript-vendingmachine-precourse/HEAD/images/beverage_icon.png -------------------------------------------------------------------------------- /images/demo_product.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse/javascript-vendingmachine-precourse/HEAD/images/demo_product.gif -------------------------------------------------------------------------------- /images/demo_purchase.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse/javascript-vendingmachine-precourse/HEAD/images/demo_purchase.gif -------------------------------------------------------------------------------- /cypress.json: -------------------------------------------------------------------------------- 1 | { 2 | "integrationFolder": "test", 3 | "testFiles": "*.spec.js", 4 | "screenshotOnRunFailure": false, 5 | "video": false, 6 | "pluginsFile": false, 7 | "supportFile": false, 8 | "blockHosts": ["cdn.jsdelivr.net"] 9 | } 10 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 |
2 |
3 |
73 |
74 | #### 잔돈 충전
75 |
76 |
77 | #### 상품 구매 및 잔돈 반환
78 |
79 |
80 | ---
81 |
82 | ## ✅ 프로그래밍 요구 사항
83 |
84 | ### DOM 선택자
85 | 각 요소에 아래와 같은 선택자를 반드시 지정한다.
86 |
87 | **탭 메뉴 버튼**
88 |
89 | - `상품 구매` 탭으로 이동하는 메뉴 버튼 id는 `product-purchase-menu`이다.
90 | - `잔돈 충전`탭으로 이동하는 메뉴 버튼 id는 `vending-machine-manage-menu`이다.
91 | - `상품 관리`탭으로 이동하는 메뉴 버튼 id는 `product-add-menu`이다.
92 |
93 | **상품 관리(추가) 메뉴**
94 |
95 | - 상품 추가 입력 폼의 상품명 입력 요소의 id는 `product-name-input`이다.
96 | - 상품 추가 입력 폼의 상품 가격 입력 요소의 id는 `product-price-input`이다.
97 | - 상품 추가 입력 폼의 수량 입력 요소의 id는 `product-quantity-input`이다.
98 | - 상품 `추가하기` 버튼 요소의 id는 `product-add-button`이다.
99 | - 추가한 각 상품 요소의 class명은 `product-manage-item`이며, 하위에 아래 요소들을 갖는다.
100 | - 상품명에 해당하는 요소의 class명은 `product-manage-name`이다.
101 | - 가격에 해당하는 요소의 class명은 `product-manage-price`이다.
102 | - 수량에 해당하는 요소의 class명은 `product-manage-quantity`이다.
103 |
104 | **잔돈 충전 (자판기 보유 동전) 메뉴**
105 |
106 | - 자판기가 보유할 금액을 충전할 요소의 id는 `vending-machine-charge-input`이다.
107 | - `충전하기` 버튼에 해당하는 요소의 id는 `vending-machine-charge-button`이다.
108 | - 충전된 금액을 확인하는 요소의 id는 `vending-machine-charge-amount` 이다.
109 | - 보유한 각 동전의 개수에 해당하는 요소의 id는 다음과 같다.
110 | - 500원: `vending-machine-coin-500-quantity`
111 | - 100원: `vending-machine-coin-100-quantity`
112 | - 50원: `vending-machine-coin-50-quantity`
113 | - 10원: `vending-machine-coin-10-quantity`
114 |
115 | **상품 구매 메뉴**
116 |
117 | - 투입 금액 입력 요소의 id는 `charge-input`이다.
118 | - 투입하기 버튼 요소의 id는 `charge-button`이다.
119 | - 투입한 금액을 확인하는 요소의 id는 `charge-amount`이다.
120 | - 반환하기 버튼 요소의 id는 `coin-return-button`이다.
121 | - 반환된 각 동전의 개수에 해당하는 요소의 id는 다음과 같다.
122 | - 500원: `coin-500-quantity`
123 | - 100원: `coin-100-quantity`
124 | - 50원: `coin-50-quantity`
125 | - 10원: `coin-10-quantity`
126 | - 각 상품 요소의 class명은 `product-purchase-item`이고, 하위에 아래 요소들을 갖는다.
127 | - 구매 버튼에 해당하는 요소의 class명은 `purchase-button`이다.
128 | - 상품명에 해당하는 요소의 class명은 `product-purchase-name`이다.
129 | - 가격에 해당하는 요소의 class명은 `product-purchase-price`이다.
130 | - 수량에 해당하는 요소의 class명은 `product-purchase-quantity`이다.
131 | - 상품명은 `dataset` 속성을 사용하고 `data-product-name` 형식으로 저장한다.
132 | - 가격은 `dataset` 속성을 사용하고 `data-product-price` 형식으로 저장한다.
133 | - 수량은 `dataset` 속성을 사용하고 `data-product-quantity` 형식으로 저장한다.
134 |
135 |
136 | ---
137 |
138 | ### 라이브러리
139 | - 잔돈을 무작위로 생성하는 기능은 [`MissionUtils` 라이브러리](https://github.com/woowacourse-projects/javascript-mission-utils#mission-utils)의 `Random.pickNumberInList`를 사용해 구한다.
140 | - `MissionUtils` 라이브러리 스크립트는 `index.html`에 이미 포함되어 전역 객체에 추가되어 있으므로, 따로 `import` 하지 않아도 구현 코드 어디에서든 사용할 수 있다.
141 |
142 | ```javascript
143 | // ex)
144 | const randomNumber = Random.pickNumberInList([10, 50, 100, 500]);
145 | ```
146 |
147 | ---
148 |
149 | ### 공통 요구사항
150 |
151 | - 스크립트 추가 외에 주어진 `index.html`파일은 수정할 수 없다.
152 | - 스타일(css)은 채점 요소가 아니다.
153 | - 모든 예외 발생 상황은 `alert`메서드를 이용하여 처리한다.
154 | - 외부 라이브러리(jQuery, Lodash 등)를 사용하지 않고, 순수 Vanilla JS로만 구현한다.
155 | - **[자바스크립트 코드 컨벤션](https://github.com/woowacourse/woowacourse-docs/tree/feature/styleguide/styleguide/javascript)을 지키면서 프로그래밍** 한다.
156 | - **indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용**한다.
157 | - 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.
158 | - 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메소드)를 분리하면 된다.
159 | - **함수(또는 메소드)가 한 가지 일만 하도록 최대한 작게** 만들어라.
160 | - 변수 선언시 `var` 를 사용하지 않는다. `const` 와 `let` 을 사용한다.
161 | - [const](https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/const)
162 | - [let](https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/let)
163 | - `import` 문을 이용해 스크립트를 모듈화하고 불러올 수 있게 만든다.
164 | - [https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/import](https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/import)
165 | - **함수(또는 메소드)의 길이가 15라인을 넘어가지 않도록 구현한다.**
166 | - 함수(또는 메소드)가 한 가지 일만 잘 하도록 구현한다.
167 |
168 | ---
169 |
170 | ## 📝 과제 진행 요구사항
171 | - 미션은 [javascript-vendingmachine-precourse](https://github.com/woowacourse/javascript-vendingmachine-precourse/) 저장소를 Fork/Clone해 시작한다.
172 | - **기능을 구현하기 전에 javascript-vendingmachine-precourse/docs/README.md 파일에 구현할 기능 목록을 정리**해 추가한다.
173 | - **Git의 커밋 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위**로 추가한다.
174 | - [AngularJS Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153) 참고해 commit log를 남긴다.
175 | - 과제 진행 및 제출 방법은 [프리코스 과제 제출 문서](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 를 참고한다.
176 |
177 | ## ✉️ 미션 제출 방법
178 |
179 | - 미션 구현을 완료한 후 GitHub을 통해 제출해야 한다.
180 | - GitHub을 활용한 제출 방법은 [프리코스 과제 제출 문서](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 를 참고해 제출한다.
181 | - GitHub에 미션을 제출한 후 [우아한테크코스 지원 플랫폼](https://apply.techcourse.co.kr) 에 접속하여 프리코스 과제를 제출한다.
182 | - 자세한 방법은 [링크](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse#제출-가이드) 를 참고한다.
183 | - **Pull Request만 보내고, 지원 플랫폼에서 과제를 제출하지 않으면 최종 제출하지 않은 것으로 처리되니 주의한다.**
184 |
185 |
186 | ### 🚨 과제 제출 전 체크리스트 - 0점 방지를 위한 주의사항
187 | - 요구사항에 명시된 출력값 형식을 지키지 않을 경우 기능 구현을 모두 정상적으로 했더라도 0점으로 처리된다.
188 | - 기능 구현을 완료한 뒤 아래 가이드에 따라 테스트를 실행했을 때 모든 테스트가 성공하는 지 확인한다. **테스트가 실패할 경우 0점으로 처리되므로, 반드시 확인 후 제출한다.**
189 |
190 | ### ✔️ 테스트 실행 가이드
191 | - 테스트 실행에 필요한 패키지 설치를 위해 `Node.js` 버전 `14` 이상이 필요하다.
192 | - 다음 명령어를 입력해 패키지를 설치한다.
193 | ```bash
194 | // {폴더 경로}/javascript-vendingmachine-precourse/ 에서
195 | npm install
196 | ```
197 |
198 | - 설치가 완료되었다면, 다음 명령어를 입력해 테스트를 실행한다.
199 | ```bash
200 | // {폴더 경로}/javascript-vendingmachine-precourse/ 에서
201 | npm run test
202 | ```
203 |
204 | - 아래와 같은 화면이 나오며 모든 테스트가 pass한다면 성공!
205 |
206 | 
207 |
--------------------------------------------------------------------------------