roker 0.0.0
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.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.rdoc +17 -0
- data/Rakefile +55 -0
- data/VERSION +1 -0
- data/lib/numeric.rb +44 -0
- data/lib/roker.rb +173 -0
- data/lib/time.rb +121 -0
- data/lib/time_layout.rb +97 -0
- data/lib/time_span.rb +59 -0
- data/lib/weather_parameter.rb +68 -0
- data/roker +42 -0
- data/roker.gemspec +75 -0
- data/test/helper.rb +17 -0
- data/test/test_roker.rb +94 -0
- data/test/test_time.rb +84 -0
- data/test/test_time_layout.rb +155 -0
- data/test/test_time_span.rb +91 -0
- data/test/test_weather_parameter.rb +135 -0
- data/test/weather_xml.xml +177 -0
- metadata +110 -0
data/roker
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require File.dirname(__FILE__) + '/lib/roker'
|
3
|
+
require 'ruby-debug'
|
4
|
+
|
5
|
+
started_at = Time.now.beginning_of_day + 1.day
|
6
|
+
ended_at = started_at.end_of_day
|
7
|
+
lat = 37.0625
|
8
|
+
lng = -95.677068
|
9
|
+
|
10
|
+
ARGV.each do |a|
|
11
|
+
# puts "Argument: #{a}"
|
12
|
+
end
|
13
|
+
roker = Roker.new(:started_at => started_at, :ended_at => ended_at, :lat => lat, :lng => lng)
|
14
|
+
|
15
|
+
weather_forecasts_attributes = roker.weather_forecasts_attributes
|
16
|
+
|
17
|
+
forecast = "Roker says the forecast for #{started_at.strftime("%B %d, %Y")} is:\n"
|
18
|
+
weather_forecasts_attributes.each do |wfa|
|
19
|
+
# wfa => {
|
20
|
+
# :started_at=>Sat Dec 05 00:17:32 -0500 2009,
|
21
|
+
# :wind_speed=>7.0,
|
22
|
+
# :minimum_temperature=>21.0,
|
23
|
+
# :ended_at=>Sat Dec 05 03:17:32 -0500 2009,
|
24
|
+
# :wind_direction=>180.0,
|
25
|
+
# :temperature=>24.0,
|
26
|
+
# :cloud_cover=>0.0,
|
27
|
+
# :dewpoint_temperature=>12.0,
|
28
|
+
# :lat=>37.0625,
|
29
|
+
# :relative_humidity=>60.0,
|
30
|
+
# :liquid_precipitation=>0.0,
|
31
|
+
# :lng=>-95.677068,
|
32
|
+
# :maximum_temperature=>nil,
|
33
|
+
# :wave_height=>0.0,
|
34
|
+
# :probability_of_precipitation=>0.0
|
35
|
+
# }
|
36
|
+
temp = wfa[:temperature].nan? ? '?' : wfa[:temperature].to_i.to_s
|
37
|
+
pop = wfa[:probability_of_precipitation].nan? ? '?' : wfa[:probability_of_precipitation].to_i.to_s
|
38
|
+
forecast << wfa[:started_at].strftime("%I:%M%p") + "\t" + temp + " deg" + "\t" + pop + "% P.O.P."
|
39
|
+
forecast << "\n"
|
40
|
+
end
|
41
|
+
|
42
|
+
puts forecast
|
data/roker.gemspec
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{roker}
|
8
|
+
s.version = "0.0.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Greg Sterndale"]
|
12
|
+
s.date = %q{2009-12-05}
|
13
|
+
s.description = %q{Weather forecasts from weather.gov}
|
14
|
+
s.email = %q{gsterndale@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".gitignore",
|
22
|
+
"LICENSE",
|
23
|
+
"README.rdoc",
|
24
|
+
"Rakefile",
|
25
|
+
"VERSION",
|
26
|
+
"lib/numeric.rb",
|
27
|
+
"lib/roker.rb",
|
28
|
+
"lib/time.rb",
|
29
|
+
"lib/time_layout.rb",
|
30
|
+
"lib/time_span.rb",
|
31
|
+
"lib/weather_parameter.rb",
|
32
|
+
"roker",
|
33
|
+
"roker.gemspec",
|
34
|
+
"test/helper.rb",
|
35
|
+
"test/test_roker.rb",
|
36
|
+
"test/test_time.rb",
|
37
|
+
"test/test_time_layout.rb",
|
38
|
+
"test/test_time_span.rb",
|
39
|
+
"test/test_weather_parameter.rb",
|
40
|
+
"test/weather_xml.xml"
|
41
|
+
]
|
42
|
+
s.homepage = %q{http://github.com/gsterndale/roker}
|
43
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
44
|
+
s.require_paths = ["lib"]
|
45
|
+
s.rubygems_version = %q{1.3.5}
|
46
|
+
s.summary = %q{Weather forecasts from weather.gov}
|
47
|
+
s.test_files = [
|
48
|
+
"test/helper.rb",
|
49
|
+
"test/test_roker.rb",
|
50
|
+
"test/test_time.rb",
|
51
|
+
"test/test_time_layout.rb",
|
52
|
+
"test/test_time_span.rb",
|
53
|
+
"test/test_weather_parameter.rb"
|
54
|
+
]
|
55
|
+
|
56
|
+
if s.respond_to? :specification_version then
|
57
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
58
|
+
s.specification_version = 3
|
59
|
+
|
60
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
61
|
+
s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
62
|
+
s.add_development_dependency(%q<mocha>, [">= 0.9.1"])
|
63
|
+
s.add_development_dependency(%q<hpricot>, [">= 0.6.164"])
|
64
|
+
else
|
65
|
+
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
66
|
+
s.add_dependency(%q<mocha>, [">= 0.9.1"])
|
67
|
+
s.add_dependency(%q<hpricot>, [">= 0.6.164"])
|
68
|
+
end
|
69
|
+
else
|
70
|
+
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
71
|
+
s.add_dependency(%q<mocha>, [">= 0.9.1"])
|
72
|
+
s.add_dependency(%q<hpricot>, [">= 0.6.164"])
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
data/test/helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'ruby-debug'
|
4
|
+
require 'shoulda'
|
5
|
+
require 'mocha'
|
6
|
+
|
7
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
8
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
9
|
+
require 'roker'
|
10
|
+
|
11
|
+
class Test::Unit::TestCase
|
12
|
+
|
13
|
+
def stub_weather_service
|
14
|
+
Roker.any_instance.stubs(:weather_xml).returns(File.open(File.join(File.dirname(__FILE__), 'weather_xml.xml'), "r").read)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
data/test/test_roker.rb
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestRoker < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
super
|
6
|
+
stub_weather_service
|
7
|
+
end
|
8
|
+
|
9
|
+
context "roker attributes" do
|
10
|
+
setup do
|
11
|
+
@num_days = 2
|
12
|
+
@started_at = Time.mktime(2008, 11, 24, 4, 0, 0) # Time.parse("2008-11-24T04:00:00-05:00") #Time.now+3.days
|
13
|
+
@ended_at = @started_at+@num_days.days
|
14
|
+
@attributes = {:lat => 42, :lng => -81, :started_at => @started_at, :ended_at => @ended_at}
|
15
|
+
end
|
16
|
+
|
17
|
+
context "a roker" do
|
18
|
+
setup { assert @roker = Roker.new(@attributes)}
|
19
|
+
|
20
|
+
should "respond to lat" do
|
21
|
+
assert @roker.respond_to?(:lat)
|
22
|
+
end
|
23
|
+
should "respond to lng" do
|
24
|
+
assert @roker.respond_to?(:lng)
|
25
|
+
end
|
26
|
+
should "respond to started_at" do
|
27
|
+
assert @roker.respond_to?(:started_at)
|
28
|
+
assert_equal @started_at, @roker.started_at
|
29
|
+
end
|
30
|
+
should "respond to ended_at" do
|
31
|
+
assert @roker.respond_to?(:ended_at)
|
32
|
+
assert_equal @ended_at, @roker.ended_at
|
33
|
+
end
|
34
|
+
|
35
|
+
context "weather_forecasts_attributes" do
|
36
|
+
setup { assert @weather_forecasts_attributes = @roker.weather_forecasts_attributes }
|
37
|
+
|
38
|
+
should "weather_forecasts_attributes be array" do
|
39
|
+
assert @weather_forecasts_attributes.is_a?(Array)
|
40
|
+
end
|
41
|
+
|
42
|
+
should "attributes have at least one item" do
|
43
|
+
assert !@weather_forecasts_attributes.empty?
|
44
|
+
end
|
45
|
+
|
46
|
+
context "first weather forecast attributes" do
|
47
|
+
setup { assert @weather_forecast_attributes = @weather_forecasts_attributes.first }
|
48
|
+
should "have lat, lng, started_at, ended_at" do
|
49
|
+
assert_not_nil @weather_forecast_attributes[:lat]
|
50
|
+
assert_not_nil @weather_forecast_attributes[:lng]
|
51
|
+
assert_not_nil @weather_forecast_attributes[:started_at]
|
52
|
+
assert_not_nil @weather_forecast_attributes[:ended_at]
|
53
|
+
end
|
54
|
+
should "have weather attributes" do
|
55
|
+
# assert_not_nil @weather_forecast_attributes[:maximum_temperature]
|
56
|
+
assert_not_nil @weather_forecast_attributes[:minimum_temperature]
|
57
|
+
assert_not_nil @weather_forecast_attributes[:temperature]
|
58
|
+
assert_not_nil @weather_forecast_attributes[:dewpoint_temperature]
|
59
|
+
assert_not_nil @weather_forecast_attributes[:liquid_precipitation]
|
60
|
+
assert_not_nil @weather_forecast_attributes[:probability_of_precipitation]
|
61
|
+
assert_not_nil @weather_forecast_attributes[:wind_speed]
|
62
|
+
assert_not_nil @weather_forecast_attributes[:wind_direction]
|
63
|
+
assert_not_nil @weather_forecast_attributes[:cloud_cover]
|
64
|
+
assert_not_nil @weather_forecast_attributes[:relative_humidity]
|
65
|
+
assert_not_nil @weather_forecast_attributes[:wave_height]
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
should "have weather xml" do
|
72
|
+
assert_not_nil @roker.weather_xml # stubbed
|
73
|
+
end
|
74
|
+
|
75
|
+
should "have weather doc" do
|
76
|
+
assert_not_nil @roker.weather_doc
|
77
|
+
end
|
78
|
+
|
79
|
+
should "parse parameters" do
|
80
|
+
assert_not_nil @roker.parse_parameters
|
81
|
+
end
|
82
|
+
|
83
|
+
should "parse parameters as hash" do
|
84
|
+
assert @roker.parse_parameters.is_a?(Hash)
|
85
|
+
end
|
86
|
+
|
87
|
+
should "parameters not be empty?" do
|
88
|
+
assert !@roker.parse_parameters.empty?
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
data/test/test_time.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestTime < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "a date time" do
|
6
|
+
setup do
|
7
|
+
@time = Time.mktime(1979, 3, 29, 14, 32, 40)
|
8
|
+
@bom = Time.mktime(1979, 3, 29, 14, 32, 0)
|
9
|
+
@eom = Time.mktime(1979, 3, 29, 14, 32, 59)
|
10
|
+
@boh = Time.mktime(1979, 3, 29, 14, 0, 0)
|
11
|
+
@eoh = Time.mktime(1979, 3, 29, 14, 59, 59)
|
12
|
+
end
|
13
|
+
should "beginning_of_minute be beginning of minute" do
|
14
|
+
assert_equal @bom, @time.beginning_of_minute
|
15
|
+
end
|
16
|
+
should "end_of_minute be end of minute" do
|
17
|
+
assert_equal @eom, @time.end_of_minute
|
18
|
+
end
|
19
|
+
should "beginning_of_hour be beginning of hour" do
|
20
|
+
assert_equal @boh, @time.beginning_of_hour
|
21
|
+
end
|
22
|
+
should "end_of_hour be end of hour" do
|
23
|
+
assert_equal @eoh, @time.end_of_hour
|
24
|
+
end
|
25
|
+
|
26
|
+
should "beginning_of(1.minute) equal beginning_of_minute" do
|
27
|
+
assert_equal @time.beginning_of_minute, @time.beginning_of(1.minute)
|
28
|
+
end
|
29
|
+
should "beginning_of(1.hour) equal beginning_of_hour" do
|
30
|
+
assert_equal @time.beginning_of_hour, @time.beginning_of(1.hour)
|
31
|
+
end
|
32
|
+
should "beginning_of(1.day) equal beginning_of_day" do
|
33
|
+
assert_equal @time.beginning_of_day, @time.beginning_of(1.day)
|
34
|
+
end
|
35
|
+
should "beginning_of(1.week) equal beginning_of_week" do
|
36
|
+
assert_equal @time.beginning_of_week, @time.beginning_of(1.week)
|
37
|
+
end
|
38
|
+
should "beginning_of(1.month) equal beginning_of_month" do
|
39
|
+
assert_equal @time.beginning_of_month, @time.beginning_of(1.month)
|
40
|
+
end
|
41
|
+
should "beginning_of(1.year) equal beginning_of_year" do
|
42
|
+
assert_equal @time.beginning_of_year, @time.beginning_of(1.year)
|
43
|
+
end
|
44
|
+
should "end_of(1.minute) equal end_of_minute" do
|
45
|
+
assert_equal @time.end_of_minute, @time.end_of(1.minute)
|
46
|
+
end
|
47
|
+
should "end_of(1.hour) equal end_of_hour" do
|
48
|
+
assert_equal @time.end_of_hour, @time.end_of(1.hour)
|
49
|
+
end
|
50
|
+
should "end_of(1.day) equal end_of_day" do
|
51
|
+
assert_equal @time.end_of_day, @time.end_of(1.day)
|
52
|
+
end
|
53
|
+
should "end_of(1.week) equal end_of_week" do
|
54
|
+
assert_equal @time.end_of_week, @time.end_of(1.week)
|
55
|
+
end
|
56
|
+
should "end_of(1.month) equal end_of_month" do
|
57
|
+
assert_equal @time.end_of_month, @time.end_of(1.month)
|
58
|
+
end
|
59
|
+
should "end_of(1.year) equal end_of_year" do
|
60
|
+
assert_equal @time.end_of_year, @time.end_of(1.year)
|
61
|
+
end
|
62
|
+
|
63
|
+
context "a time 1 day later and a one hour interval" do
|
64
|
+
setup do
|
65
|
+
@time2 = @time + 1.day
|
66
|
+
@interval = 1.hour
|
67
|
+
end
|
68
|
+
should "yield block 25 times on upto" do
|
69
|
+
@time.expects(:foo).times(25).returns(1)
|
70
|
+
@time.upto(@time2, @interval) do
|
71
|
+
@time.foo
|
72
|
+
end
|
73
|
+
end
|
74
|
+
should "yield block 24 times on upto not inclusive" do
|
75
|
+
@time.expects(:foo).times(24).returns(1)
|
76
|
+
@time.upto(@time2, @interval, false) do
|
77
|
+
@time.foo
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestTimeLayout < Test::Unit::TestCase
|
4
|
+
context "a new TimeLayout passed a time spans" do
|
5
|
+
setup do
|
6
|
+
@interval = 3.hours
|
7
|
+
@start_at = Time.now+1.hour
|
8
|
+
@length = 4
|
9
|
+
@time_spans = []
|
10
|
+
(0..(@length-1)).each do |i|
|
11
|
+
@time_spans << TimeSpan.new(:start_at => @start_at+i*@interval, :duration => @interval)
|
12
|
+
end
|
13
|
+
@time_layout = TimeLayout.new(:time_spans => @time_spans)
|
14
|
+
end
|
15
|
+
|
16
|
+
should "have time-spans" do
|
17
|
+
assert !@time_layout.time_spans.empty?
|
18
|
+
end
|
19
|
+
should "have a start_at equal to first time_span start_at" do
|
20
|
+
assert_equal @time_spans.first.start_at, @time_layout.start_at
|
21
|
+
end
|
22
|
+
should "have a end_at equal to last time_span end_at" do
|
23
|
+
assert_equal @time_spans.last.end_at, @time_layout.end_at
|
24
|
+
end
|
25
|
+
should "have a duration" do
|
26
|
+
assert_equal @length * @interval, @time_layout.duration
|
27
|
+
end
|
28
|
+
should "have an interval" do
|
29
|
+
assert_equal @interval, @time_layout.interval
|
30
|
+
end
|
31
|
+
should "have a length" do
|
32
|
+
assert_equal @length, @time_layout.length
|
33
|
+
end
|
34
|
+
|
35
|
+
should "find second time span when using bracket access with 1 as index" do
|
36
|
+
assert_equal @time_spans[1], @time_layout[1]
|
37
|
+
end
|
38
|
+
|
39
|
+
should "find index_at of 2 for specified time enveloped by third time span" do
|
40
|
+
assert_equal 2, @time_layout.index_at(@time_spans[2].start_at+@interval/2)
|
41
|
+
end
|
42
|
+
|
43
|
+
should "find index_at of 2 for specified time when second time span ends and third time span starts" do
|
44
|
+
assert_equal @time_spans[2].start_at, @time_spans[1].end_at
|
45
|
+
assert_equal 2, @time_layout.index_at(@time_spans[2].start_at)
|
46
|
+
end
|
47
|
+
|
48
|
+
should "find index_at of nil for specified time outside time layout" do
|
49
|
+
assert_nil @time_layout.index_at(@start_at - 1.hour)
|
50
|
+
end
|
51
|
+
|
52
|
+
should "have indices_enveloping of [1,2], [0.5, 1.0, 0.5] for time span overlapping second, third and fourth @time_spans" do
|
53
|
+
assert_equal [[1,2,3], [0.5, 1.0, 0.5]], @time_layout.indices_enveloping(TimeSpan.new(:start_at => @time_spans[1].start_at+@interval/2, :end_at => @time_spans[3].end_at-@interval/2))
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context "a new TimeLayout passed start_at and end_at arrays" do
|
58
|
+
setup do
|
59
|
+
@interval = 3.hours
|
60
|
+
@start_at = Time.now+1.hour
|
61
|
+
@length = 4
|
62
|
+
@start_ats = []
|
63
|
+
@end_ats = []
|
64
|
+
(0..(@length-1)).each do |i|
|
65
|
+
@start_ats << @start_at+i*@interval
|
66
|
+
@end_ats << @start_at+(i+1)*@interval
|
67
|
+
end
|
68
|
+
@time_layout = TimeLayout.new(:start_at => @start_ats, :end_at => @end_ats)
|
69
|
+
end
|
70
|
+
|
71
|
+
should "have time_spans" do
|
72
|
+
assert !@time_layout.time_spans.empty?
|
73
|
+
end
|
74
|
+
should "have a start_at equal to first start_at" do
|
75
|
+
assert_equal @start_ats.first, @time_layout.start_at
|
76
|
+
end
|
77
|
+
should "have a end_at equal to last end_at" do
|
78
|
+
assert_equal @end_ats.last, @time_layout.end_at
|
79
|
+
end
|
80
|
+
should "have a duration" do
|
81
|
+
assert_equal @length * @interval, @time_layout.duration
|
82
|
+
end
|
83
|
+
should "have an interval" do
|
84
|
+
assert_equal @interval, @time_layout.interval
|
85
|
+
end
|
86
|
+
should "have a length" do
|
87
|
+
assert_equal @length, @time_layout.length
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
context "a new TimeLayout passed start_at array only" do
|
93
|
+
setup do
|
94
|
+
@interval = 2.days
|
95
|
+
@start_at = Time.now+1.hour
|
96
|
+
@length = 4
|
97
|
+
@start_ats = []
|
98
|
+
(0..(@length-1)).each do |i|
|
99
|
+
@start_ats << @start_at+i*@interval
|
100
|
+
end
|
101
|
+
@time_layout = TimeLayout.new(:start_at => @start_ats)
|
102
|
+
end
|
103
|
+
|
104
|
+
should "have interval of difference between start_ats" do
|
105
|
+
assert_equal @start_ats[1] - @start_ats[0], @time_layout.interval
|
106
|
+
end
|
107
|
+
should "have time_spans" do
|
108
|
+
assert !@time_layout.time_spans.empty?
|
109
|
+
end
|
110
|
+
should "have a start_at equal to first start_at" do
|
111
|
+
assert_equal @start_ats.first, @time_layout.start_at
|
112
|
+
end
|
113
|
+
should "have a end_at equal to last end_at" do
|
114
|
+
assert_equal @start_ats.last+@interval, @time_layout.end_at
|
115
|
+
end
|
116
|
+
should "have a duration" do
|
117
|
+
assert_equal @length * @interval, @time_layout.duration
|
118
|
+
end
|
119
|
+
should "have a length" do
|
120
|
+
assert_equal @length, @time_layout.length
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
context "a new TimeLayout passed start_at array with one element only" do
|
125
|
+
setup do
|
126
|
+
@interval = 2.days
|
127
|
+
@start_at = Time.now+1.hour
|
128
|
+
@length = 1
|
129
|
+
@start_ats = []
|
130
|
+
(0..(@length-1)).each do |i|
|
131
|
+
@start_ats << @start_at+i*@interval
|
132
|
+
end
|
133
|
+
@time_layout = TimeLayout.new(:start_at => @start_ats)
|
134
|
+
end
|
135
|
+
|
136
|
+
should "have default interval" do
|
137
|
+
assert_equal TimeLayout::DEFAULT_INTERVAL, @time_layout.interval
|
138
|
+
end
|
139
|
+
should "have time_spans" do
|
140
|
+
assert !@time_layout.time_spans.empty?
|
141
|
+
end
|
142
|
+
should "have a start_at equal to first start_at" do
|
143
|
+
assert_equal @start_ats.first, @time_layout.start_at
|
144
|
+
end
|
145
|
+
should "have a end_at equal to last end_at" do
|
146
|
+
assert_equal @start_ats.last+TimeLayout::DEFAULT_INTERVAL, @time_layout.end_at
|
147
|
+
end
|
148
|
+
should "have a duration" do
|
149
|
+
assert_equal @length * TimeLayout::DEFAULT_INTERVAL, @time_layout.duration
|
150
|
+
end
|
151
|
+
should "have a length" do
|
152
|
+
assert_equal @length, @time_layout.length
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestTimeSpan < Test::Unit::TestCase
|
4
|
+
context "a new TimeSpan passed a start_at and end_at" do
|
5
|
+
setup do
|
6
|
+
@start_at = Time.now+1.hour
|
7
|
+
@duration = 3.hours
|
8
|
+
@end_at = @start_at+@duration
|
9
|
+
@time_span = TimeSpan.new(:start_at => @start_at, :end_at => @end_at)
|
10
|
+
end
|
11
|
+
should "have a start_at" do
|
12
|
+
assert_equal @start_at, @time_span.start_at
|
13
|
+
end
|
14
|
+
should "have a end_at" do
|
15
|
+
assert_equal @end_at, @time_span.end_at
|
16
|
+
end
|
17
|
+
should "have a duration" do
|
18
|
+
assert_equal @end_at - @start_at, @time_span.duration
|
19
|
+
end
|
20
|
+
|
21
|
+
should "envelopes? @start_at" do
|
22
|
+
assert @time_span.envelopes?(@start_at)
|
23
|
+
end
|
24
|
+
|
25
|
+
should "envelopes? @end_at" do
|
26
|
+
assert @time_span.envelopes?(@end_at)
|
27
|
+
end
|
28
|
+
|
29
|
+
should "envelopes? @end_at when include_end param specified as true" do
|
30
|
+
assert @time_span.envelopes?(@end_at, true)
|
31
|
+
end
|
32
|
+
|
33
|
+
should "not envelopes? @end_at when include_end param specified as false" do
|
34
|
+
assert !@time_span.envelopes?(@end_at, false)
|
35
|
+
end
|
36
|
+
|
37
|
+
should "not envelopes? prior time" do
|
38
|
+
assert !@time_span.envelopes?(@start_at - 1.hour)
|
39
|
+
end
|
40
|
+
|
41
|
+
should "not envelopes? later time" do
|
42
|
+
assert !@time_span.envelopes?(@end_at + 1.hour)
|
43
|
+
end
|
44
|
+
|
45
|
+
should "overlaps? another TimeSpan that happens during @time_span" do
|
46
|
+
assert @time_span.overlaps?(TimeSpan.new(:start_at => @start_at+1, :end_at => @end_at-1))
|
47
|
+
end
|
48
|
+
|
49
|
+
should "overlaps? another TimeSpan that starts during @time_span, but ends after" do
|
50
|
+
assert @time_span.overlaps?(TimeSpan.new(:start_at => @start_at+1, :end_at => @end_at+1))
|
51
|
+
end
|
52
|
+
|
53
|
+
should "overlaps? another TimeSpan that starts before @time_span and ends during" do
|
54
|
+
assert @time_span.overlaps?(TimeSpan.new(:start_at => @start_at-1, :end_at => @end_at-1))
|
55
|
+
end
|
56
|
+
|
57
|
+
should "overlaps? another TimeSpan that starts before @time_span and ends after" do
|
58
|
+
assert @time_span.overlaps?(TimeSpan.new(:start_at => @start_at-1, :end_at => @end_at+1))
|
59
|
+
end
|
60
|
+
|
61
|
+
should "overlaps? another TimeSpan that abutts @time_span" do
|
62
|
+
assert @time_span.overlaps?(TimeSpan.new(:start_at => @end_at, :end_at => @end_at+10))
|
63
|
+
end
|
64
|
+
|
65
|
+
should "not overlaps? another TimeSpan that abutts @time_span afterward when include_end param specified as false" do
|
66
|
+
assert !@time_span.overlaps?(TimeSpan.new(:start_at => @end_at, :end_at => @end_at+10), false)
|
67
|
+
end
|
68
|
+
|
69
|
+
should "not overlaps? another TimeSpan that abutts @time_span beforehand when include_end param specified as false" do
|
70
|
+
assert !@time_span.overlaps?(TimeSpan.new(:start_at => @start_at-10, :end_at => @start_at), false)
|
71
|
+
end
|
72
|
+
|
73
|
+
should "not overlaps? another TimeSpan that happens before @time_span" do
|
74
|
+
assert !@time_span.overlaps?(TimeSpan.new(:start_at => @start_at-10, :end_at => @start_at-5))
|
75
|
+
end
|
76
|
+
|
77
|
+
should "not overlaps? another TimeSpan that happens after @time_span" do
|
78
|
+
assert !@time_span.overlaps?(TimeSpan.new(:start_at => @end_at+10, :end_at => @end_at+50))
|
79
|
+
end
|
80
|
+
|
81
|
+
should "have overlap of @duration/2 with another TimeSpan that starts halfway through @time_span and ends after" do
|
82
|
+
assert_equal @duration/2, @time_span.overlap(TimeSpan.new(:start_at => @start_at+@duration/2, :end_at => @end_at+@duration*2))
|
83
|
+
end
|
84
|
+
|
85
|
+
should "have overlap_by of 0.5 with another TimeSpan that starts halfway through @time_span and ends after" do
|
86
|
+
assert_equal 0.5, @time_span.overlap_by(TimeSpan.new(:start_at => @start_at+@duration/2, :end_at => @end_at+@duration*2))
|
87
|
+
end
|
88
|
+
|
89
|
+
should_eventually "enveloped_by?"
|
90
|
+
end
|
91
|
+
end
|