datastructures 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. data/README.md +118 -2
  2. data/lib/datastructures.rb +4 -1
  3. data/lib/datastructures/adjacency_list.rb +82 -0
  4. data/lib/datastructures/linked_list.rb +179 -0
  5. data/lib/datastructures/tree_node.rb +73 -0
  6. data/lib/datastructures/version.rb +2 -2
  7. data/test/benchmarks.rb +36 -0
  8. data/test/coverage/assets/0.7.1/application.css +1110 -0
  9. data/test/coverage/assets/0.7.1/application.js +626 -0
  10. data/test/coverage/assets/0.7.1/fancybox/blank.gif +0 -0
  11. data/test/coverage/assets/0.7.1/fancybox/fancy_close.png +0 -0
  12. data/test/coverage/assets/0.7.1/fancybox/fancy_loading.png +0 -0
  13. data/test/coverage/assets/0.7.1/fancybox/fancy_nav_left.png +0 -0
  14. data/test/coverage/assets/0.7.1/fancybox/fancy_nav_right.png +0 -0
  15. data/test/coverage/assets/0.7.1/fancybox/fancy_shadow_e.png +0 -0
  16. data/test/coverage/assets/0.7.1/fancybox/fancy_shadow_n.png +0 -0
  17. data/test/coverage/assets/0.7.1/fancybox/fancy_shadow_ne.png +0 -0
  18. data/test/coverage/assets/0.7.1/fancybox/fancy_shadow_nw.png +0 -0
  19. data/test/coverage/assets/0.7.1/fancybox/fancy_shadow_s.png +0 -0
  20. data/test/coverage/assets/0.7.1/fancybox/fancy_shadow_se.png +0 -0
  21. data/test/coverage/assets/0.7.1/fancybox/fancy_shadow_sw.png +0 -0
  22. data/test/coverage/assets/0.7.1/fancybox/fancy_shadow_w.png +0 -0
  23. data/test/coverage/assets/0.7.1/fancybox/fancy_title_left.png +0 -0
  24. data/test/coverage/assets/0.7.1/fancybox/fancy_title_main.png +0 -0
  25. data/test/coverage/assets/0.7.1/fancybox/fancy_title_over.png +0 -0
  26. data/test/coverage/assets/0.7.1/fancybox/fancy_title_right.png +0 -0
  27. data/test/coverage/assets/0.7.1/fancybox/fancybox-x.png +0 -0
  28. data/test/coverage/assets/0.7.1/fancybox/fancybox-y.png +0 -0
  29. data/test/coverage/assets/0.7.1/fancybox/fancybox.png +0 -0
  30. data/test/coverage/assets/0.7.1/favicon_green.png +0 -0
  31. data/test/coverage/assets/0.7.1/favicon_red.png +0 -0
  32. data/test/coverage/assets/0.7.1/favicon_yellow.png +0 -0
  33. data/test/coverage/assets/0.7.1/loading.gif +0 -0
  34. data/test/coverage/assets/0.7.1/magnify.png +0 -0
  35. data/test/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  36. data/test/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  37. data/test/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  38. data/test/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  39. data/test/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  40. data/test/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  41. data/test/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  42. data/test/coverage/assets/0.7.1/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  43. data/test/coverage/assets/0.7.1/smoothness/images/ui-icons_222222_256x240.png +0 -0
  44. data/test/coverage/assets/0.7.1/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  45. data/test/coverage/assets/0.7.1/smoothness/images/ui-icons_454545_256x240.png +0 -0
  46. data/test/coverage/assets/0.7.1/smoothness/images/ui-icons_888888_256x240.png +0 -0
  47. data/test/coverage/assets/0.7.1/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  48. data/test/coverage/index.html +72 -0
  49. data/test/test_adjacency_list.rb +79 -0
  50. data/test/test_datastructures.rb +5 -1
  51. data/test/test_linked_list.rb +96 -0
  52. data/test/test_stack.rb +1 -1
  53. data/test/test_tree.rb +77 -0
  54. metadata +68 -3
