active_road 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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