View Full Version : [CICLO 1] Storie e divisione in task
Nel Ciclo 1 implementeremo due storie.
Storia 1: Il gioco deve disegnare un diamante su uno sfondo nero in finestra o a pieno schermo e riprodurre un suono.
Storia 2: Un sistema di build automatico che gira sul server, scarica l'ultima versione del codice disponibile dal repository e riporta via mail in caso di errori di compilazione o testing.
La Storia 1 e' il vero inizio del progetto. La Storia 2 e' una storia cosiddetta "tecnica", di servizio, che ci servira' per supportare il resto del progetto.
Storia 1. Suddisivisione in task.
T1_1. Aprire una finestra di dimensione fissa (800x600 pixel di client area) [cidimauro 1 giorno COMPLETATO] (-2) +4
T1_2. Inizializzare OpenGL per il disegno 2D e colorare la finestra di nero via OpenGL [TigerShark 2 giorni COMPLETATO] +4
T1_3. Inizializare OpenAL [cisc 1 giorno] COMPLETATO +2
T1_4. Caricare l'immagine del diamante in una texture [Vifani 1 giorno] COMPLETATO +2
T1_5. Disegnare la texture del diamante applicata a due poligoni che formano un quadrato in coordinate schermo nel centro della finestra [Vifani 2 giorni] COMPLETATO +2
T1_6. Caricare un suono e riprodurlo [cisc 1 giorno] COMPLETATO (-2 + 3)
T1_7. Disegnare una texture 64x64 con un diamante [Antares 1 giorno] COMPLETATO
Storia 2. Suddivisione in task a seguire.
Il Ciclo 1 inizia Lunedi' 19 Settembre e si conclude Venerdi' 30 Settembre.
Sta a voi dichiarare su quali task volete lavorare. Quando avete scelto, date anche una stima in giorni da sostituire alla mia.
^TiGeRShArK^
16-09-2005, 19:39
ma ci possiamo prenota re da ora? :fagiano:
no perchè io farei T1_3
(ke tra l'altro mi sfugge perkè è messa prima di T1_2 :fagiano: )
ma ci possiamo prenota re da ora? :fagiano:
no perchè io farei T1_3
(ke tra l'altro mi sfugge perkè è messa prima di T1_2 :fagiano: )
Per un errore che ho appena corretto :)
Si', ci si puo' prenotare fin da ora. Dimmi il task che vuoi fare e la tua stima di tempo.
^TiGeRShArK^
16-09-2005, 21:56
:D
l'ho detto prima quale volevo fare...
Inizializzare OpenGL per il disegno 2D e colorare la finestra di nero via OpenGL
perchè mi interessa e SOPRATTUTTO non penso sia difficilissimo....visto che non ho tanto tempo e devo farmi pure lo spike di jogl sotto win.....
come stima...boh...
penso che vada bene due giorni dato che il primo giorno cmq è in sovrapposizione con lo spike e al lavoro sono messo maluccio in quei giorni.....
spero di farcela! :sofico:
Altrimenti mi aspetta la fustigazione e il pubblico ludibrio mi sa! :fagiano:
Aggiornato.
Vi faccio una piccola richiesta per alleggerire le discussioni :)
Abbiamo tutti altri impegni e soprattutto questo non e' il nostro impegno principale. Quindi diamo per sottointeso e non scriviamo neanche che abbiamo altri impegni e siamo incasinati con altro.
Ma teniamone conto quando diamo le stime: "In questo periodo ho molto da fare, normalmente impiegherei un giorno, ma visto gli impegni posso finirlo in 3 giorni".
L'importante e' che le stime siano accurate e possibilmente sempre in eccesso. In altre parole, se mi dite che fate un task in 3 giorni, fate il commit (PULITO) in 3 giorni, perche' passato il tempo, e' facile che venga riassegnato.
Questo per prevenire stalli nel lavoro attendendo che qualcuno magari troppo impegnato non riesca a concludere il suo task.
Ultima cosa: tengo traccia in un mio db delle vostre previsioni e del tempo che impiegate, per avere dati su cui calcolare la nostra "Velocita'". Non mi interessa che la velocita' sia alta, mi interessa che sia costante e sostenibile.
Vi teniamo d'occhio :D
vorrei prenotarmi per il T1_3, stima 1 giorno;)
Io vorrei prenotarmi per T1_4 e T1_5. Tempo stimato 2 giorni per la consegna di entrambi a partire da quando sarà definito il binding.
Antares88
18-09-2005, 15:32
Fek, ho fatto una prova per la texture del diamante come mi hai chiesto su msn. Eccola con sfondo trasparente:
http://www.hpage.it/img/provadiamante.png
Ed eccola con sfondo nero:
http://www.hpage.it/img/provadiamantesfondonero.jpg
Può andare ?
difficile, quell'immagine ha anche un canale alpha... suppongo che sia PNG (che altro potrei aspettarmi da te anta, che ti conosco bene :D)
come faremo a caricarla nel gioco? dobbiamo interpretare il formato PNG oppure esistono le libpng anche per Java? :|
edit: e invece no, era jpeg!! :eek:
Antares88
18-09-2005, 16:02
quella con sfondo trasparente è png (ma dovrebbe venire bene anche in gif con trasparenza attiva), mentre quella su sfondo nero è in jpg.
La definizione delle API da utilizzare è ancora un punto interrogativo. Sto aspettando di trovare fek online per discuterne.
Ragazzi, usiamo questo thread solo per prenotarsi per i task per cortesia.
Task 1.4 e 1.5 completati. Attendo i test da eseguire :)
^TiGeRShArK^
19-09-2005, 09:49
:confused:
ma alla fine cosa dobbiamo usare?
JOGL o LWGJL?
mi sa che me lo sono perso.... :mbe:
:confused:
ma alla fine cosa dobbiamo usare?
JOGL o LWGJL?
mi sa che me lo sono perso.... :mbe:
LWGJL.
SU forza ragasuoli che il povero Vifani ha fatto 3/4 del lavoro. A guardare il codice ha fatto ben oltre i soli 1.4 e 1.5 :D
ciao ;)
Abbiamo scelto LWGL e le librerie sono nel repository. Partite pure con i vostri task.
Ricordate che il codice e' responsabilita' di tutti. Significa che non dovete chiedere il permesso di scrivere nel codice degl'altri, che se qualcun altro ha gia' scritto il vostro task, potete guardare il codice che ha scritto e cercare di semplificarlo. Siete incoraggiati a scorrere il codice degl'altri e farne refactoring, semplificandolo ed eliminando le duplicazioni.
Ultima cosa:
Un task non e' completato fino a che i test relativi non passano.
E se non ho scritto neppure un test per un task? Allora non e' completato e non ne faccio il sign off.
Per i primi cicli vi scrivo io qualche test obbligatorio per i vari task (fra stamattina e oggi pomeriggio). I test che scrivo non sono i soli che dovete far passare, siete altamente incoraggiati a scriverne altri. Siete molto incoraggiati a scriverli ancora prima di scrivere il codice e farvi una test list, che magari potete postare per i primi tempi, cosi' da scambiarci consigli.
Vi scrivo qui itest da implementare e far passare obbligatoriamente per ogni task.
Task 1
void testEngineCreation()
{
Engine engine = new Engine(800, 600);
assertTrue(engine.IsCreated(), "Engine has not been created correctly");
}
void testDisplaySize()
{
Engine engine = new Engine(800, 600);
assertAreEqual(800, engine.getDisplayWidth(), "Display width must be 800");
assertAreEqual(600, engine.getDisplayHeight(), "Display height must be 600");
}
void testEngineShutdown()
{
Engine engine = new Engine(800, 600);
engine.shutDown();
assertTrue(engine.IsCreated(), "Engine has not shut down correctly");
}
Task 2
Da definire.
Task 3
void testAudioCreation()
{
Audio audio = new Audio();
assertTrue(audio.IsInitialised(), "Audio has not been initialised correctly");
}
void testAudioShutdown()
{
Audio audio = new Audio();
engine.shutDown();
assertTrue(audio.IsCreated(), "Audio has not shut down correctly");
}
Task 4
void testLoadDiamondTexture()
{
Texture texture = new Texture("diamond");
assertTrue(texture.isLoaded(), "texture has not been loaded");
}
void testSize()
{
Texture texture = new Texture("diamond");
assertEqual(64, texture.getWidth(), "texture width is wrong");
assertEqual(64, texture.getHeight(), "texture width is wrong");
}
void testLoadFailed()
{
try
{
Texture texture = new Texture("this_texture_doesnt_exist");
}
catch (TextureNotFoundException)
{
return;
}
assertFail();
}
Task 5
Qui serve un mock, ma primo devo dirvi che cos'e' un mock. Scrivo i test in seguito.
Task 6
void testSound()
{
Sound sound = new Sound("diamond");
assertTrue(sound.isLoaded(), "sound has not been loaded");
}
void testLoadSoundFailed()
{
try
{
Sound sound = new sound("this_sound_doesnt_exist");
}
catch (TextureNotFoundException)
{
return;
}
assertFail();
}
void testPlaySound()
{
Sound sound = new Sound("diamond");
sound.play();
assertTrue(sound.isPlayed(), "sound has not been played");
}
Anche testPlaySound() andrebbe implementato con un mock object. Cosi' non e' molto utile e non vogliamo che i test riproducano effettivamente il suono ogni volta che sono eseguiti. Vedremo in seguito come risolvere il problema.
Non ho compilato i test, ci saranno sicuramente errori di sintassi e magari non sara' proprio Java, ma servono per darvi l'idea dei test che ho bisogno che implementiate.
Ricordate:
Il task non e' completo se questi test non passano.
Implementate solo il codice che serve per far passare questi test. Siete caldamente invitati a scrivere altri test che servano per testare il codice che state scrivendo per far passare questi test.
I nomi delle classi che uso nei test e' "abbastanza" obbligatorio. E' un esempio di come vi dettero' l'architettura del gioco attraverso i test e non attraverso un documento.
Se vedete duplicazioni nei test (e ci sono), siete invitati ad eliminarle usando le feature di JUnit.
Infine, questi test lasciano dei buchi, come il clear dello schermo. Alcune cose non sono facili da testare automaticamente, soprattutto quando c'e' di mezzo la presentazione a video. Vedremo in seguito come possiamo risolvere anche questo problema. Per ora abbiamo qualche test e qualche test e' sempre meglio di nessun test.
Vi scrivo qui itest da implementare e far passare obbligatoriamente per ogni task.
Task 4
void testLoadDiamondTexture()
{
Texture texture = new Texture("diamond");
assertTrue(texture.isLoaded(), "texture has not been loaded");
}
void testSize()
{
Texture texture = new Texture("diamond");
assertEqual(64, texture.getWidth(), "texture width is wrong");
assertEqual(64, texture.getHeight(), "texture width is wrong");
}
void testLoadFailed()
{
try
{
Texture texture = new Texture("this_texture_doesnt_exist");
}
catch (TextureNotFoundException)
{
return;
}
assertFail();
}
fek non mi è chiara una cosa. La stringa che passi al costruttore, dovrebbe essere il nome del file? No perché in tal caso bisogna specificare l'estensione e se così non fosse, cosa rappresenta quella stringa?
fek non mi è chiara una cosa. La stringa che passi al costruttore, dovrebbe essere il nome del file? No perché in tal caso bisogna specificare l'estensione e se così non fosse, cosa rappresenta quella stringa?
Bella domanda.
E' il nome della texture. Queste sono una parte delle specifiche. L'altra specifica e' sottintesa nel fatto che c'e' un file di nome diamonds.png (mi sembra png) nel folder bin/data.
Il resto del test ti dice che quando io chiedo diamonds devi dire che l'hai trovato, quando ti chiedo una texture che nel folder sottointeso non c'e', tu devi darmi l'eccezione.
Sei libero di aggiungere altri testi per chiarire meglio le mie specifiche e renderle piu' coerenti, magari aggiungendo un test che affermi che il folder in cui devi guardare sia bin/data.
In sintesi, prova a scrivere il codice piu' semplice che ti viene in mente, date le specifiche, che fa passare quel test esattamente come e' scritto.
cionci, puoi splittare il mio post e quello di Raffaele in un topic "Chiarimenti sul Task 4 Ciclo 1" per cortesia?
Ho aggiunto i test di questo ciclo alla cartella src/it/diamonds/tests/ignore.
Spostateli nella cartella src/it/diamonds/tests e poi implementate il codice per farli passare.
Ricordate di spostare i test altrimenti verranno ignorati dalla build automatica.
ragazzi, al momento del build mi da questo errrore, mi date qualche dritta?
[junit] Running it.diamonds.tests.TestAudio
[junit] Tests run: 5, Failures: 0, Errors: 5, Time elapsed: 0.363 sec
[junit] Testsuite: it.diamonds.tests.TestAudio
[junit] Tests run: 5, Failures: 0, Errors: 5, Time elapsed: 0.363 sec
[junit] Testcase: testAudioCreation took 0.151 sec
[junit] Caused an ERROR
[junit] no lwjgl in java.library.path
[junit] java.lang.UnsatisfiedLinkError: no lwjgl in java.library.path
[junit] at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1682)
[junit] at java.lang.Runtime.loadLibrary0(Runtime.java:822)
[junit] at java.lang.System.loadLibrary(System.java:992)
[junit] at org.lwjgl.Sys$1.run(Sys.java:67)
[junit] at java.security.AccessController.doPrivileged(Native Method)
[junit] at org.lwjgl.Sys.<clinit>(Sys.java:65)
[junit] at org.lwjgl.openal.AL.<clinit>(AL.java:77)
[junit] at it.diamonds.audio.Audio.init(Audio.java:40)
[junit] at it.diamonds.audio.Audio.<init>(Audio.java:14)
[junit] at it.diamonds.tests.TestAudio.setUp(TestAudio.java:13)
[junit] at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
[junit] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
[junit] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)
[junit] Testcase: testAudioShutdown took 0.003 sec
[junit] Caused an ERROR
[junit] null
[junit] java.lang.NoClassDefFoundError
[junit] at it.diamonds.audio.Audio.init(Audio.java:40)
[junit] at it.diamonds.audio.Audio.<init>(Audio.java:14)
[junit] at it.diamonds.tests.TestAudio.setUp(TestAudio.java:13)
[junit] at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
[junit] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
[junit] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)
[junit] Testcase: testSound took 0.001 sec
[junit] Caused an ERROR
[junit] null
[junit] java.lang.NoClassDefFoundError
[junit] at it.diamonds.audio.Audio.init(Audio.java:40)
[junit] at it.diamonds.audio.Audio.<init>(Audio.java:14)
[junit] at it.diamonds.tests.TestAudio.setUp(TestAudio.java:13)
[junit] at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
[junit] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
[junit] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)
[junit] Testcase: testLoadSoundFailed took 0.001 sec
[junit] Caused an ERROR
[junit] null
[junit] java.lang.NoClassDefFoundError
[junit] at it.diamonds.audio.Audio.init(Audio.java:40)
[junit] at it.diamonds.audio.Audio.<init>(Audio.java:14)
[junit] at it.diamonds.tests.TestAudio.setUp(TestAudio.java:13)
[junit] at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
[junit] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
[junit] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)
[junit] Testcase: testPlaySound took 0.192 sec
[junit] Caused an ERROR
[junit] null
[junit] java.lang.NoClassDefFoundError
[junit] at it.diamonds.audio.Audio.init(Audio.java:40)
[junit] at it.diamonds.audio.Audio.<init>(Audio.java:14)
[junit] at it.diamonds.tests.TestAudio.setUp(TestAudio.java:13)
[junit] at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
[junit] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
[junit] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)
^TiGeRShArK^
19-09-2005, 23:20
mi sa ke fek ha cannato un pò con le path della build x le dll d lwjgl...
fai una cosa...
prova a lanciare il mio bat dalla directory bin, quindi vai su trunks e lancia l'ant (sperando ke ti resti il path aggiornaatto... ma mi pare di si)
fammi sapere.....
io sto usando eclipse per far tutto, cmq i path delle librerie le passo ad Ant, come ho fatto con junit, boo :confused:
^TiGeRShArK^
20-09-2005, 00:16
il problema è che non ti trova le dll di lwjgl che devono essere nella path...
aggiungile nella variabile d'ambiente path e dovrebbe andare... (spero)
Buonanotte... vado a fare baldoria io! :D
( e voglio vedere domani al lavoro.... :cry: )
risolto lanciando eclipse con questo parametro:
/usr/local/eclipse/eclipse -vmargs -Djava.library.path=(Percorso_del_progetto)/Diamonds/lib/linux
fek, vorrei chiederti info riguardo ad un test da te proposto che non mi è chiaro, tu hai scritto:
public void testAudioShutdown()
public void testAudioShutdown()
{
Audio audio = new Audio();
engine.shutDown();
assertTrue(audio.IsCreated(), "Audio has not shut down correctly");
}
io l'ho inteso in questo modo:
public void testAudioShutdown()
{
audio.shutDown();
assertFalse("Audio has not shut down correctly", audio.isCreated());
}
ho inteso male?
[EDIT]:se ho inteso bene, ho fatto anche la parte relativa al caricamento e all'esecuzione di un file audio, i test vanno (come l'ho modificati ;) ), potresti passarmi nomeutente e password per fare il commit?
Il problema da voi segnalato l'ho avuto anche io e non si risolve giocando con le proprie impostazioni di eclipse. Deve essere risolto a livello del file ANT altrimenti appena fate l'upload succede di tutto.
fek devi fare in modo che quando esegue i test trovi i classpath di lwjgl altrimenti non funzionerà mai perché i test non fanno altro che provare ad eseguire porzioni di codice che fanno riferimento a quelle librerie.
Io ho il test pronto, fatto partire in locale e funzionante, ma non faccio l'upload per questo motivo.
Il problema da voi segnalato l'ho avuto anche io e non si risolve giocando con le proprie impostazioni di eclipse. Deve essere risolto a livello del file ANT altrimenti appena fate l'upload succede di tutto.
fek devi fare in modo che quando esegue i test trovi i classpath di lwjgl altrimenti non funzionerà mai perché i test non fanno altro che provare ad eseguire porzioni di codice che fanno riferimento a quelle librerie.
Io ho il test pronto, fatto partire in locale e funzionante, ma non faccio l'upload per questo motivo.
Ok. Ti chiamo in MSN.
So qual e' il problema ed ho un'idea di come risolverlo. Ma fra bug di Sun e idiozie di Java non ci sono ancora riuscito. Se ne riparla stasera quando torno a casa, oppure ne parlo con Raffaele e Vicius per vedere se riescono a farlo loro...
EDIT:
E con un colpo in zona cesarini meglio del grande Mazzola, ho risolto il problema sotto Win32. Ma la soluzione e' analoga sotto Linux, va solo scritta in build.xml.
cdimauro
20-09-2005, 10:52
EDIT: sbagliato thread :(
{
audio.shutDown();
assertFalse("Audio has not shut down correctly", audio.isCreated());
}
ho inteso male?
[EDIT]:se ho inteso bene, ho fatto anche la parte relativa al caricamento e all'esecuzione di un file audio, i test vanno (come l'ho modificati ;) ), potresti passarmi nomeutente e password per fare il commit?
Non ho capito il problema, scusa. Hai spostato la creazione della classe Audio in setup()?
EDIT: si', avevo sbagliato il test. E' assertFalse come l'hai corretto tu :)
cdimauro
20-09-2005, 12:49
Francesco, una curiosità. Questo task:
T1_1. Aprire una finestra di dimensione fissa (800x600 pixel di client area) [1 giorno]
Non è già stato fatto? Lanciando il Game.java, mi apre una finestrella, anche se di 640x480 come dimensione.
Francesco, una curiosità. Questo task:
T1_1. Aprire una finestra di dimensione fissa (800x600 pixel di client area) [1 giorno]
Non è già stato fatto? Lanciando il Game.java, mi apre una finestrella, anche se di 640x480 come dimensione.
Abbiamo un volontario! :D
Assicurati che i test relativi passino.
Manca il task T1_6. E' di cisc?
Tiger, status del tuo task?
si, il T1_6 me lo prendo io ;)
Tutti i task sono stati assegnati. Divertitevi.
Quando fate il commit di un task con i relativi test che passano, scrivetelo qui che aggiorno lo stato della storia.
C'e' ancora un piccolo problema con la versione Linux di build.xml, Vicius puoi darci uno sguardo?
EDIT: Vicius ha sistemato build.xml per linux. Potete fare i commit.
^TiGeRShArK^
20-09-2005, 15:44
Abbiamo un volontario! :D
Assicurati che i test relativi passino.
Manca il task T1_6. E' di cisc?
Tiger, status del tuo task?
:fiufiu:
ehm....dunque....
ho fatto bene a mettere due giorni d tempo, visto! :Prrr:
stasera dovrei farlo cmq... qua al lavoro nn posso fare niente ke ho svn blokkato! :p
AriusValaymar
20-09-2005, 15:45
Scusate ragazzi, ma non vi conviene usare un bugzilla per tracciare task e difetti? Cosi' evitate situazioni del tipo "chi fa cosa", "qual'e' lo stato di quel task" ed avete pure le notifiche automatiche per le modifiche (oltre a qualche metrica per tracciare l'andamento del processo).
Visto l'approccio agile che fek sta impiegando (user stories, integrazione continua, tdd, ...) credo che un issue tracker sarebbe un buon complemento.
I miei .02 euro
Ps: bello il progetto e l'approccio scelti.
Rispondo qui: http://www.hwupgrade.it/forum/showthread.php?t=1016954 :)
Consiglio...per ogni task è meglio aprire un nuova discussione con i relativi problemi...magari con un naming standard...che so: [Task 1.5]...
Questa la posso ripulire... fek dimmi fino a che punti i messaggi vengano eliminati...
fatto commit dei tasks T1_3 e T1_6, con relativo test e file audio di prova diamond.wav nella cartella data
Consiglio...per ogni task è meglio aprire un nuova discussione con i relativi problemi...magari con un naming standard...che so: [Task 1.5]...
Questa la posso ripulire... fek dimmi fino a che punti i messaggi vengano eliminati...
Cionci, possiamo provare a continuare cosi'? Se si elimina un po' di rumore e si lasciano solo le discussioni strettamente inerenti ai task, riesco a seguire meglio che saltando da topic a topic. Magari posso aprire in futuro un topic per storia, questo si'.
fatto commit dei tasks T1_3 e T1_6, con relativo test e file audio di prova diamond.wav nella cartella data
Perfetto. Arrivo a casa e faccio il sign off.
Per l'audio...a me il test fallisce :D 6 test falliti...
org.lwjgl.openal.OpenALException: OpenAL error: Invalid Enum (40962)
at org.lwjgl.openal.Util.checkALError(Util.java:56)
at org.lwjgl.openal.AL10.alListener3f(AL10.java:632)
at it.diamonds.audio.Audio.initListener(Audio.java:67)
at it.diamonds.audio.Audio.init(Audio.java:58)
at it.diamonds.audio.Audio.<init>(Audio.java:17)
at it.diamonds.tests.TestAudio.setUp(TestAudio.java:21)
at junit.framework.TestCase.runBare(TestCase.java:125)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
La build e' rotta anche per la build machine.
cisc, bisogna correggere il problema oppure fare il revert del tuo commit al piu' presto.
Una piccola nota: quando fate il commit, scrivete il vostro nome, una piccola descrizione di quello che avete fatto e il task.
Vado a casa e correggo da li'.
ragazzi, non capisco, in locale va tutto perfetto. :confused: :confused:
ragazzi, non capisco, in locale va tutto perfetto. :confused: :confused:
Anche qui funziona. Pero mancano i files nel progetto di eclipse.
ciao ;)
ho provato a fare una modifica guardando gli errori postati da cionci, ma non so se risolve il problema, ripeto, in locale passo tutti i test (x fek, ho risolto il "problema aleatorio"), sarebbe veramente utile sapere se il commit è andato a buon fine e se sul server i test sono passati magari tramite email...
Anche qui funziona. Pero mancano i files nel progetto di eclipse.
ciao ;)
cioè?
ho provato a fare una modifica guardando gli errori postati da cionci, ma non so se risolve il problema, ripeto, in locale passo tutti i test (x fek, ho risolto il "problema aleatorio"), sarebbe veramente utile sapere se il commit è andato a buon fine e se sul server i test sono passati magari tramite email...
Ok, passiamo nel topic di troubleshooting ora. Cerchiamo di mantenere questo topic il piu' possibile concentrato sui task.
cioè?
Tutta colpa di una mia brutta abitudine. Risolto. :D
ciao ;)
ho provato a fare una modifica guardando gli errori postati da cionci, ma non so se risolve il problema, ripeto, in locale passo tutti i test (x fek, ho risolto il "problema aleatorio"), sarebbe veramente utile sapere se il commit è andato a buon fine e se sul server i test sono passati magari tramite email...
Vi daro' una pagina internet dove vedere i risultati della build, per ora iscrivetevi alla mailing list.
Dunque, ho messo quasi a posto il problema dei path, ma il test fallisce ancora come dice cionci.
Ora, non cercare di patchare a tentativi. Abbiamo una build machine e il repository, e' come una macchina del tempo, possiamo tornare indietro.
Fai semplicemente il revert dei tuoi cambiamenti e torna ad una Revision che passa sicuramente il test. E poi correggi il problema in locale. Questo e' l'approccio piu' sicuro e sistematico.
E la colpa di quanto accaduto e' sempre mia (o di Chet :p). Ora che sappiamo di chi e' la colpa, pensiamo a risolvere il problema alla svelta ;)
il problema è che in locale i test li passa tutti sistematicamente, facendo il revert, dato che i file li ho aggiunti, mi ritroverei a ripartire da capo?
La build e' VERDE ora. Fate l'update.
cisc, ho commentato alcune righe di codice che causano i fallimenti, guarda le differenze.
La build e' VERDE ora. Fate l'update.
cisc, ho commentato alcune righe di codice che causano i fallimenti, guarda le differenze.
Non piu su linux. Il solito problema di ";" e ":"
Tutta colpa delgli assurdi path di windows e i loro C:\ :muro:
ciao ;)
I path ora dovrebbero essere sistemati anche sotto linux.
Io ho altri problemi in testSound e testAudioSound... Ottengo un assertion failed...
Io ho altri problemi in testSound e testAudioSound... Ottengo un assertion failed...
Ultimo update?
Io ho fatto l'upload dei test per le texture. Sembrano tutti ok.
Ultimo update?
Sì...mi lancia un'eccezione al momento di aprire il file wav... Ora riprovo...
^TiGeRShArK^
21-09-2005, 09:20
ehm...problemino.....
ieri sera nn ero a casa e mi sa che si era collegato in GPRS anzichè in UMTS....
il problema è che non mi vedeva il server... :mbe:
Quando torno a casa stasera dovrei mettere tutto online....(se la cara mamma TIM è d'accordo).
ho fatto nuovo commit, adesso i test li passo anche sotto windows
cisc: guarda nel thread [Diamonds] Si parte!...
Benissimo. Aspetto la mail dalla build machine e faccio il sign off.
A questo punto, quando arriva Vicius, possiamo discutere anche una nuova storia da aggiungere a questo ciclo, visto che abbiamo ancora 8gg a disposizione.
ragazzi, una domanda, ma devo aggiungere il sound a Game.java?
ragazzi, una domanda, ma devo aggiungere il sound a Game.java?
Si', alla partenza del gioco.
fatto, lanciando Game viene riprodotto diamond.wav all'inizio, adesso il tutto è abbastanza minimale, posso aggiungere altre features (tipo loop, stop, rewind) o vado contro il principio di fare solo quello che serve?
fatto, lanciando Game viene riprodotto diamond.wav all'inizio, adesso il tutto è abbastanza minimale, posso aggiungere altre features (tipo loop, stop, rewind) o vado contro il principio di fare solo quello che serve?
Ti sei gia' risposto :)
Ho provato sulla mia macchina e funziona.
Ho fatto un po' di refactoring delle classi Texture, Game e Audio. Se avete voglia fate un diff di questi file usando SVN e guardate come sfruttando i test, ho semplificato un po' il codice, partendo da codice funzionante e testato. E' un tipico Refactoring, e potrebbe essere interessante dargli un'occhiata.
Punto della situazione:
- Il codice per tutti i task con relativi test sono nel repository.
- JUnit ci da luce verde per procedere.
Tutto questo in meta del tempo previsto. Ottimo lavoro :mano:
Ora non ci resta che aspettare il commit del refactoring di cdimauro e poi possiamo procedere con un'altra storiella.
Mentre aspettiamo prendete confidenza con eclipse e ant che non fa mai male.
ciao ;)
Il compilatore mi ritorna questo warning:
Unreachable catch block for TextureNotFoundException. This exception is never thrown from the try statement body
Da quello che ho capito il compilatore analizza le chiamate fatte nel try e non trova nessun punto nel codice che potrebbe lanciare l'eccezione TextureNotFoundException...
In pratica si ottiene questo warning ogni volta che si crea una nuova texture nel try... Comunque è vero che all'interno del costruttore non viene mai lanciata una eccezione di quel tipo, ma è anche vero che un'eccezione di quel tipo può essere lanciata da una funzione richiamata dal costruttore...quindi non vedo il perchè di questo assurdo warning...
La compilazione ed i test comunque terminano correttamente...ma ogni volta ricorda che sono questi warning...
Ora è sparito, forse perchè sono andato a vedere il codice della classe Texture e ho trovato dove viene lacniata la possibile eccezione... A questo punto penso che sia un parser interno ad Eclipse ad avere generato il warning e non il compilatore :confused:
Mancano i task di TigerShark e cidimauro all'appello.
cdimauro
22-09-2005, 12:17
Fatto. :)
C'è anche un po' di refactoring del codice... :p
Fatto. :)
C'è anche un po' di refactoring del codice... :p
Abbiamo un volontario anche per il task 2!
Sempre che il responso della build machine sia positivo. Attendiamo.
^TiGeRShArK^
22-09-2005, 15:19
toccando palle.....stasera dovrei committare, scusate il ritardo :Prrr:
Tutti i task sono completati.
Ho fatto un pesante refactoring della classe Game.java, puo' essere interssante dare un'occhiata alla differenza fra le due ultime versioni: ci sono un po' di "Extract Method" uno dopo l'altro, ed un refactoring verso "Template Method".
Ho aggiunto la classe Engine.java di cidimauro ed ho fatto un po' di refactoring per supportare la testabilita' della classe stessa. La soluzione e' tutto fuorche' elegante, c'e' un code smell grosso come una casa e il codice urla per farsi applicare un bel refactoring. Compito a casa per voi :)
Non preoccupatevi se non vi viene in mente nulla, questo refactoring non e' per nulla banale.
Mamma mia quanto è brutta quella varianile "testing". Tra l'altro testa una cosa sbagliatissima: è un test di nessuna utilità perché teoricamente va a vedere solo se la risoluzione selezionata è supportata dal sistema. Peccato che il sistema sia il server della cui compatibilità ce ne possiamo tranquillamente fregare (non so che scheda monti, ma è del tutto irrilevante). La sua unica utilità attuale è di verificare se il metodo di ricerca delle DisplayMode disponibili è corretto.
Io separerei il concetto di Engine dal concetto di Window. In questo modo si può testare la creazione dell'Engine, senza quella della finestra che è intestabile.
Concordo sulla separazione...
Mamma mia quanto è brutta quella varianile "testing". Tra l'altro testa una cosa sbagliatissima: è un test di nessuna utilità perché teoricamente va a vedere solo se la risoluzione selezionata è supportata dal sistema. Peccato che il sistema sia il server della cui compatibilità ce ne possiamo tranquillamente fregare (non so che scheda monti, ma è del tutto irrilevante). La sua unica utilità attuale è di verificare se il metodo di ricerca delle DisplayMode disponibili è corretto.
Io separerei il concetto di Engine dal concetto di Window. In questo modo si può testare la creazione dell'Engine, senza quella della finestra che è intestabile.
Testare qualcosa e' meglio che non testare nulla. Da qui il bruttissimo flag 'testing', che grida per il refactoring. Cio' che si vuole testare e' il fatto che la sequenza di inizializzazione sia chiamata nell'ordine corretto, non che la risoluzione sia disponibile. Da OpenGL abbiamo la quasi-garanzia che se la sequenza e' corretta, allora lui si comporta correttamente, ed e' cio' che vogliamo testare.
Comunque si', questi problemi e anche i problemi che ha avuto cidimauro sono dovuti alla classe Engine che tenta di fare due cose (OpenGL e Window), e quando si tenta di fare due cose, c'e' sempre qualcosa che non va. Vanno separate, e va creata una classe minimale attorno a OpenGL che racchiuda solo quello che non puo' essere testato, poi serve un suo mock che non inizializza OpenGL, ma che si comporta logicamente allo stesso modo con gli stessi servizi, di modo da essere usata per i test.
Benvenuti nel mondo delle Mock class per i test :)
Chi se ne occupa? Lo facciamo assieme perche' non e' banale, perche' i test devono restare invariati, deve solo cambiare il codice che li implementa.
Edit:
E' interessante notare il processo che abbiamo seguito in questo caso:
- Siamo partiti da codice gia' scritto che inizializza OpenGL
- Lo abbiamo separato in una classe perche' volevamo testarlo
- Abbiamo trovato dei problemi di testing e cercato una soluzione
- Abbiamo implementato la prima soluzione che ci veniva in mente commettendo anche peccati mortali se necessario (make it work)
- Avere la soluzione brutta scritta davanti ci ha suggerito una soluzione piu' elegante (make it nice), separando le due classi
- Implementeremo la soluzione piu' elegante, sapendo che i test ci diranno quando sbaglieremo qualcosa
Ma non e' bello fare Refactoring? Ti mette in pace col mondo :)
cdimauro
23-09-2005, 11:17
A me interesserebbe (anche perché è il task che mi ha coinvolto in prima persona), ma per lo più lavoro a Diamonds di giorno e difficilmente nel weekend: il mio status è compatibile con questi obiettivi?
A me interesserebbe (anche perché è il task che mi ha coinvolto in prima persona), ma per lo più lavoro a Diamonds di giorno e difficilmente nel weekend: il mio status è compatibile con questi obiettivi?
Tu prova. Fai un passettino di refactoring per volta, magari aggiungi qualche test e vedi che ne esce. Poi qualcun altro continuera' il tuo lavoro.
Possiamo chiudere questo topic e questa storia?
Se te mi dici che si può chiudere, chiudo tutto...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.