Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/xpcom/tests/gtest/TestMoveString.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
3
/* This Source Code Form is subject to the terms of the Mozilla Public
4
 * License, v. 2.0. If a copy of the MPL was not distributed with this
5
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#include <stdio.h>
8
#include <stdlib.h>
9
#include "nsASCIIMask.h"
10
#include "nsString.h"
11
#include "nsStringBuffer.h"
12
#include "nsReadableUtils.h"
13
#include "nsCRTGlue.h"
14
#include "mozilla/RefPtr.h"
15
#include "mozilla/Unused.h"
16
#include "gtest/gtest.h"
17
18
namespace TestMoveString {
19
20
0
#define NEW_VAL "**new value**"
21
0
#define OLD_VAL "old value"
22
23
typedef mozilla::detail::StringDataFlags Df;
24
25
void SetAsOwned(nsACString& aStr, const char* aValue)
26
0
{
27
0
  size_t len = strlen(aValue);
28
0
  char* data = new char[len + 1];
29
0
  memcpy(data, aValue, len + 1);
30
0
  aStr.Adopt(data, len);
31
0
  EXPECT_EQ(aStr.GetDataFlags(), Df::OWNED | Df::TERMINATED);
32
0
  EXPECT_STREQ(aStr.BeginReading(), aValue);
33
0
}
34
35
void ExpectTruncated(const nsACString& aStr)
36
0
{
37
0
  EXPECT_EQ(aStr.Length(), uint32_t(0));
38
0
  EXPECT_STREQ(aStr.BeginReading(), "");
39
0
  EXPECT_EQ(aStr.GetDataFlags(), Df::TERMINATED);
40
0
}
41
42
void ExpectNew(const nsACString& aStr)
43
0
{
44
0
  EXPECT_EQ(aStr.Length(), strlen(NEW_VAL));
45
0
  EXPECT_TRUE(aStr.EqualsASCII(NEW_VAL));
46
0
}
47
48
0
TEST(MoveString, SharedIntoOwned) {
49
0
  nsCString out;
50
0
  SetAsOwned(out, OLD_VAL);
51
0
  EXPECT_EQ(out.GetDataFlags(), Df::OWNED | Df::TERMINATED);
52
0
53
0
  nsCString in;
54
0
  in.Assign(NEW_VAL);
55
0
  EXPECT_EQ(in.GetDataFlags(), Df::REFCOUNTED | Df::TERMINATED);
56
0
  const char* data = in.get();
57
0
58
0
  out.Assign(std::move(in));
59
0
  ExpectTruncated(in);
60
0
  ExpectNew(out);
61
0
62
0
  EXPECT_EQ(out.GetDataFlags(), Df::REFCOUNTED | Df::TERMINATED);
63
0
  EXPECT_EQ(out.get(), data);
64
0
}
65
66
0
TEST(MoveString, OwnedIntoOwned) {
67
0
  nsCString out;
68
0
  SetAsOwned(out, OLD_VAL);
69
0
  EXPECT_EQ(out.GetDataFlags(), Df::OWNED | Df::TERMINATED);
70
0
71
0
  nsCString in;
72
0
  SetAsOwned(in, NEW_VAL);
73
0
  EXPECT_EQ(in.GetDataFlags(), Df::OWNED | Df::TERMINATED);
74
0
  const char* data = in.get();
75
0
76
0
  out.Assign(std::move(in));
77
0
  ExpectTruncated(in);
78
0
  ExpectNew(out);
79
0
80
0
  EXPECT_EQ(out.GetDataFlags(), Df::OWNED | Df::TERMINATED);
81
0
  EXPECT_EQ(out.get(), data);
82
0
}
83
84
0
TEST(MoveString, LiteralIntoOwned) {
85
0
  nsCString out;
86
0
  SetAsOwned(out, OLD_VAL);
87
0
  EXPECT_EQ(out.GetDataFlags(), Df::OWNED | Df::TERMINATED);
88
0
89
0
  nsCString in;
90
0
  in.AssignLiteral(NEW_VAL);
91
0
  EXPECT_EQ(in.GetDataFlags(), Df::LITERAL | Df::TERMINATED);
92
0
  const char* data = in.get();
93
0
94
0
  out.Assign(std::move(in));
95
0
  ExpectTruncated(in);
96
0
  ExpectNew(out);
97
0
98
0
  EXPECT_EQ(out.GetDataFlags(), Df::LITERAL | Df::TERMINATED);
99
0
  EXPECT_EQ(out.get(), data);
100
0
}
101
102
0
TEST(MoveString, AutoIntoOwned) {
103
0
  nsCString out;
104
0
  SetAsOwned(out, OLD_VAL);
105
0
  EXPECT_EQ(out.GetDataFlags(), Df::OWNED | Df::TERMINATED);
106
0
107
0
  nsAutoCString in;
108
0
  in.Assign(NEW_VAL);
109
0
  EXPECT_EQ(in.GetDataFlags(), Df::INLINE | Df::TERMINATED);
110
0
  const char* data = in.get();
111
0
112
0
  out.Assign(std::move(in));
113
0
  ExpectTruncated(in);
114
0
  ExpectNew(out);
115
0
116
0
  EXPECT_EQ(out.GetDataFlags(), Df::REFCOUNTED | Df::TERMINATED);
117
0
  EXPECT_NE(out.get(), data);
118
0
}
119
120
0
TEST(MoveString, DepIntoOwned) {
121
0
  nsCString out;
122
0
  SetAsOwned(out, OLD_VAL);
123
0
  EXPECT_EQ(out.GetDataFlags(), Df::OWNED | Df::TERMINATED);
124
0
125
0
  nsDependentCSubstring in(NEW_VAL "garbage after", strlen(NEW_VAL));
126
0
  EXPECT_EQ(in.GetDataFlags(), Df(0));
127
0
128
0
  out.Assign(std::move(in));
129
0
  ExpectTruncated(in);
130
0
  ExpectNew(out);
131
0
132
0
  EXPECT_EQ(out.GetDataFlags(), Df::REFCOUNTED | Df::TERMINATED);
133
0
}
134
135
0
TEST(MoveString, VoidIntoOwned) {
136
0
  nsCString out;
137
0
  SetAsOwned(out, OLD_VAL);
138
0
  EXPECT_EQ(out.GetDataFlags(), Df::OWNED | Df::TERMINATED);
139
0
140
0
  nsCString in = VoidCString();
141
0
  EXPECT_EQ(in.GetDataFlags(), Df::VOIDED | Df::TERMINATED);
142
0
143
0
  out.Assign(std::move(in));
144
0
  ExpectTruncated(in);
145
0
146
0
  EXPECT_EQ(out.Length(), 0u);
147
0
  EXPECT_STREQ(out.get(), "");
148
0
  EXPECT_EQ(out.GetDataFlags(), Df::VOIDED | Df::TERMINATED);
149
0
}
150
151
0
TEST(MoveString, SharedIntoAuto) {
152
0
  nsAutoCString out;
153
0
  out.Assign(OLD_VAL);
154
0
  EXPECT_EQ(out.GetDataFlags(), Df::INLINE | Df::TERMINATED);
155
0
156
0
  nsCString in;
157
0
  in.Assign(NEW_VAL);
158
0
  EXPECT_EQ(in.GetDataFlags(), Df::REFCOUNTED | Df::TERMINATED);
159
0
  const char* data = in.get();
160
0
161
0
  out.Assign(std::move(in));
162
0
  ExpectTruncated(in);
163
0
  ExpectNew(out);
164
0
165
0
  EXPECT_EQ(out.GetDataFlags(), Df::REFCOUNTED | Df::TERMINATED);
166
0
  EXPECT_EQ(out.get(), data);
167
0
}
168
169
0
TEST(MoveString, OwnedIntoAuto) {
170
0
  nsAutoCString out;
171
0
  out.Assign(OLD_VAL);
172
0
  EXPECT_EQ(out.GetDataFlags(), Df::INLINE | Df::TERMINATED);
173
0
174
0
  nsCString in;
175
0
  SetAsOwned(in, NEW_VAL);
176
0
  EXPECT_EQ(in.GetDataFlags(), Df::OWNED | Df::TERMINATED);
177
0
  const char* data = in.get();
178
0
179
0
  out.Assign(std::move(in));
180
0
  ExpectTruncated(in);
181
0
  ExpectNew(out);
182
0
183
0
  EXPECT_EQ(out.GetDataFlags(), Df::OWNED | Df::TERMINATED);
184
0
  EXPECT_EQ(out.get(), data);
185
0
}
186
187
0
TEST(MoveString, LiteralIntoAuto) {
188
0
  nsAutoCString out;
189
0
  out.Assign(OLD_VAL);
190
0
  EXPECT_EQ(out.GetDataFlags(), Df::INLINE | Df::TERMINATED);
191
0
192
0
  nsCString in;
193
0
  in.AssignLiteral(NEW_VAL);
194
0
  EXPECT_EQ(in.GetDataFlags(), Df::LITERAL | Df::TERMINATED);
195
0
  const char* data = in.get();
196
0
197
0
  out.Assign(std::move(in));
198
0
  ExpectTruncated(in);
199
0
  ExpectNew(out);
200
0
201
0
  EXPECT_EQ(out.GetDataFlags(), Df::LITERAL | Df::TERMINATED);
202
0
  EXPECT_EQ(out.get(), data);
203
0
}
204
205
0
TEST(MoveString, AutoIntoAuto) {
206
0
  nsAutoCString out;
207
0
  out.Assign(OLD_VAL);
208
0
  EXPECT_EQ(out.GetDataFlags(), Df::INLINE | Df::TERMINATED);
209
0
210
0
  nsAutoCString in;
211
0
  in.Assign(NEW_VAL);
212
0
  EXPECT_EQ(in.GetDataFlags(), Df::INLINE | Df::TERMINATED);
213
0
  const char* data = in.get();
214
0
215
0
  out.Assign(std::move(in));
216
0
  ExpectTruncated(in);
217
0
  ExpectNew(out);
218
0
219
0
  EXPECT_EQ(out.GetDataFlags(), Df::INLINE | Df::TERMINATED);
220
0
  EXPECT_NE(out.get(), data);
221
0
}
222
223
0
TEST(MoveString, DepIntoAuto) {
224
0
  nsAutoCString out;
225
0
  out.Assign(OLD_VAL);
226
0
  EXPECT_EQ(out.GetDataFlags(), Df::INLINE | Df::TERMINATED);
227
0
228
0
  nsDependentCSubstring in(NEW_VAL "garbage after", strlen(NEW_VAL));
229
0
  EXPECT_EQ(in.GetDataFlags(), Df(0));
230
0
231
0
  out.Assign(std::move(in));
232
0
  ExpectTruncated(in);
233
0
  ExpectNew(out);
234
0
235
0
  EXPECT_EQ(out.GetDataFlags(), Df::INLINE | Df::TERMINATED);
236
0
}
237
238
0
TEST(MoveString, VoidIntoAuto) {
239
0
  nsAutoCString out;
240
0
  out.Assign(OLD_VAL);
241
0
  EXPECT_EQ(out.GetDataFlags(), Df::INLINE | Df::TERMINATED);
242
0
243
0
  nsCString in = VoidCString();
244
0
  EXPECT_EQ(in.GetDataFlags(), Df::VOIDED | Df::TERMINATED);
245
0
246
0
  out.Assign(std::move(in));
247
0
  ExpectTruncated(in);
248
0
249
0
  EXPECT_EQ(out.Length(), 0u);
250
0
  EXPECT_STREQ(out.get(), "");
251
0
  EXPECT_EQ(out.GetDataFlags(), Df::VOIDED | Df::TERMINATED);
252
0
}
253
254
#undef NEW_VAL
255
#undef OLD_VAL
256
257
} // namespace TestStrings