public async Task EvaluateNullStringTestAsync() { var evaluator = new MacroEvaluator(new Mock <IProjectProperties>().Object, _emptyTransients, EmptyRemoteEnv, new DebuggerOptions(), new ProfileOptions()); // Null strings may come from external sources (e.g. the .user.json file) and should be treated as empty Assert.True((await evaluator.EvaluateAsync(null)).TryGetResult(out var evaluated, out _)); Assert.Equal("", evaluated); }
public async Task <Result <IActionStep> > EvaluateStepAsync(IActionStep step, string sourceAction) { await VSPackage.TaskFactory.SwitchToMainThreadAsync(); var transients = GetMacroTransients(); var evaluator = new MacroEvaluator(ProjectProperties, transients, RemoteEnvironment, _project.Options.DebuggerOptions, _dirtyProfile); var actionEvalEnv = new ActionEvaluationEnvironment("", "", _dirtyProfile.General.RunActionsLocally, new DebugServer.IPC.CapabilityInfo(default, default, default), _dirtyProfile.Actions);
void OnGUI() { _macro = EditorGUILayout.TextArea(_macro, GUILayout.ExpandHeight(true)); if (GUILayout.Button("Execute")) { MacroEvaluator.Eval(_macro); } }
void OnGUI() { macro = EditorGUILayout.TextArea(macro, GUILayout.ExpandHeight(true)); if (GUILayout.Button(executeLabel)) { MacroEvaluator.Eval(macro); } }
public async Task EmptyMacroNameTestAsync() { var props = new Mock <IProjectProperties>(MockBehavior.Strict); // fails the test if called var evaluator = new MacroEvaluator(props.Object, _emptyTransients, EmptyRemoteEnv, new DebuggerOptions(), new ProfileOptions()); Assert.True((await evaluator.EvaluateAsync("$()")).TryGetResult(out var evaluated, out _)); Assert.Equal("$()", evaluated); Assert.True((await evaluator.EvaluateAsync("")).TryGetResult(out evaluated, out _)); Assert.Equal("", evaluated); }
public async Task RecursiveMacroInEvaluationChainTestAsync() { var props = new Mock <IProjectProperties>(); var options = new ProfileOptions(); options.Macros.Add(new MacroItem("A", "$(A)", userDefined: true)); options.Macros.Add(new MacroItem("B", "$(A)", userDefined: true)); var evaluator = new MacroEvaluator(props.Object, _emptyTransients, EmptyRemoteEnv, new DebuggerOptions(), options); Assert.False((await evaluator.EvaluateAsync("$(B)")).TryGetResult(out _, out var error)); Assert.Equal("$(B) contains a cycle: $(B) -> $(A) -> $(A)", error.Message); }
private string LogCreatedConcepts(MacroEvaluator macroEvaluator, IConceptInfo conceptInfo, IEnumerable <IConceptInfo> macroCreatedConcepts, DslContainer.AddNewConceptsReport newConceptsReport) { var report = new StringBuilder(); report.Append(macroEvaluator.Name + " on " + conceptInfo.GetShortDescription() + " created: " + string.Join(", ", macroCreatedConcepts.Select(c => c.GetShortDescription())) + "."); var newUniqueIndex = new HashSet <string>(newConceptsReport.NewUniqueConcepts.Select(c => c.GetKey())); LogConcepts(report, "New resolved", newConceptsReport.NewlyResolvedConcepts.Where(c => newUniqueIndex.Contains(c.GetKey()))); LogConcepts(report, "Old resolved", newConceptsReport.NewlyResolvedConcepts.Where(c => !newUniqueIndex.Contains(c.GetKey()))); LogConcepts(report, "New unresolved", newConceptsReport.NewUniqueConcepts.Where(c => _dslContainer.FindByKey(c.GetKey()) == null)); return(report.ToString()); }
public async Task NullRemoteEnvironmentTreatedAsLocalTestAsync() { var props = new Mock <IProjectProperties>(); var localPath = Environment.GetEnvironmentVariable("PATH"); var evaluator = new MacroEvaluator(props.Object, _emptyTransients, remoteEnvironment: null, new DebuggerOptions(), new ProfileOptions()); var result = await evaluator.EvaluateAsync("Local: $ENV(PATH), Remote: $ENVR(PATH)"); Assert.True(result.TryGetResult(out var evaluated, out _)); Assert.Equal($"Local: {localPath}, Remote: {localPath}", evaluated); result = await evaluator.EvaluateAsync("Local: $ENV(HOPEFULLY_NON_EXISTENT_VAR), Remote: $ENVR(HOPEFULLY_NON_EXISTENT_VAR)"); Assert.True(result.TryGetResult(out evaluated, out _)); Assert.Equal("Local: , Remote: ", evaluated); }
public async Task ParserEdgeCaseTestAsync() { var props = new Mock <IProjectProperties>(); props.Setup((p) => p.GetEvaluatedPropertyValueAsync("S")).ReturnsAsync("start"); props.Setup((p) => p.GetEvaluatedPropertyValueAsync("M")).ReturnsAsync("middle"); props.Setup((p) => p.GetEvaluatedPropertyValueAsync("E")).ReturnsAsync("end"); var evaluator = new MacroEvaluator(props.Object, _emptyTransients, EmptyRemoteEnv, new DebuggerOptions(), new ProfileOptions()); Assert.True((await evaluator.EvaluateAsync("$(S) $(M) $(E)")).TryGetResult(out var evaluated, out _)); Assert.Equal("start middle end", evaluated); Assert.True((await evaluator.EvaluateAsync("$(S) $$() $( $(M) $(E)")).TryGetResult(out evaluated, out _)); Assert.Equal("start $$() $( middle end", evaluated); Assert.True((await evaluator.EvaluateAsync("$( nested $(M) $( $")).TryGetResult(out evaluated, out _)); Assert.Equal("$( nested middle $( $", evaluated); }
public async Task ProjectPropertiesTestAsync() { var options = new ProfileOptions(); options.Macros.Add(new MacroItem("RadDeployDir", "/home/sayaka/projects", userDefined: true)); options.Macros.Add(new MacroItem("RadDebugScript", "$(RadDeployDir)/debug_bin.py", userDefined: true)); options.Macros.Add(new MacroItem("RadDebugArgs", "$(RadDebugScript) --solution $(SolutionDir)", userDefined: true)); var props = new Mock <IProjectProperties>(); props.Setup((p) => p.GetEvaluatedPropertyValueAsync("SolutionDir")).ReturnsAsync("/opt/rocm/examples/h"); var evaluator = new MacroEvaluator(props.Object, _emptyTransients, EmptyRemoteEnv, new DebuggerOptions(), options); var result = await evaluator.EvaluateAsync("$(RadDebugArgs)"); Assert.True(result.TryGetResult(out var evaluated, out _)); Assert.Equal("/home/sayaka/projects/debug_bin.py --solution /opt/rocm/examples/h", evaluated); }
public async Task EnvironmentVariablesTestAsync() { var props = new Mock <IProjectProperties>(); var remoteEnv = GetRemoteEnv(new Dictionary <string, string>() { { "MAMI_BREAKPOINT", "head" }, { "PATH", "/usr/bin:/root/soulgems" } }); var localPath = Environment.GetEnvironmentVariable("PATH"); var evaluator = new MacroEvaluator(props.Object, _emptyTransients, remoteEnv, new DebuggerOptions(), new ProfileOptions()); var result = await evaluator.EvaluateAsync("Local: $ENV(PATH), Remote: $ENVR(PATH), Break at: $ENVR(MAMI_BREAKPOINT)"); Assert.True(result.TryGetResult(out var evaluated, out _)); Assert.Equal($"Local: {localPath}, Remote: /usr/bin:/root/soulgems, Break at: head", evaluated); result = await evaluator.EvaluateAsync("Local: $ENV(HOPEFULLY_NON_EXISTENT_VAR), Remote: $ENVR(HOPEFULLY_NON_EXISTENT_VAR)"); Assert.True(result.TryGetResult(out evaluated, out _)); Assert.Equal("Local: , Remote: ", evaluated); }
public void RecursiveMacroPreviewTest() { TestHelper.InitializePackageTaskFactory(); var profile = new ProfileOptions(); profile.Macros.Add(new MacroItem("A", "$(B)", userDefined: true)); profile.Macros.Add(new MacroItem("B", "$(A)", userDefined: true)); profile.Macros.Add(new MacroItem("C", "some independent value", userDefined: true)); var props = new Mock <IProjectProperties>(); var evaluator = new MacroEvaluator(props.Object, new MacroEvaluatorTransientValues(0, @"I:\C\ftg", Array.Empty <uint>(), new ReadOnlyCollection <string>(Array.Empty <string>())), MacroEvaluatorTests.EmptyRemoteEnv, new DebuggerOptions(), profile); var context = new MacroEditContext("A", "$(B)", evaluator); var preview = context.EvaluatedValue; Assert.Equal("$(B) contains a cycle: $(B) -> $(A) -> $(B)", preview); }
public async Task TransientValuesTestAsync() { var props = new Mock <IProjectProperties>(); var transients = new MacroEvaluatorTransientValues(sourceLine: 666, sourcePath: @"B:\welcome\home", new[] { 13u }, new ReadOnlyCollection <string>(new[] { "m", "c", "ride" })); var evaluator = new MacroEvaluator(props.Object, transients, EmptyRemoteEnv, new DebuggerOptions(), new ProfileOptions()); var result = await evaluator.GetMacroValueAsync(RadMacros.Watches); Assert.True(result.TryGetResult(out var evaluated, out _)); Assert.Equal("m:c:ride", evaluated); result = await evaluator.EvaluateAsync($"$({RadMacros.ActiveSourceDir})\\$({RadMacros.ActiveSourceFile}):$({RadMacros.ActiveSourceFileLine}), stop at $({RadMacros.BreakLine})"); Assert.True(result.TryGetResult(out evaluated, out _)); Assert.Equal(@"B:\welcome\home:666, stop at 13", evaluated); transients = new MacroEvaluatorTransientValues(0, "nofile", new[] { 20u, 1u, 9u }, new ReadOnlyCollection <string>(new[] { "watch" })); evaluator = new MacroEvaluator(props.Object, transients, EmptyRemoteEnv, new DebuggerOptions(), new ProfileOptions()); result = await evaluator.EvaluateAsync($"-l $({RadMacros.BreakLine})"); Assert.True(result.TryGetResult(out evaluated, out _)); Assert.Equal("-l 20:1:9", evaluated); }
public async Task RecursiveMacroInListTestAsync() { TestHelper.InitializePackageTaskFactory(); var profile = new ProfileOptions(); profile.Macros.Add(new MacroItem("A", "$(B)", userDefined: true)); profile.Macros.Add(new MacroItem("B", "$(A)", userDefined: true)); profile.Macros.Add(new MacroItem("C", "some independent value", userDefined: true)); var props = new Mock <IProjectProperties>(); var evaluator = new MacroEvaluator(props.Object, new MacroEvaluatorTransientValues(0, @"I:\C\ftg", Array.Empty <uint>(), new ReadOnlyCollection <string>(Array.Empty <string>())), MacroEvaluatorTests.EmptyRemoteEnv, new DebuggerOptions(), profile); var context = new MacroEditContext("A", "$(B)", evaluator); await context.LoadPreviewListAsync(profile.Macros, props.Object, MacroEvaluatorTests.EmptyRemoteEnv); var displayedMacros = context.MacroListView.SourceCollection.Cast <KeyValuePair <string, string> >(); Assert.Contains(new KeyValuePair <string, string>("$(B)", "<$(B) contains a cycle: $(B) -> $(A) -> $(B)>"), displayedMacros); Assert.Contains(new KeyValuePair <string, string>("$(C)", "some independent value"), displayedMacros); }