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.
Files changed (101) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +14 -0
  3. data/README.md +321 -0
  4. data/lib/termgui.rb +1 -0
  5. data/src/action.rb +58 -0
  6. data/src/box.rb +90 -0
  7. data/src/color.rb +174 -0
  8. data/src/cursor.rb +69 -0
  9. data/src/editor/editor_base.rb +152 -0
  10. data/src/editor/editor_base_handlers.rb +116 -0
  11. data/src/element.rb +61 -0
  12. data/src/element_bounds.rb +111 -0
  13. data/src/element_box.rb +64 -0
  14. data/src/element_render.rb +102 -0
  15. data/src/element_style.rb +51 -0
  16. data/src/emitter.rb +102 -0
  17. data/src/emitter_state.rb +19 -0
  18. data/src/enterable.rb +93 -0
  19. data/src/event.rb +92 -0
  20. data/src/focus.rb +102 -0
  21. data/src/geometry.rb +53 -0
  22. data/src/image.rb +60 -0
  23. data/src/input.rb +85 -0
  24. data/src/input_grab.rb +17 -0
  25. data/src/input_time.rb +97 -0
  26. data/src/key.rb +114 -0
  27. data/src/log.rb +24 -0
  28. data/src/node.rb +117 -0
  29. data/src/node_attributes.rb +27 -0
  30. data/src/node_visit.rb +52 -0
  31. data/src/renderer.rb +119 -0
  32. data/src/renderer_cursor.rb +18 -0
  33. data/src/renderer_draw.rb +28 -0
  34. data/src/renderer_image.rb +31 -0
  35. data/src/renderer_print.rb +40 -0
  36. data/src/screen.rb +96 -0
  37. data/src/screen_element.rb +59 -0
  38. data/src/screen_input.rb +43 -0
  39. data/src/screen_renderer.rb +53 -0
  40. data/src/style.rb +149 -0
  41. data/src/tco/colouring.rb +248 -0
  42. data/src/tco/config.rb +57 -0
  43. data/src/tco/palette.rb +603 -0
  44. data/src/tco/tco_termgui.rb +30 -0
  45. data/src/termgui.rb +29 -0
  46. data/src/util/css.rb +98 -0
  47. data/src/util/css_query.rb +23 -0
  48. data/src/util/easing.rb +364 -0
  49. data/src/util/hash_object.rb +131 -0
  50. data/src/util/imagemagick.rb +27 -0
  51. data/src/util/justify.rb +20 -0
  52. data/src/util/unicode-categories.rb +572 -0
  53. data/src/util/wrap.rb +102 -0
  54. data/src/util.rb +110 -0
  55. data/src/widget/button.rb +33 -0
  56. data/src/widget/checkbox.rb +47 -0
  57. data/src/widget/col.rb +30 -0
  58. data/src/widget/image.rb +106 -0
  59. data/src/widget/inline.rb +40 -0
  60. data/src/widget/input_number.rb +73 -0
  61. data/src/widget/inputbox.rb +85 -0
  62. data/src/widget/label.rb +33 -0
  63. data/src/widget/modal.rb +69 -0
  64. data/src/widget/row.rb +26 -0
  65. data/src/widget/selectbox.rb +100 -0
  66. data/src/widget/textarea.rb +54 -0
  67. data/src/xml/xml.rb +80 -0
  68. data/test/action_test.rb +34 -0
  69. data/test/box_test.rb +15 -0
  70. data/test/css_test.rb +39 -0
  71. data/test/editor/editor_base_test.rb +201 -0
  72. data/test/element_bounds_test.rb +77 -0
  73. data/test/element_box_test.rb +8 -0
  74. data/test/element_render_test.rb +124 -0
  75. data/test/element_style_test.rb +85 -0
  76. data/test/element_test.rb +10 -0
  77. data/test/emitter_test.rb +108 -0
  78. data/test/event_test.rb +19 -0
  79. data/test/focus_test.rb +37 -0
  80. data/test/geometry_test.rb +12 -0
  81. data/test/input_test.rb +47 -0
  82. data/test/key_test.rb +14 -0
  83. data/test/log_test.rb +21 -0
  84. data/test/node_test.rb +105 -0
  85. data/test/performance/performance1.rb +48 -0
  86. data/test/renderer_test.rb +74 -0
  87. data/test/renderer_test_rect.rb +4 -0
  88. data/test/screen_test.rb +58 -0
  89. data/test/style_test.rb +18 -0
  90. data/test/termgui_test.rb +10 -0
  91. data/test/test_all.rb +30 -0
  92. data/test/util_hash_object_test.rb +93 -0
  93. data/test/util_test.rb +26 -0
  94. data/test/widget/checkbox_test.rb +99 -0
  95. data/test/widget/col_test.rb +87 -0
  96. data/test/widget/inline_test.rb +40 -0
  97. data/test/widget/label_test.rb +94 -0
  98. data/test/widget/row_test.rb +40 -0
  99. data/test/wrap_test.rb +11 -0
  100. data/test/xml_test.rb +77 -0
  101. 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
@@ -0,0 +1,4 @@
1
+ require_relative '../src/renderer'
2
+
3
+ r = Renderer.new 100, 100
4
+ $stdout.write r.rect x: 2, y: 1, width: 8, height: 5, ch: 'l'
@@ -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
@@ -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
@@ -0,0 +1,10 @@
1
+ require 'test/unit'
2
+ include Test::Unit::Assertions
3
+ require_relative '../src/termgui'
4
+
5
+ class TermGuiTest < Test::Unit::TestCase
6
+ def test_termgui
7
+ el = TermGui::Element.new(text: 'hello')
8
+ assert_equal 'hello', el.text
9
+ end
10
+ 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