public void ExecutesCodeOnCorrectThread()
		{
			int? threadEngineWasCreatedOn = null;
			var threadsExecuteWasCalledFrom = new List<int>();

			var innerEngine = new Mock<IJsEngine>();
			innerEngine.Setup(x => x.Execute(It.IsAny<string>()))
				.Callback(() =>
					threadsExecuteWasCalledFrom.Add(Thread.CurrentThread.ManagedThreadId)
				);
			var factory = new Mock<IEngineFactoryForMock>();
			factory.Setup(x => x.EngineFactory())
				.Returns(innerEngine.Object)
				.Callback(() => threadEngineWasCreatedOn = Thread.CurrentThread.ManagedThreadId);

			var engine = new JsEngineWithOwnThread(factory.Object.EngineFactory, new CancellationToken());
			Assert.AreEqual(true, engine.IsThreadAlive);
			// Engine was created on a different thread
			Assert.AreNotEqual(Thread.CurrentThread.ManagedThreadId, threadEngineWasCreatedOn);

			engine.Execute("alert(hello)");
			engine.Execute("alert(world)");
			// Execute was called twice
			innerEngine.Verify(x => x.Execute(It.IsAny<string>()), Times.Exactly(2));
			// Both calls ran on same thread
			Assert.AreEqual(threadsExecuteWasCalledFrom[0], threadsExecuteWasCalledFrom[1]);
			// Both calls ran on the thread the engine was created on
			Assert.AreEqual(threadEngineWasCreatedOn, threadsExecuteWasCalledFrom[0]);	
		}
        public void ExecutesCodeOnCorrectThread()
        {
            int?threadEngineWasCreatedOn    = null;
            var threadsExecuteWasCalledFrom = new List <int>();

            var innerEngine = new Mock <IJsEngine>();

            innerEngine.Setup(x => x.Execute(It.IsAny <string>()))
            .Callback(() =>
                      threadsExecuteWasCalledFrom.Add(Thread.CurrentThread.ManagedThreadId)
                      );
            var factory = new Mock <IEngineFactoryForMock>();

            factory.Setup(x => x.EngineFactory())
            .Returns(innerEngine.Object)
            .Callback(() => threadEngineWasCreatedOn = Thread.CurrentThread.ManagedThreadId);

            var engine = new JsEngineWithOwnThread(factory.Object.EngineFactory, new CancellationToken());

            Assert.AreEqual(true, engine.IsThreadAlive);
            // Engine was created on a different thread
            Assert.AreNotEqual(Thread.CurrentThread.ManagedThreadId, threadEngineWasCreatedOn);

            engine.Execute("alert(hello)");
            engine.Execute("alert(world)");
            // Execute was called twice
            innerEngine.Verify(x => x.Execute(It.IsAny <string>()), Times.Exactly(2));
            // Both calls ran on same thread
            Assert.AreEqual(threadsExecuteWasCalledFrom[0], threadsExecuteWasCalledFrom[1]);
            // Both calls ran on the thread the engine was created on
            Assert.AreEqual(threadEngineWasCreatedOn, threadsExecuteWasCalledFrom[0]);
        }
		public void HandlesDisposal()
		{
			var innerEngine = new Mock<IJsEngine>();
			var factory = new Mock<IEngineFactoryForMock>();
			factory.Setup(x => x.EngineFactory()).Returns(innerEngine.Object);

			var engine = new JsEngineWithOwnThread(factory.Object.EngineFactory, new CancellationToken());
			engine.Dispose();

			innerEngine.Verify(x => x.Dispose());
			Assert.That(() => engine.IsThreadAlive, Is.False.After(250, 5));
		}
		public void HandlesCallFunctionThatReturnsObject()
		{
			var innerEngine = new Mock<IJsEngine>();
			innerEngine.Setup(x => x.CallFunction("hello")).Returns("Hello World");
			var factory = new Mock<IEngineFactoryForMock>();
			factory.Setup(x => x.EngineFactory()).Returns(innerEngine.Object);

			var engine = new JsEngineWithOwnThread(factory.Object.EngineFactory, new CancellationToken());
			var result = engine.CallFunction("hello");

			Assert.AreEqual("Hello World", result);
		}
		public void HandlesCallFunctionThatReturnsGeneric()
		{
			var innerEngine = new Mock<IJsEngine>();
			innerEngine.Setup(x => x.CallFunction<int>("add", 40, 2)).Returns(42);
			var factory = new Mock<IEngineFactoryForMock>();
			factory.Setup(x => x.EngineFactory()).Returns(innerEngine.Object);

			var engine = new JsEngineWithOwnThread(factory.Object.EngineFactory, new CancellationToken());
			var result = engine.CallFunction<int>("add", 40, 2);

			Assert.AreEqual(42, result);
		}
        public void HandlesDisposal()
        {
            var innerEngine = new Mock <IJsEngine>();
            var factory     = new Mock <IEngineFactoryForMock>();

            factory.Setup(x => x.EngineFactory()).Returns(innerEngine.Object);

            var engine = new JsEngineWithOwnThread(factory.Object.EngineFactory, new CancellationToken());

            engine.Dispose();

            innerEngine.Verify(x => x.Dispose());
            Assert.That(() => engine.IsThreadAlive, Is.False.After(250, 5));
        }
        public void HandlesCallFunctionThatReturnsObject()
        {
            var innerEngine = new Mock <IJsEngine>();

            innerEngine.Setup(x => x.CallFunction("hello")).Returns("Hello World");
            var factory = new Mock <IEngineFactoryForMock>();

            factory.Setup(x => x.EngineFactory()).Returns(innerEngine.Object);

            var engine = new JsEngineWithOwnThread(factory.Object.EngineFactory, new CancellationToken());
            var result = engine.CallFunction("hello");

            Assert.AreEqual("Hello World", result);
        }
        public void HandlesCallFunctionThatReturnsGeneric()
        {
            var innerEngine = new Mock <IJsEngine>();

            innerEngine.Setup(x => x.CallFunction <int>("add", 40, 2)).Returns(42);
            var factory = new Mock <IEngineFactoryForMock>();

            factory.Setup(x => x.EngineFactory()).Returns(innerEngine.Object);

            var engine = new JsEngineWithOwnThread(factory.Object.EngineFactory, new CancellationToken());
            var result = engine.CallFunction <int>("add", 40, 2);

            Assert.AreEqual(42, result);
        }