blinkenlights 0.0.3 → 0.0.4

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.
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