Last active
November 2, 2021 20:51
-
-
Save JosefKuchar/bb83284d309465bdf7d9353e26dfa6e8 to your computer and use it in GitHub Desktop.
Testy na 1. IZP projekt 2021
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python3 | |
# | |
# Testy na 1. IZP projekt 2021 | |
# Vytvoril Josef Kuchar (xkucha28) - josefkuchar.com | |
# Priklad pouziti: ./test.py pwcheck | |
# Help se vypise pres argument -h | |
# Revize: 8 | |
from subprocess import run, PIPE | |
import sys | |
import argparse | |
OK = "\033[1;32;40m[ OK ]\033[0;37;40m" | |
FAIL = "\033[1;31;40m[FAIL]\033[0;37;40m" | |
class Tester: | |
def __init__(self, program_name): | |
self.program_name = './' + program_name | |
self.test_count = 0 | |
self.pass_count = 0 | |
def test(self, test_name, args, input, output='', intentional_error=False): | |
self.test_count += 1 | |
error = False | |
msg = "" | |
p = None | |
try: | |
p = run([self.program_name] + args, stdout=PIPE, stderr=PIPE, | |
input=input, encoding='ascii') | |
except UnicodeDecodeError as e: | |
print(FAIL, test_name) | |
print('Vystup pravdepodobne obsahuje znaky mimo ASCII (diakritika?)') | |
print(e) | |
sys.exit() | |
except Exception as e: | |
print(FAIL, test_name) | |
print('Chyba pri volani programu!') | |
print(e) | |
sys.exit() | |
if p.returncode != 0: | |
if not intentional_error: | |
error = True | |
msg += 'Program vratil chybovy navratovy kod ({}) prestoze nemel!\n'.format(p.returncode) | |
else: | |
if intentional_error: | |
error = True | |
msg += 'Program vratil uspesne dokonceni (kod 0) prestoze nemel!\n' | |
if output.rstrip() != p.stdout.rstrip(): | |
error = True | |
msg += 'Vystup programu se neshoduje s predpokladanym vystupem!\n' | |
if intentional_error and p.stderr == '': | |
error = True | |
msg = 'Program nevratil na STDERR zadnou chybovou zpravu!\n' | |
if error: | |
print(FAIL, test_name) | |
print(msg) | |
print('Argumenty: ', ' '.join(args)) | |
print("Predpokladany vystup:") | |
print(output) | |
print("STDOUT:") | |
print(p.stdout) | |
print("STDERR:") | |
print(p.stderr) | |
else: | |
self.pass_count += 1 | |
print(OK, test_name) | |
def print_stats(self): | |
print('Uspesnost: {}/{} ({:.2f}%)'.format(self.pass_count, self.test_count, (self.pass_count / self.test_count) * 100)) | |
pass | |
HESLA_TXT = '1234567890\nPassword\nHeslo123\nMojevelmidlouhehesloscislem0\nIZP2021:fit@vut.cz\n' | |
HESLA_TXT_CRLF = '1234567890\r\nPassword\r\nHeslo123\r\nMojevelmidlouhehesloscislem0\r\nIZP2021:fit@vut.cz\r\n' | |
if __name__ == '__main__': | |
parser = argparse.ArgumentParser(description='Tester 1. IZP projektu') | |
parser.add_argument('prog', metavar='P', type=str, help='Jmeno programu (napriklad: pwcheck)') | |
parser.add_argument('--bonus', dest='bonus', action='store_true', help='Kontrola bonusoveho parsovani argumentu') | |
parser.add_argument('--crlf', dest='crlf', action='store_true', help='Kontrola podpory CRLF vstupu') | |
parser.add_argument('--no-color', dest='color', action='store_false', help='Vystup bez barev') | |
args = parser.parse_args() | |
if not args.color: | |
OK = '[ OK ]' | |
FAIL = '[FAIL]' | |
t1 = Tester(args.prog) | |
t2 = Tester(args.prog) | |
t3 = Tester(args.prog) | |
# Testy ze zadani | |
t1.test('Test ze zadani #1', ['1', '1'], HESLA_TXT, 'Password\nHeslo123\nMojevelmidlouhehesloscislem0\nIZP2021:fit@vut.cz\n') | |
t1.test('Test ze zadani #2', ['2', '3'], HESLA_TXT, 'Heslo123\nMojevelmidlouhehesloscislem0\nIZP2021:fit@vut.cz\n') | |
t1.test('Test ze zadani #3', ['3', '2'], HESLA_TXT, 'Heslo123\nMojevelmidlouhehesloscislem0\nIZP2021:fit@vut.cz\n'), | |
t1.test('Test ze zadani #4', ['4', '2'], HESLA_TXT, 'Heslo123\nIZP2021:fit@vut.cz\n'), | |
t1.test('Test ze zadani #5', ['2', '4', '--stats'], HESLA_TXT, 'IZP2021:fit@vut.cz\nStatistika:\nRuznych znaku: 36\nMinimalni delka: 8\nPrumerna delka: 14.4\n') | |
# Vlastni testy pravidel | |
t1.test('Test na LEVEL 1 #1', ['1', '1'], 'Aa\n', 'Aa\n') | |
t1.test('Test na LEVEL 1 #2', ['1', '1'], 'Zz\n', 'Zz\n') | |
t1.test('Test na LEVEL 1 #3', ['1', '1'], 'aaa\n', '') | |
t1.test('Test na LEVEL 1 #4', ['1', '1'], 'A0\n', '') | |
t1.test('Test na LEVEL 2 #1', ['2', '1'], 'aaaaa\n', '') | |
t1.test('Test na LEVEL 2 #2', ['2', '2'], 'Aa\n', 'Aa\n') | |
t1.test('Test na LEVEL 2 #3', ['2', '2'], 'Zz\n', 'Zz\n') | |
t1.test('Test na LEVEL 2 #4', ['2', '4'], '%aZ0\n', '%aZ0\n') | |
t1.test('Test na LEVEL 2 #5', ['2', '5'], '%aZ0\n', '%aZ0\n') | |
t1.test('Test na LEVEL 2 #6', ['2', '4'], 'aZ0\n', '') | |
t1.test('Test na LEVEL 2 #7', ['2', '3'], 'aZ0\n', 'aZ0\n') | |
t1.test('Test na LEVEL 2 #8', ['2', '4'], 'Aa 0\n', 'Aa 0\n') | |
t1.test('Test na LEVEL 3 #1', ['3', '1'], 'Aa\n', '') | |
t1.test('Test na LEVEL 3 #2', ['3', '2'], 'Aa\n', 'Aa\n') | |
t1.test('Test na LEVEL 3 #3', ['3', '2'], 'AAa\n', '') | |
t1.test('Test na LEVEL 3 #4', ['3', '4'], 'Az0!!!\n', 'Az0!!!\n') | |
t1.test('Test na LEVEL 3 #5', ['3', '4'], 'Az0!!!!\n', '') | |
t1.test('Test na LEVEL 3 #6', ['3', '5'], 'Az0!!!!\n', 'Az0!!!!\n') | |
t1.test('Test na LEVEL 3 #7', ['3', '5'], 'Az0!!!!!\n', '') | |
t1.test('Test na LEVEL 4 #1', ['4', '1'], 'Aa\n', '') | |
t1.test('Test na LEVEL 4 #2', ['4', '2'], 'Aaha\n', 'Aaha\n') | |
t1.test('Test na LEVEL 4 #3', ['4', '2'], 'Abhaha\n', '') | |
t1.test('Test na LEVEL 4 #4', ['4', '3'], '0Abhaha\n', '0Abhaha\n') | |
t1.test('Test na LEVEL 4 #5', ['4', '3'], '0Abx0Abx\n', '') | |
t1.test('Test na LEVEL 4 #6', ['4', '3'], '0Ahahah\n', '') | |
t1.test('Test na LEVEL 4 #7', ['4', '4'], '%aZ0x%aZ\n', '%aZ0x%aZ\n') | |
t1.test('Test na LEVEL 4 #8', ['4', '4'], '%aZ0x%aZ0\n', '') | |
t1.test('Test na LEVEL 4 #9', ['4', '4'], '%aZ0hahaha\n', '') | |
t1.test('Test na LEVEL 4 #10', ['4', '5'], '%aZ0hahaha\n', '%aZ0hahaha\n') | |
t1.test('Test na LEVEL 4 #11', ['4', '5'], '%aZ0hahahah\n', '') | |
t1.test('Test na LEVEL 4 #12', ['4', '5'], 'hahah%aZ0hahah\n', '') | |
# Pocet argumentu | |
t1.test('Nedostatecny pocet argumentu', ['1'], HESLA_TXT, intentional_error=True) | |
t1.test('Prilis mnoho argumentu', ['1', '1', '--stats', '1'], HESLA_TXT, intentional_error=True) | |
# Parsovani cisel v argumentech | |
t1.test('Ciselne argumenty maji pismena na konci', ['1a', '1a'], HESLA_TXT, intentional_error=True) | |
t1.test('Cislene argumenty maji pismena na zacatku', ['a1', 'a1'], HESLA_TXT, intentional_error=True) | |
t1.test('Cislene argumenty maji pismena uprostred', ['0a1', '0a1'], HESLA_TXT, intentional_error=True) | |
# Testovani rozsahu prvniho argumentu | |
t1.test('Prvni argument mimo rozsah #1: 0', ['0', '1'], HESLA_TXT, intentional_error=True) | |
t1.test('Prvni argument mimo rozsah #2: 5', ['5', '1'], HESLA_TXT, intentional_error=True) | |
t1.test('Prvni argument mimo rozsah #3: 2000000000', ['2000000000', '1'], HESLA_TXT, intentional_error=True) | |
t1.test('Prvni argument mimo rozsah #4: vetsi nez LONG_MAX', ['10223372036854775807', '1'], HESLA_TXT, intentional_error=True) | |
t1.test('Prvni argument mimo rozsah #5: -2000000000', ['-2000000000', '1'], HESLA_TXT, intentional_error=True) | |
t1.test('Prvni argument mimo rozsah #6: mensi nez LONG_MIN', ['-10223372036854775807', '1'], HESLA_TXT, intentional_error=True) | |
# Testovani rozsahu druheho argumentu | |
t1.test('Druhy argument mimo rozsah #1: 0', ['1', '0'], HESLA_TXT, intentional_error=True) | |
t1.test('Druhy argument mimo rozsah #2: -2000000000', ['1', '-2000000000'], HESLA_TXT, intentional_error=True) | |
t1.test('Druhy argument mimo rozsah #3: mensi nez LONG_MIN', ['1', '-10223372036854775807'], HESLA_TXT, intentional_error=True) | |
t1.test('Druhy argument velky: vetsi nez LONG_MAX', ['4', '10223372036854775807'], HESLA_TXT, 'IZP2021:fit@vut.cz\n') | |
# Testovani parsovani tretiho argumentu | |
t1.test('Treti argument (--stats) neplatny #1: --haha', ['1', '1', '--haha'], HESLA_TXT, intentional_error=True) | |
t1.test('Treti argument (--stats) neplatny #2: --statshaha', ['1', '1', '--statshaha'], HESLA_TXT, intentional_error=True) | |
t1.test('Treti argument (--stats) neplatny #3: stats', ['1', '1', 'stats'], HESLA_TXT, intentional_error=True) | |
# Testovani ruznych moznosti vstupu | |
t1.test('Maximalni delka hesla', ['1', '1', '--stats'], 'A' * 100 +'\n', 'Statistika:\nRuznych znaku: 1\nMinimalni delka: 100\nPrumerna delka: 100.0\n') | |
t1.test('Heslo prilis dlouhe #1: 101', ['1', '1'], 'A' * 101 + '\n', intentional_error=True) | |
t1.test('Heslo prilis dlouhe #2: 10000', ['1', '1'], 'A' * 10000 + '\n', intentional_error=True) | |
t1.test('Zadna hesla', ['1', '1', '--stats'], '\n', 'Statistika:\nRuznych znaku: 0\nMinimalni delka: 0\nPrumerna delka: 0.0\n') | |
t1.test('Velky pocet hesel: 10000', ['1', '1', '--stats'], 'A\n' * 10000, 'Statistika:\nRuznych znaku: 1\nMinimalni delka: 1\nPrumerna delka: 1.0\n') | |
if args.bonus: | |
# Bonusove reseni | |
t2.test('BONUS | Bez argumentu', [], HESLA_TXT, 'Password\nHeslo123\nMojevelmidlouhehesloscislem0\nIZP2021:fit@vut.cz\n') | |
t2.test('BONUS | Validni argumenty #1', ['-l', '2', '-p', '4', '--stats'], HESLA_TXT, 'IZP2021:fit@vut.cz\nStatistika:\nRuznych znaku: 36\nMinimalni delka: 8\nPrumerna delka: 14.4\n') | |
t2.test('BONUS | Validni argumenty #2', ['--stats', '-p', '4', '-l', '2'], HESLA_TXT, 'IZP2021:fit@vut.cz\nStatistika:\nRuznych znaku: 36\nMinimalni delka: 8\nPrumerna delka: 14.4\n') | |
t2.test('BONUS | Neexistujici prepinac', ['-l', '2', '-i', '1'], HESLA_TXT, intentional_error=True) | |
t2.test('BONUS | Neexistujici hodnota po prepinaci', ['-p'], HESLA_TXT, intentional_error=True) | |
t2.test('BONUS | Prepinac za prepinacem', ['-p', '-l'], HESLA_TXT, intentional_error=True) | |
if args.crlf: | |
# CRLF podpora | |
t3.test('CRLF | Test ze zadani ale CRLF #1', ['1', '1'], HESLA_TXT_CRLF, 'Password\nHeslo123\nMojevelmidlouhehesloscislem0\nIZP2021:fit@vut.cz\n') | |
t3.test('CRLF | Test ze zadani ale CRLF #2', ['2', '4', '--stats'], HESLA_TXT_CRLF, 'IZP2021:fit@vut.cz\nStatistika:\nRuznych znaku: 36\nMinimalni delka: 8\nPrumerna delka: 14.4\n') | |
t3.test('CRLF | Vstup bez noveho radku na konci', ['1', '1', '--stats'], 'Aaaa\r\nAAAa', 'Aaaa\nAAAa\nStatistika:\nRuznych znaku: 2\nMinimalni delka: 4\nPrumerna delka: 4.0\n') | |
print('-- STATISTIKA --') | |
print('Zakladni reseni:') | |
t1.print_stats() | |
if args.bonus: | |
print('Bonusove reseni') | |
t2.print_stats() | |
if args.crlf: | |
print('CRLF podpora') | |
t3.print_stats() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment