public void Execute(ExecutionPlan plan) { var service = DreamTestHelper.CreateService( _hostinfo, "sid://mindtouch.com/2007/12/dekiscript", "dekiscript", new XDoc("config").Elem("manifest", _manifestUri) ); foreach (var functionName in _manifest["function/name"]) { var name = functionName.AsText; _tester.Runtime.RegisterFunction(name, service.AtLocalHost.At(name)); } try { var expr = _tester.Parse(plan.Expr); var env = _tester.Runtime.CreateEnv(); env.Vars.Add(DekiScriptEnv.SAFEMODE, DekiScriptExpression.Constant(plan.Safe)); DekiScriptExpression result = _tester.Runtime.Evaluate(expr, plan.Safe ? DekiScriptEvalMode.EvaluateSafeMode : DekiScriptEvalMode.Evaluate, env); if (plan.TypedVerification != null) { Assert.AreEqual(plan.ExpectedType, result.GetType()); plan.TypedVerification(result); } else if (plan.DocVerification != null) { if (!(result is DekiScriptXml)) { Assert.Fail(string.Format("return type was '{0}' not DekiScriptXml", result.GetType())); } var doc = ((DekiScriptXml)result).Value; plan.DocVerification(doc); } else if (plan.StringVerification != null) { string value; if (result is DekiScriptString) { value = ((DekiScriptString)result).Value; } else if (result is DekiScriptXml) { value = ((DekiScriptXml)result).Value.ToString(); } else { value = result.ToString(); } plan.StringVerification(value, result.GetType()); } else { Assert.Fail("Execution completed without exception"); } } catch (Exception e) { if (plan.ExceptionVerification != null) { plan.ExceptionVerification(e); } else { throw; } } finally { service.WithPrivateKey().AtLocalHost.Delete(); } }