Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Robot tagliaerba Navimow i105E in prova: GPS e videocamera per un prato perfetto
Robot tagliaerba Navimow i105E in prova: GPS e videocamera per un prato perfetto
Abbiamo testato per alcune settimane il Navimow i105E, un robot tagliaerba che unisce il segnale RTK alla visione con videocamera intelligente, per un posizionamento preciso e un taglio impeccabile
Xiaomi 14 e Xiaomi 14 Ultra: sono davvero macchine fotografiche 5G?
Xiaomi 14 e Xiaomi 14 Ultra: sono davvero macchine fotografiche 5G?
Xiaomi 14 e Xiaomi 14 Ultra sono due dei più performanti cameraphone del 2024. Li abbiamo messi sotto torchio con tutte le prove che effettuiamo solitamente per le recensioni delle fotocamere, per saggiarne il comportamento e avere tutti i dati tecnici per un confronto ragionato
Corsair One i500: un PC gaming potente che può stare anche in salotto
Corsair One i500: un PC gaming potente che può stare anche in salotto
Corsair One i500 è un PC completo molto potente ma che occupa poco spazio e lo fa con stile. Un sistema che può servire tanto per lavorare quanto per giocare, con molti spunti interessanti ma anche qualche neo. Il prezzo è da capogiro.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 05-02-2008, 21:33   #81
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
Bonfo, i metodi isStoneTransforming e isStoneTransformed in realtà agiscono solamente sulla stone, non sulla action; io li sposterei in Stone rinominandoli rispettivamente isTransforming e isTransformed.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 05-02-2008, 21:52   #82
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
C'ho pensato pure io, ma, non so se l'hai notato, c'e' un cast di mezzo.
Io aspetteri di vedere come risolviamo il problema del getType e isXXX.

Se valutate che conviene farlo subito...
... cambialo subito, ma poi devi aggiungere i test
__________________
Software engineer
Bonfo's Blog
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 05-02-2008, 22:55   #83
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
spianato il primo TODO: REFACTOR THIS di TestGameRestartOnGameOver

ho rinominato la classe di test in TestGameOnGameOver (visto che il metodo testava il gameOver a partire da loop).

Da:
Codice:
   public void testPassToGameOverState() throws IOException
    {
        // TODO: REFACTOR THIS

        LayerManager oldLayerManager = loop.getLayerManager();

        fillFourthColumn();

        environment.getTimer().advance(newGemDelay);
        loop.doOneStep();

        // verifico che il restart nn sia ancora stato fatto
        assertEquals(oldLayerManager, loop.getLayerManager());
        assertEquals(field1, loop.getPlayFieldOne());
        assertEquals(field2, loop.getPlayFieldTwo());

        environment.getTimer().advance(restartGameDelay - 2);
        loop.doOneStep();

        // verifico che il restart nn sia ancora stato fatto
        assertEquals(oldLayerManager, loop.getLayerManager());
        assertEquals(field1, loop.getPlayFieldOne());
        assertEquals(field2, loop.getPlayFieldTwo());

        environment.getTimer().advance(1);
        loop.doOneStep();

        assertNotSame("The layer must be different from the old one",
            oldLayerManager, loop.getLayerManager());
        // TODO manca test che � stato settato il background(come si fa?)
        assertNotSame("field1 must be different from the old one", field1,
            loop.getPlayFieldOne());
        assertNotSame("field2 must be different from the old one", field2,
            loop.getPlayFieldTwo());
    }
