|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +# Tu sobie ustawiamy flagi jakie chcemy, najlepiej z ustaleń technicznych konkursu. |
| 4 | +# Ewentualnie debugowe. |
| 5 | +compile() { |
| 6 | + echo "g++ -g -O3 -static $1.cpp -o $1" |
| 7 | + g++ -g -O3 -static $1.cpp -o $1 |
| 8 | +} |
| 9 | + |
| 10 | +# Sprawdzamy czy poprawnie odpaliliśmy skrypt. |
| 11 | +if [[ $# -lt 3 ]]; then |
| 12 | + echo "sposób użycia: ./testuj <brut> <wzorcówka> <generatorka> [limit czasu w sekundach]" |
| 13 | + echo "" |
| 14 | + echo "nazwy wpisuj bez końcówki .cpp," |
| 15 | + echo "np. ./testuj kolb kol kolg 3" |
| 16 | + exit 1 |
| 17 | +fi |
| 18 | + |
| 19 | +# Nazwy plików bruta, wzorcówki i generatorki bez rozszerzeń. |
| 20 | +brute=$1 |
| 21 | +model=$2 |
| 22 | +gen=$3 |
| 23 | + |
| 24 | +# Ustawiamy time limit w sekundach, domyślnie sekunda. |
| 25 | +TL=1 |
| 26 | +if [[ $# -gt 3 ]]; then |
| 27 | + TL=$4 |
| 28 | +fi |
| 29 | + |
| 30 | +# Przed testowaniem kompilujemy - wywalamy skrypt przy błędzie kompilacji. |
| 31 | +# set -x sprawia, że terminal wypisuje wszystkie komendy które uruchamia a nie tylko ich wynik. |
| 32 | +set -x |
| 33 | +compile $brute || exit 1 |
| 34 | +compile $model || exit 1 |
| 35 | +compile $gen || exit 1 |
| 36 | + |
| 37 | +# set +x wyłącza wypisywanie komend. |
| 38 | +set +x |
| 39 | + |
| 40 | +# Kolory czcionki terminala, żeby ich użyć w echo przed napisem dopisz ${KOLOR}. |
| 41 | +RESET=$(tput setaf sgr0) # Ten kolor przywraca domyślny kolor czcionki. |
| 42 | +RED=$(tput setaf 1) |
| 43 | +GREEN=$(tput setaf 2) |
| 44 | +YELLOW=$(tput setaf 3) |
| 45 | +BLUE=$(tput setaf 4) |
| 46 | +GRAY=$(tput setaf 244) |
| 47 | + |
| 48 | + |
| 49 | +# Timeout domyślnie ignoruje CTRL+C i czeka aż program wytimeoutuje, |
| 50 | +# przez co czasem trudno zatrzymać skrypt. |
| 51 | +# Żeby zawsze od razu reagował na CTRL+C trzeba przechwycić CTRL+C trapem i go zabić. |
| 52 | +trap 'echo "Aborted."; pkill -P $$; exit 1' INT |
| 53 | + |
| 54 | +# 'run xyz' Odpala program o nazwie xyz z limitem czasu |
| 55 | +# - zapisuje zużycie czasu i pamięci w pliku xyz.time |
| 56 | +# - wyjście programu w pliku xyz.out |
| 57 | +run() { |
| 58 | + # --foreground sprawia, że sygnał CTRL+C pójdzie też do programu a nie tylko do timeout. |
| 59 | + timeout --foreground $TL \ |
| 60 | + /usr/bin/time -f "seconds=%e\nkbytes=%M\nexit_code=%x" -o $1.time \ # Zapisujemy istotne wyniki /usr/bin/time do pliku. |
| 61 | + ./$1 < test.in > $1.out 2> $1.err; |
| 62 | + |
| 63 | + exit_code=$? |
| 64 | + # Jak program zakończył wykonanie z kodem 124 (SIGTERM) to znaczy, że komenda timeout go zabiła. |
| 65 | + if [ $exit_code -eq 124 ]; then |
| 66 | + echo "${BLUE}[TLE]${GRAY} ($1.cpp, exit code ${exit_code} }limit was set to ${TL} seconds)${RESET}" |
| 67 | + exit 1 |
| 68 | + elif [ $exit_code -ne 0 ]; then |
| 69 | + echo "${YELLOW}[RE]${GRAY} ($1, /usr/bin/time exit code ${exit_code})${RESET}" |
| 70 | + exit 1 |
| 71 | + fi |
| 72 | + |
| 73 | + source $1.time |
| 74 | + if [[ $exit_code -ne 0 ]]; then |
| 75 | + echo "${YELLOW}[RE]${GRAY} ($1, exit code ${exit_code})${RESET}" |
| 76 | + echo "Check $1.err for details" |
| 77 | + exit 1 |
| 78 | + fi |
| 79 | +} |
| 80 | + |
| 81 | +# Testujemy w nieskończoność, można dopisać np. i < 1000 do fora, żeby było mniej testów. |
| 82 | +for ((i=0; ; ++i)); do |
| 83 | + echo -ne "$i " |
| 84 | + ./$gen > test.in |
| 85 | + run $brute || exit 1 |
| 86 | + run $model || exit 1 |
| 87 | + |
| 88 | + # `cmp` wypisze nam tylko gdzie jest pierwszy błąd. |
| 89 | + # jeśli chcemy wszystkie można je zamienić na `diff` |
| 90 | + # Jak jest jakiś błąd przerywamy skrypt. |
| 91 | + cmp $brute.out $model.out || break |
| 92 | + |
| 93 | + # Wczytuje zużycie czasu i pamięci z pliku .time wyplutego przez wzorcówkę. |
| 94 | + source ${model}.time |
| 95 | + |
| 96 | + echo -ne "${GREEN}[OK]${RESET} ${seconds}s $(expr ${kbytes} / 1024)MB " |
| 97 | + |
| 98 | + source ${brute}.time |
| 99 | + echo "${GRAY}(brute: ${seconds}s $(expr ${kbytes} / 1024)MB${RESET})" |
| 100 | + |
| 101 | +done |
| 102 | + |
| 103 | +echo "${RED}[WA]${RESET}" |
0 commit comments