using GFramework.Core.Functional.Pipe;
using NUnit.Framework;
namespace GFramework.Core.Tests.Functional.Pipe;
///
/// PipeExtensions扩展方法测试类,用于验证管道和函数组合扩展方法的正确性
/// 包括管道操作、函数组合等核心功能的测试
///
[TestFixture]
public class PipeExtensionsTests
{
///
/// 测试Also方法 - 验证执行操作后返回原值功能
///
[Test]
public void Also_Should_Execute_Action_And_Return_Original_Value()
{
// Arrange
var value = 42;
var capturedValue = 0;
// Act
var result = value.Also(x => capturedValue = x);
// Assert
Assert.That(result, Is.EqualTo(42));
Assert.That(capturedValue, Is.EqualTo(42));
}
///
/// 测试Tap方法执行操作并返回原值
///
[Test]
public void Tap_Should_Execute_Action_And_Return_Original_Value()
{
// Arrange
var value = 42;
var capturedValue = 0;
// Act
var result = value.Tap(x => capturedValue = x);
// Assert
Assert.That(result, Is.EqualTo(42));
Assert.That(capturedValue, Is.EqualTo(42));
}
///
/// 测试Tap方法在操作为null时抛出ArgumentNullException
///
[Test]
public void Tap_WithNullAction_Should_Throw_ArgumentNullException()
{
// Arrange
var value = 42;
// Act & Assert
Assert.Throws(() => value.Tap(null!));
}
///
/// 测试Tap方法支持链式调用
///
[Test]
public void Tap_Should_Allow_Chaining()
{
// Arrange
var value = 10;
var log = new List();
// Act
var result = value
.Tap(x => log.Add($"Step 1: {x}"))
.Tap(x => log.Add($"Step 2: {x}"));
// Assert
Assert.That(result, Is.EqualTo(10));
Assert.That(log, Has.Count.EqualTo(2));
Assert.That(log[0], Is.EqualTo("Step 1: 10"));
Assert.That(log[1], Is.EqualTo("Step 2: 10"));
}
///
/// 测试Pipe方法转换值
///
[Test]
public void Pipe_Should_Transform_Value()
{
// Arrange
var value = 42;
// Act
var result = value.Pipe(x => x * 2);
// Assert
Assert.That(result, Is.EqualTo(84));
}
///
/// 测试Pipe方法在函数为null时抛出ArgumentNullException
///
[Test]
public void Pipe_WithNullFunction_Should_Throw_ArgumentNullException()
{
// Arrange
var value = 42;
// Act & Assert
Assert.Throws(() => value.Pipe(null!));
}
///
/// 测试Pipe方法支持链式调用
///
[Test]
public void Pipe_Should_Allow_Chaining()
{
// Arrange
var value = 5;
// Act
var result = value
.Pipe(x => x * 2)
.Pipe(x => x + 10)
.Pipe(x => x.ToString());
// Assert
Assert.That(result, Is.EqualTo("20"));
}
///
/// 测试Let方法转换值
///
[Test]
public void Let_Should_Transform_Value()
{
// Arrange
var value = 42;
// Act
var result = value.Let(x => x.ToString());
// Assert
Assert.That(result, Is.EqualTo("42"));
}
///
/// 测试Let方法在转换函数为null时抛出ArgumentNullException
///
[Test]
public void Let_WithNullTransform_Should_Throw_ArgumentNullException()
{
// Arrange
var value = 42;
// Act & Assert
Assert.Throws(() => value.Let(null!));
}
///
/// 测试Let方法支持复杂转换
///
[Test]
public void Let_Should_Allow_Complex_Transformations()
{
// Arrange
var value = "hello";
// Act
var result = value.Let(s => new
{
Original = s,
Upper = s.ToUpper(),
Length = s.Length
});
// Assert
Assert.That(result.Original, Is.EqualTo("hello"));
Assert.That(result.Upper, Is.EqualTo("HELLO"));
Assert.That(result.Length, Is.EqualTo(5));
}
///
/// 测试PipeIf方法在谓词为true时应用IfTrue函数
///
[Test]
public void PipeIf_WithTruePredicate_Should_Apply_IfTrue_Function()
{
// Arrange
var value = 42;
// Act
var result = value.PipeIf(
x => x > 0,
x => $"Positive: {x}",
x => $"Non-positive: {x}"
);
// Assert
Assert.That(result, Is.EqualTo("Positive: 42"));
}
///
/// 测试PipeIf方法在谓词为false时应用IfFalse函数
///
[Test]
public void PipeIf_WithFalsePredicate_Should_Apply_IfFalse_Function()
{
// Arrange
var value = -5;
// Act
var result = value.PipeIf(
x => x > 0,
x => $"Positive: {x}",
x => $"Non-positive: {x}"
);
// Assert
Assert.That(result, Is.EqualTo("Non-positive: -5"));
}
///
/// 测试PipeIf方法在谓词为null时抛出ArgumentNullException
///
[Test]
public void PipeIf_WithNullPredicate_Should_Throw_ArgumentNullException()
{
// Arrange
var value = 42;
// Act & Assert
Assert.Throws(() =>
value.PipeIf(null!, x => "", x => ""));
}
///
/// 测试PipeIf方法在IfTrue函数为null时抛出ArgumentNullException
///
[Test]
public void PipeIf_WithNullIfTrue_Should_Throw_ArgumentNullException()
{
// Arrange
var value = 42;
// Act & Assert
Assert.Throws(() =>
value.PipeIf(x => true, null!, x => ""));
}
///
/// 测试PipeIf方法在IfFalse函数为null时抛出ArgumentNullException
///
[Test]
public void PipeIf_WithNullIfFalse_Should_Throw_ArgumentNullException()
{
// Arrange
var value = 42;
// Act & Assert
Assert.Throws(() =>
value.PipeIf(x => true, x => "", null!));
}
///
/// 测试PipeIf方法支持链式调用
///
[Test]
public void PipeIf_Should_Allow_Chaining()
{
// Arrange
var value = 10;
// Act
var result = value
.PipeIf(x => x > 5, x => x * 2, x => x + 10)
.PipeIf(x => x > 15, x => $"Large: {x}", x => $"Small: {x}");
// Assert
Assert.That(result, Is.EqualTo("Large: 20"));
}
}