ascii-tracker 0.0.1 → 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.
- checksums.yaml +4 -4
- data/Guardfile +1 -1
- data/bin/{atracker.rb → atracker} +3 -5
- data/lib/asciitracker.rb +1 -0
- data/lib/asciitracker/app.rb +1 -10
- data/lib/asciitracker/controller.rb +3 -3
- data/lib/asciitracker/exceptions.rb +22 -0
- data/lib/asciitracker/slot.rb +5 -5
- data/lib/asciitracker/version.rb +1 -1
- data/spec/model/{controller_spec.rb → asciitracker/controller_spec.rb} +0 -0
- data/spec/model/{hhmm_spec.rb → asciitracker/hhmm_spec.rb} +0 -0
- data/spec/model/{model_spec.rb → asciitracker/model_spec.rb} +0 -0
- data/spec/model/{record_spec.rb → asciitracker/record_spec.rb} +0 -0
- data/spec/model/asciitracker/slot_spec.rb +208 -0
- metadata +15 -14
- data/spec/model/slot_spec.rb +0 -207
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4d87cd7fac6f81bd5d1bb27cc10c61ac39470270
|
4
|
+
data.tar.gz: 72bc11acb60ff36a25a5e4b4af3420ae64c7c9f2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae181b06b65b5201befe60fecfadfb6968d5908b5fe7c913484082e6487f5cd264c7a412341f63ef362e4441dff5c4ec026fa4c82125c772d019c860f6183c2a
|
7
|
+
data.tar.gz: 935678933dc414e9af31f5fea0084f4e36a5ccd075fac96d51a6ee7f99fbdeecedc27a286c9e4947d8042204c82097a5eaf5a114d0ba7ada861b2ccedcaf01f4
|
data/Guardfile
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
guard :rspec, all_on_start: true, cli: '--format nested --debug --color' do
|
5
5
|
watch(%r{^spec/.+_spec\.rb$})
|
6
|
-
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/
|
6
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/model/#{m[1]}_spec.rb" }
|
7
7
|
watch('spec/spec_helper.rb') { "spec" }
|
8
8
|
watch('lib/asciitracker.rb') { "spec" }
|
9
9
|
end
|
@@ -29,11 +29,9 @@ Applix.main(ARGV, debug: false) do
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def forward(target)
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
target.send(op)
|
36
|
-
end
|
32
|
+
(op = @argv.shift) and target.send(op, self)
|
33
|
+
rescue ArgumentError => e
|
34
|
+
target.send(op)
|
37
35
|
end
|
38
36
|
end
|
39
37
|
|
data/lib/asciitracker.rb
CHANGED
data/lib/asciitracker/app.rb
CHANGED
@@ -5,19 +5,10 @@ module AsciiTracker
|
|
5
5
|
@c = Controller.new
|
6
6
|
end
|
7
7
|
|
8
|
-
def stop
|
9
|
-
puts "Stop!"
|
10
|
-
end
|
11
|
-
|
12
|
-
def foo context
|
13
|
-
puts "Hey!"
|
14
|
-
context.forward(self)
|
15
|
-
end
|
16
|
-
|
17
8
|
def scan context
|
18
9
|
filename = context.argv.shift
|
19
10
|
puts "scanning file: #{filename}"
|
20
|
-
AsciiTracker::Parser.parse
|
11
|
+
AsciiTracker::Parser.parse(@c, IO.read(filename))
|
21
12
|
#puts "records:\n#{records.join("\n")}"
|
22
13
|
#puts "--> 2: #{@c.model}"
|
23
14
|
#puts "--> 3: #{@c.model.records}"
|
@@ -17,18 +17,18 @@ module AsciiTracker
|
|
17
17
|
def new_slot start, stop, desc = nil
|
18
18
|
#slot = Slot.new :date=>@day, :start=> start, :end=>stop, :desc=>desc
|
19
19
|
@rec = @slot = Slot.new(
|
20
|
-
:
|
20
|
+
start: start, end: stop, desc: desc, date: @day.dup
|
21
21
|
)
|
22
22
|
|
23
23
|
# updates parant records when this slot is an interruption
|
24
24
|
overlaps = @model.find_overlaps(@slot, @day)
|
25
|
-
puts "new slot(#{@slot}), overlaps: #{overlaps}"
|
25
|
+
#puts "new slot(#{@slot}), overlaps: #{overlaps}"
|
26
26
|
unless overlaps.empty?
|
27
27
|
# parents are covers which are a subset of overlaps
|
28
28
|
if parent = @model.find_best_cover(@slot, @day)
|
29
29
|
parent.add_interrupt(@slot)
|
30
30
|
else
|
31
|
-
raise
|
31
|
+
raise Exception, <<-EOM
|
32
32
|
#{@slot}
|
33
33
|
overlaps with:
|
34
34
|
#{overlaps.first} ...
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module AsciiTracker
|
2
|
+
|
3
|
+
class Exception < RuntimeError
|
4
|
+
attr_accessor :reason
|
5
|
+
attr_reader :callstack
|
6
|
+
|
7
|
+
def initialize *args
|
8
|
+
super *args
|
9
|
+
@callstack = caller
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class InvalidInterrupt < AsciiTracker::Exception; end
|
14
|
+
class NotYetImplemented < AsciiTracker::Exception; end
|
15
|
+
|
16
|
+
module Exceptions
|
17
|
+
def not_yet_implemented txt = nil
|
18
|
+
txt ||= "#{caller[0]} (caller: #{caller[1]})"
|
19
|
+
raise NotYetImplemented, txt
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/asciitracker/slot.rb
CHANGED
@@ -80,21 +80,21 @@ module AsciiTracker
|
|
80
80
|
def add_interrupt slot_or_span
|
81
81
|
slr = slot_or_span # shortcut
|
82
82
|
unless covers? slr
|
83
|
-
raise
|
83
|
+
raise Exception, "interrupt not covered! #{slr}"
|
84
84
|
end
|
85
85
|
|
86
86
|
unless slr.span <= span
|
87
|
-
raise
|
87
|
+
raise Exception, "'#{self}' overload(#{span}): #{slr}"
|
88
88
|
end
|
89
|
-
#raise
|
89
|
+
#raise Exception, "overload: #{slr}" unless slr.span <= span
|
90
90
|
|
91
91
|
# new interrupts may not overlap with existing ones!
|
92
92
|
if slr.respond_to?(:t_start)
|
93
|
-
#raise
|
93
|
+
#raise Exception, "overlap: #{slr}" if @interrupts.any? do |i|
|
94
94
|
# slr.overlaps? i
|
95
95
|
#end
|
96
96
|
if @interrupts.any? { |rec| slr.overlaps? rec }
|
97
|
-
raise
|
97
|
+
raise Exception, "overlap: #{slr}"
|
98
98
|
end
|
99
99
|
end
|
100
100
|
|
data/lib/asciitracker/version.rb
CHANGED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,208 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include AsciiTracker
|
4
|
+
describe AsciiTracker::Record do
|
5
|
+
|
6
|
+
it "finds the class" do
|
7
|
+
Slot.should_not == nil
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "with 10:45 - 12:15" do
|
11
|
+
let(:rec) { Slot.new start: "10:45", end: "12:15", desc: "foo bar" }
|
12
|
+
|
13
|
+
it "should fit Records" do
|
14
|
+
# span are always contained...
|
15
|
+
rec.covers?(Record.new(:span => 0.5)).should == true
|
16
|
+
rec.covers?(Record.new(:span => 1.5)).should == true
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should not cover records with are to long" do
|
20
|
+
rec.covers?(Record.new(:span => "1:31")).should == false
|
21
|
+
rec.covers?(Record.new(:span => 5.0)).should == false
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should calc slot covers" do
|
25
|
+
rec.covers?(Slot.new(:start=>"10:45", :end=>"12:15")).should == true
|
26
|
+
rec.covers?(Slot.new(:start=>"10:00", :end=>"12:15")).should == false
|
27
|
+
rec.covers?(Slot.new(:start=>"10:45", :end=>"13:00")).should == false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should construct from start, end and desc options" do
|
32
|
+
rec = Slot.new :start => "10:15", :end => "10:45", :desc => "foo bar"
|
33
|
+
rec.desc.should == "foo bar"
|
34
|
+
rec.t_start.should == (HHMM "10:15")
|
35
|
+
rec.t_end.should == (HHMM "10:45")
|
36
|
+
rec.span.should == 0.5
|
37
|
+
rec.gross_length.should == 0.5
|
38
|
+
rec.interrupts.length.should == 0
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should support long overlaps around midnight" do
|
42
|
+
rec = Slot.new :start => "14:00", :end => "02:00"
|
43
|
+
rec.interrupts.length.should == 0
|
44
|
+
rec.span.should == 12
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should cover slots over midnight" do
|
48
|
+
rec = Slot.new :start=>"23:00", :end=>"01:00", :desc=>"foo bar"
|
49
|
+
rec.covers?(Record.new(:span => 1.0)).should == true
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should support slots over midnight" do
|
53
|
+
rec = Slot.new :start=>"23:00", :end=>"01:00", :desc=>"foo bar"
|
54
|
+
rec.span.should == 2
|
55
|
+
rec.interrupts.length.should == 0
|
56
|
+
|
57
|
+
rec = Slot.new :start=>"20:00", :end=>"05:00", :desc=>"foo bar"
|
58
|
+
rec.span.should == 9
|
59
|
+
rec.interrupts.length.should == 0
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "with base slot" do
|
63
|
+
let(:base) { Slot.new start: '5:00', end: '6:00' }
|
64
|
+
|
65
|
+
it "sould calc overlaps" do
|
66
|
+
a = Slot.new :start => "4:00", :end => "4:30"
|
67
|
+
base.overlaps?(a).should == false
|
68
|
+
|
69
|
+
a1 = Slot.new :start => "4:00", :end => "5:00"
|
70
|
+
base.overlaps?(a1).should == false
|
71
|
+
|
72
|
+
b = Slot.new :start => "1:00", :end => "5:30"
|
73
|
+
base.overlaps?(b).should == true
|
74
|
+
|
75
|
+
c = Slot.new :start => "1:00", :end => "7:00"
|
76
|
+
base.overlaps?(c).should == true
|
77
|
+
|
78
|
+
d = Slot.new :start => "5:15", :end => "5:45"
|
79
|
+
base.overlaps?(d).should == true
|
80
|
+
|
81
|
+
d1 = Slot.new :start => "5:00", :end => "5:45"
|
82
|
+
base.overlaps?(d1).should == true
|
83
|
+
|
84
|
+
d2= Slot.new :start => "5:15", :end => "6:00"
|
85
|
+
base.overlaps?(d2).should == true
|
86
|
+
|
87
|
+
e = Slot.new :start => "5:30", :end => "7:00"
|
88
|
+
base.overlaps?(e).should == true
|
89
|
+
|
90
|
+
f = Slot.new :start => "7:00", :end => "9:00"
|
91
|
+
base.overlaps?(f).should == false
|
92
|
+
|
93
|
+
f1 = Slot.new :start => "6:00", :end => "9:00"
|
94
|
+
base.overlaps?(f1).should == false
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
describe "with base over around midnight" do
|
99
|
+
let(:base) { Slot.new start: '22:00', end: '02:00' }
|
100
|
+
|
101
|
+
it "should calc overlaps around midnight" do
|
102
|
+
# before
|
103
|
+
a = Slot.new :start => "20:00", :end => "21:59"
|
104
|
+
base.covers?(a).should == false
|
105
|
+
base.overlaps?(a).should == false
|
106
|
+
# after
|
107
|
+
a = Slot.new :start => "02:01", :end => "04:00"
|
108
|
+
base.covers?(a).should == false
|
109
|
+
base.overlaps?(a).should == false
|
110
|
+
|
111
|
+
a = Slot.new :start => "23:00", :end => "23:10"
|
112
|
+
puts " -- #{[base.t_start, base.t_end, a.t_start, a.t_end].join(', ')}"
|
113
|
+
base.covers?(a).should == true
|
114
|
+
base.overlaps?(a).should == true
|
115
|
+
|
116
|
+
a = Slot.new :start => "23:00", :end => "01:00"
|
117
|
+
puts " -- #{[base.t_start, base.t_end, a.t_start, a.t_end].join(', ')}"
|
118
|
+
base.covers?(a).should == true
|
119
|
+
base.overlaps?(a).should == true
|
120
|
+
|
121
|
+
a = Slot.new :start => "01:00", :end => "01:10"
|
122
|
+
puts " -- #{[base.t_start, base.t_end, a.t_start, a.t_end].join(', ')}"
|
123
|
+
base.overlaps?(a).should == true
|
124
|
+
base.covers?(a).should == true
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
context 'interrups' do
|
129
|
+
|
130
|
+
let(:rec) { Slot.new start: '10:00', end: '12:30', desc: 'whatever' }
|
131
|
+
it 'inits slots as uninterrupted' do
|
132
|
+
rec.interrupts.length.should be(0)
|
133
|
+
end
|
134
|
+
|
135
|
+
context 'with spans' do
|
136
|
+
let(:one_hour) { Record.new span: 1, desc: 'one hour of wasted time' }
|
137
|
+
|
138
|
+
it 'aggregates interrupts and subtracts the interupt time from record' do
|
139
|
+
expect { rec.add_interrupt one_hour }.not_to raise_error
|
140
|
+
rec.interrupts.length.should eq(1)
|
141
|
+
rec.span.should eq(1.5)
|
142
|
+
|
143
|
+
expect { rec.add_interrupt one_hour }.not_to raise_error
|
144
|
+
rec.interrupts.length.should eq(2)
|
145
|
+
rec.span.should eq(0.5)
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'raises error on interrupt not fitting the record' do
|
149
|
+
expect { rec.add_interrupt one_hour }.not_to raise_error
|
150
|
+
expect { rec.add_interrupt one_hour }.not_to raise_error
|
151
|
+
expect { rec.add_interrupt one_hour }.to raise_error(
|
152
|
+
AsciiTracker::Exception, /overload\(0.5\).*one hour of wasted time/
|
153
|
+
)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
context 'with other slots' do
|
158
|
+
let(:rec) { Slot.new start: '10:00', end: '12:30', desc: 'foo bar' }
|
159
|
+
|
160
|
+
it 'aggregates interrupts and subtracts the interupt time from record' do
|
161
|
+
rec.add_interrupt(Slot.new start: '10:00', end: '12:00', desc: '?')
|
162
|
+
rec.interrupts.length.should eq(1)
|
163
|
+
rec.span.should eq(0.5)
|
164
|
+
|
165
|
+
rec.add_interrupt(Slot.new start: '12:00', end: '12:15', desc: '?')
|
166
|
+
rec.interrupts.length.should eq(2)
|
167
|
+
rec.span.should eq(0.25)
|
168
|
+
|
169
|
+
rec.add_interrupt(Slot.new start: '12:15', end: '12:30', desc: '?')
|
170
|
+
rec.interrupts.length.should eq(3)
|
171
|
+
rec.span.should eq(0.0)
|
172
|
+
end
|
173
|
+
|
174
|
+
it 'bails out on records overlapping start or end time' do
|
175
|
+
expect {
|
176
|
+
rec.add_interrupt(Slot.new start: '12:30', end: '13:00', desc: 'X')
|
177
|
+
}.to raise_error(
|
178
|
+
AsciiTracker::Exception, /interrupt not covered!.*12:30-13:00/
|
179
|
+
)
|
180
|
+
|
181
|
+
expect {
|
182
|
+
rec.add_interrupt(Slot.new start: '09:30', end: '11:00', desc: 'X')
|
183
|
+
}.to raise_error(
|
184
|
+
AsciiTracker::Exception, /interrupt not covered!.*09:30-11:00/
|
185
|
+
)
|
186
|
+
|
187
|
+
expect {
|
188
|
+
rec.add_interrupt(Slot.new start: '09:59', end: '12:01', desc: 'X')
|
189
|
+
}.to raise_error(
|
190
|
+
AsciiTracker::Exception, /interrupt not covered!.*09:59-12:01/
|
191
|
+
)
|
192
|
+
end
|
193
|
+
|
194
|
+
it 'raises error on stuffin slot to overfilled record' do
|
195
|
+
rec.add_interrupt(Slot.new start: '10:00', end: '12:30', desc: '?')
|
196
|
+
rec.interrupts.length.should eq(1)
|
197
|
+
rec.span.should eq(0.0)
|
198
|
+
# rec is full now
|
199
|
+
|
200
|
+
expect {
|
201
|
+
rec.add_interrupt(Slot.new start: '10:01', end: '10:02', desc: 'X')
|
202
|
+
}.to raise_error(
|
203
|
+
AsciiTracker::Exception, /overload\(0.0\): 2013-07-11 10:01-10:02 X/
|
204
|
+
)
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ascii-tracker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- dirk lüsebrink
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-07-
|
11
|
+
date: 2013-07-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: applix
|
@@ -86,7 +86,7 @@ description: "\n keeping track of time in a textfile. now web app, no mouse c
|
|
86
86
|
email:
|
87
87
|
- dirk.luesebrink@gmail.com
|
88
88
|
executables:
|
89
|
-
- atracker
|
89
|
+
- atracker
|
90
90
|
extensions: []
|
91
91
|
extra_rdoc_files: []
|
92
92
|
files:
|
@@ -98,10 +98,11 @@ files:
|
|
98
98
|
- README.md
|
99
99
|
- Rakefile
|
100
100
|
- ascii-tracker.gemspec
|
101
|
-
- bin/atracker
|
101
|
+
- bin/atracker
|
102
102
|
- lib/asciitracker.rb
|
103
103
|
- lib/asciitracker/app.rb
|
104
104
|
- lib/asciitracker/controller.rb
|
105
|
+
- lib/asciitracker/exceptions.rb
|
105
106
|
- lib/asciitracker/hash_ext.rb
|
106
107
|
- lib/asciitracker/hhmm.rb
|
107
108
|
- lib/asciitracker/model.rb
|
@@ -110,11 +111,11 @@ files:
|
|
110
111
|
- lib/asciitracker/record.rb
|
111
112
|
- lib/asciitracker/slot.rb
|
112
113
|
- lib/asciitracker/version.rb
|
113
|
-
- spec/model/controller_spec.rb
|
114
|
-
- spec/model/hhmm_spec.rb
|
115
|
-
- spec/model/model_spec.rb
|
116
|
-
- spec/model/record_spec.rb
|
117
|
-
- spec/model/slot_spec.rb
|
114
|
+
- spec/model/asciitracker/controller_spec.rb
|
115
|
+
- spec/model/asciitracker/hhmm_spec.rb
|
116
|
+
- spec/model/asciitracker/model_spec.rb
|
117
|
+
- spec/model/asciitracker/record_spec.rb
|
118
|
+
- spec/model/asciitracker/slot_spec.rb
|
118
119
|
- spec/spec_helper.rb
|
119
120
|
homepage: ''
|
120
121
|
licenses:
|
@@ -141,9 +142,9 @@ signing_key:
|
|
141
142
|
specification_version: 4
|
142
143
|
summary: time tracking the ascii way
|
143
144
|
test_files:
|
144
|
-
- spec/model/controller_spec.rb
|
145
|
-
- spec/model/hhmm_spec.rb
|
146
|
-
- spec/model/model_spec.rb
|
147
|
-
- spec/model/record_spec.rb
|
148
|
-
- spec/model/slot_spec.rb
|
145
|
+
- spec/model/asciitracker/controller_spec.rb
|
146
|
+
- spec/model/asciitracker/hhmm_spec.rb
|
147
|
+
- spec/model/asciitracker/model_spec.rb
|
148
|
+
- spec/model/asciitracker/record_spec.rb
|
149
|
+
- spec/model/asciitracker/slot_spec.rb
|
149
150
|
- spec/spec_helper.rb
|
data/spec/model/slot_spec.rb
DELETED
@@ -1,207 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
include AsciiTracker
|
4
|
-
describe "AsciiTracker::Record" do
|
5
|
-
it "finds the class" do
|
6
|
-
Slot.should_not == nil
|
7
|
-
end
|
8
|
-
|
9
|
-
describe "with 10:45 - 12:15" do
|
10
|
-
before :each do
|
11
|
-
@rec = Slot.new :start=>"10:45", :end=>"12:15", :desc=>"foo bar"
|
12
|
-
end
|
13
|
-
|
14
|
-
it "should fit Records" do
|
15
|
-
# span are always contained...
|
16
|
-
@rec.covers?(Record.new(:span => 0.5)).should == true
|
17
|
-
@rec.covers?(Record.new(:span => 1.5)).should == true
|
18
|
-
end
|
19
|
-
|
20
|
-
it "should not cover records with are to long" do
|
21
|
-
@rec.covers?(Record.new(:span => "1:31")).should == false
|
22
|
-
@rec.covers?(Record.new(:span => 5.0)).should == false
|
23
|
-
end
|
24
|
-
|
25
|
-
it "should calc slot covers" do
|
26
|
-
@rec.covers?(Slot.new(:start=>"10:45", :end=>"12:15")).should == true
|
27
|
-
@rec.covers?(Slot.new(:start=>"10:00", :end=>"12:15")).should == false
|
28
|
-
@rec.covers?(Slot.new(:start=>"10:45", :end=>"13:00")).should == false
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
it "should construct from start, end and desc options" do
|
33
|
-
rec = Slot.new :start => "10:15", :end => "10:45", :desc => "foo bar"
|
34
|
-
rec.desc.should == "foo bar"
|
35
|
-
rec.t_start.should == (HHMM "10:15")
|
36
|
-
rec.t_end.should == (HHMM "10:45")
|
37
|
-
rec.span.should == 0.5
|
38
|
-
rec.gross_length.should == 0.5
|
39
|
-
rec.interrupts.length.should == 0
|
40
|
-
end
|
41
|
-
|
42
|
-
it "should support long overlaps around midnight" do
|
43
|
-
rec = Slot.new :start => "14:00", :end => "02:00"
|
44
|
-
rec.interrupts.length.should == 0
|
45
|
-
rec.span.should == 12
|
46
|
-
end
|
47
|
-
|
48
|
-
it "should cover slots over midnight" do
|
49
|
-
rec = Slot.new :start=>"23:00", :end=>"01:00", :desc=>"foo bar"
|
50
|
-
rec.covers?(Record.new(:span => 1.0)).should == true
|
51
|
-
end
|
52
|
-
|
53
|
-
it "should support slots over midnight" do
|
54
|
-
rec = Slot.new :start=>"23:00", :end=>"01:00", :desc=>"foo bar"
|
55
|
-
rec.span.should == 2
|
56
|
-
rec.interrupts.length.should == 0
|
57
|
-
|
58
|
-
rec = Slot.new :start=>"20:00", :end=>"05:00", :desc=>"foo bar"
|
59
|
-
rec.span.should == 9
|
60
|
-
rec.interrupts.length.should == 0
|
61
|
-
end
|
62
|
-
|
63
|
-
describe "with base slot" do
|
64
|
-
before :each do
|
65
|
-
@base = Slot.new :start => "5:00", :end => "6:00"
|
66
|
-
end
|
67
|
-
|
68
|
-
it "sould calc overlaps" do
|
69
|
-
a = Slot.new :start => "4:00", :end => "4:30"
|
70
|
-
@base.overlaps?(a).should == false
|
71
|
-
|
72
|
-
a1 = Slot.new :start => "4:00", :end => "5:00"
|
73
|
-
@base.overlaps?(a1).should == false
|
74
|
-
|
75
|
-
b = Slot.new :start => "1:00", :end => "5:30"
|
76
|
-
@base.overlaps?(b).should == true
|
77
|
-
|
78
|
-
c = Slot.new :start => "1:00", :end => "7:00"
|
79
|
-
@base.overlaps?(c).should == true
|
80
|
-
|
81
|
-
d = Slot.new :start => "5:15", :end => "5:45"
|
82
|
-
@base.overlaps?(d).should == true
|
83
|
-
|
84
|
-
d1 = Slot.new :start => "5:00", :end => "5:45"
|
85
|
-
@base.overlaps?(d1).should == true
|
86
|
-
|
87
|
-
d2= Slot.new :start => "5:15", :end => "6:00"
|
88
|
-
@base.overlaps?(d2).should == true
|
89
|
-
|
90
|
-
e = Slot.new :start => "5:30", :end => "7:00"
|
91
|
-
@base.overlaps?(e).should == true
|
92
|
-
|
93
|
-
f = Slot.new :start => "7:00", :end => "9:00"
|
94
|
-
@base.overlaps?(f).should == false
|
95
|
-
|
96
|
-
f1 = Slot.new :start => "6:00", :end => "9:00"
|
97
|
-
@base.overlaps?(f1).should == false
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
describe "with base over around midnight" do
|
102
|
-
before :each do
|
103
|
-
@base = Slot.new :start => "22:00", :end => "02:00"
|
104
|
-
end
|
105
|
-
|
106
|
-
it "should calc overlaps around midnight" do
|
107
|
-
# before
|
108
|
-
a = Slot.new :start => "20:00", :end => "21:59"
|
109
|
-
@base.covers?(a).should == false
|
110
|
-
@base.overlaps?(a).should == false
|
111
|
-
# after
|
112
|
-
a = Slot.new :start => "02:01", :end => "04:00"
|
113
|
-
@base.covers?(a).should == false
|
114
|
-
@base.overlaps?(a).should == false
|
115
|
-
|
116
|
-
a = Slot.new :start => "23:00", :end => "23:10"
|
117
|
-
puts " -- #{[@base.t_start, @base.t_end, a.t_start, a.t_end].join(', ')}"
|
118
|
-
@base.covers?(a).should == true
|
119
|
-
@base.overlaps?(a).should == true
|
120
|
-
|
121
|
-
a = Slot.new :start => "23:00", :end => "01:00"
|
122
|
-
puts " -- #{[@base.t_start, @base.t_end, a.t_start, a.t_end].join(', ')}"
|
123
|
-
@base.covers?(a).should == true
|
124
|
-
@base.overlaps?(a).should == true
|
125
|
-
|
126
|
-
a = Slot.new :start => "01:00", :end => "01:10"
|
127
|
-
puts " -- #{[@base.t_start, @base.t_end, a.t_start, a.t_end].join(', ')}"
|
128
|
-
@base.overlaps?(a).should == true
|
129
|
-
@base.covers?(a).should == true
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|
133
|
-
__END__
|
134
|
-
|
135
|
-
class SlotTest < Test::Unit::TestCase
|
136
|
-
|
137
|
-
include Timecard
|
138
|
-
|
139
|
-
|
140
|
-
def test_overlaps_around_midnight
|
141
|
-
puts "\n--> #{self}"
|
142
|
-
|
143
|
-
base = Slot.new :start => "22:00", :end => "02:00"
|
144
|
-
|
145
|
-
# before
|
146
|
-
a = Slot.new :start => "20:00", :end => "21:59"
|
147
|
-
assert ! base.covers?(a)
|
148
|
-
assert ! base.overlaps?(a)
|
149
|
-
# after
|
150
|
-
a = Slot.new :start => "02:01", :end => "04:00"
|
151
|
-
assert ! base.covers?(a)
|
152
|
-
assert ! base.overlaps?(a)
|
153
|
-
|
154
|
-
a = Slot.new :start => "23:00", :end => "23:10"
|
155
|
-
puts " -- #{[base.t_start, base.t_end, a.t_start, a.t_end].join(', ')}"
|
156
|
-
assert base.covers?(a)
|
157
|
-
assert base.overlaps?(a)
|
158
|
-
|
159
|
-
a = Slot.new :start => "23:00", :end => "01:00"
|
160
|
-
puts " -- #{[base.t_start, base.t_end, a.t_start, a.t_end].join(', ')}"
|
161
|
-
assert base.covers?(a)
|
162
|
-
assert base.overlaps?(a)
|
163
|
-
|
164
|
-
a = Slot.new :start => "01:00", :end => "01:10"
|
165
|
-
puts " -- #{[base.t_start, base.t_end, a.t_start, a.t_end].join(', ')}"
|
166
|
-
assert base.overlaps?(a)
|
167
|
-
assert base.covers?(a)
|
168
|
-
end
|
169
|
-
|
170
|
-
def test_add_interrupt_slot_or_span
|
171
|
-
puts "\n--> #{self}"
|
172
|
-
rec = Slot.new :start=>"10:00", :end=>"12:30", :desc=>"foo bar"
|
173
|
-
assert_equal 2.5, rec.span
|
174
|
-
assert_equal 0, rec.interrupts.length
|
175
|
-
|
176
|
-
wasted_time = Record.new :span => 1, :desc => "one hour of wasted time"
|
177
|
-
rec.add_interrupt wasted_time
|
178
|
-
assert_equal 1, rec.interrupts.length
|
179
|
-
assert_equal 1.5, rec.span
|
180
|
-
rec.add_interrupt wasted_time
|
181
|
-
assert_equal 2, rec.interrupts.length
|
182
|
-
assert_equal 0.5, rec.span
|
183
|
-
|
184
|
-
assert_raise(TimecardException) { rec.add_interrupt(wasted_time) }
|
185
|
-
|
186
|
-
rec = Slot.new :start=>"10:00", :end=>"12:30", :desc=>"foo bar"
|
187
|
-
slot = Slot.new :start=>"10:00", :end => "12:00", :desc => "intruppt"
|
188
|
-
rec.add_interrupt(slot)
|
189
|
-
assert_equal 0.5, rec.span
|
190
|
-
|
191
|
-
slot = Slot.new :start=>"12:30", :end => "13:00", :desc => "intruppt"
|
192
|
-
assert_raise(TimecardException) { rec.add_interrupt(slot) }
|
193
|
-
slot = Slot.new :start=>"09:30", :end => "11:00", :desc => "intruppt"
|
194
|
-
assert_raise(TimecardException) { rec.add_interrupt(slot) }
|
195
|
-
|
196
|
-
slot = Slot.new :start=>"12:00", :end => "12:15", :desc => "intruppt"
|
197
|
-
rec.add_interrupt(slot)
|
198
|
-
assert_equal 0.25, rec.span
|
199
|
-
slot = Slot.new :start=>"12:15", :end => "12:30", :desc => "intruppt"
|
200
|
-
rec.add_interrupt(slot)
|
201
|
-
assert_equal 0.0, rec.span
|
202
|
-
|
203
|
-
slot = Slot.new :start=>"12:15", :end => "12:30", :desc => "intruppt"
|
204
|
-
assert_raise(TimecardException) { rec.add_interrupt(slot) }
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|