mirror of
https://github.com/PrismLibrary/Prism.git
synced 2026-10-28 12:48:32 +08:00
170 lines
6.7 KiB
C#
170 lines
6.7 KiB
C#
#nullable enable
|
|
using Prism.Common;
|
|
using Prism.Tests.Common.Mocks;
|
|
using Xunit;
|
|
|
|
namespace Prism.Tests.Common
|
|
{
|
|
public class ParametersFixture
|
|
{
|
|
[Fact]
|
|
public void InterfaceEnumerationPreservesExplicitNullValues()
|
|
{
|
|
IParameters parameters = new MockParameters();
|
|
parameters.Add("value", null);
|
|
|
|
var entry = Assert.Single(parameters);
|
|
Assert.Equal("value", entry.Key);
|
|
Assert.Null(entry.Value);
|
|
Assert.True(parameters.ContainsKey("value"));
|
|
Assert.Null(parameters.GetValue<string>("value"));
|
|
Assert.False(parameters.TryGetValue<string>("value", out var value));
|
|
Assert.Null(value);
|
|
}
|
|
|
|
[Fact]
|
|
public void TryGetValueOfT()
|
|
{
|
|
var parameters = new MockParameters("mock=Foo&mock2=1");
|
|
bool success = false;
|
|
MockEnum value = default;
|
|
MockEnum value1 = default;
|
|
|
|
var ex = Record.Exception(() => success = parameters.TryGetValue<MockEnum>("mock", out value));
|
|
var ex2 = Record.Exception(() => success = parameters.TryGetValue<MockEnum>("mock2", out value1));
|
|
Assert.Null(ex);
|
|
Assert.True(success);
|
|
Assert.Equal(MockEnum.Foo, value);
|
|
Assert.Equal(value, value1);
|
|
}
|
|
|
|
[Fact]
|
|
public void GetValuesOfT()
|
|
{
|
|
var parameters = new MockParameters("mock=Foo&mock=2&mock=Fizz");
|
|
|
|
IEnumerable<MockEnum> values = [];
|
|
|
|
var ex = Record.Exception(() => values = parameters.GetValues<MockEnum>("mock"));
|
|
Assert.Null(ex);
|
|
Assert.Equal(3, values.Count());
|
|
Assert.Equal(MockEnum.Foo, values.ElementAt(0));
|
|
Assert.Equal(MockEnum.Bar, values.ElementAt(1));
|
|
Assert.Equal(MockEnum.Fizz, values.ElementAt(2));
|
|
}
|
|
|
|
|
|
[Fact]
|
|
public void GetValue()
|
|
{
|
|
var parameters = new MockParameters("mock=Foo&mock1=2&mock2=Fizz");
|
|
MockEnum value = default;
|
|
MockEnum value1 = default;
|
|
|
|
var ex = Record.Exception(() => value = parameters.GetValue<MockEnum>("mock"));
|
|
var ex2 = Record.Exception(() => value1 = parameters.GetValue<MockEnum>("mock1"));
|
|
Assert.Null(ex);
|
|
Assert.Equal(MockEnum.Foo, value);
|
|
Assert.Equal(MockEnum.Bar, value1);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(false)]
|
|
[InlineData(true)]
|
|
public void GetValueRunsStructParameterlessConstructorForMissingOrNullParameter(bool addNullParameter)
|
|
{
|
|
IParameters parameters = new MockParameters();
|
|
if (addNullParameter)
|
|
parameters.Add("value", null);
|
|
|
|
Assert.Equal(42, parameters.GetValue<MockStructWithParameterlessConstructor>("value").Value);
|
|
Assert.Equal(42, Assert.IsType<MockStructWithParameterlessConstructor>(parameters.GetValue("value", typeof(MockStructWithParameterlessConstructor))).Value);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(false, 0)]
|
|
[InlineData(true, 42)]
|
|
public void TryGetValuePreservesMissingAndNullStructDefaults(bool addNullParameter, int expectedValue)
|
|
{
|
|
IParameters parameters = new MockParameters();
|
|
if (addNullParameter)
|
|
parameters.Add("value", null);
|
|
|
|
var success = parameters.TryGetValue<MockStructWithParameterlessConstructor>("value", out var value);
|
|
|
|
Assert.Equal(addNullParameter, success);
|
|
Assert.Equal(expectedValue, value.Value);
|
|
}
|
|
|
|
[Fact]
|
|
public void GetValuesRunsStructParameterlessConstructorForNullParameter()
|
|
{
|
|
IParameters parameters = new MockParameters();
|
|
parameters.Add("value", null);
|
|
|
|
var value = Assert.Single(parameters.GetValues<MockStructWithParameterlessConstructor>("value"));
|
|
|
|
Assert.Equal(42, value.Value);
|
|
Assert.Empty(parameters.GetValues<MockStructWithParameterlessConstructor>("missing"));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(false)]
|
|
[InlineData(true)]
|
|
public void NullableAndReferenceDefaultsRemainNullForMissingOrNullParameter(bool addNullParameter)
|
|
{
|
|
IParameters parameters = new MockParameters();
|
|
if (addNullParameter)
|
|
parameters.Add("value", null);
|
|
|
|
Assert.Null(parameters.GetValue<MockStructWithParameterlessConstructor?>("value"));
|
|
Assert.Null(parameters.GetValue("value", typeof(MockStructWithParameterlessConstructor?)));
|
|
Assert.False(parameters.TryGetValue<MockStructWithParameterlessConstructor?>("value", out var nullableValue));
|
|
Assert.Null(nullableValue);
|
|
Assert.Empty(parameters.GetValues<MockStructWithParameterlessConstructor?>("value"));
|
|
Assert.Null(parameters.GetValue<object>("value"));
|
|
Assert.False(parameters.TryGetValue<object>("value", out var referenceValue));
|
|
Assert.Null(referenceValue);
|
|
Assert.Empty(parameters.GetValues<object>("value"));
|
|
}
|
|
|
|
[Fact]
|
|
public void ConvertibleInterfaceDoesNotConvertPlainObject()
|
|
{
|
|
IParameters parameters = new MockParameters();
|
|
parameters.Add("value", new object());
|
|
|
|
Assert.False(parameters.TryGetValue<IConvertible>("value", out var value));
|
|
Assert.Null(value);
|
|
Assert.Empty(parameters.GetValues<IConvertible>("value"));
|
|
var exception = Assert.Throws<InvalidCastException>(() => parameters.GetValue<IConvertible>("value"));
|
|
Assert.Contains("Unable to convert the value of Type", exception.Message);
|
|
}
|
|
|
|
[Fact]
|
|
public void ConvertibleInterfaceReturnsAssignableValue()
|
|
{
|
|
IParameters parameters = new MockParameters();
|
|
object storedValue = 42;
|
|
parameters.Add("value", storedValue);
|
|
|
|
Assert.Same(storedValue, parameters.GetValue<IConvertible>("value"));
|
|
Assert.True(parameters.TryGetValue<IConvertible>("value", out var value));
|
|
Assert.Same(storedValue, value);
|
|
Assert.Same(storedValue, Assert.Single(parameters.GetValues<IConvertible>("value")));
|
|
}
|
|
|
|
[Fact]
|
|
public void ConvertibleTargetStillConvertsStringToInteger()
|
|
{
|
|
IParameters parameters = new MockParameters("value=42");
|
|
|
|
Assert.Equal(42, parameters.GetValue<int>("value"));
|
|
Assert.Equal(42, parameters.GetValue("value", typeof(int)));
|
|
Assert.True(parameters.TryGetValue<int>("value", out var value));
|
|
Assert.Equal(42, value);
|
|
Assert.Equal(42, Assert.Single(parameters.GetValues<int>("value")));
|
|
}
|
|
}
|
|
}
|