active_road 0.0.2

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.
Files changed (118) hide show
  1. data/.gitignore +9 -0
  2. data/.rvmrc +1 -0
  3. data/.travis.yml +11 -0
  4. data/Gemfile +14 -0
  5. data/Guardfile +26 -0
  6. data/LICENSE.txt +19 -0
  7. data/README.md +37 -0
  8. data/Rakefile +46 -0
  9. data/active_road.gemspec +38 -0
  10. data/app/models/active_road/access_link.rb +44 -0
  11. data/app/models/active_road/access_point.rb +65 -0
  12. data/app/models/active_road/base.rb +5 -0
  13. data/app/models/active_road/junction.rb +52 -0
  14. data/app/models/active_road/junction_conditionnal_cost.rb +13 -0
  15. data/app/models/active_road/logical_road.rb +41 -0
  16. data/app/models/active_road/path.rb +85 -0
  17. data/app/models/active_road/physical_road.rb +65 -0
  18. data/app/models/active_road/physical_road_conditionnal_cost.rb +10 -0
  19. data/app/models/active_road/physical_road_filter.rb +41 -0
  20. data/app/models/active_road/street_number.rb +81 -0
  21. data/app/models/active_road/terra_import.rb +148 -0
  22. data/config/database.yml +20 -0
  23. data/config/database.yml.ci +12 -0
  24. data/config/routes.rb +2 -0
  25. data/db/init.sql +6 -0
  26. data/db/migrate/20110914160756_create_street_numbers.rb +18 -0
  27. data/db/migrate/20120201114800_create_physical_roads.rb +17 -0
  28. data/db/migrate/20120201162800_create_logical_roads.rb +16 -0
  29. data/db/migrate/20120203154500_create_junctions.rb +25 -0
  30. data/db/migrate/20120401083409_create_physical_roads_spatial_index.rb +9 -0
  31. data/db/migrate/20120419093427_add_kind_to_physical_roads.rb +10 -0
  32. data/db/migrate/20121010125851_create_junction_conditionnal_costs.rb +13 -0
  33. data/db/migrate/20121011124923_create_physical_road_conditionnal_costs.rb +13 -0
  34. data/db/migrate/20121012134251_add_start_end_ref_to_junction_conditionnal_cost.rb +6 -0
  35. data/db/migrate/20121012134440_add_tags_junction.rb +5 -0
  36. data/db/migrate/20121012134457_add_tags_physical_road.rb +5 -0
  37. data/db/migrate/20121106095002_add_objectid_to_street_number.rb +5 -0
  38. data/db/migrate/20130419155438_add_length_and_minimum_width_to_physical_road.rb +6 -0
  39. data/db/migrate/20130507162801_setup_hstore.rb +9 -0
  40. data/db/migrate/20130509075631_change_tags_type_for_physical_road.rb +10 -0
  41. data/db/migrate/20130509081745_index_physical_roads_tags.rb +9 -0
  42. data/db/migrate/20130513134422_change_tags_type_for_junction.rb +10 -0
  43. data/db/migrate/20130513134511_index_junctions_tags.rb +9 -0
  44. data/db/migrate/20130607114951_change_length_name_for_physical_road.rb +11 -0
  45. data/db/migrate/20130801151637_add_constraints_to_physical_roads.rb +37 -0
  46. data/db/migrate/20130809155019_add_height_and_waiting_constraint_to_junction.rb +6 -0
  47. data/db/migrate/20130812143049_fix_waiting_constraint_type_for_junction.rb +11 -0
  48. data/lib/active_road.rb +19 -0
  49. data/lib/active_road/engine.rb +13 -0
  50. data/lib/active_road/migration.rb +15 -0
  51. data/lib/active_road/shortest_path.rb +2 -0
  52. data/lib/active_road/shortest_path/finder.rb +172 -0
  53. data/lib/active_road/version.rb +3 -0
  54. data/lib/tasks/activeroad_tasks.rake +4 -0
  55. data/log/.gitignore +0 -0
  56. data/script/console +2 -0
  57. data/script/import-tiger-numbers +201 -0
  58. data/script/rails +9 -0
  59. data/spec/dummy/README.rdoc +261 -0
  60. data/spec/dummy/Rakefile +6 -0
  61. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  62. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  63. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  64. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  65. data/spec/dummy/app/mailers/.gitkeep +0 -0
  66. data/spec/dummy/app/models/.gitkeep +0 -0
  67. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  68. data/spec/dummy/config.ru +4 -0
  69. data/spec/dummy/config/application.rb +56 -0
  70. data/spec/dummy/config/boot.rb +10 -0
  71. data/spec/dummy/config/database.yml +20 -0
  72. data/spec/dummy/config/environment.rb +5 -0
  73. data/spec/dummy/config/environments/development.rb +37 -0
  74. data/spec/dummy/config/environments/production.rb +67 -0
  75. data/spec/dummy/config/environments/test.rb +37 -0
  76. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  77. data/spec/dummy/config/initializers/inflections.rb +15 -0
  78. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  79. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  80. data/spec/dummy/config/initializers/session_store.rb +8 -0
  81. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  82. data/spec/dummy/config/locales/en.yml +5 -0
  83. data/spec/dummy/config/routes.rb +4 -0
  84. data/spec/dummy/db/schema.rb +87 -0
  85. data/spec/dummy/db/structure.sql +10250 -0
  86. data/spec/dummy/lib/assets/.gitkeep +0 -0
  87. data/spec/dummy/log/.gitkeep +0 -0
  88. data/spec/dummy/public/404.html +26 -0
  89. data/spec/dummy/public/422.html +26 -0
  90. data/spec/dummy/public/500.html +25 -0
  91. data/spec/dummy/public/favicon.ico +0 -0
  92. data/spec/dummy/script/rails +6 -0
  93. data/spec/factories/junction.rb +18 -0
  94. data/spec/factories/junction_conditionnal_cost.rb +13 -0
  95. data/spec/factories/logical_road.rb +8 -0
  96. data/spec/factories/physical_road.rb +9 -0
  97. data/spec/factories/physical_road_conditionnal_cost.rb +9 -0
  98. data/spec/factories/street_number.rb +11 -0
  99. data/spec/fixtures/terra.xml +1772 -0
  100. data/spec/fixtures/terra_minimal.xml +28 -0
  101. data/spec/fixtures/trajectory_arc.xml +10 -0
  102. data/spec/fixtures/trajectory_node.xml +11 -0
  103. data/spec/lib/active_road/shortest_path/finder_spec.rb +157 -0
  104. data/spec/models/active_road/access_point_spec.rb +36 -0
  105. data/spec/models/active_road/junction_conditionnal_cost_spec.rb +28 -0
  106. data/spec/models/active_road/junction_spec.rb +25 -0
  107. data/spec/models/active_road/logical_road_spec.rb +46 -0
  108. data/spec/models/active_road/path_spec.rb +7 -0
  109. data/spec/models/active_road/physical_road_conditionnal_cost_spec.rb +19 -0
  110. data/spec/models/active_road/physical_road_filter_spec.rb +85 -0
  111. data/spec/models/active_road/physical_road_spec.rb +17 -0
  112. data/spec/models/active_road/street_number_spec.rb +78 -0
  113. data/spec/models/active_road/terra_import_spec.rb +113 -0
  114. data/spec/spec_helper.rb +46 -0
  115. data/spec/support/georuby_ext.rb +15 -0
  116. data/travis/before_install.sh +10 -0
  117. data/travis/before_script.sh +9 -0
  118. metadata +460 -0