A:
Codice:
    public void testPassToGameOverOnColumnFull() throws IOException
    {
        fillFourthColumn();
        environment.getTimer().advance(newGemDelay);
        loop.doOneStep();
        assertTrue(loop.getPlayFieldOne().getGridController().isGameOver());
    }

    
    public void testPassToGameOverNotRestartGame() throws IOException
    {
        fillFourthColumn();
        environment.getTimer().advance(newGemDelay);
        loop.doOneStep();
        
        assertEquals(layerManager, loop.getLayerManager());
        assertEquals(field1, loop.getPlayFieldOne());
        assertEquals(field2, loop.getPlayFieldTwo());
    }
    
    
    public void testDelayBeforeRestart() throws IOException
    {
        fillFourthColumn();
        environment.getTimer().advance(newGemDelay);
        loop.doOneStep();
        
        environment.getTimer().advance(restartGameDelay - 2);
        loop.doOneStep();

        assertEquals(layerManager, loop.getLayerManager());
        assertEquals(field1, loop.getPlayFieldOne());
        assertEquals(field2, loop.getPlayFieldTwo());
    }
    
    
    public void testRestartAfterDelay() throws IOException
    {
        fillFourthColumn();
        environment.getTimer().advance(newGemDelay);
        loop.doOneStep();
        
        environment.getTimer().advance(restartGameDelay-1);
        loop.doOneStep();

        assertNotSame("The layer must be different from the old one",
            layerManager, loop.getLayerManager());
        assertNotSame("field1 must be different from the old one", field1,
            loop.getPlayFieldOne());
        assertNotSame("field2 must be different from the old one", field2,
            loop.getPlayFieldTwo());
    }
non chiedetemi perchè basta far avanzare il timer di restartGameDelay(preso dal config) -1 per far scattare il gameOver, su questo non ho indagato, ma ricordo che "era così".

