ds 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Rakefile +13 -0
- data/doc/Array.html +264 -0
- data/doc/DS.html +292 -0
- data/doc/DS/Array2D.html +345 -0
- data/doc/DS/BinaryHeap.html +493 -0
- data/doc/DS/BinarySearchTree.html +313 -0
- data/doc/DS/BinaryTree.html +433 -0
- data/doc/DS/CompleteBinaryTree.html +550 -0
- data/doc/DS/CyclicList.html +234 -0
- data/doc/DS/Digraph.html +299 -0
- data/doc/DS/Edge.html +283 -0
- data/doc/DS/ExpandableArray.html +316 -0
- data/doc/DS/Graph.html +739 -0
- data/doc/DS/GraphAsList.html +361 -0
- data/doc/DS/GraphAsMatrix.html +633 -0
- data/doc/DS/GraphAsTriMatrix.html +274 -0
- data/doc/DS/List.html +1263 -0
- data/doc/DS/ListElement.html +344 -0
- data/doc/DS/Queue.html +517 -0
- data/doc/DS/Ring.html +323 -0
- data/doc/DS/Stack.html +407 -0
- data/doc/DS/Tree.html +770 -0
- data/doc/DS/TreeWalker.html +561 -0
- data/doc/DS/TriMatrix.html +338 -0
- data/doc/created.rid +25 -0
- data/doc/ds/graphs/digraph_rb.html +52 -0
- data/doc/ds/graphs/edge_rb.html +52 -0
- data/doc/ds/graphs/graph_as_list_rb.html +52 -0
- data/doc/ds/graphs/graph_as_matrix_rb.html +52 -0
- data/doc/ds/graphs/graph_as_tri_matrix_rb.html +52 -0
- data/doc/ds/graphs/graph_rb.html +52 -0
- data/doc/ds/lists/cyclic_list_rb.html +52 -0
- data/doc/ds/lists/list_element_rb.html +52 -0
- data/doc/ds/lists/list_rb.html +52 -0
- data/doc/ds/lists/ring_rb.html +52 -0
- data/doc/ds/matrixes/array_2d_rb.html +52 -0
- data/doc/ds/matrixes/expandable_array_rb.html +52 -0
- data/doc/ds/matrixes/tri_matrix_rb.html +52 -0
- data/doc/ds/queues/queue_rb.html +52 -0
- data/doc/ds/stacks/stack_rb.html +52 -0
- data/doc/ds/trees/binary_heap_rb.html +52 -0
- data/doc/ds/trees/binary_search_tree_rb.html +52 -0
- data/doc/ds/trees/binary_tree_rb.html +52 -0
- data/doc/ds/trees/complete_binary_tree_rb.html +52 -0
- data/doc/ds/trees/tree_rb.html +52 -0
- data/doc/ds/trees/tree_walker_rb.html +52 -0
- data/doc/ds/version_rb.html +52 -0
- data/doc/ds_rb.html +98 -0
- data/doc/ext/ext_rb.html +52 -0
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/loadingAnimation.gif +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/doc/index.html +375 -0
- data/doc/js/darkfish.js +116 -0
- data/doc/js/jquery.js +32 -0
- data/doc/js/quicksearch.js +114 -0
- data/doc/js/thickbox-compressed.js +10 -0
- data/doc/rdoc.css +763 -0
- data/ds.gemspec +20 -0
- data/lib/ds.rb +38 -0
- data/lib/ds/graphs/digraph.rb +20 -0
- data/lib/ds/graphs/edge.rb +15 -0
- data/lib/ds/graphs/graph.rb +107 -0
- data/lib/ds/graphs/graph_as_list.rb +48 -0
- data/lib/ds/graphs/graph_as_matrix.rb +114 -0
- data/lib/ds/graphs/graph_as_tri_matrix.rb +25 -0
- data/lib/ds/lists/cyclic_list.rb +21 -0
- data/lib/ds/lists/list.rb +303 -0
- data/lib/ds/lists/list_element.rb +26 -0
- data/lib/ds/lists/ring.rb +42 -0
- data/lib/ds/matrixes/array_2d.rb +35 -0
- data/lib/ds/matrixes/expandable_array.rb +37 -0
- data/lib/ds/matrixes/tri_matrix.rb +30 -0
- data/lib/ds/queues/queue.rb +53 -0
- data/lib/ds/stacks/stack.rb +39 -0
- data/lib/ds/trees/binary_heap.rb +71 -0
- data/lib/ds/trees/binary_search_tree.rb +32 -0
- data/lib/ds/trees/binary_tree.rb +65 -0
- data/lib/ds/trees/complete_binary_tree.rb +52 -0
- data/lib/ds/trees/tree.rb +117 -0
- data/lib/ds/trees/tree_walker.rb +179 -0
- data/lib/ds/version.rb +3 -0
- data/lib/ext/ext.rb +15 -0
- data/test/help.rb +8 -0
- data/test/test_array2d.rb +51 -0
- data/test/test_binary_heap.rb +35 -0
- data/test/test_binary_search_tree.rb +32 -0
- data/test/test_binary_tree.rb +51 -0
- data/test/test_complete_binary_tree.rb +30 -0
- data/test/test_digraph.rb +134 -0
- data/test/test_expandable_array.rb +26 -0
- data/test/test_graph.rb +71 -0
- data/test/test_list.rb +138 -0
- data/test/test_list_element.rb +56 -0
- data/test/test_queue.rb +110 -0
- data/test/test_ring.rb +28 -0
- data/test/test_stack.rb +87 -0
- data/test/test_tree.rb +48 -0
- data/test/test_tree_walker.rb +69 -0
- data/test/test_tri_matrix.rb +22 -0
- metadata +184 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
require 'help'
|
|
2
|
+
|
|
3
|
+
describe BinaryTree do
|
|
4
|
+
|
|
5
|
+
before do
|
|
6
|
+
|
|
7
|
+
@bin_tree = BinaryTree.new
|
|
8
|
+
[2,5,8,9,11,12,14].each{|x| @bin_tree.insert(x)}
|
|
9
|
+
|
|
10
|
+
@izo_tree = BinaryTree.new
|
|
11
|
+
[2,7,8,3,11,12,14].each{|x| @izo_tree.insert(x)}
|
|
12
|
+
|
|
13
|
+
@bin_walker = TreeWalker.new(@bin_tree)
|
|
14
|
+
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "#to_a should return tree converted to array." do
|
|
18
|
+
@bin_tree.to_a.must_equal [2,5,8,9,11,12,14]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "#height should return tree height." do
|
|
22
|
+
@bin_tree.height.must_equal 3
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "#width should return tree width." do
|
|
26
|
+
@bin_tree.width.must_equal 4
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "#leaf_count should return number of tree leaves." do
|
|
30
|
+
@bin_tree.leaf_count.must_equal 4
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "#get_leaves should return list of tree leaves." do
|
|
34
|
+
@bin_tree.get_leaves.to_a.collect{ |e| e.data }.must_equal [9,11,12,14]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "#lowest_height should return node which lies closest to the root." do
|
|
38
|
+
assert @bin_tree.lowest_height.must_equal 9
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "#mirror should mirror tree." do
|
|
42
|
+
@bin_tree.mirror!
|
|
43
|
+
@bin_tree.to_a.must_equal [2,8,5,14,12,11,9]
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "#isometric should check if tree is isometric to antother." do
|
|
47
|
+
assert @bin_tree.izometric?(@izo_tree)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
end
|
|
51
|
+
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'help'
|
|
2
|
+
|
|
3
|
+
describe CompleteBinaryTree do
|
|
4
|
+
|
|
5
|
+
before do
|
|
6
|
+
@tree = CompleteBinaryTree.new(1,2,3,4,5,6,7)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
it "#root should return root of the tree." do
|
|
10
|
+
@tree.root.must_equal 1
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "#left should return left child" do
|
|
14
|
+
@tree.left(1).must_equal 2
|
|
15
|
+
@tree.left(2).must_equal 4
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "#right should return right child" do
|
|
19
|
+
@tree.right(1).must_equal 3
|
|
20
|
+
@tree.right(2).must_equal 5
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "#parent should return parent." do
|
|
24
|
+
@tree.parent(4).must_equal 2
|
|
25
|
+
@tree.parent(5).must_equal 2
|
|
26
|
+
@tree.parent(2).must_equal 1
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
require 'help'
|
|
2
|
+
|
|
3
|
+
describe Digraph do
|
|
4
|
+
|
|
5
|
+
describe "without weighted edges" do
|
|
6
|
+
|
|
7
|
+
before do
|
|
8
|
+
|
|
9
|
+
edges = []
|
|
10
|
+
edges << Edge.new('Lukas','Marc')
|
|
11
|
+
edges << Edge.new('Lukas','Tom')
|
|
12
|
+
edges << Edge.new('Marc','Jack')
|
|
13
|
+
edges << Edge.new('Jack','Marc')
|
|
14
|
+
edges << Edge.new('Tom','Marc')
|
|
15
|
+
|
|
16
|
+
@digraph = Digraph.create(edges)
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "#degree should return vertex degree." do
|
|
21
|
+
@digraph.degree("Marc").must_equal 4
|
|
22
|
+
@digraph.degree("Tom").must_equal 2
|
|
23
|
+
@digraph.degree("Lukas").must_equal 2
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "#in_degree should return number of incoming edges to the vertex." do
|
|
27
|
+
@digraph.in_degree("Marc").must_equal 3
|
|
28
|
+
@digraph.in_degree("Tom").must_equal 1
|
|
29
|
+
@digraph.in_degree("Lukas").must_equal 0
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "#out_degree should return number of outgoing edges from vertex." do
|
|
33
|
+
@digraph.out_degree("Marc").must_equal 1
|
|
34
|
+
@digraph.out_degree("Tom").must_equal 1
|
|
35
|
+
@digraph.out_degree("Lukas").must_equal 2
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "#get_edge should return graph edge." do
|
|
39
|
+
lukas_tom = @digraph.get_edge("Lukas","Tom")
|
|
40
|
+
lukas_tom.from.must_equal "Lukas"
|
|
41
|
+
lukas_tom.to.must_equal "Tom"
|
|
42
|
+
lukas_tom.weight.must_equal 1
|
|
43
|
+
lukas_tom.must_be_instance_of Edge
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "#edge? should check if two vertex are connected." do
|
|
47
|
+
refute @digraph.edge?("Marc","Tom")
|
|
48
|
+
refute @digraph.edge?("Jack","Tom")
|
|
49
|
+
refute @digraph.edge?("Tom","Lukas")
|
|
50
|
+
|
|
51
|
+
assert @digraph.edge?("Tom","Marc")
|
|
52
|
+
assert @digraph.edge?("Lukas","Marc")
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it "#neighbors should return array containing all neighbors for given vertex." do
|
|
56
|
+
n = @digraph.neighbors('Tom')
|
|
57
|
+
n.must_be_instance_of Array
|
|
58
|
+
n.size.must_equal 1
|
|
59
|
+
assert n.include?("Marc")
|
|
60
|
+
refute n.include?("Lukas")
|
|
61
|
+
refute n.include?("Jack")
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it "#add_edge should add new edge." do
|
|
65
|
+
@digraph.add_edges([Edge.new("Marc","Kate")])
|
|
66
|
+
@digraph.vertex_size.must_equal 6
|
|
67
|
+
assert @digraph.edge?("Marc","Kate")
|
|
68
|
+
refute @digraph.edge?("Kate","Marc")
|
|
69
|
+
refute @digraph.edge?("Tom","Kate")
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it "#remove_edge should remove edge." do
|
|
73
|
+
@digraph.remove("Marc","Jack")
|
|
74
|
+
@digraph.vertex_size.must_equal 4
|
|
75
|
+
refute @digraph.edge?("Marc","Jack")
|
|
76
|
+
assert @digraph.edge?("Jack","Marc")
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
describe "with weighted edges" do
|
|
82
|
+
|
|
83
|
+
before do
|
|
84
|
+
edges = []
|
|
85
|
+
|
|
86
|
+
edges << Edge.new(:A,:C,5)
|
|
87
|
+
edges << Edge.new(:A,:D,3)
|
|
88
|
+
edges << Edge.new(:A,:G,14)
|
|
89
|
+
edges << Edge.new(:C,:E,3)
|
|
90
|
+
edges << Edge.new(:C,:F,2)
|
|
91
|
+
edges << Edge.new(:D,:C,11)
|
|
92
|
+
edges << Edge.new(:D,:E,7)
|
|
93
|
+
edges << Edge.new(:D,:G,6)
|
|
94
|
+
edges << Edge.new(:G,:E,7)
|
|
95
|
+
edges << Edge.new(:E,:B,5)
|
|
96
|
+
edges << Edge.new(:G,:B,6)
|
|
97
|
+
edges << Edge.new(:F,:B,7)
|
|
98
|
+
|
|
99
|
+
@wdigraph = Digraph.create(edges)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it "edge should be assigned a weight." do
|
|
103
|
+
d_c = @wdigraph.get_edge(:D,:C)
|
|
104
|
+
d_c.weight.must_equal 11
|
|
105
|
+
d_c.from.must_equal :D
|
|
106
|
+
d_c.to.must_equal :C
|
|
107
|
+
d_c.must_be_instance_of Edge
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
it "#degree should return vertex degree." do
|
|
111
|
+
@wdigraph.degree(:E).must_equal 4
|
|
112
|
+
@wdigraph.degree(:C).must_equal 4
|
|
113
|
+
@wdigraph.degree(:A).must_equal 3
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
it "#in_degree should return number of incoming edges to the vertex." do
|
|
117
|
+
@wdigraph.in_degree(:E).must_equal 3
|
|
118
|
+
@wdigraph.in_degree(:C).must_equal 2
|
|
119
|
+
@wdigraph.in_degree(:A).must_equal 0
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it "#out_degree should return number of outgoing edges from vertex." do
|
|
123
|
+
@wdigraph.out_degree(:E).must_equal 1
|
|
124
|
+
@wdigraph.out_degree(:B).must_equal 0
|
|
125
|
+
@wdigraph.out_degree(:A).must_equal 3
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
it "#bfs should iterate over graph in bfs order." do
|
|
129
|
+
@wdigraph.bfs(:A).must_equal [:A, :C, :D, :G, :E, :F, :B]
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'help'
|
|
2
|
+
|
|
3
|
+
describe ExpandableArray do
|
|
4
|
+
|
|
5
|
+
describe "Zero Array" do
|
|
6
|
+
|
|
7
|
+
before do
|
|
8
|
+
@zero_arr = ExpandableArray.new(0,0)
|
|
9
|
+
@zero_arr[0] = 1
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "access to element x should set all elements from array size to x to zero." do
|
|
13
|
+
@zero_arr.size.must_equal 1
|
|
14
|
+
@zero_arr[3].must_equal 0
|
|
15
|
+
@zero_arr.size.must_equal 4
|
|
16
|
+
@zero_arr.must_equal [1,0,0,0]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "setting value on index x should set all elements from array size to x to zero." do
|
|
20
|
+
@zero_arr[5] = 2
|
|
21
|
+
@zero_arr.must_equal [1,0,0,0,0,2]
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
|
data/test/test_graph.rb
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
require 'help'
|
|
2
|
+
|
|
3
|
+
describe Graph do
|
|
4
|
+
|
|
5
|
+
before do
|
|
6
|
+
edges = []
|
|
7
|
+
edges << Edge.new('Lukas','Marc')
|
|
8
|
+
edges << Edge.new('Lukas','Tom')
|
|
9
|
+
edges << Edge.new('Marc','Jack')
|
|
10
|
+
edges << Edge.new('Tom','Marc')
|
|
11
|
+
@graph = Graph.create(edges)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "#vertex_size should return number of vertexes" do
|
|
15
|
+
@graph.vertex_size.must_equal 4
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "#degree should return degree for given vertex." do
|
|
19
|
+
@graph.degree("Marc").must_equal 3
|
|
20
|
+
@graph.degree("Jack").must_equal 1
|
|
21
|
+
@graph.degree("Lukas").must_equal 2
|
|
22
|
+
@graph.degree("Tom").must_equal 2
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "#edge? should check if given vertexes are connected." do
|
|
26
|
+
assert @graph.edge?("Marc","Tom")
|
|
27
|
+
assert @graph.edge?("Tom","Marc")
|
|
28
|
+
refute @graph.edge?("Tom","Jack")
|
|
29
|
+
refute @graph.edge?("Jack","Tom")
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "#add_edges should add new edges." do
|
|
33
|
+
@graph.add_edges([Edge.new("Marc","Kate")])
|
|
34
|
+
@graph.vertex_size.must_equal 5
|
|
35
|
+
assert @graph.edge?("Marc","Kate")
|
|
36
|
+
assert @graph.edge?("Kate","Marc")
|
|
37
|
+
refute @graph.edge?("Tom","Kate")
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "#remove_edge should remove edge." do
|
|
41
|
+
@graph.remove("Marc","Jack")
|
|
42
|
+
@graph.vertex_size.must_equal 3
|
|
43
|
+
refute @graph.edge?("Marc","Jack")
|
|
44
|
+
refute @graph.edge?("Jack","Marc")
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "#neighbors should return all neighbors for given vertex." do
|
|
48
|
+
n = @graph.neighbors('Tom')
|
|
49
|
+
n.must_be_instance_of Array
|
|
50
|
+
n.size.must_equal 2
|
|
51
|
+
assert n.include?("Marc")
|
|
52
|
+
assert n.include?("Lukas")
|
|
53
|
+
refute n.include?("Jack")
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "should iterate edges." do
|
|
57
|
+
r = []
|
|
58
|
+
@graph.each_edge{|e| r.push e}
|
|
59
|
+
r.size.must_equal 4
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "should iterate vertexes." do
|
|
63
|
+
r = []
|
|
64
|
+
@graph.each_vertex { |v| r.push v }
|
|
65
|
+
r.size.must_equal 4
|
|
66
|
+
r.sort.must_equal ['Jack','Lukas', 'Marc', 'Tom' ]
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
|
data/test/test_list.rb
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
require 'help'
|
|
2
|
+
|
|
3
|
+
describe List do
|
|
4
|
+
|
|
5
|
+
before do
|
|
6
|
+
@list = List.from_array([1,2,3,4])
|
|
7
|
+
@list2 = List.from_array([4,5,7])
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it "#from_array should transform array to list." do
|
|
11
|
+
@list.must_be_kind_of List
|
|
12
|
+
@list.length.must_equal 4
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "#length should return list size." do
|
|
16
|
+
@list.length.must_equal 4
|
|
17
|
+
@list2.length.must_equal 3
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
it "#append should add element to the end of the list." do
|
|
22
|
+
x = 5
|
|
23
|
+
@list.append(x)
|
|
24
|
+
@list.length.must_equal 5
|
|
25
|
+
@list.last.must_be_same_as x
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "#prepend should add element at the beginning of the list." do
|
|
29
|
+
x = 0
|
|
30
|
+
@list.prepend(x)
|
|
31
|
+
@list.length.must_equal 5
|
|
32
|
+
@list.first.must_be_same_as x
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "#remove should remove element from list." do
|
|
36
|
+
second = @list.head.next
|
|
37
|
+
@list.remove(second)
|
|
38
|
+
@list.to_a.must_equal [1,3,4]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "#insert_before should insert new element before another." do
|
|
42
|
+
second = @list.head.next
|
|
43
|
+
@list.insert_before(9,second)
|
|
44
|
+
@list.to_a.must_equal [1,9,2,3,4]
|
|
45
|
+
|
|
46
|
+
@list.insert_before(8,@list.head)
|
|
47
|
+
@list.to_a.must_equal [8,1,9,2,3,4]
|
|
48
|
+
|
|
49
|
+
@list.insert_before(7,@list.tail)
|
|
50
|
+
@list.to_a.must_equal [8,1,9,2,3,7,4]
|
|
51
|
+
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "#insert_after should insert new element after another." do
|
|
55
|
+
second = @list.head.next
|
|
56
|
+
@list.insert_after(9,second)
|
|
57
|
+
@list.to_a.must_equal [1,2,9,3,4]
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
it "#head should point to first element of the list." do
|
|
62
|
+
@list.head.must_be_kind_of ListElement
|
|
63
|
+
@list2.head.must_be_kind_of ListElement
|
|
64
|
+
@list.head.data.must_equal 1
|
|
65
|
+
@list2.head.data.must_equal 4
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it "#tail sould point to last element of the list" do
|
|
69
|
+
@list.tail.must_be_kind_of ListElement
|
|
70
|
+
@list2.tail.must_be_kind_of ListElement
|
|
71
|
+
@list.tail.next.must_be_nil
|
|
72
|
+
@list2.tail.next.must_be_nil
|
|
73
|
+
|
|
74
|
+
@list.tail.data.must_equal 4
|
|
75
|
+
@list2.tail.data.must_equal 7
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "#first should return value of the first list element." do
|
|
79
|
+
@list.first.must_equal 1
|
|
80
|
+
@list2.first.must_equal 4
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
it "#last should return value of the last list element." do
|
|
85
|
+
@list.last.must_equal 4
|
|
86
|
+
@list2.last.must_equal 7
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "#zip? should check if two list are joined." do
|
|
90
|
+
refute @list.zip?(@list2)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it "#reverse! should reverse list" do
|
|
94
|
+
@list.reverse!.to_a.must_equal [4,3,2,1]
|
|
95
|
+
@list.reverse!.to_a.must_equal [1,2,3,4]
|
|
96
|
+
@list.reverse!.length.must_equal 4
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
it "#merge should merge two list into one." do
|
|
100
|
+
@list2.merge(@list).to_a.must_equal [1,2,3,4,4,5,7]
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it "#orderize should order elements by evaluating block." do
|
|
104
|
+
not_sorted_list = List.from_array([3,-1,0,-8,2,0,1])
|
|
105
|
+
not_sorted_list.orderize{|elem| elem <=> 0}.to_a.must_equal [-1,-8,0,0,3,2,1]
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it "#remove! should remove all elements that occur on the other list." do
|
|
109
|
+
@list.remove!(@list2).to_a.must_equal [1,2,3]
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it "#looped? should check if list has cycle." do
|
|
113
|
+
refute @list2.looped?
|
|
114
|
+
refute @list.looped?
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
it "should include Enumerable methods." do
|
|
118
|
+
@list.map{ |e| e }.must_equal [1,2,3,4]
|
|
119
|
+
@list.inject(0){ |mem, var| mem = mem + var }.must_equal 10
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
describe "Zipped list" do
|
|
124
|
+
|
|
125
|
+
before do
|
|
126
|
+
last = @list.tail
|
|
127
|
+
@zipped = List.from_array([1,2])
|
|
128
|
+
@zipped.tail = last
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
it "#zip? should return true" do
|
|
132
|
+
assert @list.zip?(@zipped)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
end
|
|
138
|
+
|