V této úloze procvičíme použití kontejnerů, výjimek (vč. definice vlastních tříd výjimek) a také testování s junit.
Úkolem bude realizovat jednoduchou implementaci abstraktního datového typu fronta (queue) a několika souvisejících výjimek. Kromě toho je součástí programu také testovací třída (rozšiřující junit.framework.TestCase) pro junit (používejte aktuální verzi balíku junit dostupnou na http://junit.org).
Program bude obsahovat následují rozhraní a třídy:
Rozhraní fronty. Popisuje operace put (vložení provku do fronty), get (odebrání prvku z fronty), empty (test na prázdnost fronty) a size (počet prvků aktuálně ve frontě).
Obrázek 36. Zdrojový text rozhraní Queue
// rozhraní fronty ukládající prvky typu String
public interface Queue {
void put(String s) throws QueueFullException; // vloží prvek do fronty
String get() throws QueueEmptyException; // odebere z fronty prvek a vrátí jej
boolean empty(); // test na prázdnost fronty, vrátí true, je-li prázdná
int size(); // vrátí aktuální počet prvků ve frontě
int freeCapacity(); // vrátí aktuální počet prvků, které ještě lze bez odebírání vložit
void clear(); // vyprázdní frontu
}
Třída implementující rozhraní Queue. Fronta bude fungovat tak, že prvky budou ukládány do vhodného kontejneru (asi List) uvnitř objektu typu QueueImpl. Konstruktor bude mít jeden celočíselný parametr určující celkovou kapacitu fronty (maximální počet současně přítomných prvků ve frontě).
Obecná výjimka při práci s frontou. Nadefinujete si ji sami, v programu se nebudou vytvářet přímo instance tohoto typu, ale až některé ze tříd potomků, viz dále.
Je výjimka, kterou vyhodí operace get (pomocí příkazu throw) v případě, že chceme odebrat prvek z prázdné fronty. Nadefinujete si ji sami, tak, aby byla potomkem QueueException.
Je výjimka, kterou vyhodí operace put v případě, že chceme vložit prvek do fronty, jejíž kapacita je již naplněna. Nadefinujete si ji sami, tak, aby byla potomkem QueueException.
Testovací třída s metodou main, která rovnou spustí junit testovač (spouštěč testů) junit.swingui.TestRunner.
Obrázek 37. Zdrojový text metody main třídy QueueTest
// metoda main rovnou aktivující spouštěč testů (TestRunner)
public static void main(String[] args) {
// zjisti jména testovacích tříd (=testů)
String[] testCaseNames = {QueueTest.class.getName()};
// aktivuj spouštěč testů
junit.swingui.TestRunner.main(testCaseNames);
}
Testovací třídu implementujte tak trochu podle svého - nepředepisuji přesně, co a jak důkladě se má testovat. Z povahy třídy QueueImpl však plyne, že by se minimálně mělo otestovat:
že funguje vložení do nenaplněné (např. prázdné fronty);
že naopak nefunguje (tj. vyhodí výjimku) vložení do plné fronty;
taktéž nefunguje (tj. vyhodí výjimku) odebrání z prázdné fronty;
že empty() je true, právě když size() je 0 - a to nastane mj. po zavolání clear();
že freeCapacity() po zkonstruování objektu fronty musí být rovna hodnotě parametru konstruktoru;
a především že fronta se opravdu chová jako fronta, tj. struktura FIFO - prvky jsou odebírány v tom pořadí, v jakém byly vkládány.
Váš cvičící pravděpodobně určí balík, do kterého budete vytvořené třídy (a případně i výchozí rozhraní Queue) ukládat. Stejně tak může upřesnit požadavky na testovací třídu.
Pokud cvičící zadání modifikuje, je to OK. Tohle je vzorové zadání. Za úlohu získáte opět max. 5 bodů.