├── Makefile ├── README.md ├── push_swap_tester.bash └── random_numbers.cpp /Makefile: -------------------------------------------------------------------------------- 1 | # **************************************************************************** # 2 | # # 3 | # ::: :::::::: # 4 | # Makefile :+: :+: :+: # 5 | # +:+ +:+ +:+ # 6 | # By: minckim +#+ +:+ +#+ # 7 | # +#+#+#+#+#+ +#+ # 8 | # Created: 2021/03/09 02:28:13 by minckim #+# #+# # 9 | # Updated: 2021/03/12 15:47:28 by minckim ### ########.fr # 10 | # # 11 | # **************************************************************************** # 12 | 13 | all : name 14 | 15 | name : random_numbers 16 | 17 | random_numbers : random_numbers.cpp 18 | clang++ random_numbers.cpp --std=c++11 -o random_numbers 19 | 20 | fclean: 21 | rm -rf random_numbers -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # push_swap_tester 2 | --- 3 | # Directory 4 | ``` 5 | | 6 | |- [ push_swap ] 7 | | |- Makefile (Your push_swap Makefile) 8 | |- checker_linux (or checker_Mac) 9 | | 10 | |- [ push_swap_tester ] 11 | | |- push_swap_tester.bash 12 | | |- random_numbers.cpp 13 | | |- Makefile 14 | | 15 | ``` 16 | # Note 17 | ### 한국어 18 | - 운영체제가 리눅스라면 ```push_swap_tester.bash```에서 ```OS``` 변수의 값을 ```linux```로 변경해주세요. ```checker_Mac(or linux)```는 ```push_swap``` 디렉토리에 있어야 합니다. 자체 제작한 checker를 사용하는 경우에는 ```OS``` 부분을 모두 주석처리 해주세요. 19 | ```bash 20 | #============================================================================== 21 | # OS 22 | 23 | # OS="Mac" 24 | # OS="linux" 25 | 26 | #============================================================================== 27 | ``` 28 | - push_swap 프로젝트 디렉토리 명이 ```push_swap```이 아니면 bash 파일에 적힌 ```push_swap``` 경로를 여러분의 디렉토리로 교체하거나 디렉토리명을 ```push_swap```으로 바꾸세요. 29 | - 제가 이메일을 잘 확인하지 않는 관계로, 개선사항이나 오류 보고는 슬랙(minckim)으로 해주세요. 제 개인 연락처를 알고계신다면 그냥 카카오톡이나 문자, 전화도 상관없습니다. 30 | - 지지고 볶고 마음대로 하십시오. 왜냐하면 업데이트를 장담할 수 없기 때문에ㅎㅎ;; 출처만 남겨주세요. 31 | - random_numbers.cpp 를 컴파일해서 임의의 숫자 조합을 만들어낼 수 있습니다. 32 | - ```<숫자 범위 최솟값>```과 ```<숫자 범위 최댓값>```은 선택적인 인자입니다. 기본값은 ```0 ~ (<요소 개수> - 1)``` 입니다. 33 | ``` 34 | bash 35 | clang++ random_numbers.cpp -o random_numbers 36 | export ARG=$(./random_numbers <요소 개수> [숫자 범위의 최솟값] [숫자 범위의 최댓값]) 37 | /push_swap $ARG | /checker $ARG 38 | /push_swap $ARG | wc-l 39 | ``` 40 | 41 | - 사용례 42 | ``` 43 | bash 44 | clang++ random_numbers.cpp -o random_numbers 45 | export ARG=$(./random_numbers 100 1) 46 | ../push_swap/push_swap $ARG | ../push_swap/checker $ARG 47 | ../push_swap/push_swap $ARG | wc -l 48 | ``` 49 | ### English 50 | - If the operating system is Linux, please change the value of variable ```OS``` to ```linux``` from push_swap_tester.bash file. ```checker_Mac(or linux)``` should be in the directory ```push_swap```. 51 | - If the name of your push_swap project directory is not ```push_swap```, replace the push_swap path written in the bash file with your directory, or change the name of your directroy to ```push_swap```. 52 | - I don't check my e-mail very well, so please report improvements or errors with Slack(minckim). If you know my personal contact information, I don't mind just Kakao Talk, text message, or phone calls. 53 | - You can make random numbers with random_numbers.cpp. 54 | - `````` and `````` is optional argument. Default is ```0 ~ ( - 1)```. 55 | ``` 56 | bash 57 | clang++ random_numbers.cpp -o random_numbers 58 | export ARG=$(./random_numbers [range min] [range max]) 59 | /push_swap $ARG | /checker $ARG 60 | /push_swap $ARG | wc-l 61 | ``` 62 | 63 | - example 64 | ``` 65 | bash 66 | clang++ random_numbers.cpp -o random_numbers 67 | export ARG=$(./random_numbers 100 1) 68 | ../push_swap/push_swap $ARG | ../push_swap/checker $ARG 69 | ../push_swap/push_swap $ARG | wc -l 70 | ``` 71 | # Install & run 72 | ``` 73 | git clone git@github.com:minckim42/push_swap_tester.git 74 | cd push_swap_tester 75 | ./push_swap_tester.bash 76 | ``` 77 | # Update 78 | - 2021-07-20: 79 | - 오류를 표준출력에 출력하는 경우에 나타내는 실패 메시지를 수정함. 왜 실패인지 모르겠다는 제보가 종종 있어서 수정함. 80 | - checker가 과제에서 기본으로 제공되는 것으로 변경된 것을 반영함. 르포에 checker를 포함하지는 않음. 81 | - Readme 업데이트 82 | - 2021-07-05: 83 | - 테스트케이스의 자잘한 오타 수정. int형 최댓값 잘못 적음ㅎㅎ;; (21474''3647 -> 21474'8'3647) (제보: hyeonsok) 84 | - 2021-03-22: 85 | - 오류가 발생하는 경우(Error를 출력해야 하는 경우)표준출력이 아닌 표준오류에 출력해야 통과되도록 함 86 | - makefile 메시지 감춤 87 | - bash 파일에 적힌 디렉토리 구조가 잘못되어 있었는데, 올바르게 고침 88 | - 2021-03-15: birthday 89 | -------------------------------------------------------------------------------- /push_swap_tester.bash: -------------------------------------------------------------------------------- 1 | # **************************************************************************** # 2 | # # 3 | # ::: :::::::: # 4 | # push_swap_tester.bash :+: :+: :+: # 5 | # +:+ +:+ +:+ # 6 | # By: minckim +#+ +:+ +#+ # 7 | # +#+#+#+#+#+ +#+ # 8 | # Created: 2021/03/14 18:07:27 by minckim #+# #+# # 9 | # Updated: 2021/11/29 15:27:28 by minckim ### ########.fr # 10 | # # 11 | # **************************************************************************** # 12 | 13 | #!/bin/bash 14 | 15 | #============================================================================== 16 | # Directroy 17 | 18 | # |- [ push_swap ] 19 | # |- Makefile (Your push_swap Makefile) 20 | # |- checker_linux (or checker_Mac) 21 | # |- [ push_swap_tester ] 22 | # |- push_swap_tester.bash 23 | # |- random_numbers.cpp 24 | # |- Makefile 25 | 26 | #============================================================================== 27 | # push_swap directory 28 | 29 | PUSHSWAP_DIR=../push_swap 30 | 31 | #============================================================================== 32 | # OS 33 | 34 | OS="Mac" 35 | # OS="linux" 36 | 37 | #============================================================================== 38 | 39 | # 40 | # 41 | # 42 | # 여백의 미 43 | # 44 | # 45 | # 46 | 47 | #============================================================================== 48 | # Colors 49 | BLACK=$'\033[0;30m' 50 | RED=$'\033[0;31m' 51 | GREEN=$'\033[0;32m' 52 | YELLOW=$'\033[0;33m' 53 | BLUE=$'\033[0;34m' 54 | PURPLE=$'\033[0;35m' 55 | CYAN=$'\033[0;36m' 56 | WHITE=$'\033[0;39m' 57 | 58 | #============================================================================== 59 | # Path 60 | PUSHSWAP=$PUSHSWAP_DIR/push_swap 61 | if [[ $OS = "linux" ]] 62 | then 63 | CHECKER=$PUSHSWAP_DIR/checker_linux 64 | elif [[ $OS = "Mac" ]] 65 | then 66 | CHECKER=$PUSHSWAP_DIR/checker_Mac 67 | else 68 | CHECKER=$PUSHSWAP_DIR/checker 69 | fi 70 | TESTER=./random_numbers 71 | 72 | #============================================================================== 73 | # Functions 74 | 75 | BORDER_LINE="------------------------------------" 76 | 77 | # parameters: 78 | # $1 : number of args 79 | function print_arguments(){ 80 | if [ $1 -ge 32 ] 81 | then 82 | echo " Arguments : "$1" elements" 83 | else 84 | echo " Arguments : $2 $3 $4 $5 $6" 85 | fi 86 | } 87 | 88 | 89 | # parameters: 90 | # $1 : result 91 | # $2 : to be displayed 92 | function print_display(){ 93 | if [[ "$1" = "PASS" ]] 94 | then 95 | echo " Display : "$GREEN$2$WHITE 96 | else 97 | echo " Display : "$RED$2$WHITE 98 | fi 99 | } 100 | 101 | 102 | # parameters: 103 | # $1 : answer to print 104 | function print_result(){ 105 | if [ $1 == "FAIL" ] 106 | then 107 | echo " Result : "$RED"FAIL"$WHITE 108 | echo $RED$BORDER_LINE$WHITE 109 | else 110 | echo " Result : "$GREEN"PASS"$WHITE 111 | echo $GREEN$BORDER_LINE$WHITE 112 | fi 113 | } 114 | 115 | 116 | # parameters: 117 | # $1 : arg1 118 | # $2 : arg2 119 | # $3 : arg3 120 | function test_error(){ 121 | print_arguments 3 $1 $2 $3 122 | ARG="$1 $2 $3" 123 | # ANS_OUT=$(echo "" | $CHECKER $ARG 2>/dev/null) 124 | ANS_OUT=$(echo "" | $CHECKER $ARG 2>/dev/null) 125 | ANS_ERR=$(echo "" | $CHECKER $ARG 2>&1 > /dev/null) 126 | if [ ! -z $ANS_OUT ] 127 | then 128 | # echo "Display : "$RED$ANS_OUT$WHITE"(Standard out)" 129 | print_display FAIL $ANS_OUT"(Error should be displayed on stderr.)" 130 | print_result "FAIL" 131 | elif [[ "Error" = "$ANS_ERR" ]] 132 | then 133 | print_display PASS $ANS_ERR 134 | print_result "PASS" 135 | else 136 | print_display FAIL $ANS_ERR 137 | print_result "FAIL" 138 | fi 139 | } 140 | 141 | # parameters: 142 | # $1 : number of args 143 | # $2 : arg1 144 | # $3 : arg2 145 | # $4 : arg3 146 | # $5 : arg4 147 | # $6 : arg5 148 | function test(){ 149 | if [[ $1 -le 3 ]] 150 | then 151 | ARG="$2 $3 $4 $5 $6" 152 | else 153 | ARG=$($TESTER $1 1) 154 | fi 155 | print_arguments $1 $ARG 156 | SCORE=-1 157 | 158 | ANS=$($PUSHSWAP $ARG | $CHECKER $ARG) 159 | INS=$($PUSHSWAP $ARG | wc -l) 160 | 161 | 162 | RESULT="PASS" 163 | if [[ ! "$ANS" = "OK" ]] 164 | then 165 | RESULT="FAIL" 166 | fi 167 | 168 | if [[ "$RESULT" = "PASS" ]] 169 | then 170 | print_display PASS $ANS 171 | else 172 | print_display FAIL $ANS 173 | fi 174 | 175 | 176 | INS_RESULT="PASS" 177 | if [[ $1 -eq 3 ]] 178 | then 179 | if [[ $INS -gt 3 ]] 180 | then 181 | INS_RESULT="FAIL" 182 | fi 183 | elif [[ $1 -eq 5 ]] 184 | then 185 | if [[ $INS -gt 12 ]] 186 | then 187 | INS_RESULT="FAIL" 188 | fi 189 | elif [[ $1 -eq 100 ]] 190 | then 191 | if [[ $INS -le 700 ]] 192 | then 193 | SCORE="5" 194 | elif [[ $INS -le 900 ]] 195 | then 196 | SCORE="4" 197 | elif [[ $INS -le 1100 ]] 198 | then 199 | SCORE="3" 200 | elif [[ $INS -le 1300 ]] 201 | then 202 | SCORE="2" 203 | elif [[ $INS -le 1500 ]] 204 | then 205 | SCORE="1" 206 | else 207 | SCORE="0" 208 | INS_RESULT="FAIL" 209 | fi 210 | elif [[ $1 -eq 500 ]] 211 | then 212 | if [[ $INS -le 5500 ]] 213 | then 214 | SCORE="5" 215 | elif [[ $INS -le 7000 ]] 216 | then 217 | SCORE="4" 218 | elif [[ $INS -le 8500 ]] 219 | then 220 | SCORE="3" 221 | elif [[ $INS -le 10000 ]] 222 | then 223 | SCORE="2" 224 | elif [[ $INS -le 11500 ]] 225 | then 226 | SCORE="1" 227 | else 228 | SCORE="0" 229 | INS_RESULT="FAIL" 230 | fi 231 | fi 232 | 233 | if [[ "$INS_RESULT" = "PASS" ]] 234 | then 235 | if [[ $SCORE -ne -1 ]] 236 | then 237 | if [[ $SCORE -eq 5 ]] 238 | then 239 | echo " Score : "$GREEN$SCORE$WHITE 240 | echo "Instructions : "$GREEN$INS$WHITE 241 | elif [[ $SCORE -ge 1 ]] 242 | then 243 | echo " Score : "$YELLOW$SCORE$WHITE 244 | echo "Instructions : "$YELLO$INS$WHITE 245 | else 246 | echo " Score : "$RED$SCORE$WHITE 247 | echo "Instructions : "$RED$INS$WHITE 248 | fi 249 | else 250 | if [[ "$INS_RESULT" = "PASS" ]] 251 | then 252 | echo "Instructions : "$GREEN$INS$WHITE 253 | else 254 | echo "Instructions : "$RED$INS$WHITE 255 | fi 256 | fi 257 | fi 258 | 259 | 260 | if [[ $INS_RESULT = "FAIL" ]] 261 | then 262 | RESULT="FAIL" 263 | fi 264 | 265 | print_result $RESULT 266 | } 267 | 268 | function run_non_arg_test(){ 269 | echo "$CHECKER (with no argument): " 270 | ANS="$($CHECKER)" 271 | if [ -z $ANS ] 272 | then 273 | print_display PASS $ANS 274 | print_result PASS 275 | else 276 | print_display FAIL $ANS 277 | print_result FAIL 278 | fi 279 | echo "$PUSHSWAP (with no argument): " 280 | ANS="$($PUSHSWAP)" 281 | if [ -z $ANS ] 282 | then 283 | print_display PASS $ANS 284 | print_result PASS 285 | else 286 | print_display FAIL $ANS 287 | print_result FAIL 288 | fi 289 | } 290 | 291 | #============================================================================== 292 | # makefile 293 | 294 | # random numbers 295 | echo "Building random number creator..." 296 | if [[ -z $(make 2>&1 > /dev/null) ]] 297 | then 298 | echo $GREEN" Building Successs!"$WHITE 299 | else 300 | echo $RED" Building Failed!"$WHITE 301 | exit 1 302 | fi 303 | 304 | # push_swap 305 | echo "Building push_swap..." 306 | if [[ -z $(make -C $PUSHSWAP_DIR 2>&1 > /dev/null) ]] 307 | then 308 | echo $GREEN" Building Successs!"$WHITE 309 | else 310 | echo $RED" Building Failed!"$WHITE 311 | exit 1 312 | fi 313 | echo $GREEN$BORDER_LINE$WHITE 314 | 315 | #============================================================================== 316 | # TEST START 317 | 318 | # no arg test 319 | run_non_arg_test 320 | 321 | # duplicates 322 | test_error 1 2 2 323 | test_error 2 2 1 324 | test_error 2 1 2 325 | test_error a 1 2 326 | test_error 1 a 2 327 | test_error 1 2 a 328 | test_error 1 2 2147483648 329 | test_error 1 2 -2147483649 330 | # negative numbers, near overflow 331 | test 3 1 -5 2 332 | test 3 1 -2147483648 2 333 | test 3 2147483647 2 1 334 | # # 3 elements 335 | test 3 2 0 1 336 | test 3 1 2 3 337 | test 3 1 3 2 338 | test 3 2 1 3 339 | test 3 2 3 1 340 | test 3 3 1 2 341 | test 3 3 2 1 342 | # 4 elements 343 | test 4 344 | test 4 345 | test 4 346 | test 4 347 | test 4 348 | # 5 elements 349 | test 5 350 | test 5 351 | test 5 352 | test 5 353 | test 5 354 | test 5 355 | test 5 356 | # 100 elements 357 | test 100 358 | test 100 359 | test 100 360 | test 100 361 | test 100 362 | test 100 363 | # 500 elements 364 | test 500 365 | test 500 366 | test 500 367 | test 500 368 | test 500 369 | test 500 370 | 371 | rm $TESTER -------------------------------------------------------------------------------- /random_numbers.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* random_numbers.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: minckim +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/03/07 01:27:52 by minckim #+# #+# */ 9 | /* Updated: 2021/03/30 04:28:35 by minckim ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | 19 | int myrandom(long min, long max) 20 | { 21 | std::random_device random_device; 22 | std::mt19937 generator(random_device()); 23 | std::uniform_int_distribution distribute(min, max); 24 | return distribute(generator); 25 | } 26 | 27 | void random_number_vector(std::vector& v, int size, int min = 1, int max = 1) 28 | { 29 | if (min > max) 30 | std::swap(min, max); 31 | if (max + 1 - min < size) 32 | max = min + size - 1; 33 | 34 | std::vector v_tmp; 35 | v_tmp.reserve(max - min + 1); 36 | for (int i = min ; i <= max ; i++) 37 | v_tmp.push_back(i); 38 | for (int i = 0 ; i < max - min + 1 ; i++) 39 | std::swap(v_tmp[i], v_tmp[myrandom(0, max - min)]); 40 | for (int i = 0 ; i < size ; i++) 41 | v.push_back(v_tmp[i]); 42 | } 43 | 44 | int main(int argc, char** argv) 45 | { 46 | std::vector v; 47 | 48 | int size; 49 | int min; 50 | int max; 51 | if (argc < 2) 52 | { 53 | std::cout << "Usage: " << argv[0] << " [min] [max]\n" 54 | << "- and is optional arguments.\n" 55 | << "- Default value of and is 1. But must be defined.\n" 56 | << "- If ( - ) is less than , would be changed to fit the \n" 57 | << "- To set ARG:\n\n" 58 | << " $ export ARG=\"$(" << argv[0] << " [min] [max])\"\n\n" 59 | << "- By: minckim \n"; 60 | return 1; 61 | } 62 | try 63 | { 64 | size = atoi(argv[1]); 65 | if (argc >= 3) 66 | min = atoi(argv[2]); 67 | else 68 | min = 0; 69 | if (argc >= 4) 70 | { 71 | max = atoi(argv[3]); 72 | max = max > min + size - 1 ? max : min + size - 1; 73 | } 74 | else 75 | max = min + size - 1; 76 | } 77 | catch(const std::exception& e) 78 | { 79 | std::cout << e.what() << '\n'; 80 | return 1; 81 | } 82 | random_number_vector(v, size, min, max); 83 | for (int i : v) 84 | { 85 | std::cout << i << " "; 86 | } 87 | return 0; 88 | } --------------------------------------------------------------------------------