@@ -0,0 +1,72 @@
1
+ <!DOCTYPE html>
2
+ <html xmlns='http://www.w3.org/1999/xhtml'>
3
+ <head>
4
+ <title>Code coverage for Test</title>
5
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
6
+ <script src='./assets/0.7.1/application.js' type='text/javascript'></script>
7
+ <link href='./assets/0.7.1/application.css' media='screen, projection, print' rel='stylesheet' type='text/css'>
8
+ <link rel="shortcut icon" type="image/png" href="./assets/0.7.1/favicon_green.png" />
9
+ <link rel="icon" type="image/png" href="./assets/0.7.1/favicon.png" />
10
+ </head>
11
+
12
+ <body>
13
+ <div id="loading">
14
+ <img src="./assets/0.7.1/loading.gif" alt="loading"/>
15
+ </div>
16
+ <div id="wrapper" style="display:none;">
17
+ <div class="timestamp">Generated <abbr class="timeago" title="2013-08-26T20:50:25+01:00">2013-08-26T20:50:25+01:00</abbr></div>
18
+ <ul class="group_tabs"></ul>
19
+
20
+ <div id="content">
21
+ <div class="file_list_container" id="AllFiles">
22
+ <h2>
23
+ <span class="group_name">All Files</span>
24
+ (<span class="covered_percent"><span class="green">100.0%</span></span>
25
+ covered at
26
+ <span class="covered_strength">
27
+ <span class="red">
28
+ 0.0
29
+ </span>
30
+ </span> hits/line)
31
+ </h2>
32
+ <a name="AllFiles"></a>
33
+ <div>
34
+ <b>0</b> files in total.
35
+ <b>0.0</b> relevant lines.
36
+ <span class="green"><b>0.0</b> lines covered</span> and
37
+ <span class="red"><b>0.0</b> lines missed </span>
38
+ </div>
39
+ <table class="file_list">
40
+ <thead>
41
+ <tr>
42
+ <th>File</th>
43
+ <th>% covered</th>
44
+ <th>Lines</th>
45
+ <th>Relevant Lines</th>
46
+ <th>Lines covered</th>
47
+ <th>Lines missed</th>
48
+ <th>Avg. Hits / Line</th>
49
+ </tr>
50
+ </thead>
51
+ <tbody>
52
+
53
+ </tbody>
54
+ </table>
55
+ </div>
56
+
57
+
58
+
59
+ </div>
60
+
61
+ <div id="footer">
62
+ Generated by <a href="http://github.com/colszowka/simplecov">simplecov</a> v0.7.1
63
+ and simplecov-html v0.7.1<br/>
64
+ using Unit Tests
65
+ </div>
66
+
67
+ <div class="source_files">
68
+
69
+ </div>
70
+ </div>
71
+ </body>
72
+ </html>
@@ -0,0 +1,79 @@
1
+ require 'test_datastructures'
2
+
3
+ class TestAdjacencyList < Test::Unit::TestCase
4
+
5
+ context "AdjacencyList" do
6
+
7
+ setup do
8
+ @al = DataStructures::AdjacencyList.new
9
+ end
10
+
11
+ should "allow handling nodes by name" do
12
+ @al = DataStructures::AdjacencyList.new(true)
13
+ a = {
14
+ :one => ['content 1', [:two]],
15
+ :two => ['content 2', [:three]],
16
+ :three => ['content 3', [:one]]
17
+ }
18
+ a.each_pair do |name, data|
19
+ value, edges = data
20
+ @al.add(value, name, edges)
21
+ end
22
+
23
+ a.each_pair do |name, data|
24
+ value, edges = data
25
+
26
+ assert_equal value, @al.get_node_value(name), "node #{name} should know its value"
27
+ assert_equal @al.neighbours(name), edges, "edges set should be in neighbours for node #{name}"
28
+ assert @al.adjacent?(name, edges.first), "node #{name} is adjacent to neighbour"
29
+ end
30
+
31
+ @al.delete_edge(:one, :two)
32
+ assert_equal @al.neighbours(:one), [], "deleting edge removes neighbour"
33
+ assert !@al.adjacent?(:one, :two), "deleting edge removes adjacency"
34
+ end
35
+
36
+ should "allow handling nodes by index" do
37
+ a = {
38
+ 1 => ['content 1', [2]],
39
+ 2 => ['content 2', [3]],
40
+ 3 => ['content 3', [1]]
41
+ }
42
+ a.each_pair do |name, data|
43
+ value, edges = data
44
+ @al.add(value, name, edges)
45
+ end
46
+
47
+ a.each_pair do |name, data|
48
+ value, edges = data
49
+
50
+ assert_equal value, @al.get_node_value(name), "node #{name} should know its value"
51
+ assert_equal @al.neighbours(name), edges, "edges set should be in neighbours for node #{name}"
52
+ assert @al.adjacent?(name, edges.first), "node #{name} is adjacent to neighbour"
53
+ end
54
+
55
+ @al.delete_edge(1, 2)
56
+ assert_equal @al.neighbours(1), [], "deleting edge removes neighbour"
57
+ assert !@al.adjacent?(1, 2), "deleting edge removes adjacency"
58
+ end
59
+
60
+ should "allow node manipulation" do
61
+ @al.add('test node', 1)
62
+
63
+ assert_equal 'test node', @al.get_node_value(1), "node starts with assigned value"
64
+ @al.set_node_value(1, 'changed value')
65
+ assert_equal 'changed value', @al.get_node_value(1), "setting node value changes it"
66
+
67
+ assert_equal [], @al.neighbours(1), "node starts with no neighbours"
68
+ @al.add_edge(1, 2)
69
+ assert_equal [2], @al.neighbours(1), "adding an edge makes target a neighbour"
70
+
71
+ @al.delete(1)
72
+ assert_raise NoMethodError, "accessing a deleted node throws an error" do
73
+ @al.get_node_value(1)
74
+ end
75
+ end
76
+
77
+ end # AdjacencyList context
78
+
79
+ end # TestAdjacencyList
@@ -8,5 +8,9 @@ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
8
8
  SimpleCov.start
