module;
#include <string>
#include <string_view>
#include <print>
#include <utility>

export module TestCase;

// Klassendefinition
export class CTestCase
{
public:
    // enum der Prioritäten
    enum class priority {low, medium, high, critical};
    // enum des Prüffallstatus
    enum class state {defined, failed, ok};
private:
    std::string description;    // Beschreibung
    unsigned int tcNumber;      // Nummer
    priority prio;              // Priorität
    state tcState;              // Status
    inline static unsigned int number {1}; // Prüffallindex
    // Stringfelder zur Ausgabe der Prio und des Status im Klartext
    inline static std::string prios[] { "low","medium","high","critical" };
    inline static std::string states[]{ "defined","failed","ok" };
  public:
    // ctor
    CTestCase(std::string_view desc, priority p);
    // Default copy-ctor da keine dyn. Eigenschaften vorhanden
    CTestCase(const CTestCase&) = default;
    // Default dtor
    ~CTestCase() = default;
    // Zuweisung der Priorität
    CTestCase& operator = (priority p);
    // Zuweisung des Status
    CTestCase& operator = (state s);
    // Ausgabe des Prüffalls
    void PrintIt () const;
};
// Definition der Memberfunktion
// ctor
CTestCase::CTestCase(std::string_view desc, priority p) :
    description(desc)
{
    tcNumber = number;          // Nummber ablegen
    number++;                   // Prueffallindex erhöhen
    tcState = state::defined;   // Status setzen
    prio = p;                   // Priorität ablegen
 }
// Zuweisung des Status
inline CTestCase& CTestCase::operator = (state s)
{
    tcState = s;
    return *this;
}
// Zuweisung der Priorität
inline CTestCase& CTestCase::operator = (priority p)
{
    prio = p;
    return *this;
}
// Ausgabe des Prüffalls
void CTestCase::PrintIt () const
{
    std::println("Prueffall: {}\n\tNummer: {}, Prio: {}, Status: {}",
        description, tcNumber, prios[std::to_underlying(prio)],
        states[std::to_underlying(tcState)]);
}
