ex-inh-04-supermarket/Supermarket.Test/FoodTests.cs
github-classroom[bot] b5ba03f7a8
Initial commit
2025-02-25 17:05:26 +00:00

192 lines
6.6 KiB
C#

namespace Supermarket.Test;
public sealed class FoodTests
{
private const string Barcode = "12345670";
[Fact]
public void Construction_Simple()
{
const string Name = "Fischstäbchen";
const int Quantity = 4;
var fishStick = new Food(Name, Barcode, Quantity,
AllergenType.A, AllergenType.C, AllergenType.D);
fishStick.ProductName.Should().Be(Name);
fishStick.Barcode.Should().Be(Barcode);
fishStick.Quantity.Should().Be(Quantity);
fishStick.Allergens.Should()
.NotBeNull()
.And.HaveCount(3)
.And.ContainInOrder(AllergenType.A, AllergenType.C, AllergenType.D);
fishStick.Should().BeAssignableTo<Product>("a food item is a product");
}
[Fact]
public void Construction_DuplicateAllergens()
{
var fishStick = new Food("Fischstäbchen", Barcode, 18,
AllergenType.A, AllergenType.A, AllergenType.C, AllergenType.D);
fishStick.Allergens.Should()
.NotBeNull()
.And.HaveCount(3, "duplicates are not added")
.And.ContainInOrder(AllergenType.A, AllergenType.C, AllergenType.D);
}
[Fact]
public void Construction_AllergensInWrongOrder()
{
var fishStick = new Food("Fischstäbchen", Barcode, 18,
AllergenType.C, AllergenType.D, AllergenType.A);
fishStick.Allergens.Should()
.NotBeNull()
.And.HaveCount(3)
.And.ContainInOrder([AllergenType.A, AllergenType.C, AllergenType.D],
"allergens are always stored in order");
}
[Fact]
public void Construction_NoAllergens()
{
const string Name = "Steak";
const int Quantity = 11;
CheckSteak(new Food(Name, Barcode, Quantity));
CheckSteak(new Food(Name, Barcode, Quantity, Array.Empty<AllergenType>()));
return;
static void CheckSteak(Food steak)
{
steak.ProductName.Should().Be(Name);
steak.Barcode.Should().Be(Barcode);
steak.Quantity.Should().Be(Quantity);
steak.Allergens.Should()
.NotBeNull("an empty list is always created")
.And.BeEmpty();
}
}
[Fact]
public void ContainsAnyAllergen()
{
var cake = new Food("Torte", Barcode, 5,
AllergenType.A, AllergenType.C, AllergenType.F, AllergenType.G);
cake.ContainsAnyAllergen(AllergenType.A).Should().BeTrue("allergen is contained");
cake.ContainsAnyAllergen(AllergenType.F).Should().BeTrue("allergen is contained");
cake.ContainsAnyAllergen(AllergenType.C, AllergenType.G)
.Should().BeTrue("all allergens are contained");
cake.ContainsAnyAllergen(AllergenType.F, AllergenType.C, AllergenType.A, AllergenType.G)
.Should().BeTrue("all allergens are contained, order is irrelevant");
cake.ContainsAnyAllergen(AllergenType.B).Should().BeFalse("allergen is not contained");
cake.ContainsAnyAllergen(AllergenType.B, AllergenType.M)
.Should().BeFalse("none of the allergens are contained");
cake.ContainsAnyAllergen(AllergenType.B, AllergenType.F)
.Should().BeTrue("some of the allergens are contained");
}
[Fact]
public void AddAllergen_Simple()
{
var cake = new Food("Torte", Barcode, 5);
cake.AddAllergen(AllergenType.B).Should().BeTrue("can be added");
cake.Allergens.Should()
.NotBeNull()
.And.HaveCount(1)
.And.ContainInOrder(AllergenType.B);
cake.AddAllergen(AllergenType.A).Should().BeTrue("can be added");
cake.Allergens.Should()
.NotBeNull()
.And.HaveCount(2)
.And.ContainInOrder([AllergenType.A, AllergenType.B], "insert happens in order");
}
[Fact]
public void AddAllergen_AlreadyContained()
{
var cake = new Food("Torte", Barcode, 5);
cake.AddAllergen(AllergenType.A).Should().BeTrue("can be added");
cake.Allergens.Should()
.NotBeNull()
.And.HaveCount(1)
.And.ContainInOrder(AllergenType.A);
cake.AddAllergen(AllergenType.A).Should().BeFalse("already in the list");
cake.Allergens.Should()
.NotBeNull()
.And.HaveCount(1, "unchanged")
.And.ContainInOrder(AllergenType.A);
}
[Fact]
public void RemoveAllergen_Simple()
{
var cake = new Food("Torte", Barcode, 5, AllergenType.A, AllergenType.B);
cake.RemoveAllergen(AllergenType.A).Should().BeTrue("can be removed");
cake.Allergens.Should()
.NotBeNull()
.And.HaveCount(1, "decreased")
.And.ContainInOrder(AllergenType.B);
cake.RemoveAllergen(AllergenType.B).Should().BeTrue("can be removed");
cake.Allergens.Should()
.NotBeNull()
.And.BeEmpty("now empty");
}
[Fact]
public void RemoveAllergen_NotContained()
{
var cake = new Food("Torte", Barcode, 5,
AllergenType.A, AllergenType.B, AllergenType.C);
cake.RemoveAllergen(AllergenType.B).Should().BeTrue("can be removed");
cake.Allergens.Should()
.NotBeNull()
.And.HaveCount(2, "one removed")
.And.ContainInOrder(AllergenType.A, AllergenType.C);
cake.RemoveAllergen(AllergenType.B).Should().BeFalse("already removed");
cake.Allergens.Should()
.NotBeNull()
.And.HaveCount(2, "unchanged")
.And.ContainInOrder(AllergenType.A, AllergenType.C);
cake.RemoveAllergen(AllergenType.F).Should().BeFalse("was never contained");
cake.Allergens.Should()
.NotBeNull()
.And.HaveCount(2, "unchanged")
.And.ContainInOrder(AllergenType.A, AllergenType.C);
}
[Fact]
public void GetCsvHeader()
{
var burger = new Food("Burger", Barcode, 2,
AllergenType.A, AllergenType.F, AllergenType.M);
burger.GetCsvHeader().Should().Be("Barcode;ProductName;Quantity;Allergens");
}
[Fact]
public void ToCsv()
{
var burger = new Food("Burger", Barcode, 2,
AllergenType.A, AllergenType.F, AllergenType.M);
var water = new Food("Leitungswasser", Barcode, 1);
burger.ToCsv().Should().Be($"{Barcode};Burger;2;A|F|M");
water.ToCsv().Should().Be($"{Barcode};Leitungswasser;1;",
"no allergens, but column is still present");
}
}