@@ -881,3 +881,79 @@ TEST_F(format_parse_test, executable_name)
881
881
EXPECT_EQ (executable_name[0 ], " parser_test" );
882
882
EXPECT_EQ (executable_name[1 ], " build" );
883
883
}
884
+
885
+ TEST_F (format_parse_test, flag_independence)
886
+ {
887
+ bool flag_value{false };
888
+
889
+ auto parser = get_parser (" -a" , " -z" );
890
+ parser.add_flag (flag_value, sharg::config{.short_id = ' a' });
891
+ parser.add_flag (flag_value, sharg::config{.short_id = ' z' });
892
+ EXPECT_NO_THROW (parser.parse ());
893
+ EXPECT_EQ (flag_value, true );
894
+
895
+ flag_value = false ;
896
+
897
+ parser = get_parser (" -a" );
898
+ parser.add_flag (flag_value, sharg::config{.short_id = ' a' });
899
+ parser.add_flag (flag_value, sharg::config{.short_id = ' z' });
900
+ EXPECT_NO_THROW (parser.parse ());
901
+ EXPECT_EQ (flag_value, true );
902
+
903
+ flag_value = false ;
904
+
905
+ parser = get_parser (" -z" );
906
+ parser.add_flag (flag_value, sharg::config{.short_id = ' a' });
907
+ parser.add_flag (flag_value, sharg::config{.short_id = ' z' });
908
+ EXPECT_NO_THROW (parser.parse ());
909
+ EXPECT_EQ (flag_value, true );
910
+ }
911
+
912
+ TEST_F (format_parse_test, parse_order_example)
913
+ {
914
+ bool flag_value{false };
915
+
916
+ // Flags are evaluated after options
917
+ auto parser = get_parser (" -f" , " -o" , " false" );
918
+
919
+ EXPECT_NO_THROW (parser.add_option (flag_value, sharg::config{.short_id = ' o' }));
920
+ EXPECT_NO_THROW (parser.add_flag (flag_value, sharg::config{.short_id = ' f' }));
921
+ EXPECT_EQ (flag_value, false );
922
+ EXPECT_NO_THROW (parser.parse ());
923
+ EXPECT_EQ (flag_value, true ); // option sets to false, but flag sets to true
924
+
925
+ flag_value = false ;
926
+
927
+ // Because this option syntax is also allowed
928
+ parser = get_parser (" -otrue" );
929
+
930
+ EXPECT_NO_THROW (parser.add_option (flag_value, sharg::config{.short_id = ' o' }));
931
+ EXPECT_EQ (flag_value, false );
932
+ EXPECT_NO_THROW (parser.parse ());
933
+ EXPECT_EQ (flag_value, true );
934
+
935
+ flag_value = false ;
936
+
937
+ // And this flag syntax is allowed
938
+ parser = get_parser (" -otrue" );
939
+ std::array<bool , 5 > flag_values{false , false , false , false , false };
940
+
941
+ EXPECT_NO_THROW (parser.add_flag (flag_values[0 ], sharg::config{.short_id = ' o' }));
942
+ EXPECT_NO_THROW (parser.add_flag (flag_values[1 ], sharg::config{.short_id = ' t' }));
943
+ EXPECT_NO_THROW (parser.add_flag (flag_values[2 ], sharg::config{.short_id = ' r' }));
944
+ EXPECT_NO_THROW (parser.add_flag (flag_values[3 ], sharg::config{.short_id = ' u' }));
945
+ EXPECT_NO_THROW (parser.add_flag (flag_values[4 ], sharg::config{.short_id = ' e' }));
946
+ EXPECT_TRUE (std::ranges::none_of (flag_values, std::identity{})); // All false
947
+ EXPECT_NO_THROW (parser.parse ());
948
+ EXPECT_TRUE (std::ranges::all_of (flag_values, std::identity{})); // All true
949
+
950
+ // Positional options are evaluated last
951
+ parser = get_parser (" false" , " -o" , " true" , " -f" );
952
+
953
+ EXPECT_NO_THROW (parser.add_option (flag_value, sharg::config{.short_id = ' o' }));
954
+ EXPECT_NO_THROW (parser.add_flag (flag_value, sharg::config{.short_id = ' f' }));
955
+ EXPECT_NO_THROW (parser.add_positional_option (flag_value, sharg::config{}));
956
+ EXPECT_EQ (flag_value, false );
957
+ EXPECT_NO_THROW (parser.parse ());
958
+ EXPECT_EQ (flag_value, false );
959
+ }
0 commit comments