| Index: mojo/edk/util/string_printf_unittest.cc
|
| diff --git a/mojo/edk/util/string_printf_unittest.cc b/mojo/edk/util/string_printf_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f9faea014b5fcdd6695b8875205e4d4e61c17570
|
| --- /dev/null
|
| +++ b/mojo/edk/util/string_printf_unittest.cc
|
| @@ -0,0 +1,124 @@
|
| +// Copyright 2015 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 "mojo/edk/util/string_printf.h"
|
| +
|
| +#include <errno.h>
|
| +#include <stdarg.h>
|
| +
|
| +#include <string>
|
| +
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace mojo {
|
| +namespace util {
|
| +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 util
|
| +} // namespace mojo
|
|
|