blinkenlights 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. data/CHANGES +5 -0
  2. data/Rakefile +8 -2
  3. data/VERSION +1 -1
  4. data/lib/blinkenlights.rb +37 -9
  5. data/tests/test.rb +206 -0
  6. metadata +7 -5
data/CHANGES CHANGED
@@ -1,3 +1,8 @@
1
+ 2006-06-09 - 0.0.4 * Added unit tests.
2
+ * Disabled autorequire in Rakefile
3
+ * closed BlinkenLights instances now throw IO::Error on
4
+ Windows, too.
5
+ * Improved documentation further.
1
6
  2006-06-08 - 0.0.3 * Added support for Windows. The relevant code parts were
2
7
  contributed by Dave Burt <dave@burt.id.au>. Thanks a lot!
3
8
  2005-10-18 - 0.0.2 * Some small bugs fixed
data/Rakefile CHANGED
@@ -12,6 +12,7 @@ task :install do
12
12
  ruby 'install.rb'
13
13
  end
14
14
 
15
+ desc "Creating documentation"
15
16
  task :doc do
16
17
  ruby 'make_doc.rb'
17
18
  end
@@ -22,6 +23,11 @@ task :clean do
22
23
  rm_rf 'coverage'
23
24
  end
24
25
 
26
+ desc "Testing library"
27
+ task :test do
28
+ ruby '-I lib tests/test.rb'
29
+ end
30
+
25
31
  spec = Gem::Specification.new do |s|
26
32
  #### Basic information.
27
33
 
@@ -44,7 +50,7 @@ spec = Gem::Specification.new do |s|
44
50
  #### Load-time details: library and application (you will need one or both).
45
51
 
46
52
  s.require_path = 'lib' # Use these for libraries.
47
- s.autorequire = 'blinkenlights'
53
+ #s.autorequire = 'blinkenlights'
48
54
 
49
55
  #s.bindir = "bin" # Use these for applications.
50
56
  #s.executables = ["bla.rb"]
@@ -55,7 +61,7 @@ spec = Gem::Specification.new do |s|
55
61
  s.has_rdoc = true
56
62
  #s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$/ }.to_a
57
63
  s.rdoc_options << '--title' << 'BlinkenLights in Ruby' << '--main' << 'BlinkenLights'
58
- #s.test_files << 'tests/runner.rb'
64
+ s.test_files << 'tests/test.rb'
59
65
 
60
66
  #### Author and project details.
61
67
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.3
1
+ 0.0.4
@@ -112,13 +112,29 @@ class BlinkenLights
112
112
  LED_ALL = 7
113
113
 
114
114
  if defined? ::Win32API
115
- # Mapping from Unix LEDs to Windows LEDs
116
- WINDOWS_LEDS = { LED_SCR => 0x91, LED_NUM => 0x90, LED_CAP => 0x14 }
115
+ # Windows Virtual Key code for caps lock
116
+ VK_CAPITAL = 0x14
117
117
 
118
- # Windows key released
119
- WIN_KEY_UP = 0x26
118
+ # Windows Virtual Key code for num lock
119
+ VK_NUMLOCK = 0x90
120
+
121
+ # Windows Virtual Key code for scroll lock
122
+ VK_SCROLL = 0x91
123
+
124
+ # Mapping from UNIX LEDs to Windows Virtual Key codes
125
+ WINDOWS_LEDS = {
126
+ LED_SCR => VK_SCROLL,
127
+ LED_NUM => VK_NUMLOCK,
128
+ LED_CAP => VK_CAPITAL
129
+ }
120
130
 
131
+ # Windows key released: Windows keybd_event() constant KEYEVENTF_KEYUP
132
+ WIN_KEY_UP = 0x26
133
+
134
+ # Win32API GetKeyState function
121
135
  GetKeyState = ::Win32API.new("user32", "GetKeyState", ["i"], "i")
136
+
137
+ # Win32API Keybd_event function
122
138
  Keybd_event = ::Win32API.new("user32", "keybd_event", %w[i i i i], "v")
123
139
  end
124
140
  end
@@ -153,9 +169,15 @@ class BlinkenLights
153
169
  # the BlinkenLights#close method is called.
154
170
  def self.open(tty = DEF_TTY, delay = DEF_DELAY)
155
171
  obj = new(tty, delay)
156
- yield obj
157
- ensure
158
- obj.close if obj
172
+ if block_given?
173
+ begin
174
+ yield obj
175
+ ensure
176
+ obj.close if obj
177
+ end
178
+ else
179
+ obj
180
+ end
159
181
  end
