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;
            }
        }
Beispiel #2
0
        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;
            }
        }