fathom 0.3.7 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.autotest +7 -5
- data/.document +2 -2
- data/Gemfile +9 -10
- data/{LICENSE → LICENSE.txt} +1 -1
- data/README.md +29 -90
- data/Rakefile +34 -32
- data/VERSION +1 -1
- data/fathom.gemspec +105 -0
- data/features/fathom.feature +26 -0
- data/features/step_definitions/fathom_steps.rb +23 -0
- data/features/support/env.rb +13 -0
- data/lib/ext/array.rb +6 -2
- data/lib/ext/string.rb +86 -7
- data/lib/fathom.rb +51 -88
- data/lib/fathom/behaviors/attribute_system.rb +91 -0
- data/lib/fathom/behaviors/context_behavior.rb +28 -0
- data/lib/fathom/behaviors/plugins.rb +16 -0
- data/lib/fathom/contexts/network_population.rb +47 -0
- data/lib/fathom/contexts/network_traversal.rb +4 -0
- data/lib/fathom/data/adjacency_matrix.rb +27 -0
- data/lib/fathom/data/definition.rb +22 -0
- data/lib/fathom/data/edge.rb +58 -0
- data/lib/fathom/data/network.rb +35 -0
- data/lib/fathom/data/outcome.rb +30 -0
- data/lib/fathom/data/property.rb +31 -0
- data/lib/fathom/data/variable.rb +59 -0
- data/lib/fathom/roles/general_graph_tools.rb +87 -0
- data/lib/fathom/roles/network_builder.rb +61 -0
- data/spec/fathom/behaviors/attribute_system_spec.rb +141 -0
- data/spec/fathom/behaviors/context_behavior_spec.rb +15 -0
- data/spec/fathom/behaviors/plugins_spec.rb +80 -0
- data/spec/fathom/contexts/network_population_spec.rb +55 -0
- data/spec/fathom/contexts/network_traversal_spec.rb +11 -0
- data/spec/fathom/data/adjacency_matrix_spec.rb +42 -0
- data/spec/fathom/data/definition_spec.rb +19 -0
- data/spec/fathom/data/edge_spec.rb +77 -0
- data/spec/fathom/data/network_spec.rb +72 -0
- data/spec/fathom/data/outcome_spec.rb +17 -0
- data/spec/fathom/data/property_spec.rb +17 -0
- data/spec/fathom/data/variable_spec.rb +101 -0
- data/spec/fathom/ext/array_spec.rb +17 -0
- data/spec/fathom/ext/string_spec.rb +90 -0
- data/spec/fathom/roles/general_graph_tools_spec.rb +95 -0
- data/spec/fathom/roles/network_builder_spec.rb +90 -0
- data/spec/fathom_spec.rb +28 -49
- data/spec/spec_helper.rb +7 -11
- data/spec/support/context_behavior.rb +14 -0
- data/spec/support/custom_matchers.rb +12 -0
- data/spec/support/files.rb +8 -0
- data/spec/support/network.yml +42 -0
- metadata +133 -174
- data/.bundle/config +0 -2
- data/.gitignore +0 -6
- data/Gemfile.lock +0 -42
- data/TODO.md +0 -127
- data/autotest/discover.rb +0 -1
- data/lib/ext/faster_csv.rb +0 -1
- data/lib/ext/open_struct.rb +0 -17
- data/lib/fathom/agent.rb +0 -48
- data/lib/fathom/agent/agent_cluster.rb +0 -23
- data/lib/fathom/agent/properties.rb +0 -48
- data/lib/fathom/archive/causal_graph.rb +0 -12
- data/lib/fathom/archive/concept.rb +0 -83
- data/lib/fathom/archive/conditional_probability_matrix.rb +0 -119
- data/lib/fathom/archive/inverter.rb +0 -20
- data/lib/fathom/archive/n2.rb +0 -198
- data/lib/fathom/archive/n3.rb +0 -119
- data/lib/fathom/archive/node.rb +0 -97
- data/lib/fathom/archive/noodle.rb +0 -136
- data/lib/fathom/archive/scratch.rb +0 -45
- data/lib/fathom/distributions.rb +0 -8
- data/lib/fathom/distributions/discrete_gaussian.rb +0 -44
- data/lib/fathom/distributions/discrete_uniform.rb +0 -25
- data/lib/fathom/distributions/gaussian.rb +0 -46
- data/lib/fathom/distributions/uniform.rb +0 -35
- data/lib/fathom/import.rb +0 -85
- data/lib/fathom/import/csv_import.rb +0 -59
- data/lib/fathom/import/import_node.rb +0 -17
- data/lib/fathom/import/yaml_import.rb +0 -74
- data/lib/fathom/knowledge_base.rb +0 -46
- data/lib/fathom/knowledge_base/search.rb +0 -19
- data/lib/fathom/monte_carlo_set.rb +0 -152
- data/lib/fathom/node.rb +0 -139
- data/lib/fathom/node/belief_node.rb +0 -121
- data/lib/fathom/node/cpm_node.rb +0 -100
- data/lib/fathom/node/data_collection.rb +0 -97
- data/lib/fathom/node/data_node.rb +0 -22
- data/lib/fathom/node/decision.rb +0 -11
- data/lib/fathom/node/discrete_node.rb +0 -41
- data/lib/fathom/node/fact.rb +0 -24
- data/lib/fathom/node/mc_node.rb +0 -70
- data/lib/fathom/node/node_extensions/enforced_name.rb +0 -12
- data/lib/fathom/node/node_extensions/numeric_methods.rb +0 -68
- data/lib/fathom/node/plausible_range.rb +0 -98
- data/lib/fathom/simulation.rb +0 -59
- data/lib/fathom/simulation/tick_methods.rb +0 -25
- data/lib/fathom/simulation/tick_simulation.rb +0 -12
- data/lib/fathom/value_description.rb +0 -79
- data/lib/options_hash.rb +0 -186
- data/spec/ext/array_spec.rb +0 -10
- data/spec/ext/faster_csv_spec.rb +0 -10
- data/spec/ext/open_struct_spec.rb +0 -20
- data/spec/ext/string_spec.rb +0 -7
- data/spec/fathom/agent/agent_cluster_spec.rb +0 -17
- data/spec/fathom/agent_spec.rb +0 -51
- data/spec/fathom/distributions/discrete_gaussian_spec.rb +0 -64
- data/spec/fathom/distributions/discrete_uniform_spec.rb +0 -0
- data/spec/fathom/distributions/gaussian_spec.rb +0 -64
- data/spec/fathom/distributions/uniform_spec.rb +0 -0
- data/spec/fathom/import/csv_import_spec.rb +0 -52
- data/spec/fathom/import/import_node_spec.rb +0 -10
- data/spec/fathom/import/yaml_import_spec.rb +0 -73
- data/spec/fathom/import_spec.rb +0 -36
- data/spec/fathom/knowledge_base_spec.rb +0 -20
- data/spec/fathom/monte_carlo_set_spec.rb +0 -149
- data/spec/fathom/node/belief_node_spec.rb +0 -180
- data/spec/fathom/node/cpm_node_spec.rb +0 -144
- data/spec/fathom/node/data_collection_spec.rb +0 -26
- data/spec/fathom/node/data_node_spec.rb +0 -102
- data/spec/fathom/node/decision_spec.rb +0 -15
- data/spec/fathom/node/discrete_node_spec.rb +0 -56
- data/spec/fathom/node/fact_spec.rb +0 -33
- data/spec/fathom/node/mc_node_spec.rb +0 -66
- data/spec/fathom/node/node_extensions/enforced_name_spec.rb +0 -15
- data/spec/fathom/node/node_extensions/numeric_methods_spec.rb +0 -124
- data/spec/fathom/node/plausible_range_spec.rb +0 -151
- data/spec/fathom/node_spec.rb +0 -172
- data/spec/fathom/simulation/tick_simulation_spec.rb +0 -32
- data/spec/fathom/simulation_spec.rb +0 -24
- data/spec/fathom/value_description_spec.rb +0 -70
- data/spec/support/demo.yml +0 -17
- data/spec/support/demo_agent.rb +0 -8
- data/spec/support/dummy_numeric_node.rb +0 -8
- data/spec/support/fact.yml +0 -11
@@ -1,15 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
|
2
|
-
|
3
|
-
include Fathom::Distributions
|
4
|
-
|
5
|
-
class DemoEnforcedNameNode < Fathom::Node
|
6
|
-
include EnforcedName
|
7
|
-
end
|
8
|
-
|
9
|
-
describe EnforcedName do
|
10
|
-
|
11
|
-
it "should ensure that we have a name as a UID if one is not provided" do
|
12
|
-
n = DemoEnforcedNameNode.new
|
13
|
-
n.name.should_not be_nil
|
14
|
-
end
|
15
|
-
end
|
@@ -1,124 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
|
2
|
-
|
3
|
-
include Fathom
|
4
|
-
|
5
|
-
describe NumericMethods do
|
6
|
-
|
7
|
-
before(:all) do
|
8
|
-
@values = [1,2,3]
|
9
|
-
@vector = GSL::Vector.ary_to_gv(@values)
|
10
|
-
@opts = {:values => @values}
|
11
|
-
end
|
12
|
-
|
13
|
-
before do
|
14
|
-
@n = Distributions::DummyNumericNode.new(@opts)
|
15
|
-
end
|
16
|
-
|
17
|
-
it "should respond to a rand method" do
|
18
|
-
@n = Distributions::DummyNumericNode.new
|
19
|
-
@n.should be_respond_to(:rand)
|
20
|
-
end
|
21
|
-
|
22
|
-
it "should be able to construct a vector from the values" do
|
23
|
-
@n.vector.should ==(@vector)
|
24
|
-
end
|
25
|
-
|
26
|
-
it "should have a standard deviation if it has a vector" do
|
27
|
-
@n.standard_deviation.should eql(@vector.sd)
|
28
|
-
end
|
29
|
-
|
30
|
-
it "should have std and sd aliases for standard deviation" do
|
31
|
-
@n.sd.should eql(@n.standard_deviation)
|
32
|
-
@n.std.should eql(@n.standard_deviation)
|
33
|
-
end
|
34
|
-
|
35
|
-
it "should not raise an error when looking for a standard deviation and there is no vector" do
|
36
|
-
@n = Distributions::DummyNumericNode.new
|
37
|
-
@n.vector.should be_nil
|
38
|
-
@n.sd.should be_nil
|
39
|
-
end
|
40
|
-
|
41
|
-
it "should have a mean if it has a vector" do
|
42
|
-
@n.mean.should eql(@vector.mean)
|
43
|
-
end
|
44
|
-
|
45
|
-
it "should return nil for mean if it doesn't have a vector" do
|
46
|
-
@n = Distributions::DummyNumericNode.new
|
47
|
-
@n.mean.should be_nil
|
48
|
-
end
|
49
|
-
|
50
|
-
it "should provide rand, if it has a vector" do
|
51
|
-
Distributions::Gaussian.should_receive(:rand).and_return(0.5)
|
52
|
-
@n.rand
|
53
|
-
end
|
54
|
-
|
55
|
-
it "should return nil for rand if it doesn't have a vector" do
|
56
|
-
@n = Distributions::DummyNumericNode.new
|
57
|
-
@n.mean.should be_nil
|
58
|
-
end
|
59
|
-
|
60
|
-
it "should be able to calculate the inverse_cdf, lower_bound, upper_bound and interval_values" do
|
61
|
-
lambda{@n.inverse_cdf}.should_not raise_error
|
62
|
-
lambda{@n.lower_bound}.should_not raise_error
|
63
|
-
lambda{@n.upper_bound}.should_not raise_error
|
64
|
-
lambda{@n.interval_values}.should_not raise_error
|
65
|
-
end
|
66
|
-
|
67
|
-
it "should pass the mean and standard deviation to the distribution when calculating an inverse_cdf" do
|
68
|
-
@n.inverse_cdf.should eql(Distributions::Gaussian.inverse_cdf(:mean => @n.mean, :sd => @n.sd))
|
69
|
-
end
|
70
|
-
|
71
|
-
it "should pass the mean and standard deviation to the distribution when calculating an lower_bound" do
|
72
|
-
@n.lower_bound.should eql(Distributions::Gaussian.lower_bound(:mean => @n.mean, :sd => @n.sd))
|
73
|
-
end
|
74
|
-
|
75
|
-
it "should pass the mean and standard deviation to the distribution when calculating an upper_bound" do
|
76
|
-
@n.upper_bound.should eql(Distributions::Gaussian.upper_bound(:mean => @n.mean, :sd => @n.sd))
|
77
|
-
end
|
78
|
-
|
79
|
-
it "should pass the mean and standard deviation to the distribution when calculating an interval_values" do
|
80
|
-
@n.interval_values.should eql(Distributions::Gaussian.interval_values(:mean => @n.mean, :sd => @n.sd))
|
81
|
-
end
|
82
|
-
|
83
|
-
it "should have a coefficient_of_variation" do
|
84
|
-
@n.coefficient_of_variation.should eql(@n.sd / @n.mean)
|
85
|
-
end
|
86
|
-
|
87
|
-
it "should have a cov alias for coefficient_of_variation" do
|
88
|
-
@n.cov.should eql(@n.coefficient_of_variation)
|
89
|
-
end
|
90
|
-
|
91
|
-
it "should have a summary hash" do
|
92
|
-
@n.should be_respond_to(:summary)
|
93
|
-
@n.summary.should be_a(Hash)
|
94
|
-
end
|
95
|
-
|
96
|
-
it "should have a mean in the summary" do
|
97
|
-
@n.summary[:mean].should eql(@n.mean)
|
98
|
-
end
|
99
|
-
|
100
|
-
it "should have a standard deviation in the summary" do
|
101
|
-
@n.summary[:standard_deviation].should eql(@n.standard_deviation)
|
102
|
-
end
|
103
|
-
|
104
|
-
it "should have a min in the summary" do
|
105
|
-
@n.summary[:min].should eql(@n.vector.min)
|
106
|
-
end
|
107
|
-
|
108
|
-
it "should have a max in the summary" do
|
109
|
-
@n.summary[:max].should eql(@n.vector.max)
|
110
|
-
end
|
111
|
-
|
112
|
-
it "should have a lower_bound in the summary" do
|
113
|
-
@n.summary[:lower_bound].should eql(@n.lower_bound)
|
114
|
-
end
|
115
|
-
|
116
|
-
it "should have an upper_bound in the summary" do
|
117
|
-
@n.summary[:upper_bound].should eql(@n.upper_bound)
|
118
|
-
end
|
119
|
-
|
120
|
-
it "should have a coefficient_of_variation in the summary" do
|
121
|
-
@n.summary[:coefficient_of_variation].should eql(@n.sd / @n.mean)
|
122
|
-
end
|
123
|
-
|
124
|
-
end
|
@@ -1,151 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
-
|
3
|
-
include Fathom
|
4
|
-
|
5
|
-
describe PlausibleRange do
|
6
|
-
|
7
|
-
before do
|
8
|
-
@d = {:upper_bound => 10, :lower_bound => 1}
|
9
|
-
@pr = PlausibleRange.new(@d)
|
10
|
-
end
|
11
|
-
|
12
|
-
it "should require an upper and lower bound" do
|
13
|
-
lambda{PlausibleRange.new}.should raise_error(/upper/)
|
14
|
-
lambda{PlausibleRange.new(:upper_bound => 10)}.should raise_error(/lower/)
|
15
|
-
lambda{PlausibleRange.new(:upper_bound => 10, :lower_bound => 1)}.should_not raise_error
|
16
|
-
end
|
17
|
-
|
18
|
-
it "should expose the upper bound and lower bound" do
|
19
|
-
@pr.upper_bound.should eql(10)
|
20
|
-
@pr.lower_bound.should eql(1)
|
21
|
-
end
|
22
|
-
|
23
|
-
it "should use min or max instead of lower_bound or upper_bound" do
|
24
|
-
pr = PlausibleRange.new(:min => 1, :max => 10)
|
25
|
-
pr.min.should eql(1)
|
26
|
-
pr.max.should eql(10)
|
27
|
-
pr.lower_bound.should eql(1)
|
28
|
-
pr.upper_bound.should eql(10)
|
29
|
-
end
|
30
|
-
|
31
|
-
it "should allow an optional hard_lower_bound" do
|
32
|
-
pr = PlausibleRange.new(@d.merge(:hard_lower_bound => 0))
|
33
|
-
pr.hard_lower_bound.should eql(0)
|
34
|
-
end
|
35
|
-
|
36
|
-
it "should set the lower_bound to the hard_lower_bound if the hard_lower_bound is greater than the lower_bound" do
|
37
|
-
pr = PlausibleRange.new(:lower_bound => 2, :hard_lower_bound => 3, :upper_bound => 4)
|
38
|
-
pr.lower_bound.should eql(3)
|
39
|
-
end
|
40
|
-
|
41
|
-
it "should allow an optional hard_upper_bound" do
|
42
|
-
pr = PlausibleRange.new(@d.merge(:hard_upper_bound => 20))
|
43
|
-
pr.hard_upper_bound.should eql(20)
|
44
|
-
end
|
45
|
-
|
46
|
-
it "should set the upper_bound to the hard_upper_bound if the hard_upper_bound is less than the upper_bound" do
|
47
|
-
pr = PlausibleRange.new(:lower_bound => 2, :hard_upper_bound => 3, :upper_bound => 4)
|
48
|
-
pr.upper_bound.should eql(3)
|
49
|
-
end
|
50
|
-
|
51
|
-
it "should have a default confidence interval of 90%" do
|
52
|
-
@pr.confidence_interval.should eql(0.9)
|
53
|
-
end
|
54
|
-
|
55
|
-
it "should be able to instantiate with confidence_interval" do
|
56
|
-
pr = PlausibleRange.new(@d.merge(:confidence_interval => 0.8))
|
57
|
-
pr.confidence_interval.should eql(0.8)
|
58
|
-
end
|
59
|
-
|
60
|
-
it "should be able to use ci instead of confidence_interval" do
|
61
|
-
pr = PlausibleRange.new(@d.merge(:ci => 0.8))
|
62
|
-
pr.ci.should eql(0.8)
|
63
|
-
pr.confidence_interval.should eql(0.8)
|
64
|
-
end
|
65
|
-
|
66
|
-
it "should be able to calculate the midpoint" do
|
67
|
-
@pr.midpoint.should eql(5.5)
|
68
|
-
end
|
69
|
-
|
70
|
-
it "should be able to calculate the standard deviation" do
|
71
|
-
@pr.standard_deviation.should be_within(0.0001).of( 2.7358)
|
72
|
-
end
|
73
|
-
|
74
|
-
it "should be able to use std instead of standard_deviation" do
|
75
|
-
@pr.std.should eql(@pr.standard_deviation)
|
76
|
-
end
|
77
|
-
|
78
|
-
it "should be able to produce a random value from within the distribution" do
|
79
|
-
@pr.should be_respond_to(:rand)
|
80
|
-
@pr.rand.should be_a(Float)
|
81
|
-
end
|
82
|
-
|
83
|
-
it "should be able to produce an array of random values" do
|
84
|
-
@pr.array_of_random_values.should be_an(Array)
|
85
|
-
@pr.array_of_random_values.length.should eql(10)
|
86
|
-
@pr.array_of_random_values(13).length.should eql(13)
|
87
|
-
end
|
88
|
-
|
89
|
-
it "should alias array_of_random_values with to_a" do
|
90
|
-
@pr.to_a.should be_an(Array)
|
91
|
-
@pr.to_a.length.should eql(10)
|
92
|
-
@pr.to_a(13).length.should eql(13)
|
93
|
-
end
|
94
|
-
|
95
|
-
it "should be able to produce a vector of random values" do
|
96
|
-
@pr.vector_of_random_values.should be_a(GSL::Vector)
|
97
|
-
@pr.vector_of_random_values.length.should eql(10)
|
98
|
-
@pr.vector_of_random_values(12).length.should eql(12)
|
99
|
-
end
|
100
|
-
|
101
|
-
it "should alias vector_of_random_values with to_v" do
|
102
|
-
@pr.to_v.should be_a(GSL::Vector)
|
103
|
-
@pr.to_v.length.should eql(10)
|
104
|
-
@pr.to_v(12).length.should eql(12)
|
105
|
-
end
|
106
|
-
|
107
|
-
it "should record the name, if one is provided" do
|
108
|
-
pr = PlausibleRange.new(@d.merge(:name => 'pr1'))
|
109
|
-
pr.name.should eql('pr1')
|
110
|
-
end
|
111
|
-
|
112
|
-
it "should record the description, if one is provided" do
|
113
|
-
pr = PlausibleRange.new(@d.merge(:description => 'some description'))
|
114
|
-
pr.description.should eql('some description')
|
115
|
-
end
|
116
|
-
|
117
|
-
it "should have no problems with a range with matching lower and upper bounds" do
|
118
|
-
pr = PlausibleRange.new(:min => 1, :max => 1)
|
119
|
-
pr.rand.should eql(1.0)
|
120
|
-
pr.midpoint.should eql(1.0)
|
121
|
-
pr.std.should eql(0.0)
|
122
|
-
end
|
123
|
-
|
124
|
-
it "should have a name_sym method" do
|
125
|
-
pr = PlausibleRange.new(:min => 1, :max => 2, :name => "Demo Node")
|
126
|
-
pr.name_sym.should eql(:demo_node)
|
127
|
-
end
|
128
|
-
|
129
|
-
it "should not exceed the lower bound if it is set", :slow => true do
|
130
|
-
pr = PlausibleRange.new(:max => 100, :hard_lower_bound => 0)
|
131
|
-
1_000.times do
|
132
|
-
(pr.rand >= 0).should eql(true)
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
it "should not exceed the upper bound if it is set", :slow => true do
|
137
|
-
pr = PlausibleRange.new(:min => 0, :hard_upper_bound => 100)
|
138
|
-
1_000.times do
|
139
|
-
(pr.rand <= 100).should eql(true)
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
it "should not exceed the lower bound or upper bound if both are set", :slow => true do
|
144
|
-
pr = PlausibleRange.new(:hard_upper_bound => 100, :hard_lower_bound => 0)
|
145
|
-
1_000.times do
|
146
|
-
r = pr.rand
|
147
|
-
(r >= 0 and r <= 100).should eql(true)
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
end
|
data/spec/fathom/node_spec.rb
DELETED
@@ -1,172 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
-
|
3
|
-
include Fathom
|
4
|
-
|
5
|
-
describe Node do
|
6
|
-
it "should take an options hash to instantiate" do
|
7
|
-
lambda{Node.new(:any_value => true)}.should_not raise_error
|
8
|
-
end
|
9
|
-
|
10
|
-
it "should take an optional name parameter" do
|
11
|
-
node = Node.new(:name => "My Name")
|
12
|
-
node.name.should eql("My Name")
|
13
|
-
end
|
14
|
-
|
15
|
-
it "should take an optional distribution parameter" do
|
16
|
-
node = Node.new(:distribution => Fathom::Distributions::Gaussian)
|
17
|
-
node.distribution.should eql(Fathom::Distributions::Gaussian)
|
18
|
-
end
|
19
|
-
|
20
|
-
it "should default to the standard distribution" do
|
21
|
-
node = Node.new
|
22
|
-
node.distribution.should eql(Fathom::Distributions::Gaussian)
|
23
|
-
end
|
24
|
-
|
25
|
-
it "should be able to take a symbol and find the appropriate distribution" do
|
26
|
-
node = Node.new(:distribution => :gaussian)
|
27
|
-
node.distribution.should eql(Fathom::Distributions::Gaussian)
|
28
|
-
end
|
29
|
-
|
30
|
-
it "should take an optional description" do
|
31
|
-
node = Node.new(:description => "some description")
|
32
|
-
node.description.should eql('some description')
|
33
|
-
end
|
34
|
-
|
35
|
-
it "should take an optional values parameter" do
|
36
|
-
node = Node.new(:values => [1,2,3])
|
37
|
-
node.values.should eql([1,2,3])
|
38
|
-
end
|
39
|
-
|
40
|
-
it "should provide name_sym, if a name is defined" do
|
41
|
-
node = Node.new(:name => "Some name")
|
42
|
-
node.name_sym.should eql(:some_name)
|
43
|
-
end
|
44
|
-
|
45
|
-
it "should change dashes to underscores for name_sym" do
|
46
|
-
node = Node.new(:name => "Some-name")
|
47
|
-
node.name_sym.should eql(:some_name)
|
48
|
-
end
|
49
|
-
|
50
|
-
it "should take an optional parents list" do
|
51
|
-
n1 = Node.new
|
52
|
-
n2 = Node.new(:parents => [n1])
|
53
|
-
n2.parents.should eql([n1])
|
54
|
-
end
|
55
|
-
|
56
|
-
it "should allow a single node as a parent or parents and turn it into an array" do
|
57
|
-
n1 = Node.new
|
58
|
-
n2 = Node.new(:parents => n1)
|
59
|
-
n2.parents.should eql([n1])
|
60
|
-
n2 = Node.new(:parent => n1)
|
61
|
-
n2.parents.should eql([n1])
|
62
|
-
end
|
63
|
-
|
64
|
-
it "should create an empty list of parents by default" do
|
65
|
-
n1 = Node.new
|
66
|
-
n1.parents.should eql([])
|
67
|
-
end
|
68
|
-
|
69
|
-
it "should be able to add a parent" do
|
70
|
-
n1, n2 = Node.new, Node.new
|
71
|
-
n3 = Node.new(:parent => n2)
|
72
|
-
n3.add_parent(n1)
|
73
|
-
n3.parents.should eql([n2, n1])
|
74
|
-
end
|
75
|
-
|
76
|
-
it "should register the receiving node when adding a parent" do
|
77
|
-
n1 = Node.new
|
78
|
-
n1.should_receive(:register_child).and_return(true)
|
79
|
-
n2 = Node.new(:parent => n1)
|
80
|
-
|
81
|
-
n1 = Node.new
|
82
|
-
n1.should_receive(:register_child).and_return(true)
|
83
|
-
n2 = Node.new
|
84
|
-
n2.add_parent(n1)
|
85
|
-
end
|
86
|
-
|
87
|
-
it "should not allow a parent to be registered if it is not a child of the other node" do
|
88
|
-
n1 = Node.new
|
89
|
-
n2 = Node.new
|
90
|
-
lambda{n2.register_parent(n1)}.should raise_error
|
91
|
-
end
|
92
|
-
|
93
|
-
it "should take an optional children list" do
|
94
|
-
n1 = Node.new
|
95
|
-
n2 = Node.new(:children => [n1])
|
96
|
-
n2.children.should eql([n1])
|
97
|
-
end
|
98
|
-
|
99
|
-
it "should allow a single node as a child or children and turn it into an array" do
|
100
|
-
n1 = Node.new
|
101
|
-
n2 = Node.new(:children => n1)
|
102
|
-
n2.children.should eql([n1])
|
103
|
-
n2 = Node.new(:child => n1)
|
104
|
-
n2.children.should eql([n1])
|
105
|
-
end
|
106
|
-
|
107
|
-
it "should create an empty list of children by default" do
|
108
|
-
n1 = Node.new
|
109
|
-
n1.children.should eql([])
|
110
|
-
end
|
111
|
-
|
112
|
-
it "should register the receiving node when adding a child" do
|
113
|
-
n1 = Node.new
|
114
|
-
n1.should_receive(:register_parent).and_return(true)
|
115
|
-
n2 = Node.new(:child => n1)
|
116
|
-
|
117
|
-
n1 = Node.new
|
118
|
-
n1.should_receive(:register_parent).and_return(true)
|
119
|
-
n2 = Node.new
|
120
|
-
n2.add_child(n1)
|
121
|
-
end
|
122
|
-
|
123
|
-
it "should not allow a child to be registered if it is not a parent of the other node" do
|
124
|
-
n1 = Node.new
|
125
|
-
n2 = Node.new
|
126
|
-
lambda{n2.register_child(n1)}.should raise_error
|
127
|
-
end
|
128
|
-
|
129
|
-
it "should define an accessor method for the child node when added" do
|
130
|
-
n1 = Node.new(:name => 'n1')
|
131
|
-
n2 = Node.new :name => 'n2', :child => n1
|
132
|
-
n2.n1.should eql(n1)
|
133
|
-
n1.should_not respond_to(:n1)
|
134
|
-
end
|
135
|
-
|
136
|
-
it "should define an accessor method for the parent node when added" do
|
137
|
-
n1 = Node.new(:name => 'n1')
|
138
|
-
n2 = Node.new :parent => n1
|
139
|
-
n2.n1.should eql(n1)
|
140
|
-
n1.should_not respond_to(:n1)
|
141
|
-
end
|
142
|
-
|
143
|
-
it "should have defined an accessor method for the added child to the parent" do
|
144
|
-
n1 = Node.new(:name => 'n1')
|
145
|
-
n2 = Node.new :name => 'n2', :child => n1
|
146
|
-
n1.n2.should eql(n2)
|
147
|
-
end
|
148
|
-
|
149
|
-
it "should have defined an accessor method for the added parent to the child" do
|
150
|
-
n1 = Node.new(:name => 'n1')
|
151
|
-
n2 = Node.new :name => 'n2', :parent => n1
|
152
|
-
n1.n2.should eql(n2)
|
153
|
-
end
|
154
|
-
|
155
|
-
# it "should have introduced the Spira infrastructure by now" do
|
156
|
-
# Object.should be_const_defined(:Spira)
|
157
|
-
# end
|
158
|
-
|
159
|
-
# it "should have defined the spira repository" do
|
160
|
-
# Spira.repositories[:default].should be_a(RDF::Repository)
|
161
|
-
# end
|
162
|
-
|
163
|
-
# This really changes the interface for everything. So, either I re-purpose a node, or something...
|
164
|
-
# Next steps: read the Spira source and figure out what's easier to do: replace the functionality
|
165
|
-
# or change my interfaces. (btw, 9 issues, only.
|
166
|
-
# Mostly just tied to creating the node accessors (n1.n2 type thing))
|
167
|
-
|
168
|
-
# it "should have Spira included" do
|
169
|
-
# Node.included_modules.should be_include(Spira::Resource)
|
170
|
-
# end
|
171
|
-
|
172
|
-
end
|