domodoro 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,80 @@
1
+ module Domodoro
2
+ class Timepoint
3
+ attr_reader :hour, :min
4
+
5
+ def initialize(*args)
6
+ case args.first
7
+ when String
8
+ @hour, @min = args.first.split(':').map(&:to_i)
9
+ when Fixnum
10
+ @hour, @min = args.first, args.last
11
+ end
12
+ end
13
+
14
+ def +(minutes)
15
+ hours_to_advance = ((@min + minutes) / 60).to_i
16
+
17
+ h = @hour + hours_to_advance
18
+ m = (@min + minutes) % 60
19
+
20
+ Timepoint.new("#{h}:#{m}")
21
+ end
22
+
23
+ def after?(timepoint)
24
+ if @hour > timepoint.hour
25
+ true
26
+ elsif @hour == timepoint.hour
27
+ @min >= timepoint.min
28
+ else
29
+ false
30
+ end
31
+ end
32
+
33
+ def before?(timepoint)
34
+ if @hour < timepoint.hour
35
+ true
36
+ elsif @hour == timepoint.hour
37
+ @min < timepoint.min
38
+ else
39
+ false
40
+ end
41
+ end
42
+
43
+ def ==(timepoint)
44
+ case timepoint
45
+ when String
46
+ Timepoint.new(timepoint) == self
47
+ when Timepoint
48
+ @hour == timepoint.hour && @min == timepoint.min
49
+ end
50
+ end
51
+
52
+ def to_s
53
+ [@hour, @min].map(&:to_s).map do |number|
54
+ number.rjust(2, '0')
55
+ end.join(':')
56
+ end
57
+
58
+ def left_until(timestamp)
59
+ secs = 59 - Time.now.sec
60
+ hours = timestamp.hour - @hour
61
+
62
+ if timestamp.hour == @hour
63
+ remaining_minutes = (timestamp.min - @min - 1).to_s.rjust(2, '0')
64
+ return "00:#{remaining_minutes}:#{secs.to_s.rjust(2, '0')}"
65
+ end
66
+
67
+ if timestamp.min < @min
68
+ hours -= 1
69
+ end
70
+
71
+ mins = ((timestamp.min - @min) % 60) - 1
72
+
73
+ h = hours.to_s.rjust(2, '0')
74
+ m = mins.to_s.rjust(2, '0')
75
+ s = secs.to_s.rjust(2, '0')
76
+
77
+ "#{h}:#{m}:#{s}"
78
+ end
79
+ end
80
+ end
@@ -1,3 +1,3 @@
1
1
  module Domodoro
2
- VERSION = "0.0.4"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -11,123 +11,38 @@ module Domodoro
11
11
  end
12
12
 
13
13
  describe 'broadcast' do
14
- describe 'in the morning' do
15
- it 'broadcasts from 8:00 until 12:59' do
16
- @channel.expects(:morning).with(5).never
17
- @channel.expects(:morning).with(10).once
18
- @channel.expects(:morning).with(15).once
19
- @channel.expects(:morning).with(20).once
20
- @channel.expects(:morning).with(25).once
21
- @channel.expects(:morning).with(30).once
22
- @channel.expects(:morning).with(35).never
23
-
24
- min = 0
25
- (7..13).each do |hour|
26
- min += 5
27
- @channel.broadcast(hour, min)
28
- end
29
- end
30
- end
31
-
32
- describe 'in the afternoon' do
33
- it 'broadcasts from 13:20 on' do
34
- @channel.expects(:afternoon).with(5).never
35
- @channel.expects(:afternoon).with(10).never
36
- @channel.expects(:afternoon).with(15).never
37
- @channel.expects(:afternoon).with(20).once
38
- @channel.expects(:afternoon).with(25).once
39
- @channel.expects(:afternoon).with(30).once
40
- @channel.expects(:afternoon).with(35).once
41
-
42
- min = 0
43
- (13..19).each do |hour|
44
- min += 5
45
- @channel.broadcast(hour, min)
46
- end
47
- end
48
- end
49
-
50
- it 'does not broadcast during lunch time' do
51
- %w(morning afternoon).each do |timespan|
52
- @channel.expects(timespan).with(5).never
53
- end
54
-
55
- (0..19).each do |min|
56
- @channel.broadcast(13, min)
57
- end
14
+ before do
15
+ @schedule = Schedule.new
16
+ @schedule.instance_variable_set(:@times, {
17
+ '08:30' => :start,
18
+ '09:00' => :stop
19
+ })
58
20
  end
59
- end
60
21
 
