namespace marlin.tests; using core.util; public class VariableExpanderTests { private Dictionary _variables = new(); [SetUp] public void Setup() { this._variables["name"] = "john"; this._variables["branch"] = "master"; } [TestCase("hello world", "hello world")] // passthroughs [TestCase("hi {name}!", "hi john!")] // classic variable expansion [TestCase("hi {name=bob}!", "hi john!")] // existent variable with fallback [TestCase("hi {nonvar=bob}!", "hi bob!")] // non-existent variable with fallback [TestCase("hi {name? plane}!", "hi plane!")] // use value if set [TestCase("hi {nonvar? plane}!", "hi !")] // omit value if not set [TestCase("mycommand {--checkout branch}", "mycommand --checkout master")] // inject cli arg when set [TestCase("mycommand {--checkout nonvar}", "mycommand")] // omit cli arg when not set [TestCase("i will {{escape}}", "i will {escape}")] // escaping works public void ExpansionMatches(string input, string output) { var result = VariableExpander.Expand(input, this._variables); Assert.That(result, Is.EqualTo(output)); } [TestCase("un {", typeof(UnmatchedBraceException))] // unmatched leading [TestCase("un }", typeof(UnmatchedBraceException))] // unmatched trailing [TestCase("{nonvar}", typeof(VariableNotFoundException))] // non existent variable public void ExpansionFails(string input, Type exceptionType) { Assert.That(() => VariableExpander.Expand(input, this._variables), Throws.TypeOf(exceptionType)); } }