diff --git a/PowerKit.Tests/CellTests.cs b/PowerKit.Tests/CellTests.cs new file mode 100644 index 0000000..528cdb9 --- /dev/null +++ b/PowerKit.Tests/CellTests.cs @@ -0,0 +1,99 @@ +using FluentAssertions; +using PowerKit; +using Xunit; + +namespace PowerKit.Tests; + +public class CellTests +{ + [Fact] + public void TryOpen_Test() + { + // Arrange + var cell = new Cell(); + cell.Store(42); + + // Act + var result = cell.TryOpen(out var value); + + // Assert + result.Should().BeTrue(); + value.Should().Be(42); + } + + [Fact] + public void TryOpen_Unset_Test() + { + // Arrange + var cell = new Cell(); + + // Act + var result = cell.TryOpen(out var value); + + // Assert + result.Should().BeFalse(); + value.Should().BeNull(); + } + + [Fact] + public void TryOpen_Null_Test() + { + // Arrange + var cell = new Cell(); + cell.Store(null); + + // Act + var result = cell.TryOpen(out var value); + + // Assert + result.Should().BeTrue(); + value.Should().BeNull(); + } + + [Fact] + public void OpenOrDefault_Test() + { + // Arrange + var cell = new Cell(); + cell.Store(42); + + // Act + var value = cell.OpenOrDefault(); + var valueOrFallback = cell.OpenOrDefault(99); + + // Assert + value.Should().Be(42); + valueOrFallback.Should().Be(42); + } + + [Fact] + public void OpenOrDefault_Unset_Test() + { + // Arrange + var cell = new Cell(); + + // Act + var value = cell.OpenOrDefault(); + var valueOrFallback = cell.OpenOrDefault(99); + + // Act & assert + value.Should().BeNull(); + valueOrFallback.Should().Be(99); + } + + [Fact] + public void OpenOrDefault_Null_Test() + { + // Arrange + var cell = new Cell(); + cell.Store(null); + + // Act + var value = cell.OpenOrDefault(); + var valueOrFallback = cell.OpenOrDefault(99); + + // Act & assert + value.Should().BeNull(); + valueOrFallback.Should().BeNull(); + } +} diff --git a/PowerKit/Cell.cs b/PowerKit/Cell.cs new file mode 100644 index 0000000..9eb47ff --- /dev/null +++ b/PowerKit/Cell.cs @@ -0,0 +1,42 @@ +namespace PowerKit; + +/// +/// Container for a value that may or may not be set. +/// Essentially , but for cases where null is also a valid value. +/// +internal class Cell +{ + private bool _isValueSet; + private T _value = default!; + + /// + /// Stores the specified value in the cell. + /// + public void Store(T value) + { + _value = value; + _isValueSet = true; + } + + /// + /// Tries to retrieve the value stored in the cell. + /// Returns if a value has been stored, otherwise. + /// + public bool TryOpen(out T value) + { + if (_isValueSet) + { + value = _value; + return true; + } + + value = default!; + return false; + } + + /// + /// Retrieves the value stored in the cell, or if no value has been stored. + /// + public T OpenOrDefault(T defaultValue = default!) => + TryOpen(out var value) ? value : defaultValue; +}