ValueTaskTest.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. using System;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4. using NUnit.Framework;
  5. using UnityEngine;
  6. using UnityEngine.TestTools;
  7. using UnityEngine.TestTools.Utils;
  8. namespace LitMotion.Tests.Runtime
  9. {
  10. public class ValueTaskTest
  11. {
  12. [Test]
  13. public async Task Test_ToValueTask()
  14. {
  15. var value = 0f;
  16. await LMotion.Create(0f, 10f, 0.5f).Bind(x => value = x).ToValueTask();
  17. Assert.That(value, Is.EqualTo(10f));
  18. }
  19. [Test]
  20. public async Task Test_ToValueTask_AsTask()
  21. {
  22. var value = 0f;
  23. await LMotion.Create(0f, 10f, 0.5f).Bind(x => value = x).ToValueTask().AsTask();
  24. Assert.That(value, Is.EqualTo(10f));
  25. }
  26. [Test]
  27. public async Task Test_AwaitManyTimes()
  28. {
  29. var value = 0f;
  30. var startValue = 0f;
  31. var endValue = 10f;
  32. for (int i = 0; i < 50; i++)
  33. {
  34. await LMotion.Create(startValue, endValue, 0.1f)
  35. .Bind(x => value = x)
  36. .ToValueTask();
  37. Assert.That(value, Is.EqualTo(10f).Using(FloatEqualityComparer.Instance));
  38. }
  39. }
  40. [Test]
  41. public async Task Test_CancelAwait()
  42. {
  43. var canceled = false;
  44. var source = new CancellationTokenSource();
  45. source.CancelAfter(500);
  46. var handle = LMotion.Create(0f, 10f, 1f)
  47. .WithOnCancel(() => canceled = true)
  48. .RunWithoutBinding();
  49. try
  50. {
  51. await handle.ToValueTask(source.Token);
  52. }
  53. catch (OperationCanceledException)
  54. {
  55. Assert.IsTrue(canceled);
  56. return;
  57. }
  58. Assert.Fail();
  59. }
  60. [Test]
  61. public async Task Test_WithCanceledToken()
  62. {
  63. var canceled = false;
  64. var source = new CancellationTokenSource();
  65. source.Cancel();
  66. var handle = LMotion.Create(0f, 10f, 1f)
  67. .WithOnCancel(() => canceled = true)
  68. .RunWithoutBinding();
  69. try
  70. {
  71. await handle.ToValueTask(source.Token);
  72. }
  73. catch (OperationCanceledException)
  74. {
  75. Assert.IsTrue(canceled);
  76. return;
  77. }
  78. Assert.Fail();
  79. }
  80. [Test]
  81. public async Task Test_CancelWhileAwait()
  82. {
  83. var handle = LMotion.Create(0f, 10f, 1f).BindToUnityLogger();
  84. _ = LMotion.Create(0f, 1f, 0.2f)
  85. .WithOnComplete(() => handle.Cancel())
  86. .RunWithoutBinding();
  87. try
  88. {
  89. await handle.ToValueTask();
  90. }
  91. catch (OperationCanceledException)
  92. {
  93. return;
  94. }
  95. Assert.Fail();
  96. }
  97. [Test]
  98. public async Task Test_CancelWhileAwait_WithCancelOnError()
  99. {
  100. LogAssert.ignoreFailingMessages = true;
  101. var handle = LMotion.Create(0f, 10f, 1f)
  102. .WithCancelOnError()
  103. .Bind(x =>
  104. {
  105. if (x > 5f) throw new Exception("Test");
  106. });
  107. try
  108. {
  109. await handle.ToValueTask();
  110. }
  111. catch (OperationCanceledException)
  112. {
  113. return;
  114. }
  115. Assert.Fail();
  116. }
  117. }
  118. }