9
9
 
10
10
  require 'test/unit'
11
- require 'shoulda'
11
+ begin; require 'turn/autorun'; rescue LoadError; end
12
+ require 'shoulda-context'
12
13
  require 'datastructures'
14
+
15
+ Turn.config.format = :pretty
16
+ Turn.config.trace = 1
@@ -0,0 +1,96 @@
1
+ require 'test_datastructures'
2
+
3
+ class TestLinkedList < Test::Unit::TestCase
4
+
5
+ context "LinkedList" do
6
+
7
+ setup do
8
+ @ll = DataStructures::LinkedList.new
9
+ end
10
+
11
+ should "start empty" do
12
+ assert @ll.empty?, "should start empty"
13
+ assert_equal [].to_s, @ll.to_s, "string representation of empty list matches empty array"
14
+ end
15
+
16
+ should "be able to create with a single element" do
17
+ @ll = DataStructures::LinkedList.new('test')
18
+ assert_equal 1, @ll.size, "should have size 1 after adding 1"
19
+ end
20
+
21
+ should "be able to create with multiple elements" do
22
+ @ll = DataStructures::LinkedList.new(1,2,3,4)
23
+ assert_equal 4, @ll.size, "should have size 4 after adding 4"
24
+ end
25
+
26
+ should "allow enumeration with a block" do
27
+ a = [1, 2, 3, 4]
28
+ @ll = DataStructures::LinkedList.new(*a)
29
+ i = 0
30
+ @ll.each do |value|
31
+ assert_equal a[i], value, "enumeration elements at #{i} should match"
32
+ i += 1
33
+ end
34
+ end
35
+
36
+ should "allow assignment, insertion, retrieval and deletion" do
37
+ @ll << 'test'
38
+ assert_equal 'test', @ll.first.data, 'single element is first'
39
+ assert_equal 'test', @ll.last.data, 'single element is last'
40
+
41
+ @ll[1] = 'another test'
42
+ @ll[3] = 'yet another'
43
+ assert_equal 'another test', @ll[1], "indexed assignment and retrieval match"
44
+
45
+ assert_equal 0, @ll.index('test'), "correct index gets returned for pushed item"
46
+ assert_equal 1, @ll.index('another test'), "correct index gets returned for assigned item"
47
+ assert @ll[2].nil?, "assignment > highest index should fill in with nil"
48
+
49
+ @ll[2] = 'replacement'
50
+ assert_equal 'replacement', @ll[2], "filled-in nils can be replaced with values"
51
+
52
+ @ll.insert(1, 'inserted data')
53
+ assert_equal @ll[1], 'inserted data', "insertion set the value at index"
54
+ assert_equal @ll[2], 'another test', "insertion moves existing values along"
55
+
56
+ @ll.delete(2)
57
+ assert_equal 'replacement', @ll[2], 'deletion moves subsequent elements back one'
58
+ end
59
+
60
+ should "allow chained assignment" do
61
+ @ll.push(1).push(2).push(3).push(4)
62
+ assert_equal [1,2,3,4], @ll.to_a
63
+ end
64
+
65
+ should "act as a queue" do
66
+ a = [1, 2, 3, 4]
67
+ @ll.push(*a)
68
+ 4.times do |i|
69
+ assert_equal a[i], @ll.shift, "#{i}th item in should be #{i}th in queue"
70
+ end
71
+ end
72
+
73
+ should "act as a stack" do
74
+ a = [1, 2, 3, 4]
75
+ @ll.push(*a)
76
+ 4.times do |i|
77
+ assert_equal a[3 - i], @ll.pop, "#{i}th item in should be #{3 - i}th in stack"
78
+ end
79
+ end
80
+
81
+ should "act as an inverse stack" do
82
+ a = [1, 2, 3, 4]
83
+ @ll.unshift(*a)
84
+ 4.times do |i|
85
+ assert_equal a[3 - i], @ll.shift, "#{i}th item in should be #{3 - i}th in inverse stack"
86
+ end
87
+ end
88
+
89
+ should "fail to find index for non-contained data" do
90
+ @ll.push(1,2,3,4)
91
+ assert @ll.index(5).nil?, "index should be nil when data not found"
92
+ end
93
+
94
+ end # LinkedList context
95
+
96
+ end # TestLinkedList
@@ -2,7 +2,7 @@ require 'test_datastructures'
2
2
 
