static void Main(string[] args) { var fs = Flag.NewFlagSet("BooleanExample", ErrorHandling.ExitOnError); var switchFlag = Flag.Bool("insert", false, "use the flag without a value as a bool as a switch"); var equalsFlag = Flag.Bool("equals", false, "use equals(=) sign format as well"); var intFlag = Flag.Bool("inty", false, "use 0 or 1 to indicate bool value"); args = new[] { "-insert", "-equals=true ", "-inty", "1" }; fs.Parse(args); Console.WriteLine($"-insert value: {switchFlag}"); Console.WriteLine($"-equalsFlag value: {equalsFlag}"); Console.WriteLine($"-intFlag value: {intFlag}"); }
public void TestChangingArgs() { ResetForTesting(() => Assert.True(false, "bad parse")); //the go src sets os.Args, which is the command line arguments, something that is read-only in .net var args = new[] { "cmd", "-before", "subcmd", "-after", "args" }; var before = Flag.Bool("before", false, ""); var err = Flag.CommandLine.Parse(args.Skip(1).ToArray()); Assert.True(err == null, err?.ToString()); var cmd = Flag.Arg(0); var after = Flag.Bool("after", false, ""); args = Flag.Args(); Flag.CommandLine.Parse(args.Skip(1).ToArray()); args = Flag.Args(); Assert.True(before && cmd == "subcmd" && after && args[0] == "args", $"expected true subcmd true [args] got {before} {cmd} {after} {string.Join(',', args)}"); }
public void TestEverything() { Flag.Bool("test_bool", false, "bool value"); Flag.Int("test_int", 0, "int value"); Flag.Int64("test_int64", 0, "int64 value"); Flag.Uint("test_uint", 0, "uint value"); Flag.Uint64("test_uint64", 0, "uint64 value"); Flag.String("test_string", "0", "string value"); Flag.Float("test_float64", 0, "float64 value"); Flag.Duration("test_duration", TimeSpan.FromSeconds(0), "time.Duration value"); var desired = "0"; var m = new Dictionary <string, IFlag>(); var visitor = new Action <IFlag>(f => { if (f.Name.Length > 5 && f.Name.Substring(0, 5) == "test_") { m[f.Name] = f; var ok = false; if (f.ToString() == desired) { ok = true; } else if (f.Name == "test_bool" && f.ToString() == (desired == "1" ? "True" : "False")) { ok = true; } else if (f.Name == "test_duration" && f.ToString() == TimeSpan.Parse(desired == "1" ? "00:00:01" : "00:00:00").ToString()) { ok = true; } Assert.True(ok, $"Visit: bad value {f} for {f.Name}"); } }); Flag.VisitAll(visitor); Assert.True(8 == m.Count, "VisitAll misses some flags"); m = new Dictionary <string, IFlag>(); Flag.Visit(visitor); Assert.True(0 == m.Count, "Visit sees unset flags"); // Now set all flags Flag.Set("test_bool", "true"); Flag.Set("test_int", "1"); Flag.Set("test_int64", "1"); Flag.Set("test_uint", "1"); Flag.Set("test_uint64", "1"); Flag.Set("test_string", "1"); Flag.Set("test_float64", "1"); Flag.Set("test_duration", "00:00:01"); desired = "1"; Flag.Visit(visitor); Assert.True(8 == m.Count, "Visit fails after set"); // Now test they're visited in sort order. var flagNames = new List <string>(); Flag.Visit(f => { flagNames.Add(f.Name); }); var sorted = flagNames.ToArray(); Array.Sort(sorted); for (var i = 0; i < flagNames.Count; i++) { Assert.True(flagNames[i] == sorted[i], $"flag names not sorted: {string.Join(' ', flagNames)}"); } }
public void TestGet() { Flag.Bool("test_bool", true, "bool value"); Flag.Int("test_int", 1, "int value"); Flag.Int64("test_int64", 2, "int64 value"); Flag.Uint("test_uint", 3, "uint value"); Flag.Uint64("test_uint64", 4, "uint64 value"); Flag.String("test_string", "5", "string value"); Flag.Float("test_float64", 6, "float64 value"); Flag.Duration("test_duration", TimeSpan.FromSeconds(7), "time.Duration value"); var visitor = new Action <IFlag>(f => { var ok = false; if (f.Name.Length > 5 && f.Name.Substring(0, 5) == "test_") { if (f.TrackedType == typeof(bool)) { var b = f as ValueFlag <bool>; ok = b; } else if (f.TrackedType == typeof(int)) { var b = f as ValueFlag <int>; ok = b == 1; } else if (f.TrackedType == typeof(long)) { var b = f as ValueFlag <long>; ok = b == 2; } else if (f.TrackedType == typeof(uint)) { var b = f as ValueFlag <uint>; ok = b == 3; } else if (f.TrackedType == typeof(ulong)) { var b = f as ValueFlag <ulong>; ok = b == 4; } else if (f.TrackedType == typeof(string)) { var b = f as ValueFlag <string>; ok = b == "5"; } else if (f.TrackedType == typeof(float)) { var b = f as ValueFlag <float>; ok = b == 6; } else if (f.TrackedType == typeof(TimeSpan)) { var b = f as ValueFlag <TimeSpan>; ok = b == TimeSpan.FromSeconds(7); } Assert.True(ok, $"Visit: bad value {f.TrackedType.Name}({f}) for {f.Name}"); } }); Flag.VisitAll(visitor); }