Skip to content

Commit 2b605a8

Browse files
committed
Adding test
1 parent 999a532 commit 2b605a8

File tree

4 files changed

+94
-22
lines changed

4 files changed

+94
-22
lines changed

src/url.zig

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,34 @@ const Values = @import("values.zig").Values;
99

1010
pub const URL = @This();
1111

12-
allocator: std.mem.Allocator = std.heap.page_allocator,
12+
allocator: std.mem.Allocator,
13+
1314
uri: Uri = undefined,
1415
scheme: ?[]const u8 = undefined,
1516
host: ?[]const u8 = undefined,
1617
path: []const u8 = "/",
1718
fragment: ?[]const u8 = undefined,
1819
query: ?[]const u8 = undefined,
1920

20-
// querymap: ?StringHashMap(std.ArrayList([]const u8)) = StringHashMap(std.ArrayList([]const u8)).init(std.heap.page_allocator),
21-
values: ?std.StringHashMap(std.ArrayList([]const u8)) = std.StringHashMap(std.ArrayList([]const u8)).init(std.heap.page_allocator),
21+
// querymap: ?StringHashMap(std.ArrayList([]const u8))
22+
values: ?std.StringHashMap(std.ArrayList([]const u8)) = undefined,
2223

2324
// https://developer.mozilla.org/en-US/docs/Learn/Common_questions/Web_mechanics/What_is_a_URL
2425

2526
pub fn init(self: URL) URL {
2627
return .{
2728
.allocator = self.allocator,
28-
// .querymap = self.querymap,
29+
.values = std.StringHashMap(std.ArrayList([]const u8)).init(self.allocator),
2930
};
3031
}
3132

