ds 0.0.4 → 0.0.6
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.
- checksums.yaml +7 -0
- data/.rubocop.yml +11 -0
- data/.rubocop_todo.yml +452 -0
- data/.travis.yml +12 -0
- data/Gemfile +1 -1
- data/README.rdoc +185 -214
- data/Rakefile +8 -3
- data/ds.gemspec +16 -13
- data/lib/ds.rb +20 -30
- data/lib/ds/{matrixes → arrays}/array_2d.rb +9 -10
- data/lib/ds/arrays/expandable_array.rb +34 -0
- data/lib/ds/arrays/heap_store.rb +32 -0
- data/lib/ds/arrays/tri_matrix.rb +33 -0
- data/lib/ds/lists/list.rb +310 -186
- data/lib/ds/lists/list_element.rb +14 -11
- data/lib/ds/pair.rb +4 -4
- data/lib/ds/queues/priority_queue.rb +33 -20
- data/lib/ds/queues/simple_queue.rb +55 -0
- data/lib/ds/sets/indexed_set.rb +37 -0
- data/lib/ds/stacks/stack.rb +25 -17
- data/lib/ds/trees/binary_heap.rb +71 -66
- data/lib/ds/trees/binary_tree.rb +40 -44
- data/lib/ds/trees/red_black_tree.rb +123 -0
- data/lib/ds/trees/red_black_tree/node.rb +21 -0
- data/lib/ds/trees/tree.rb +50 -48
- data/lib/ds/trees/tree_walker.rb +73 -144
- data/lib/ds/trees/trie.rb +67 -37
- data/lib/ds/trees/trie/node.rb +48 -0
- data/lib/ds/version.rb +2 -1
- data/test/help.rb +3 -6
- data/test/performance/binary_heap_performance_test.rb +20 -0
- data/test/performance/list_performance_test.rb +36 -0
- data/test/performance/priority_queue_performance.rb +32 -0
- data/test/performance/rbt_performance_test.rb +17 -0
- data/test/performance/simple_queue_performance_test.rb +37 -0
- data/test/performance/stack_test.rb +45 -0
- data/test/test_array2d.rb +29 -31
- data/test/test_binary_heap.rb +29 -23
- data/test/test_binary_tree.rb +30 -20
- data/test/test_expandable_array.rb +6 -10
- data/test/test_heap_store.rb +34 -0
- data/test/test_indexed_set.rb +26 -0
- data/test/test_list.rb +226 -109
- data/test/test_list_element.rb +34 -16
- data/test/test_pair.rb +5 -8
- data/test/test_priority_queue.rb +43 -64
- data/test/test_queue.rb +12 -61
- data/test/test_red_black_tree.rb +46 -0
- data/test/test_stack.rb +35 -39
- data/test/test_tree.rb +42 -29
- data/test/test_tree_walker.rb +27 -52
- data/test/test_tri_matrix.rb +6 -11
- data/test/test_trie.rb +59 -17
- metadata +80 -35
- data/lib/ds/ext/array_x.rb +0 -35
- data/lib/ds/graphs/digraph.rb +0 -20
- data/lib/ds/graphs/edge.rb +0 -15
- data/lib/ds/graphs/graph.rb +0 -111
- data/lib/ds/graphs/graph_as_matrix.rb +0 -113
- data/lib/ds/graphs/graph_as_tri_matrix.rb +0 -24
- data/lib/ds/lists/cyclic_list.rb +0 -21
- data/lib/ds/lists/ring.rb +0 -42
- data/lib/ds/matrixes/expandable_array.rb +0 -37
- data/lib/ds/matrixes/tri_matrix.rb +0 -30
- data/lib/ds/queues/queue.rb +0 -53
- data/lib/ds/sets/ordered_set.rb +0 -32
- data/lib/ds/trees/binary_search_tree.rb +0 -34
- data/lib/ds/trees/complete_binary_tree.rb +0 -60
- data/test/test_array_x.rb +0 -51
- data/test/test_binary_search_tree.rb +0 -39
- data/test/test_complete_binary_tree.rb +0 -58
- data/test/test_digraph.rb +0 -134
- data/test/test_graph.rb +0 -80
- data/test/test_ordered_set.rb +0 -28
- data/test/test_ring.rb +0 -28
data/test/test_binary_heap.rb
CHANGED
@@ -1,53 +1,59 @@
|
|
1
|
-
require
|
1
|
+
require 'help'
|
2
2
|
|
3
3
|
describe BinaryHeap do
|
4
|
-
|
5
4
|
before do
|
6
|
-
@arr = [9,8,4,5,11,6]
|
7
|
-
@arr2 = [4,2,9,11,3,5,1]
|
5
|
+
@arr = [9, 8, 4, 5, 11, 6]
|
6
|
+
@arr2 = [4, 2, 9, 11, 3, 5, 1]
|
8
7
|
@heap = BinaryHeap.new(*@arr)
|
9
8
|
@heap2 = BinaryHeap.max(*@arr2)
|
10
9
|
end
|
11
10
|
|
12
|
-
it
|
13
|
-
@heap.to_a.must_equal [11,9,6,5,8,4]
|
14
|
-
@heap2.to_a.must_equal [11,4,9,2,3,5,1]
|
11
|
+
it 'should create heap from array' do
|
12
|
+
@heap.to_a.must_equal [11, 9, 6, 5, 8, 4]
|
13
|
+
@heap2.to_a.must_equal [11, 4, 9, 2, 3, 5, 1]
|
14
|
+
end
|
15
|
+
|
16
|
+
it '#insert should insert new element to the heap maintaining heap relation.' do
|
17
|
+
@heap.size.must_equal 6
|
18
|
+
@heap.insert(13).to_a.must_equal [13, 9, 11, 5, 8, 4, 6]
|
19
|
+
@heap.size.must_equal 7
|
15
20
|
end
|
16
21
|
|
17
|
-
it
|
18
|
-
@heap.
|
22
|
+
it '#top should return max or min heap element' do
|
23
|
+
@heap.top.must_equal 11
|
24
|
+
@heap.shift
|
25
|
+
@heap.top.must_equal 9
|
19
26
|
end
|
20
27
|
|
21
|
-
it
|
28
|
+
it '#shift should remove element from heap maintaining heap relation.' do
|
22
29
|
@heap.shift.must_equal 11
|
23
|
-
@heap.to_a.must_equal [9,8,6,5,4]
|
30
|
+
@heap.to_a.must_equal [9, 8, 6, 5, 4]
|
24
31
|
@heap.shift.must_equal 9
|
25
|
-
@heap.to_a.must_equal [8,5,6,4]
|
32
|
+
@heap.to_a.must_equal [8, 5, 6, 4]
|
26
33
|
@heap.shift.must_equal 8
|
27
|
-
@heap.to_a.must_equal [6,5,4]
|
34
|
+
@heap.to_a.must_equal [6, 5, 4]
|
28
35
|
@heap.shift.must_equal 6
|
29
|
-
@heap.to_a.must_equal [5,4]
|
36
|
+
@heap.to_a.must_equal [5, 4]
|
30
37
|
@heap.shift.must_equal 5
|
31
38
|
@heap.to_a.must_equal [4]
|
32
39
|
@heap.shift.must_equal 4
|
33
40
|
@heap.shift.must_be_nil
|
34
41
|
end
|
35
42
|
|
36
|
-
describe
|
37
|
-
|
43
|
+
describe 'Minimal Heap' do
|
38
44
|
before do
|
39
|
-
@min_heap = BinaryHeap.new(*@arr){|parent,child| parent < child}
|
45
|
+
@min_heap = BinaryHeap.new(*@arr) { |parent, child| parent < child }
|
40
46
|
@min_heap2 = BinaryHeap.min(*@arr)
|
41
47
|
end
|
42
48
|
|
43
|
-
it
|
44
|
-
@min_heap.to_a.must_equal [4,5,6,8,11,9]
|
45
|
-
@min_heap2.to_a.must_equal [4,5,6,8,11,9]
|
49
|
+
it 'should create heap from array.' do
|
50
|
+
@min_heap.to_a.must_equal [4, 5, 6, 8, 11, 9]
|
51
|
+
@min_heap2.to_a.must_equal [4, 5, 6, 8, 11, 9]
|
46
52
|
end
|
47
53
|
|
48
|
-
it
|
49
|
-
@min_heap.insert(3).to_a.must_equal [3,5,4,8,11,9,6]
|
50
|
-
@min_heap2.insert(3).to_a.must_equal [3,5,4,8,11,9,6]
|
54
|
+
it '#insert should insert new element to the heap maintaining heap relation.' do
|
55
|
+
@min_heap.insert(3).to_a.must_equal [3, 5, 4, 8, 11, 9, 6]
|
56
|
+
@min_heap2.insert(3).to_a.must_equal [3, 5, 4, 8, 11, 9, 6]
|
51
57
|
end
|
52
58
|
end
|
53
59
|
end
|
data/test/test_binary_tree.rb
CHANGED
@@ -1,57 +1,67 @@
|
|
1
1
|
require 'help'
|
2
2
|
|
3
3
|
describe BinaryTree do
|
4
|
-
|
5
4
|
before do
|
6
|
-
|
7
5
|
@bin_tree = BinaryTree.new
|
8
|
-
[2,5,8,9,11,12,14].each{|x| @bin_tree.insert(x)}
|
6
|
+
[2, 5, 8, 9, 11, 12, 14].each { |x| @bin_tree.insert(x) }
|
9
7
|
|
10
8
|
@izo_tree = BinaryTree.new
|
11
|
-
[2,7,8,3,11,12,14].each{|x| @izo_tree.insert(x)}
|
9
|
+
[2, 7, 8, 3, 11, 12, 14].each { |x| @izo_tree.insert(x) }
|
12
10
|
|
13
11
|
@small_tree = BinaryTree.new(2)
|
14
12
|
@small_tree << BinaryTree.new(7)
|
15
13
|
@small_tree << BinaryTree.new(8)
|
16
14
|
|
17
15
|
@bin_walker = TreeWalker.new(@bin_tree)
|
16
|
+
end
|
18
17
|
|
18
|
+
it '#to_a should return tree converted to array.' do
|
19
|
+
@bin_tree.to_a.must_equal [2, 5, 8, 9, 11, 12, 14]
|
19
20
|
end
|
20
|
-
|
21
|
-
it
|
22
|
-
@
|
21
|
+
|
22
|
+
it '#parent should return node parent' do
|
23
|
+
@small_tree.parent.must_equal nil
|
24
|
+
@small_tree.right.parent.must_equal @small_tree
|
25
|
+
@bin_tree.right.parent.must_equal @bin_tree
|
23
26
|
end
|
24
27
|
|
25
|
-
it
|
28
|
+
it '#sibblings should return node sibblings' do
|
29
|
+
r = @small_tree.right
|
30
|
+
l = @small_tree.left
|
31
|
+
r.sibblings.must_equal [l]
|
32
|
+
r = @bin_tree.right
|
33
|
+
l = @bin_tree.left
|
34
|
+
r.sibblings.must_equal [l]
|
35
|
+
end
|
36
|
+
|
37
|
+
it '#height should return tree height.' do
|
26
38
|
@bin_tree.height.must_equal 3
|
27
39
|
end
|
28
40
|
|
29
|
-
it
|
41
|
+
it '#width should return tree width.' do
|
30
42
|
@bin_tree.width.must_equal 4
|
31
43
|
end
|
32
44
|
|
33
|
-
it
|
45
|
+
it '#leaf_count should return number of tree leaves.' do
|
34
46
|
@bin_tree.leaf_count.must_equal 4
|
35
47
|
end
|
36
|
-
|
37
|
-
it
|
38
|
-
@bin_tree.get_leaves.to_a.collect
|
48
|
+
|
49
|
+
it '#get_leaves should return list of tree leaves.' do
|
50
|
+
@bin_tree.get_leaves.to_a.collect(&:data).must_equal [9, 11, 12, 14]
|
39
51
|
end
|
40
52
|
|
41
|
-
it
|
42
|
-
assert @bin_tree.lowest_height.data.must_equal 9
|
53
|
+
it '#lowest_height should return node which lies closest to the root.' do
|
54
|
+
assert @bin_tree.lowest_height.data.must_equal 9
|
43
55
|
end
|
44
56
|
|
45
|
-
it
|
57
|
+
it '#mirror should mirror tree.' do
|
46
58
|
@bin_tree.mirror!
|
47
|
-
@bin_tree.to_a.must_equal [2,8,5,14,12,11,9]
|
59
|
+
@bin_tree.to_a.must_equal [2, 8, 5, 14, 12, 11, 9]
|
48
60
|
end
|
49
61
|
|
50
|
-
it
|
62
|
+
it '#isometric should check if tree is isometric to antother.' do
|
51
63
|
assert @bin_tree.izometric?(@izo_tree)
|
52
64
|
assert @izo_tree.izometric?(@bin_tree)
|
53
65
|
refute @bin_tree.izometric?(@small_tree)
|
54
66
|
end
|
55
|
-
|
56
67
|
end
|
57
|
-
|
@@ -1,26 +1,22 @@
|
|
1
1
|
require 'help'
|
2
2
|
|
3
3
|
describe ExpandableArray do
|
4
|
-
|
5
|
-
describe "Zero Array" do
|
6
|
-
|
4
|
+
describe 'Zero Array' do
|
7
5
|
before do
|
8
|
-
@zero_arr = ExpandableArray.new(0,0)
|
6
|
+
@zero_arr = ExpandableArray.new(0, 0)
|
9
7
|
@zero_arr[0] = 1
|
10
8
|
end
|
11
9
|
|
12
|
-
it
|
10
|
+
it 'access to element x should set all elements from array size to x to zero.' do
|
13
11
|
@zero_arr.size.must_equal 1
|
14
12
|
@zero_arr[3].must_equal 0
|
15
13
|
@zero_arr.size.must_equal 4
|
16
|
-
@zero_arr.must_equal [1,0,0,0]
|
14
|
+
@zero_arr.must_equal [1, 0, 0, 0]
|
17
15
|
end
|
18
16
|
|
19
|
-
it
|
17
|
+
it 'setting value on index x should set all elements from array size to x to zero.' do
|
20
18
|
@zero_arr[5] = 2
|
21
|
-
@zero_arr.must_equal [1,0,0,0,0,2]
|
19
|
+
@zero_arr.must_equal [1, 0, 0, 0, 0, 2]
|
22
20
|
end
|
23
21
|
end
|
24
22
|
end
|
25
|
-
|
26
|
-
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'help'
|
2
|
+
|
3
|
+
describe HeapStore do
|
4
|
+
before do
|
5
|
+
@store = HeapStore.new(1, 2, 3, 4, 5, 6, 7)
|
6
|
+
end
|
7
|
+
|
8
|
+
it '#size returns store size.' do
|
9
|
+
@store.size.must_equal 7
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'indexing starts form one.' do
|
13
|
+
@store[1].must_equal 1
|
14
|
+
end
|
15
|
+
|
16
|
+
it '#first returns element on index 1.' do
|
17
|
+
@store.first.must_equal 1
|
18
|
+
end
|
19
|
+
|
20
|
+
it '#pop removes last element.' do
|
21
|
+
@store.pop.must_equal 7
|
22
|
+
@store.size.must_equal 6
|
23
|
+
end
|
24
|
+
|
25
|
+
it '#push adds element to store.' do
|
26
|
+
@store.push 11
|
27
|
+
@store.size.must_equal 8
|
28
|
+
end
|
29
|
+
|
30
|
+
it '#to_a returns array representation.' do
|
31
|
+
@store.to_a.must_equal [1, 2, 3, 4, 5, 6, 7]
|
32
|
+
@store.to_a.must_be_kind_of Array
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'help'
|
2
|
+
|
3
|
+
describe 'IndexedSet' do
|
4
|
+
before do
|
5
|
+
@set = IndexedSet.new
|
6
|
+
@set.push(:first)
|
7
|
+
end
|
8
|
+
|
9
|
+
it '#push should add new element to set and return its index.' do
|
10
|
+
@set.push(:second).must_equal 1
|
11
|
+
@set.push(:first).must_equal 0
|
12
|
+
end
|
13
|
+
|
14
|
+
it '#index should return element index.' do
|
15
|
+
@set.index(:first).must_equal 0
|
16
|
+
@set.push(:second)
|
17
|
+
@set.index(:second).must_equal 1
|
18
|
+
@set.index(:non_exist).must_be_nil
|
19
|
+
end
|
20
|
+
|
21
|
+
it '#to_a should return array.' do
|
22
|
+
@set.push(:second)
|
23
|
+
@set.push(:third)
|
24
|
+
@set.to_a.must_equal [:first, :second, :third]
|
25
|
+
end
|
26
|
+
end
|
data/test/test_list.rb
CHANGED
@@ -1,195 +1,312 @@
|
|
1
1
|
require 'help'
|
2
2
|
|
3
3
|
describe List do
|
4
|
-
|
5
4
|
before do
|
6
|
-
@list = List.
|
7
|
-
@list2 = List.
|
5
|
+
@list = List.new(1, 2, 3, 4)
|
6
|
+
@list2 = List.new(4, 5, 7)
|
7
|
+
@empty_list = List.new
|
8
|
+
@numbers = List.new(*(1..10).to_a)
|
9
|
+
@even_numbers = List.new(2, 4, 6, 8, 10)
|
10
|
+
end
|
8
11
|
|
9
|
-
|
10
|
-
|
12
|
+
describe 'Empty list' do
|
13
|
+
it '#empty? should be true' do
|
14
|
+
assert @empty_list.empty?
|
15
|
+
end
|
16
|
+
|
17
|
+
it '#append should add element to list' do
|
18
|
+
@empty_list.append(8)
|
19
|
+
@empty_list.to_a.must_equal [8]
|
20
|
+
end
|
21
|
+
|
22
|
+
it '#unshift should add element to list' do
|
23
|
+
@empty_list.unshift(8)
|
24
|
+
@empty_list.to_a.must_equal [8]
|
25
|
+
end
|
26
|
+
|
27
|
+
it '#shift raises exception' do
|
28
|
+
proc { @empty_list.shift }.must_raise ListError
|
29
|
+
end
|
11
30
|
end
|
12
31
|
|
13
|
-
it
|
14
|
-
@list.must_be_kind_of List
|
32
|
+
it '#from_array should transform array to list.' do
|
33
|
+
@list.must_be_kind_of List
|
15
34
|
@list.length.must_equal 4
|
16
35
|
end
|
17
36
|
|
18
|
-
it
|
37
|
+
it '#clone returns new list with identical values' do
|
38
|
+
cloned = @list.clone
|
39
|
+
cloned.must_be_kind_of List
|
40
|
+
cloned.to_a.must_equal [1, 2, 3, 4]
|
41
|
+
@list[0] = 9
|
42
|
+
@list.to_a.must_equal [9, 2, 3, 4]
|
43
|
+
cloned.to_a.must_equal [1, 2, 3, 4]
|
44
|
+
end
|
45
|
+
|
46
|
+
it '#clear resets lists' do
|
47
|
+
@list.clear
|
48
|
+
@list.must_be_kind_of List
|
49
|
+
@list.to_a.must_equal []
|
50
|
+
@list.size.must_equal 0
|
51
|
+
end
|
52
|
+
|
53
|
+
it '#length should return list size.' do
|
19
54
|
@list.length.must_equal 4
|
20
55
|
@list2.length.must_equal 3
|
21
56
|
end
|
22
57
|
|
58
|
+
it '#get should return list element if element is on the list' do
|
59
|
+
x = @list.head.next
|
60
|
+
found = @list.get(x)
|
61
|
+
found.must_be_kind_of ListElement
|
62
|
+
end
|
63
|
+
|
64
|
+
it '#get! should raise error if element is not found on the list' do
|
65
|
+
x = @list2.head.next
|
66
|
+
proc { @list.get!(x) }.must_raise ListError
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'at returns element on given index' do
|
70
|
+
@list.at(2).data.must_equal 3
|
71
|
+
@list2.at(2).data.must_equal 7
|
72
|
+
@list.at(42).must_equal nil
|
73
|
+
@list.at(-1).data.must_equal 4
|
74
|
+
@list.at(-2).data.must_equal 3
|
75
|
+
@list.at(-4).data.must_equal 1
|
76
|
+
@list.at(-42).must_equal nil
|
77
|
+
end
|
78
|
+
|
79
|
+
it '#[] returns element on given index' do
|
80
|
+
@list[2].data.must_equal 3
|
81
|
+
@list2[2].data.must_equal 7
|
82
|
+
|
83
|
+
@list[1..2].map(&:data).must_equal [2, 3]
|
84
|
+
@list[1..8].map(&:data).must_equal [2, 3, 4]
|
85
|
+
@list[1, 2].map(&:data).must_equal [2, 3]
|
86
|
+
@list[1, 3].map(&:data).must_equal [2, 3, 4]
|
87
|
+
@list[2, 8].map(&:data).must_equal [3, 4]
|
88
|
+
end
|
89
|
+
|
90
|
+
it '#[] changes element on given index' do
|
91
|
+
@list[2] = 11
|
92
|
+
@list[2].data.must_equal 11
|
93
|
+
end
|
94
|
+
|
95
|
+
it '#[] replaces elelment with elements on Array' do
|
96
|
+
@list[3] = [0, 0]
|
97
|
+
@list.to_a.must_equal [1, 2, 3, 0, 0]
|
98
|
+
@list.size.must_equal 5
|
99
|
+
end
|
100
|
+
|
101
|
+
it '#[] replaces elements when passed Array and count' do
|
102
|
+
@list[1, 2] = [0, 0]
|
103
|
+
@list.to_a.must_equal [1, 0, 0, 4]
|
104
|
+
@list.size.must_equal 4
|
105
|
+
end
|
106
|
+
|
107
|
+
it '#[] replaces element when passed Array and count on list tail' do
|
108
|
+
@list[1, 3] = [0, 0, 0]
|
109
|
+
@list.to_a.must_equal [1, 0, 0, 0]
|
110
|
+
@list.size.must_equal 4
|
111
|
+
end
|
112
|
+
|
113
|
+
it '#[] replaces element when passed Array and range' do
|
114
|
+
@list[1..2] = [0, 0]
|
115
|
+
@list.to_a.must_equal [1, 0, 0, 4]
|
116
|
+
@list.size.must_equal 4
|
117
|
+
end
|
118
|
+
|
119
|
+
it '#[] should raise error when count or range is invalid' do
|
120
|
+
proc { @list[1, 8] = [0, 0] }.must_raise ListError
|
121
|
+
proc { @list[1, -1] = [0, 0] }.must_raise ListError
|
122
|
+
proc { @list[1..-1] = [0, 0] }.must_raise ListError
|
123
|
+
proc { @list[1..90] = [0, 0] }.must_raise ListError
|
124
|
+
proc { @list[1, 4] = [0, 0] }.must_raise ListError
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'replace element one with other' do
|
128
|
+
list = List.new(8, 9)
|
129
|
+
el = @list.at(2)
|
130
|
+
@list.replace(el, list)
|
131
|
+
@list.to_a.must_equal [1, 2, 8, 9, 4]
|
132
|
+
@list.size.must_equal 5
|
133
|
+
el = @list.at(0)
|
134
|
+
list = List.new(8, 9)
|
135
|
+
@list.replace(el, list)
|
136
|
+
@list.to_a.must_equal [8, 9, 2, 8, 9, 4]
|
137
|
+
@list.size.must_equal 6
|
138
|
+
|
139
|
+
list = List.new(8, 9)
|
140
|
+
el = @list.at(5)
|
141
|
+
@list.replace(el, list)
|
142
|
+
@list.to_a.must_equal [8, 9, 2, 8, 9, 8, 9]
|
143
|
+
@list.size.must_equal 7
|
144
|
+
end
|
145
|
+
|
146
|
+
it '#== returns true only if two lists are equal' do
|
147
|
+
@eq_list = List.new(1, 2, 3, 4)
|
148
|
+
@other_empty = List.new
|
149
|
+
assert @list == @eq_list
|
150
|
+
assert @eq_list == @list
|
151
|
+
refute @list == @empty_list
|
152
|
+
refute @list == @list2
|
153
|
+
assert @empty_list == @other_empty
|
154
|
+
end
|
155
|
+
|
156
|
+
it '#> returns true if first list is grater or longer than second' do
|
157
|
+
@smaller_list = List.new(1, 2, 2, 4)
|
158
|
+
assert @list > @smaller_list
|
159
|
+
@smaller_list2 = List.new(1, 2, 3)
|
160
|
+
assert @list > @smaller_list2
|
161
|
+
end
|
162
|
+
|
163
|
+
it '#< returns true if first list is smaller or shorter than second' do
|
164
|
+
@greater_list = List.new(1, 8, 3, 4)
|
165
|
+
assert @list < @greater_list
|
166
|
+
@greater_list2 = List.new(1, 2, 3, 4, 5)
|
167
|
+
assert @list < @greater_list2
|
168
|
+
end
|
23
169
|
|
24
|
-
it
|
170
|
+
it '#concat should join two lists into one' do
|
171
|
+
sum = @list.concat(@list2)
|
172
|
+
sum.to_a.must_equal [1, 2, 3, 4, 4, 5, 7]
|
173
|
+
assert sum == @list
|
174
|
+
end
|
175
|
+
|
176
|
+
it '#append should add element to the end of the list.' do
|
25
177
|
x = 5
|
26
178
|
@list.append(x)
|
27
179
|
@list.length.must_equal 5
|
28
|
-
@list.last.must_be_same_as x
|
180
|
+
@list.last.must_be_same_as x
|
29
181
|
end
|
30
182
|
|
31
|
-
it
|
183
|
+
it '#unshift should add element at the beginning of the list.' do
|
32
184
|
x = 0
|
33
|
-
@list.
|
185
|
+
@list.unshift(x)
|
34
186
|
@list.length.must_equal 5
|
35
187
|
@list.first.must_be_same_as x
|
36
188
|
end
|
37
189
|
|
38
|
-
it
|
190
|
+
it '#remove should remove element from list.' do
|
39
191
|
second = @list.head.next
|
192
|
+
third = second.next
|
193
|
+
forth = third.next
|
40
194
|
@list.remove(second)
|
41
|
-
@list.to_a.must_equal [1,3,4]
|
195
|
+
@list.to_a.must_equal [1, 3, 4]
|
196
|
+
@list.remove(@list.head)
|
197
|
+
@list.to_a.must_equal [3, 4]
|
198
|
+
@list.remove(forth)
|
199
|
+
@list.to_a.must_equal [3]
|
200
|
+
@list.remove(third)
|
201
|
+
@list.to_a.must_equal []
|
42
202
|
end
|
43
203
|
|
44
|
-
it
|
45
|
-
|
46
|
-
|
47
|
-
@list.
|
204
|
+
it '#pop should remove last list element.' do
|
205
|
+
last = @list.pop
|
206
|
+
last.must_equal 4
|
207
|
+
@list.last.must_equal 3
|
208
|
+
@list.to_a.must_equal [1, 2, 3]
|
209
|
+
end
|
48
210
|
|
49
|
-
|
50
|
-
@list.
|
211
|
+
it '#insert_before should insert new element before another.' do
|
212
|
+
second = @list.head.next
|
213
|
+
@list.insert_before(9, second)
|
214
|
+
@list.to_a.must_equal [1, 9, 2, 3, 4]
|
51
215
|
|
52
|
-
@list.insert_before(
|
53
|
-
@list.to_a.must_equal [8,1,9,2,3,
|
216
|
+
@list.insert_before(8, @list.head)
|
217
|
+
@list.to_a.must_equal [8, 1, 9, 2, 3, 4]
|
54
218
|
|
55
|
-
|
219
|
+
@list.insert_before(7, @list.tail)
|
220
|
+
@list.to_a.must_equal [8, 1, 9, 2, 3, 7, 4]
|
56
221
|
end
|
57
222
|
|
58
|
-
it
|
223
|
+
it '#insert_after should insert new element after another.' do
|
59
224
|
second = @list.head.next
|
60
|
-
@list.insert_after(9,second)
|
61
|
-
@list.to_a.must_equal [1,2,9,3,4]
|
225
|
+
@list.insert_after(9, second)
|
226
|
+
@list.to_a.must_equal [1, 2, 9, 3, 4]
|
62
227
|
|
63
228
|
tail = @list.tail
|
64
|
-
@list.insert_after(11,tail)
|
65
|
-
@list.to_a.must_equal [1,2,9,3,4,11]
|
229
|
+
@list.insert_after(11, tail)
|
230
|
+
@list.to_a.must_equal [1, 2, 9, 3, 4, 11]
|
66
231
|
end
|
67
232
|
|
68
|
-
|
69
|
-
|
70
|
-
@list.head.must_be_kind_of ListElement
|
233
|
+
it '#head should point to first element of the list.' do
|
234
|
+
@list.head.must_be_kind_of ListElement
|
71
235
|
@list2.head.must_be_kind_of ListElement
|
72
236
|
@list.head.data.must_equal 1
|
73
237
|
@list2.head.data.must_equal 4
|
74
238
|
end
|
75
239
|
|
76
|
-
it
|
77
|
-
@list.tail.must_be_kind_of ListElement
|
240
|
+
it '#tail sould point to last element of the list' do
|
241
|
+
@list.tail.must_be_kind_of ListElement
|
78
242
|
@list2.tail.must_be_kind_of ListElement
|
79
|
-
@list.tail.next.must_be_nil
|
243
|
+
@list.tail.next.must_be_nil
|
80
244
|
@list2.tail.next.must_be_nil
|
81
245
|
|
82
246
|
@list.tail.data.must_equal 4
|
83
247
|
@list2.tail.data.must_equal 7
|
84
248
|
end
|
85
249
|
|
86
|
-
it
|
250
|
+
it '#first should return value of the first list element.' do
|
87
251
|
@list.first.must_equal 1
|
88
252
|
@list2.first.must_equal 4
|
89
253
|
end
|
90
254
|
|
91
|
-
|
92
|
-
it "#last should return value of the last list element." do
|
255
|
+
it '#last should return value of the last list element.' do
|
93
256
|
@list.last.must_equal 4
|
94
257
|
@list2.last.must_equal 7
|
95
258
|
end
|
96
259
|
|
97
|
-
it
|
260
|
+
it '#zip? should check if two list are joined.' do
|
98
261
|
refute @list.zip?(@list2)
|
99
262
|
end
|
100
263
|
|
101
|
-
it
|
102
|
-
@list.reverse!.to_a.must_equal [4,3,2,1]
|
103
|
-
@list.reverse!.to_a.must_equal [1,2,3,4]
|
264
|
+
it '#reverse! should reverse list' do
|
265
|
+
@list.reverse!.to_a.must_equal [4, 3, 2, 1]
|
266
|
+
@list.reverse!.to_a.must_equal [1, 2, 3, 4]
|
104
267
|
@list.reverse!.length.must_equal 4
|
105
268
|
end
|
106
269
|
|
107
|
-
it
|
108
|
-
@list2.
|
109
|
-
|
110
|
-
|
111
|
-
it "#merge should be symetric operation." do
|
112
|
-
@list.merge(@list2).to_a.must_equal [1,2,3,4,4,5,7]
|
270
|
+
it '#looped? should check if list has cycle.' do
|
271
|
+
refute @list2.looped?
|
272
|
+
refute @list.looped?
|
113
273
|
end
|
114
274
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
275
|
+
it '#reverse_each should iterate list in reverse order.' do
|
276
|
+
arr = []
|
277
|
+
@list.reverse_each { |e| arr.push e.data }
|
278
|
+
arr.must_equal [4, 3, 2, 1]
|
119
279
|
end
|
120
280
|
|
121
|
-
it
|
122
|
-
|
123
|
-
@
|
124
|
-
|
125
|
-
|
126
|
-
it "#remove! should remove all elements that occur on the other list#2." do
|
127
|
-
@list2.remove!(@list).to_a.must_equal [5,7]
|
281
|
+
it '#each_with_index should iterate list.' do
|
282
|
+
h = {}
|
283
|
+
@list.each_with_index { |e, i| h[i] = e.data }
|
284
|
+
h.must_equal(0 => 1, 1 => 2, 2 => 3, 3 => 4)
|
128
285
|
end
|
129
286
|
|
130
|
-
it
|
131
|
-
|
132
|
-
refute @list.looped?
|
287
|
+
it '#take returns frist n elements form list' do
|
288
|
+
@list.take(2).map(&:data).must_equal [1, 2]
|
133
289
|
end
|
134
290
|
|
135
|
-
it
|
136
|
-
|
137
|
-
@list.each_with_index{|e,i| h[i] = e.data}
|
138
|
-
h.must_equal({0 => 1, 1 => 2, 2 => 3, 3 => 4})
|
291
|
+
it '#to_s should print list in human friendly format.' do
|
292
|
+
@list.to_s.must_equal '1=2=3=4'
|
139
293
|
end
|
140
294
|
|
141
|
-
it
|
142
|
-
@list.map
|
143
|
-
@list.inject(0){ |
|
144
|
-
@list.find { |e| e.data == 1.0
|
295
|
+
it 'should include Enumerable methods.' do
|
296
|
+
@list.map(&:data).must_equal [1, 2, 3, 4]
|
297
|
+
@list.inject(0) { |a, e| a + e.data }.must_equal 10
|
298
|
+
@list.find { |e| e.data == 1.0 }.data.must_equal 1
|
145
299
|
end
|
146
300
|
|
147
|
-
|
148
|
-
describe "Zipped list" do
|
149
|
-
|
301
|
+
describe 'Zipped list' do
|
150
302
|
before do
|
151
303
|
last = @list.tail
|
152
|
-
@zipped = List.
|
304
|
+
@zipped = List.new(1, 2)
|
153
305
|
@zipped.tail = last
|
154
306
|
end
|
155
307
|
|
156
|
-
it
|
308
|
+
it '#zip? should return true' do
|
157
309
|
assert @list.zip?(@zipped)
|
158
310
|
end
|
159
|
-
|
160
|
-
end
|
161
|
-
|
162
|
-
if ENV['BENCH']
|
163
|
-
describe "performance" do
|
164
|
-
|
165
|
-
before do
|
166
|
-
@arr = (1..10_000).to_a.sort_by{rand}
|
167
|
-
|
168
|
-
10000.times do |n|
|
169
|
-
@list.append 4
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
|
174
|
-
bench_performance_constant "#append should be const operation.", 0.999 do |n|
|
175
|
-
n.times do
|
176
|
-
@list.append 3
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
bench_performance_constant "#prepend should be const operation.", 0.999 do |n|
|
181
|
-
n.times do
|
182
|
-
@list.prepend 3
|
183
|
-
end
|
184
|
-
end
|
185
|
-
|
186
|
-
bench_performance_linear "#reverse! should be linear operation.", 0.999 do |n|
|
187
|
-
list =List.from_array(@arr[0..n])
|
188
|
-
list.reverse!
|
189
|
-
end
|
190
|
-
|
191
|
-
end
|
192
311
|
end
|
193
|
-
|
194
312
|
end
|
195
|
-
|