160
182
 
161
183
  # Close the open console tty after resetting LEDs to the original state.
@@ -165,6 +187,10 @@ class BlinkenLights
165
187
  self
166
188
  end
167
189
 
190
+ def closed?
191
+ @tty.closed?
192
+ end
193
+
168
194
  # Resets the LED state to the starting state (when the BlinkenLights object
169
195
  # was created).
170
196
  def reset
@@ -194,8 +220,8 @@ class BlinkenLights
194
220
 
195
221
  # Set LEDs to _number_ in binary digital mode.
196
222
  def digital=(number)
197
- number %= 8
198
- setting = 0
223
+ number %= 8
224
+ setting = 0
199
225
  0.upto(2) do |i|
200
226
  if number[i] == 1
201
227
  setting |= 1 << DIGITAL.index(LEDS[2 - i])
@@ -419,6 +445,7 @@ class BlinkenLights
419
445
 
420
446
  if defined? ::Win32API
421
447
  def set(number) # :nodoc:
448
+ raise IOError, 'closed stream' if closed?
422
449
  WINDOWS_LEDS.each do |nix, win|
423
450
  if (number & nix != 0) ^ (GetKeyState.call(win) != 0)
424
451
  Keybd_event.call(win, 0, 0, 0)
@@ -430,6 +457,7 @@ class BlinkenLights
430
457
  end
431
458
 
432
459
  def get # :nodoc:
460
+ raise IOError, 'closed stream' if closed?
433
461
  WINDOWS_LEDS.inject(0) do |sum, (nix, win)|
434
462
  sum | ((GetKeyState.call(win) != 0) ? nix : 0)
435
463
  end
