vedeu 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/docs/api.md +2 -0
  3. data/docs/events.md +0 -4
  4. data/examples/cursor_app/cursor_app.rb +56 -44
  5. data/lib/vedeu/api/api.rb +4 -6
  6. data/lib/vedeu/api/composition.rb +3 -7
  7. data/lib/vedeu/api/interface.rb +2 -3
  8. data/lib/vedeu/api/menu.rb +5 -3
  9. data/lib/vedeu/api/stream.rb +34 -0
  10. data/lib/vedeu/application.rb +4 -7
  11. data/lib/vedeu/configuration/api.rb +0 -5
  12. data/lib/vedeu/configuration/cli.rb +0 -1
  13. data/lib/vedeu/configuration/configuration.rb +0 -12
  14. data/lib/vedeu/input/input.rb +0 -3
  15. data/lib/vedeu/launcher.rb +0 -1
  16. data/lib/vedeu/models/{attributes/background.rb → background.rb} +0 -4
  17. data/lib/vedeu/models/char.rb +43 -0
  18. data/lib/vedeu/models/colour.rb +0 -1
  19. data/lib/vedeu/models/composition.rb +4 -3
  20. data/lib/vedeu/models/cursor.rb +70 -146
  21. data/lib/vedeu/models/{attributes/foreground.rb → foreground.rb} +0 -4
  22. data/lib/vedeu/models/geometry.rb +19 -20
  23. data/lib/vedeu/models/interface.rb +36 -5
  24. data/lib/vedeu/models/keymap.rb +7 -4
  25. data/lib/vedeu/models/line.rb +31 -11
  26. data/lib/vedeu/models/offset.rb +84 -0
  27. data/lib/vedeu/models/stream.rb +37 -13
  28. data/lib/vedeu/models/style.rb +0 -1
  29. data/lib/vedeu/output/area.rb +284 -0
  30. data/lib/vedeu/output/clear.rb +2 -4
  31. data/lib/vedeu/output/compositor.rb +0 -4
  32. data/lib/vedeu/output/refresh.rb +1 -2
  33. data/lib/vedeu/output/render.rb +12 -163
  34. data/lib/vedeu/output/view.rb +0 -2
  35. data/lib/vedeu/output/viewport.rb +132 -0
  36. data/lib/vedeu/repositories/buffers.rb +11 -22
  37. data/lib/vedeu/repositories/cursors.rb +20 -47
  38. data/lib/vedeu/repositories/events.rb +2 -1
  39. data/lib/vedeu/repositories/focus.rb +16 -16
  40. data/lib/vedeu/repositories/groups.rb +1 -4
  41. data/lib/vedeu/repositories/interfaces.rb +10 -3
  42. data/lib/vedeu/repositories/keymaps.rb +0 -3
  43. data/lib/vedeu/repositories/menus.rb +0 -2
  44. data/lib/vedeu/repositories/offsets.rb +47 -0
  45. data/lib/vedeu/{models/attributes → support}/coercions.rb +0 -0
  46. data/lib/vedeu/{models/attributes → support}/colour_translator.rb +0 -16
  47. data/lib/vedeu/support/esc.rb +0 -22
  48. data/lib/vedeu/support/event.rb +1 -17
  49. data/lib/vedeu/support/exceptions.rb +0 -3
  50. data/lib/vedeu/support/grid.rb +0 -3
  51. data/lib/vedeu/support/log.rb +13 -14
  52. data/lib/vedeu/support/move.rb +50 -0
  53. data/lib/vedeu/support/position.rb +17 -9
  54. data/lib/vedeu/{models/attributes → support}/presentation.rb +1 -4
  55. data/lib/vedeu/support/registrar.rb +2 -2
  56. data/lib/vedeu/support/repository.rb +23 -2
  57. data/lib/vedeu/support/terminal.rb +0 -2
  58. data/lib/vedeu/support/trace.rb +0 -11
  59. data/lib/vedeu.rb +11 -5
  60. data/test/lib/vedeu/api/api_test.rb +14 -5
  61. data/test/lib/vedeu/api/composition_test.rb +9 -26
  62. data/test/lib/vedeu/api/keymap_test.rb +1 -1
  63. data/test/lib/vedeu/api/menu_test.rb +6 -0
  64. data/test/lib/vedeu/api/stream_test.rb +32 -0
  65. data/test/lib/vedeu/models/{attributes/background_test.rb → background_test.rb} +0 -0
  66. data/test/lib/vedeu/models/char_test.rb +46 -0
  67. data/test/lib/vedeu/models/composition_test.rb +7 -0
  68. data/test/lib/vedeu/models/cursor_test.rb +63 -80
  69. data/test/lib/vedeu/models/{attributes/foreground_test.rb → foreground_test.rb} +0 -0
  70. data/test/lib/vedeu/models/geometry_test.rb +8 -10
  71. data/test/lib/vedeu/models/interface_test.rb +26 -21
  72. data/test/lib/vedeu/models/keymap_test.rb +6 -0
  73. data/test/lib/vedeu/models/line_test.rb +82 -3
  74. data/test/lib/vedeu/models/offset_test.rb +121 -0
  75. data/test/lib/vedeu/models/stream_test.rb +107 -8
  76. data/test/lib/vedeu/output/area_test.rb +242 -0
  77. data/test/lib/vedeu/output/compositor_test.rb +12 -3
  78. data/test/lib/vedeu/output/render_test.rb +34 -39
  79. data/test/lib/vedeu/output/viewport_test.rb +36 -0
  80. data/test/lib/vedeu/repositories/cursors_test.rb +32 -9
  81. data/test/lib/vedeu/repositories/focus_test.rb +8 -0
  82. data/test/lib/vedeu/repositories/offsets_test.rb +32 -0
  83. data/test/lib/vedeu/{models/attributes → support}/coercions_test.rb +0 -0
  84. data/test/lib/vedeu/{models/attributes → support}/colour_translator_test.rb +0 -0
  85. data/test/lib/vedeu/support/move_test.rb +35 -0
  86. data/test/lib/vedeu/{models/attributes → support}/presentation_test.rb +0 -0
  87. data/test/lib/vedeu/support/registrar_test.rb +6 -0
  88. data/test/lib/vedeu_test.rb +5 -0
  89. data/vedeu.gemspec +1 -1
  90. metadata +37 -17
