// Copyright 2016 The Fuchsia 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 "src/lib/fxl/strings/string_printf.h"

#include <errno.h>
#include <stdarg.h>

#include <string>

#include "gtest/gtest.h"

namespace fxl {
namespace {

// Note: |runnable| can't be a reference since that'd make the behavior of
// |va_start()| undefined.
template <typename Runnable>
std::string VAListHelper(Runnable runnable, ...) {
  va_list ap;
  va_start(ap, runnable);
  std::string rv = runnable(ap);
  va_end(ap);
  return rv;
}

TEST(StringPrintfTest, StringPrintf_Basic) {
  EXPECT_EQ("", StringPrintf(""));
  EXPECT_EQ("hello", StringPrintf("hello"));
  EXPECT_EQ("hello-123", StringPrintf("hello%d", -123));
  EXPECT_EQ("hello0123FACE", StringPrintf("%s%04d%X", "hello", 123, 0xfaceU));
}

TEST(StringPrintfTest, StringVPrintf_Basic) {
  EXPECT_EQ("", VAListHelper([](va_list ap) -> std::string {
              return StringVPrintf("", ap);
            }));
  EXPECT_EQ("hello", VAListHelper([](va_list ap) -> std::string {
              return StringVPrintf("hello", ap);
            }));
  EXPECT_EQ("hello-123", VAListHelper(
                             [](va_list ap) -> std::string {
                               return StringVPrintf("hello%d", ap);
                             },
                             -123));
  EXPECT_EQ("hello0123FACE", VAListHelper(
                                 [](va_list ap) -> std::string {
                                   return StringVPrintf("%s%04d%X", ap);
                                 },
                                 "hello", 123, 0xfaceU));
}

TEST(StringPrintfTest, StringAppendf_Basic) {
  {
    std::string s = "existing";
    StringAppendf(&s, "");
    EXPECT_EQ("existing", s);
  }
  {
    std::string s = "existing";
    StringAppendf(&s, "hello");
    EXPECT_EQ("existinghello", s);
  }
  {
    std::string s = "existing";
    StringAppendf(&s, "hello%d", -123);
    EXPECT_EQ("existinghello-123", s);
  }
  {
    std::string s = "existing";
    StringAppendf(&s, "%s%04d%X", "hello", 123, 0xfaceU);
    EXPECT_EQ("existinghello0123FACE", s);
  }
}

TEST(StringPrintfTest, StringVAppendf_Basic) {
  EXPECT_EQ("existing", VAListHelper([](va_list ap) -> std::string {
              std::string s = "existing";
              StringVAppendf(&s, "", ap);
              return s;
            }));
  EXPECT_EQ("existinghello", VAListHelper([](va_list ap) -> std::string {
              std::string s = "existing";
              StringVAppendf(&s, "hello", ap);
              return s;
            }));
  EXPECT_EQ("existinghello-123", VAListHelper(
                                     [](va_list ap) -> std::string {
                                       std::string s = "existing";
                                       StringVAppendf(&s, "hello%d", ap);
                                       return s;
                                     },
                                     -123));
  EXPECT_EQ("existinghello0123FACE", VAListHelper(
                                         [](va_list ap) -> std::string {
                                           std::string s = "existing";
                                           StringVAppendf(&s, "%s%04d%X", ap);
                                           return s;
                                         },
                                         "hello", 123, 0xfaceU));
}

// Generally, we assume that everything forwards to |StringVAppendf()|, so
// testing |StringPrintf()| more carefully suffices.

TEST(StringPrintfTest, StringPrintf_Boundary) {
  // Note: The size of strings generated should cover the boundary cases in the
  // constant |kStackBufferSize| in |StringVAppendf()|.
  for (size_t i = 800; i < 1200; i++) {
    std::string stuff(i, 'x');
    std::string format = stuff + "%d" + "%s" + " world";
    EXPECT_EQ(stuff + "123" + "hello world",
              StringPrintf(format.c_str(), 123, "hello"))
        << i;
  }
}

TEST(StringPrintfTest, StringPrintf_VeryBig) {
  // 4 megabytes of exes (we'll generate 5 times this).
  std::string stuff(4u << 20u, 'x');
  std::string format = "%s" + stuff + "%s" + stuff + "%s";
  EXPECT_EQ(stuff + stuff + stuff + stuff + stuff,
            StringPrintf(format.c_str(), stuff.c_str(), stuff.c_str(),
                         stuff.c_str()));
}

}  // namespace
}  // namespace fxl