3
3
  class TestStack < Test::Unit::TestCase
4
4
 
5
- context "stack" do
5
+ context "Stack" do
6
6
 
7
7
  setup do
8
8
  @stack = DataStructures::Stack.new
@@ -0,0 +1,77 @@
1
+ require 'test_datastructures'
2
+
3
+ class TestTreeNode < Test::Unit::TestCase
4
+
5
+ context "TestTreeNode" do
6
+
7
+ setup do
8
+ @tree = DataStructures::TreeNode.new('grandmother')
9
+ end
10
+
11
+ should "be able to create a new instance" do
12
+ @tree = DataStructures::TreeNode.new('')
13
+ end
14
+
15
+ should "begin empty" do
16
+ assert @tree.empty?, "knows it's empty"
17
+ assert @tree.child_count == 0, "0 children in empty tree"
18
+ assert @tree.is_leaf?, "an empty tree is a leaf"
19
+ end
20
+
21
+ should "be able to add, recognise and remove children" do
22
+ child = DataStructures::TreeNode.new('child')
23
+ assert @tree.is_leaf?, "should start out as leaf"
24
+
25
+ @tree.add_child child
26
+ assert_equal @tree.child_count, 1, "child count should be 1"
27
+ assert !@tree.is_leaf?, "should no longer be leaf"
28
+ assert_equal @tree.children.first, child, "only child should be the one just added"
29
+
30
+ @tree.remove_child! child
31
+ assert_not_include @tree.children, child, "deleted child is forgotten by parent"
32
+ end
33
+
34
+ should "know its family tree" do
35
+ # make a happy family
36
+ mother = DataStructures::TreeNode.new('the mother')
37
+ daughter = DataStructures::TreeNode.new('the daughter')
38
+ son = DataStructures::TreeNode.new('the son')
39
+ mother.add_child daughter
40
+ mother.add_child son
41
+ uncle = DataStructures::TreeNode.new('the uncle')
42
+ cousin = DataStructures::TreeNode.new('the cousin')
43
+ uncle << cousin
44
+ @tree << mother
45
+ @tree << uncle
46
+
47
+ assert_equal @tree.siblings, nil, "grandmother has no siblings :("
48
+
49
+ [mother, daughter, son, uncle, cousin].each do |descendent|
50
+ assert_include @tree.descendents, descendent, "should recognise #{descendent.data} as descendent"
51
+ end
52
+
53
+ assert_not_include mother.siblings, mother, "mother not her own sibling"
54
+ assert_not_include son.siblings, son, "son not his own sibling"
55
+
56
+ assert_equal uncle, mother.siblings.first, "mother sees uncle as sibling"
57
+ assert_equal mother, uncle.siblings.first, "uncle sees mother as sibling"
58
+ assert_equal son, daughter.siblings.first, "daughter sees son as sibling"
59
+ assert_equal daughter, son.siblings.first, "son sees daughter as sibling"
60
+
61
+ assert_equal daughter.parent, mother, "daughter recogises her own mother"
62
+ assert_equal mother.parent, @tree, "mother knows grandmother is her mother"
63
+ assert_equal cousin.parent.parent, @tree, "cousin recognises her own grandmother"
64
+
65
+ assert son.is_leaf?
66
+ assert !mother.is_leaf?
67
+ assert !@tree.is_leaf?
68
+ assert @tree.is_root?
69
+
70
+ @tree.clear
71
+ assert @tree.empty?
72
+ assert @tree.is_leaf?
73
+ end
74
+
75
+ end # Tree context
76
+
77
+ end # TestTree
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datastructures
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,10 +9,26 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-08-20 00:00:00.000000000 Z
12
+ date: 2013-08-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: turn
16
32
  requirement: !ruby/object:Gem::Requirement