@@ -27,11 +27,11 @@ module Vedeu
27
27
  end
28
28
  end
29
29
 
30
- describe '#viewport_width' do
30
+ describe '#width' do
31
31
  it 'returns the viewport width when the interface fits the terminal' do
32
32
  IO.console.stub(:winsize, [25, 80]) do
33
33
  geometry = Geometry.new({ width: 60, height: 1, x: 5, y: 1 })
34
- geometry.viewport_width.must_equal(60)
34
+ geometry.width.must_equal(60)
35
35
  end
36
36
  end
37
37
 
@@ -39,23 +39,23 @@ module Vedeu
39
39
  'terminal' do
40
40
  IO.console.stub(:winsize, [25, 60]) do
41
41
  geometry = Geometry.new({ width: 60, height: 1, x: 5, y: 1 })
42
- geometry.viewport_width.must_equal(55)
42
+ geometry.width.must_equal(55)
43
43
  end
44
44
  end
45
45
 
46
46
  it 'returns an unusable viewport width when the terminal is tiny' do
47
47
  IO.console.stub(:winsize, [25, -10]) do
48
48
  geometry = Geometry.new({ width: 60, height: 1, x: 5, y: 1 })
49
- geometry.viewport_width.must_equal(1)
49
+ geometry.width.must_equal(1)
50
50
  end
51
51
  end
52
52
  end
53
53
 
54
- describe '#viewport_height' do
54
+ describe '#height' do
55
55
  it 'returns the viewport height when the interface fits the terminal' do
