RSS

[Linux]Cum sa-ti testezi programele la ONI

22 Mar

Recent am invatat niste chestii foarte misto la faculta care pot fi aplicate cu succes la ONI pentru scrisul rapid al generatoarelor si evaluatoarelor. Provocare pentru cei care n-au ce face: faceti aceleasi chestii pe windows.

Prima chestie pe care e bine s-o aveti in minte e ca nu trebuie sa memorati pasii/comenzile pentur scrierea unui generator, fiecare comanda are pe linux un manual complet de folosire. Puteti sa-l accesati asa:

man comanda

.

Prima data incepeti prin a genera un numar de teste(de ex 100):

//generator pentru problema max square
#include <fstream>
#include <ctime>
#include <cstdlib>
#include <cstdio>
using namespace std;

int n;

int main() {
	for(int t=1; t<=100; ++t) {
		char in[55];
		ofstream g(in);
		sprintf(in,"%d.in",t);
		n=rand()%50+1;
		g<<n<<'\n';
		for(int i=1; i<=n; ++i) {
			for(int j=1; j<=n; ++j) g<<rand()%100-rand()%100<<' ';
			g<<'\n';
		}
	}
}

Acum trebuie sa generam .ok-urile cu un program brut si pe urma sa verificam daca outputul programului bun coincide cu cel din ok. In bash putem redirectiona fisiere catre stdin si stdout catre un fisier(ca si la freopen).

g++ brut.cpp#compilam programul, va genera executabilul a.out
for i in {1..100}; do
	./a.out < $i.in > $i.ok
done

Avand fisierele .ok trebuie sa verificam ca programul sa produca acelasi output.

g++ bun.cpp
for i in {1..100}; do
	echo $i #ce test a fost verificat
	./a.out < $i.in > output
	diff $i.ok output#in caz ca fisierele difera va aparea un mesaj
done

In caz ca vrem sa afisam doar testele pe care pica putem modifica scriptul in felul urmator:

g++ bun.cpp
for i in {1..100}; do
	./a.out < $i.in > output
	if ! diff -q $i.ok output
	then echo "testul $i pica"
	fi
done
Advertisements
 
Leave a comment

Posted by on March 22, 2014 in fun

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s

 
%d bloggers like this: