// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "net/third_party/quiche/src/http2/platform/api/http2_string_utils.h"

#include <cstdint>

#include "net/third_party/quiche/src/common/platform/api/quiche_str_cat.h"
#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h"
#include "net/third_party/quiche/src/common/platform/api/quiche_test.h"

namespace http2 {
namespace test {
namespace {

TEST(Http2StringUtilsTest, Http2StrAppend) {
  // No arguments on empty string.
  std::string output;
  Http2StrAppend(&output);
  EXPECT_TRUE(output.empty());

  // Single string-like argument.
  const char kFoo[] = "foo";
  const std::string string_foo(kFoo);
  const quiche::QuicheStringPiece stringpiece_foo(string_foo);
  Http2StrAppend(&output, kFoo);
  EXPECT_EQ("foo", output);
  Http2StrAppend(&output, string_foo);
  EXPECT_EQ("foofoo", output);
  Http2StrAppend(&output, stringpiece_foo);
  EXPECT_EQ("foofoofoo", output);

  // No arguments on non-empty string.
  Http2StrAppend(&output);
  EXPECT_EQ("foofoofoo", output);

  output.clear();

  // Two string-like arguments.
  const char kBar[] = "bar";
  const quiche::QuicheStringPiece stringpiece_bar(kBar);
  const std::string string_bar(kBar);
  Http2StrAppend(&output, kFoo, kBar);
  EXPECT_EQ("foobar", output);
  Http2StrAppend(&output, kFoo, string_bar);
  EXPECT_EQ("foobarfoobar", output);
  Http2StrAppend(&output, kFoo, stringpiece_bar);
  EXPECT_EQ("foobarfoobarfoobar", output);
  Http2StrAppend(&output, string_foo, kBar);
  EXPECT_EQ("foobarfoobarfoobarfoobar", output);

  output.clear();

  Http2StrAppend(&output, string_foo, string_bar);
  EXPECT_EQ("foobar", output);
  Http2StrAppend(&output, string_foo, stringpiece_bar);
  EXPECT_EQ("foobarfoobar", output);
  Http2StrAppend(&output, stringpiece_foo, kBar);
  EXPECT_EQ("foobarfoobarfoobar", output);
  Http2StrAppend(&output, stringpiece_foo, string_bar);
  EXPECT_EQ("foobarfoobarfoobarfoobar", output);

  output.clear();

  Http2StrAppend(&output, stringpiece_foo, stringpiece_bar);
  EXPECT_EQ("foobar", output);

  // Many-many arguments.
  Http2StrAppend(&output, "foo", "bar", "baz", "qux", "quux", "quuz", "corge",
                 "grault", "garply", "waldo", "fred", "plugh", "xyzzy", "thud");
  EXPECT_EQ(
      "foobarfoobarbazquxquuxquuzcorgegraultgarplywaldofredplughxyzzythud",
      output);

  output.clear();

  // Numerical arguments.
  const int16_t i = 1;
  const uint64_t u = 8;
  const double d = 3.1415;

  Http2StrAppend(&output, i, " ", u);
  EXPECT_EQ("1 8", output);
  Http2StrAppend(&output, d, i, i, u, i);
  EXPECT_EQ("1 83.14151181", output);
  Http2StrAppend(&output, "i: ", i, ", u: ", u, ", d: ", d);
  EXPECT_EQ("1 83.14151181i: 1, u: 8, d: 3.1415", output);

  output.clear();

  // Boolean arguments.
  const bool t = true;
  const bool f = false;

  Http2StrAppend(&output, t);
  EXPECT_EQ("1", output);
  Http2StrAppend(&output, f);
  EXPECT_EQ("10", output);
  Http2StrAppend(&output, f, t, t, f);
  EXPECT_EQ("100110", output);

  output.clear();

  // Mixed string-like, numerical, and Boolean arguments.
  Http2StrAppend(&output, kFoo, i, string_foo, f, u, t, stringpiece_bar, d, t);
  EXPECT_EQ("foo1foo081bar3.14151", output);
  Http2StrAppend(&output, d, t, t, string_bar, i, u, kBar, t, d, f);
  EXPECT_EQ("foo1foo081bar3.141513.141511bar18bar13.14150", output);
}

TEST(Http2StringUtilsTest, Http2StringPrintf) {
  EXPECT_EQ("", Http2StringPrintf("%s", ""));
  EXPECT_EQ("foobar", Http2StringPrintf("%sbar", "foo"));
  EXPECT_EQ("foobar", Http2StringPrintf("%s%s", "foo", "bar"));
  EXPECT_EQ("foo: 1, bar: 2.0",
            Http2StringPrintf("foo: %d, bar: %.1f", 1, 2.0));
}

}  // namespace
}  // namespace test
}  // namespace http2