56
56
  IO.console.stub(:winsize, [25, 80]) do
57
57
  geometry = Geometry.new({ width: 5, height: 20, x: 1, y: 5 })
58
- geometry.viewport_height.must_equal(20)
58
+ geometry.height.must_equal(20)
59
59
  end
60
60
  end
61
61
 
@@ -63,14 +63,14 @@ module Vedeu
63
63
  'terminal' do
64
64
  IO.console.stub(:winsize, [15, 80]) do
65
65
  geometry = Geometry.new({ width: 5, height: 20, x: 1, y: 5 })
66
- geometry.viewport_height.must_equal(10)
66
+ geometry.height.must_equal(10)
67
67
  end
68
68
  end
69
69
 
70
70
  it 'returns an unusable viewport height when the terminal is tiny' do
71
71
  IO.console.stub(:winsize, [-10, 80]) do
72
72
  geometry = Geometry.new({ width: 60, height: 20, x: 1, y: 5 })
73
- geometry.viewport_height.must_equal(1)
73
+ geometry.height.must_equal(1)
74
74
  end
75
75
  end
76
76
  end
@@ -259,8 +259,6 @@ module Vedeu
259
259
  width: 6,
260
260
  x: 3,
261
261
  y: 3,
262
- viewport_height: 6,
263
- viewport_width: 6,
264
262
  top: 3,
265
263
  right: 9,
266
264
  bottom: 9,
@@ -2,33 +2,26 @@ require 'test_helper'
2
2
 
3
3
  module Vedeu
4
4
  describe Interface do
5
- let(:interface) {
6
- Interface.new({
7
- name: '#initialize',
8
- group: 'my_group',
9
- lines: [],
10
- colour: {
11
- foreground: '#ff0000',
12
- background: '#000000'
13
- },
14
- geometry: {
15
- y: 3,
16
- x: 5,
17
- width: 10,
18
- height: 15,
19
- }
20
- })
21
- }
5
+ let(:interface) { Vedeu.use('#initialize') }
6
+
7
+ before do
8
+ Interfaces.reset
9
+ Vedeu.interface('#initialize') do
10
+ group 'my_group'
11
+ colour foreground: '#ff0000', background: '#000000'
12
+ y 3
13
+ x 5
14
+ width 10
15
+ height 15
16
+ end
17
+ end
22
18
 
23
19
  describe '#initialize' do
24
20
  it 'returns an instance of itself' do
25
- attributes = {}
26
-
27
- Interface.new(attributes).must_be_instance_of(Interface)
21
+ interface.must_be_instance_of(Interface)
28
22
  end
29
23
  end
30
24
 
31
-
32
25
  describe '#attributes' do
33
26
  it 'returns the value' do
34
27
  interface.attributes.must_equal(
@@ -54,6 +47,12 @@ module Vedeu
54
47
  end
55
48
  end
56
49
 
50
+ describe '#cursor' do
51
+ it 'returns a Cursor' do
52
+ interface.cursor.must_be_instance_of(Cursor)
53
+ end
54
+ end
55
+
57
56
  describe '#name' do
58
57
  it 'returns the value' do
59
58
  interface.name.must_equal('#initialize')
@@ -98,5 +97,11 @@ module Vedeu
98
97
  end
99
98
  end
100
99
 
100
+ describe '#method_missing' do
101
+ it 'returns nil' do
102
+ interface.some_missing_method(:test).must_equal(nil)
103
+ end
104
+ end
105
+
101
106
  end
102
107
  end
@@ -15,5 +15,11 @@ module Vedeu
15
15
  end
16
16
  end
17
17
 
18
+ describe '#method_missing' do
19
+ it 'returns nil' do
20
+ Keymap.new.some_missing_method(:test).must_equal(nil)
21
+ end
22
+ end
23
+
18
24
  end
19
25
  end
@@ -9,11 +9,21 @@ module Vedeu
9
9
  foreground: '#ff0000',
10
10
  background: '#000000'
11
11
  },