@@ -0,0 +1,28 @@
1
+ <?xml version="1.0"?>
2
+ <?xml-stylesheet type="text/xsl" href="roads-exchange.xsl"?>
3
+ <Referential xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:./roads-exchange-SP4-SP5.xsd" name="Place Saint Sulpice septembre 2012">
4
+ <TrajectoryNode>
5
+ <ObjectId>ign-obj-55</ObjectId>
6
+ <Tags></Tags>
7
+ <Geometry>SRID=4326;POINT(2.331308046501452 48.85192725813857)</Geometry>
8
+ <TrajectoryArcRef>ign-obj-205</TrajectoryArcRef>
9
+ <PhysicalRoadRef>ign-obj-4</PhysicalRoadRef>
10
+ </TrajectoryNode>
11
+ <TrajectoryNode>
12
+ <ObjectId>ign-obj-56</ObjectId>
13
+ <Tags></Tags>
14
+ <Geometry>SRID=4326;POINT(2.331308046501452 48.89192725813857)</Geometry>
15
+ <TrajectoryArcRef>ign-obj-205</TrajectoryArcRef>
16
+ <PhysicalRoadRef>ign-obj-4</PhysicalRoadRef>
17
+ </TrajectoryNode>
18
+ <TrajectoryArc>
19
+ <ObjectId>ign-obj-205</ObjectId>
20
+ <Tags></Tags>
21
+ <Geometry>SRID=4326;LINESTRING(2.331800215057413 48.85220542836662, 2.331637521069522 48.85226948829244)</Geometry>
22
+ <TrajectoryNodeRef>ign-obj-55</TrajectoryNodeRef>
23
+ <TrajectoryNodeRef>ign-obj-56</TrajectoryNodeRef>
24
+ <PhysicalRoadRef>ign-obj-8</PhysicalRoadRef>
25
+ <Length>13.90200574121281</Length>
26
+ <MinimumWidth>1.934781931678176</MinimumWidth>
27
+ </TrajectoryArc>
28
+ </Referential>
@@ -0,0 +1,10 @@
1
+ <TrajectoryArc>
2
+ <ObjectId>ign-obj-132</ObjectId>
3
+ <Tags></Tags>
4
+ <Geometry>SRID=4326;LINESTRING(2.332951894607378 48.85202237268847, 2.332954059651963 48.85203176810643, 2.332987498916577 48.85217930000868, 2.333012216929252 48.85228653406593, 2.333019156716375 48.85231664083499, 2.333020631447154 48.85232307844341, 2.333054110912616 48.85246483593746, 2.333054409771297 48.85246610837084, 2.333069582167015 48.85253004267233, 2.333069181836508 48.85253081856987, 2.333061780607442 48.85254114991605, 2.333052671610163 48.85254999057511, 2.333027875983071 48.85257017716946, 2.333027422653056 48.85257048008516)</Geometry>
5
+ <TrajectoryNodeRef>ign-obj-43</TrajectoryNodeRef>
6
+ <TrajectoryNodeRef>ign-obj-92</TrajectoryNodeRef>
7
+ <PhysicalRoadRef>ign-obj-14</PhysicalRoadRef>
8
+ <Length>62.59449394845691</Length>
9
+ <MinimumWidth>wide</MinimumWidth>
10
+ </TrajectoryArc>
@@ -0,0 +1,11 @@
1
+ <TrajectoryNode>
2
+ <ObjectId>ign-obj-93</ObjectId>
3
+ <Tags></Tags>
4
+ <Geometry>SRID=4326;POINT(2.33280726637185 48.85139664547131)</Geometry>
5
+ <TrajectoryArcRef>ign-obj-158</TrajectoryArcRef>
6
+ <TrajectoryArcRef>ign-obj-187</TrajectoryArcRef>
7
+ <JunctionRef>ign-obj-111</JunctionRef>
8
+ <PhysicalRoadRef>ign-obj-13</PhysicalRoadRef>
9
+ <PhysicalRoadRef>ign-obj-14</PhysicalRoadRef>
10
+ <Height>5</Height>
11
+ </TrajectoryNode>
@@ -0,0 +1,157 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveRoad::ShortestPath::Finder do
4
+
5
+ # Path schema
6
+ #
7
+ # E-----------------F
8
+ # | _______________/|
9
+ # |/ |
10
+ # C-----------------D
11
+ # | |
12
+ # | |
13
+ # A-----------------B
14
+ #
15
+
16
+ let(:departure) { point(-0.1, 0.1) }
17
+ let(:arrival) { point(1, 2) }
18
+ let(:speed) { 4 }
19
+ let(:constraints) { {:transport_mode => [:pedestrian, nil]} }
20
+
21
+ let(:ab) { create(:physical_road, :objectid => "ab", :geometry => line_string( "0 0,1 0" ) ) }
22
+ let(:cd) { create(:physical_road, :objectid => "cd", :geometry => line_string( "0 1,1 1" ) ) }
23
+ let(:ef) { create(:physical_road, :objectid => "ef", :geometry => line_string( "0 2,1 2" ) ) }
24
+ let(:ac) { create(:physical_road, :objectid => "ac", :geometry => line_string( "0 0,0 1" ), :uphill => 2 ) }
25
+ let(:bd) { create(:physical_road, :objectid => "bd", :geometry => line_string( "1 0,1 1" ) ) }
26
+ let(:ce) { create(:physical_road, :objectid => "ce", :geometry => line_string( "0 1,0 2" ), :uphill => 2 ) }
27
+ let(:df) { create(:physical_road, :objectid => "df", :geometry => line_string( "1 1,1 2" ) ) }
28
+ let(:cf) { create(:physical_road, :objectid => "cf", :geometry => line_string( "0 1,1 2" ), :transport_mode => :bike, :uphill => 2 ) }
29
+
30
+ let!(:a) { create(:junction, :geometry => point(0, 0), :physical_roads => [ ab, ac ] ) }
31
+ let!(:b) { create(:junction, :geometry => point(1, 0), :physical_roads => [ ab, bd ] ) }
32
+ let!(:c) { create(:junction, :geometry => point(0, 1), :physical_roads => [ cd, ac, ce, cf ] ) }
33
+ let!(:d) { create(:junction, :geometry => point(1, 1), :physical_roads => [ cd, bd, df ] ) }
34
+ let!(:e) { create(:junction, :geometry => point(0, 2), :physical_roads => [ ce, ef ] ) }
35
+ let!(:f) { create(:junction, :geometry => point(1, 2), :physical_roads => [ ef, df, cf ] ) }
36
+
37
+ it "should find a solution between first and last road with with no constraints" do
38
+ subject = ActiveRoad::ShortestPath::Finder.new departure, arrival, 4
39
+ subject.path.should_not be_blank
40
+ subject.path.size.should == 6
41
+ subject.path[2].physical_road.objectid.should == "ac"
42
+ subject.path[3].physical_road.objectid.should == "cf"
43
+ end
44
+
45
+ it "should find a solution between first and last road with physical_road filter in constraints" do
46
+ subject = ActiveRoad::ShortestPath::Finder.new departure, arrival, 4, constraints
47
+ subject.path.should_not be_blank
48
+ subject.path.size.should == 7
49
+ subject.path[2].physical_road.objectid.should == "ac"
50
+ subject.path[3].physical_road.objectid.should == "ce"
51
+ subject.path[4].physical_road.objectid.should == "ef"
52
+ end
53
+
54
+ it "should find a solution between first and last road with context arguments in constraints" do
55
+ subject = ActiveRoad::ShortestPath::Finder.new departure, arrival, 4, { :uphill => 3 }
56
+ subject.path.should_not be_blank
57
+ subject.path.size.should == 7
58
+ subject.path[2].physical_road.objectid.should == "ac"
59
+ subject.path[3].physical_road.objectid.should == "cd"
60
+ subject.path[4].physical_road.objectid.should == "df"
61
+ end
62
+
63
+ it "should return something when no solution" do
64
+ subject = ActiveRoad::ShortestPath::Finder.new departure, arrival, 4, constraints
65
+ end
66
+
67
+
68
+ # describe "Shortest path with weights" do
69
+
70
+ # it "should find a solution between first and last road with weights" do
71
+ # subject = ActiveRoad::ShortestPath::Finder.new source, destination, 4
72
+ # subject.path.should_not be_blank
73
+ # subject.path.size.should == 7
74
+ # subject.path[3].physical_road.objectid.should == "bc"
75
+ # subject.path[4].physical_road.objectid.should == "cd"
76
+ # end
77
+
78
+ # end
79
+
80
+
81
+ describe "#path_weights" do
82
+
83
+ let(:subject) { ActiveRoad::ShortestPath::Finder.new departure, arrival, 4 }
84
+
85
+ it "should return 0 if no physical road" do
86
+ path = departure
87
+ subject.path_weights(path).should == 0
88
+ end
89
+
90
+ it "should return path weights" do
91
+ path = ActiveRoad::Path.new(:departure => create(:junction), :physical_road => create(:physical_road) )
92
+ path.stub :length_in_meter => 2
93
+ subject.path_weights(path).should == 2 / (4 * 1000/3600)
94
+ end
95
+
96
+ it "should return path weights and node weight" do
97
+ path = ActiveRoad::Path.new(:departure => create(:junction, :waiting_constraint => 2.5), :physical_road => create(:physical_road) )
98
+ path.stub :length_in_meter => 2
99
+ subject.path_weights(path).should == 2 / (4 * 1000/3600) + 2.5
100
+ end
101
+
102
+ end
103
+
104
+ describe "#refresh_context" do
105
+ let(:subject) { ActiveRoad::ShortestPath::Finder.new departure, arrival, 4 }
106
+
107
+ it "should increase uphill if path has got a departure with an uphill value" do
108
+ node = ActiveRoad::Path.new( :physical_road => create(:physical_road, :uphill => 3.0), :departure => create(:junction))
109
+ context = {:uphill => 3}
110
+ subject.refresh_context(node, context).should == { :uphill => 6.0, :downhill => 0, :height => 0}
111
+ end
112
+
113
+ it "should not increase uphill if path hasn't' got a departure with an uphill value" do
114
+ node = ActiveRoad::Path.new( :physical_road => create(:physical_road), :departure => create(:junction))
115
+ context = {:uphill => 3}
116
+ subject.refresh_context(node, context).should == { :uphill => 3.0, :downhill => 0, :height => 0}
117
+ end
118
+
119
+ it "should set context uphill to 0 if path hasn't' got a departure with an uphill value and no previous context" do
120
+ node = ActiveRoad::Path.new( :physical_road => create(:physical_road), :departure => create(:junction))
121
+ context = {}
122
+ subject.refresh_context(node, context).should == { :uphill => 0, :downhill => 0, :height => 0}
123
+ end
124
+
125
+ it "should return {} if node is not a ActiveRoad::Path" do
126
+ node = GeoRuby::SimpleFeatures::Point.from_x_y(0, 0)
127
+ context = {}
128
+ subject.refresh_context(node, context).should == {:uphill=>0, :downhill=>0, :height=>0}
129
+ end
130
+ end
131
+
132
+ describe "#follow_way" do
133
+
134
+ let(:node) { mock(:node) }
135
+ let(:destination) { mock(:destination) }
136
+ let(:weight) { 2 }
137
+ let(:context) { {:uphill => 2} }
138
+ let(:subject) { ActiveRoad::ShortestPath::Finder.new departure, arrival, 4 }
139
+
140
+ before(:each) do
141
+ subject.stub :search_heuristic => 1
142
+ subject.stub :time_heuristic => 2
143
+ end
144
+
145
+ it "should not follow way if uphill > uphill max" do
146
+ subject.follow_way_filter = {:uphill => 1}
147
+ subject.follow_way?(node, destination, weight, context).should be_false
148
+ end
149
+
150
+ it "should follow way if uphill < uphill max" do
151
+ subject.follow_way_filter = {:uphill => 3}
152
+ subject.follow_way?(node, destination, weight, context).should be_true
153
+ end
154
+
155
+ end
156
+
157
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveRoad::AccessPoint do
4
+ let!(:ab) { create(:physical_road, :geometry => line_string( "0 0,1 0" ), :minimum_width => :wide ) }
5
+
6
+ subject { ActiveRoad::Accesspoint.new( :location => point(0, 0), :physical_road => ab ) }
7
+
8
+ describe ".from" do
9
+
10
+ it "should return all access point with tags from the location" do
11
+ access_points = ActiveRoad::AccessPoint.from( point(0, 0), { :minimum_width => :wide } )
12
+ access_points.size.should == 1
13
+ end
14
+
15
+ it "should return all access point from the location with tags not in physical roads" do
16
+ access_points = ActiveRoad::AccessPoint.from( point(0, 0), { :minimum_width => :narrow } )
17
+ access_points.size.should == 0
18
+ end
19
+
20
+ end
21
+
22
+ describe ".to" do
23
+
24
+ it "should return all access point with tags from the location" do
25
+ access_points = ActiveRoad::AccessPoint.to( point(0, 0), { :minimum_width => :wide } )
26
+ access_points.size.should == 1
27
+ end
28
+
29
+ it "should return all access point from the location with tags not in physical roads" do
30
+ access_points = ActiveRoad::AccessPoint.to( point(0, 0), { :minimum_width => :narrow } )
31
+ access_points.size.should == 0
32
+ end
33
+
34
+ end
35
+
36
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveRoad::JunctionConditionnalCost do
4
+
5
+ subject { create(:junction_conditionnal_cost) }
6
+
7
+ it "should have tags" do
8
+ subject.should respond_to(:tags)
9
+ end
10
+
11
+ it "should have a cost" do
12
+ subject.should respond_to(:cost)
13
+ end
14
+
15
+ it "should have a junction" do
16
+ subject.should respond_to(:junction_id)
17
+ end
18
+
19
+ describe "#start_physical_road" do
20
+ let(:new_road){create(:physical_road)}
21
+ it "should belongs to physical_road" do
22
+ subject.update_attributes( :start_physical_road => new_road)
23
+ subject.reload
24
+ subject.start_physical_road_id = new_road.id
25
+ end
26
+ end
27
+
28
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveRoad::Junction do
4
+
5
+ subject { create(:junction) }
6
+
7
+ it "should validate objectid uniqueness" do
8
+ other = build :junction, :objectid => subject.objectid
9
+ other.should_not be_valid
10
+ end
11
+
12
+ context "junction connected to physical roads" do
13
+ subject { create(:junction) }
14
+
15
+ describe "#physical_roads" do
16
+ let(:new_road) { create(:physical_road) }
17
+ it "should be addable" do
18
+ subject.physical_roads << new_road
19
+ subject.save!
20
+ end
21
+ end
22
+ end
23
+
24
+
25
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveRoad::LogicalRoad do
4
+
5
+ subject { create(:logical_road) }
6
+
7
+ it "should have a name" do
8
+ subject.should respond_to(:name)
9
+ end
10
+
11
+ describe "at" do
12
+
13
+ context "when the given number exists" do
14
+
15
+ #let(:physical_road) { create :physical_road, :logical_road => subject }
16
+ #let(:number) { create :street_number, :physical_road => physical_road }
17
+
18
+ it "should return the number geometry" do
19
+ #subject.at(number.number).should == number.geometry
20
+ subject.name.should_not be_nil
21
+ end
22
+
23
+ end
24
+
25
+ context "when the given number is between two existing numbers" do
26
+
27
+ # let(:physical_road) { create :physical_road, :logical_road => subject }
28
+ # let(:number) { 45 }
29
+ # let!(:previous_number) do
30
+ # physical_road.numbers.create create.attributes_for(:street_number, :location_on_road => 0.5, :number => "30")
31
+ # end
32
+ # let!(:next_number) do
33
+ # physical_road.numbers.create create.attributes_for(:street_number, :location_on_road => 1, :number => "60")
34
+ # end
35
+
36
+ # let(:estimated_geometry) { subject.geometry.interpolate_point(0.75) }
37
+
38
+ # it "should return the estimated geometry" do
39
+ # subject.at(number).should == estimated_geometry
40
+ # end
41
+
42
+ end
43
+
44
+ end
45
+
46
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveRoad::Path do
4
+
5
+
6
+
7
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveRoad::PhysicalRoadConditionnalCost do
4
+
5
+ subject { create(:physical_road_conditionnal_cost) }
6
+
7
+ it "should have tags" do
8
+ subject.should respond_to(:tags)
9
+ end
10
+
11
+ it "should have a cost" do
12
+ subject.should respond_to(:cost)
13
+ end
14
+
15
+ it "should have a physical road" do
16
+ subject.should respond_to(:physical_road_id)
17
+ end
18
+
19
+ end
@@ -0,0 +1,85 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveRoad::PhysicalRoadFilter do
4
+
5
+ # describe "#sql_request" do
6
+
7
+ # it "should return sql_request with min key" do
8
+ # physical_road_filter = ActiveRoad::PhysicalRoadFilter.new({"min_size" => "2"})
9
+ # physical_road_filter.sql_request.should == "(tags -> 'size')::int > :min_size"
10
+ # end
11
+
12
+ # it "should return sql_request with max key" do
13
+ # physical_road_filter = ActiveRoad::PhysicalRoadFilter.new({"max_size" => "2"})
14
+ # physical_road_filter.sql_request.should == "(tags -> 'size')::int < :max_size"
15
+ # end
16
+
17
+ # it "should return sql_request with default key" do
18
+ # physical_road_filter = ActiveRoad::PhysicalRoadFilter.new({"pedestrian" => "true"})
19
+ # physical_road_filter.sql_request.should == "tags -> 'pedestrian' != :pedestrian"
20
+ # end
21
+
22
+ # it "should return sql_request with 3 parameter" do
23
+ # physical_road_filter = ActiveRoad::PhysicalRoadFilter.new({"pedestrian" => "true", "max_size" => "2", "min_size" => "1"})
24
+ # physical_road_filter.sql_request.should == "tags -> 'pedestrian' != :pedestrian AND (tags -> 'size')::int < :max_size AND (tags -> 'size')::int > :min_size"
25
+ # end
26
+
27
+ # end
28
+
29
+ describe "#filter" do
30
+
31
+ let!( :physical_road ) { create( :physical_road ) }
32
+ let!( :physical_road2 ) { create( :physical_road ) }
33
+ let!( :physical_road3 ) { create( :physical_road ) }
34
+
35
+ it "should return physical roads which contains minimum_width <= narrow" do
36
+ physical_road.update_attribute :minimum_width, :wide
37
+ physical_road2.update_attribute :minimum_width, :cramped
38
+
39
+ physical_road_filter = ActiveRoad::PhysicalRoadFilter.new({:minimum_width => [:wide, :enlarged, :narrow]})
40
+ physical_road_filter.filter.should =~ [physical_road, physical_road3]
41
+ end
42
+
43
+ it "should return physical roads which contains slope <= medium" do
44
+ physical_road.update_attribute :slope, :medium
45
+ physical_road2.update_attribute :slope, :steep
46
+
47
+ physical_road_filter = ActiveRoad::PhysicalRoadFilter.new({:slope => [:flat, :medium] })
48
+ physical_road_filter.filter.should =~ [physical_road, physical_road3]
49
+ end
50
+
51
+ it "should return physical roads which contains cant <= medium" do
52
+ physical_road.update_attribute :cant, :medium
53
+ physical_road2.update_attribute :cant, :steep
54
+
55
+ physical_road_filter = ActiveRoad::PhysicalRoadFilter.new({:cant => [:flat, :medium] })
56
+ physical_road_filter.filter.should =~ [physical_road, physical_road3]
57
+ end
58
+
59
+ it "should return physical roads which contains physical_road_type == path_link" do
60
+ physical_road.update_attribute :physical_road_type, :path_link
61
+ physical_road2.update_attribute :physical_road_type, :crossing
62
+
63
+ physical_road_filter = ActiveRoad::PhysicalRoadFilter.new({:physical_road_type => :path_link})
64
+ physical_road_filter.filter.should =~ [physical_road, physical_road3]
65
+
66
+ end
67
+
68
+ it "should return physical roads which contains transport_mode == pedestrian" do
69
+ physical_road.update_attribute :transport_mode, :pedestrian
70
+ physical_road2.update_attribute :transport_mode, :bike
71
+
72
+ physical_road_filter = ActiveRoad::PhysicalRoadFilter.new({:transport_mode => [:pedestrian, nil]})
73
+ physical_road_filter.filter.should =~ [physical_road, physical_road3]
74
+ end
75
+
76
+ it "should return physical roads which contains covering == asphalt_road or pavement" do
77
+ physical_road.update_attribute :covering, :asphalt_road
78
+ physical_road2.update_attribute :covering, :pavement
79
+
80
+ physical_road_filter = ActiveRoad::PhysicalRoadFilter.new({:covering => [:pavement, :asphalt_road, nil]})
81
+ physical_road_filter.filter.should =~ [physical_road, physical_road2, physical_road3]
82
+ end
83
+ end
84
+
85
+ end