ho anche eliminato il todo che diceva che si doveva testare l'apparizione dell'immagine del game over, ma nn si sapeva come(ho la strana sensazione di averlo scritto io..fra l'altro....

Codice:
    public void testNotShowGameOverImageBeforeGameOver() throws IOException
    {
        Image gameOverImage = environment.getEngine().createImage(GameOverBox.texturePath);
        assertFalse(mockEngine.wasImageDrawn(gameOverImage));
    }
    
    
    public void testShowGameOverImageOnGameOver() throws IOException
    {
        fillFourthColumn();
        environment.getTimer().advance(newGemDelay);
        loop.doOneStep();
        
        Image gameOverImage = environment.getEngine().createImage(GameOverBox.texturePath);
        assertTrue(mockEngine.wasImageDrawn(gameOverImage));
    }
    
    public void testNotShowGameOverAfterRestart() throws IOException
    {
        fillFourthColumn();
        environment.getTimer().advance(newGemDelay);
        loop.doOneStep();
        
        environment.getTimer().advance(restartGameDelay-1);
        loop.doOneStep();
        
        Image gameOverImage = environment.getEngine().createImage(GameOverBox.texturePath);
        assertFalse(mockEngine.wasImageDrawn(gameOverImage));
    }
unici accorgimenti per questo test, è stato cambiare il metodo di MockEngine clearDisplay in
Codice:
    public void clearDisplay()
    {
        drawInfoList = new ArrayList<DrawInfo>();
        numberOfQuadsDrawn = 0;
    }
prima non veniva pulita la drawInfoList, per cui mi ritrovavo il gameover anche dopo il restart...

In piu ho messo public static final GameOverBox.texturePath, per avere accesso all'nome texture/immagine.

C'è un altro test che usa la tecnica environment.getEngine().createImage(NOME_TEXTURE) e che hanno il nome texture hardcoded nel test(come nel mio caso il nome texture era private static). Non so quale modo sia migliore...(anche se io voto mettere i nomi texture public static final)

Ultima modifica di thebol : 05-02-2008 alle 23:01.
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 05-02-2008, 23:11   #84
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
Quote:
Originariamente inviato da thebol Guarda i messaggi
ho anche eliminato il todo che diceva che si doveva testare l'apparizione dell'immagine del game over, ma nn si sapeva come(ho la strana sensazione di averlo scritto io..fra l'altro....
Sei sicuro che non ci sia gia' qualcos'altro di simile in giro??
Mi ricordo che avevamo trovato un doppione... controlla, altrimenti signifca che cosi' va benissimo
__________________
Software engineer
Bonfo's Blog
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 05-02-2008, 23:27   #85
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
Quote:
Originariamente inviato da Bonfo Guarda i messaggi
Prima:
Dopo:
Codice:
    protected void applyOn(Droppable gem)
    {
        if(!gem.getGridObject().getType().isStone() || !isStoneTransforming(gem))
        {
            return;
        }

        turningStonesCounter++;

        if(isStoneTransformed(gem))
        {
            turningStonesCounter--;
            turnStoneInToGem(gem);
        }

        gem.update(timer.getTime());
    }


    private void turnStoneInToGem(Droppable stone)
    {
        getGridElements().remove(stone);

        Droppable gem = gemFactory.create(GEM, stone.getGridObject().getColor());
        gem.getFallingObject().drop();

        int row = stone.getRegion().getTopRow();
        int column = stone.getRegion().getLeftColumn();
        getGrid().insertDroppable(gem, row, column);
    }


    private boolean isStoneTransforming(Droppable stone)
    {
        int frame = stone.getAnimatedSprite().getCurrentFrame();
        return frame >= 5 && frame < 7;
    }


    private boolean isStoneTransformed(Droppable stone)
    {
        int frame = stone.getAnimatedSprite().getCurrentFrame();
        return frame >= 7;
    }
ho trovato un bug(vedi allegato)

non ne sono sicuro, ma potrebbe essere questa modifica a farlo saltare fuori.

ps.si lo so c'è un volontario per il test del bug...però se va bene domani
mattina..

pps.mancava l'allegato
Immagini allegate
File Type: jpg BUGGONE.JPG (20.1 KB, 19 visite)

Ultima modifica di thebol : 05-02-2008 alle 23:31.
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2008, 04:47   #86
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
Il bug penso di aver capito dov'è.
Prima con frame = 7 riusciva comunque a passare il primo if, ovvero
Codice:
if(frame < 5 ) {
return;
}
mentre invece adesso ci casca dentro in pieno.

Codice:
if(frame < 5 || frame >= 7) {
return;
}
Dovrei scrivere il test, ma vorrei mazzare un po' bigGem.

Spostiamo la discussione di questo nel thread dei Bug
__________________
Software engineer
Bonfo's Blog

Ultima modifica di Bonfo : 06-02-2008 alle 04:55.
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2008, 04:56   #87
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
Perchè AbstractDroppable non si tiene una reference al DroppableDescription invece di usarlo solo per inizzializzare i membri??
__________________
Software engineer
Bonfo's Blog
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2008, 09:28   #88
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: California
Messaggi: 11781
Quote:
Originariamente inviato da Bonfo Guarda i messaggi
Perchè AbstractDroppable non si tiene una reference al DroppableDescription invece di usarlo solo per inizzializzare i membri??
Perche' l'ho dimenticato
Se vedi una cosa cosi' semplice, fallo senza problemi. Ieri ho rifattorizzato 20 classi a mezzanotte, qualcosa puo' scappare.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2008, 22:18   #89
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
Prima:
Codice:
    protected boolean canMoveButNotWithFullGravity(Grid grid)
    {
        // TODO: REFACTOR THIS

        float gridBottom = grid.getRowUpperBound(grid.getNumberOfRows() - 1);

        int numberOfRowsOverOne = region.getBottomRow() - region.getTopRow();

        if (getSprite().getPosition().getY() + numberOfRowsOverOne
            * Cell.SIZE_IN_PIXELS + ((float)grid.getActualGravity()) / 2 > gridBottom)
        {
            return true;
        }

        if (getSprite().getPosition().getY() + ((float)grid.getActualGravity())
            / 2 <= grid.getRowUpperBound(getRegion().getTopRow()))
        {
            return false;
        }

        Cell cell = new Cell(getRegion().getBottomRow() + 1, getRegion().getLeftColumn());

        return grid.isDroppableAt(cell);
    }
Dopo:
Codice:
      protected boolean canMoveButNotWithFullGravity(Grid grid)
    {
        float nextPositionY = getSprite().getPosition().getY() + grid.getActualGravity() * 0.5f;
        float limit = grid.getRowUpperBound(grid.getNumberOfRows() - getRegion().getHeight());

        if (nextPositionY > limit)
        {
            return true;
        }

        float currentRowLimit = grid.getRowUpperBound(getRegion().getTopRow());

        if (nextPositionY <= currentRowLimit)
        {
            return false;
        }

        Cell cell = new Cell(getRegion().getBottomRow() + 1, getRegion().getLeftColumn());

        return grid.isDroppableAt(cell);
    }
Ricordo i due problemi, entrambi da testare.
- il supporto a gravita' che producano step solo <= 1 cella ( visibile nella costruzione della cella)
- il fatto che si controlli solo la 1 column, probabilemnte causa del bug 6.
__________________
Software engineer
Bonfo's Blog

Ultima modifica di Bonfo : 06-02-2008 alle 22:26.
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2008, 23:08   #90
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12077
Quote:
Originariamente inviato da fek Guarda i messaggi
La code base sta pian piano migliorando, soprattutto Droppable, a seguito di un po' di colpi di refactoring. Ma durante il refactoring giornaliero ho avuto molti problemi sia con BigGem sia con vari test.

Visto che affidarsi al vostro bon cuore non sta sortendo effetti troppo visibile, la soluzione e' il programma "Refactor This!"


cazz.. avevo in cameretta proprio quel poster...
ma la scritta non me la ricordavo..

__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2008, 00:10   #91
Baol
Member
 
L'Avatar di Baol
 
Iscritto dal: Apr 2006
Città: Gazzaniga (BG)
Messaggi: 67
Comincio a lavorare sul refactoring della CrushByChestAction

EDIT: ho committato, anche se ho lasciato il REFACTOR THIS perchè c'è ancora lavoro da fare.
In particolare pensavo di mettere in Droppable un metodo getAdjacentDroppable che restituisse una DroppableList con le droppable adiacenti (e un flag se sono richieste le droppable dello stesso colore, oppure un altro metodo apposito). Con un metodo simile il codice della CrushByChestAction si dimezzerebbe e saremmo più vicini alla sua eliminazione. Si può andare in questa direzione?
__________________
"Non esiste l'impossibile. L'impossibile non esiste." Baolian, Libro V


Baol è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2008, 08:32   #92
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
Mi sono preso la libertà di aggiungere un paio di Refactor this

Poi ho aggiunto il metodo create() a MockSingleDroppable, che vedo sostiuirsi benissimo al createGem() di GridTestCase, poi, con il refactoring che ho fatto su BigGem, anche la loro creazione dovrebbe essere molto più semplice, facendo si che si possano eliminare tutti qui metodi strani da GridTestCase... che secondo me dimagrisce un bel po'.

Inoltre stavo pensando di valutare bene cosa stanno a fare li in nostri TestCase custom.
Ovvero a parte il GridTestCase che fa tutto, gli altri li vedo un po' "inutili", il che vuol dire 2 cose:
- o li stiamo usando male,
- o non servono a un granchè.

In ogni caso bisogna "omogeneizzare" i test

Io un po' alla volta sto cercando di eliminare le dipendenze. Ad esempio è inutile usare GridTestCase se l'unica cosa che mi serve è un MockEngine.
__________________
Software engineer
Bonfo's Blog

Ultima modifica di Bonfo : 07-02-2008 alle 08:36.
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2008, 09:51   #93
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: California
Messaggi: 11781
Giusto, togli le dipendenze dai TestCase che non servono e aggiungi i Refactor This che reputi opportuni.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2008, 12:10   #94
Baol
Member
 
L'Avatar di Baol
 
Iscritto dal: Apr 2006
Città: Gazzaniga (BG)
Messaggi: 67
Uhmmm, ieri sera il forum è andato in palla e non mi ha più modificato il post...

Dunque: ho committato il lavoro sulla CrushByChestAction ma si può fare ancora qualcosa: pensavo di aggiungere un metodo getAdjacentDroppables ai vari Droppables (implementato magari in AbstractDroppable e in BigGem) che restituisca tutte le gemme adiacenti (ovvero con un lato in comune) di qualsiasi colore (pensavo con un flag che indichi se devono o meno essere dello stesso colore, oppure creare un altro metodo apposito). Questo semplificherebbe notevolmente la Action e ci metterebbe più vicini alla sua eliminazione.
Posso procedere in quella direzione?
__________________
"Non esiste l'impossibile. L'impossibile non esiste." Baolian, Libro V



Ultima modifica di Baol : 07-02-2008 alle 12:18.
Baol è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2008, 12:41   #95
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: California
Messaggi: 11781
Quote:
Originariamente inviato da Baol Guarda i messaggi
Uhmmm, ieri sera il forum è andato in palla e non mi ha più modificato il post...

Dunque: ho committato il lavoro sulla CrushByChestAction ma si può fare ancora qualcosa: pensavo di aggiungere un metodo getAdjacentDroppables ai vari Droppables (implementato magari in AbstractDroppable e in BigGem) che restituisca tutte le gemme adiacenti (ovvero con un lato in comune) di qualsiasi colore (pensavo con un flag che indichi se devono o meno essere dello stesso colore, oppure creare un altro metodo apposito). Questo semplificherebbe notevolmente la Action e ci metterebbe più vicini alla sua eliminazione.
Posso procedere in quella direzione?
Flag?! Flag che modifica il comportamento di un metodo?!?!?! FLAG?!?!?!
fek è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2008, 12:43   #96
Baol
Member
 
L'Avatar di Baol
 
Iscritto dal: Apr 2006
Città: Gazzaniga (BG)
Messaggi: 67
Chiedo scusa, volevo dire due metodi separati
__________________
"Non esiste l'impossibile. L'impossibile non esiste." Baolian, Libro V


Baol è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2008, 15:27   #97
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
ho una domanda circa la regola 1 commit ==> 1 refactor this che se ne va: è possibile committare aggiungendo dei refactor this nel codice ma senza risolverne nessuno? oppure per committare qualunque cosa (anche l'aggiunta di nuovi refactor this) bisogna per forza risolverne almeno uno?
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2008, 15:43   #98
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: California
Messaggi: 11781
Quote:
Originariamente inviato da 71104 Guarda i messaggi
ho una domanda circa la regola 1 commit ==> 1 refactor this che se ne va: è possibile committare aggiungendo dei refactor this nel codice ma senza risolverne nessuno? oppure per committare qualunque cosa (anche l'aggiunta di nuovi refactor this) bisogna per forza risolverne almeno uno?
La seconda che hai detto.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2008, 16:17   #99
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
ok.

ora sto lavorando sul refactor this in it.diamonds.grid.action.CrushByChestAction:11
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2008, 16:18   #100
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
ot: ho notato solo oggi l'immagine di ken shiro in prima pagina
credo che abbiamo trovato un'ispirazione per il codename della prossima release
(il codename precedente era YAGNI )
71104 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Robot tagliaerba Navimow i105E in prova: GPS e videocamera per un prato perfetto Robot tagliaerba Navimow i105E in prova: GPS e v...
Xiaomi 14 e Xiaomi 14 Ultra: sono davvero macchine fotografiche 5G? Xiaomi 14 e Xiaomi 14 Ultra: sono davvero macchi...
Corsair One i500: un PC gaming potente che può stare anche in salotto Corsair One i500: un PC gaming potente che pu&og...
realme 12X 5G: ottimo compromesso a meno di 200 euro realme 12X 5G: ottimo compromesso a meno di 200 ...
Recensione Apple iPad Pro M4: è più potente di un MacBook Air M3 Recensione Apple iPad Pro M4: è più...
Path of Exile 2 arriva su console: Couch...
Silent Hill 2 remake arriverà l'8...
3 hard disk esterni USB 3.2 Gen2 da 10 (...
Un Apple AirTag costa 29€: spendendo men...
STMicroelectronics: a Catania il primo i...
World of Warcraft è adesso giocab...
Belli e possibili: in offerta Nothing Ph...
Recensione realme 12 5G: il medio gamma ...
Comprare Google Pixel 8a dà dirit...
Cooler Master conferma il data breach: i...
God of War Ragnarok per PC annunciato co...
Trapano avvitatore con doppia batteria 2...
AMD: fino a 30.000 dollari di ricompensa...
Il TV LG OLED EVO 55'' Serie C3 2023 &eg...
Il portatile totale: in offerta ASUS Viv...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 11:28.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Served by www3v