12
- streams: [],
12
+ streams: streams,
13
13
  style: 'normal',
14
14
  parent: nil,
15
15
  }
16
16
  }
17
+ let(:streams) {
18
+ [
19
+ Stream.new({
20
+ colour: { foreground: '#ff0000' }, text: 'Something interesting ' }),
21
+ Stream.new({
22
+ colour: { foreground: '#00ff00' }, text: 'on this line ' }),
23
+ Stream.new({
24
+ colour: { foreground: '#0000ff' }, text: 'would be cool, eh?' })
25
+ ]
26
+ }
17
27
 
18
28
  describe '#initialize' do
19
29
  it 'returns an instance of itself' do
@@ -27,9 +37,70 @@ module Vedeu
27
37
  end
28
38
  end
29
39
 
40
+ describe '#chars' do
41
+ it 'returns an Array' do
42
+ line.chars.must_be_instance_of(Array)
43
+ end
44
+
45
+ context 'when there is no content' do
46
+ before { line.stubs(:size).returns(0) }
47
+
48
+ it { line.chars.must_equal([]) }
49
+ end
50
+
51
+ context 'when there is content' do
52
+ it 'returns an Array' do
53
+ line.chars.must_equal(
54
+ [
55
+ "\e[38;2;255;0;0mS", "\e[38;2;255;0;0mo", "\e[38;2;255;0;0mm",
56
+ "\e[38;2;255;0;0me", "\e[38;2;255;0;0mt", "\e[38;2;255;0;0mh",
57
+ "\e[38;2;255;0;0mi", "\e[38;2;255;0;0mn", "\e[38;2;255;0;0mg",
58
+ "\e[38;2;255;0;0m ", "\e[38;2;255;0;0mi", "\e[38;2;255;0;0mn",
59
+ "\e[38;2;255;0;0mt", "\e[38;2;255;0;0me", "\e[38;2;255;0;0mr",
60
+ "\e[38;2;255;0;0me", "\e[38;2;255;0;0ms", "\e[38;2;255;0;0mt",
61
+ "\e[38;2;255;0;0mi", "\e[38;2;255;0;0mn", "\e[38;2;255;0;0mg",
62
+ "\e[38;2;255;0;0m ", "\e[38;2;0;255;0mo", "\e[38;2;0;255;0mn",
63
+ "\e[38;2;0;255;0m ", "\e[38;2;0;255;0mt", "\e[38;2;0;255;0mh",
64
+ "\e[38;2;0;255;0mi", "\e[38;2;0;255;0ms", "\e[38;2;0;255;0m ",
65
+ "\e[38;2;0;255;0ml", "\e[38;2;0;255;0mi", "\e[38;2;0;255;0mn",
66
+ "\e[38;2;0;255;0me", "\e[38;2;0;255;0m ", "\e[38;2;0;0;255mw",
67
+ "\e[38;2;0;0;255mo", "\e[38;2;0;0;255mu", "\e[38;2;0;0;255ml",
68
+ "\e[38;2;0;0;255md", "\e[38;2;0;0;255m ", "\e[38;2;0;0;255mb",
69
+ "\e[38;2;0;0;255me", "\e[38;2;0;0;255m ", "\e[38;2;0;0;255mc",
70
+ "\e[38;2;0;0;255mo", "\e[38;2;0;0;255mo", "\e[38;2;0;0;255ml",
71
+ "\e[38;2;0;0;255m,", "\e[38;2;0;0;255m ", "\e[38;2;0;0;255me",
72
+ "\e[38;2;0;0;255mh", "\e[38;2;0;0;255m?"
73
+ ]
74
+ )
75
+ end
76
+ end
77
+ end
78
+
79
+ describe '#empty?' do
80
+ context 'when there is no content' do
81
+ before { line.stubs(:size).returns(0) }
82
+
83
+ it { line.empty?.must_equal(true) }
84
+ end
85
+
86
+ it 'returns false when there is content' do
87
+ line.empty?.must_equal(false)
88
+ end
89
+ end
90
+
91
+ describe '#size' do
92
+ it 'returns a Fixnum' do
93
+ line.size.must_be_instance_of(Fixnum)
94
+ end
95
+
96
+ it 'returns the size of the line' do
97
+ line.size.must_equal(53)
98
+ end
99
+ end
100
+
30
101
  describe '#streams' do