33+
pub fn deinit(self: *URL) void {
34+
if (self.values != null) {
35+
self.values.?.deinit();
36+
}
37+
// self.allocator.destroy(self);
38+
}
39+
3240
const SliceReader = struct {
3341
const Self = @This();
3442

@@ -93,7 +101,9 @@ fn uriToUrl(self: *URL, uri: Uri) void {
93101

94102
if (uri.query != null) {
95103
self.query = @constCast(uri.query.?.percent_encoded);
96-
try parseQuery(&self.values.?, @constCast(uri.query.?.percent_encoded));
104+
if (self.values != null) {
105+
try parseQuery(&self.values.?, @constCast(uri.query.?.percent_encoded));
106+
}
97107
}
98108
if (uri.fragment != null) {
99109
self.fragment = @constCast(uri.fragment.?.percent_encoded);
@@ -108,6 +118,8 @@ pub fn parseUri(self: *URL, text: []const u8) ParseError!*URL {
108118
}
109119

110120
pub fn parseQuery(map: *std.StringHashMap(std.ArrayList([]const u8)), uri_query: []const u8) !void {
121+
const allocator = std.heap.page_allocator;
122+
111123
var queryitmes = std.mem.splitSequence(u8, uri_query, "&");
112124
while (true) {
113125
const pair = queryitmes.next();
@@ -131,7 +143,7 @@ pub fn parseQuery(map: *std.StringHashMap(std.ArrayList([]const u8)), uri_query:
131143
var al: std.ArrayList([]const u8) = undefined;
132144
const v = map.get(key.?);
133145
if (v == null) {
134-
al = std.ArrayList([]const u8).init(std.heap.page_allocator);
146+
al = std.ArrayList([]const u8).init(allocator);
135147
al.append(value.?) catch continue;
136148
map.put(key.?, al) catch continue;
137149
continue;

src/url_test.zig

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@ const StringHashMap = @import("std").StringHashMap;
77
const URL = @import("url.zig");
88

99
test "parseUri 1" {
10-
var url = URL.init(.{});
10+
var url = URL.init(.{ .allocator = std.testing.allocator });
11+
1112
const text = "http://example.com/path?query=1&query2=2";
1213
const result = url.parseUri(text) catch return;
14+
// defer result.deinit();
15+
1316
try testing.expectEqualStrings("http", result.scheme.?);
1417
try testing.expectEqualStrings(
1518
"example.com",
@@ -45,7 +48,7 @@ test "parseUri 1" {
4548
}
4649
test "parseUri 2" {
4750
const text = "foo://example.com:8042/over/there?name=ferret#nose";
48-
var url = URL.init(.{});
51+
var url = URL.init(.{ .allocator = std.testing.allocator });
4952
const result = url.parseUri(text) catch return;
5053
try testing.expectEqualStrings("foo", result.scheme.?);
5154
try testing.expectEqualStrings(
@@ -73,16 +76,19 @@ test "url target" {
7376

7477
test "url parse" {
7578
const text = "/path?query=1&query2=2";
76-
var url = URL.init(.{});
77-
const result = url.parseUrl(text) catch return;
79+
80+
var url = URL.init(.{ .allocator = std.testing.allocator });
81+
defer url.deinit();
82+
83+
const result = try url.parseUrl(text);
7884
try testing.expectEqualStrings("/path", result.path);
7985
try testing.expectEqualStrings("query=1&query2=2", result.query.?);
8086
}
8187

8288
test "RFC example 1" {
8389
const text = "/over/there?name=ferret#nose";
84-
var url = URL.init(.{});
85-
const result = url.parseUrl(text) catch return;
90+
var url = URL.init(.{ .allocator = std.testing.allocator });
91+
const result = try url.parseUrl(text);
8692
try testing.expectEqualStrings("/over/there", result.path);
8793
try testing.expectEqualStrings("name=ferret", @constCast(result.query.?));
8894
try testing.expectEqualStrings("nose", result.fragment.?);

src/values.zig

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
// const std = @import("std");
2-
// const StringArrayHashMap = std.StringArrayHashMap;
3-
// const ArrayList = std.ArrayList;
4-
// const allocator = std.heap.page_allocator;
1+
const std = @import("std");
2+
const StringArrayHashMap = std.StringArrayHashMap;
3+
const ArrayList = std.ArrayList;
54

65
// pub fn has(list: ArrayList([]const u8), value: []const u8) bool {
76
// for (list.items) |item| {
@@ -11,3 +10,30 @@
1110
// }
1211
// return false;
1312
// }
13+
14+
pub fn encode(allocator: std.mem.Allocator, values: std.StringHashMap(ArrayList([]const u8))) anyerror![]const u8 {
15+
// name=Ava&friend=Jess&friend=Sarah&friend=Zoe
16+
// var result: []const u8 = undefined;
17+
var it = values.iterator();
18+
while (it.next()) |entry| {
19+
20+
// if (result.len > 0) {
21+
// }
22+
23+
// result = try std.mem.join(allocator, "&", result);
24+
25+
const key: []const u8 = entry.key_ptr.*;
26+
const value: ArrayList([]const u8) = entry.value_ptr.*;
27+
28+
const keypair = try std.fmt.allocPrint(allocator, "{s}=", .{key});
29+
defer allocator.free(keypair);
30+
31+
for (value.items) |item| {
32+
const valuepair = try std.fmt.allocPrint(allocator, "{s}", .{item});
33+
defer allocator.free(valuepair);
34+
}
35+
// result = keypair;
36+
}
37+
38+
return "";
39+
}

src/values_test.zig

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
const std = @import("std");
2+
const testing = std.testing;
3+
const allocator = testing.allocator;
4+
25
const URL = @import("url.zig");
6+
const Values = @import("values.zig");
37

48
test "sample1" {
5-
var values: std.StringHashMap(std.ArrayList([]const u8)) = std.StringHashMap(std.ArrayList([]const u8)).init(std.testing.allocator);
9+
var values: std.StringHashMap(std.ArrayList([]const u8)) = std.StringHashMap(std.ArrayList([]const u8)).init(allocator);
610
defer values.deinit();
7-
var name = std.ArrayList([]const u8).init(std.testing.allocator);
11+
var name = std.ArrayList([]const u8).init(allocator);
812
defer name.deinit();
913
try name.append("Ava");
1014

11-
var friend = std.ArrayList([]const u8).init(std.testing.allocator);
15+
var friend = std.ArrayList([]const u8).init(allocator);
1216
defer friend.deinit();
1317
try friend.append("Jess");
1418
try friend.append("Sarah");
@@ -31,7 +35,7 @@ test "sample1" {
3135

3236
test "sample2" {
3337
const text = "name=Ava&friend=Jess&friend=Sarah&friend=Zoe";
34-
var values: std.StringHashMap(std.ArrayList([]const u8)) = std.StringHashMap(std.ArrayList([]const u8)).init(std.testing.allocator);
38+
var values: std.StringHashMap(std.ArrayList([]const u8)) = std.StringHashMap(std.ArrayList([]const u8)).init(allocator);
3539
defer values.deinit();
3640
try URL.parseQuery(&values, text);
3741
try std.testing.expectEqualStrings("Ava", values.get("name").?.items[0]);
@@ -42,10 +46,11 @@ test "sample2" {
4246

4347
test "sample3" {
4448
const text = "https://example.org/?a=1&a=2&b=&=3&&&&";
45-
var url = URL.init(.{});
49+
var url = URL.init(.{ .allocator = std.testing.allocator });
4650
const result = try url.parseUri(text);
4751

48-
const values = result.values.?;
52+
var values = result.values.?;
53+
defer values.deinit();
4954

5055
const a1 = values.get("a").?.items[0];
5156
const a2 = values.get("a").?.items[1];
@@ -58,3 +63,26 @@ test "sample3" {
5863
try std.testing.expectEqual(1, v3.items.len);
5964
try std.testing.expectEqualStrings("3", v3.items[0]);
6065
}
66+
67+
test "encode" {
68+
var name = std.ArrayList([]const u8).init(allocator);
69+
defer name.deinit();
70+
try name.append("Ava");
71+
72+
var friend = std.ArrayList([]const u8).init(allocator);
73+
defer friend.deinit();
74+
try friend.append("Jess");
75+
try friend.append("Sarah");
76+
try friend.append("Zoe");
77+
78+
var values: std.StringHashMap(std.ArrayList([]const u8)) = std.StringHashMap(std.ArrayList([]const u8)).init(allocator);
79+
defer values.deinit();
80+
81+
try values.put("name", name);
82+
try values.put("friend", friend);
83+
const url_values = try Values.encode(allocator, values);
84+
defer allocator.free(url_values);
85+
// const expected = "name=Ava&friend=Jess&friend=Sarah&friend=Zoe";
86+
// std.debug.print("url_values: {s}\n", .{url_values});
87+
// try testing.expectEqualStrings(expected, url_values);
88+
}

0 commit comments

Comments
 (0)