/**
 * OPR-Praktikum SS 2012
 * Aufgabe 9
 * @author Thomas Mahr
 */

#include "PrueffolgeReaktor.h"
#include "Atomkern.h"
#include "Reaktor.h"
using namespace std;

const Atomkern PrueffolgeReaktor::DEUTERIUM("D",2,1);
const Atomkern PrueffolgeReaktor::TRITIUM("T",3,1);
const Atomkern PrueffolgeReaktor::HELIUM4("He",4,2);	

PrueffolgeReaktor::PrueffolgeReaktor()
{
	anmelden("Reaktor erstellen", &pruefungReaktorErstellen);
	anmelden("Reaktor befuellen und komplett entleeren", &pruefungReaktorBetrieb1);
	anmelden("Kernfusion mit Wasserstoff", &pruefungReaktorBetrieb2);
	anmelden("Kernspaltung mit Plutonium", &pruefungReaktorBetrieb3);
}

void PrueffolgeReaktor::pruefungReaktorErstellen() 
{
	Reaktor reaktor;
	// Ein gerade erstellter Reaktor enthält kein Kernmaterial
	SICHERSTELLEN(*reaktor==Atomkern(0,0));
}

void PrueffolgeReaktor::pruefungReaktorBetrieb1() 
{
	Reaktor reaktor;	
	// Reaktor mit Deuterium füllen
	reaktor < DEUTERIUM;
	SICHERSTELLEN(*reaktor==DEUTERIUM);
	// Reaktor mit Tritium füllen
	reaktor < TRITIUM;
	// Auf (instabiles) Fusionsprodukt prüfen
	SICHERSTELLEN(*reaktor==Atomkern(5,2));
	// Reaktor komplett entleeren
	~reaktor;
	SICHERSTELLEN(*reaktor==Atomkern(0,0));
}

void PrueffolgeReaktor::pruefungReaktorBetrieb2() 
{
	Reaktor reaktor;	
	// Bei der Verschmelzung von Deuterium mit Tritium wird ein Neutron frei. 
	reaktor < DEUTERIUM < TRITIUM > Atomkern::NEUTRON;
	// Zurück bleibt Helium.
	SICHERSTELLEN(*reaktor==HELIUM4);
}

void PrueffolgeReaktor::pruefungReaktorBetrieb3() 
{
	Reaktor reaktor;	
	const Atomkern PLUTONIUM("Pu",239,94);
	const Atomkern BARIUM("Ba",144,56);
	const Atomkern STRONTIUM("Sr",94,38);

	// Plutonium spaltet sich bei Wechselwirkung mit einem Neutron in Barium und Strontium und gibt dabei zwei Neutronen frei.
	reaktor < PLUTONIUM < Atomkern::NEUTRON;
	SICHERSTELLEN(*reaktor==Atomkern(240,94));
	reaktor > BARIUM > STRONTIUM > 2*Atomkern::NEUTRON;
	SICHERSTELLEN(*reaktor==Atomkern(0,0));
	
	// Komplette Reaktion in einem Aufruf:
	reaktor < PLUTONIUM < Atomkern::NEUTRON > BARIUM > STRONTIUM > 2*Atomkern::NEUTRON;
	SICHERSTELLEN(*reaktor==Atomkern(0,0));
}
