📄 test/JsonLdRecipeParser.Tests/IngredientTests/TryParseShould.cs
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Shouldly;

namespace JsonLdRecipeParser.Tests.IngredientTests;

[TestClass]
public class TryParseShould
{
    [TestMethod]
    public void ReturnFalseForEmptyStrings()
    {
        // Arrange
        var text = "";

        // Act
        var success = Ingredient.TryParse(text, out _);

        // Assert
        success.ShouldBeFalse();
    }

    [TestMethod]
    [DataRow("  ")]
    [DataRow("\t")]
    public void ReturnFalseForWhiteSpaceStrings(string input)
    {
        // Arrange
        var text = input;

        // Act
        var success = Ingredient.TryParse(text, out _);

        // Assert
        success.ShouldBeFalse();
    }

    [TestMethod]
    public void ReturnIngredientNameWithoutAmount()
    {
        // Arrange
        var text = "sugar";

        // Act
        var success = Ingredient.TryParse(text, out var ingredient);

        // Assert
        success.ShouldBeTrue();
        ingredient.ShouldNotBeNull();
        ingredient.Name.ShouldBe("sugar");
    }

    [TestMethod]
    public void ReturnIngredientNameAmountWithUnit()
    {
        // Arrange
        var text = "12g sugar";

        // Act
        var success = Ingredient.TryParse(text, out var ingredient);

        // Assert
        success.ShouldBeTrue();
        ingredient.ShouldNotBeNull();
        ingredient.Amount.ShouldNotBeNull();
        ingredient.Amount.Value.ShouldBe(new ExactAmountValue(12.0d));
        ingredient.Amount.Unit.ShouldBe("g");
        ingredient.Name.ShouldBe("sugar");
    }

    [TestMethod]
    public void ReturnIngredientNameAndAmountWithoutUnit()
    {
        // Arrange
        var text = "1 citron";

        // Act
        var success = Ingredient.TryParse(text, out var ingredient);

        // Assert
        success.ShouldBeTrue();
        ingredient.ShouldNotBeNull();
        ingredient.Amount.ShouldNotBeNull();
        ingredient.Amount.Value.ShouldBe(new ExactAmountValue(1.0d));
        ingredient.Amount.Unit.ShouldBeNull();
        ingredient.Name.ShouldBe("citron");
    }
}