blob: 5eb38f1610c536d5bae4e478119b780d351fa8f9 [file] [log] [blame]
// Copyright 2014 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 "crazy_linker_util.h"
#include <gtest/gtest.h>
#include <utility>
namespace crazy {
TEST(GetBaseNamePtr, Test) {
const char kString[] = "/tmp/foo";
EXPECT_EQ(kString + 5, GetBaseNamePtr(kString));
}
TEST(String, Empty) {
String s;
EXPECT_TRUE(s.IsEmpty());
EXPECT_EQ(0u, s.size());
EXPECT_EQ('\0', s.c_str()[0]);
}
TEST(String, CStringConstructor) {
String s("Simple");
EXPECT_STREQ("Simple", s.c_str());
EXPECT_EQ(6U, s.size());
}
TEST(String, CStringConstructorWithLength) {
String s2("Simple", 3);
EXPECT_STREQ("Sim", s2.c_str());
EXPECT_EQ(3U, s2.size());
}
TEST(String, CopyConstructor) {
String s1("Simple");
String s2(s1);
EXPECT_EQ(6U, s2.size());
EXPECT_STREQ(s2.c_str(), s1.c_str());
}
TEST(String, MoveConstructor) {
String s1("Source");
String s2(std::move(s1));
EXPECT_TRUE(s1.IsEmpty());
EXPECT_EQ(6U, s2.size());
EXPECT_STREQ(s2.c_str(), "Source");
}
TEST(String, CharConstructor) {
String s('H');
EXPECT_EQ(1U, s.size());
EXPECT_STREQ("H", s.c_str());
}
TEST(String, CopyAssign) {
String s1("Source");
String s2("Destination");
s1 = s2;
EXPECT_STREQ(s1.c_str(), s2.c_str());
}
TEST(String, MoveAssign) {
String s1("Source");
String s2("Destination");
s2 = std::move(s1);
EXPECT_TRUE(s1.IsEmpty());
EXPECT_STREQ("Source", s2.c_str());
}
TEST(String, AppendCString) {
String s("Foo");
s += "Bar";
EXPECT_STREQ("FooBar", s.c_str());
s += "Zoo";
EXPECT_STREQ("FooBarZoo", s.c_str());
}
TEST(String, AppendOther) {
String s("Foo");
String s2("Bar");
s += s2;
EXPECT_STREQ("FooBar", s.c_str());
}
TEST(String, ArrayAccess) {
String s("FooBar");
EXPECT_EQ('F', s[0]);
EXPECT_EQ('o', s[1]);
EXPECT_EQ('o', s[2]);
EXPECT_EQ('B', s[3]);
EXPECT_EQ('a', s[4]);
EXPECT_EQ('r', s[5]);
EXPECT_EQ('\0', s[6]);
}
TEST(String, EqualityOperators) {
String a("Foo");
String b("Bar");
EXPECT_TRUE(a == String("Foo"));
EXPECT_TRUE(a == "Foo");
EXPECT_TRUE(b != String("Foo"));
EXPECT_TRUE(b != "Foo");
EXPECT_TRUE(a != b);
EXPECT_TRUE(b == String("Bar"));
EXPECT_TRUE(b == "Bar");
EXPECT_FALSE(a == "Foo ");
EXPECT_FALSE(b == " Bar");
EXPECT_FALSE(a == "foo");
EXPECT_TRUE(a != "Foo ");
EXPECT_TRUE(b != " Bar");
EXPECT_TRUE(a != "foo");
}
TEST(String, Resize) {
String s("A very long string to have fun");
s.Resize(10);
EXPECT_EQ(10U, s.size());
EXPECT_STREQ("A very lon", s.c_str());
}
TEST(String, ResizeToZero) {
String s("Long string to force a dynamic allocation");
s.Resize(0);
EXPECT_EQ(0U, s.size());
EXPECT_STREQ("", s.c_str());
}
TEST(Vector, IsEmpty) {
Vector<void*> v;
EXPECT_TRUE(v.IsEmpty());
}
TEST(Vector, PushBack) {
Vector<int> v;
v.PushBack(12345);
EXPECT_FALSE(v.IsEmpty());
EXPECT_EQ(1U, v.GetCount());
EXPECT_EQ(12345, v[0]);
}
TEST(Vector, PushBack2) {
const int kMaxCount = 500;
Vector<int> v;
for (int n = 0; n < kMaxCount; ++n)
v.PushBack(n * 100);
EXPECT_FALSE(v.IsEmpty());
EXPECT_EQ(static_cast<size_t>(kMaxCount), v.GetCount());
}
TEST(Vector, MoveConstructor) {
const int kMaxCount = 500;
Vector<int> v1;
for (int n = 0; n < kMaxCount; ++n)
v1.PushBack(n * 100);
Vector<int> v2(std::move(v1));
EXPECT_TRUE(v1.IsEmpty());
EXPECT_FALSE(v2.IsEmpty());
EXPECT_EQ(static_cast<size_t>(kMaxCount), v2.GetCount());
for (int n = 0; n < kMaxCount; ++n) {
EXPECT_EQ(n * 100, v2[n]) << "Checking v[" << n << "]";
}
}
TEST(Vector, MoveAssign) {
const int kMaxCount = 500;
Vector<int> v1;
for (int n = 0; n < kMaxCount; ++n)
v1.PushBack(n * 100);
Vector<int> v2;
v2 = std::move(v1);
EXPECT_TRUE(v1.IsEmpty());
EXPECT_FALSE(v2.IsEmpty());
EXPECT_EQ(static_cast<size_t>(kMaxCount), v2.GetCount());
for (int n = 0; n < kMaxCount; ++n) {
EXPECT_EQ(n * 100, v2[n]) << "Checking v[" << n << "]";
}
}
TEST(Vector, At) {
const int kMaxCount = 500;
Vector<int> v;
for (int n = 0; n < kMaxCount; ++n)
v.PushBack(n * 100);
for (int n = 0; n < kMaxCount; ++n) {
EXPECT_EQ(n * 100, v[n]) << "Checking v[" << n << "]";
}
}
TEST(Vector, Find) {
const int kMaxCount = 500;
Vector<int> v;
for (int n = 0; n < kMaxCount; ++n)
v.PushBack(n * 100);
for (int n = 0; n < kMaxCount; ++n) {
SearchResult r = v.Find(n * 100);
EXPECT_TRUE(r.found) << "Looking for " << n * 100;
EXPECT_EQ(n, r.pos) << "Looking for " << n * 100;
}
}
TEST(Vector, ForRangeLoop) {
const int kMaxCount = 500;
Vector<int> v;
for (int n = 0; n < kMaxCount; ++n)
v.PushBack(n * 100);
int n = 0;
for (const int& value : v) {
EXPECT_EQ(n * 100, value) << "Checking v[" << n << "]";
n++;
}
}
TEST(Vector, InsertAt) {
const int kMaxCount = 500;
for (size_t k = 0; k < kMaxCount; ++k) {
Vector<int> v;
for (int n = 0; n < kMaxCount; ++n)
v.PushBack(n * 100);
v.InsertAt(k, -1000);
EXPECT_EQ(kMaxCount + 1, v.GetCount());
for (int n = 0; n < v.GetCount(); ++n) {
int expected;
if (n < k)
expected = n * 100;
else if (n == k)
expected = -1000;
else
expected = (n - 1) * 100;
EXPECT_EQ(expected, v[n]) << "Checking v[" << n << "]";
}
}
}
TEST(Vector, RemoveAt) {
const int kMaxCount = 500;
for (size_t k = 0; k < kMaxCount; ++k) {
Vector<int> v;
for (int n = 0; n < kMaxCount; ++n)
v.PushBack(n * 100);
v.RemoveAt(k);
EXPECT_EQ(kMaxCount - 1, v.GetCount());
for (int n = 0; n < kMaxCount - 1; ++n) {
int expected = (n < k) ? (n * 100) : ((n + 1) * 100);
EXPECT_EQ(expected, v[n]) << "Checking v[" << n << "]";
}
}
}
TEST(Vector, PopFirst) {
const int kMaxCount = 500;
Vector<int> v;
for (int n = 0; n < kMaxCount; ++n)
v.PushBack(n * 100);
for (int n = 0; n < kMaxCount; ++n) {
int first = v.PopFirst();
EXPECT_EQ(n * 100, first) << "Checking " << n << "-th PopFirst()";
EXPECT_EQ(kMaxCount - 1 - n, v.GetCount())
<< "Checking " << n << "-th PopFirst()";
}
EXPECT_EQ(0u, v.GetCount());
EXPECT_TRUE(v.IsEmpty());
}
} // namespace crazy