##// END OF EJS Templates
Added Skip method to JSON parser to skip contents of the current node
Added Skip method to JSON parser to skip contents of the current node

File last commit:

r34:dabf79fde388 default
r62:62b440d46313 default
Show More
AsyncTests.cs
386 lines | 12.1 KiB | text/x-csharp | CSharpLexer
cin
Implab.Fx: implemented animation object...
r4 using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Reflection;
using System.Threading;
cin
refactoring
r11 using Implab.Parallels;
cin
Implab.Fx: implemented animation object...
r4
cin
implemented parallel map and foreach for arrays...
r15 namespace Implab.Test {
[TestClass]
public class AsyncTests {
[TestMethod]
public void ResolveTest() {
int res = -1;
var p = new Promise<int>();
p.Then(x => res = x);
p.Resolve(100);
cin
Implab.Fx: implemented animation object...
r4
cin
Promise is rewritten to use interlocked operations instead of locks
r19 Assert.AreEqual(100, res);
cin
implemented parallel map and foreach for arrays...
r15 }
user@factory.site.local
initial commit...
r0
cin
Implab.Fx: implemented animation object...
r4 [TestMethod]
cin
implemented parallel map and foreach for arrays...
r15 public void RejectTest() {
int res = -1;
Exception err = null;
cin
Implab.Fx: implemented animation object...
r4
cin
implemented parallel map and foreach for arrays...
r15 var p = new Promise<int>();
p.Then(x => res = x, e => err = e);
p.Reject(new ApplicationException("error"));
cin
Implab.Fx: implemented animation object...
r4
cin
implemented parallel map and foreach for arrays...
r15 Assert.AreEqual(res, -1);
Assert.AreEqual(err.Message, "error");
cin
Implab.Fx: implemented animation object...
r4
cin
implemented parallel map and foreach for arrays...
r15 }
user@factory.site.local
initial commit...
r0
cin
Implab.Fx: implemented animation object...
r4 [TestMethod]
cin
implemented parallel map and foreach for arrays...
r15 public void JoinSuccessTest() {
var p = new Promise<int>();
p.Resolve(100);
Assert.AreEqual(p.Join(), 100);
}
user@factory.site.local
initial commit...
r0
cin
Implab.Fx: implemented animation object...
r4 [TestMethod]
cin
implemented parallel map and foreach for arrays...
r15 public void JoinFailTest() {
var p = new Promise<int>();
p.Reject(new ApplicationException("failed"));
cin
Implab.Fx: implemented animation object...
r4
cin
implemented parallel map and foreach for arrays...
r15 try {
p.Join();
throw new ApplicationException("WRONG!");
} catch (TargetInvocationException err) {
Assert.AreEqual(err.InnerException.Message, "failed");
} catch {
Assert.Fail("Got wrong excaption");
}
}
user@factory.site.local
initial commit...
r0
cin
Implab.Fx: implemented animation object...
r4 [TestMethod]
cin
implemented parallel map and foreach for arrays...
r15 public void MapTest() {
var p = new Promise<int>();
cin
Implab.Fx: implemented animation object...
r4
cin
implemented parallel map and foreach for arrays...
r15 var p2 = p.Map(x => x.ToString());
p.Resolve(100);
cin
Implab.Fx: implemented animation object...
r4
cin
implemented parallel map and foreach for arrays...
r15 Assert.AreEqual(p2.Join(), "100");
}
user@factory.site.local
initial commit...
r0
cin
Implab.Fx: implemented animation object...
r4 [TestMethod]
cin
refactoring
r11 public void FixErrorTest() {
var p = new Promise<int>();
var p2 = p.Error(e => 101);
p.Reject(new Exception());
Assert.AreEqual(p2.Join(), 101);
}
[TestMethod]
cin
implemented parallel map and foreach for arrays...
r15 public void ChainTest() {
var p1 = new Promise<int>();
cin
Implab.Fx: implemented animation object...
r4
cin
implemented parallel map and foreach for arrays...
r15 var p3 = p1.Chain(x => {
var p2 = new Promise<string>();
p2.Resolve(x.ToString());
return p2;
});
cin
Implab.Fx: implemented animation object...
r4
cin
implemented parallel map and foreach for arrays...
r15 p1.Resolve(100);
cin
Implab.Fx: implemented animation object...
r4
cin
implemented parallel map and foreach for arrays...
r15 Assert.AreEqual(p3.Join(), "100");
}
user@factory.site.local
initial commit...
r0
cin
Implab.Fx: implemented animation object...
r4 [TestMethod]
cin
implemented parallel map and foreach for arrays...
r15 public void PoolTest() {
var pid = Thread.CurrentThread.ManagedThreadId;
var p = AsyncPool.Invoke(() => Thread.CurrentThread.ManagedThreadId);
cin
Implab.Fx: implemented animation object...
r4
cin
implemented parallel map and foreach for arrays...
r15 Assert.AreNotEqual(pid, p.Join());
}
cin
implemeted new cancellable promises concept
r10
[TestMethod]
cin
small fixes, WorkerPool still incomplete
r13 public void WorkerPoolSizeTest() {
cin
Improved worker pool
r17 var pool = new WorkerPool(5, 10, 0);
cin
small fixes, WorkerPool still incomplete
r13
cin
refactoring, sync
r20 Assert.AreEqual(5, pool.PoolSize);
cin
small fixes, WorkerPool still incomplete
r13
cin
implemented nonblocking wake singnals processing
r22 pool.Invoke(() => { Thread.Sleep(100000000); return 10; });
pool.Invoke(() => { Thread.Sleep(100000000); return 10; });
pool.Invoke(() => { Thread.Sleep(100000000); return 10; });
cin
small fixes, WorkerPool still incomplete
r13
cin
refactoring, sync
r20 Assert.AreEqual(5, pool.PoolSize);
cin
small fixes, WorkerPool still incomplete
r13
for (int i = 0; i < 100; i++)
cin
implemented nonblocking wake singnals processing
r22 pool.Invoke(() => { Thread.Sleep(100000000); return 10; });
Thread.Sleep(200);
cin
refactoring, sync
r20 Assert.AreEqual(10, pool.PoolSize);
cin
implemented parallel map and foreach for arrays...
r15
pool.Dispose();
cin
small fixes, WorkerPool still incomplete
r13 }
[TestMethod]
public void WorkerPoolCorrectTest() {
cin
Improved worker pool
r17 var pool = new WorkerPool(0,1000,100);
cin
implemented parallel map and foreach for arrays...
r15
int iterations = 1000;
int pending = iterations;
var stop = new ManualResetEvent(false);
cin
small fixes, WorkerPool still incomplete
r13
var count = 0;
cin
implemented parallel map and foreach for arrays...
r15 for (int i = 0; i < iterations; i++) {
cin
small fixes, WorkerPool still incomplete
r13 pool
.Invoke(() => 1)
cin
implemented parallel map and foreach for arrays...
r15 .Then(x => Interlocked.Add(ref count, x))
.Then(x => Math.Log10(x))
.Anyway(() => {
Interlocked.Decrement(ref pending);
if (pending == 0)
stop.Set();
});
}
stop.WaitOne();
cin
small fixes, WorkerPool still incomplete
r13
cin
implemented parallel map and foreach for arrays...
r15 Assert.AreEqual(iterations, count);
Console.WriteLine("Max threads: {0}", pool.MaxRunningThreads);
pool.Dispose();
}
[TestMethod]
public void WorkerPoolDisposeTest() {
var pool = new WorkerPool(5, 20);
cin
refactoring, sync
r20 Assert.AreEqual(5, pool.PoolSize);
cin
implemented parallel map and foreach for arrays...
r15 pool.Dispose();
cin
DispatchPool works again, but performance is poor in some cases
r21 Thread.Sleep(500);
cin
refactoring, sync
r20 Assert.AreEqual(0, pool.PoolSize);
cin
implemented parallel map and foreach for arrays...
r15 pool.Dispose();
cin
small fixes, WorkerPool still incomplete
r13 }
[TestMethod]
cin
Implemented interllocked queue...
r14 public void MTQueueTest() {
var queue = new MTQueue<int>();
int res;
queue.Enqueue(10);
Assert.IsTrue(queue.TryDequeue(out res));
Assert.AreEqual(10, res);
Assert.IsFalse(queue.TryDequeue(out res));
for (int i = 0; i < 1000; i++)
queue.Enqueue(i);
for (int i = 0; i < 1000; i++) {
queue.TryDequeue(out res);
Assert.AreEqual(i, res);
}
int writers = 0;
int readers = 0;
var stop = new ManualResetEvent(false);
int total = 0;
int itemsPerWriter = 1000;
int writersCount = 3;
for (int i = 0; i < writersCount; i++) {
Interlocked.Increment(ref writers);
var wn = i;
AsyncPool
.InvokeNewThread(() => {
for (int ii = 0; ii < itemsPerWriter; ii++) {
queue.Enqueue(1);
}
return 1;
})
cin
implemented parallel map and foreach for arrays...
r15 .Anyway(() => Interlocked.Decrement(ref writers));
cin
Implemented interllocked queue...
r14 }
cin
implemented parallel map and foreach for arrays...
r15
cin
Implemented interllocked queue...
r14 for (int i = 0; i < 10; i++) {
Interlocked.Increment(ref readers);
var wn = i;
AsyncPool
.InvokeNewThread(() => {
int t;
do {
while (queue.TryDequeue(out t))
Interlocked.Add(ref total, t);
} while (writers > 0);
return 1;
})
cin
implemented parallel map and foreach for arrays...
r15 .Anyway(() => {
cin
Implemented interllocked queue...
r14 Interlocked.Decrement(ref readers);
if (readers == 0)
stop.Set();
});
}
stop.WaitOne();
Assert.AreEqual(itemsPerWriter * writersCount, total);
}
[TestMethod]
cin
implemented parallel map and foreach for arrays...
r15 public void ParallelMapTest() {
int count = 100000;
double[] args = new double[count];
var rand = new Random();
for (int i = 0; i < count; i++)
args[i] = rand.NextDouble();
var t = Environment.TickCount;
var res = args.ParallelMap(x => Math.Sin(x*x), 4).Join();
Console.WriteLine("Map complete in {0} ms", Environment.TickCount - t);
t = Environment.TickCount;
for (int i = 0; i < count; i++)
Assert.AreEqual(Math.Sin(args[i] * args[i]), res[i]);
Console.WriteLine("Verified in {0} ms", Environment.TickCount - t);
}
[TestMethod]
cin
sync
r16 public void ChainedMapTest() {
cin
fixed race condition in DispatchPool
r34 using (var pool = new WorkerPool(0,100,100)) {
cin
sync
r16 int count = 10000;
double[] args = new double[count];
var rand = new Random();
for (int i = 0; i < count; i++)
args[i] = rand.NextDouble();
var t = Environment.TickCount;
var res = args
cin
small refactoring, cleanup.
r30 .ChainedMap(
cin
sync
r16 x => pool.Invoke(
() => Math.Sin(x * x)
),
4
)
.Join();
Console.WriteLine("Map complete in {0} ms", Environment.TickCount - t);
t = Environment.TickCount;
for (int i = 0; i < count; i++)
Assert.AreEqual(Math.Sin(args[i] * args[i]), res[i]);
Console.WriteLine("Verified in {0} ms", Environment.TickCount - t);
Console.WriteLine("Max workers: {0}", pool.MaxRunningThreads);
}
}
[TestMethod]
cin
implemented parallel map and foreach for arrays...
r15 public void ParallelForEachTest() {
int count = 100000;
int[] args = new int[count];
var rand = new Random();
for (int i = 0; i < count; i++)
args[i] = (int)(rand.NextDouble() * 100);
int result = 0;
var t = Environment.TickCount;
args.ParallelForEach(x => Interlocked.Add(ref result, x), 4).Join();
Console.WriteLine("Iteration complete in {0} ms, result: {1}", Environment.TickCount - t, result);
int result2 = 0;
t = Environment.TickCount;
for (int i = 0; i < count; i++)
result2 += args[i];
Assert.AreEqual(result2, result);
Console.WriteLine("Verified in {0} ms", Environment.TickCount - t);
}
[TestMethod]
cin
implemeted new cancellable promises concept
r10 public void ComplexCase1Test() {
var flags = new bool[3];
// op1 (aync 200ms) => op2 (async 200ms) => op3 (sync map)
var p = PromiseHelper
.Sleep(200, "Alan")
.Cancelled(() => flags[0] = true)
.Chain(x =>
PromiseHelper
.Sleep(200, "Hi, " + x)
cin
implemented parallel map and foreach for arrays...
r15 .Map(y => y)
cin
implemeted new cancellable promises concept
r10 .Cancelled(() => flags[1] = true)
)
.Cancelled(() => flags[2] = true);
Thread.Sleep(300);
p.Cancel();
try {
Assert.AreEqual(p.Join(), "Hi, Alan");
Assert.Fail("Shouldn't get here");
cin
implemented parallel map and foreach for arrays...
r15 } catch (OperationCanceledException) {
cin
implemeted new cancellable promises concept
r10 }
Assert.IsFalse(flags[0]);
Assert.IsTrue(flags[1]);
Assert.IsTrue(flags[2]);
}
cin
removed the reference to the parent from the promise object this allows...
r33
[TestMethod]
public void ChainedCancel1Test() {
// при отмене сцепленной асинхронной операции все обещание должно
// завершаться ошибкой OperationCanceledException
var p = PromiseHelper
.Sleep(1, "Hi, HAL!")
.Chain(x => {
// запускаем две асинхронные операции
var result = PromiseHelper.Sleep(1000, "HEM ENABLED!!!");
// вторая операция отменяет первую до завершения
PromiseHelper
.Sleep(100, "HAL, STOP!")
.Then(() => result.Cancel());
return result;
});
try {
p.Join();
} catch (TargetInvocationException err) {
Assert.IsTrue(err.InnerException is OperationCanceledException);
}
}
[TestMethod]
public void ChainedCancel2Test() {
// при отмене цепочки обещаний, вложенные операции также должны отменяться
IPromiseBase p = null;
var pSurvive = new Promise<bool>();
var hemStarted = new ManualResetEvent(false);
p = PromiseHelper
.Sleep(1, "Hi, HAL!")
.Chain(x => {
hemStarted.Set();
// запускаем две асинхронные операции
var result = PromiseHelper
.Sleep(1000, "HEM ENABLED!!!")
.Then(s => pSurvive.Resolve(false));
result
.Cancelled(() => pSurvive.Resolve(true));
return result;
});
hemStarted.WaitOne();
p.Cancel();
try {
p.Join();
} catch (OperationCanceledException) {
Assert.IsTrue(pSurvive.Join());
}
}
cin
implemented parallel map and foreach for arrays...
r15 }
cin
Implab.Fx: implemented animation object...
r4 }