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); } }
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; } }