yamatanooroti 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/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:
|