File: algorithms_spec.rb

package info (click to toggle)
ruby-librarian 1.1.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 624 kB
  • sloc: ruby: 6,109; makefile: 11
file content (141 lines) | stat: -rw-r--r-- 3,983 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
require "librarian/algorithms"

module Librarian
  module Algorithms

    describe AdjacencyListDirectedGraph do

      describe 'cyclic?' do
        subject(:result) { described_class.cyclic?(graph) }

        context "with an empty graph" do
          let(:graph) { { } }
          it { should be false }
        end

        context "with a 1-node acyclic graph" do
          let(:graph) { { ?a => nil } }
          it { should be false }
        end

        context "with a 1-node cyclic graph" do
          let(:graph) { { ?a => [?a] } }
          it { should be true }
        end

        context "with a 2-node no-edge graph" do
          let(:graph) { { ?a => nil, ?b => nil } }
          it { should be false }
        end

        context "with a 2-node acyclic graph" do
          let(:graph) { { ?a => [?b], ?b => nil } }
          it { should be false }
        end

        context "with a 2-node cyclic graph" do
          let(:graph) { { ?a => [?b], ?b => [?a] } }
          it { should be true }
        end

        context "with a 2-scc graph" do
          let(:graph) { { ?a => [?b], ?b => [?a], ?c => [?d, ?b], ?d => [?c] } }
          it { should be true }
        end

      end

      describe 'feedback_arc_set' do
        subject(:result) { described_class.feedback_arc_set(graph) }

        context "with an empty graph" do
          let(:graph) { { } }
          it { should be_empty }
        end

        context "with a 1-node acyclic graph" do
          let(:graph) { { ?a => nil } }
          it { should be_empty }
        end

        context "with a 1-node cyclic graph" do
          let(:graph) { { ?a => [?a] } }
          it { should be == [[?a, ?a]] }
        end

        context "with a 2-node no-edge graph" do
          let(:graph) { { ?a => nil, ?b => nil } }
          it { should be_empty }
        end

        context "with a 2-node acyclic graph" do
          let(:graph) { { ?a => [?b], ?b => nil } }
          it { should be_empty }
        end

        context "with a 2-node cyclic graph" do
          let(:graph) { { ?a => [?b], ?b => [?a] } }
          it { should be == [[?a, ?b]] } # based on the explicit sort
        end

        context "with a 2-scc graph" do
          let(:graph) { { ?a => [?b], ?b => [?a], ?c => [?d, ?b], ?d => [?c] } }
          it { should be == [[?a, ?b], [?c, ?d]] }
        end

      end

      describe 'tsort_cyclic' do
        subject(:result) { described_class.tsort_cyclic(graph) }

        context "with an empty graph" do
          let(:graph) { { } }
          it { should be == [] }
        end

        context "with a 1-node acyclic graph" do
          let(:graph) { { ?a => nil } }
          it { should be == [?a] }
        end

        context "with a 1-node cyclic graph" do
          let(:graph) { { ?a => [?a] } }
          it { should be == [?a] }
        end

        context "with a 2-node no-edge graph" do
          let(:graph) { { ?a => nil, ?b => nil } }
          it { should be == [?a, ?b] }
        end

        context "with a 2-node acyclic graph" do
          let(:graph) { { ?a => [?b], ?b => nil } }
          it { should be == [?b, ?a] } # based on the explicit sort
        end

        context "with a 2-node cyclic graph" do
          let(:graph) { { ?a => [?b], ?b => [?a] } }
          it { should be == [?a, ?b] } # based on the explicit sort
        end

        context "with a 2-scc graph" do
          let(:graph) { { ?a => [?b], ?b => [?a], ?c => [?d, ?b], ?d => [?c] } }
          it { should be == [?a, ?b, ?c, ?d] }
        end

        # Dependencies are sorted alphabetically. Should they?
        context "should be deterministic" do
          let(:graph) { { ?a => [], ?b => [?c], ?c => [] } }
          it { should be == [?a, ?c, ?b] }
        end

        context "should be deterministic" do
          let(:graph) { { ?c => [], ?b => [?a], ?a => [] } }
          it { should be == [?a, ?b, ?c] }
        end
      end

    end

  end
end