@@ -0,0 +1,206 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ base = File.basename(Dir.pwd)
4
+ if base == 'tests' || base =~ /file-tail/
5
+ Dir.chdir('..') if base == 'tests'
6
+ $LOAD_PATH.unshift(File.join(Dir.pwd, 'lib'))
7
+ end
8
+
9
+ require 'test/unit'
10
+ require 'blinkenlights'
11
+
12
+ class TC_BlinkenLights < Test::Unit::TestCase
13
+ def setup
14
+ @bl = BlinkenLights.new
15
+ @old_leds = get_leds
16
+ end
17
+
18
+ def get_leds
19
+ [ @bl.left, @bl.middle, @bl.right ]
20
+ end
21
+
22
+ def teardown
23
+ @bl.close unless @bl.closed?
24
+ end
25
+
26
+ def test_close
27
+ assert !@bl.closed?
28
+ @bl.close
29
+ assert @bl.closed?
30
+ assert_raises(IOError) { @bl.flash }
31
+ end
32
+
33
+ def test_block_open
34
+ bl2 = BlinkenLights.open do |bl|
35
+ assert !bl.closed?
36
+ assert bl.flash
37
+ :foo
38
+ end
39
+ assert_equal :foo, bl2
40
+ end
41
+
42
+ def test_no_block_open
43
+ bl2 = BlinkenLights.open
44
+ assert_kind_of BlinkenLights, bl2
45
+ assert bl2.close
46
+ end
47
+
48
+ def test_reset
49
+ @bl.random
50
+ @bl.reset
51
+ assert_equal get_leds, @old_leds
52
+ end
53
+
54
+ def test_off
55
+ @bl.random
56
+ @bl.off
57
+ assert !@bl.left
58
+ assert !@bl.middle
59
+ assert !@bl.right
60
+ end
61
+
62
+ def test_on
63
+ @bl.random
64
+ @bl.on
65
+ assert @bl.left
66
+ assert @bl.middle
67
+ assert @bl.right
68
+ end
69
+
70
+ def test_on
71
+ @bl.random
72
+ @bl.flash
73
+ assert !@bl.left
74
+ assert !@bl.middle
75
+ assert !@bl.right
76
+ end
77
+
78
+ def test_digital
79
+ @bl.random
80
+ for i in 0..8
81
+ @bl.digital = i
82
+ assert_equal i % 8, @bl.digital
83
+ end
84
+ end
85
+
86
+ def test_left_to_right
87
+ @bl.random
88
+ @bl.left_to_right
89
+ assert !@bl.left
90
+ assert !@bl.middle
91
+ assert @bl.right
92
+ end
93
+
94
+ def test_right_to_left
95
+ @bl.random
96
+ @bl.right_to_left
97
+ assert @bl.left
98
+ assert !@bl.middle
99
+ assert !@bl.right
100
+ end
101
+
102
+ def test_circle
103
+ @bl.random
104
+ @bl.circle
105
+ assert @bl.left
106
+ assert !@bl.middle
107
+ assert !@bl.right
108
+ end
109
+
110
+ def test_reverse_circle
111
+ @bl.random
112
+ @bl.reverse_circle
113
+ assert !@bl.left
114
+ assert !@bl.middle
115
+ assert @bl.right
116
+ end
117
+
118
+ def test_converge
119
+ @bl.random
120
+ @bl.converge
121
+ assert !@bl.left
122
+ assert @bl.middle
123
+ assert !@bl.right
124
+ end
125
+
126
+ def test_diverge
127
+ @bl.random
128
+ @bl.diverge
129
+ assert @bl.left
130
+ assert !@bl.middle
131
+ assert @bl.right
132
+ end
133
+
134
+ def test_left
135
+ @bl.random
136
+ @bl.left = false
137
+ assert !@bl.left
138
+ @bl.left = true
139
+ assert @bl.left
140
+ @bl.toggle_left
141
+ assert !@bl.left
142
+ @bl.toggle_left
143
+ assert @bl.left
144
+ end
145
+
146
+ def test_middle
147
+ @bl.random
148
+ @bl.middle = false
149
+ assert !@bl.middle
150
+ @bl.middle = true
151
+ assert @bl.middle
152
+ @bl.toggle_middle
153
+ assert !@bl.middle
154
+ @bl.toggle_middle
155
+ assert @bl.middle
156
+ end
157
+
158
+ def test_right
159
+ @bl.random
160
+ @bl.right = false
161
+ assert !@bl.right
162
+ @bl.right = true
163
+ assert @bl.right
164
+ @bl.toggle_right
165
+ assert !@bl.right
166
+ @bl.toggle_right
167
+ assert @bl.right
168
+ end
169
+
170
+ def test_num
171
+ @bl.random
172
+ @bl.num = false
173
+ assert !@bl.num
174
+ @bl.num = true
175
+ assert @bl.num
176
+ @bl.toggle_num
177
+ assert !@bl.num
178
+ @bl.toggle_num
179
+ assert @bl.num
180
+ end
181
+
182
+ def test_cap
183
+ @bl.random
184
+ @bl.cap = false
185
+ assert !@bl.cap
186
+ @bl.cap = true
187
+ assert @bl.cap
188
+ @bl.toggle_cap
189
+ assert !@bl.cap
190
+ @bl.toggle_cap
191
+ assert @bl.cap
192
+ end
193
+
194
+ def test_scr
195
+ @bl.random
196
+ @bl.scr = false
197
+ assert !@bl.scr
198
+ @bl.scr = true
199
+ assert @bl.scr
200
+ @bl.toggle_scr
201
+ assert !@bl.scr
202
+ @bl.toggle_scr
203
+ assert @bl.scr
204
+ end
205
+ end
206
+ # vim: set noet sw=2 ts=2:
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: blinkenlights
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.0.3
7
- date: 2006-04-08 00:00:00 +02:00
6
+ version: 0.0.4
7
+ date: 2006-04-09 00:00:00 +02:00
8
8
  summary: Control the Blinkenlights on your keyboard from Ruby
9
9
  require_paths:
10
10
  - lib
@@ -12,7 +12,7 @@ email: flori@ping.de
12
12
  homepage: http://blinkenlights.rubyforge.org
13
13
  rubyforge_project: blinkenlights
14
14
  description: ""
15
- autorequire: blinkenlights
15
+ autorequire:
16
16
  default_executable:
17
17
  bindir: bin
18
18
  has_rdoc: true
@@ -33,15 +33,17 @@ files:
33
33
  - GPL
34
34
  - Rakefile
35
35
  - VERSION
36
+ - tests
36
37
  - CHANGES
37
38
  - lib
38
39
  - make_doc.rb
39
40
  - README.en
40
41
  - examples/netblinker.rb
41
42
  - examples/loadbar.rb
43
+ - tests/test.rb
42
44
  - lib/blinkenlights.rb
43
- test_files: []
44
-
45
+ test_files:
46
+ - tests/test.rb
45
47
  rdoc_options:
46
48
  - --title
47
49
  - BlinkenLights in Ruby