61
- describe '#morning' do
62
- describe 'pomodoro starts' do
63
- it 'broadcasts a :start message when the time is XX:00' do
64
- @channel.expects(:<<).with(:start)
65
- @channel.morning 0
66
- end
22
+ describe 'if theres an action for the timestamp' do
23
+ it 'broadcasts it' do
24
+ @channel.expects(:<<).with(
25
+ :current_action => ["08:30", :start],
26
+ :next_action => ["09:00", :stop]
27
+ )
28
+ @channel.expects(:<<).with(
29
+ :current_action => ["09:00", :stop],
30
+ :next_action => nil
31
+ )
67
32
 
68
- it 'broadcasts a :start message when the time is XX:30' do
69
- @channel.expects(:<<).with(:start)
70
- @channel.morning 30
33
+ @channel.broadcast("08:30", @schedule)
34
+ @channel.broadcast("09:00", @schedule)
71
35
  end
72
36
  end
73
37
 
74
- describe 'pomodoro stops' do
75
- it 'broadcasts a :stop message when the time is XX:25' do
76
- @channel.expects(:<<).with(:stop)
77
- @channel.morning 25
78
- end
38
+ describe 'otherwise' do
39
+ it 'does not' do
40
+ @channel.expects(:<<).never
79
41
 
80
- it 'broadcasts a :stop message when the time is XX:55' do
81
- @channel.expects(:<<).with(:stop)
82
- @channel.morning 55
42
+ @channel.broadcast("07:30", @schedule)
43
+ @channel.broadcast("08:31", @schedule)
83
44
  end
84
45
  end
85
-
86
- it 'does not broadcast anything at other times' do
87
- @channel.expects(:<<).never
88
-
89
- @channel.morning 5
90
- @channel.morning 10
91
- @channel.morning 20
92
- @channel.morning 40
93
- @channel.morning 50
94
- end
95
- end
96
-
97
- describe '#afternoon' do
98
- describe 'pomodoro starts' do
99
- it 'broadcasts a :start message when the time is XX:20' do
100
- @channel.expects(:<<).with(:start)
101
- @channel.afternoon 20
102
- end
103
-
104
- it 'broadcasts a :start message when the time is XX:50' do
105
- @channel.expects(:<<).with(:start)
106
- @channel.afternoon 50
107
- end
108
- end
109
-
110
- describe 'pomodoro stops' do
111
- it 'broadcasts a :stop message when the time is XX:45' do
112
- @channel.expects(:<<).with(:stop)
113
- @channel.afternoon 45
114
- end
115
-
116
- it 'broadcasts a :stop message when the time is XX:15' do
117
- @channel.expects(:<<).with(:stop)
118
- @channel.afternoon 15
119
- end
120
- end
121
-
122
- it 'does not broadcast anything at other times' do
123
- @channel.expects(:<<).never
124
-
125
- @channel.afternoon 5
126
- @channel.afternoon 10
127
- @channel.afternoon 25
128
- @channel.afternoon 40
129
- @channel.afternoon 55
130
- end
131
46
  end
132
47
  end
133
48
  end
@@ -1,160 +1,96 @@
1
1
  require 'test_helper'
2
2
 
3
- module ExampleServer; end
3
+ module ExampleServer
4
+ include EM::P::ObjectProtocol
5
+ end
4
6
 
5
7
  module Domodoro
6
8
  describe Client do
7
9
  include EM::MiniTest::Spec
8
10
 
9
- it 'calls .work when receives :start', :timeout => 0.3 do
10
- EM.start_server '127.0.0.1', 12345, ExampleServer do |conn|
11
- conn.send_data ":start\n"
12
- end
13
-
14
- Client.expects(:work)
15
-
16
- Client.start '127.0.0.1', 12345
17
-
18
- EM.add_timer(0.2) do
19
- mocha_verify
20
- done!
21
- end
22
-
23
- wait!
24
- end
25
-
26
- it 'calls .break when receives :stop', :timeout => 0.3 do
27
- EM.start_server '127.0.0.1', 12345, ExampleServer do |conn|
28
- conn.send_data ":stop\n"
29
- end
30
-
31
- Client.expects(:break)
32
-
33
- Client.start '127.0.0.1', 12345
34
-
35
- EM.add_timer(0.2) do
36
- mocha_verify
37
- done!
38
- end
39
-
40
- wait!
41
- end
42
-
43
- describe '.work' do
44
- describe 'if sound is activated' do
45
- it 'plays a sound', :timeout => 0.2 do
46
- Config.stubs(:sound).returns true
47
- Client.expects(:system)
48
- Client.work
49
-
50
- EM.add_timer(0.1) do
51
- mocha_verify
52
- done!
53
- end
54
- wait!
11
+ [
12
+ [:start, :work],
13
+ [:stop, :break],
14
+ [:lunch, :lunch],
15
+ [:go_home, :home],
16
+ ].each do |message, action|
17
+ it "calls .#{action} when receives :#{message}", :timeout => 0.3 do
18
+ EM.start_server '127.0.0.1', 12345, ExampleServer do |conn|
19
+ conn.send_object({:current_action => ["08:30", message] })
55
20
  end
