Skip to content

Commit 9ce0b13

Browse files
authored
Merge pull request #42 from tareifz/testing-allocator
using std.testing.allocator and fix memory leak in replace()
2 parents c9f298a + f97ccc4 commit 9ce0b13

File tree

2 files changed

+23
-43
lines changed

2 files changed

+23
-43
lines changed

zig-string-tests.zig

Lines changed: 22 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
const std = @import("std");
2-
const ArenaAllocator = std.heap.ArenaAllocator;
32
const expect = std.testing.expect;
43
const expectEqual = std.testing.expectEqual;
54
const expectEqualStrings = std.testing.expectEqualStrings;
@@ -8,12 +7,8 @@ const zig_string = @import("./zig-string.zig");
87
const String = zig_string.String;
98

109
test "Basic Usage" {
11-
// Use your favorite allocator
12-
var arena = ArenaAllocator.init(std.heap.page_allocator);
13-
defer arena.deinit();
14-
1510
// Create your String
16-
var myString = String.init(arena.allocator());
11+
var myString = String.init(std.testing.allocator);
1712
defer myString.deinit();
1813

1914
// Use functions provided
@@ -26,13 +21,8 @@ test "Basic Usage" {
2621
}
2722

2823
test "String Tests" {
29-
// Allocator for the String
30-
const page_allocator = std.heap.page_allocator;
31-
var arena = std.heap.ArenaAllocator.init(page_allocator);
32-
defer arena.deinit();
33-
3424
// This is how we create the String
35-
var myStr = String.init(arena.allocator());
25+
var myStr = String.init(std.testing.allocator);
3626
defer myStr.deinit();
3727

3828
// allocate & capacity
@@ -123,15 +113,16 @@ test "String Tests" {
123113
try expectEqualStrings(myStr.split("💯", 5).?, "Hello");
124114
try expectEqualStrings(myStr.split("💯", 6).?, "");
125115

126-
var splitStr = String.init(arena.allocator());
116+
var splitStr = String.init(std.testing.allocator);
127117
defer splitStr.deinit();
128118

129119
try splitStr.concat("variable='value'");
130120
try expectEqualStrings(splitStr.split("=", 0).?, "variable");
131121
try expectEqualStrings(splitStr.split("=", 1).?, "'value'");
132122

133123
// splitAll
134-
const splitAllStr = try String.init_with_contents(arena.allocator(), "THIS IS A TEST");
124+
var splitAllStr = try String.init_with_contents(std.testing.allocator, "THIS IS A TEST");
125+
defer splitAllStr.deinit();
135126
const splitAllSlices = try splitAllStr.splitAll(" ");
136127

137128
try expectEqual(splitAllSlices.len, 5);
@@ -149,7 +140,10 @@ test "String Tests" {
149140
try expectEqualStrings(newSplit.?.str(), "variable");
150141

151142
// splitAllToStrings
152-
const splitAllStrings = try splitAllStr.splitAllToStrings(" ");
143+
var splitAllStrings = try splitAllStr.splitAllToStrings(" ");
144+
defer for (splitAllStrings) |*str| {
145+
str.deinit();
146+
};
153147

154148
try expectEqual(splitAllStrings.len, 5);
155149
try expectEqualStrings(splitAllStrings[0].str(), "THIS");
@@ -161,8 +155,12 @@ test "String Tests" {
161155
// lines
162156
const lineSlice = "Line0\r\nLine1\nLine2";
163157

164-
var lineStr = try String.init_with_contents(arena.allocator(), lineSlice);
158+
var lineStr = try String.init_with_contents(std.testing.allocator, lineSlice);
159+
defer lineStr.deinit();
165160
var linesSlice = try lineStr.lines();
161+
defer for (linesSlice) |*str| {
162+
str.deinit();
163+
};
166164

167165
try expectEqual(linesSlice.len, 3);
168166
try expect(linesSlice[0].cmp("Line0"));
@@ -193,7 +191,7 @@ test "String Tests" {
193191
// owned
194192
const mySlice = try myStr.toOwned();
195193
try expectEqualStrings(mySlice.?, "This is a Test!");
196-
arena.allocator().free(mySlice.?);
194+
std.testing.allocator.free(mySlice.?);
197195

198196
// StringIterator
199197
var i: usize = 0;
@@ -217,23 +215,16 @@ test "String Tests" {
217215
}
218216

219217
test "init with contents" {
220-
// Allocator for the String
221-
const page_allocator = std.heap.page_allocator;
222-
var arena = std.heap.ArenaAllocator.init(page_allocator);
223-
defer arena.deinit();
224-
225218
const initial_contents = "String with initial contents!";
226219

227220
// This is how we create the String with contents at the start
228-
var myStr = try String.init_with_contents(arena.allocator(), initial_contents);
221+
var myStr = try String.init_with_contents(std.testing.allocator, initial_contents);
222+
defer myStr.deinit();
229223
try expectEqualStrings(myStr.str(), initial_contents);
230224
}
231225

232226
test "startsWith Tests" {
233-
var arena = ArenaAllocator.init(std.heap.page_allocator);
234-
defer arena.deinit();
235-
236-
var myString = String.init(arena.allocator());
227+
var myString = String.init(std.testing.allocator);
237228
defer myString.deinit();
238229

239230
try myString.concat("bananas");
@@ -242,10 +233,7 @@ test "startsWith Tests" {
242233
}
243234

244235
test "endsWith Tests" {
245-
var arena = ArenaAllocator.init(std.heap.page_allocator);
246-
defer arena.deinit();
247-
248-
var myString = String.init(arena.allocator());
236+
var myString = String.init(std.testing.allocator);
249237
defer myString.deinit();
250238

251239
try myString.concat("asbananas");
@@ -259,11 +247,8 @@ test "endsWith Tests" {
259247
}
260248

261249
test "replace Tests" {
262-
var arena = ArenaAllocator.init(std.heap.page_allocator);
263-
defer arena.deinit();
264-
265250
// Create your String
266-
var myString = String.init(arena.allocator());
251+
var myString = String.init(std.testing.allocator);
267252
defer myString.deinit();
268253

269254
try myString.concat("hi,how are you");
@@ -281,20 +266,14 @@ test "replace Tests" {
281266
}
282267

283268
test "rfind Tests" {
284-
var arena = ArenaAllocator.init(std.heap.page_allocator);
285-
defer arena.deinit();
286-
287-
var myString = try String.init_with_contents(arena.allocator(), "💯hi💯💯hi💯💯hi💯");
269+
var myString = try String.init_with_contents(std.testing.allocator, "💯hi💯💯hi💯💯hi💯");
288270
defer myString.deinit();
289271

290272
try expectEqual(myString.rfind("hi"), 9);
291273
}
292274

293275
test "toCapitalized Tests" {
294-
var arena = ArenaAllocator.init(std.heap.page_allocator);
295-
defer arena.deinit();
296-
297-
var myString = try String.init_with_contents(arena.allocator(), "love and be loved");
276+
var myString = try String.init_with_contents(std.testing.allocator, "love and be loved");
298277
defer myString.deinit();
299278

300279
myString.toCapitalized();

zig-string.zig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,7 @@ pub const String = struct {
594594
if (self.buffer) |buffer| {
595595
const InputSize = self.size;
596596
const size = std.mem.replacementSize(u8, buffer[0..InputSize], needle, replacement);
597+
defer self.allocator.free(buffer);
597598
self.buffer = self.allocator.alloc(u8, size) catch {
598599
return Error.OutOfMemory;
599600
};

0 commit comments

Comments
 (0)