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
|