185 lines
4.7 KiB
C#
185 lines
4.7 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using Upsilon;
|
|
using Upsilon.BaseTypes.UserData;
|
|
using Xunit;
|
|
|
|
namespace UpsilonTests.GeneralTests
|
|
{
|
|
public class CoroutineTests
|
|
{
|
|
[Fact]
|
|
public void BasicCoroutineTest()
|
|
{
|
|
const string input = @"
|
|
coroutine testCoroutine()
|
|
yield 5
|
|
yield 1000
|
|
yield ""test""
|
|
yield nil
|
|
end
|
|
";
|
|
var coroutine = Executor.EvaluateFunctionCoroutine(input, "testCoroutine");
|
|
var count = 0;
|
|
while (coroutine.MoveNext())
|
|
{
|
|
var value = coroutine.Current;
|
|
switch (count)
|
|
{
|
|
case 0:
|
|
Assert.Equal(5L, value);
|
|
break;
|
|
case 1:
|
|
Assert.Equal(1000L, value);
|
|
break;
|
|
case 2:
|
|
Assert.Equal("test", value);
|
|
break;
|
|
case 3:
|
|
Assert.Null(value);
|
|
break;
|
|
}
|
|
count++;
|
|
}
|
|
Assert.Equal(4, count);
|
|
}
|
|
|
|
[Fact]
|
|
public void EmptyCoroutineTest()
|
|
{
|
|
const string input = @"
|
|
coroutine testCoroutine()
|
|
end
|
|
";
|
|
var coroutine = Executor.EvaluateFunctionCoroutine(input, "testCoroutine");
|
|
var count = 0;
|
|
while (coroutine.MoveNext())
|
|
{
|
|
count++;
|
|
}
|
|
Assert.Equal(0, count);
|
|
}
|
|
|
|
[Fact]
|
|
public void NestedCoroutineTest()
|
|
{
|
|
const string input = @"
|
|
coroutine testCoroutine()
|
|
for i = 0, 9 do
|
|
yield nil
|
|
end
|
|
end
|
|
";
|
|
var coroutine = Executor.EvaluateFunctionCoroutine(input, "testCoroutine");
|
|
var count = 0;
|
|
var objArray = new List<object>();
|
|
while (coroutine.MoveNext())
|
|
{
|
|
objArray.Add(coroutine.Current);
|
|
count++;
|
|
}
|
|
Assert.Equal(10, count);
|
|
Assert.All(objArray, Assert.Null);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(9)]
|
|
[InlineData(20)]
|
|
[InlineData(2)]
|
|
public void FunctionNestedCoroutine(int max)
|
|
{
|
|
var input = @"
|
|
coroutine lowerCoroutine(number max)
|
|
for i = 0, max do
|
|
yield nil
|
|
end
|
|
end
|
|
|
|
coroutine testCoroutine()
|
|
yield lowerCoroutine(" + max + @")
|
|
end
|
|
";
|
|
var coroutine = Executor.EvaluateFunctionCoroutine(input, "testCoroutine");
|
|
var count = 0;
|
|
var objArray = new List<object>();
|
|
while (coroutine.MoveNext())
|
|
{
|
|
objArray.Add(coroutine.Current);
|
|
count++;
|
|
}
|
|
Assert.Equal(max + 1, count);
|
|
Assert.All(objArray, Assert.Null);
|
|
}
|
|
|
|
[Fact]
|
|
public void CoroutineReturnTest()
|
|
{
|
|
const string input = @"
|
|
coroutine testCoroutine()
|
|
yield 5
|
|
yield 1000
|
|
return
|
|
yield ""test""
|
|
yield nil
|
|
end
|
|
";
|
|
var coroutine = Executor.EvaluateFunctionCoroutine(input, "testCoroutine");
|
|
var count = 0;
|
|
while (coroutine.MoveNext())
|
|
{
|
|
var value = coroutine.Current;
|
|
switch (count)
|
|
{
|
|
case 0:
|
|
Assert.Equal(5L, value);
|
|
break;
|
|
case 1:
|
|
Assert.Equal(1000L, value);
|
|
break;
|
|
}
|
|
count++;
|
|
}
|
|
Assert.Equal(2, count);
|
|
}
|
|
|
|
public class TestClass
|
|
{
|
|
public IEnumerator TestCoroutine()
|
|
{
|
|
yield return 5L;
|
|
yield return 1000L;
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void CSharpCoroutineCallTest()
|
|
{
|
|
UserDataTypeHandler.LoadType<TestClass>();
|
|
|
|
const string input = @"
|
|
coroutine testCoroutine(enumerator)
|
|
yield enumerator.TestCoroutine()
|
|
end
|
|
";
|
|
var coroutine = Executor.EvaluateFunctionCoroutine(input, "testCoroutine", new[] {new TestClass()});
|
|
var count = 0;
|
|
while (coroutine.MoveNext())
|
|
{
|
|
var value = coroutine.Current;
|
|
switch (count)
|
|
{
|
|
case 0:
|
|
Assert.Equal(5L, value);
|
|
break;
|
|
case 1:
|
|
Assert.Equal(1000L, value);
|
|
break;
|
|
}
|
|
count++;
|
|
}
|
|
Assert.Equal(2, count);
|
|
}
|
|
|
|
}
|
|
} |