Skip to content

Commit

Permalink
Add regression tests for bonsai-rx#1502
Browse files Browse the repository at this point in the history
  • Loading branch information
glopesdev committed Aug 4, 2023
1 parent 680f6aa commit 1389f6c
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 3 deletions.
11 changes: 9 additions & 2 deletions Bonsai.Core.Tests/CombinatorBuilderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,20 @@ Expression CreateObservableExpression<TSource>(IObservable<TSource> source)
return Expression.Constant(source, typeof(IObservable<TSource>));
}

IObservable<TSource> TestCombinatorBuilder<TSource>(object combinator, params Expression[] arguments)
IObservable<TResult> TestCombinatorBuilder<TResult>(object combinator, params Expression[] arguments)
{
Expression buildResult;
var builder = new CombinatorBuilder { Combinator = combinator };
try { buildResult = builder.Build(arguments); }
catch (Exception ex) { throw new WorkflowBuildException(ex.Message, builder, ex); }
var lambda = Expression.Lambda<Func<IObservable<TSource>>>(buildResult);
if (buildResult.Type != typeof(IObservable<TResult>))
{
var actualType = buildResult.Type.GetGenericArguments()[0];
throw new WorkflowBuildException($"" +
$"Output signature does not match. Expected: {typeof(TResult)}. Actual: {actualType}.");
}

var lambda = Expression.Lambda<Func<IObservable<TResult>>>(buildResult);
var resultFactory = lambda.Compile();
var result = resultFactory();
return result;
Expand Down
45 changes: 44 additions & 1 deletion Bonsai.Core.Tests/OverloadedCombinatorBuilderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,27 @@ class DerivedOverrideOverloadedCombinatorMock : BaseVirtualCombinatorMock
public IObservable<object> Process(IObservable<object> _) => Observable.Return(default(object));
}

[Combinator]
abstract class BaseGenericOverloadedCombinatorMock
{
public abstract IObservable<TSource> Process<TSource>(IObservable<TSource> source);
}

class DerivedOverrideGenericOverloadedCombinatorMock : BaseGenericOverloadedCombinatorMock
{
public override IObservable<TSource> Process<TSource>(IObservable<TSource> source) => source;

public IObservable<EventArgs> Process(IObservable<EventArgs> _)
=> Observable.Return(default(EventArgs));
}

class DerivedOverridePrimitiveTransformMock : Transform<double, double>
{
public override IObservable<double> Process(IObservable<double> source) => source;

public IObservable<decimal> Process(IObservable<decimal> source) => source;
}

[TestMethod]
public void Build_DoubleOverloadedMethodCalledWithDouble_ReturnsDoubleValue()
{
Expand Down Expand Up @@ -250,7 +271,7 @@ public void Build_DerivedOverrideMethodCalledWithString_ReturnsOverrideValue()
var value = "5";
var combinator = new DerivedOverrideCombinatorMock();
var source = CreateObservableExpression(Observable.Return(value));
var resultProvider = TestCombinatorBuilder<object>(combinator, source);
var resultProvider = TestCombinatorBuilder<string>(combinator, source);
var result = Last(resultProvider).Result;
Assert.AreNotEqual(value, result);
}
Expand All @@ -265,5 +286,27 @@ public void Build_DerivedOverrideOverloadedMethodCalledWithString_ReturnsObjectV
var result = Last(resultProvider).Result;
Assert.AreNotEqual(value, result);
}

[TestMethod]
public void Build_OverloadOverrideWithRefTypeAndCallWithObject_ReturnsObjectValue()
{
var value = new object();
var combinator = new DerivedOverrideGenericOverloadedCombinatorMock();
var source = CreateObservableExpression(Observable.Return(value));
var resultProvider = TestCombinatorBuilder<object>(combinator, source);
var result = Last(resultProvider).Result;
Assert.AreNotEqual(value, result);
}

[TestMethod]
public void Build_OverloadOverrideCalledWithConvertibleValue_ReturnsOriginalTypeValue()
{
var value = 5.0;
var combinator = new DerivedOverridePrimitiveTransformMock();
var source = CreateObservableExpression(Observable.Return(value));
var resultProvider = TestCombinatorBuilder<double>(combinator, source);
var result = Last(resultProvider).Result;
Assert.AreNotEqual(value, result);
}
}
}

0 comments on commit 1389f6c

Please sign in to comment.