private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
        {
            if (_controller == null)
            {
                _controller = new ReplEngineController(StartUpScript, WorkingDirectory);
            }

            ReplEngine.DataContext = _controller.ViewModel;
        }
        private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
        {
            if (_controller == null)
            {
                _controller = new ReplEngineController(StartUpScript, WorkingDirectory);
            }

            ReplEngine.DataContext = _controller.ViewModel;
        }
        public void repl_engine_is_started_when_view_model_is_accessed()
        {
            // ARRANGE
            var controller = new ReplEngineController(null, null, _replEngine.Object, _processService.Object, _testScheduler);

            // ACT
            var viewModel = controller.ViewModel;

            // ASSERT
            Assert.That(viewModel, Is.Not.Null);
            _replEngine.Verify(x => x.Start(It.IsAny <string>()), Times.Once());
        }
        public void repl_engine_is_started_when_view_model_is_accessed()
        {
            // ARRANGE
            var controller = new ReplEngineController(null, null, _replEngine.Object, _processService.Object, _testScheduler);

            // ACT
            var viewModel = controller.ViewModel;

            // ASSERT
            Assert.That(viewModel, Is.Not.Null);
            _replEngine.Verify(x => x.Start(It.IsAny<string>()), Times.Once());
        }
        public void repl_engine_generates_error_output_then_view_model_is_updated()
        {
            // ARRANGE
            var controller = new ReplEngineController(null, null, _replEngine.Object, _processService.Object, _testScheduler);
            var viewModel  = (ReplEngineViewModel)controller.ViewModel;

            // ACT
            _errorSubject.OnNext("error 1");

            _testScheduler.AdvanceBy(TimeSpan.FromSeconds(1));

            // ASSERT
            Assert.That(viewModel.Output.Count(), Is.EqualTo(1));
            Assert.That(viewModel.Output.First().Value, Is.EqualTo("error 1"));
            Assert.That(viewModel.Output.First().IsError, Is.True);
        }
        public void repl_engine_generates_output_then_view_model_is_updated()
        {
            // ARRANGE
            var controller = new ReplEngineController(null, null, _replEngine.Object, _processService.Object, _testScheduler);
            var viewModel = (ReplEngineViewModel)controller.ViewModel;

            // ACT
            _outputSubject.OnNext("line 1");

            _testScheduler.AdvanceBy(TimeSpan.FromSeconds(1));

            // ASSERT
            Assert.That(viewModel.Output.Count(), Is.EqualTo(1));
            Assert.That(viewModel.Output.First().Value, Is.EqualTo("line 1"));
            Assert.That(viewModel.Output.First().IsError, Is.False);
        }
        public void repl_engine_executes_script_when_controller_execute_is_called()
        {
            // ARRANGE
            var script = "let x = 345;;";

            _replEngine.Setup(x => x.Execute(script)).Returns(_replEngine.Object).Verifiable();
            var controller = new ReplEngineController(null, null, _replEngine.Object, _processService.Object, _testScheduler);
            var viewModel  = (ReplEngineViewModel)controller.ViewModel;

            // ACT
            controller.Execute(script);

            _testScheduler.AdvanceBy(TimeSpan.FromSeconds(1));

            // ASSERT
            _replEngine.Verify(x => x.Execute(script), Times.Once);
        }
        public void repl_engine_resets_when_view_model_reset_is_called()
        {
            // ARRANGE
            _replEngine.Setup(x => x.Reset()).Returns(_replEngine.Object).Verifiable();
            var controller = new ReplEngineController(null, null, _replEngine.Object, _processService.Object, _testScheduler, _testScheduler);
            var viewModel  = (ReplEngineViewModel)controller.ViewModel;

            _stateSubject.OnNext(State.Running);

            _testScheduler.AdvanceBy(TimeSpan.FromSeconds(1));

            // ACT
            viewModel.ResetCommand.Execute(null);

            _testScheduler.AdvanceBy(TimeSpan.FromSeconds(1));

            // ASSERT
            _replEngine.Verify(x => x.Reset(), Times.Once);
        }
        public void repl_engine_resets_when_view_model_reset_is_called()
        {
            // ARRANGE
            _replEngine.Setup(x => x.Reset()).Returns(_replEngine.Object).Verifiable();
            var controller = new ReplEngineController(null, null, _replEngine.Object, _processService.Object, _testScheduler, _testScheduler);
            var viewModel = (ReplEngineViewModel)controller.ViewModel;
            _stateSubject.OnNext(State.Running);

            _testScheduler.AdvanceBy(TimeSpan.FromSeconds(1));

            // ACT
            viewModel.ResetCommand.Execute(null);

            _testScheduler.AdvanceBy(TimeSpan.FromSeconds(1));

            // ASSERT
            _replEngine.Verify(x => x.Reset(), Times.Once);
        }
        public void repl_engine_executes_script_when_controller_execute_is_called()
        {
            // ARRANGE
            var script = "let x = 345;;";
            _replEngine.Setup(x => x.Execute(script)).Returns(_replEngine.Object).Verifiable();
            var controller = new ReplEngineController(null, null, _replEngine.Object, _processService.Object, _testScheduler);
            var viewModel = (ReplEngineViewModel)controller.ViewModel;

            // ACT
            controller.Execute(script);

            _testScheduler.AdvanceBy(TimeSpan.FromSeconds(1));

            // ASSERT
            _replEngine.Verify(x => x.Execute(script), Times.Once);
        }