vedeu 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/Guardfile +1 -1
  4. data/README.md +14 -0
  5. data/lib/vedeu.rb +1 -0
  6. data/lib/vedeu/interface/dummy.rb +13 -0
  7. data/lib/vedeu/interface/interface.rb +1 -1
  8. data/lib/vedeu/interface/interfaces.rb +10 -9
  9. data/lib/vedeu/output/colour.rb +2 -0
  10. data/lib/vedeu/output/compositor.rb +3 -23
  11. data/lib/vedeu/output/directive.rb +27 -14
  12. data/lib/vedeu/output/geometry.rb +6 -1
  13. data/lib/vedeu/output/position.rb +8 -3
  14. data/lib/vedeu/output/wordwrap.rb +84 -0
  15. data/lib/vedeu/version.rb +1 -1
  16. data/test/lib/vedeu/application_test.rb +15 -5
  17. data/test/lib/vedeu/interface/dummy_test.rb +5 -5
  18. data/test/lib/vedeu/interface/interface_test.rb +17 -7
  19. data/test/lib/vedeu/interface/interfaces_test.rb +29 -20
  20. data/test/lib/vedeu/output/background_test.rb +40 -3
  21. data/test/lib/vedeu/output/base_test.rb +2 -4
  22. data/test/lib/vedeu/output/colour_test.rb +6 -6
  23. data/test/lib/vedeu/output/compositor_test.rb +15 -15
  24. data/test/lib/vedeu/output/directive_test.rb +36 -35
  25. data/test/lib/vedeu/output/esc_test.rb +9 -9
  26. data/test/lib/vedeu/output/foreground_test.rb +39 -2
  27. data/test/lib/vedeu/output/geometry_test.rb +51 -7
  28. data/test/lib/vedeu/output/position_test.rb +15 -6
  29. data/test/lib/vedeu/output/renderer_test.rb +19 -1
  30. data/test/lib/vedeu/output/style_test.rb +1 -2
  31. data/test/lib/vedeu/output/wordwrap_test.rb +59 -0
  32. data/test/lib/vedeu/process/command_test.rb +8 -8
  33. data/test/lib/vedeu/process/commands_test.rb +27 -7
  34. data/test/lib/vedeu/process/exit_test.rb +1 -1
  35. data/test/lib/vedeu/support/terminal_test.rb +27 -24
  36. data/test/test_helper.rb +1 -1
  37. data/vedeu.gemspec +5 -5
  38. metadata +21 -19
@@ -10,38 +10,47 @@ module Vedeu
10
10
  describe Interfaces do
11
11
  let(:described_class) { Interfaces }
12
12
 
13
- describe '.default' do
14
- subject { described_class.default }
15
-
16
- it { subject.must_be_instance_of(Hash) }
13
+ describe '.define' do
14
+ let(:subject) { described_class.define }
17
15
 
18
- it 'adds the dummy interface to the interface list' do
19
- described_class.list.wont_be_empty
20
- end
16
+ it { subject.must_be_instance_of(Module) }
21
17
  end
22
18
 
23
19
  describe '.defined' do
24
- subject { described_class.defined }
20
+ let(:subject) { described_class.defined }
21
+
22
+ after { described_class.interfaces = {} }
23
+
24
+ context 'when interfaces are not defined' do
25
+ before { described_class.interfaces = {} }
26
+
27
+ it { subject.must_be_instance_of(NilClass) }
28
+ end
29
+
30
+ context 'when no interfaces are defined' do
31
+ before { described_class.interfaces = { mock: :interface } }
25
32
 
26
- it { subject.must_be_instance_of(Hash) }
33
+ it { subject.must_be_instance_of(Module) }
34
+ end
27
35
  end
28
36
 
29
- describe '.define' do
30
- subject { described_class.define }
37
+ describe '.default' do
38
+ let(:subject) { described_class.default }
31
39
 
32
40
  it { subject.must_be_instance_of(Module) }
41
+
42
+ it 'adds the dummy interface to the interface list' do
43
+ described_class.list.wont_be_empty
44
+ end
33
45
  end
34
46
 
35
47
  describe '.add' do
48
+ let(:subject) { described_class.add(interface, klass, options) }
36
49
  let(:interface) {}
37
50
  let(:klass) { DummyInterface }
38
51
  let(:options) { {} }
39
52
 
40
- subject { described_class.add(interface, klass, options) }
41
-
42
- it { subject.must_be_instance_of(Hash) }
43
-
44
- it { subject.wont_be_empty }
53
+ it { subject.must_be_instance_of(Module) }
45
54
 
46
55
  context 'when the interface class does not exist' do
47
56
  before { Object.stubs(:const_defined?).returns(false) }
@@ -51,25 +60,25 @@ module Vedeu
51
60
  end