31
102
  it 'has a streams attribute' do
32
- line.streams.must_equal([])
103
+ line.streams.must_be_instance_of(Array)
33
104
  end
34
105
  end
35
106
 
@@ -37,9 +108,17 @@ module Vedeu
37
108
  it 'returns a String' do
38
109
  line.to_s.must_equal(
39
110
  "\e[38;2;255;0;0m\e[48;2;0;0;0m" \
40
- "\e[24m\e[22m\e[27m"
111
+ "\e[24m\e[22m\e[27m\e[38;2;255;0;0mSomething interesting "\
112
+ "\e[38;2;0;255;0mon this line " \
113
+ "\e[38;2;0;0;255mwould be cool, eh?"
41
114
  )
42
115
  end
43
116
  end
117
+
118
+ describe '#method_missing' do
119
+ it 'returns nil' do
120
+ Line.new.some_missing_method(:test).must_equal(nil)
121
+ end
122
+ end
44
123
  end
45
124
  end
@@ -0,0 +1,121 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+ describe Offset do
5
+ let(:offset) { Offset.new(attributes) }
6
+ let(:attributes) { {} }
7
+
8
+ before { Offsets.reset }
9
+
10
+ describe '#initialize' do
11
+ it 'returns a new instance of Offset' do
12
+ offset.must_be_instance_of(Offset)
13
+ end
14
+ end
15
+
16
+ describe '#attributes' do
17
+ it 'returns the attributes' do
18
+ skip
19
+ end
20
+ end
21
+
22
+ describe '#move' do
23
+ let(:attributes) { { name: 'roentgenium' } }
24
+
25
+ context 'left' do
26
+ it 'does not move past the leftmost position' do
27
+ offset.move(0, -1).x.must_equal(0)
28
+ end
29
+
30
+ context 'when it can move left' do
31
+ let(:attributes) { { name: 'roentgenium', x: 5 } }
32
+
33
+ it 'moves left' do
34
+ offset.move(0, -1).x.must_equal(4)
35
+ end
36
+ end
37
+ end
38
+
39
+ context 'right' do
40
+ it 'moves right' do
41
+ offset.move(0, 1).x.must_equal(1)
42
+ end
43
+ end
44
+
45
+ context 'up' do
46
+ it 'does not move past the upmost position' do
47
+ offset.move(-1, 0).y.must_equal(0)
48
+ end
49
+
50
+ context 'when it can move up' do
51
+ let(:attributes) { { name: 'roentgenium', y: 5 } }
52
+
53
+ it 'moves up' do
54
+ offset.move(-1, 0).y.must_equal(4)
55
+ end
56
+ end
57
+ end
58
+
59
+ context 'down' do
60
+ it 'moves down' do
61
+ offset.move(1, 0).y.must_equal(1)
62
+ end
63
+ end
64
+ end
65
+
66
+ describe '#name' do
67
+ it 'has a default value of empty string' do
68
+ offset.name.must_equal('')
69
+ end
70
+
71
+ context 'when a value is set' do
72
+ let(:attributes) { { name: 'roentgenium' } }
73
+
74
+ it 'returns that value' do
75
+ offset.name.must_equal('roentgenium')
76
+ end
77
+ end
78
+ end
79
+
80
+ describe '#y' do
81
+ it 'has a default value of 0' do
82
+ offset.y.must_equal(0)
83
+ end
84
+
85
+ context 'when a value is set' do
86
+ let(:attributes) { { y: 3 } }
87
+
88
+ it 'returns that value' do
89
+ offset.y.must_equal(3)
90
+ end
91
+ end
92
+
93
+ context 'when a value is set that is < 0' do
94
+ let(:attributes) { { y: -2 } }
95
+
96
+ it { offset.y.must_equal(0) }
97
+ end
98
+ end
99
+
100
+ describe '#x' do
101
+ it 'has a default value of 0' do
102
+ offset.x.must_equal(0)
103
+ end
104
+
105
+ context 'when a value is set' do
106
+ let(:attributes) { { x: 2 } }
107
+
108
+ it 'returns that value' do
109
+ offset.x.must_equal(2)
110
+ end
111
+ end
112
+
113
+ context 'when a value is set that is < 0' do
114
+ let(:attributes) { { x: -2 } }
115
+
116
+ it { offset.x.must_equal(0) }
117
+ end
118
+ end
119
+
120
+ end
121
+ end
@@ -4,19 +4,25 @@ module Vedeu
4
4
  describe Stream do
