Skip to content

Commit

Permalink
feat(hyperzig): add clear, getAllHyperedges, getAllVertices methods a…
Browse files Browse the repository at this point in the history
…nd tests
  • Loading branch information
yamafaktory committed Aug 28, 2024
1 parent 4ef764e commit 286334d
Showing 1 changed file with 55 additions and 8 deletions.
63 changes: 55 additions & 8 deletions src/hyperzig.zig
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,16 @@ pub fn HyperZig(comptime H: type, comptime V: type) type {
return hyperedge.data;
}

/// Get all the hyperedges.
pub fn getAllHyperedges(self: *Self) []Uuid {
return self.hyperedges.keys();
}

/// Get all the vertices.
pub fn getAllVertices(self: *Self) []Uuid {
return self.vertices.keys();
}

/// Update a hyperedge.
pub fn updateHyperedge(self: *Self, id: Uuid, hyperedge: H) HyperZigError!void {
try self.checkIfHyperedgeExists(id);
Expand Down Expand Up @@ -901,6 +911,12 @@ pub fn HyperZig(comptime H: type, comptime V: type) type {
assert(removed);
debug("hyperedge {} contracted", .{id});
}

/// Clear the hypergraph.
pub fn clear(self: *Self) void {
self.hyperedges.clearAndFree();
self.vertices.clearAndFree();
}
};
}

Expand Down Expand Up @@ -958,6 +974,18 @@ fn generateTestData(graph: *HyperZig(Hyperedge, Vertex)) !Data {
};
}

test "allocation failure" {
var failingAllocator = std.testing.FailingAllocator.init(std.testing.allocator, .{ .fail_index = 1 });
var graph = HyperZig(
Hyperedge,
Vertex,
).init(failingAllocator.allocator());
defer graph.deinit();

_ = try graph.createVertex(.{});
try expectError(HyperZigError.OutOfMemory, graph.createHyperedge(.{}));
}

test "create and get hyperedge" {
var graph = try scaffold();
defer graph.deinit();
Expand All @@ -982,6 +1010,26 @@ test "create and get vertex" {
try expect(@TypeOf(vertex) == Vertex);
}

test "get all hyperedges" {
var graph = try scaffold();
defer graph.deinit();

const data = try generateTestData(&graph);

const hyperedges = graph.getAllHyperedges();
try expectEqualSlices(Uuid, &[_]Uuid{ data.h_a, data.h_b, data.h_c }, hyperedges);
}

test "get all vertices" {
var graph = try scaffold();
defer graph.deinit();

const data = try generateTestData(&graph);

const vertices = graph.getAllVertices();
try expectEqualSlices(Uuid, &[_]Uuid{ data.v_a, data.v_b, data.v_c, data.v_d, data.v_e }, vertices);
}

test "append vertex to hyperedge" {
var graph = try scaffold();
defer graph.deinit();
Expand Down Expand Up @@ -1766,14 +1814,13 @@ test "contract hyperedge" {
try expectEqualSlices(Uuid, &[_]Uuid{ data.v_b, data.v_c, data.v_c, data.v_a, data.v_d, data.v_b }, h_c);
}

test "allocation failure" {
var failingAllocator = std.testing.FailingAllocator.init(std.testing.allocator, .{ .fail_index = 1 });
var graph = HyperZig(
Hyperedge,
Vertex,
).init(failingAllocator.allocator());
test "clear hypergraph" {
var graph = try scaffold();
defer graph.deinit();

_ = try graph.createVertex(.{});
try expectError(HyperZigError.OutOfMemory, graph.createHyperedge(.{}));
graph.clear();
const hyperedges = graph.getAllHyperedges();
const vertices = graph.getAllVertices();
try expect(hyperedges.len == 0);
try expect(vertices.len == 0);
}

0 comments on commit 286334d

Please sign in to comment.