public async Task RPC() { var reactorRepo = ReactorRepository.CreateLocal(1); var responseReactor = new ResponseReactor(); reactorRepo.Add(responseReactor); var requestReactor = new RPCReactor(reactorRepo.Resolve(responseReactor)); reactorRepo.Add(requestReactor); await Task.Delay(100); Assert.True(requestReactor.State.ResponseGained); }
public async Task TwoReactors_Threads() { var repo = ReactorRepository.CreateLocal(1, 0.01f, useTasks: false); var reactors = new ReactorBase[] { new Reactor1("1"), new Reactor1("2") }; repo.Add(reactors[0]); repo.Add(reactors[1]); for (int i = 0; i < 20; i++) { reactors[i % 2].Enqueue(null, new Event1(i.ToString())); await Task.Delay(10); } await Task.Delay(30); Assert.Equal("18", ((Reactor1)reactors[0]).State.Data); Assert.Equal("19", ((Reactor1)reactors[1]).State.Data); }
static void Main(string[] args) { // Createa a global reactor repository ReactorRepository.CreateGlobal(2, useTasks: false); ReactorRepository.Global.Add(new PlayerDiscoveryReactor()); // Reactor event sink is useful for handling events outside reactor (test cases) var source = new ReactorEventSink(""); ReactorRepository.AddToGlobal(source); var discoveryReference = ReactorRepository.Global.Resolve <PlayerDiscoveryReactor>(""); var sourceReference = ReactorRepository.Global.Resolve <ReactorEventSink>(""); discoveryReference.Send(sourceReference, new CreatePlayer( username: "******", firstName: "Ziga", lastName: "Osolin", password: "******") ); Thread.Sleep(100); IReactorEvent ev = source.Dequeue(); switch (ev) { case CreatePlayerResponse resp: Console.WriteLine("Created player " + resp.PlayerReactor.Reference); break; default: Console.WriteLine("Error"); return; } // We do a login discoveryReference.Send(sourceReference, new PlayerLogin("nihum", "mypassword") ); Thread.Sleep(100); ev = source.Dequeue(); IReactorReference playerReference; switch (ev) { case PlayerLoginResponse resp: Console.WriteLine("Login player " + resp.PlayerReactor.Reference); playerReference = resp.PlayerReactor; break; default: Console.WriteLine("Error"); return; } playerReference.Send(sourceReference, new RenamePlayer("Ziga2", "Osolin", "Nihum") ); Thread.Sleep(100); ev = source.Dequeue(); switch (ev) { case OK resp: Console.WriteLine("Renamed player"); break; default: Console.WriteLine("Error"); return; } // We create one more player discoveryReference.Send(sourceReference, new CreatePlayer( username: "******", firstName: "Ziga2", lastName: "Osolin", password: "******") ); Thread.Sleep(100); ev = source.Dequeue(); IReactorReference otherPlayerReference; switch (ev) { case CreatePlayerResponse resp: Console.WriteLine("Created player " + resp.PlayerReactor.Reference); otherPlayerReference = resp.PlayerReactor; break; default: Console.WriteLine("Error"); return; } playerReference.Send(sourceReference, new InvitePlayerToRoom( otherPlayerReference, null) ); Thread.Sleep(1000); ev = source.Dequeue(); switch (ev) { case OK resp: Console.WriteLine("Invited player"); break; default: Console.WriteLine("Error"); return; } }