Skip to content

Commit b67189f

Browse files
committed
Dodano skrypty testujące
1 parent f749094 commit b67189f

File tree

3 files changed

+203
-0
lines changed

3 files changed

+203
-0
lines changed

skrypty/testuj.sh

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
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}"

skrypty/testuj_bardzo_mini.sh

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#!/bin/bash
2+
# Szczegóły działania skryptu możesz poczytać w testuj.sh, tu jest tylko mały wycinek.
3+
brute=$1
4+
model=$2
5+
gen=$3
6+
7+
make $brute || exit 1
8+
make $model || exit 1
9+
make $gen || exit 1
10+
11+
set +x
12+
13+
run() {
14+
/usr/bin/time -f "seconds=%e\nkbytes=%M\nexit_code=%x" -o $1.time \
15+
./$1 < test.in > $1.out 2> $1.err;
16+
17+
source $1.time
18+
if [[ $exit_code -ne 0 ]]; then
19+
exit 1
20+
fi
21+
}
22+
23+
for ((i=0; ; ++i)); do
24+
echo -ne "$i "
25+
./$gen > test.in
26+
run $brute || exit 1
27+
run $model || exit 1
28+
29+
cmp $brute.out $model.out || break
30+
source ${model}.time
31+
echo -ne "[OK] ${seconds}s $(expr ${kbytes} / 1024)MB "
32+
done
33+
34+
echo "[ERROR]"

skrypty/testuj_mini.sh

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#!/bin/bash
2+
3+
# Tu sobie ustawiamy flagi jakie chcemy, najlepiej z ustaleń technicznych konkursu.
4+
# Ewentualnie debugowe.
5+
compile() {
6+
g++ -g -O3 -static $1.cpp -o $1
7+
}
8+
9+
# Nazwy plików bruta, wzorcówki i generatorki bez rozszerzeń.
10+
brute=$1
11+
model=$2
12+
gen=$3
13+
14+
TL=1
15+
16+
# Przed testowaniem kompilujemy - wywalamy skrypt przy błędzie kompilacji.
17+
# set -x sprawia, że terminal wypisuje wszystkie komendy które uruchamia a nie tylko ich wynik.
18+
set -x
19+
compile $brute || exit 1
20+
compile $model || exit 1
21+
compile $gen || exit 1
22+
23+
# set +x wyłącza wypisywanie komend.
24+
set +x
25+
26+
# 'run xyz' Odpala program o nazwie xyz z limitem czasu
27+
# - zapisuje zużycie czasu i pamięci w pliku xyz.time
28+
# - wyjście programu w pliku xyz.out
29+
run() {
30+
# Zapisujemy istotne wyniki /usr/bin/time do pliku.
31+
# `\` pozwala podzielić komendę na kilka linijek.
32+
timeout $TL \
33+
/usr/bin/time -f "seconds=%e\nkbytes=%M\nexit_code=%x" -o $1.time \
34+
./$1 < test.in > $1.out 2> $1.err;
35+
36+
# Ważne - jak nie damy spacji między nawiasami a argumentami to dostaniemy enigmatyczny `Syntax error`.
37+
# Operatory porównań: -ne (not equal), -ge (greater or equal), -lt (less than), -gt (greater than), -eq (equals).
38+
if [ $? -ne 0 ]; then
39+
exit 1
40+
fi
41+
42+
source $1.time
43+
if [[ $exit_code -ne 0 ]]; then
44+
exit 1
45+
fi
46+
}
47+
48+
# Testujemy w nieskończoność, można dopisać np. i < 1000 do fora, żeby było mniej testów.
49+
for ((i=0; ; ++i)); do
50+
echo -ne "$i "
51+
./$gen > test.in
52+
run $brute || exit 1
53+
run $model || exit 1
54+
55+
# `cmp` wypisze nam tylko gdzie jest pierwszy błąd.
56+
# jeśli chcemy wszystkie można je zamienić na `diff`
57+
# Jak jest jakiś błąd przerywamy skrypt.
58+
cmp $brute.out $model.out || break
59+
60+
# Wczytuje zużycie czasu i pamięci z pliku .time wyplutego przez wzorcówkę.
61+
source ${model}.time
62+
63+
echo -ne "[OK] ${seconds}s $(expr ${kbytes} / 1024)MB "
64+
done
65+
66+
echo "[ERROR]"

0 commit comments

Comments
 (0)