spec/nanoc/base/directed_graph_spec.rb in nanoc-4.7.10 vs spec/nanoc/base/directed_graph_spec.rb in nanoc-4.7.11

- old
+ new

@@ -63,6 +63,297 @@ end it { is_expected.to eq([2, 3, 4, 5]) } end end + + describe '#all_paths' do + subject { graph.all_paths.to_a } + + context 'no cycles' do + example do + expect(subject).to contain_exactly( + [1], + [2], + [3], + ) + end + end + + context 'one cycle without head' do + before do + graph.add_edge(1, 2) + graph.add_edge(2, 1) + end + + example do + expect(subject).to contain_exactly( + [1], + [1, 2], + [1, 2, 1], + [2], + [2, 1], + [2, 1, 2], + [3], + ) + end + end + + context 'one cycle with head' do + before do + graph.add_edge(1, 2) + graph.add_edge(2, 3) + graph.add_edge(3, 2) + end + + example do + expect(subject).to contain_exactly( + [1], + [1, 2], + [1, 2, 3], + [1, 2, 3, 2], + [2], + [2, 3], + [2, 3, 2], + [3], + [3, 2], + [3, 2, 3], + ) + end + end + + context 'one cycle with tail' do + before do + graph.add_edge(1, 2) + graph.add_edge(2, 20) + graph.add_edge(20, 21) + graph.add_edge(2, 3) + graph.add_edge(3, 1) + end + + example do + expect(subject).to contain_exactly( + [1], + [1, 2], + [1, 2, 20], + [1, 2, 20, 21], + [1, 2, 3], + [1, 2, 3, 1], + [2], + [2, 20], + [2, 20, 21], + [2, 3], + [2, 3, 1], + [2, 3, 1, 2], + [3], + [3, 1], + [3, 1, 2], + [3, 1, 2, 20], + [3, 1, 2, 20, 21], + [3, 1, 2, 3], + [20], + [20, 21], + [21], + ) + end + end + + context 'large cycle' do + before do + graph.add_edge(1, 2) + graph.add_edge(2, 3) + graph.add_edge(3, 4) + graph.add_edge(4, 5) + graph.add_edge(5, 1) + end + + example do + expect(subject).to contain_exactly( + [1], + [1, 2], + [1, 2, 3], + [1, 2, 3, 4], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5, 1], + [2], + [2, 3], + [2, 3, 4], + [2, 3, 4, 5], + [2, 3, 4, 5, 1], + [2, 3, 4, 5, 1, 2], + [3], + [3, 4], + [3, 4, 5], + [3, 4, 5, 1], + [3, 4, 5, 1, 2], + [3, 4, 5, 1, 2, 3], + [4], + [4, 5], + [4, 5, 1], + [4, 5, 1, 2], + [4, 5, 1, 2, 3], + [4, 5, 1, 2, 3, 4], + [5], + [5, 1], + [5, 1, 2], + [5, 1, 2, 3], + [5, 1, 2, 3, 4], + [5, 1, 2, 3, 4, 5], + ) + end + end + + context 'large cycle with head' do + before do + graph.add_edge(1, 2) + graph.add_edge(2, 3) + graph.add_edge(3, 4) + graph.add_edge(4, 5) + graph.add_edge(5, 2) + end + + example do + expect(subject).to contain_exactly( + [1], + [1, 2], + [1, 2, 3], + [1, 2, 3, 4], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5, 2], + [2], + [2, 3], + [2, 3, 4], + [2, 3, 4, 5], + [2, 3, 4, 5, 2], + [3], + [3, 4], + [3, 4, 5], + [3, 4, 5, 2], + [3, 4, 5, 2, 3], + [4], + [4, 5], + [4, 5, 2], + [4, 5, 2, 3], + [4, 5, 2, 3, 4], + [5], + [5, 2], + [5, 2, 3], + [5, 2, 3, 4], + [5, 2, 3, 4, 5], + ) + end + end + end + + describe '#dfs_from' do + subject do + [].tap do |ps| + graph.dfs_from(1) do |p| + ps << p + end + end + end + + context 'no cycles' do + example do + expect(subject).to contain_exactly( + [1], + ) + end + end + + context 'one cycle without head' do + before do + graph.add_edge(1, 2) + graph.add_edge(2, 1) + end + + example do + expect(subject).to contain_exactly( + [1], + [1, 2], + [1, 2, 1], + ) + end + end + + context 'one cycle with head' do + before do + graph.add_edge(1, 2) + graph.add_edge(2, 3) + graph.add_edge(3, 2) + end + + example do + expect(subject).to contain_exactly( + [1], + [1, 2], + [1, 2, 3], + [1, 2, 3, 2], + ) + end + end + + context 'one cycle with tail' do + before do + graph.add_edge(1, 2) + graph.add_edge(2, 20) + graph.add_edge(20, 21) + graph.add_edge(2, 3) + graph.add_edge(3, 1) + end + + example do + expect(subject).to contain_exactly( + [1], + [1, 2], + [1, 2, 20], + [1, 2, 20, 21], + [1, 2, 3], + [1, 2, 3, 1], + ) + end + end + + context 'large cycle' do + before do + graph.add_edge(1, 2) + graph.add_edge(2, 3) + graph.add_edge(3, 4) + graph.add_edge(4, 5) + graph.add_edge(5, 1) + end + + example do + expect(subject).to contain_exactly( + [1], + [1, 2], + [1, 2, 3], + [1, 2, 3, 4], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5, 1], + ) + end + end + + context 'large cycle with head' do + before do + graph.add_edge(1, 2) + graph.add_edge(2, 3) + graph.add_edge(3, 4) + graph.add_edge(4, 5) + graph.add_edge(5, 2) + end + + example do + expect(subject).to contain_exactly( + [1], + [1, 2], + [1, 2, 3], + [1, 2, 3, 4], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5, 2], + ) + end + end + end end