17
33
  none: false
18
34
  requirements:
@@ -83,17 +99,66 @@ extensions: []
83
99
  extra_rdoc_files: []
84
100
  files:
85
101
  - Rakefile
102
+ - lib/datastructures/adjacency_list.rb
103
+ - lib/datastructures/linked_list.rb
86
104
  - lib/datastructures/queue.rb
87
105
  - lib/datastructures/stack.rb
106
+ - lib/datastructures/tree_node.rb
88
107
  - lib/datastructures/version.rb
89
108
  - lib/datastructures.rb
109
+ - test/benchmarks.rb
110
+ - test/coverage/assets/0.7.1/application.css
111
+ - test/coverage/assets/0.7.1/application.js
112
+ - test/coverage/assets/0.7.1/fancybox/blank.gif
113
+ - test/coverage/assets/0.7.1/fancybox/fancy_close.png
114
+ - test/coverage/assets/0.7.1/fancybox/fancy_loading.png
115
+ - test/coverage/assets/0.7.1/fancybox/fancy_nav_left.png
116
+ - test/coverage/assets/0.7.1/fancybox/fancy_nav_right.png
117
+ - test/coverage/assets/0.7.1/fancybox/fancy_shadow_e.png
118
+ - test/coverage/assets/0.7.1/fancybox/fancy_shadow_n.png
119
+ - test/coverage/assets/0.7.1/fancybox/fancy_shadow_ne.png
120
+ - test/coverage/assets/0.7.1/fancybox/fancy_shadow_nw.png
121
+ - test/coverage/assets/0.7.1/fancybox/fancy_shadow_s.png
122
+ - test/coverage/assets/0.7.1/fancybox/fancy_shadow_se.png
123
+ - test/coverage/assets/0.7.1/fancybox/fancy_shadow_sw.png
124
+ - test/coverage/assets/0.7.1/fancybox/fancy_shadow_w.png
125
+ - test/coverage/assets/0.7.1/fancybox/fancy_title_left.png
126
+ - test/coverage/assets/0.7.1/fancybox/fancy_title_main.png
127
+ - test/coverage/assets/0.7.1/fancybox/fancy_title_over.png
128
+ - test/coverage/assets/0.7.1/fancybox/fancy_title_right.png
129
+ - test/coverage/assets/0.7.1/fancybox/fancybox-x.png
130
+ - test/coverage/assets/0.7.1/fancybox/fancybox-y.png
131
+ - test/coverage/assets/0.7.1/fancybox/fancybox.png
132
+ - test/coverage/assets/0.7.1/favicon_green.png
133
+ - test/coverage/assets/0.7.1/favicon_red.png
134
+ - test/coverage/assets/0.7.1/favicon_yellow.png
135
+ - test/coverage/assets/0.7.1/loading.gif
136
+ - test/coverage/assets/0.7.1/magnify.png
137
+ - test/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
138
+ - test/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
139
+ - test/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
140
+ - test/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
141
+ - test/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_dadada_1x400.png
142
+ - test/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
143
+ - test/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
144
+ - test/coverage/assets/0.7.1/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
145
+ - test/coverage/assets/0.7.1/smoothness/images/ui-icons_222222_256x240.png
146
+ - test/coverage/assets/0.7.1/smoothness/images/ui-icons_2e83ff_256x240.png
147
+ - test/coverage/assets/0.7.1/smoothness/images/ui-icons_454545_256x240.png
148
+ - test/coverage/assets/0.7.1/smoothness/images/ui-icons_888888_256x240.png
149
+ - test/coverage/assets/0.7.1/smoothness/images/ui-icons_cd0a0a_256x240.png
150
+ - test/coverage/index.html
151
+ - test/test_adjacency_list.rb
90
152
  - test/test_datastructures.rb
153
+ - test/test_linked_list.rb
91
154
  - test/test_queue.rb
92
155
  - test/test_stack.rb
156
+ - test/test_tree.rb
93
157
  - README.md
94
158
  - LICENSE
95
159
  homepage: https://github.com/Blahah/datastructures
96
- licenses: []
160
+ licenses:
161
+ - MIT
97
162
  post_install_message:
98
163
  rdoc_options: []
99
164
  require_paths: