ducktrap 0.0.1

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 (165) hide show
  1. checksums.yaml +7 -0
  2. data/.circle.yml +6 -0
  3. data/.gitignore +5 -0
  4. data/.rspec +1 -0
  5. data/.travis.yml +16 -0
  6. data/Gemfile +6 -0
  7. data/Gemfile.devtools +59 -0
  8. data/Guardfile +18 -0
  9. data/LICENSE +20 -0
  10. data/README.md +47 -0
  11. data/Rakefile +2 -0
  12. data/TODO +4 -0
  13. data/config/devtools.yml +2 -0
  14. data/config/flay.yml +3 -0
  15. data/config/flog.yml +2 -0
  16. data/config/heckle.yml +3 -0
  17. data/config/mutant.yml +2 -0
  18. data/config/reek.yml +98 -0
  19. data/config/yardstick.yml +2 -0
  20. data/ducktrap.gemspec +23 -0
  21. data/lib/ducktrap.rb +73 -0
  22. data/lib/ducktrap/builder.rb +36 -0
  23. data/lib/ducktrap/error.rb +48 -0
  24. data/lib/ducktrap/evaluator.rb +127 -0
  25. data/lib/ducktrap/evaluator/invalid.rb +30 -0
  26. data/lib/ducktrap/evaluator/static.rb +25 -0
  27. data/lib/ducktrap/formatter.rb +138 -0
  28. data/lib/ducktrap/mapper.rb +59 -0
  29. data/lib/ducktrap/nary.rb +148 -0
  30. data/lib/ducktrap/node.rb +94 -0
  31. data/lib/ducktrap/node/anima.rb +40 -0
  32. data/lib/ducktrap/node/anima/dump.rb +39 -0
  33. data/lib/ducktrap/node/anima/load.rb +39 -0
  34. data/lib/ducktrap/node/block.rb +44 -0
  35. data/lib/ducktrap/node/coercion.rb +7 -0
  36. data/lib/ducktrap/node/custom.rb +121 -0
  37. data/lib/ducktrap/node/disjunction.rb +8 -0
  38. data/lib/ducktrap/node/forward.rb +55 -0
  39. data/lib/ducktrap/node/guard_nil.rb +42 -0
  40. data/lib/ducktrap/node/hash.rb +7 -0
  41. data/lib/ducktrap/node/hash/transform.rb +53 -0
  42. data/lib/ducktrap/node/invalid.rb +29 -0
  43. data/lib/ducktrap/node/inverse.rb +46 -0
  44. data/lib/ducktrap/node/key.rb +61 -0
  45. data/lib/ducktrap/node/key/add.rb +42 -0
  46. data/lib/ducktrap/node/key/delete.rb +44 -0
  47. data/lib/ducktrap/node/key/dump.rb +38 -0
  48. data/lib/ducktrap/node/key/fetch.rb +49 -0
  49. data/lib/ducktrap/node/map.rb +42 -0
  50. data/lib/ducktrap/node/noop.rb +30 -0
  51. data/lib/ducktrap/node/primitive.rb +61 -0
  52. data/lib/ducktrap/node/static.rb +33 -0
  53. data/lib/ducktrap/nullary.rb +41 -0
  54. data/lib/ducktrap/pretty_dump.rb +31 -0
  55. data/lib/ducktrap/registry.rb +60 -0
  56. data/lib/ducktrap/singleton.rb +55 -0
  57. data/lib/ducktrap/unary.rb +153 -0
  58. data/spec/rcov.opts +7 -0
  59. data/spec/shared/inverse_behavior.rb +7 -0
  60. data/spec/spec_helper.rb +20 -0
  61. data/spec/support/ice_nine_config.rb +8 -0
  62. data/spec/support/let_mock_helper.rb +13 -0
  63. data/spec/unit/ducktrap/builder/class_methods/new_spec.rb +41 -0
  64. data/spec/unit/ducktrap/builder/new_spec.rb +41 -0
  65. data/spec/unit/ducktrap/class_methods/build_spec.rb +11 -0
  66. data/spec/unit/ducktrap/error/exception/pretty_inspect_spec.rb +22 -0
  67. data/spec/unit/ducktrap/error/pretty_inspect_spec.rb +19 -0
  68. data/spec/unit/ducktrap/evaluator/assert_successful_spec.rb +38 -0
  69. data/spec/unit/ducktrap/evaluator/invalid/output_spec.rb +14 -0
  70. data/spec/unit/ducktrap/evaluator/noop/output_spec.rb +14 -0
  71. data/spec/unit/ducktrap/evaluator/output_spec.rb +52 -0
  72. data/spec/unit/ducktrap/evaluator/pretty_inspect_spec.rb +63 -0
  73. data/spec/unit/ducktrap/evaluator/successful_predicate_spec.rb +36 -0
  74. data/spec/unit/ducktrap/failed_transformation_error/message_spec.rb +10 -0
  75. data/spec/unit/ducktrap/formatter/attribute_spec.rb +24 -0
  76. data/spec/unit/ducktrap/formatter/body_spec.rb +19 -0
  77. data/spec/unit/ducktrap/formatter/class_methods/new_spec.rb +14 -0
  78. data/spec/unit/ducktrap/formatter/initialize_spec.rb +14 -0
  79. data/spec/unit/ducktrap/formatter/name_spec.rb +25 -0
  80. data/spec/unit/ducktrap/formatter/nest_spec.rb +48 -0
  81. data/spec/unit/ducktrap/formatter/puts_spec.rb +36 -0
  82. data/spec/unit/ducktrap/mapper/builder/dumper_spec.rb +20 -0
  83. data/spec/unit/ducktrap/mapper/builder/loader_spec.rb +20 -0
  84. data/spec/unit/ducktrap/mapper/builder/object_spec.rb +90 -0
  85. data/spec/unit/ducktrap/mapper/class_methods/build_spec.rb +20 -0
  86. data/spec/unit/ducktrap/nary/builder/add_spec.rb +16 -0
  87. data/spec/unit/ducktrap/nary/builder/method_missing_spec.rb +44 -0
  88. data/spec/unit/ducktrap/nary/builder/output_spec.rb +16 -0
  89. data/spec/unit/ducktrap/nary/class_methods/build_spec.rb +22 -0
  90. data/spec/unit/ducktrap/nary/class_methods/included_spec.rb +13 -0
  91. data/spec/unit/ducktrap/nary/evaluator/output_spec.rb +79 -0
  92. data/spec/unit/ducktrap/nary/instance_methods/inverse_spec.rb +24 -0
  93. data/spec/unit/ducktrap/nary/instance_methods/pretty_inspect_spec.rb +31 -0
  94. data/spec/unit/ducktrap/node/anima/dump/evaluator/output_spec.rb +18 -0
  95. data/spec/unit/ducktrap/node/anima/dump/inverse_spec.rb +10 -0
  96. data/spec/unit/ducktrap/node/anima/dump/pretty_inspect_spec.rb +15 -0
  97. data/spec/unit/ducktrap/node/anima/evaluator/output_spec.rb +18 -0
  98. data/spec/unit/ducktrap/node/anima/load/evaluator/output_spec.rb +35 -0
  99. data/spec/unit/ducktrap/node/anima/load/inverse_spec.rb +10 -0
  100. data/spec/unit/ducktrap/node/anima/load/pretty_inspect_spec.rb +15 -0
  101. data/spec/unit/ducktrap/node/anima/pretty_inspect_spec.rb +15 -0
  102. data/spec/unit/ducktrap/node/block/evaluator/output_spec.rb +79 -0
  103. data/spec/unit/ducktrap/node/block/inverse_spec.rb +24 -0
  104. data/spec/unit/ducktrap/node/call_spec.rb +21 -0
  105. data/spec/unit/ducktrap/node/class_methods/build_spec.rb +11 -0
  106. data/spec/unit/ducktrap/node/class_methods/register_spec.rb +16 -0
  107. data/spec/unit/ducktrap/node/custom/builder/forward_spec.rb +54 -0
  108. data/spec/unit/ducktrap/node/custom/builder/inverse_spec.rb +54 -0
  109. data/spec/unit/ducktrap/node/custom/builder/object_spec.rb +54 -0
  110. data/spec/unit/ducktrap/node/custom/call_spec.rb +21 -0
  111. data/spec/unit/ducktrap/node/custom/class_methods/build_spec.rb +20 -0
  112. data/spec/unit/ducktrap/node/custom/inverse_spec.rb +12 -0
  113. data/spec/unit/ducktrap/node/custom/pretty_inspect_spec.rb +15 -0
  114. data/spec/unit/ducktrap/node/forward/evaluator/output_spec.rb +13 -0
  115. data/spec/unit/ducktrap/node/forward/inverse_spec.rb +14 -0
  116. data/spec/unit/ducktrap/node/forward/pretty_inspect_spec.rb +19 -0
  117. data/spec/unit/ducktrap/node/guard_nil/call_spec.rb +21 -0
  118. data/spec/unit/ducktrap/node/guard_nil/evaluator/output_spec.rb +27 -0
  119. data/spec/unit/ducktrap/node/guard_nil/inverse_spec.rb +12 -0
  120. data/spec/unit/ducktrap/node/hash/transform/evaluator/output_spec.rb +51 -0
  121. data/spec/unit/ducktrap/node/hash/transform/inverse_spec.rb +27 -0
  122. data/spec/unit/ducktrap/node/invalid/call_spec.rb +13 -0
  123. data/spec/unit/ducktrap/node/invalid/inverse_spec.rb +11 -0
  124. data/spec/unit/ducktrap/node/inverse/call_spec.rb +11 -0
  125. data/spec/unit/ducktrap/node/inverse/inverse_spec.rb +14 -0
  126. data/spec/unit/ducktrap/node/inverse/pretty_inspect_spec.rb +19 -0
  127. data/spec/unit/ducktrap/node/key/add/call_spec.rb +15 -0
  128. data/spec/unit/ducktrap/node/key/add/evaluator/call_spec.rb +15 -0
  129. data/spec/unit/ducktrap/node/key/add/inverse_spec.rb +14 -0
  130. data/spec/unit/ducktrap/node/key/delete/call_spec.rb +13 -0
  131. data/spec/unit/ducktrap/node/key/delete/evaluator/call_spec.rb +13 -0
  132. data/spec/unit/ducktrap/node/key/delete/inverse_spec.rb +13 -0
  133. data/spec/unit/ducktrap/node/key/dump/evaluator/output_spec.rb +37 -0
  134. data/spec/unit/ducktrap/node/key/dump/inverse_spec.rb +14 -0
  135. data/spec/unit/ducktrap/node/key/evaluator/key_spec.rb +26 -0
  136. data/spec/unit/ducktrap/node/key/fetch/evaluator/output_spec.rb +48 -0
  137. data/spec/unit/ducktrap/node/key/fetch/inverse_spec.rb +14 -0
  138. data/spec/unit/ducktrap/node/key/pretty_inspect_spec.rb +20 -0
  139. data/spec/unit/ducktrap/node/map/evaluator/output_spec.rb +22 -0
  140. data/spec/unit/ducktrap/node/map/inverse_spec.rb +15 -0
  141. data/spec/unit/ducktrap/node/noop/call_spec.rb +11 -0
  142. data/spec/unit/ducktrap/node/noop/inverse_spec.rb +9 -0
  143. data/spec/unit/ducktrap/node/pretty_inspect_spec.rb +17 -0
  144. data/spec/unit/ducktrap/node/primitive/call_spec.rb +19 -0
  145. data/spec/unit/ducktrap/node/primitive/inverse_spec.rb +13 -0
  146. data/spec/unit/ducktrap/node/primitive/pretty_inspect_spec.rb +15 -0
  147. data/spec/unit/ducktrap/node/run_spec.rb +46 -0
  148. data/spec/unit/ducktrap/node/static/call_spec.rb +13 -0
  149. data/spec/unit/ducktrap/node/static/inverse_spec.rb +14 -0
  150. data/spec/unit/ducktrap/nullary/class_methods/build_spec.rb +37 -0
  151. data/spec/unit/ducktrap/nullary/class_methods/included_spec.rb +7 -0
  152. data/spec/unit/ducktrap/pretty_dump/pretty_dump_spec.rb +47 -0
  153. data/spec/unit/ducktrap/pretty_dump/pretty_inspect_spec.rb +22 -0
  154. data/spec/unit/ducktrap/registry/lookup_spec.rb +27 -0
  155. data/spec/unit/ducktrap/registry/register_spec.rb +21 -0
  156. data/spec/unit/ducktrap/singleton/class_methods/included_spec.rb +13 -0
  157. data/spec/unit/ducktrap/singleton/class_methods/instance_spec.rb +19 -0
  158. data/spec/unit/ducktrap/singleton/instance_methods/inspect_spec.rb +19 -0
  159. data/spec/unit/ducktrap/singleton/instance_methods/pretty_inspect_spec.rb +17 -0
  160. data/spec/unit/ducktrap/unary/class_methods/build_spec.rb +18 -0
  161. data/spec/unit/ducktrap/unary/class_methods/included_spec.rb +14 -0
  162. data/spec/unit/ducktrap/unary/evaluator/output2_spec.rb +48 -0
  163. data/spec/unit/ducktrap/unary/evaluator/output_spec.rb +37 -0
  164. data/spec/unit/ducktrap/unary/instance_methods/pretty_inspect_spec.rb +15 -0
  165. metadata +399 -0
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ducktrap::Node::Block, '#inverse' do
4
+ let(:object) { described_class.new(body) }
5
+
6
+ subject { object.inverse }
7
+
8
+ let(:body) do
9
+ [
10
+ Ducktrap::Node::Static.new(:forward, :inverse),
11
+ Ducktrap::Node::Noop.instance
12
+ ]
13
+ end
14
+
15
+ it 'should return inverse' do
16
+ inverse_body = [
17
+ Ducktrap::Node::Noop.instance,
18
+ Ducktrap::Node::Static.new(:inverse, :forward)
19
+ ]
20
+ should eql(described_class.new(inverse_body))
21
+ end
22
+
23
+ it_should_behave_like 'an #inverse method'
24
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ducktrap::Nary::InstanceMethods, '#pretty_inspect' do
4
+ let(:object) { class_under_test.new(body) }
5
+
6
+ let(:class_under_test) do
7
+ Class.new(Ducktrap::Node) do
8
+ include Ducktrap::Nary
9
+
10
+ def self.name
11
+ 'Test'
12
+ end
13
+ end
14
+ end
15
+
16
+ let(:body) { [node_a, node_b] }
17
+
18
+ let(:node_a) { Ducktrap::Node::Static.new(:a, :b) }
19
+ let(:node_b) { Ducktrap::Node::Noop.instance }
20
+
21
+ subject { object.pretty_inspect }
22
+
23
+ it 'should return inspected error' do
24
+ should eql(strip(<<-STR))
25
+ Test
26
+ body:
27
+ Ducktrap::Node::Static
28
+ Ducktrap::Node::Noop
29
+ STR
30
+ end
31
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ducktrap::Node::Anima::Dump::Evaluator, '#output' do
4
+ let(:object) { described_class.new(context, input) }
5
+ let(:model) do
6
+ Class.new do
7
+ include Anima.new(:foo)
8
+ end
9
+ end
10
+ let(:context) { mock('Context', :model => model) }
11
+ let(:input) { model.new(:foo => :bar) }
12
+
13
+ subject { object.output }
14
+
15
+ it { should eql(:foo => :bar) }
16
+
17
+ it_should_behave_like 'an idempotent method'
18
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ducktrap::Node::Anima::Dump, '#inverse' do
4
+ let(:object) { described_class.new(model) }
5
+ let(:model) { mock('Model') }
6
+
7
+ subject { object.inverse }
8
+
9
+ it { should eql(Ducktrap::Node::Anima::Load.new(model)) }
10
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ducktrap::Node::Anima::Dump, '#pretty_inspect' do
4
+ let(:object) { described_class.new(model) }
5
+ let(:model) { :model }
6
+
7
+ subject { object.pretty_inspect }
8
+
9
+ it 'should return inspected error' do
10
+ should eql(strip(<<-STR))
11
+ Ducktrap::Node::Anima::Dump
12
+ model: :model
13
+ STR
14
+ end
15
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ducktrap::Node::Anima::Dump::Evaluator, '#output' do
4
+ let(:object) { described_class.new(context, input) }
5
+ let(:model) do
6
+ Class.new do
7
+ include Anima.new(:foo)
8
+ end
9
+ end
10
+ let(:context) { mock('Context', :model => model) }
11
+ let(:input) { model.new(:foo => :bar) }
12
+
13
+ subject { object.output }
14
+
15
+ it { should eql(:foo => :bar) }
16
+
17
+ it_should_behave_like 'an idempotent method'
18
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ducktrap::Node::Anima::Load::Evaluator, '#output' do
4
+
5
+ let(:object) { described_class.new(context, input) }
6
+
7
+ let(:model) do
8
+ Class.new do
9
+ include Anima.new(:foo)
10
+ end
11
+ end
12
+
13
+ let(:context) { mock('Context', :model => model) }
14
+
15
+ subject { object.output }
16
+
17
+ context 'with compatible input' do
18
+ let(:input) { { :foo => :bar} }
19
+
20
+ it { should eql(model.new(:foo => :bar)) }
21
+
22
+ it_should_behave_like 'an idempotent method'
23
+ end
24
+
25
+ context 'with incompatible input' do
26
+ let(:input) { {} }
27
+
28
+ specify do
29
+ error = subject
30
+ should eql(Ducktrap::Error::Exception.new(context, input, error.exception))
31
+ end
32
+
33
+ it_should_behave_like 'an idempotent method'
34
+ end
35
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ducktrap::Node::Anima::Load, '#inverse' do
4
+ let(:object) { described_class.new(model) }
5
+ let(:model) { mock('Model') }
6
+
7
+ subject { object.inverse }
8
+
9
+ it { should eql(Ducktrap::Node::Anima::Dump.new(model)) }
10
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ducktrap::Node::Anima::Load, '#pretty_inspect' do
4
+ let(:object) { described_class.new(model) }
5
+ let(:model) { :model }
6
+
7
+ subject { object.pretty_inspect }
8
+
9
+ it 'should return inspected error' do
10
+ should eql(strip(<<-STR))
11
+ Ducktrap::Node::Anima::Load
12
+ model: :model
13
+ STR
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ducktrap::Node::Anima::Dump, '#pretty_inspect' do
4
+ let(:object) { described_class.new(model) }
5
+ let(:model) { :model }
6
+
7
+ subject { object.pretty_inspect }
8
+
9
+ it 'should return inspected error' do
10
+ should eql(strip(<<-STR))
11
+ Ducktrap::Node::Anima::Dump
12
+ model: :model
13
+ STR
14
+ end
15
+ end
@@ -0,0 +1,79 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ducktrap::Node::Block::Evaluator, '#output' do
4
+ subject { object.output }
5
+
6
+ let(:object) { described_class.new(context, input) }
7
+ let(:context) { mymock('Context', :body => body) }
8
+ let(:input) { :input }
9
+
10
+ def mymock(name, attributes={})
11
+ mock(name, attributes.merge(:frozen? => true))
12
+ end
13
+
14
+ context 'without elements in block' do
15
+ let(:body) { [] }
16
+
17
+ it { should be(input) }
18
+
19
+ it_should_behave_like 'an idempotent method'
20
+ end
21
+
22
+ context 'with elements in block' do
23
+ let(:body) { [trap_a, trap_b] }
24
+
25
+ context 'without failures' do
26
+ let(:trap_a) { Ducktrap::Node::Noop.instance }
27
+ let(:trap_b) { Ducktrap::Node::Noop.instance }
28
+
29
+ it { should be(input) }
30
+
31
+ it_should_behave_like 'an idempotent method'
32
+ end
33
+
34
+ context 'with late failure' do
35
+ let(:trap_a) { Ducktrap::Node::Static.new(:forward, :inverse) }
36
+ let(:trap_b) { Ducktrap::Node::Invalid.instance }
37
+
38
+ its(:pretty_inspect) do
39
+ should eql(strip(<<-STR))
40
+ Ducktrap::Error
41
+ input: :input
42
+ context:
43
+ Ducktrap::Evaluator::Invalid
44
+ input: :forward
45
+ error:
46
+ Ducktrap::Error
47
+ input: :forward
48
+ context:
49
+ Ducktrap::Node::Invalid
50
+ context:
51
+ Ducktrap::Node::Invalid
52
+ STR
53
+ end
54
+ end
55
+
56
+ context 'with early failure' do
57
+ let(:trap_a) { Ducktrap::Node::Invalid.instance }
58
+ let(:trap_b) { mock('Late Node') }
59
+
60
+ its(:pretty_inspect) do
61
+ should eql(strip(<<-STR))
62
+ Ducktrap::Error
63
+ input: :input
64
+ context:
65
+ Ducktrap::Evaluator::Invalid
66
+ input: :input
67
+ error:
68
+ Ducktrap::Error
69
+ input: :input
70
+ context:
71
+ Ducktrap::Node::Invalid
72
+ context:
73
+ Ducktrap::Node::Invalid
74
+ STR
75
+ end
76
+ end
77
+
78
+ end
79
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ducktrap::Node::Block, '#inverse' do
4
+ let(:object) { described_class.new(body) }
5
+
6
+ subject { object.inverse }
7
+
8
+ let(:body) do
9
+ [
10
+ Ducktrap::Node::Static.new(:forward, :inverse),
11
+ Ducktrap::Node::Noop.instance
12
+ ]
13
+ end
14
+
15
+ it 'should return inverse' do
16
+ inverse_body = [
17
+ Ducktrap::Node::Noop.instance,
18
+ Ducktrap::Node::Static.new(:inverse, :forward)
19
+ ]
20
+ should eql(described_class.new(inverse_body))
21
+ end
22
+
23
+ it_should_behave_like 'an #inverse method'
24
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ducktrap::Node, '#call' do
4
+ subject { object.call(input) }
5
+
6
+ let(:object) { class_under_test.new }
7
+ let(:class_under_test) do
8
+ Class.new(described_class) do
9
+ evaluator = Class.new(Ducktrap::Evaluator) do
10
+ def output
11
+ :foo
12
+ end
13
+ end
14
+ const_set(:Evaluator, evaluator)
15
+ end
16
+ end
17
+
18
+ let(:input) { mock('Input') }
19
+
20
+ it { should eql(class_under_test::Evaluator.new(object, input)) }
21
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ducktrap::Node, '.build' do
4
+ let(:object) { described_class }
5
+
6
+ subject { object.build(&block) }
7
+
8
+ let(:block) { proc { noop } }
9
+
10
+ it { should eql(Ducktrap::Node::Block.new([Ducktrap::Node::Noop.instance])) }
11
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ducktrap::Node, '.register' do
4
+ subject do
5
+ Class.new(described_class) do
6
+ include Ducktrap::Nullary
7
+ register :foo
8
+ end
9
+ end
10
+
11
+ it 'should register class' do
12
+ subject
13
+ node = Ducktrap.build { foo }.body.first
14
+ node.class.should be(subject)
15
+ end
16
+ end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ducktrap::Node::Custom::Builder, '#output' do
4
+ let(:object) { described_class.new(klass, &block) }
5
+
6
+ let(:klass) { Ducktrap::Node::Custom }
7
+
8
+ subject { object.object }
9
+
10
+ context 'without directions' do
11
+ let(:block) { proc {} }
12
+
13
+ it 'should raise error' do
14
+ expect { subject }.to raise_error(RuntimeError, 'No forward block specified!')
15
+ end
16
+
17
+ end
18
+
19
+ context 'with forward direction' do
20
+ let(:block) { proc { forward { |input| input } } }
21
+
22
+ it 'should raise error' do
23
+ expect { subject }.to raise_error(RuntimeError, 'No inverse block specified!')
24
+ end
25
+ end
26
+
27
+ context 'with forward and inverse direction' do
28
+ let(:block) { forward, inverse = self.forward, self.inverse; proc { forward(&forward); inverse(&inverse) } }
29
+
30
+ let(:forward) { proc {} }
31
+ let(:inverse) { proc {} }
32
+
33
+ it { should eql(klass.new(forward, inverse)) }
34
+ end
35
+
36
+ # kill some mutations
37
+ context 'with forward and inverse direction chained' do
38
+ let(:block) { forward, inverse = self.forward, self.inverse; proc { forward(&forward).inverse(&inverse) } }
39
+
40
+ let(:forward) { proc {} }
41
+ let(:inverse) { proc {} }
42
+
43
+ it { should eql(klass.new(forward, inverse)) }
44
+ end
45
+
46
+ context 'with forward and inverse direction chained #2' do
47
+ let(:block) { forward, inverse = self.forward, self.inverse; proc { inverse(&inverse).forward(&forward) } }
48
+
49
+ let(:forward) { proc {} }
50
+ let(:inverse) { proc {} }
51
+
52
+ it { should eql(klass.new(forward, inverse)) }
53
+ end
54
+ end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ducktrap::Node::Custom::Builder, '#output' do
4
+ let(:object) { described_class.new(klass, &block) }
5
+
6
+ let(:klass) { Ducktrap::Node::Custom }
7
+
8
+ subject { object.object }
9
+
10
+ context 'without directions' do
11
+ let(:block) { proc {} }
12
+
13
+ it 'should raise error' do
14
+ expect { subject }.to raise_error(RuntimeError, 'No forward block specified!')
15
+ end
16
+
17
+ end
18
+
19
+ context 'with forward direction' do
20
+ let(:block) { proc { forward { |input| input } } }
21
+
22
+ it 'should raise error' do
23
+ expect { subject }.to raise_error(RuntimeError, 'No inverse block specified!')
24
+ end
25
+ end
26
+
27
+ context 'with forward and inverse direction' do
28
+ let(:block) { forward, inverse = self.forward, self.inverse; proc { forward(&forward); inverse(&inverse) } }
29
+
30
+ let(:forward) { proc {} }
31
+ let(:inverse) { proc {} }
32
+
33
+ it { should eql(klass.new(forward, inverse)) }
34
+ end
35
+
36
+ # kill some mutations
37
+ context 'with forward and inverse direction chained' do
38
+ let(:block) { forward, inverse = self.forward, self.inverse; proc { forward(&forward).inverse(&inverse) } }
39
+
40
+ let(:forward) { proc {} }
41
+ let(:inverse) { proc {} }
42
+
43
+ it { should eql(klass.new(forward, inverse)) }
44
+ end
45
+
46
+ context 'with forward and inverse direction chained #2' do
47
+ let(:block) { forward, inverse = self.forward, self.inverse; proc { inverse(&inverse).forward(&forward) } }
48
+
49
+ let(:forward) { proc {} }
50
+ let(:inverse) { proc {} }
51
+
52
+ it { should eql(klass.new(forward, inverse)) }
53
+ end
54
+ end