Skip to content
This repository was archived by the owner on May 4, 2024. It is now read-only.

Commit

Permalink
Add Edge class with attributes
Browse files Browse the repository at this point in the history
  • Loading branch information
floriandejonckheere committed Mar 31, 2024
1 parent 90f89fe commit 1c2403b
Show file tree
Hide file tree
Showing 7 changed files with 72 additions and 108 deletions.
17 changes: 17 additions & 0 deletions lib/mosaik/graph/edge.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# frozen_string_literal: true

module MOSAIK
module Graph
class Edge
attr_reader :attributes

def initialize(attributes = {})
@attributes = attributes
end

def inspect
"#<#{self.class.name} attributes=#{attributes.map { |k, v| "#{k}: #{v}" }.join(',')}>"
end
end
end
end
10 changes: 5 additions & 5 deletions lib/mosaik/graph/graph.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@ def add_vertex(id, attributes = {})
vertices[id] = Vertex.new(id, attributes)
end

def add_directed_edge(from, to, weight = nil)
vertices[from].add_edge(to, weight)
def add_directed_edge(from, to, attributes = {})
vertices[from].add_edge(to, **attributes)
end
alias add_edge add_directed_edge

def add_undirected_edge(from, to, weight = nil)
vertices[from].add_edge(to, weight)
vertices[to].add_edge(from, weight)
def add_undirected_edge(from, to, attributes = {})
vertices[from].add_edge(to, **attributes)
vertices[to].add_edge(from, **attributes)
end

def remove_directed_edge(from, to)
Expand Down
4 changes: 2 additions & 2 deletions lib/mosaik/graph/vertex.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ def initialize(id, attributes = {})
@attributes = attributes
end

def add_edge(to, weight = nil)
edges[to] = weight
def add_edge(to, **attributes)
edges[to] = Edge.new(attributes)
end

def remove_edge(id)
Expand Down
11 changes: 11 additions & 0 deletions spec/mosaik/graph/edge_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# frozen_string_literal: true

RSpec.describe MOSAIK::Graph::Edge do
subject(:edge) { build(:edge) }

describe "#attributes" do
it "returns the attributes" do
expect(edge.attributes).to eq key: "value"
end
end
end
108 changes: 24 additions & 84 deletions spec/mosaik/graph/graph_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,34 +26,22 @@
expect(graph.find_vertex("vertex1").edges.keys).to eq ["vertex2"]
end

it "does not add a directed edge twice" do
it "adds a directed edge with attributes" do
graph.add_vertex("vertex1")
graph.add_vertex("vertex2")
graph.add_directed_edge("vertex1", "vertex2")
graph.add_directed_edge("vertex1", "vertex2")
graph.add_directed_edge("vertex1", "vertex2", key: "value")

expect(graph.find_vertex("vertex1").edges.keys).to eq ["vertex2"]
expect(graph.find_vertex("vertex1").edges["vertex2"].attributes).to eq key: "value"
end

describe "weighted" do
it "adds a directed weighted edge" do
graph.add_vertex("vertex1")
graph.add_vertex("vertex2")
graph.add_directed_edge("vertex1", "vertex2", 5)

expect(graph.find_vertex("vertex1").edges.keys).to eq ["vertex2"]
expect(graph.find_vertex("vertex1").edges["vertex2"]).to eq 5
end

it "overrides a directed weighted edge" do
graph.add_vertex("vertex1")
graph.add_vertex("vertex2")
graph.add_directed_edge("vertex1", "vertex2", 5)
graph.add_directed_edge("vertex1", "vertex2", 10)
it "does not add a directed edge twice" do
graph.add_vertex("vertex1")
graph.add_vertex("vertex2")
graph.add_directed_edge("vertex1", "vertex2")
graph.add_directed_edge("vertex1", "vertex2")

expect(graph.find_vertex("vertex1").edges.keys).to eq ["vertex2"]
expect(graph.find_vertex("vertex1").edges["vertex2"]).to eq 10
end
expect(graph.find_vertex("vertex1").edges.keys).to eq ["vertex2"]
end
end

Expand All @@ -66,34 +54,22 @@
expect(graph.find_vertex("vertex1").edges.keys).to eq ["vertex2"]
end

it "does not add an undirected edge twice" do
it "adds an undirected edge with attributes" do
graph.add_vertex("vertex1")
graph.add_vertex("vertex2")
graph.add_undirected_edge("vertex1", "vertex2")
graph.add_undirected_edge("vertex1", "vertex2")
graph.add_undirected_edge("vertex1", "vertex2", key: "value")