5
5
  let(:stream) {
6
6
  Stream.new({
7
- colour: {
8
- foreground: '#ff0000',
9
- background: '#000000'
10
- },
11
- text: 'Some text',
7
+ colour: colour,
8
+ parent: parent,
9
+ text: text,
12
10
  style: style,
13
11
  width: width,
14
12
  align: align
15
13
  })
16
14
  }
17
- let(:style) { 'normal' }
18
- let(:align) { :left }
19
- let(:width) { 9 }
15
+ let(:colour) {
16
+ {
17
+ foreground: '#ff0000',
18
+ background: '#000000'
19
+ }
20
+ }
21
+ let(:parent) { nil }
22
+ let(:style) { 'normal' }
23
+ let(:text) { 'Some text'}
24
+ let(:align) { :left }
25
+ let(:width) { 9 }
20
26
 
21
27
  describe '#initialize' do
22
28
  it 'returns an instance of itself' do
@@ -25,6 +31,92 @@ module Vedeu
25
31
  end
26
32
  end
27
33
 
34
+ describe '#chars' do
35
+ let(:parent) {
36
+ {
37
+ colour: {
38
+ foreground: '#ffff00',
39
+ background: '#0000ff'
40
+ },
41
+ style: []
42
+ }
43
+ }
44
+
45
+ it 'returns an Array' do
46
+ stream.chars.must_be_instance_of(Array)
47
+ end
48
+
49
+ context 'when there is content' do
50
+ it 'returns a collection of strings containing escape sequences and ' \
51
+ 'content' do
52
+ stream.chars.must_equal(
53
+ [
54
+ "\e[38;2;255;0;0m\e[48;2;0;0;0m\e[24m\e[22m\e[27mS\e[38;2;255;255;0m\e[48;2;0;0;255m",
55
+ "\e[38;2;255;0;0m\e[48;2;0;0;0m\e[24m\e[22m\e[27mo\e[38;2;255;255;0m\e[48;2;0;0;255m",
56
+ "\e[38;2;255;0;0m\e[48;2;0;0;0m\e[24m\e[22m\e[27mm\e[38;2;255;255;0m\e[48;2;0;0;255m",
57
+ "\e[38;2;255;0;0m\e[48;2;0;0;0m\e[24m\e[22m\e[27me\e[38;2;255;255;0m\e[48;2;0;0;255m",
58
+ "\e[38;2;255;0;0m\e[48;2;0;0;0m\e[24m\e[22m\e[27m \e[38;2;255;255;0m\e[48;2;0;0;255m",
59
+ "\e[38;2;255;0;0m\e[48;2;0;0;0m\e[24m\e[22m\e[27mt\e[38;2;255;255;0m\e[48;2;0;0;255m",
60
+ "\e[38;2;255;0;0m\e[48;2;0;0;0m\e[24m\e[22m\e[27me\e[38;2;255;255;0m\e[48;2;0;0;255m",
61
+ "\e[38;2;255;0;0m\e[48;2;0;0;0m\e[24m\e[22m\e[27mx\e[38;2;255;255;0m\e[48;2;0;0;255m",
62
+ "\e[38;2;255;0;0m\e[48;2;0;0;0m\e[24m\e[22m\e[27mt\e[38;2;255;255;0m\e[48;2;0;0;255m"
63
+ ]
64
+ )
65
+ end
66
+ end
67
+
68
+ context 'when there is no content' do
69
+ let(:text) { '' }
70
+ let(:width) { nil }
71
+
72
+ it 'returns an empty collection' do
73
+ stream.chars.must_equal([])
74
+ end
75
+ end
76
+
77
+ context 'when there is no content but a width is set' do
78
+ let(:text) { '' }
79
+
80
+ it 'returns style and colours as appropriate' do
81
+ stream.chars.must_equal(
82
+ [
83
+ "\e[38;2;255;0;0m\e[48;2;0;0;0m\e[24m\e[22m\e[27m \e[38;2;255;255;0m\e[48;2;0;0;255m",
84
+ "\e[38;2;255;0;0m\e[48;2;0;0;0m\e[24m\e[22m\e[27m \e[38;2;255;255;0m\e[48;2;0;0;255m",
85
+ "\e[38;2;255;0;0m\e[48;2;0;0;0m\e[24m\e[22m\e[27m \e[38;2;255;255;0m\e[48;2;0;0;255m",
86
+ "\e[38;2;255;0;0m\e[48;2;0;0;0m\e[24m\e[22m\e[27m \e[38;2;255;255;0m\e[48;2;0;0;255m",
87
+ "\e[38;2;255;0;0m\e[48;2;0;0;0m\e[24m\e[22m\e[27m \e[38;2;255;255;0m\e[48;2;0;0;255m",
88
+ "\e[38;2;255;0;0m\e[48;2;0;0;0m\e[24m\e[22m\e[27m \e[38;2;255;255;0m\e[48;2;0;0;255m",
89
+ "\e[38;2;255;0;0m\e[48;2;0;0;0m\e[24m\e[22m\e[27m \e[38;2;255;255;0m\e[48;2;0;0;255m",
90
+ "\e[38;2;255;0;0m\e[48;2;0;0;0m\e[24m\e[22m\e[27m \e[38;2;255;255;0m\e[48;2;0;0;255m",
91
+ "\e[38;2;255;0;0m\e[48;2;0;0;0m\e[24m\e[22m\e[27m \e[38;2;255;255;0m\e[48;2;0;0;255m"
92
+ ]
93
+ )
94
+ end
95
+ end
96
+ end
97
+
98
+ describe '#empty?' do
99
+ context 'when there is no content' do
100
+ before { stream.stubs(:size).returns(0) }
101
+
102
+ it { stream.empty?.must_equal(true) }
103
+ end
104
+
105
+ it 'returns false when there is content' do
106
+ stream.empty?.must_equal(false)
107
+ end
108
+ end
109
+
110
+ describe '#size' do
111
+ it 'returns a Fixnum' do
112
+ stream.size.must_be_instance_of(Fixnum)
113
+ end
114
+
115
+ it 'returns the size of the stream' do
116
+ stream.size.must_equal(9)
117
+ end
118
+ end
119
+
28
120
  describe '#text' do
29
121
  it 'has a text attribute' do
30
122
  stream.text.must_equal('Some text')
@@ -118,5 +210,12 @@ module Vedeu
118
210
  end
119
211
  end
120
212
  end
213
+
214
+ describe '#method_missing' do
215
+ it 'returns nil' do
216
+ Composition.new.some_missing_method(:test).must_equal(nil)
217
+ end
218
+ end
219
+
121
220
  end
122
221
  end