Completed the assignment

This commit is contained in:
MarcUs7i 2025-03-05 18:55:45 +01:00
parent a0d916b84e
commit a5de8eebec
8 changed files with 207 additions and 8 deletions

View file

@ -2,7 +2,6 @@
public sealed class CatTests
{
/*
private readonly Cat _cat = new();
[Fact]
@ -61,5 +60,4 @@ public sealed class CatTests
[Fact]
public void StringRepresentation() => new Cat().ToString().Should().Be("I'm a cat");
*/
}

View file

@ -2,7 +2,6 @@
public sealed class DogTests
{
/*
private readonly Dog _dog = new(new DateTimeProvider());
[Fact]
@ -52,5 +51,4 @@ public sealed class DogTests
[Fact]
public void StringRepresentation() => _dog.ToString().Should().Be("I'm a dog");
*/
}

View file

@ -2,7 +2,6 @@
public sealed class FleaTests
{
/*
private readonly Flea _flea = new();
[Fact]
@ -118,5 +117,4 @@ public sealed class FleaTests
}
#endregion
*/
}

View file

@ -2,7 +2,6 @@
public sealed class PetTests
{
/*
[Fact]
public void PetId()
{
@ -86,5 +85,4 @@ public sealed class PetTests
}
#endregion
*/
}

57
PetsAndFleas/Cat.cs Normal file
View file

@ -0,0 +1,57 @@
namespace PetsAndFleas;
/// <summary>
/// Represents a cat
/// </summary>
public sealed class Cat : Pet
{
private bool _isOnTree;
/// <summary>
/// The number of trees the cat has climbed
/// </summary>
public int TreesClimbed { get; private set; }
public Cat()
{
PrintCtorInfo("cat");
}
/// <summary>
/// Tries to climb a tree
/// </summary>
/// <returns>True if climbing was successful, false if cat is already on a tree</returns>
public bool ClimbOnTree()
{
if (_isOnTree)
{
return false;
}
TreesClimbed++;
_isOnTree = true;
return true;
}
/// <summary>
/// Tries to climb a tree
/// </summary>
/// <returns>True if climbing was successful, false if cat is not on a tree</returns>
public bool ClimbDown()
{
if (!_isOnTree)
{
return false;
}
_isOnTree = false;
return true;
}
/// <summary>
/// Returns a string representation of the cat
/// </summary>
/// <returns>The string that represents the cat</returns>
public override string ToString() => "I'm a cat";
}

49
PetsAndFleas/Dog.cs Normal file
View file

@ -0,0 +1,49 @@
namespace PetsAndFleas;
/// <summary>
/// Represents a dog
/// </summary>
public sealed class Dog : Pet
{
private static readonly TimeSpan huntingWaitInterval = TimeSpan.FromMinutes(1);
private readonly DateTimeProvider _dateTimeProvider;
private DateTime? _lastHuntedTime;
/// <summary>
/// Gets the number of animals this dog has hunted
/// </summary>
public int HuntedAnimals { get; private set; }
/// <summary>
/// Initializes a new <see cref="Dog"/> class
/// </summary>
/// <param name="dateTimeProvider">The datetime provider for checking hunting times</param>
public Dog(DateTimeProvider dateTimeProvider)
{
_dateTimeProvider = dateTimeProvider;
PrintCtorInfo("Dog");
}
/// <summary>
/// Tries to hunt an animal.
/// Dog needs to rest 1 min after a hunt.
/// </summary>
/// <returns>True if hunting was successful, false if dog needs to rest.</returns>
public bool HuntAnimal()
{
if (_lastHuntedTime.HasValue && _dateTimeProvider.Now - _lastHuntedTime.Value < huntingWaitInterval)
{
return false;
}
_lastHuntedTime = _dateTimeProvider.Now;
HuntedAnimals++;
return true;
}
/// <summary>
/// Returns a string representation of the dog
/// </summary>
/// <returns>The string that represents the dog</returns>
public override string ToString() => "I'm a dog";
}

44
PetsAndFleas/Flea.cs Normal file
View file

@ -0,0 +1,44 @@
namespace PetsAndFleas;
/// <summary>
/// Represents a flea
/// </summary>
public sealed class Flea
{
/// <summary>
/// The current selected <see cref="Pet"/>
/// </summary>
public Pet? CurrentPet { get; private set; }
/// <summary>
/// The total bites taken
/// </summary>
public int TotalBites { get; private set; }
/// <summary>
/// Sets the current <see cref="Pet"/>
/// </summary>
/// <param name="pet">The pet to select</param>
public void JumpOnPet(Pet? pet)
{
CurrentPet = pet;
}
/// <summary>
/// Bites the current <see cref="Pet"/>
/// </summary>
/// <param name="bites">How many bites to take</param>
/// <returns>The number of bites taken</returns>
public int BitePet(int bites)
{
var bitesTaken = CurrentPet?.GetBitten(bites) ?? 0;
TotalBites += bitesTaken;
return bitesTaken;
}
/// <summary>
/// Returns a string representation of the flea
/// </summary>
/// <returns>The string that represents the flea</returns>
public override string ToString() => "I'm a flea";
}

57
PetsAndFleas/Pet.cs Normal file
View file

@ -0,0 +1,57 @@
namespace PetsAndFleas;
/// <summary>
/// Abstract class for pets
/// </summary>
public abstract class Pet
{
/// <summary>
/// Next available pet ID
/// </summary>
public static int NextPetId { get; private set; }
/// <summary>
/// The unique pet ID
/// </summary>
public int PetId { get; }
/// <summary>
/// The remaining bites for this pet
/// </summary>
public int RemainingBites { get; private set; } = 100;
/// <summary>
/// Initializes a new <see cref="Pet"/> class
/// </summary>
protected Pet()
{
NextPetId++;
PetId = NextPetId;
}
/// <summary>
/// Reduces the remaining bites for this pet
/// </summary>
/// <param name="bites">Number of bites to take</param>
/// <returns>The actual number of bites taken</returns>
public int GetBitten(int bites)
{
if (bites <= 0)
{
return 0;
}
int actualBites = Math.Min(bites, RemainingBites);
RemainingBites -= actualBites;
return actualBites;
}
/// <summary>
/// Prints information about the constructor
/// </summary>
/// <param name="petType">The type of pet being created</param>
protected static void PrintCtorInfo(string petType)
{
Console.WriteLine($"Creating a new {petType}");
}
}