private static Entrypoint GetEntrypoint(IKontrolModule module, string name, IKSPContext context)
        {
            try {
                IKontrolFunction function = module.FindFunction(name);
                if (function == null || !function.IsAsync)
                {
                    return(null);
                }

                if (function.Parameters.Count == 0)
                {
                    return(_ => (IAnyFuture)function.Invoke(context));
                }

                if (function.Parameters.Count == 1 && function.Parameters[0].type.Name == "ksp::vessel::Vessel")
                {
                    return(vessel =>
                           (IAnyFuture)function.Invoke(context, new KSPVesselModule.VesselAdapter(context, vessel)));
                }

                context.Logger.Error($"GetEntrypoint {name} failed: Invalid parameters {function.Parameters}");
                return(null);
            } catch (Exception e) {
                context.Logger.Error($"GetEntrypoint {name} failed: {e}");
                return(null);
            }
        }
Ejemplo n.º 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;
            }
        }