52
61
 
53
62
  describe '.list' do
54
- subject { described_class.list }
63
+ let(:subject) { described_class.list }
55
64
 
56
65
  it { subject.must_be_instance_of(String) }
57
66
  end
58
67
 
59
68
  describe '.initial_state' do
60
- subject { described_class.initial_state }
69
+ let(:subject) { described_class.initial_state }
61
70
 
62
71
  it { subject.must_be_instance_of(Array) }
63
72
  end
64
73
 
65
74
  describe '.event_loop' do
75
+ let(:subject) { described_class.event_loop }
76
+
66
77
  before do
67
78
  Terminal.stubs(:input)
68
79
  Commands.stubs(:execute).returns(:stop)
69
80
  end
70
81
 
71
- subject { described_class.event_loop }
72
-
73
82
  it { subject.must_be_instance_of(Array) }
74
83
  end
75
84
  end
@@ -2,9 +2,46 @@ require_relative '../../../test_helper'
2
2
 
3
3
  module Vedeu
4
4
  describe Background do
5
- let(:described_class) { Background }
6
- let(:instance) { described_class.new }
5
+ let(:described_class) { Background }
6
+ let(:described_instance) { described_class.new(colour) }
7
+ let(:colour) {}
7
8
 
8
- it { instance.must_be_instance_of(Background) }
9
+ it { described_instance.must_be_instance_of(Background) }
10
+
11
+ describe '#escape_sequence' do
12
+ let(:subject) { described_instance.escape_sequence }
13
+
14
+ it { subject.must_be_instance_of(String) }
15
+
16
+ context 'with no colour' do
17
+ it { subject.must_be_instance_of(String) }
18
+
19
+ it { subject.must_equal("\e[48;5;49m") }
20
+ end
21
+
22
+ context 'with a named colour' do
23
+ let(:colour) { :red }
24
+
25
+ it { subject.must_be_instance_of(String) }
26
+
27
+ it { subject.must_equal("\e[48;5;41m") }
28
+ end
29
+
30
+ context 'with a html colour' do
31
+ let(:colour) { '#aadd00' }
32
+
33
+ it { subject.must_be_instance_of(String) }
34
+
35
+ it { subject.must_equal("\e[48;5;148m") }
36
+ end
37
+
38
+ context 'with a default colour' do
39
+ let(:colour) { :undefined }
40
+
41
+ it { subject.must_be_instance_of(String) }
42
+
43
+ it { subject.must_equal("\e[48;5;49m") }
44
+ end
45
+ end
9
46
  end
10
47
  end
@@ -2,9 +2,7 @@ require_relative '../../../test_helper'
2
2
 
3
3
  module Vedeu
4
4
  describe Base do
5
- let(:described_class) { Base }
6
- let(:instance) { described_class.new }
7
-
8
- it { instance.must_be_instance_of(Base) }
5
+ let(:described_class) { Base }
6
+ let(:described_instance) { described_class.new }
9
7
  end
10
8
  end
@@ -3,13 +3,13 @@ require_relative '../../../test_helper'
3
3
  module Vedeu
4
4
  describe Colour do
5
5
  let(:described_class) { Colour }
6
- let(:instance) { described_class.new }
7
- let(:pair) { [] }
6
+ let(:described_instance) { described_class.new }
7
+ let(:pair) { [] }
8
8
 
9
- it { instance.must_be_instance_of(Colour) }
9
+ it { described_instance.must_be_instance_of(Colour) }
10
10
 
11
11
  describe '.set' do
12
- subject { described_class.set(pair) }
12
+ let(:subject) { described_class.set(pair) }
13
13
 
14
14
  it { subject.must_be_instance_of(String) }
15
15
 
@@ -49,8 +49,8 @@ module Vedeu
49
49
  context 'when no foreground/background is specified' do
50
50
  let(:pair) { [] }
51
51
 
52
- it 'returns the reset code' do
53
- subject.must_equal("\e[38;5;39m\e[48;5;49m")
52
+ it 'return an empty string' do
53
+ subject.must_equal('')
54
54
  end
55
55
  end
56
56
  end
@@ -2,11 +2,11 @@ require_relative '../../../test_helper'
2
2
 
3
3
  module Vedeu
4
4
  describe Compositor do
