public async Task GivenLineNumbersShouldBeCorrect() { var source = @"<article class=""grid-item large""> <div class=""grid-image""><a href=""/News/Page/298/cpp-mva-course""><img src=""/img/news/maxresdefault700x240.png"" alt=""Icon"" title=""C++ MVA Course"" /></a></div> <div class=""grid-title""><a href=""/News/Page/298/cpp-mva-course"">C++ MVA Course</a></div> <div class=""grid-abstract"">My Microsoft Virtual Academy course about modern C++ is now available.</div> <div class=""grid-date"">6/5/2015</div> <div class=""grid-admin""> <a href=""/Page/Delete/298"">Delete</a> | <a href=""/Page/Edit/298"">Edit</a> | <a href=""/Page/Create?parentId=1"">Create New</a> </div> </article> <article class=""grid-item medium""> <div class=""grid-image""><a href=""/News/Page/297/dotnet-developer-conference""><img src=""/img/news/8640.pic23150x150.png"" alt=""Icon"" title="".NET Developer Conference"" /></a></div> <div class=""grid-title""><a href=""/News/Page/297/dotnet-developer-conference"">.NET Developer Conference</a></div> <div class=""grid-abstract"">The sixth edition of the DDC features many interesting talks.</div> <div class=""grid-date"">5/28/2015</div> <div class=""grid-admin""> <a href=""/Page/Delete/297"">Delete</a> | <a href=""/Page/Edit/297"">Edit</a> | <a href=""/Page/Create?parentId=1"">Create New</a> </div> </article> <article class=""grid-item normal even""> <div class=""grid-image""><a href=""/News/Page/296/spider-language""><img src=""/img/news/programming-languages_2150x150.png"" alt=""Icon"" title=""Spider Language"" /></a></div> <div class=""grid-title""><a href=""/News/Page/296/spider-language"">Spider Language</a></div> <div class=""grid-abstract"">Bored of JavaScript's slow evolution? Maybe its time to try Spider.</div> <div class=""grid-date"">5/25/2015</div> <div class=""grid-admin""> <a href=""/Page/Delete/296"">Delete</a> | <a href=""/Page/Edit/296"">Edit</a> | <a href=""/Page/Create?parentId=1"">Create New</a> </div> </article>"; var context = BrowsingContext.New(); var parseErrors = new EventReceiver<HtmlErrorEvent>(handler => context.ParseError += handler); var document = await context.OpenAsync(m => m.Content(source)); Assert.AreEqual(1, parseErrors.Received.Count); Assert.AreEqual((int)HtmlParseError.DoctypeMissing, parseErrors.Received[0].Code); Assert.AreEqual(1, parseErrors.Received[0].Position.Column); Assert.AreEqual(1, parseErrors.Received[0].Position.Line); }
public override async Task Execute() { startLocation = Entity.Transform.Position; startRotation = Entity.Transform.Rotation; //grab a reference to the falling sphere's rigidbody var rigidBody = Entity.Get<RigidbodyComponent>(); var triggerKey = TriggerEntity.Get<Trigger>().TriggerEvent; var receiver = new EventReceiver<bool>(triggerKey); while (!CancellationToken.IsCancellationRequested) { var state = await receiver.ReceiveAsync(); if (state) { //switch to dynamic and awake the rigid body rigidBody.RigidBodyType = RigidBodyTypes.Dynamic; rigidBody.Activate(true); //need to awake to object } else { //when out revert to kinematic and old starting position rigidBody.RigidBodyType = RigidBodyTypes.Kinematic; //reset position Entity.Transform.Position = startLocation; Entity.Transform.Rotation = startRotation; Entity.Transform.UpdateWorldMatrix(); Entity.Get<PhysicsComponent>().UpdatePhysicsTransformation(); } } }
public void SameFrameReceiveAsync() { var test = new EventSystemTest(); var frameCounter = 0; test.AddTask(async () => { while (test.IsRunning) { frameCounter++; await test.NextFrame(); } }, 100); test.AddTask(async () => { var key = new EventKey(); var recv = new EventReceiver(key); key.Broadcast(); var currentFrame = frameCounter; await recv.ReceiveAsync(); Assert.AreEqual(currentFrame, frameCounter); test.Exit(); }); test.Run(); }
public async Task ClosingSpanTagShouldNotResultInAnError() { var context = BrowsingContext.New(); var events = new EventReceiver<HtmlErrorEvent>(callback => context.ParseError += callback); var source = @"<!DOCTYPE html><html><head></head><body><span>test</span></body></html>"; var document = await context.OpenAsync(res => res.Content(source)); Assert.AreEqual(0, events.Received.Count); }
public override void Start() { base.Start(); triggeredEvent = (Trigger != null) ? new EventReceiver<bool>(Trigger.TriggerEvent) : null; sfxInstance = SoundEffect?.CreateInstance(); sfxInstance?.Stop(); }
public void ClosingSpanTagShouldNotResultInAnError() { var events = new EventReceiver<HtmlParseErrorEvent>(); var config = new Configuration(events: events); var source = @"<!DOCTYPE html><html><head></head><body><span>test</span></body></html>"; var document = source.ToHtmlDocument(config); Assert.AreEqual(0, events.Received.Count); }
public void UnsubscribeToEvent(string eventType, EventReceiver listener) { if (events != null) { if (events.ContainsKey(eventType)) { events[eventType] -= listener; } } }
/// <summary> /// Llamamos a este método para desuscribirnos de eventos /// </summary> /// <param name="eventType"></param> /// <param name="listener"></param> public static void UnsubscribeToEvent(EventType eventType, EventReceiver listener) { if (_events != null) //Si el diccionario existe { if (_events.ContainsKey(eventType)) //Si contiene la key que me pasaron { _events[eventType] -= listener; //Remuevo la función de esa key } } }
public void SameFrameReceive() { var key = new EventKey(); var recv = new EventReceiver(key); key.Broadcast(); Assert.True(recv.TryReceive()); Assert.False(recv.TryReceive()); }
public void SameFrameReceive() { var key = new EventKey(); var recv = new EventReceiver(key); key.Broadcast(); Assert.True(recv.TryReceive()); Assert.False(recv.TryReceive()); }
/// <summary> /// Llamamos a este método para desuscribirnos de eventos /// </summary> /// <param name="eventType"></param> /// <param name="listener"></param> public static void UnsubscribeToEvent(TypeOfEvent eventType, EventReceiver listener) { if (_events != null) { if (_events.ContainsKey(eventType)) { _events[eventType] -= listener; } } }
public override async Task Execute() { var brickHit = new EventReceiver <Shock>(BrickShock.BrickHit); while (Game.IsRunning) { var result = await brickHit.ReceiveAsync(); TreatShock(result); } }
public IActionResult Create([FromBody] EventReceiver eventReceiver) { if (eventReceiver == null) { return(BadRequest("Evento não informado")); } _eventReceiverService.Create(eventReceiver); return(Ok(eventReceiver)); }
/* 파라미터 : 해당 액션이 작용할 actor*/ public override void Action(Actor actor) { if (receiver == null) { receiver = actor.GetComponent <EventReceiver>(); } receiver.lv_0Flag = true; UIManager.instance.GetMedicine(); gameObject.SetActive(false); }
public override void Start() { hoverEntity = OutlinePrefab.InstantiateSingle(); hoverEntity.Get <OutlineEntity>().Material = HoverMaterial; selectEntity = OutlinePrefab.InstantiateSingle(); selectEntity.Get <OutlineEntity>().Material = SelectMaterial; entitySelected = new EventReceiver <Entity>(CameraExtensionsDemo.EntitySelected); entityHover = new EventReceiver <Entity>(CameraExtensionsDemo.EntityHover); }
/// <summary> /// Llamamos a este método para desuscribirnos de eventos /// </summary> /// <param name="eventName"></param> /// <param name="listener"></param> public static void UnsubscribeToEvent(string eventName, EventReceiver listener) { //Busca en el diccionario de eventos el método. Si lo encuentra lo elimina. if (_events != null) { if (_events.ContainsKey(eventName)) { _events[eventName] -= listener; } } }
private void Init() { ballLostListener = new EventReceiver(ball.BallLostEK); brickErasedListener = new EventReceiver(HitReaction.ShockTreatedEK); deathOrigPos = deathEntity.Transform.Position; var restartUi = SceneSystem.SceneInstance.RootScene.Entities.First(e => e.Name == "restart ui").Components.Get <UIComponent>(); var btn = (Button)restartUi.Page.RootElement.VisualChildren.First(); btn.Click += BtnOnClick; ExecuteReset(); }
public static void DebugEvents(object o, string formatString, string eventsRegex) { // Find all the events on the object. foreach (EventInfo info in o.GetType().GetEvents(BindingFlags.FlattenHierarchy | BindingFlags.Instance | BindingFlags.Public)) { if (eventsRegex == null || Regex.IsMatch(info.Name, eventsRegex)) { EventReceiver receiver = new EventReceiver(o, info, formatString); } } }
public QueueContainer(EventReceiver eventReceiver, ILogger <QueueContainer> logger, StoreError storeError, int maxQueueSize = 0) { _logger = logger; _eventReceiver = eventReceiver; _queueWriters = new QueueWriter[_count]; for (int i = 0; i < _count; i++) { _queueWriters[i] = new QueueWriter(eventReceiver, logger, storeError, maxQueueSize); } _ = _eventReceiver.LogCount(); _ = LogQueueLength(); }
/// <summary> /// Llamamos a este método para suscribirnos a eventos /// </summary> /// <param name="eventType"></param> /// <param name="listener"></param> public static void SubscribeToEvent(EventType eventType, EventReceiver listener) { if (_events == null) //Si el diccionario aún no existe { _events = new Dictionary <EventType, EventReceiver>(); //Lo creo } if (!_events.ContainsKey(eventType)) //Si el diccionario no contiene la key { _events.Add(eventType, null); //Agrego la key } _events[eventType] += listener; //Agrego la función a esa key }
public static void SubscribeToEvent(string e, EventReceiver listener) { if (_events == null) { _events = new Dictionary <string, EventReceiver>(); } if (!_events.ContainsKey(e)) { _events.Add(e, null); } _events[e] += listener; }
public void ConstructorSetsTheConsumerGroup() { var options = new EventReceiverOptions { ConsumerGroup = "SomeGroup" }; var transportReceiver = new ObservableTransportReceiverMock(); var receiver = new EventReceiver(transportReceiver, "dummy", "0", options); Assert.That(receiver.ConsumerGroup, Is.EqualTo(options.ConsumerGroup)); }
public void OnInvisibilityChanged(bool invisibleValue) { log.InfoFormat("MmoMessageComponent: invisibility changed {0}:{1}:{2} yellow", (ItemType)nebulaObject.Type, nebulaObject.Id, invisibleValue); EventReceiver receiver = EventReceiver.ItemSubscriber; if (nebulaObject.IsPlayer()) { receiver = EventReceiver.OwnerAndSubscriber; } SendInvisibilityChanged(receiver, invisibleValue); }
public void ConstructorSetsThePriority(long?priority) { var options = new EventReceiverOptions { ExclusiveReceiverPriority = priority }; var transportReceiver = new ObservableTransportReceiverMock(); var receiver = new EventReceiver(transportReceiver, "dummy", "0", options); Assert.That(receiver.ExclusiveReceiverPriority, Is.EqualTo(priority)); }
public static void SubscribeToEvent(EventsType eventType, EventReceiver listener) { if (_events == null) { _events = new Dictionary <EventsType, EventReceiver>(); } if (!_events.ContainsKey(eventType)) { _events.Add(eventType, null); } _events[eventType] += listener; }
public void ConstructorSetsTheStartingPosition() { var options = new EventReceiverOptions { BeginReceivingAt = EventPosition.FromSequenceNumber(12345, true) }; var transportReceiver = new ObservableTransportReceiverMock(); var receiver = new EventReceiver(transportReceiver, "dummy", "0", options); Assert.That(receiver.StartingPosition, Is.EqualTo(options.BeginReceivingAt)); }
public override void Start() { base.Start(); if (Trigger == null) { throw new ArgumentException($"{nameof(Trigger)} is not set"); } triggerEventReceiver = new EventReceiver <bool>(Trigger.Changed, EventReceiverOptions.Buffered); UpdateVisuals(); }
public void SubscribeToEvent(string eventType, EventReceiver listener) { if (events == null) { events = new Dictionary <string, EventReceiver>(); } if (!events.ContainsKey(eventType)) { events.Add(eventType, null); } events[eventType] += listener; }
static void Main(string[] args) { // 7. 在主程序中创建事件发送者实例,创建一个"网络管理器" NetworkManager network = new NetworkManager(); // 8. 创建一个接收者实例"消息接收器",处理来自发送者"网络管理器"发来的消息 EventReceiver eventReceiver = new EventReceiver(network); // "网络管理器"触发下载完成消息 network.DownloadContent(); // 输入任意键退出 Console.ReadKey(); }
public override void Start() { var menuControl = ControlsLibrary.InstantiateElement <Grid>("FantasyGrid"); var modal = new ModalElement { Content = menuControl }; UI.Page = new UIPage { RootElement = modal }; modal.OutsideClick += (sender, e) => Hide(); playerClick = new EventReceiver <Raycaster.ClickResult>(PlayerInput.OnClickable); Hide(); }
static void Main(string[] args) { // 7. 在主程序中创建事件发送者实例,创建一个"网络管理器" NetworkManager network = new NetworkManager(); // 8. 创建一个接收者实例"消息接收器",处理来自发送者"网络管理器"发来的消息 EventReceiver eventReceiver = new EventReceiver(network); // "网络管理器"触发下载完成消息 network.DownloadContent(); // 输入任意键退出 Console.ReadKey(); }
private async Task VisitIntermediateCatchMessageEvent( TIntermediateCatchEvent intermediateCatchEvent, TMessageEventDefinition messageEventDefinition) { var messageRef = messageEventDefinition.MessageRef.ToString(); _logger.LogWarning("Waiting for message {message}", messageRef); var result = await EventReceiver.WaitForEventAsync <JObject>(messageRef, _terminateCancellationTokenSource.Token); _logger.LogWarning("Received message {message}", messageRef); await VisitFlowNodes(GetParallelOutgoingNodes(intermediateCatchEvent)); }
public void RunInitialize() { mongoDatabase = mongoClient.GetDatabase(Guid.NewGuid().ToString()); var log = new SemanticLog(new ILogChannel[0], new ILogAppender[0], () => new JsonLogWriter(Formatting.Indented, true)); eventConsumerInfos = new MongoEventConsumerInfoRepository(mongoDatabase); eventNotifier = new DefaultEventNotifier(new InMemoryPubSub()); eventStore = new MongoEventStore(mongoDatabase, eventNotifier); eventConsumer = new MyEventConsumer(NumEvents); eventReceiver = new EventReceiver(formatter, eventStore, eventNotifier, eventConsumerInfos, log); eventReceiver.Subscribe(eventConsumer); }
public void SendSubZoneUpdate(EventReceiver receiver, int subZone) { var eventInstance = new ItemGeneric { ItemId = nebulaObject.Id, ItemType = nebulaObject.Type, CustomEventCode = (byte)CustomEventCode.UpdateSubZone, EventData = subZone }; SendParameters sendParameters = new SendParameters { ChannelId = Settings.ItemEventChannel, Unreliable = false }; var eventData = new EventData((byte)EventCode.ItemGeneric, eventInstance); SendEventData(receiver, eventData, sendParameters); }
// Token: 0x06000704 RID: 1796 RVA: 0x0002E484 File Offset: 0x0002C884 private void DrawExample6() { GUI.Label(new Rect(10f, 130f, 20f, 20f), "6:"); if (!this.example6.done && GUI.Button(new Rect(30f, 130f, 100f, 20f), "Add Event")) { EventReceiver receiver = this.example6.moveRef.GetComponent <EventReceiver>(); UnityEvent unityEvent = this.example6.moveRef.events[1]; unityEvent.RemoveAllListeners(); unityEvent.AddListener(delegate() { receiver.ActivateForTime(this.example6.target); }); this.example6.done = true; } }
public void SendKilled(EventReceiver receiver) { var eventInstance = new ItemGeneric { ItemId = nebulaObject.Id, ItemType = nebulaObject.Type, CustomEventCode = (byte)CustomEventCode.WasKilled, EventData = new Hashtable() }; SendParameters sendParameters = new SendParameters { ChannelId = Settings.ItemEventChannel, Unreliable = false }; var eventData = new EventData((byte)EventCode.ItemGeneric, eventInstance); SendEventData(receiver, eventData, sendParameters); }
public void WeakHandlerTest() { #if DEBUG Assert.Warn("This test case should run on release build."); return; #endif using (var dispatcher = new TestDispatcherContext()) { int eventReceivedCount = 0; DispatcherHelper.UIDispatcher = dispatcher.Dispatcher; var handlerResultList = new List <string>(); var command = new ViewModelCommand(() => { }, () => true); var realReceiver1 = new EventReceiver(command, () => eventReceivedCount++); var realReceiver2 = new EventReceiver(command, () => eventReceivedCount++); var receiver1 = new WeakReference(realReceiver1); var receiver2 = new WeakReference(realReceiver2); var receiver3 = new EventReceiver(command, () => eventReceivedCount++); var semaphore = new Semaphore(0, 1); var releaseReceiver = new EventReceiver(command, () => semaphore.Release()); command.RaiseCanExecuteChanged(); semaphore.WaitOne(1000).Is(true); eventReceivedCount.Is(3); realReceiver1 = null; realReceiver2 = null; GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); receiver1.IsAlive.Is(false); receiver2.IsAlive.Is(false); receiver3.IsNot(null); // do not remove this line. this line is for no released receiver3 by GC. releaseReceiver.IsNot(null); // do not remove this line. this line is for no released releaseReceiver by GC. command.RaiseCanExecuteChanged(); semaphore.WaitOne(1000).Is(true); eventReceivedCount.Is(4); } }
public void ReceiveFirstCheck() { var game = new EventSystemTest(); var frameCount = 0; var evt1 = new EventKey(); var evt2 = new EventKey(); game.AddTask(async() => { var rcv1 = new EventReceiver(evt1); var rcv2 = new EventReceiver(evt2); for (;;) { var rcv = await EventReceiver.ReceiveOne(rcv1, rcv2); if (rcv.Receiver == rcv1) { evt2.Broadcast(); //this is the point of this test.. see if t2 will get populated next loop await game.NextFrame(); } else if (rcv.Receiver == rcv2) { await game.NextFrame(); game.Exit(); } } }); game.AddTask(async() => { while (frameCount < 30 && game.IsRunning) { frameCount++; if (frameCount == 20) { evt1.Broadcast(); } await game.NextFrame(); } Assert.True(false, "t2 should be completed"); }); }
public async Task LoadContextFromStreamChunked() { if (Helper.IsNetworkAvailable()) { var address = "http://anglesharp.azurewebsites.net/Chunked"; var events = new EventReceiver <HtmlParseStartEvent>(); var config = new Configuration(events: events).WithDefaultLoader(); var context = BrowsingContext.New(config); var start = DateTime.Now; events.OnReceived = rec => start = DateTime.Now; var document = await context.OpenAsync(address); var end = DateTime.Now; Assert.Greater(end - start, TimeSpan.FromSeconds(1)); } }
public void WeakHandlerTest() { using (var dispatcher = new TestDispatcherContext()) { int eventReceivedCount = 0; DispatcherHelper.UIDispatcher = dispatcher.Dispatcher; var handlerResultList = new List<string>(); var command = new ViewModelCommand(() => { }, () => true); var realReceiver1 = new EventReceiver(command,() => eventReceivedCount++); var realReceiver2 = new EventReceiver(command, () => eventReceivedCount++); var receiver1 = new WeakReference(realReceiver1); var receiver2 = new WeakReference(realReceiver2); var receiver3 = new EventReceiver(command, () => eventReceivedCount++); command.RaiseCanExecuteChanged(); System.Threading.Thread.Sleep(1000); eventReceivedCount.Is(3); realReceiver1 = null; realReceiver2 = null; GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); receiver1.IsAlive.Is(false); receiver2.IsAlive.Is(false); receiver3.IsNot(null); command.RaiseCanExecuteChanged(); System.Threading.Thread.Sleep(1000); eventReceivedCount.Is(4); } }
public async Task LoadContextFromStreamChunked() { if (Helper.IsNetworkAvailable()) { var address = "http://anglesharp.azurewebsites.net/Chunked"; var events = new EventReceiver<HtmlParseStartEvent>(); var config = new Configuration(events: events).WithDefaultLoader(); var context = BrowsingContext.New(config); var start = DateTime.Now; events.OnReceived = rec => start = DateTime.Now; var document = await context.OpenAsync(address); var end = DateTime.Now; Assert.Greater(end - start, TimeSpan.FromSeconds(1)); } }
/// <summary> /// The raise generic event. /// </summary> /// <param name="itemId"> /// The item id. /// </param> /// <param name="itemType"> /// The item type. /// </param> /// <param name="customEventCode"> /// The custom event code. /// </param> /// <param name="eventData"> /// The event data. /// </param> /// <param name="eventReliability"> /// The event reliability. /// </param> /// <param name="eventReceiver"> /// The event receiver. /// </param> /// <returns> /// the OperationRequest /// </returns> public static OperationRequest RaiseGenericEvent( string itemId, byte? itemType, byte customEventCode, object eventData, Reliability eventReliability, EventReceiver eventReceiver) { var request = new OperationRequest { OperationCode = (byte)OperationCode.RaiseGenericEvent, Parameters = new Dictionary<byte, object>() }; request.Parameters.Add((byte)ParameterCode.CustomEventCode, customEventCode); if (eventData != null) { request.Parameters.Add((byte)ParameterCode.EventData, eventData); } request.Parameters.Add((byte)ParameterCode.EventReliability, (byte)eventReliability); request.Parameters.Add((byte)ParameterCode.EventReceiver, (byte)eventReceiver); if (itemId != null) { request.Parameters.Add((byte)ParameterCode.ItemId, itemId); } if (itemType.HasValue) { request.Parameters.Add((byte)ParameterCode.ItemType, itemType.Value); } return request; }
/// <summary> /// The raise generic event. /// </summary> /// <param name="game"> /// The mmo game. /// </param> /// <param name="itemId"> /// The item id. /// </param> /// <param name="itemType"> /// The item type. /// </param> /// <param name="customEventCode"> /// The custom event code. /// </param> /// <param name="eventData"> /// The event data. /// </param> /// <param name="eventReliability"> /// The event reliability. /// </param> /// <param name="eventReceiver"> /// The event receiver. /// </param> public static void RaiseGenericEvent( Game game, string itemId, byte? itemType, byte customEventCode, object eventData, byte eventReliability, EventReceiver eventReceiver) { var data = new Dictionary<byte, object> { { (byte)ParameterCode.CustomEventCode, customEventCode }, { (byte)ParameterCode.EventReliability, eventReliability }, { (byte)ParameterCode.EventReceiver, (byte)eventReceiver } }; if (eventData != null) { data.Add((byte)ParameterCode.EventData, eventData); } if (itemId != null) { data.Add((byte)ParameterCode.ItemId, itemId); } if (itemType.HasValue) { data.Add((byte)ParameterCode.ItemType, itemType.Value); } game.SendOperation(OperationCode.RaiseGenericEvent, data, true, Settings.ItemChannel); }
public async Task LoadContextFromStreamChunked() { // Warning: This test might fail under certain conditions, e.g., // * client uses a proxy or // * client is connected to VPN (at least with the VPN client of Windows 10). if (Helper.IsNetworkAvailable()) { var address = "http://anglesharp.azurewebsites.net/Chunked"; var config = Configuration.Default.WithDefaultLoader(); var context = BrowsingContext.New(config); var events = new EventReceiver<HtmlParseEvent>(handler => context.Parsing += handler); var start = DateTime.Now; events.OnReceived = rec => start = DateTime.Now; var document = await context.OpenAsync(address); var end = DateTime.Now; Assert.Greater(end - start, TimeSpan.FromSeconds(1)); } }
public void DelayedReceiverCreation() { var game = new EventSystemTest(); var frameCount = 0; game.AddTask(async () => { var evt = new EventKey(); EventReceiver rcv = null; while (frameCount < 25) { if (frameCount == 5) { evt.Broadcast(); } if (frameCount == 20) { rcv = new EventReceiver(evt); Assert.False(rcv.TryReceive()); evt.Broadcast(); } if (frameCount == 22) { Assert.NotNull(rcv); Assert.True(rcv.TryReceive()); game.Exit(); } await game.NextFrame(); frameCount++; } }); game.Run(); }
public ModelChangedArgs(EventReceiver receiver, EventContext context) { Receiver = receiver; Context = context; }
public void DifferentThreadBroadcast() { var game = new EventSystemTest(); var counter = 0; var broadcaster = new EventKey(); var readyCount = 0; game.AddTask(async () => { var recv = new EventReceiver(broadcaster, EventReceiverOptions.Buffered); Interlocked.Increment(ref readyCount); for (;;) { await recv.ReceiveAsync(); Interlocked.Increment(ref counter); } }); game.AddTask(async () => { var recv = new EventReceiver(broadcaster, EventReceiverOptions.Buffered); Interlocked.Increment(ref readyCount); for (;;) { await recv.ReceiveAsync(); Interlocked.Increment(ref counter); } }); game.AddTask(async () => { var recv = new EventReceiver(broadcaster, EventReceiverOptions.Buffered); Interlocked.Increment(ref readyCount); for (;;) { await recv.ReceiveAsync(); Interlocked.Increment(ref counter); } }); var t1W = new AutoResetEvent(false); var t2W = new AutoResetEvent(false); var waitHandles = new WaitHandle[] { t1W, t2W }; Exception threadException = null; new Thread(() => { try { while (!game.IsRunning && readyCount < 3) { Thread.Sleep(200); } var frameCounter = 0; while (true) { Thread.Sleep(50); frameCounter++; broadcaster.Broadcast(); if (frameCounter < 200) continue; t1W.Set(); return; } } catch (Exception e) { threadException = e; } }).Start(); new Thread(() => { try { while (!game.IsRunning && readyCount < 3) { Thread.Sleep(200); } var frameCounter = 0; while (true) { Thread.Sleep(50); frameCounter++; broadcaster.Broadcast(); if (frameCounter < 200) continue; t2W.Set(); return; } } catch (Exception e) { threadException = e; } }).Start(); new Thread(() => { try { //wait until both threads have broadcasted 200 times each if (!WaitHandle.WaitAll(waitHandles, TimeSpan.FromMinutes(2))) { throw new Exception("DifferentThreadBroadcast test timedout."); } Thread.Sleep(2000); game.Exit(); } catch (Exception e) { threadException = e; } }).Start(); game.Run(); Assert.IsNull(threadException); Assert.AreEqual(1200, counter); }
public void DifferentSyntax() { var game = new EventSystemTest(); var frameCounter = 0; var broadcaster = new EventKey(); game.AddTask(async () => { var tests = 5; var recv = new EventReceiver(broadcaster); var threadId = Thread.CurrentThread.ManagedThreadId; while (tests-- > 0) { await recv; Assert.AreEqual(threadId, Thread.CurrentThread.ManagedThreadId); } }); game.AddTask(async () => { var tests = 5; var recv = new EventReceiver(broadcaster); var threadId = Thread.CurrentThread.ManagedThreadId; while (tests-- > 0) { await recv; Assert.AreEqual(threadId, Thread.CurrentThread.ManagedThreadId); } }); game.AddTask(async () => { var tests = 5; var recv = new EventReceiver(broadcaster); var threadId = Thread.CurrentThread.ManagedThreadId; while (tests-- > 0) { await recv; Assert.AreEqual(threadId, Thread.CurrentThread.ManagedThreadId); } }); Task.Run(async () => { while (!game.IsRunning) { await Task.Delay(100); } while (true) { frameCounter++; broadcaster.Broadcast(); if (frameCounter == 20) { game.Exit(); } await Task.Delay(50); } }); game.Run(); }
public void ReceiveManyCheck() { var game = new EventSystemTest(); var frameCount = 0; game.AddTask(async () => { var evt = new EventKey(); var rcv = new EventReceiver(evt, EventReceiverOptions.Buffered); while (frameCount < 25) { evt.Broadcast(); if (frameCount == 20) { var manyEvents = rcv.TryReceiveAll(); Assert.AreEqual(manyEvents, 21); game.Exit(); } await game.NextFrame(); frameCount++; } }); game.Run(); }
public void EveryFrameClear() { var game = new EventSystemTest(); var frameCount = 0; var evt = new EventKey(); game.AddTask(async () => { while (frameCount < 25) { evt.Broadcast(); evt.Broadcast(); await game.NextFrame(); } }, 10); game.AddTask(async () => { var rcv = new EventReceiver(evt, EventReceiverOptions.Buffered); while (frameCount < 25) { if (frameCount == 20) { var manyEvents = rcv.TryReceiveAll(); Assert.AreEqual(2, manyEvents); game.Exit(); } rcv.Reset(); await game.NextFrame(); frameCount++; } }, -10); game.Run(); }
public void ReceiveFirstCheck() { var game = new EventSystemTest(); var frameCount = 0; var evt1 = new EventKey(); var evt2 = new EventKey(); game.AddTask(async () => { var rcv1 = new EventReceiver(evt1); var rcv2 = new EventReceiver(evt2); for (;;) { var rcv = await EventReceiver.ReceiveOne(rcv1, rcv2); if (rcv.Receiver == rcv1) { evt2.Broadcast(); //this is the point of this test.. see if t2 will get populated next loop await game.NextFrame(); } else if (rcv.Receiver == rcv2) { await game.NextFrame(); game.Exit(); } } }); game.AddTask(async () => { while (frameCount < 30 && game.IsRunning) { frameCount++; if (frameCount == 20) { evt1.Broadcast(); } await game.NextFrame(); } Assert.Fail("t2 should be completed"); }); }