yamatanooroti 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/yamatanooroti/version.rb +1 -1
- data/lib/yamatanooroti/vterm.rb +13 -5
- data/lib/yamatanooroti/vterm.rb.orig +70 -0
- data/lib/yamatanooroti/windows.rb +38 -32
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 92dcb67921820e4dedad1aed9de7d18c062f623c9b73c4a05427049111217f4a
|
4
|
+
data.tar.gz: 5683fb3c7544c67dc4c1f024df1b8fd9953c6378be0826a6f834191cf5c694e8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c614da80dcaf5b4ff0799be9be726fa0ea61fcc8ae1f53a4219e61cb17a86d3dee3e9e3fce5663b7224493b53ee0f379359859f448b10963306959647169c16
|
7
|
+
data.tar.gz: 0e2d1c4d031666509d85c5abc5a8d0f847d3c50392aec52df6f920269ebdff7fb99ac0442c1e582e8edd06f74f124dc9de559a5db8bc271510b331afbdc0f53b
|
data/lib/yamatanooroti/vterm.rb
CHANGED
@@ -5,6 +5,7 @@ require 'pty'
|
|
5
5
|
module Yamatanooroti::VTermTestCaseModule
|
6
6
|
def start_terminal(height, width, command, wait: 0.1)
|
7
7
|
@wait = wait
|
8
|
+
@result = nil
|
8
9
|
|
9
10
|
@pty_output, @pty_input, @pid = PTY.spawn(*command)
|
10
11
|
|
@@ -27,6 +28,7 @@ module Yamatanooroti::VTermTestCaseModule
|
|
27
28
|
sync
|
28
29
|
@pty_input.close
|
29
30
|
sync
|
31
|
+
Process.kill('KILL', @pid)
|
30
32
|
end
|
31
33
|
|
32
34
|
private def sync
|
@@ -45,17 +47,23 @@ module Yamatanooroti::VTermTestCaseModule
|
|
45
47
|
end
|
46
48
|
end
|
47
49
|
|
48
|
-
def
|
49
|
-
|
50
|
+
def result
|
51
|
+
return @result if @result
|
52
|
+
@result = []
|
50
53
|
rows, cols = @vterm.size
|
51
54
|
rows.times do |r|
|
52
|
-
|
55
|
+
@result << ''
|
53
56
|
cols.times do |c|
|
54
57
|
cell = @screen.cell_at(r, c)
|
55
|
-
|
58
|
+
@result.last << cell.char if cell.char
|
56
59
|
end
|
57
|
-
|
60
|
+
@result.last.gsub!(/ *$/, '')
|
58
61
|
end
|
62
|
+
@result
|
63
|
+
end
|
64
|
+
|
65
|
+
def assert_screen(expected_lines)
|
66
|
+
actual_lines = result
|
59
67
|
case expected_lines
|
60
68
|
when Array
|
61
69
|
assert_equal(expected_lines, actual_lines)
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'test-unit'
|
2
|
+
require 'vterm'
|
3
|
+
require 'pty'
|
4
|
+
|
5
|
+
module Yamatanooroti::VTermTestCaseModule
|
6
|
+
def start_terminal(height, width, command, wait: 0.1)
|
7
|
+
@wait = wait
|
8
|
+
|
9
|
+
@pty_output, @pty_input, @pid = PTY.spawn(*command)
|
10
|
+
|
11
|
+
@vterm = VTerm.new(height, width)
|
12
|
+
@vterm.set_utf8(true)
|
13
|
+
|
14
|
+
@screen = @vterm.screen
|
15
|
+
@screen.reset(true)
|
16
|
+
|
17
|
+
sync
|
18
|
+
end
|
19
|
+
|
20
|
+
def write(str)
|
21
|
+
sync
|
22
|
+
@pty_input.write(str)
|
23
|
+
sync
|
24
|
+
end
|
25
|
+
|
26
|
+
def close
|
27
|
+
sync
|
28
|
+
@pty_input.close
|
29
|
+
sync
|
30
|
+
end
|
31
|
+
|
32
|
+
private def sync
|
33
|
+
loop do
|
34
|
+
sleep @wait
|
35
|
+
chunk = @pty_output.read_nonblock(1024)
|
36
|
+
@vterm.write(chunk)
|
37
|
+
chunk = @vterm.read
|
38
|
+
@pty_input.write(chunk)
|
39
|
+
rescue Errno::EAGAIN, Errno::EWOULDBLOCK
|
40
|
+
break
|
41
|
+
rescue Errno::EIO # EOF
|
42
|
+
break
|
43
|
+
rescue IO::EAGAINWaitReadable # emtpy buffer
|
44
|
+
break
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def assert_screen(expected_lines)
|
49
|
+
actual_lines = []
|
50
|
+
rows, cols = @vterm.size
|
51
|
+
rows.times do |r|
|
52
|
+
actual_lines << ''
|
53
|
+
cols.times do |c|
|
54
|
+
cell = @screen.cell_at(r, c)
|
55
|
+
actual_lines.last << cell.char if cell.char
|
56
|
+
end
|
57
|
+
actual_lines.last.gsub!(/ *$/, '')
|
58
|
+
end
|
59
|
+
case expected_lines
|
60
|
+
when Array
|
61
|
+
assert_equal(expected_lines, actual_lines)
|
62
|
+
when String
|
63
|
+
assert_equal(expected_lines, actual_lines.join("\n").sub(/\n*\z/, "\n"))
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
class Yamatanooroti::VTermTestCase < Test::Unit::TestCase
|
69
|
+
include Yamatanooroti::VTermTestCaseModule
|
70
|
+
end
|
@@ -212,10 +212,10 @@ module Yamatanooroti::WindowsTestCaseModule
|
|
212
212
|
|
213
213
|
private def setup_console(height, width)
|
214
214
|
|
215
|
-
|
216
|
-
error_message(
|
217
|
-
|
218
|
-
error_message(
|
215
|
+
r = DL.FreeConsole
|
216
|
+
error_message(r, 'FreeConsole')
|
217
|
+
r = DL.AllocConsole
|
218
|
+
error_message(r, 'AllocConsole')
|
219
219
|
@output_handle = DL.GetStdHandle(DL::STD_OUTPUT_HANDLE)
|
220
220
|
|
221
221
|
=begin
|
@@ -228,8 +228,8 @@ module Yamatanooroti::WindowsTestCaseModule
|
|
228
228
|
font.FontFamily = 0
|
229
229
|
font.FontWeight = 0
|
230
230
|
font.FaceName[0] = "\x00".ord
|
231
|
-
|
232
|
-
error_message(
|
231
|
+
r = DL.SetCurrentConsoleFontEx(@output_handle, 0, font)
|
232
|
+
error_message(r, 'SetCurrentConsoleFontEx')
|
233
233
|
=end
|
234
234
|
|
235
235
|
rect = DL::SMALL_RECT.malloc
|
@@ -237,16 +237,16 @@ module Yamatanooroti::WindowsTestCaseModule
|
|
237
237
|
rect.Top = 0
|
238
238
|
rect.Right = width - 1
|
239
239
|
rect.Bottom = height - 1
|
240
|
-
|
241
|
-
error_message(
|
240
|
+
r = DL.SetConsoleWindowInfo(@output_handle, 1, rect)
|
241
|
+
error_message(r, 'SetConsoleWindowInfo')
|
242
242
|
|
243
243
|
size = DL.GetSystemMetrics(DL::SM_CYMIN) * 65536 + DL.GetSystemMetrics(DL::SM_CXMIN)
|
244
|
-
|
245
|
-
error_message(
|
244
|
+
r = DL.SetConsoleScreenBufferSize(@output_handle, size)
|
245
|
+
error_message(r, 'SetConsoleScreenBufferSize')
|
246
246
|
|
247
247
|
size = height * 65536 + width
|
248
|
-
|
249
|
-
error_message(
|
248
|
+
r = DL.SetConsoleScreenBufferSize(@output_handle, size)
|
249
|
+
error_message(r, 'SetConsoleScreenBufferSize')
|
250
250
|
end
|
251
251
|
|
252
252
|
private def mb2wc(str)
|
@@ -289,19 +289,19 @@ module Yamatanooroti::WindowsTestCaseModule
|
|
289
289
|
(@pi.to_ptr + 0)[0, DL::PROCESS_INFORMATION.size] = "\x00" * DL::PROCESS_INFORMATION.size
|
290
290
|
@startup_info_ex = DL::STARTUPINFOW.malloc
|
291
291
|
(@startup_info_ex.to_ptr + 0)[0, DL::STARTUPINFOW.size] = "\x00" * DL::STARTUPINFOW.size
|
292
|
-
|
292
|
+
r = DL.CreateProcessW(
|
293
293
|
Fiddle::NULL, converted_command,
|
294
294
|
Fiddle::NULL, Fiddle::NULL, 0, 0, Fiddle::NULL, Fiddle::NULL,
|
295
295
|
@startup_info_ex, @pi
|
296
296
|
)
|
297
|
-
error_message(
|
297
|
+
error_message(r, 'CreateProcessW')
|
298
298
|
sleep @wait
|
299
299
|
rescue => e
|
300
300
|
pp e
|
301
301
|
end
|
302
302
|
|
303
|
-
private def error_message(
|
304
|
-
return if not
|
303
|
+
private def error_message(r, method_name)
|
304
|
+
return if not r.zero?
|
305
305
|
err = DL.GetLastError
|
306
306
|
string = Fiddle::Pointer.malloc(Fiddle::SIZEOF_VOIDP)
|
307
307
|
DL.FormatMessage(
|
@@ -349,8 +349,8 @@ module Yamatanooroti::WindowsTestCaseModule
|
|
349
349
|
r.dwControlKeyState = 0
|
350
350
|
end
|
351
351
|
written_size = Fiddle::Pointer.malloc(Fiddle::SIZEOF_DWORD, DL::FREE)
|
352
|
-
|
353
|
-
error_message(
|
352
|
+
r = DL.WriteConsoleInputW(DL.GetStdHandle(DL::STD_INPUT_HANDLE), records, str.size * 2, written_size)
|
353
|
+
error_message(r, 'WriteConsoleInput')
|
354
354
|
end
|
355
355
|
|
356
356
|
private def free_resources
|
@@ -358,27 +358,28 @@ module Yamatanooroti::WindowsTestCaseModule
|
|
358
358
|
pe = DL::PROCESSENTRY32W.malloc
|
359
359
|
(pe.to_ptr + 0)[0, DL::PROCESSENTRY32W.size] = "\x00" * DL::PROCESSENTRY32W.size
|
360
360
|
pe.dwSize = DL::PROCESSENTRY32W.size
|
361
|
-
|
362
|
-
error_message(
|
363
|
-
result = DL.FreeConsole()
|
364
|
-
#error_message(result, "FreeConsole")
|
365
|
-
result = DL.AttachConsole(DL::ATTACH_PARENT_PROCESS)
|
366
|
-
error_message(result, 'AttachConsole')
|
361
|
+
r = DL.Process32FirstW(h_snap, pe)
|
362
|
+
error_message(r, "Process32First")
|
367
363
|
loop do
|
368
364
|
#log "a #{pe.th32ParentProcessID.inspect} -> #{pe.th32ProcessID.inspect} #{wc2mb(pe.szExeFile.pack('S260')).unpack('Z*').pack('Z*')}"
|
369
365
|
if pe.th32ParentProcessID == DL.GetCurrentProcessId
|
370
366
|
h_child_proc = DL.OpenProcess(DL::PROCESS_ALL_ACCESS, 0, pe.th32ProcessID)
|
371
367
|
if (h_child_proc)
|
372
|
-
|
373
|
-
error_message(
|
374
|
-
|
375
|
-
error_message(
|
368
|
+
r = DL.TerminateProcess(h_child_proc, 0)
|
369
|
+
error_message(r, "TerminateProcess")
|
370
|
+
r = DL.CloseHandle(h_child_proc)
|
371
|
+
error_message(r, "CloseHandle")
|
376
372
|
end
|
377
373
|
end
|
378
374
|
break if DL.Process32NextW(h_snap, pe).zero?
|
379
375
|
end
|
380
|
-
|
381
|
-
error_message(
|
376
|
+
r = DL.TerminateThread(@pi.hThread, 0)
|
377
|
+
error_message(r, "TerminateThread")
|
378
|
+
sleep @wait
|
379
|
+
r = DL.FreeConsole()
|
380
|
+
#error_message(r, "FreeConsole")
|
381
|
+
r = DL.AttachConsole(DL::ATTACH_PARENT_PROCESS)
|
382
|
+
error_message(r, 'AttachConsole')
|
382
383
|
end
|
383
384
|
|
384
385
|
def close
|
@@ -390,8 +391,8 @@ module Yamatanooroti::WindowsTestCaseModule
|
|
390
391
|
region.Top = 0
|
391
392
|
region.Right = @width
|
392
393
|
region.Bottom = @height
|
393
|
-
|
394
|
-
error_message(
|
394
|
+
r = DL.ReadConsoleOutputW(@output_handle, char_info_matrix, @height * 65536 + @width, 0, region)
|
395
|
+
error_message(r, "ReadConsoleOutputW")
|
395
396
|
@result = []
|
396
397
|
prev_c = nil
|
397
398
|
@height.times do |y|
|
@@ -413,6 +414,10 @@ module Yamatanooroti::WindowsTestCaseModule
|
|
413
414
|
free_resources
|
414
415
|
end
|
415
416
|
|
417
|
+
def result
|
418
|
+
@result
|
419
|
+
end
|
420
|
+
|
416
421
|
def assert_screen(expected_lines)
|
417
422
|
case expected_lines
|
418
423
|
when Array
|
@@ -426,6 +431,7 @@ module Yamatanooroti::WindowsTestCaseModule
|
|
426
431
|
@height = height
|
427
432
|
@width = width
|
428
433
|
@wait = wait
|
434
|
+
@result = nil
|
429
435
|
setup_console(height, width)
|
430
436
|
launch(command.join(' '))
|
431
437
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yamatanooroti
|
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
|
- aycabta
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-03
|
11
|
+
date: 2020-07-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: test-unit
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
description: " Yamatanooroti is a multi-platform real(?) terminal test framework.\n"
|
42
56
|
email:
|
43
57
|
- aycabta@gmail.com
|
@@ -50,6 +64,7 @@ files:
|
|
50
64
|
- lib/yamatanooroti.rb
|
51
65
|
- lib/yamatanooroti/version.rb
|
52
66
|
- lib/yamatanooroti/vterm.rb
|
67
|
+
- lib/yamatanooroti/vterm.rb.orig
|
53
68
|
- lib/yamatanooroti/windows.rb
|
54
69
|
homepage: https://github.com/aycabta/yamatanooroti
|
55
70
|
licenses:
|