48224260创建于 2025年12月23日历史提交
#include <gtest/gtest.h>

#include <MICmdArgValString.h>

TEST(TestMICmdArgValString, HandlesQuotedStringWithAnySpecialContent) {
  for (uint8_t flags = 0; flags < 1 << 4; flags++) {
    CMICmdArgValString arg("arg", flags & 1, flags & 2, true, flags & 4,
                           flags & 8);

    CMICmdArgContext context("\"a/b\" \"i1\" \"10\" \"--option\"");

    EXPECT_TRUE(arg.Validate(context));
    EXPECT_EQ("a/b", arg.GetValue());

    EXPECT_TRUE(arg.Validate(context));
    EXPECT_EQ("i1", arg.GetValue());

    EXPECT_TRUE(arg.Validate(context));
    EXPECT_EQ("10", arg.GetValue());

    EXPECT_TRUE(arg.Validate(context));
    EXPECT_EQ("--option", arg.GetValue());
  }
}

TEST(TestMICmdArgValString, HandlesQuotedStringsWithQuotes) {
  CMICmdArgValString arg("arg", true, true, true, false, false);

  CMICmdArgContext context("\"a \"b\" c\"");
  EXPECT_TRUE(arg.Validate(context));
}

TEST(TestMICmdArgValString, HandlesEmbeddedQuotedStringsWithSlashes) {
  CMICmdArgValString arg("arg", true, true, true, false, false);

  CMICmdArgContext context("\"a \\\"b c\\\" d\"");
  EXPECT_TRUE(arg.Validate(context));
}

TEST(TestMICmdArgValString, DoesNotHandleSlashedQuotedStrings) {
  CMICmdArgValString arg("arg", true, true, true, false, false);

  CMICmdArgContext context("\\\"a\\\"");
  EXPECT_FALSE(arg.Validate(context));
}

TEST(TestMICmdArgValString, SkipsSpecialContentIfDoesNotHandleQuotes) {
  CMICmdArgValString arg("arg", true, true, false);

  CMICmdArgContext context("--option i1 10 a/b c");
  EXPECT_TRUE(arg.Validate(context));
  EXPECT_EQ("c", arg.GetValue());
}

TEST(TestMICmdArgValString, DoesNotSkipSpecialContentIfHandlesQuotes) {
  CMICmdArgValString arg("arg", true, true, true);

  CMICmdArgContext context("--option c");
  EXPECT_FALSE(arg.Validate(context));

  context = CMICmdArgContext("i1 c");
  EXPECT_FALSE(arg.Validate(context));

  context = CMICmdArgContext("10 c");
  EXPECT_FALSE(arg.Validate(context));

  context = CMICmdArgContext("a/b c");
  EXPECT_FALSE(arg.Validate(context));
}

TEST(TestMICmdArgValString, HandlesPathsIfNeeded) {
  CMICmdArgValString arg("arg", true, true, true, false, true);
  CMICmdArgContext context("a/b");
  EXPECT_TRUE(arg.Validate(context));
  EXPECT_EQ("a/b", arg.GetValue());

  arg = CMICmdArgValString("arg", true, true, true, false, false);
  context = CMICmdArgContext("a/b");
  EXPECT_FALSE(arg.Validate(context));
}

TEST(TestMICmdArgValString, HandlesNumbersIfNeeded) {
  CMICmdArgValString arg("arg", true, true, true, true, false);
  CMICmdArgContext context("10");
  EXPECT_TRUE(arg.Validate(context));
  EXPECT_EQ("10", arg.GetValue());

  arg = CMICmdArgValString("arg", true, true, true, false, false);
  context = CMICmdArgContext("10");
  EXPECT_FALSE(arg.Validate(context));
}