/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "base/stringprintf.h"

#include <gtest/gtest.h>

#include <string>

// The z size sepcifier isn't supported on Windows, so this test isn't useful.
#if !defined(_WIN32)
TEST(StringPrintfTest, HexSizeT) {
  size_t size = 0x00107e59;
  EXPECT_EQ("00107e59", android::base::StringPrintf("%08zx", size));
  EXPECT_EQ("0x00107e59", android::base::StringPrintf("0x%08zx", size));
}
#endif

TEST(StringPrintfTest, StringAppendF) {
  std::string s("a");
  android::base::StringAppendF(&s, "b");
  EXPECT_EQ("ab", s);
}

TEST(StringPrintfTest, Errno) {
  errno = 123;
  android::base::StringPrintf("hello %s", "world");
  EXPECT_EQ(123, errno);
}

void TestN(size_t n) {
  char* buf = new char[n + 1];
  memset(buf, 'x', n);
  buf[n] = '\0';
  std::string s(android::base::StringPrintf("%s", buf));
  EXPECT_EQ(buf, s);
  delete[] buf;
}

TEST(StringPrintfTest, At1023) {
  TestN(1023);
}

TEST(StringPrintfTest, At1024) {
  TestN(1024);
}

TEST(StringPrintfTest, At1025) {
  TestN(1025);
}
