boltMain.cpp 5.18 KB
Newer Older
Szeberényi Imre committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
/**
 * \file boltMain.cpp
 * Tesztprogram a Kassza, Aru, Tej, Kifli osztályok teszteléséhez.
 *
 * \par Demonstrációs cél:
 * 1. Heterogén kollekció demonstrálása.
 *    A Kassza osztályban tárolt tétel Aru POINTER-t tárol. Így minden
 *    áruból származó új áru tárolására alkalmas.
 *
 * 2. Az öröklés adta egyik lehetőség a bővíthetőség demonstrálása
 *
 *** FONTOS ***
 * A MEMTRACE makrónak minden fordítási egységben definiált kell, hogy legyen!
 * Ezt legkényelmesebben projekt szintű beállítással tudja elérni.
 *   (Projekt->Build options->#defines)
 *
 */

#include <iostream>
#include <sstream>

#include "memtrace.h"
#include "gtest_lite.h"
#include "kassza.h"
#include "tej.h"

#ifdef KIFLI_IS_VAN
# include "kifli.h"
#endif

using std::cout;
using std::endl;
using std::cin;

int main() {

Szeberényi Imre committed
37
#ifdef KIFLI_IS_VAN
Szeberényi Imre committed
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
/// Az első két teszteset a Kifli objektum kiírási formátumát teszteli.
    TEST(kifli, print1) {
        Kifli tejeskifli(29, "tejes");
        std::stringstream ss;
        tejeskifli.print(ss);       // stringstream az output, amit
        EXPECT_STREQ("Kifli tejes; 29Ft/db", ss.str().c_str()); // C sztringgé konvertálunk és összehasonlítjuk
    } ENDM

    TEST(kifli, print2) {
        Kifli sajtoskifli(72, "sajtos");
        std::stringstream ss;
        ss << sajtoskifli;          // inserternek is mennie kell
        EXPECT_STREQ("Kifli sajtos; 72Ft/db", ss.str().c_str());
    } ENDM
#endif

/// Most felveszünk néhány árufajtát a boltba
    const Tej tej15(1.5, 230);
    const Tej tej15lm(1.5, 310, "laktozmentes");
    const Tej tej28(2.8, 270);

#ifdef KIFLI_IS_VAN
    const Kifli sajtoskifli(70, "sajtos");
    const Kifli tejeskifli(29, "tejes");
#endif

#if 0
/// Kivétel dobásának ellenőrzése: Tudjuk, hogy a kasszába 20 tétel fér
    TEST(Kassza, kivetel) {
        Kassza p2;
        for (int i = 0; i < 20; i++)
            EXPECT_NO_THROW(p2.elad(3, tej28));
        EXPECT_ANY_THROW(p2.elad(3, tej28));
    } ENDM
#endif

/// Eladunk ezekből a p1 kasszánál
/// Az első két eladási mennyiséget a standard bemenetről olvassuk be
    Kassza p1;
    int ennyi_tejet;
    cout << "Mennyi tej kell? ";
    cin >> ennyi_tejet;
    p1.elad(ennyi_tejet, tej15);

#ifdef KIFLI_IS_VAN
    int ennyi_kiflit;
    cout << "Mennyi kifli kell? ";
    cin >> ennyi_kiflit;

    p1.elad(ennyi_kiflit, sajtoskifli);
#endif

/// Itt pedig csalunk: előredátumozzuk az eladásokat
    p1.elad(2, tej15, Datum(3000, 4, 1));
    p1.elad(2, tej15lm, Datum(3000, 4, 1));
#ifdef KIFLI_IS_VAN
    p1.elad(10, sajtoskifli, Datum(3000, 4, 1));

/// Kell még két kifli?
    if (ennyi_kiflit % 2 == 1)
Szeberényi Imre committed
98 99 100
        p1.elad(2, tejeskifli, Datum(3000, 4, 1));  // ha páratlan akkor 3000-ben adjuk el
    else
        p1.elad(2, tejeskifli);
Szeberényi Imre committed
101 102 103 104 105 106 107 108
#endif

    p1.elad(3, tej28);      /// még három liter tejet is eladunk ma

/// teljes litsta
    cout << "\nOsszes eladas:" << endl;
    p1.list(cout);

Szeberényi Imre committed
109 110 111 112
/// Eladások ma
    cout << "\nEladasok ma (" << Datum() << "): "  << endl;
    p1.list(cout, Datum());

Szeberényi Imre committed
113 114 115 116 117
/// Eladások 3000. 4. 1-jén
    cout << "\nEladasok (" << Datum(3000, 4,1 ) << "): " << endl;
    p1.list(cout, Datum(3000, 4, 1));

/// Gyenge ellenőrzés: csak a sorok számát ellenőrizzük
Szeberényi Imre committed
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
    TEST(Kassza, sorok_szama_ma) {
        std::stringstream ss;
        p1.list(ss, Datum());               // stringstrem-be listázunk
        std::string s = ss.str();           // átalakítjuk std::string-gé
        int cnt = std::count(s.begin(), s.end(), '\n'); // megszámoljuk benne a '\n' karaktereket
        int elvart = 2;                     // tudjuk, hogy 2 tej
#ifdef KIFLI_IS_VAN
        elvart += 1;                        // és 1 kifli
        if (ennyi_kiflit % 2 == 0)
            elvart +=1;                     // + 1, ha páros
#endif
        EXPECT_EQ(elvart, cnt) << "! ** Ketparameteres list: nem megfelelo szamu sort irt ki!" << endl;
    } ENDM

/// Gyenge ellenőrzés: csak a sorok számát ellenőrizzük
Szeberényi Imre committed
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
    TEST(Kassza, sorok_szama_3000_ben) {
        std::stringstream ss;
        p1.list(ss, Datum(3000, 4, 1));     // stringstrem-be listázunk
        std::string s = ss.str();           // átalakítjuk std::string-gé
        int cnt = std::count(s.begin(), s.end(), '\n'); // megszámoljuk benne a '\n' karaktereket
        int elvart = 2;                     // tudjuk, hogy 2 tej
#ifdef KIFLI_IS_VAN
        elvart += 1;                        // és 1 kifli
        if (ennyi_kiflit % 2 == 1)
            elvart +=1;                     // + 1, ha kellett még kifli
#endif
        EXPECT_EQ(elvart, cnt) << "! ** Ketparameteres list: nem megfelelo szamu sort irt ki!" << endl;
    } ENDM

/// Napi összeg
    double sum = p1.napiOsszeg();
    cout << "\nMai szumma: " << sum << "Ft" << endl;

/// megnézzük, hogy jól számolt-e
    TEST(Kassza, mai_szumma) {
        double s = 3 * tej28.getAr();
        s += ennyi_tejet * tej15.getAr();
#ifdef KIFLI_IS_VAN
Szeberényi Imre committed
156 157 158
        s += ennyi_kiflit * sajtoskifli.getAr();    // szerintünk ennyi
        if (ennyi_kiflit % 2 == 0)
            s += 2 * tejeskifli.getAr();                // + 1, ha páros
Szeberényi Imre committed
159 160 161 162 163 164
#endif
        EXPECT_DOUBLE_EQ(s, sum) << "! ** napiOsszeg() nem jol mukodik!" << endl;
    } ENDM

    return 0;
}