Bläddra i källkod

Adjust tests, better quote object

Sam Jaffe 4 år sedan
förälder
incheckning
d82dfc89f9
3 ändrade filer med 15 tillägg och 11 borttagningar
  1. 6 2
      include/string_utils/tokenizer.h
  2. 2 2
      src/tokenizer.cxx
  3. 7 7
      test/tokenizer_test.cxx

+ 6 - 2
include/string_utils/tokenizer.h

@@ -16,16 +16,20 @@ namespace string_utils {
 class tokenizer {
 public:
   static constexpr size_t const infinite_outputs{~size_t(0)};
+  struct quote {
+    char on;
+    std::string escaped;
+  };
 private:
   std::string divider_;
-  std::string quotes_;
+  quote quote_;
   size_t max_outputs_{infinite_outputs};
   bool truncate_{false};
   bool ignore_empty_tokens_{true};
   bool escapable_{false};
 
 public:
-  tokenizer(std::string divider, std::string quotes = "");
+  tokenizer(std::string divider, struct quote quote = {'\0', ""});
     
   tokenizer &max_outputs(size_t new_max_outputs);
   tokenizer &truncate(bool new_truncate_overage);

+ 2 - 2
src/tokenizer.cxx

@@ -10,8 +10,8 @@
 
 namespace string_utils {
 
-tokenizer::tokenizer(std::string divider, std::string quotes)
-  : divider_(std::move(divider)), quotes_(std::move(quotes)) {}
+tokenizer::tokenizer(std::string divider, struct quote quote)
+  : divider_(std::move(divider)), quote_(std::move(quote)) {}
 
 tokenizer &tokenizer::max_outputs(size_t new_max_outputs) {
   max_outputs_ = new_max_outputs;

+ 7 - 7
test/tokenizer_test.cxx

@@ -78,23 +78,23 @@ TEST(TokenizerTest, CorrectlySplitsWhenEvenEscapes) {
 TEST(TokenizerTest, QuotesAreDiscarded) {
   std::string const input = R"(A,"B",C)";
   std::vector<std::string> const expected{"A", "B", "C"};
-  EXPECT_THAT(tokenizer(",", "\"")(input), expected);
+  EXPECT_THAT(tokenizer(",", {'"'})(input), expected);
 }
 
 TEST(TokenizerTest, QuotedTokensStickTogether) {
   std::string const input = R"(A,"B,C")";
   std::vector<std::string> const expected{"A", "B,C"};
-  EXPECT_THAT(tokenizer(",", "\"")(input), expected);
+  EXPECT_THAT(tokenizer(",", {'"'})(input), expected);
 }
 
-TEST(TokenizerTest, QuotedTokensAreAlwaysEscapable) {
+TEST(TokenizerTest, QuotedTokensAreEscapable) {
   std::string const input = R"(A,"B\",C")";
   std::vector<std::string> const expected{"A", "B\",C"};
-  EXPECT_THAT(tokenizer(",", "\"")(input), expected);
+  EXPECT_THAT(tokenizer(",", {'"', "\\\""})(input), expected);
 }
 
-TEST(TokenizerTest, QuotedTokensDontApplyOutOfFirstChar) {
+TEST(TokenizerTest, QuotesDontNeedToBeAtStartAndEnd) {
   std::string const input = R"(A,B",C")";
-  std::vector<std::string> const expected{"A", "B\"", "C\""};
-  EXPECT_THAT(tokenizer(",", "\"")(input), expected);
+  std::vector<std::string> const expected{"A", "B,C"};
+  EXPECT_THAT(tokenizer(",", {'"', "\\\""})(input), expected);
 }