public void Remote_CanConnectInputSystemsOverEditorPlayerConnection() { var connectionToEditor = ScriptableObject.CreateInstance <RemoteInputPlayerConnection>(); var connectionToPlayer = ScriptableObject.CreateInstance <RemoteInputPlayerConnection>(); connectionToEditor.name = "ConnectionToEditor"; connectionToPlayer.name = "ConnectionToPlayer"; var fakeEditorConnection = new FakePlayerConnection { playerId = 0 }; var fakePlayerConnection = new FakePlayerConnection { playerId = 1 }; fakeEditorConnection.otherEnd = fakePlayerConnection; fakePlayerConnection.otherEnd = fakeEditorConnection; var observer = new RemoteTestObserver(); // In the Unity API, "PlayerConnection" is the connection to the editor // and "EditorConnection" is the connection to the player. Seems counter-intuitive. connectionToEditor.Bind(fakePlayerConnection, true); connectionToPlayer.Bind(fakeEditorConnection, true); // Bind a local remote on the player side. var local = new InputRemoting(InputSystem.s_Manager); local.Subscribe(connectionToEditor); local.StartSending(); connectionToPlayer.Subscribe(observer); var device = InputSystem.AddDevice("Gamepad"); InputSystem.QueueStateEvent(device, new GamepadState()); InputSystem.Update(); InputSystem.RemoveDevice(device); ////TODO: make sure that we also get the connection sequence right and send our initial layouts and devices Assert.That(observer.messages, Has.Count.EqualTo(4)); Assert.That(observer.messages[0].type, Is.EqualTo(InputRemoting.MessageType.Connect)); Assert.That(observer.messages[1].type, Is.EqualTo(InputRemoting.MessageType.NewDevice)); Assert.That(observer.messages[2].type, Is.EqualTo(InputRemoting.MessageType.NewEvents)); Assert.That(observer.messages[3].type, Is.EqualTo(InputRemoting.MessageType.RemoveDevice)); ////TODO: test disconnection ScriptableObject.Destroy(connectionToEditor); ScriptableObject.Destroy(connectionToPlayer); }
public void Remote_CanConnectInputSystemsOverEditorPlayerConnection() { #if UNITY_EDITOR // In the editor, RemoteInputPlayerConnection is a scriptable singleton. Creating multiple instances of it // will cause an error messages - but will work nevertheless, so we expect those errors to let us run the test. // We call RemoteInputPlayerConnection.instance once to make sure that we an instance is created, and we get // a deterministic number of two errors. var instance = RemoteInputPlayerConnection.instance; UnityEngine.TestTools.LogAssert.Expect(LogType.Error, "ScriptableSingleton already exists. Did you query the singleton in a constructor?"); UnityEngine.TestTools.LogAssert.Expect(LogType.Error, "ScriptableSingleton already exists. Did you query the singleton in a constructor?"); #endif var connectionToEditor = ScriptableObject.CreateInstance <RemoteInputPlayerConnection>(); var connectionToPlayer = ScriptableObject.CreateInstance <RemoteInputPlayerConnection>(); connectionToEditor.name = "ConnectionToEditor"; connectionToPlayer.name = "ConnectionToPlayer"; var fakeEditorConnection = new FakePlayerConnection { playerId = 0 }; var fakePlayerConnection = new FakePlayerConnection { playerId = 1 }; fakeEditorConnection.otherEnd = fakePlayerConnection; fakePlayerConnection.otherEnd = fakeEditorConnection; var observerEditor = new RemoteTestObserver(); var observerPlayer = new RemoteTestObserver(); // In the Unity API, "PlayerConnection" is the connection to the editor // and "EditorConnection" is the connection to the player. Seems counter-intuitive. connectionToEditor.Bind(fakePlayerConnection, true); connectionToPlayer.Bind(fakeEditorConnection, true); // Bind a local remote on the player side. var local = new InputRemoting(InputSystem.s_Manager); local.Subscribe(connectionToEditor); connectionToEditor.Subscribe(local); connectionToPlayer.Subscribe(observerEditor); connectionToEditor.Subscribe(observerPlayer); fakeEditorConnection.Send(RemoteInputPlayerConnection.kStartSendingMsg, null); var device = InputSystem.AddDevice <Gamepad>(); InputSystem.QueueStateEvent(device, new GamepadState()); InputSystem.Update(); InputSystem.RemoveDevice(device); fakeEditorConnection.Send(RemoteInputPlayerConnection.kStopSendingMsg, null); // We should not obseve any messages for these, as we stopped sending! device = InputSystem.AddDevice <Gamepad>(); InputSystem.QueueStateEvent(device, new GamepadState()); InputSystem.Update(); InputSystem.RemoveDevice(device); fakeEditorConnection.DisconnectAll(); ////TODO: make sure that we also get the connection sequence right and send our initial layouts and devices Assert.That(observerEditor.messages, Has.Count.EqualTo(5)); Assert.That(observerEditor.messages[0].type, Is.EqualTo(InputRemoting.MessageType.Connect)); Assert.That(observerEditor.messages[1].type, Is.EqualTo(InputRemoting.MessageType.NewDevice)); Assert.That(observerEditor.messages[2].type, Is.EqualTo(InputRemoting.MessageType.NewEvents)); Assert.That(observerEditor.messages[3].type, Is.EqualTo(InputRemoting.MessageType.RemoveDevice)); Assert.That(observerEditor.messages[4].type, Is.EqualTo(InputRemoting.MessageType.Disconnect)); Assert.That(observerPlayer.messages, Has.Count.EqualTo(3)); Assert.That(observerPlayer.messages[0].type, Is.EqualTo(InputRemoting.MessageType.Connect)); Assert.That(observerPlayer.messages[1].type, Is.EqualTo(InputRemoting.MessageType.StartSending)); Assert.That(observerPlayer.messages[2].type, Is.EqualTo(InputRemoting.MessageType.StopSending)); Object.Destroy(connectionToEditor); Object.Destroy(connectionToPlayer); }