56
- end
57
-
58
- describe 'otherwise' do
59
- it 'does not play a sound', :timeout => 0.2 do
60
- Config.stubs(:sound).returns false
61
- Client.expects(:system).never
62
- Client.work
63
21
 
64
- EM.add_timer(0.1) do
65
- mocha_verify
66
- done!
67
- end
68
- wait!
69
- end
70
- end
22
+ Client.expects(action)
71
23
 
72
- describe 'if visual is activated' do
73
- it 'displays a visual notification', :timeout => 0.2 do
74
- Config.stubs(:visual).returns true
75
- Notify.expects(:notify)
76
- Client.work
24
+ Client.start '127.0.0.1', 12345
77
25
 
78
- EM.add_timer(0.1) do
79
- mocha_verify
80
- done!
81
- end
82
- wait!
26
+ EM.add_timer(0.2) do
27
+ mocha_verify
28
+ done!
83
29
  end
84
- end
85
-
86
- describe 'otherwise' do
87
- it 'does not display any visual notification', :timeout => 0.2 do
88
- Config.stubs(:visual).returns false
89
- Notify.expects(:notify).never
90
- Client.work
91
30
 
92
- EM.add_timer(0.1) do
93
- mocha_verify
94
- done!
95
- end
96
- wait!
97
- end
31
+ wait!
98
32
  end
99
33
  end
100
34
 
101
- describe '.break' do
102
- describe 'if sound is activated' do
103
- it 'plays a sound', :timeout => 0.2 do
104
- Config.stubs(:sound).returns true
105
- Client.expects(:system)
106
- Client.break
107
-
108
- EM.add_timer(0.1) do
109
- mocha_verify
110
- done!
35
+ %w(work break lunch home).each do |action|
36
+ describe ".#{action}" do
37
+ describe 'if sound is activated' do
38
+ it 'plays a sound', :timeout => 0.3 do
39
+ Config.stubs(:sound).returns true
40
+ Client.expects(:system)
41
+ Client.send action
42
+
43
+ EM.add_timer(0.2) do
44
+ mocha_verify
45
+ done!
46
+ end
47
+ wait!
111
48
  end
112
- wait!
113
49
  end
114
50
 
115
- end
116
-
117
- describe 'otherwise' do
118
- it 'does not play a sound', :timeout => 0.2 do
119
- Config.stubs(:sound).returns false
120
- Client.expects(:system).never
121
- Client.break
122
-
123
- EM.add_timer(0.1) do
124
- mocha_verify
125
- done!
51
+ describe 'otherwise' do
52
+ it 'does not play a sound', :timeout => 0.2 do
53
+ Config.stubs(:sound).returns false
54
+ Client.expects(:system).never
55
+ Client.send action
56
+
57
+ EM.add_timer(0.1) do
58
+ mocha_verify
59
+ done!
60
+ end
61
+ wait!
126
62
  end
127
- wait!
128
63
  end
129
- end
130
64
 
131
- describe 'if visual is activated' do
132
- it 'displays a visual notification', :timeout => 0.2 do
133
- Config.stubs(:visual).returns true
134
- Notify.expects(:notify)
135
- Client.break
136
-
137
- EM.add_timer(0.1) do
138
- mocha_verify
139
- done!
65
+ describe 'if visual is activated' do
66
+ it 'displays a visual notification', :timeout => 0.2 do
67
+ Config.stubs(:visual).returns true
68
+ Notify.expects(:notify)
69
+ Client.send action
70
+
71
+ EM.add_timer(0.1) do
72
+ mocha_verify
73
+ done!
74
+ end
75
+ wait!
140
76
  end
141
- wait!
142
77
  end
143
- end
144
78
 
145
- describe 'otherwise' do
146
- it 'does not display any visual notification', :timeout => 0.2 do
147
- Config.stubs(:visual).returns false
148
- Notify.expects(:notify).never
149
- Client.break
150
-
151
- EM.add_timer(0.1) do
152
- mocha_verify
153
- done!
79
+ describe 'otherwise' do
80
+ it 'does not display any visual notification', :timeout => 0.2 do
81
+ Config.stubs(:visual).returns false
82
+ Notify.expects(:notify).never
83
+ Client.send action
84
+
85
+ EM.add_timer(0.1) do
86
+ mocha_verify
87
+ done!
88
+ end
89
+ wait!
154
90
  end
155
- wait!
156
91
  end
157
92
  end
158
93
  end
94
+
159
95
  end
160
96
  end