Commit bd27b13b by Karsa Zoltán István

readme, tests up

parent 176fd60e
...@@ -20,16 +20,18 @@ Ugyanakkor a hagyományos "pooling" mintát kiterjesztjük további funkciókkal ...@@ -20,16 +20,18 @@ Ugyanakkor a hagyományos "pooling" mintát kiterjesztjük további funkciókkal
Az első feladat egy `RString` nevű osztály elkészítése. Az osztály megvalósítandó metódusait az `rstring.h` fájl tartalmazza. AZ `RString` osztály szabályos `\0`-val lezárt karakterláncokat reprezentál, ugyanakkor a mögöttes karaktertömb kapacitása szabadon megadható. Az első feladat egy `RString` nevű osztály elkészítése. Az osztály megvalósítandó metódusait az `rstring.h` fájl tartalmazza. AZ `RString` osztály szabályos `\0`-val lezárt karakterláncokat reprezentál, ugyanakkor a mögöttes karaktertömb kapacitása szabadon megadható.
A `RString` osztály fenti publikus metódusai tovább nem bővíthetőek, ugyanakkor tetszőleges privát adattaggal/metódussal bővíthető. Természetesen gondoskodni kell a megfelelő dinamikus memóriakazelésről. A `RString` osztály a header fájlban megadott publikus metódusai tovább nem bővíthetőek, ugyanakkor tetszőleges privát adattaggal/metódussal bővíthető. Természetesen gondoskodni kell a megfelelő dinamikus memóriakazelésről. (itt csak elemi memóriakezelés használható)
## StringPool interfész ## StringPool interfész
A `pool.h`-ban az osztályhoz készített kommentezést követve implementáld a StringPool-t! Az osztály megvalósítása során törekedj az egységbezárásra, a hatékony megvalósításra, az osztály publikus interfésze nem bővíthető és nem is módosítható. A `pool.h`-ban az osztályhoz készített kommentezést követve implementáld a StringPool-t! Az osztály megvalósítása során törekedj az egységbezárásra, a hatékony megvalósításra, az osztály publikus interfésze nem bővíthető és nem is módosítható.
A két `acquire` függvénynél azt a szabad RString objektumot kell visszaadni, ami maximális kihasználtságú, azaz: A két `acquire` függvénynél azt a szabad `RString` objektumot kell visszaadni, ami maximális kihasználtságú, azaz:
- `acquire(size_t cap)` esetén a kért kapacitás (cap) és a visszaadott RString objektum kapacitásának (str_cap) hányadosa maximális: 0 < max(cap/str_cap) <= 1 - `acquire(size_t cap)` esetén a kért kapacitás (cap) és a visszaadott RString objektum kapacitásának (str_cap) hányadosa maximális: 0 < max(cap/str_cap) <= 1
- `acquire(const char* str)` esetén a kapott string valós méretének (len+1) és a visszaadott RString objektum kapacitásának (str_cap) hányadosa maximális: 0 < max((len+1)/str_cap) <= 1 - `acquire(const char* str)` esetén a kapott string valós méretének (len+1) és a visszaadott RString objektum kapacitásának (str_cap) hányadosa maximális: 0 < max((len+1)/str_cap) <= 1
*Ha több, azonos kihasználtságú elem is megadható, akkor mindegy melyiket adja vissza. Tanács: érdemes kapacitás szerint rendezetten tárolni az `RString` objektumokat, emiatt hasznos listát használni. (akár STL is)*
## Tiltott elemek ## Tiltott elemek
Az `RString` implementálásakor semmilyen STL tároló nem használható. A megoldásnál elemi dinamikus memóriakezelést kell alkalmazni. Ugyanakkor a `StringPool`-nál már használható valamilyen STL vektor vagy lista. Ezt a JPorta egyszerű szövegvizsgálattal ellenőrzi! Az `RString` implementálásakor semmilyen STL tároló nem használható. A megoldásnál elemi dinamikus memóriakezelést kell alkalmazni. Ugyanakkor a `StringPool`-nál már használható valamilyen STL vektor vagy lista. Ezt a JPorta egyszerű szövegvizsgálattal ellenőrzi!
......
/**
* \file pool.cpp
*
* StringPool osztály implemntációja
* Valósítsd meg az osztály metódusait, a leírást a header fájlban találod.
*
* Ezt a fájlt be kell adni (fel kell tölteni) a megoldással.
*/
#include "pool.h" #include "pool.h"
\ No newline at end of file
/**
* \file rstring.h
*
* StringPool osztály
* Valósítsd meg az osztályhoz tartozó leírás alapján a szükséges funkciókat!
* A függvények implementációját a forrásfájlban add meg!
*
* Ezt a fájlt be kell adni (fel kell tölteni) a megoldással.
*/
#ifndef POOL_H #ifndef POOL_H
#define POOL_H #define POOL_H
......
/**
* \file rstring.cpp
*
* RString osztály implemntációja
* Valósítsd meg az osztály metódusait, a leírást a header fájlban találod.
*
* Ezt a fájlt be kell adni (fel kell tölteni) a megoldással.
*/
#include "rstring.h" #include "rstring.h"
\ No newline at end of file
/**
* \file rstring.h
*
* RString osztály
* Valósítsd meg az osztályhoz tartozó leírás alapján a szükséges funkciókat!
* A függvények implementációját a forrásfájlban add meg!
*
* Ezt a fájlt be kell adni (fel kell tölteni) a megoldással.
*/
#ifndef RSTRING_H #ifndef RSTRING_H
#define RSTRING_H #define RSTRING_H
......
/** /**
* \file test.cpp * \file test.cpp
* *
* Cipher nevű szorgalmi feladat tesztjei gtest_lite eszközeivel megvalósítva * StrinPool nevű szorgalmi feladat tesztjei gtest_lite eszközeivel megvalósítva
* A szorgalmi feladat megoldásához ezt az állományt nem kell beadni (feltölteni). * A szorgalmi feladat megoldásához ezt az állományt nem kell beadni (feltölteni).
* *
* A ELKESZULT makró vezérli az egyes tesztesetek fordítását, ezzel lehetővé válik * A ELKESZULT makró vezérli az egyes tesztesetek fordítását, ezzel lehetővé válik
* hogy kisebb lépésekben teszteljünk. * hogy kisebb lépésekben teszteljünk és inkrementálisan készüljön el a program.
* *
*/ */
...@@ -16,11 +16,11 @@ ...@@ -16,11 +16,11 @@
#include "rstring.h" #include "rstring.h"
#include "pool.h" #include "pool.h"
#define ELKESZULT 0 #define ELKESZULT 14
/* ELKESZULT makró: /* ELKESZULT makró:
<= 4: RString tesztjei <= 4: RString tesztjei
>= 13: Összes teszt >= 14: Összes teszt
*/ */
int main() { int main() {
...@@ -118,6 +118,7 @@ int main() { ...@@ -118,6 +118,7 @@ int main() {
TEST(StringPool, create_new_obj) { TEST(StringPool, create_new_obj) {
StringPool pool(1, 20); StringPool pool(1, 20);
RString& ref = pool.acquire(15); RString& ref = pool.acquire(15);
EXPECT_EQ(20, ref.capacity());
EXPECT_EQ(0, pool.free_size()); EXPECT_EQ(0, pool.free_size());
RString& newobj = pool.acquire(10); RString& newobj = pool.acquire(10);
EXPECT_EQ(0, pool.free_size()); EXPECT_EQ(0, pool.free_size());
...@@ -132,10 +133,15 @@ int main() { ...@@ -132,10 +133,15 @@ int main() {
RString& ref = pool.acquire(15); RString& ref = pool.acquire(15);
EXPECT_EQ(1, pool.size()); EXPECT_EQ(1, pool.size());
EXPECT_EQ(0, pool.free_size()); EXPECT_EQ(0, pool.free_size());
EXPECT_FALSE(pool.acquireable(ref));
ref = "alma"; ref = "alma";
EXPECT_STREQ("alma", ref);
pool.release(ref); pool.release(ref);
EXPECT_TRUE(pool.acquireable(ref));
EXPECT_EQ(1, pool.free_size()); EXPECT_EQ(1, pool.free_size());
EXPECT_EQ(1, pool.size()); EXPECT_EQ(1, pool.size());
ref = pool.acquire(15);
EXPECT_STREQ("", ref);
} END } END
#endif #endif
...@@ -181,25 +187,61 @@ int main() { ...@@ -181,25 +187,61 @@ int main() {
EXPECT_EQ(30, ref2.capacity()); EXPECT_EQ(30, ref2.capacity());
EXPECT_EQ(2, pool.free_size()); EXPECT_EQ(2, pool.free_size());
pool.release(ref3); pool.release(ref3);
EXPECT_EQ(4, pool.free_size()); EXPECT_EQ(3, pool.free_size());
EXPECT_EQ(3, pool.size()); EXPECT_EQ(4, pool.size());
} END } END
#endif #endif
#if ELKESZULT > 10 #if ELKESZULT > 10
TEST(StringPool, max_capacity_check) {
StringPool pool(1, 10);
pool.release(pool.acquire(5));
EXPECT_EQ(1, pool.free_size());
EXPECT_EQ(1, pool.size());
pool.release(pool.acquire(15));
pool.release(pool.acquire(20));
pool.release(pool.acquire(25));
EXPECT_EQ(4, pool.free_size());
EXPECT_EQ(4, pool.size());
RString& ref = pool.acquire(15);
EXPECT_EQ(3, pool.free_size());
EXPECT_EQ(4, pool.size());
EXPECT_EQ(15, ref.capacity());
RString& ref1 = pool.acquire(15);
EXPECT_EQ(2, pool.free_size());
EXPECT_EQ(4, pool.size());
EXPECT_EQ(20, ref1.capacity());
RString& ref2 = pool.acquire(15);
EXPECT_EQ(1, pool.free_size());
EXPECT_EQ(4, pool.size());
EXPECT_EQ(25, ref2.capacity());
RString& ref3 = pool.acquire(15);
EXPECT_EQ(1, pool.free_size());
EXPECT_EQ(5, pool.size());
EXPECT_EQ(15, ref3.capacity());
pool.release(ref1);
pool.release(ref2);
RString& ref4 = pool.acquire(15);
EXPECT_EQ(2, pool.free_size());
EXPECT_EQ(5, pool.size());
EXPECT_EQ(20, ref4.capacity());
} END
#endif
#if ELKESZULT > 11
TEST(StringPool, append) { TEST(StringPool, append) {
StringPool pool(3, 15); StringPool pool(3, 15);
RString& alma = pool.acquire("alma"); RString& alma = pool.acquire("alma");
RString& fa = pool.acquire("fa"); const RString& fa = pool.acquire("fa");
RString& almafa = pool.append(alma, fa); RString& almafa = pool.append(alma, fa);
EXPECT_EQ(3, pool.size()); EXPECT_EQ(3, pool.size());
EXPECT_EQ(1, pool.free_size()); EXPECT_EQ(1, pool.free_size());
EXPECT_EQ(&almafa, &alma); EXPECT_EQ(&almafa, &alma);
EXPECT_EQ("almafa", almafa); EXPECT_STREQ("almafa", almafa);
} END } END
#endif #endif
#if ELKESZULT > 11 #if ELKESZULT > 12
TEST(StringPool, append_complex) { TEST(StringPool, append_complex) {
StringPool pool(3, 15); StringPool pool(3, 15);
RString& arvizturo = pool.acquire("arvizturo"); RString& arvizturo = pool.acquire("arvizturo");
...@@ -208,18 +250,20 @@ int main() { ...@@ -208,18 +250,20 @@ int main() {
EXPECT_EQ(4, pool.size()); EXPECT_EQ(4, pool.size());
EXPECT_EQ(1, pool.free_size()); EXPECT_EQ(1, pool.free_size());
EXPECT_NE(&arvizturo, &egyben); EXPECT_NE(&arvizturo, &egyben);
EXPECT_EQ("arvizturotukorfurogep", egyben); EXPECT_STREQ("arvizturotukorfurogep", egyben);
} END } END
#endif #endif
#if ELKESZULT > 12
#if ELKESZULT > 13
TEST(StringPool, append_kivetel) { TEST(StringPool, append_kivetel) {
try { try {
StringPool pool(3, 15); StringPool pool(3, 15);
RString& arvizturo = pool.acquire("arvizturo"); RString& arvizturo = pool.acquire("arvizturo");
pool.release(arvizturo);
RString& tukorfurogep = pool.acquire("tukorfurogep"); RString& tukorfurogep = pool.acquire("tukorfurogep");
EXPECT_THROW_THROW(pool.append(arvizturo, tukorfurogep);, const char* p); pool.release(arvizturo);
EXPECT_THROW_THROW(pool.append(arvizturo, tukorfurogep), const char* p);
} catch (const char *p) { } catch (const char *p) {
#ifdef CPORTA #ifdef CPORTA
EXPECT_ENVCASEEQ("ORG_ID", p); EXPECT_ENVCASEEQ("ORG_ID", p);
...@@ -231,7 +275,7 @@ int main() { ...@@ -231,7 +275,7 @@ int main() {
RString& arvizturo = pool.acquire("arvizturo"); RString& arvizturo = pool.acquire("arvizturo");
RString& tukorfurogep = pool.acquire("tukorfurogep"); RString& tukorfurogep = pool.acquire("tukorfurogep");
pool.release(tukorfurogep); pool.release(tukorfurogep);
EXPECT_THROW_THROW(pool.append(arvizturo, tukorfurogep);, const char* p); EXPECT_THROW_THROW(pool.append(arvizturo, tukorfurogep), const char* p);
} catch (const char *p) { } catch (const char *p) {
#ifdef CPORTA #ifdef CPORTA
EXPECT_ENVCASEEQ("ORG_ID", p); EXPECT_ENVCASEEQ("ORG_ID", p);
...@@ -240,7 +284,7 @@ int main() { ...@@ -240,7 +284,7 @@ int main() {
} END } END
#endif #endif
if (ELKESZULT < 13) if (ELKESZULT < 14)
ADD_FAILURE() << "\nNem futott minden teszteset!" << std::endl; ADD_FAILURE() << "\nNem futott minden teszteset!" << std::endl;
GTEND(std::cerr); GTEND(std::cerr);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment