termgui 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.
- checksums.yaml +7 -0
- data/Gemfile +14 -0
- data/README.md +321 -0
- data/lib/termgui.rb +1 -0
- data/src/action.rb +58 -0
- data/src/box.rb +90 -0
- data/src/color.rb +174 -0
- data/src/cursor.rb +69 -0
- data/src/editor/editor_base.rb +152 -0
- data/src/editor/editor_base_handlers.rb +116 -0
- data/src/element.rb +61 -0
- data/src/element_bounds.rb +111 -0
- data/src/element_box.rb +64 -0
- data/src/element_render.rb +102 -0
- data/src/element_style.rb +51 -0
- data/src/emitter.rb +102 -0
- data/src/emitter_state.rb +19 -0
- data/src/enterable.rb +93 -0
- data/src/event.rb +92 -0
- data/src/focus.rb +102 -0
- data/src/geometry.rb +53 -0
- data/src/image.rb +60 -0
- data/src/input.rb +85 -0
- data/src/input_grab.rb +17 -0
- data/src/input_time.rb +97 -0
- data/src/key.rb +114 -0
- data/src/log.rb +24 -0
- data/src/node.rb +117 -0
- data/src/node_attributes.rb +27 -0
- data/src/node_visit.rb +52 -0
- data/src/renderer.rb +119 -0
- data/src/renderer_cursor.rb +18 -0
- data/src/renderer_draw.rb +28 -0
- data/src/renderer_image.rb +31 -0
- data/src/renderer_print.rb +40 -0
- data/src/screen.rb +96 -0
- data/src/screen_element.rb +59 -0
- data/src/screen_input.rb +43 -0
- data/src/screen_renderer.rb +53 -0
- data/src/style.rb +149 -0
- data/src/tco/colouring.rb +248 -0
- data/src/tco/config.rb +57 -0
- data/src/tco/palette.rb +603 -0
- data/src/tco/tco_termgui.rb +30 -0
- data/src/termgui.rb +29 -0
- data/src/util/css.rb +98 -0
- data/src/util/css_query.rb +23 -0
- data/src/util/easing.rb +364 -0
- data/src/util/hash_object.rb +131 -0
- data/src/util/imagemagick.rb +27 -0
- data/src/util/justify.rb +20 -0
- data/src/util/unicode-categories.rb +572 -0
- data/src/util/wrap.rb +102 -0
- data/src/util.rb +110 -0
- data/src/widget/button.rb +33 -0
- data/src/widget/checkbox.rb +47 -0
- data/src/widget/col.rb +30 -0
- data/src/widget/image.rb +106 -0
- data/src/widget/inline.rb +40 -0
- data/src/widget/input_number.rb +73 -0
- data/src/widget/inputbox.rb +85 -0
- data/src/widget/label.rb +33 -0
- data/src/widget/modal.rb +69 -0
- data/src/widget/row.rb +26 -0
- data/src/widget/selectbox.rb +100 -0
- data/src/widget/textarea.rb +54 -0
- data/src/xml/xml.rb +80 -0
- data/test/action_test.rb +34 -0
- data/test/box_test.rb +15 -0
- data/test/css_test.rb +39 -0
- data/test/editor/editor_base_test.rb +201 -0
- data/test/element_bounds_test.rb +77 -0
- data/test/element_box_test.rb +8 -0
- data/test/element_render_test.rb +124 -0
- data/test/element_style_test.rb +85 -0
- data/test/element_test.rb +10 -0
- data/test/emitter_test.rb +108 -0
- data/test/event_test.rb +19 -0
- data/test/focus_test.rb +37 -0
- data/test/geometry_test.rb +12 -0
- data/test/input_test.rb +47 -0
- data/test/key_test.rb +14 -0
- data/test/log_test.rb +21 -0
- data/test/node_test.rb +105 -0
- data/test/performance/performance1.rb +48 -0
- data/test/renderer_test.rb +74 -0
- data/test/renderer_test_rect.rb +4 -0
- data/test/screen_test.rb +58 -0
- data/test/style_test.rb +18 -0
- data/test/termgui_test.rb +10 -0
- data/test/test_all.rb +30 -0
- data/test/util_hash_object_test.rb +93 -0
- data/test/util_test.rb +26 -0
- data/test/widget/checkbox_test.rb +99 -0
- data/test/widget/col_test.rb +87 -0
- data/test/widget/inline_test.rb +40 -0
- data/test/widget/label_test.rb +94 -0
- data/test/widget/row_test.rb +40 -0
- data/test/wrap_test.rb +11 -0
- data/test/xml_test.rb +77 -0
- metadata +148 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# warning: execute this in a real terminal (not in vscode's) because of performance
|
|
2
|
+
|
|
3
|
+
require_relative '../../src/widget/button'
|
|
4
|
+
require_relative '../../src/screen'
|
|
5
|
+
require_relative '../../src/util'
|
|
6
|
+
|
|
7
|
+
def test(timeout: 3, box_count: 80, interval: 0.01, render_count: 1, screen_width: 120, screen_height: 32, text_length: 5, no_buffer: false)
|
|
8
|
+
t0 = Time.now
|
|
9
|
+
i = 0
|
|
10
|
+
s = Screen.new(width: screen_width, height: screen_height)
|
|
11
|
+
s.renderer.no_buffer = no_buffer
|
|
12
|
+
s.set_timeout(timeout) do
|
|
13
|
+
config = {
|
|
14
|
+
timeout: timeout, box_count: box_count, interval: interval, render_count: render_count, screen_width:
|
|
15
|
+
screen_width, screen_height: screen_height, text_length: text_length, no_buffer: no_buffer
|
|
16
|
+
}
|
|
17
|
+
s.clear
|
|
18
|
+
s.destroy
|
|
19
|
+
print_string "\r
|
|
20
|
+
Iteration ##{i} \r
|
|
21
|
+
Time: #{Time.now - t0} \r
|
|
22
|
+
Config: #{config} \r"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
draw = proc {
|
|
26
|
+
box_count.times do |j|
|
|
27
|
+
s.append_child Button.new(x: random_int(2, s.width - 20),
|
|
28
|
+
y: random_int(1, s.height - 4), text: "button#{j}",
|
|
29
|
+
style: { bg: random_color, fg: random_color, border: { style: 'single', fg: random_color } })
|
|
30
|
+
end
|
|
31
|
+
}
|
|
32
|
+
step = proc {
|
|
33
|
+
i += 1
|
|
34
|
+
s.empty
|
|
35
|
+
s.clear
|
|
36
|
+
draw.call
|
|
37
|
+
l = s.append_child Label.new(text: "iteration ##{i} **")
|
|
38
|
+
render_count.times { s.render }
|
|
39
|
+
s.set_timeout(interval) do
|
|
40
|
+
step.call
|
|
41
|
+
end
|
|
42
|
+
}
|
|
43
|
+
step.call
|
|
44
|
+
s.start
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
test(render_count: 10, no_buffer: true)
|
|
48
|
+
# test(screen_width: nil, screen_height: nil)
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
require_relative '../src/renderer'
|
|
2
|
+
require_relative '../src/util'
|
|
3
|
+
require 'test/unit'
|
|
4
|
+
include Test::Unit::Assertions
|
|
5
|
+
|
|
6
|
+
class RendererTest < Test::Unit::TestCase
|
|
7
|
+
def test_rect_stub
|
|
8
|
+
assert_include "\e[2;2Hllllllll" \
|
|
9
|
+
"\e[3;2Hllllllll" \
|
|
10
|
+
"\e[4;2Hllllllll" \
|
|
11
|
+
"\e[5;2Hllllllll" \
|
|
12
|
+
"\e[6;2Hllllllll", `ruby test/renderer_test_rect.rb`
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_rect
|
|
16
|
+
r = Renderer.new
|
|
17
|
+
s = r.rect x: 2, y: 1, width: 3, height: 2, ch: 'x'
|
|
18
|
+
assert_equal "\e[2;2Hxxx\e[3;2Hxxx", s
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def test_print
|
|
22
|
+
r2 = Renderer.new 10, 7
|
|
23
|
+
r2.rect x: 2, y: 1, width: 3, height: 2, ch: 'x'
|
|
24
|
+
assert_equal ' \\n' \
|
|
25
|
+
' xxx \\n' \
|
|
26
|
+
' xxx \\n' \
|
|
27
|
+
' \\n' \
|
|
28
|
+
' \\n' \
|
|
29
|
+
' \\n' \
|
|
30
|
+
' \\n', r2.print
|
|
31
|
+
|
|
32
|
+
r2.rect x: 4, y: 2, width: 2, height: 3, ch: 'y'
|
|
33
|
+
assert_equal ' \\n' \
|
|
34
|
+
' xxx \\n' \
|
|
35
|
+
' xxyy \\n' \
|
|
36
|
+
' yy \\n' \
|
|
37
|
+
' yy \\n' \
|
|
38
|
+
' \\n' \
|
|
39
|
+
' \\n', r2.print
|
|
40
|
+
r2.clear
|
|
41
|
+
assert_equal ' \\n' \
|
|
42
|
+
' \\n' \
|
|
43
|
+
' \\n' \
|
|
44
|
+
' \\n' \
|
|
45
|
+
' \\n' \
|
|
46
|
+
' \\n' \
|
|
47
|
+
' \\n', r2.print
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def test_circle
|
|
51
|
+
s = Screen.new_for_testing(width: 30, height: 20)
|
|
52
|
+
s.circle(x: 10, y: 10, radius: 6, stroke: Style.new(bg: 'green', fg: 'red'), stroke_ch: 'x', fill: Style.new(bg: 'blue'), fill_ch: 'o')
|
|
53
|
+
assert_equal' \n' \
|
|
54
|
+
' \n' \
|
|
55
|
+
' \n' \
|
|
56
|
+
' \n' \
|
|
57
|
+
' xxxxx \n' \
|
|
58
|
+
' xooooox \n' \
|
|
59
|
+
' xooooooox \n' \
|
|
60
|
+
' xooooooooox \n' \
|
|
61
|
+
' xooooooooooox \n' \
|
|
62
|
+
' xooooooooooox \n' \
|
|
63
|
+
' xooooooooooox \n' \
|
|
64
|
+
' xooooooooooox \n' \
|
|
65
|
+
' xooooooooooox \n' \
|
|
66
|
+
' xooooooooox \n' \
|
|
67
|
+
' xooooooox \n' \
|
|
68
|
+
' xooooox \n' \
|
|
69
|
+
' xxxxx \n' \
|
|
70
|
+
' \n' \
|
|
71
|
+
' \n' \
|
|
72
|
+
' \n', s.print
|
|
73
|
+
end
|
|
74
|
+
end
|
data/test/screen_test.rb
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
include Test::Unit::Assertions
|
|
3
|
+
require_relative '../src/screen'
|
|
4
|
+
require_relative '../src/util'
|
|
5
|
+
|
|
6
|
+
class ScreenTest < Test::Unit::TestCase
|
|
7
|
+
def test_renderer
|
|
8
|
+
s = Screen.new_for_testing width: 5, height: 6
|
|
9
|
+
r = s.renderer
|
|
10
|
+
assert_equal r.buffer.length, 6
|
|
11
|
+
assert_equal r.buffer[0].length, 5
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_destroy
|
|
15
|
+
s = Screen.new_for_testing width: 12, height: 8
|
|
16
|
+
x = 0
|
|
17
|
+
s.set_timeout(0.1, proc { s.destroy })
|
|
18
|
+
s.add_listener(:destroy, proc {
|
|
19
|
+
x = 1
|
|
20
|
+
})
|
|
21
|
+
assert_equal 0, x
|
|
22
|
+
s.start
|
|
23
|
+
assert_equal 1, x
|
|
24
|
+
|
|
25
|
+
s = Screen.new_for_testing width: 12, height: 8
|
|
26
|
+
x = 0
|
|
27
|
+
s.set_timeout(0.1, proc { s.destroy })
|
|
28
|
+
s.add_listener('destroy', proc {
|
|
29
|
+
x = 1
|
|
30
|
+
})
|
|
31
|
+
assert_equal 0, x
|
|
32
|
+
s.start
|
|
33
|
+
assert_equal 1, x
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def test_rect_clear
|
|
37
|
+
s = Screen.new_for_testing width: 12, height: 7
|
|
38
|
+
s.rect(x: 1, y: 2, width: 3, height: 2, ch: 'f')
|
|
39
|
+
s.rect(x: 6, y: 3, width: 4, height: 3, ch: 'g')
|
|
40
|
+
assert_equal [' ',
|
|
41
|
+
' ',
|
|
42
|
+
' fff ',
|
|
43
|
+
' fff gggg ',
|
|
44
|
+
' gggg ',
|
|
45
|
+
' gggg ',
|
|
46
|
+
' '],
|
|
47
|
+
s.renderer.print_rows
|
|
48
|
+
s.clear
|
|
49
|
+
assert_equal [' ',
|
|
50
|
+
' ',
|
|
51
|
+
' ',
|
|
52
|
+
' ',
|
|
53
|
+
' ',
|
|
54
|
+
' ',
|
|
55
|
+
' '],
|
|
56
|
+
s.print.split('\n')
|
|
57
|
+
end
|
|
58
|
+
end
|
data/test/style_test.rb
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
include Test::Unit::Assertions
|
|
3
|
+
require_relative '../src/style'
|
|
4
|
+
|
|
5
|
+
class StyleTest < Test::Unit::TestCase
|
|
6
|
+
def test_from_json
|
|
7
|
+
str = '{"bg": "red", "border": {"fg": "blue"}}'
|
|
8
|
+
s = Style.from_json(str)
|
|
9
|
+
assert_equal 'red', s.bg
|
|
10
|
+
assert_equal 'blue', s.border.fg
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def test_pretty_print
|
|
14
|
+
assert_true Style.new(bg: 'blue').pretty_print.include? 'bg: blue'
|
|
15
|
+
# assert_equal '{bg: black}', Style.new(bg: 'blue').pretty_print
|
|
16
|
+
# p '{bg: black, focus: {}, enter: {}, action: {}}'.split(/, [^\s]+: \{\}/)
|
|
17
|
+
end
|
|
18
|
+
end
|
data/test/test_all.rb
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require_relative 'action_test'
|
|
2
|
+
require_relative 'box_test'
|
|
3
|
+
require_relative 'css_test'
|
|
4
|
+
require_relative 'editor/editor_base_test'
|
|
5
|
+
require_relative 'element_bounds_test'
|
|
6
|
+
require_relative 'element_box_test'
|
|
7
|
+
require_relative 'element_render_test'
|
|
8
|
+
require_relative 'element_style_test'
|
|
9
|
+
require_relative 'element_test'
|
|
10
|
+
require_relative 'emitter_test'
|
|
11
|
+
require_relative 'event_test'
|
|
12
|
+
require_relative 'focus_test'
|
|
13
|
+
require_relative 'geometry_test'
|
|
14
|
+
require_relative 'input_test'
|
|
15
|
+
require_relative 'key_test'
|
|
16
|
+
require_relative 'log_test'
|
|
17
|
+
require_relative 'style_test'
|
|
18
|
+
require_relative 'node_test'
|
|
19
|
+
require_relative 'renderer_test'
|
|
20
|
+
require_relative 'screen_test'
|
|
21
|
+
require_relative 'termgui_test'
|
|
22
|
+
require_relative 'util_hash_object_test'
|
|
23
|
+
require_relative 'util_test'
|
|
24
|
+
require_relative 'widget/col_test'
|
|
25
|
+
require_relative 'widget/label_test'
|
|
26
|
+
require_relative 'widget/inline_test'
|
|
27
|
+
require_relative 'widget/row_test'
|
|
28
|
+
require_relative 'widget/checkbox_test'
|
|
29
|
+
require_relative 'wrap_test'
|
|
30
|
+
require_relative 'xml_test'
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
include Test::Unit::Assertions
|
|
3
|
+
require_relative '../src/util'
|
|
4
|
+
require_relative '../src/log'
|
|
5
|
+
require_relative '../src/util/hash_object'
|
|
6
|
+
|
|
7
|
+
class A
|
|
8
|
+
include HashObject
|
|
9
|
+
attr_writer :a, :b, :c
|
|
10
|
+
attr_reader :a, :b, :c
|
|
11
|
+
def initialize(a = 0, b = 0)
|
|
12
|
+
@a = a
|
|
13
|
+
@b = b
|
|
14
|
+
@c = nil
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
class UtilHashObjectTest < Test::Unit::TestCase
|
|
19
|
+
def test_assign
|
|
20
|
+
a = A.new(3, 4)
|
|
21
|
+
b = A.new(8, 9)
|
|
22
|
+
c = a.assign(b)
|
|
23
|
+
assert_equal '{:a=>8, :b=>9, :c=>nil}', c.to_s
|
|
24
|
+
assert a == c
|
|
25
|
+
assert b != c
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def test_assign_nil
|
|
29
|
+
a = A.new(3, 4)
|
|
30
|
+
c = a.assign(nil)
|
|
31
|
+
assert a == c
|
|
32
|
+
assert_equal '{:a=>3, :b=>4, :c=>nil}', c.to_s, 'passing src==nil should not affect the object'
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_assign_hash
|
|
36
|
+
a = A.new(3, 4)
|
|
37
|
+
c = a.assign(c: 1, a: 2)
|
|
38
|
+
assert a == c
|
|
39
|
+
assert_equal '{:a=>2, :b=>4, :c=>1}', c.to_s
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_new_from_hash
|
|
43
|
+
a = A.new
|
|
44
|
+
b = a.new_from_hash(a: 2, b: 4, c: 8)
|
|
45
|
+
assert_equal '{:a=>2, :b=>4, :c=>8}', b.to_s
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_merge_hash_into_object
|
|
49
|
+
a = A.new
|
|
50
|
+
a.a = 2
|
|
51
|
+
a.b = 0
|
|
52
|
+
merge_hash_into_object({ b: 1 }, a)
|
|
53
|
+
assert_equal [2, 1], [a.a, a.b]
|
|
54
|
+
merge_hash_into_object({ b: 2 }, a)
|
|
55
|
+
assert_equal [2, 2], [a.a, a.b]
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def test_object_variables_to_hash
|
|
59
|
+
a = A.new 2, 3
|
|
60
|
+
hash = object_variables_to_hash(a)
|
|
61
|
+
assert_equal({ a: 2, b: 3, c: nil }, hash)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def test_object_assign
|
|
65
|
+
a = A.new 2, 3
|
|
66
|
+
a2 = A.new 4, 5
|
|
67
|
+
a2.c = 6
|
|
68
|
+
object_assign(a2, a)
|
|
69
|
+
assert_equal [6, 2, 3], [a2.c, a2.a, a2.b]
|
|
70
|
+
assert_equal [nil, 2, 3], [a.c, a.a, a.b]
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def test_object_equal
|
|
74
|
+
a = A.new 2, 3
|
|
75
|
+
b = A.new 4, 5
|
|
76
|
+
assert_equal false, object_equal(a, b)
|
|
77
|
+
assert_equal true, object_equal(a, a)
|
|
78
|
+
assert_equal true, object_equal(a, a.clone)
|
|
79
|
+
assert_equal true, object_equal(a, A.new(2, 3))
|
|
80
|
+
a.c = 9
|
|
81
|
+
assert_equal false, object_equal(a, A.new(2, 3))
|
|
82
|
+
assert_equal false, object_equal(a, b)
|
|
83
|
+
a.a = 4
|
|
84
|
+
a.b = 5
|
|
85
|
+
assert_equal false, object_equal(a, b)
|
|
86
|
+
b.c = 9
|
|
87
|
+
assert_equal true, object_equal(a, b)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def test_variable_key
|
|
91
|
+
assert_equal :a, variable_key('@a')
|
|
92
|
+
end
|
|
93
|
+
end
|
data/test/util_test.rb
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
include Test::Unit::Assertions
|
|
3
|
+
require_relative '../src/util'
|
|
4
|
+
|
|
5
|
+
class A
|
|
6
|
+
attr_writer :a, :b, :c
|
|
7
|
+
attr_reader :a, :b, :c
|
|
8
|
+
def initialize(a = 0, b = 0)
|
|
9
|
+
@a = a
|
|
10
|
+
@b = b
|
|
11
|
+
@c = nil
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class UtilTest < Test::Unit::TestCase
|
|
16
|
+
def test_some
|
|
17
|
+
a = [1, 2, 3, 4, 5]
|
|
18
|
+
b = []
|
|
19
|
+
result = some(a, proc do |i|
|
|
20
|
+
b.push i
|
|
21
|
+
i == 3
|
|
22
|
+
end)
|
|
23
|
+
assert_equal [1, 2, 3], b
|
|
24
|
+
assert_equal 3, result
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
include Test::Unit::Assertions
|
|
3
|
+
require_relative '../../src/screen'
|
|
4
|
+
require_relative '../../src/style'
|
|
5
|
+
require_relative '../../src/widget/checkbox'
|
|
6
|
+
|
|
7
|
+
class CheckboxTest < Test::Unit::TestCase
|
|
8
|
+
def test_simple
|
|
9
|
+
screen = Screen.new_for_testing(
|
|
10
|
+
width: 30,
|
|
11
|
+
height: 6,
|
|
12
|
+
children: [
|
|
13
|
+
(c1 = CheckBox.new(text: 'check me', x: 2, y: 3, value: true)),
|
|
14
|
+
(c2 = CheckBox.new(text: 'check me 2', x: 2, y: 4))
|
|
15
|
+
]
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
screen.render
|
|
19
|
+
assert_equal ' \n' \
|
|
20
|
+
' \n' \
|
|
21
|
+
' \n' \
|
|
22
|
+
' [x] check me \n' \
|
|
23
|
+
' [ ] check me 2 \n' \
|
|
24
|
+
' \n', screen.print
|
|
25
|
+
assert_equal true, c1.value
|
|
26
|
+
assert_equal false, c2.value
|
|
27
|
+
|
|
28
|
+
screen.event.handle_key(KeyEvent.new('space', 'space'))
|
|
29
|
+
assert_equal ' \n' \
|
|
30
|
+
' \n' \
|
|
31
|
+
' \n' \
|
|
32
|
+
' [ ] check me \n' \
|
|
33
|
+
' [ ] check me 2 \n' \
|
|
34
|
+
' \n', screen.print
|
|
35
|
+
assert_equal false, c1.value
|
|
36
|
+
assert_equal false, c2.value
|
|
37
|
+
|
|
38
|
+
screen.event.handle_key(KeyEvent.new('space', 'space'))
|
|
39
|
+
assert_equal ' \n' \
|
|
40
|
+
' \n' \
|
|
41
|
+
' \n' \
|
|
42
|
+
' [x] check me \n' \
|
|
43
|
+
' [ ] check me 2 \n' \
|
|
44
|
+
' \n', screen.print
|
|
45
|
+
assert_equal true, c1.value
|
|
46
|
+
assert_equal false, c2.value
|
|
47
|
+
|
|
48
|
+
screen.event.handle_key(KeyEvent.new('enter', 'enter'))
|
|
49
|
+
assert_equal ' \n' \
|
|
50
|
+
' \n' \
|
|
51
|
+
' \n' \
|
|
52
|
+
' [ ] check me \n' \
|
|
53
|
+
' [ ] check me 2 \n' \
|
|
54
|
+
' \n', screen.print
|
|
55
|
+
screen.event.handle_key(KeyEvent.new('tab', 'tab'))
|
|
56
|
+
assert_equal false, c1.value
|
|
57
|
+
assert_equal false, c2.value
|
|
58
|
+
assert_equal ' \n' \
|
|
59
|
+
' \n' \
|
|
60
|
+
' \n' \
|
|
61
|
+
' [ ] check me \n' \
|
|
62
|
+
' [ ] check me 2 \n' \
|
|
63
|
+
' \n', screen.print
|
|
64
|
+
assert_equal false, c1.value
|
|
65
|
+
assert_equal false, c2.value
|
|
66
|
+
|
|
67
|
+
screen.event.handle_key(KeyEvent.new('enter', 'enter'))
|
|
68
|
+
assert_equal ' \n' \
|
|
69
|
+
' \n' \
|
|
70
|
+
' \n' \
|
|
71
|
+
' [ ] check me \n' \
|
|
72
|
+
' [x] check me 2 \n' \
|
|
73
|
+
' \n', screen.print
|
|
74
|
+
assert_equal false, c1.value
|
|
75
|
+
assert_equal true, c2.value
|
|
76
|
+
|
|
77
|
+
screen.event.handle_key(KeyEvent.new('tab', 'tab'))
|
|
78
|
+
screen.event.handle_key(KeyEvent.new('enter', 'enter'))
|
|
79
|
+
assert_equal ' \n' \
|
|
80
|
+
' \n' \
|
|
81
|
+
' \n' \
|
|
82
|
+
' [x] check me \n' \
|
|
83
|
+
' [x] check me 2 \n' \
|
|
84
|
+
' \n', screen.print
|
|
85
|
+
assert_equal true, c1.value
|
|
86
|
+
assert_equal true, c2.value
|
|
87
|
+
|
|
88
|
+
c2.value = false
|
|
89
|
+
screen.render
|
|
90
|
+
assert_equal ' \n' \
|
|
91
|
+
' \n' \
|
|
92
|
+
' \n' \
|
|
93
|
+
' [x] check me \n' \
|
|
94
|
+
' [ ] check me 2 \n' \
|
|
95
|
+
' \n', screen.print
|
|
96
|
+
assert_equal true, c1.value
|
|
97
|
+
assert_equal false, c2.value
|
|
98
|
+
end
|
|
99
|
+
end
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
include Test::Unit::Assertions
|
|
3
|
+
require_relative '../../src/screen'
|
|
4
|
+
require_relative '../../src/widget/label'
|
|
5
|
+
require_relative '../../src/widget/col'
|
|
6
|
+
require_relative '../../src/widget/button'
|
|
7
|
+
|
|
8
|
+
class ColTest < Test::Unit::TestCase
|
|
9
|
+
def test_simple
|
|
10
|
+
screen = Screen.new_for_testing(width: 15, height: 7, silent: true)
|
|
11
|
+
l1 = Label.new(text: 'label1')
|
|
12
|
+
l2 = Label.new(text: 'label2')
|
|
13
|
+
l3 = Label.new(text: 'label3')
|
|
14
|
+
c = Col.new(children: [l1, l2, l3], y: 2, x: 3)
|
|
15
|
+
screen.append_child c
|
|
16
|
+
screen.clear
|
|
17
|
+
screen.render
|
|
18
|
+
assert_equal '' \
|
|
19
|
+
' \n' \
|
|
20
|
+
' \n' \
|
|
21
|
+
' label1 \n' \
|
|
22
|
+
' label2 \n' \
|
|
23
|
+
' label3 \n' \
|
|
24
|
+
' \n' \
|
|
25
|
+
' \n' \
|
|
26
|
+
'', screen.print
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def test_border
|
|
30
|
+
screen = Screen.new_for_testing(width: 15, height: 10, silent: true)
|
|
31
|
+
l1 = Button.new(text: 'label1')
|
|
32
|
+
l2 = Button.new(text: 'label2')
|
|
33
|
+
l3 = Button.new(text: 'label3')
|
|
34
|
+
screen.append_child Col.new(children: [l1, l2, l3], y: 1, x: 1)
|
|
35
|
+
screen.clear
|
|
36
|
+
screen.render
|
|
37
|
+
assert_equal '' \
|
|
38
|
+
' \n' \
|
|
39
|
+
' ┌──────┐ \n' \
|
|
40
|
+
' │label1│ \n' \
|
|
41
|
+
' └──────┘ \n' \
|
|
42
|
+
' ┌──────┐ \n' \
|
|
43
|
+
' │label2│ \n' \
|
|
44
|
+
' └──────┘ \n' \
|
|
45
|
+
' ┌──────┐ \n' \
|
|
46
|
+
' │label3│ \n' \
|
|
47
|
+
' └──────┘ \n' \
|
|
48
|
+
'', screen.print
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def test_two_labels_buttons
|
|
52
|
+
screen = Screen.new_for_testing(width: 80, height: 22)
|
|
53
|
+
left = Col.new(width: 0.4, height: 0.99, x: 4, y: 2, style: { bg: 'red' })
|
|
54
|
+
(0..8).map { |i| left.append_child Label.new(text: "Label_#{i}") }
|
|
55
|
+
right = Col.new(width: 0.6, height: 0.99, x: 0.6, y: 0.3, style: Style.new(bg: 'blue'))
|
|
56
|
+
(0..4).map { |i| right.append_child Button.new(text: "Button_#{i}") }
|
|
57
|
+
|
|
58
|
+
[left, right].each { |widget| screen.append_child widget }
|
|
59
|
+
screen.clear
|
|
60
|
+
screen.render
|
|
61
|
+
# screen.renderer.print_dev_stdout
|
|
62
|
+
assert_equal '' \
|
|
63
|
+
' \n' \
|
|
64
|
+
' \n' \
|
|
65
|
+
' Label_0 \n' \
|
|
66
|
+
' Label_1 \n' \
|
|
67
|
+
' Label_2 \n' \
|
|
68
|
+
' Label_3 \n' \
|
|
69
|
+
' Label_4 ┌────────┐ \n' \
|
|
70
|
+
' Label_5 │Button_0│ \n' \
|
|
71
|
+
' Label_6 └────────┘ \n' \
|
|
72
|
+
' Label_7 ┌────────┐ \n' \
|
|
73
|
+
' Label_8 │Button_1│ \n' \
|
|
74
|
+
' └────────┘ \n' \
|
|
75
|
+
' ┌────────┐ \n' \
|
|
76
|
+
' │Button_2│ \n' \
|
|
77
|
+
' └────────┘ \n' \
|
|
78
|
+
' ┌────────┐ \n' \
|
|
79
|
+
' │Button_3│ \n' \
|
|
80
|
+
' └────────┘ \n' \
|
|
81
|
+
' ┌────────┐ \n' \
|
|
82
|
+
' │Button_4│ \n' \
|
|
83
|
+
' └────────┘ \n' \
|
|
84
|
+
' \n' \
|
|
85
|
+
'', screen.print
|
|
86
|
+
end
|
|
87
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
include Test::Unit::Assertions
|
|
3
|
+
require_relative '../../src/screen'
|
|
4
|
+
require_relative '../../src/widget/button'
|
|
5
|
+
require_relative '../../src/widget/inline'
|
|
6
|
+
|
|
7
|
+
class InlineTest < Test::Unit::TestCase
|
|
8
|
+
def test_simple
|
|
9
|
+
s = Screen.new_for_testing(width: 30, height: 10)
|
|
10
|
+
i = s.append_child Inline.new(height: 5, width: 0.99, ch: '.')
|
|
11
|
+
s.render
|
|
12
|
+
assert_equal '............................. \n' \
|
|
13
|
+
'............................. \n' \
|
|
14
|
+
'............................. \n' \
|
|
15
|
+
'............................. \n' \
|
|
16
|
+
'............................. \n' \
|
|
17
|
+
' \n' \
|
|
18
|
+
' \n' \
|
|
19
|
+
' \n' \
|
|
20
|
+
' \n' \
|
|
21
|
+
' \n', s.print
|
|
22
|
+
|
|
23
|
+
i.append_child Button.new(text: 'hello')
|
|
24
|
+
i.append_child Button.new(text: 'how are yout')
|
|
25
|
+
i.append_child Button.new(text: 'long?')
|
|
26
|
+
i.append_child Button.new(text: 'day out')
|
|
27
|
+
i.append_child Button.new(text: 'there?')
|
|
28
|
+
s.render
|
|
29
|
+
assert_equal '┌─────┐┌────────────┐........ \n' \
|
|
30
|
+
'│hello││how are yout│........ \n' \
|
|
31
|
+
'└─────┘└────────────┘........ \n' \
|
|
32
|
+
'┌─────┐┌───────┐┌──────┐..... \n' \
|
|
33
|
+
'│long?││day out││there?│..... \n' \
|
|
34
|
+
'└─────┘└───────┘└──────┘..... \n' \
|
|
35
|
+
'............................. \n' \
|
|
36
|
+
' \n' \
|
|
37
|
+
' \n' \
|
|
38
|
+
' \n', s.print
|
|
39
|
+
end
|
|
40
|
+
end
|