// -- --------------------------------------------------------------------------- --
// --  1.Beispiel) Delegates
// -- --------------------------------------------------------------------------- --
// Solution: datatypeoop
// Project: Steampunk - Classlibrary
 
 
// a) Definieren Sie im Weapon.cs File ein Delegate mit dem Namen WeaponAttack
//    Das Delegate soll dabei Methoden mit der folgenden Signatur verwalten können:
 
    public int DefaultAttack(Weapon weapon, int distance) {
        ...
    }
 
 
 
// b) Implementieren Sie für das Delegate die folgenden 2 Methoden:
 
 
    // Wird ein Angriff mit der TestAttack Methode simuliert, so wird unabhängig von
    // der Waffe und der Entfernung immer ein Treffer erziehlt.
    public int TestAttack(Weapon weapon, int distance) {
        ...
    }
 
 
    // Simulieren Sie einen Würfelwurf und speichern Sie den erzielten
    // Wert. Ist der Wert >= der weapon.Damage wurde ein Treffer erzielt.
    // Ansonsten wird 0 zurückgegeben.
    public int SimplifiedAttack(Weapon weapon, int distance) {
 
 
    }
 
    // Vervollständigen Sie die folgende Methode.
    public int DefaultAttack(Weapon weapon, int distance){
        var index = 0;
        var diceCount = 0;
 
        if (0< distance && distance<= 4) {
            index = 0;
        }
 
        if (4 < distance && distance<= 8) {
            index = 1;
        }
 
        if (8 < distance && distance <= 12) {
            index = 2;
        }
 
        diceCount = weapon.FirePower[index];
        var hitCount = 0;
 
        // Ein Würfel soll diceCount mal geworfen werden
        // Ist der gewürfelte Wert >= der weapon.damage
        // wird ein Treffer erzielt. Summieren Sie alle
        // Treffer und gegeben Sie sie als Ergebnis zurück.
 
    }
}
 
 
// Codebasis
 
public class Weapon {
 
    public string Name { get; init; }
 
    public int Damage { get; init; }
 
    public int[] FirePower { get; } = new int[3];
 
    // c) Definieren Sie eine Variable vom Typ WeaponAttack
 
}
 
public class Dice {
 
    private Random _random = new Random();
 
    public int Roll() {
        return _random.Next(1,7);
    }
}
 
 
// Project: AircraftTest
// Typ: UnitTest
 
// d) Schreiben Sie einen Unittest indem Sie die Funktionalität der Codebasis
// testen.
 
// Instanzieren Sie ein Weapon Objekt. Schreiben Sie einen Unittest für alle
// der 3 zuvor programmierten Methoden zum Angriff mit der Waffe.
 
 
// -- --------------------------------------------------------------------------- --
// -- 2.Beispiel) Delegates
// -- --------------------------------------------------------------------------- --
// Solution: datatypeoop
// Project: Steampunk    Type: Classlibray
 
 
 
// 2.1) Vervollständigen Sie die Klasse FreightManager
 
 
public class FreightManager {
 
    // a) Implementieren Sie die folgende Methode
    // Artefakt: Methode
    // Name: WeightFilter
    // Definieren Sie eine Methode zum Filtern der Fracht. Die Methode hat den
    // Datentyp FreightFilter. Die Methode berechnet das Produkt aus
    // FrightItem.Amount * FrightItem.Weight. Ist die Zahl kleiner gleich 1000
    // kann die Fracht geladen werden
 
 
    // b) Implementieren Sie die folgende Methode
    // Artefakt: Methode
    // Name: FragileCargoFilter
    // Implementieren Sie eine Methode die prüft ob es sich beim FreightItem um
    // LiquidCargo oder FragileGoods handelt. Entspricht die Fracht einem der
    // beiden Typen kann die Fracht geladen werden.
 
    // c) Vervollständigen Sie die folgende Methode
    // Vervollständigen Sie die FilterFreight Methode. Ziel der Methode ist
    // es eine Liste von FrightItems mit der Hilfe eines Delegates zu
    // filtern
    public List<FreightItem> FilterFreight (List<FreightItem> freight, FreightFilter filter){
 
 
 
 
    }
 
}
 
 
// 2.2) Schreiben Sie einen UnitTest zur Prüfung des FreightManagers
 
// a) Instanzieren Sie ein FreightManager Objekt. Schreiben Sie jeweils einen Test für die
// beiden zuvor definierten Deleage Methoden.
 
 
 
// Codebasis
 
public delegate bool FreightFilter (FreightItem item);
 
 
 
public enum EFreightType {
    GeneralCargo,
    BulkCargo,
    LiquidCargo,
    RefrigeratedCargo,
    HazardousGoods,
    OversizedCargo,
    FragileGoods,
    PerishableGoods,
    ContainerizedCargo,
    ExpressFreight
}
 
public enum EPackagingType
{
    None,
    Box,
    Crate,
    Pallet,
    Container,
    Barrel,
    Bag,
    Drum,
    Tank
}
 
public class FreightItem {
 
    public EFreightType FreightType { get; init; }
 
    public EPackagingType EPackagingType { get; init; }
 
    public string Label { get; init; }
 
    public int Amount { get; set; }
 
    public int Weight { get; set; }
 
}