forked from bonsai-rx/expression-scripting
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathExpressionScriptingTests.cs
More file actions
87 lines (78 loc) · 3.72 KB
/
ExpressionScriptingTests.cs
File metadata and controls
87 lines (78 loc) · 3.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
using Bonsai.Expressions;
using System;
using System.Collections;
using System.Reactive.Linq;
using System.Threading.Tasks;
namespace Bonsai.Scripting.Expressions.Tests
{
[TestClass]
public sealed class ExpressionScriptingTests
{
async Task AssertExpressionTransform<TSource, TResult>(string expression, TSource value, TResult expected)
{
var workflowBuilder = new WorkflowBuilder();
var source = workflowBuilder.Workflow.Add(new CombinatorBuilder { Combinator = new Return<TSource>(value) });
var transform = workflowBuilder.Workflow.Add(new ExpressionTransform { Expression = expression });
var output = workflowBuilder.Workflow.Add(new WorkflowOutputBuilder());
workflowBuilder.Workflow.AddEdge(source, transform, new());
workflowBuilder.Workflow.AddEdge(transform, output, new());
var result = await workflowBuilder.Workflow.BuildObservable<TResult>();
if (expected is ICollection expectedCollection && result is ICollection resultCollection)
CollectionAssert.AreEqual(expectedCollection, resultCollection);
else
Assert.AreEqual(expected, result);
}
[DataTestMethod]
[DataRow("it", 42, 42)]
[DataRow("it * 2", 21, 42)]
[DataRow("Single(it)", 42, 42f)]
[DataRow("Math.PI", 42, Math.PI)]
[DataRow("Convert.ToInt16(it)", 42, (short)42)]
[DataRow("new(it as Data).Data", 42, 42)]
// modern Dynamic LINQ parser
[DataRow("float(it)", 42, 42f)]
[DataRow("long?(it).HasValue", 42, true)]
[DataRow("bool.TrueString", 42, "True")]
[DataRow("new[] { it }", 42, new[] { 42 })]
[DataRow("new[] { it }.Select(x => x * 2).ToArray()", 21, new[] { 42 })]
[DataRow("np(string(null).Length) ?? it", 42, 42)]
public Task TestExpressionTransform<TSource, TResult>(string expression, TSource value, TResult expected)
{
return AssertExpressionTransform(expression, value, expected);
}
[TestMethod]
public Task TestNullExpression() => AssertExpressionTransform("null", 0, (object)null);
[TestMethod]
public Task TestNullString() => AssertExpressionTransform("string(null)", 0, (string)null);
[TestMethod]
public Task TestObjectExpression() => AssertExpressionTransform("object(it)", 42, (object)42);
[DataTestMethod]
[DataRow("single(it)", 42, 42f)]
[DataRow("int64?(it).hasvalue", 42, true)]
[DataRow("math.pi", 42, Math.PI)]
[DataRow("boolean.truestring", 42, "True")]
[DataRow("convert.toint16(it)", 42, (short)42)]
[DataRow("datetime.minvalue.second", 42, 0)]
[DataRow("datetimeoffset.minvalue.second", 42, 0)]
[DataRow("guid.empty.tobytearray()[0]", 42, 0)]
[DataRow("timespan.tickspermillisecond", 0, TimeSpan.TicksPerMillisecond)]
[DataRow("it > 0 ? convert.toint16(it) : int16.minvalue", 42, (short)42)]
public Task TestCasingCompatibility<TSource, TResult>(string expression, TSource value, TResult expected)
{
return AssertExpressionTransform(expression, value, expected);
}
[DataTestMethod]
[DataRow("")]
[DataRow("string(it)")]
public Task TestInvalidExpression(string expression)
{
return Assert.ThrowsExactlyAsync<WorkflowBuildException>(() =>
AssertExpressionTransform(expression, 42, (object)null));
}
class Return<TValue>(TValue value) : Source<TValue>
{
public TValue Value { get; } = value;
public override IObservable<TValue> Generate() => Observable.Return(Value);
}
}
}