using System;
using System.Threading;
using System.Threading.Tasks;
using Content.Server.GameObjects.EntitySystems.JobQueues;
using Content.Server.GameObjects.EntitySystems.JobQueues.Queues;
using NUnit.Framework;
using Robust.Shared.Timing;
using Robust.UnitTesting;
namespace Content.Tests.Server.Jobs
{
[TestFixture]
[TestOf(typeof(Job<>))]
[TestOf(typeof(JobQueue))]
public class JobQueueTest : RobustUnitTest
{
///
/// Test a job that immediately exits with a value.
///
[Test]
public void TestImmediateJob()
{
// Pass debug stopwatch so time doesn't advance.
var sw = new DebugStopwatch();
var queue = new JobQueue(sw);
var job = new ImmediateJob();
queue.EnqueueJob(job);
queue.Process();
Assert.That(job.Status, Is.EqualTo(JobStatus.Finished));
Assert.That(job.Result, Is.EqualTo("honk!"));
}
[Test]
public void TestLongJob()
{
var swA = new DebugStopwatch();
var swB = new DebugStopwatch();
var queue = new LongJobQueue(swB);
var job = new LongJob(swA, swB);
queue.EnqueueJob(job);
queue.Process();
Assert.That(job.Status, Is.EqualTo(JobStatus.Paused));
Assert.That((float)job.DebugTime, new ApproxEqualityConstraint(1f));
queue.Process();
Assert.That(job.Status, Is.EqualTo(JobStatus.Paused));
Assert.That((float)job.DebugTime, new ApproxEqualityConstraint(2f));
queue.Process();
Assert.That(job.Status, Is.EqualTo(JobStatus.Finished));
Assert.That(job.Result, Is.EqualTo("foo!"));
Assert.That((float)job.DebugTime, new ApproxEqualityConstraint(2.4f));
}
[Test]
public void TestLongJobCancel()
{
var swA = new DebugStopwatch();
var swB = new DebugStopwatch();
var queue = new LongJobQueue(swB);
var cts = new CancellationTokenSource();
var job = new LongJob(swA, swB, cts.Token);
queue.EnqueueJob(job);
queue.Process();
Assert.That(job.Status, Is.EqualTo(JobStatus.Paused));
queue.Process();
Assert.That(job.Status, Is.EqualTo(JobStatus.Paused));
cts.Cancel();
queue.Process();
Assert.That(job.Status, Is.EqualTo(JobStatus.Finished));
Assert.That((float)job.DebugTime, new ApproxEqualityConstraint(2.0f));
Assert.That(job.Result, Is.Null);
}
[Test]
public void TestWaitingJob()
{
var sw = new DebugStopwatch();
var queue = new LongJobQueue(sw);
var tcs = new TaskCompletionSource