expect(graph.find_vertex("vertex1").edges.keys).to eq ["vertex2"]
expect(graph.find_vertex("vertex1").edges["vertex2"].attributes).to eq key: "value"
end

describe "weighted" do
it "adds an undirected weighted edge" do
graph.add_vertex("vertex1")
graph.add_vertex("vertex2")
graph.add_undirected_edge("vertex1", "vertex2", 5)

expect(graph.find_vertex("vertex1").edges.keys).to eq ["vertex2"]
expect(graph.find_vertex("vertex1").edges["vertex2"]).to eq 5
end

it "overrides an undirected weighted edge" do
graph.add_vertex("vertex1")
graph.add_vertex("vertex2")
graph.add_undirected_edge("vertex1", "vertex2", 5)
graph.add_undirected_edge("vertex1", "vertex2", 10)
it "does not add an undirected edge twice" do
graph.add_vertex("vertex1")
graph.add_vertex("vertex2")
graph.add_undirected_edge("vertex1", "vertex2")
graph.add_undirected_edge("vertex1", "vertex2")

expect(graph.find_vertex("vertex1").edges.keys).to eq ["vertex2"]
expect(graph.find_vertex("vertex1").edges["vertex2"]).to eq 10
end
expect(graph.find_vertex("vertex1").edges.keys).to eq ["vertex2"]
end
end

Expand All @@ -116,27 +92,6 @@

expect(graph.find_vertex("vertex1").edges).to be_empty
end

describe "weighted" do
it "removes a directed weighted edge" do
graph.add_vertex("vertex1")
graph.add_vertex("vertex2")
graph.add_directed_edge("vertex1", "vertex2", 5)

graph.remove_directed_edge("vertex1", "vertex2")

expect(graph.find_vertex("vertex1").edges).to be_empty
end

it "does not remove a non-existing directed weighted edge" do
graph.add_vertex("vertex1")
graph.add_vertex("vertex2")

graph.remove_directed_edge("vertex1", "vertex2")

expect(graph.find_vertex("vertex1").edges).to be_empty
end
end
end

describe "#remove_undirected_edge" do
Expand All @@ -158,27 +113,6 @@

expect(graph.find_vertex("vertex1").edges).to be_empty
end

describe "weighted" do
it "removes a directed weighted edge" do
graph.add_vertex("vertex1")
graph.add_vertex("vertex2")
graph.add_directed_edge("vertex1", "vertex2", 5)

graph.remove_directed_edge("vertex1", "vertex2")

expect(graph.find_vertex("vertex1").edges).to be_empty
end

it "does not remove a non-existing directed weighted edge" do
graph.add_vertex("vertex1")
graph.add_vertex("vertex2")

graph.remove_directed_edge("vertex1", "vertex2")

expect(graph.find_vertex("vertex1").edges).to be_empty
end
end
end

describe "#find_vertex" do
Expand Down Expand Up @@ -208,6 +142,12 @@
expect(vertex).to be_a MOSAIK::Graph::Vertex
expect(vertex.id).to eq "vertex"
end

it "adds a vertex with attributes" do
vertex = graph.find_or_add_vertex("vertex", key: "value")

expect(vertex.attributes).to eq key: "value"
end
end

describe "#remove_vertex" do
Expand Down
24 changes: 7 additions & 17 deletions spec/mosaik/graph/vertex_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,28 +16,18 @@
expect(vertex.edges.keys).to eq ["child"]
end

it "does not add an edge twice" do
vertex.add_edge("child")
vertex.add_edge("child")
it "adds an edge with attributes" do
vertex.add_edge("child", key: "value")

expect(vertex.edges.keys).to eq ["child"]
expect(vertex.edges["child"].attributes).to eq key: "value"
end

describe "weighted edge" do
it "adds a weighted edge" do
vertex.add_edge("child", 5)

expect(vertex.edges.keys).to eq ["child"]
expect(vertex.edges["child"]).to eq 5
end

it "overrides a weighted edge" do
vertex.add_edge("child", 5)
vertex.add_edge("child", 10)
it "does not add an edge twice" do
vertex.add_edge("child")
vertex.add_edge("child")

expect(vertex.edges.keys).to eq ["child"]
expect(vertex.edges["child"]).to eq 10
end
expect(vertex.edges.keys).to eq ["child"]
end
end
end
6 changes: 6 additions & 0 deletions spec/support/factories/graph.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,10 @@
id { "vertex" }
attrs { { key: "value" } }
end

factory :edge, class: "MOSAIK::Graph::Edge" do
initialize_with { new(attrs) }

attrs { { key: "value" } }
end
end

0 comments on commit 1c2403b

Please sign in to comment.