5
- let(:described_class) { Compositor }
6
- let(:instance) { described_class.new(output, interface) }
7
- let(:output) { [[]] }
8
- let(:stream) {}
9
- let(:interface) {
5
+ let(:described_class) { Compositor }
6
+ let(:described_instance) { described_class.new(output, interface) }
7
+ let(:output) { [[]] }
8
+ let(:stream) {}
9
+ let(:interface) {
10
10
  Vedeu::Interface.new({
11
11
  geometry: {
12
12
  y: 2,
@@ -22,10 +22,10 @@ module Vedeu
22
22
  Renderer.stubs(:write).returns(stream)
23
23
  end
24
24
 
25
- it { instance.must_be_instance_of(Compositor) }
25
+ it { described_instance.must_be_instance_of(Compositor) }
26
26
 
27
- describe '.write' do
28
- subject { described_class.write(output, interface) }
27
+ describe '.arrange' do
28
+ let(:subject) { described_class.arrange(output, interface) }
29
29
 
30
30
  context 'when empty' do
31
31
  let(:output) { [] }
@@ -59,7 +59,7 @@ module Vedeu
59
59
  context 'and a single line' do
60
60
  let(:output) {
61
61
  [
62
- [[:red, :white], 'Some text...']
62
+ [{ colour: [:red, :white] }, 'Some text...']
63
63
  ]
64
64
  }
65
65
  let(:stream) { "\e[38;5;31m\e[48;5;47mSome text..." }
@@ -70,8 +70,8 @@ module Vedeu
70
70
  context 'and multi-line' do
71
71
  let(:output) {
72
72
  [
73
- [[:red, :white], 'Some text...'],
74
- [[:blue, :yellow], 'Some more text...']
73
+ [{ colour: [:red, :white] }, 'Some text...'],
74
+ [{ colour: [:blue, :yellow] }, 'Some more text...']
75
75
  ]
76
76
  }
77
77
  let(:stream) {
@@ -87,7 +87,7 @@ module Vedeu
87
87
  context 'and a single line' do
88
88
  let(:output) {
89
89
  [
90
- [:bold, 'Some text...']
90
+ [{ style: :bold }, 'Some text...']
91
91
  ]
92
92
  }
93
93
  let(:stream) {
@@ -100,8 +100,8 @@ module Vedeu
100
100
  context 'and multi-line' do
101
101
  let(:output) {
102
102
  [
103
- [:inverse, 'Some text...'],
104
- [:underline, 'Some more text...']
103
+ [{ style: :inverse }, 'Some text...'],
104
+ [{ style: :underline }, 'Some more text...']
105
105
  ]
106
106
  }
107
107
  let(:stream) {
@@ -116,7 +116,7 @@ module Vedeu
116
116
  context 'with an unknown style' do
117
117
  let(:output) {
118
118
  [
119
- [:unknown, 'Some text...']
119
+ [{ style: :unknown }, 'Some text...']
120
120
  ]
121
121
  }
122
122
  let(:stream) {
@@ -2,53 +2,54 @@ require_relative '../../../test_helper'
2
2
 
3
3
  module Vedeu
4
4
  describe Directive do
5
- let(:described_class) { Directive }
6
- let(:instance) { described_class.new(directive) }
7
- let(:directive) {}
8
-
9
- it { instance.must_be_instance_of(Directive) }
5
+ let(:described_class) { Directive }
6
+ let(:described_instance) { described_class.new(directives) }
7
+ let(:directives) {
8
+ {
9
+ position: position,
10
+ colour: colour,
11
+ style: style
12
+ }
13
+ }
14
+ let(:position) { [] }
15
+ let(:colour) { [] }
16
+ let(:style) { [] }
17
+
18
+ it { described_instance.must_be_instance_of(Directive) }
10
19
 
11
20
  describe '.enact' do
12
- subject { described_class.enact(directive) }
21
+ let(:subject) { described_class.enact(directives) }
13
22
 
14
- context 'when the directive is invalid' do
15
- it 'raises an exception' do
16
- proc { subject }.must_raise(InvalidDirective)
17
- end
18
- end
23
+ it { subject.must_be_instance_of(String) }
19
24
 
20
- context 'when the directive is valid' do
21
- context 'when the directive is a collection' do
22
- let(:directive) { [] }
25
+ context 'when the position is not set' do
26
+ it { subject.must_equal('') }
27
+ end
23
28
 
24
- context 'and the first element is a number' do
25
- let(:directive) { [0, 0] }
29
+ context 'when the position is set' do
30
+ let(:position) { [4, 5] }
26
31
 
27
- before { Position.stubs(:set) }
32
+ it { subject.must_equal("\e[5;6H") }
33
+ end
28
34
 
29
- it 'must be a position' do
30
- skip
31
- end
32
- end
35
+ context 'when the colour is not set' do
36
+ it { subject.must_equal('') }
37
+ end
33
38
 
34
- context 'and the first element is a symbol' do
35
- let(:directive) { [:default, :default] }
39
+ context 'when the colour is set' do
40
+ let(:colour) { [:red, :black] }
36
41
 
37
- before { Colour.stubs(:set) }
42
+ it { subject.must_equal("\e[38;5;31m\e[48;5;40m") }
43
+ end
38
44
 
39
- it 'must be a colour' do
40
- skip
41
- end
42
- end
43
- end
45
+ context 'when the style is not set' do
46
+ it { subject.must_equal('') }
47
+ end
44
48
 
45
- context 'when the directive is individual' do
46
- let(:directive) { :normal }
49
+ context 'when the style is set' do
50
+ let(:style) { [:normal, :underline, :normal] }
47
51
 
48
- it 'must be a style' do
49
- skip
50
- end
51
- end
52
+ it { subject.must_equal("\e[0m\e[4m\e[0m") }
52
53
  end
53
54
  end
54
55
  end
@@ -2,10 +2,10 @@ require_relative '../../../test_helper'
2
2
 
3
3
  module Vedeu
4
4
  describe Esc do
5
- let(:described_class) { Esc }
5
+ let(:described_class) { Esc }
6
6
 
7
7
  describe '.bold' do
8
- subject { described_class.bold }
8
+ let(:subject) { described_class.bold }
9
9
 
10
10
  it { subject.must_be_instance_of(String) }
11
11
 
@@ -13,7 +13,7 @@ module Vedeu
13
13
  end
14
14
 
15
15
  describe '.clear' do
16
- subject { described_class.clear }
16
+ let(:subject) { described_class.clear }
17
17
 
18
18
  it { subject.must_be_instance_of(String) }
19
19
 
@@ -21,7 +21,7 @@ module Vedeu
21
21
  end
22
22
 
23
23
  describe '.esc' do
24
- subject { described_class.esc }
24
+ let(:subject) { described_class.esc }
25
25
 
26
26
  it { subject.must_be_instance_of(String) }
27
27
 
@@ -29,7 +29,7 @@ module Vedeu
29
29
  end
30
30
 
31
31
  describe '.hide_cursor' do
32
- subject { described_class.hide_cursor }
32
+ let(:subject) { described_class.hide_cursor }
33
33
 
34
34
  it { subject.must_be_instance_of(String) }
35
35
 
@@ -37,7 +37,7 @@ module Vedeu
37
37
  end
38
38
 
39
39
  describe '.inverse' do
40
- subject { described_class.inverse }
40
+ let(:subject) { described_class.inverse }
41
41
 
42
42
  it { subject.must_be_instance_of(String) }
43
43
 
@@ -45,7 +45,7 @@ module Vedeu
45
45
  end
46
46
 
47
47
  describe '.reset' do
48
- subject { described_class.reset }
48
+ let(:subject) { described_class.reset }
49
49
 
50
50
  it { subject.must_be_instance_of(String) }
51
51
 
@@ -53,7 +53,7 @@ module Vedeu
53
53
  end
54
54
 
55
55
  describe '.show_cursor' do
56
- subject { described_class.show_cursor }
56
+ let(:subject) { described_class.show_cursor }
57
57
 
58
58
  it { subject.must_be_instance_of(String) }
59
59
 
@@ -61,7 +61,7 @@ module Vedeu
61
61
  end
62
62
 
63
63
  describe '.underline' do
64
- subject { described_class.underline }
64
+ let(:subject) { described_class.underline }
65
65
 
66
66
  it { subject.must_be_instance_of(String) }
67
67
 
@@ -3,8 +3,45 @@ require_relative '../../../test_helper'
3
3
  module Vedeu
4
4
  describe Foreground do
5
5
  let(:described_class) { Foreground }
6
- let(:instance) { described_class.new }
6
+ let(:described_instance) { described_class.new(colour) }
7
+ let(:colour) {}
7
8
 
8
- it { instance.must_be_instance_of(Foreground) }
9
+ it { described_instance.must_be_instance_of(Foreground) }
10
+
11
+ describe '#escape_sequence' do
12
+ let(:subject) { described_instance.escape_sequence }
13
+
14
+ it { subject.must_be_instance_of(String) }
15
+
16
+ context 'with no colour' do
17
+ it { subject.must_be_instance_of(String) }
18
+
19
+ it { subject.must_equal("\e[38;5;39m") }
20
+ end
21
+
22
+ context 'with a named colour' do
23
+ let(:colour) { :red }
24
+
25
+ it { subject.must_be_instance_of(String) }
26
+
27
+ it { subject.must_equal("\e[38;5;31m") }
28
+ end
29
+
30
+ context 'with a html colour' do
31
+ let(:colour) { '#aadd00' }
32
+
33
+ it { subject.must_be_instance_of(String) }
34
+
35
+ it { subject.must_equal("\e[38;5;148m") }
36
+ end
37
+
38
+ context 'with a default colour' do
39
+ let(:colour) { :undefined }
40
+
41
+ it { subject.must_be_instance_of(String) }
42
+
43
+ it { subject.must_equal("\e[38;5;39m") }
44
+ end
45
+ end
9
46
  end
10
47
  end