Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(858)

Unified Diff: mojo/edk/util/string_printf_unittest.cc

Issue 1486923002: EDK: Add mojo::util::StringPrintf() (etc.) and convert away from base's. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: there is no try Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mojo/edk/util/string_printf.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « mojo/edk/util/string_printf.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698