public bool MoveNext() { if (process == null) { return(false); } try { ContextHolder.CurrentContext.Value = context; context.ResetTimeout(); IAnyFutureResult result = process.Poll(); if (result.IsReady) { process = null; onDone(ExtractMessage(result.ValueObject)); return(false); } else { current = context.NextYield; return(true); } } catch (Exception e) { context.Logger.Error($"Exception in process poll: {e.Message}"); context.Logger.LogException(e); process = null; onDone(ExtractMessage(e)); return(false); } finally { ContextHolder.CurrentContext.Value = null; } }
public static TestResult RunTest(IKontrolModule module, IKontrolFunction testFunction, TestContextFactory contextFactory) { TestRunnerContext testContext = contextFactory(); try { testContext.ResetTimeout(); object testReturn = testFunction.Invoke(testContext); switch (testReturn) { case bool booleanResult when !booleanResult: return(new TestResult(module.Name + "::" + testFunction.Name, testContext.AssertionsCount, "Returned false", testContext.Messages)); case IAnyOption option when !option.Defined: return(new TestResult(module.Name + "::" + testFunction.Name, testContext.AssertionsCount, "Returned None", testContext.Messages)); case IAnyResult result when !result.Success: return(new TestResult(module.Name + "::" + testFunction.Name, testContext.AssertionsCount, $"Returned Err({result.ErrorString})", testContext.Messages)); case IAnyFuture future: ContextHolder.CurrentContext.Value = testContext; for (int i = 0; i < 100; i++) { testContext.IncrYield(); testContext.ResetTimeout(); IAnyFutureResult result = future.Poll(); if (result.IsReady) { return(new TestResult(module.Name + "::" + testFunction.Name, testContext.AssertionsCount, testContext.Messages)); } } return(new TestResult(module.Name + "::" + testFunction.Name, testContext.AssertionsCount, "Future did not become ready", testContext.Messages)); default: return(new TestResult(module.Name + "::" + testFunction.Name, testContext.AssertionsCount, testContext.Messages)); } } catch (AssertException e) { return(new TestResult(module.Name + "::" + testFunction.Name, testContext.AssertionsCount, e.Message, testContext.Messages)); } catch (Exception e) { Console.Error.WriteLine(e); return(new TestResult(module.Name + "::" + testFunction.Name, testContext.AssertionsCount, e, testContext.Messages)); } finally { ContextHolder.CurrentContext.Value = null; } }