tataru 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +5 -0
  3. data/bin/console +15 -0
  4. data/bin/setup +8 -0
  5. data/lib/tataru.rb +70 -12
  6. data/lib/tataru/base_resource.rb +49 -0
  7. data/lib/tataru/base_resource_desc.rb +35 -0
  8. data/lib/tataru/compiler.rb +100 -0
  9. data/lib/tataru/create_subroutines.rb +31 -0
  10. data/lib/tataru/delete_subroutines.rb +42 -0
  11. data/lib/tataru/flattener.rb +81 -0
  12. data/lib/tataru/init_hash_compiler.rb +41 -0
  13. data/lib/tataru/instruction.rb +52 -7
  14. data/lib/tataru/instruction_hash.rb +54 -0
  15. data/lib/tataru/instructions/call_instruction.rb +19 -0
  16. data/lib/tataru/instructions/check_create_instruction.rb +27 -0
  17. data/lib/tataru/instructions/check_delete_instruction.rb +20 -0
  18. data/lib/tataru/instructions/check_instruction.rb +26 -0
  19. data/lib/tataru/instructions/check_update_instruction.rb +27 -0
  20. data/lib/tataru/instructions/clear_instruction.rb +12 -0
  21. data/lib/tataru/instructions/compare_instruction.rb +16 -0
  22. data/lib/tataru/instructions/create_instruction.rb +20 -0
  23. data/lib/tataru/instructions/delete_instruction.rb +14 -0
  24. data/lib/tataru/instructions/end_instruction.rb +12 -0
  25. data/lib/tataru/instructions/goto_if_instruction.rb +26 -0
  26. data/lib/tataru/instructions/immediate_mode_instruction.rb +12 -0
  27. data/lib/tataru/instructions/init_instruction.rb +27 -0
  28. data/lib/tataru/instructions/key_instruction.rb +12 -0
  29. data/lib/tataru/instructions/mark_deletable_instruction.rb +13 -0
  30. data/lib/tataru/instructions/read_instruction.rb +28 -0
  31. data/lib/tataru/instructions/rescmp_instruction.rb +34 -0
  32. data/lib/tataru/instructions/resource_instruction.rb +15 -0
  33. data/lib/tataru/instructions/return_instruction.rb +16 -0
  34. data/lib/tataru/instructions/update_instruction.rb +16 -0
  35. data/lib/tataru/instructions/value_instruction.rb +15 -0
  36. data/lib/tataru/instructions/value_rom_instruction.rb +23 -0
  37. data/lib/tataru/instructions/value_update_instruction.rb +18 -0
  38. data/lib/tataru/memory.rb +16 -0
  39. data/lib/tataru/quest.rb +43 -0
  40. data/lib/tataru/representation.rb +22 -0
  41. data/lib/tataru/representations/array_representation.rb +18 -0
  42. data/lib/tataru/representations/hash_representation.rb +20 -0
  43. data/lib/tataru/representations/literal_representation.rb +9 -0
  44. data/lib/tataru/representations/output_representation.rb +19 -0
  45. data/lib/tataru/representations/resource_representation.rb +49 -0
  46. data/lib/tataru/resolver.rb +39 -0
  47. data/lib/tataru/resource_dsl.rb +21 -71
  48. data/lib/tataru/resource_type_pool.rb +22 -0
  49. data/lib/tataru/rom_reader.rb +47 -0
  50. data/lib/tataru/runner.rb +48 -0
  51. data/lib/tataru/sub_planner.rb +41 -0
  52. data/lib/tataru/subroutine_compiler.rb +52 -0
  53. data/lib/tataru/top_dsl.rb +35 -0
  54. data/lib/tataru/update_subroutines.rb +111 -0
  55. data/lib/tataru/version.rb +1 -1
  56. data/spec/compiler_spec.rb +181 -0
  57. data/spec/flattener_spec.rb +88 -0
  58. data/spec/init_hash_compiler_spec.rb +85 -0
  59. data/spec/instruction_hash_spec.rb +63 -0
  60. data/spec/instruction_spec.rb +36 -0
  61. data/spec/instructions/call_instruction_spec.rb +28 -0
  62. data/spec/instructions/check_create_instruction_spec.rb +67 -0
  63. data/spec/instructions/check_delete_instruction_spec.rb +47 -0
  64. data/spec/instructions/check_update_instruction_spec.rb +67 -0
  65. data/spec/instructions/clear_instruction_spec.rb +16 -0
  66. data/spec/instructions/compare_instruction_spec.rb +29 -0
  67. data/spec/instructions/create_instruction_spec.rb +62 -0
  68. data/spec/instructions/delete_instruction_spec.rb +20 -0
  69. data/spec/instructions/end_instruction_spec.rb +15 -0
  70. data/spec/instructions/goto_if_instruction_spec.rb +42 -0
  71. data/spec/instructions/init_instruction_spec.rb +16 -0
  72. data/spec/instructions/key_instruction_spec.rb +15 -0
  73. data/spec/instructions/mark_deletable_instruction_spec.rb +20 -0
  74. data/spec/instructions/read_instruction_spec.rb +34 -0
  75. data/spec/instructions/rescmp_instruction_spec.rb +113 -0
  76. data/spec/instructions/return_instruction_spec.rb +28 -0
  77. data/spec/instructions/update_instruction_spec.rb +39 -0
  78. data/spec/instructions/value_instruction_spec.rb +27 -0
  79. data/spec/instructions/value_rom_instruction_spec.rb +170 -0
  80. data/spec/instructions/value_update_instruction_spec.rb +35 -0
  81. data/spec/quest_spec.rb +9 -0
  82. data/spec/representations/array_representation_spec.rb +29 -0
  83. data/spec/representations/hash_representation_spec.rb +29 -0
  84. data/spec/representations/literal_representation_spec.rb +10 -0
  85. data/spec/representations/output_representation_spec.rb +11 -0
  86. data/spec/representations/resource_representation_spec.rb +50 -0
  87. data/spec/resource_dsl_spec.rb +71 -0
  88. data/spec/runner_spec.rb +99 -0
  89. data/spec/spec_helper.rb +401 -0
  90. data/spec/subroutine_compiler_spec.rb +39 -0
  91. data/spec/taru_spec.rb +616 -0
  92. data/spec/top_dsl_spec.rb +68 -0
  93. data/tataru.gemspec +45 -0
  94. metadata +145 -27
  95. data/Rakefile +0 -8
  96. data/lib/tataru/default_resource_finder.rb +0 -10
  97. data/lib/tataru/execution_step.rb +0 -79
  98. data/lib/tataru/planner.rb +0 -93
  99. data/lib/tataru/requirements.rb +0 -67
  100. data/lib/tataru/requirements_dsl.rb +0 -33
  101. data/lib/tataru/resource.rb +0 -52
  102. data/lib/tataru/state.rb +0 -64
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tataru
4
+ # class resource type pool
5
+ class ResourceTypePool
6
+ def initialize
7
+ @pool = {}
8
+ end
9
+
10
+ def add_resource_desc(symbol, classconstant)
11
+ @pool[symbol] = classconstant
12
+ end
13
+
14
+ def resource_desc_for(symbol)
15
+ @pool[symbol]
16
+ end
17
+
18
+ def resource_desc_exist?(symbol)
19
+ @pool.key? symbol
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tataru
4
+ # Reads Rom values
5
+ module RomReader
6
+ def rom
7
+ memory.hash[:rom]
8
+ end
9
+
10
+ def resolve(object)
11
+ case object[:type]
12
+ when :literal
13
+ object[:value]
14
+ when :hash
15
+ resolve_hash(object)
16
+ when :array
17
+ resolve_array(object)
18
+ when :output
19
+ resolve_output(object)
20
+ end
21
+ end
22
+
23
+ def resolve_array(object)
24
+ result = []
25
+ object[:references].each do |k, v|
26
+ result[k] = resolve(rom[v])
27
+ end
28
+ result
29
+ end
30
+
31
+ def resolve_hash(object)
32
+ result = {}
33
+ object[:references].each do |k, v|
34
+ result[k] = resolve(rom[v])
35
+ end
36
+ result
37
+ end
38
+
39
+ def resolve_output(object)
40
+ if object[:output] == :remote_id
41
+ memory.hash[:remote_ids][object[:resource]]
42
+ else
43
+ memory.hash[:outputs][object[:resource]][object[:output]]
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tataru
4
+ # thing that runs a quest
5
+ class Runner
6
+ attr_reader :memory, :oplog
7
+
8
+ def initialize(instruction_list)
9
+ @memory = Memory.new
10
+ @instruction_list = instruction_list
11
+ @oplog = []
12
+ end
13
+
14
+ def ended?
15
+ @memory.program_counter >= @instruction_list.length ||
16
+ !@memory.error.nil? ||
17
+ @memory.end
18
+ end
19
+
20
+ def log_operation(instr)
21
+ return unless instr.is_a? Instructions::ResourceInstruction
22
+
23
+ oplog << {
24
+ operation: instr.class.name.underscore
25
+ .sub(%r{^tataru/instructions/}, '')
26
+ .sub(/_instruction$/, '').upcase.to_s,
27
+ resource: (memory.hash[:temp][:resource_name]).to_s
28
+ }
29
+ end
30
+
31
+ def run_next
32
+ return if ended?
33
+
34
+ instr = @instruction_list[@memory.program_counter]
35
+
36
+ log_operation(instr)
37
+
38
+ instr.execute(@memory)
39
+ @memory.program_counter += 1
40
+ rescue RuntimeError => e
41
+ @memory.error = e
42
+ rescue StandardError => e
43
+ @memory.error = e
44
+ end
45
+
46
+ def current_state; end
47
+ end
48
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tataru
4
+ # returns subroutines required based on the resource
5
+ class SubPlanner
6
+ def initialize(rrep, action)
7
+ @rrep = rrep
8
+ @action = action
9
+ end
10
+
11
+ def name
12
+ @rrep.name
13
+ end
14
+
15
+ def compile(*args)
16
+ SubroutineCompiler.new(@rrep, *args)
17
+ end
18
+
19
+ def extra_subroutines
20
+ return {} unless @action == :update
21
+
22
+ {
23
+ "#{name}_modify" => compile(:modify),
24
+ "#{name}_modify_check" => compile(:modify_check),
25
+ "#{name}_recreate" => compile(:recreate),
26
+ "#{name}_recreate_check" => compile(:recreate_check),
27
+ "#{name}_recreate_commit" => compile(:recreate_commit),
28
+ "#{name}_recreate_finish" => compile(:recreate_finish)
29
+ }
30
+ end
31
+
32
+ def subroutines
33
+ {
34
+ "#{name}_start" => compile(:"#{@action}"),
35
+ "#{name}_check" => compile(:"check_#{@action}"),
36
+ "#{name}_commit" => compile(:"commit_#{@action}"),
37
+ "#{name}_finish" => compile(:"finish_#{@action}")
38
+ }.merge(extra_subroutines)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tataru
4
+ # a subroutine for handling a resource
5
+ class SubroutineCompiler
6
+ include CreateSubroutines
7
+ include UpdateSubroutines
8
+ include DeleteSubroutines
9
+
10
+ def initialize(resource_representation, action)
11
+ @rrep = resource_representation
12
+ @action = action
13
+ end
14
+
15
+ def desc
16
+ @rrep.desc
17
+ end
18
+
19
+ def label
20
+ "#{@action}_#{@rrep.name}"
21
+ end
22
+
23
+ def base_action
24
+ @action.to_s.split('_')[1].to_s
25
+ end
26
+
27
+ def body_instructions
28
+ [
29
+ :clear,
30
+ *inner_instructions,
31
+ :return
32
+ ]
33
+ end
34
+
35
+ def load_resource_instructions
36
+ [
37
+ { key: :resource_name },
38
+ { value: @rrep.name },
39
+ { key: :resource_desc },
40
+ { value: @rrep.desc.class.name }
41
+ ]
42
+ end
43
+
44
+ def inner_instructions
45
+ send :"#{@action}_instructions"
46
+ end
47
+
48
+ def call_instruction
49
+ { call: label }
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tataru
4
+ # human representation of resources
5
+ class TopDsl
6
+ attr_reader :resources
7
+
8
+ def initialize(pool)
9
+ @resources = {}
10
+ @pool = pool
11
+ end
12
+
13
+ def resource(symbol, name, &block)
14
+ unless @pool.resource_desc_exist?(symbol)
15
+ raise "no such resource: #{symbol}"
16
+ end
17
+ raise "already defined: #{name}" if @resources.key? name
18
+
19
+ resource = ResourceDsl.new(name, @pool.resource_desc_for(symbol).new)
20
+ resource.instance_eval(&block) if block
21
+
22
+ @resources[name] = resource.representation
23
+ end
24
+
25
+ def dep_graph
26
+ @resources.map do |name, resource_representation|
27
+ deps = Set.new
28
+ resource_representation.properties.each do |_key, value|
29
+ deps += value.dependencies
30
+ end
31
+ [name, deps.to_a]
32
+ end.to_h
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tataru
4
+ # update subroutines
5
+ module UpdateSubroutines
6
+ def update_instructions
7
+ [
8
+ *load_resource_instructions,
9
+ :read,
10
+ *load_resource_instructions,
11
+ :rescmp,
12
+ { value_update: @rrep.name },
13
+ { compare: :recreate },
14
+ { goto_if: "recreate_#{@rrep.name}" },
15
+ { value_update: @rrep.name },
16
+ { compare: :modify },
17
+ { goto_if: "modify_#{@rrep.name}" }
18
+ ]
19
+ end
20
+
21
+ def check_update_instructions
22
+ [
23
+ { value_update: @rrep.name },
24
+ { compare: :recreate },
25
+ { goto_if: "recreate_check_#{@rrep.name}" },
26
+ { value_update: @rrep.name },
27
+ { compare: :modify },
28
+ { goto_if: "modify_check_#{@rrep.name}" }
29
+ ]
30
+ end
31
+
32
+ def commit_update_instructions
33
+ [
34
+ { value_update: @rrep.name },
35
+ { compare: :recreate },
36
+ { goto_if: "recreate_commit_#{@rrep.name}" }
37
+ ]
38
+ end
39
+
40
+ def finish_update_instructions
41
+ [
42
+ { value_update: @rrep.name },
43
+ { compare: :recreate },
44
+ { goto_if: "recreate_finish_#{@rrep.name}" }
45
+ ]
46
+ end
47
+
48
+ def modify_instructions
49
+ [
50
+ *load_resource_instructions,
51
+ { key: :properties },
52
+ { value_rom: @rrep.name },
53
+ :update
54
+ ]
55
+ end
56
+
57
+ def modify_check_instructions
58
+ [
59
+ *load_resource_instructions,
60
+ :check_update
61
+ ]
62
+ end
63
+
64
+ def recreate_instructions
65
+ deletion_routine = [
66
+ *load_resource_instructions,
67
+ :mark_deletable
68
+ ]
69
+ unless desc.delete_at_end?
70
+ deletion_routine = [
71
+ *delete_instructions,
72
+ *check_delete_instructions
73
+ ]
74
+ end
75
+ [
76
+ *deletion_routine,
77
+ *create_instructions
78
+ ]
79
+ end
80
+
81
+ def recreate_check_instructions
82
+ [
83
+ *check_create_instructions
84
+ ]
85
+ end
86
+
87
+ def recreate_commit_instructions
88
+ return [] unless desc.delete_at_end?
89
+
90
+ [
91
+ { key: :resource_name },
92
+ { value: "_deletable_#{@rrep.name}" },
93
+ { key: :resource_desc },
94
+ { value: @rrep.desc.class.name },
95
+ :delete
96
+ ]
97
+ end
98
+
99
+ def recreate_finish_instructions
100
+ return [] unless desc.delete_at_end?
101
+
102
+ [
103
+ { key: :resource_name },
104
+ { value: "_deletable_#{@rrep.name}" },
105
+ { key: :resource_desc },
106
+ { value: @rrep.desc.class.name },
107
+ :check_delete
108
+ ]
109
+ end
110
+ end
111
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Tataru
4
- VERSION = '0.1.0'
4
+ VERSION = '0.2.0'
5
5
  end
@@ -0,0 +1,181 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tataru'
4
+
5
+ describe Tataru::Compiler do
6
+ it 'outputs the correct default format' do
7
+ dsl = Tataru::TopDsl.new(Tataru::ResourceTypePool.new)
8
+ compiler = Tataru::Compiler.new(dsl)
9
+ expect(compiler.instr_hash).to eq(
10
+ init: {
11
+ labels: {},
12
+ remote_ids: {},
13
+ rom: {}
14
+ },
15
+ instructions: [:init, :end]
16
+ )
17
+ end
18
+
19
+ it 'outputs top instructions and subroutine instructions' do
20
+ dsl = Tataru::TopDsl.new(Tataru::ResourceTypePool.new)
21
+ compiler = Tataru::Compiler.new(dsl)
22
+
23
+ allow(compiler).to receive(:top_instructions) { [:meow] }
24
+ allow(compiler).to receive(:subroutine_instructions) { [:woof] }
25
+
26
+ expect(compiler.instr_hash).to eq(
27
+ init: {
28
+ labels: {},
29
+ remote_ids: {},
30
+ rom: {}
31
+ },
32
+ instructions: [:meow, :woof]
33
+ )
34
+ end
35
+
36
+ it 'wraps instructions with init and end' do
37
+ dsl = Tataru::TopDsl.new(Tataru::ResourceTypePool.new)
38
+ compiler = Tataru::Compiler.new(dsl)
39
+
40
+ allow(compiler).to receive(:generate_top_instructions) { [:meow] }
41
+
42
+ expect(compiler.top_instructions).to eq [:init, :meow, :end]
43
+ end
44
+
45
+ it 'makes all the subroutine instructions mixed in' do
46
+ dsl = Tataru::TopDsl.new(Tataru::ResourceTypePool.new)
47
+ compiler = Tataru::Compiler.new(dsl)
48
+
49
+ a = double('SubroutineCompiler')
50
+ b = double('SubroutineCompiler')
51
+
52
+ allow(a).to receive(:body_instructions) { [:meow, :purr] }
53
+ allow(b).to receive(:body_instructions) { [:pant, :woof] }
54
+ allow(compiler).to receive(:subroutines) { {a: a, b: b} }
55
+
56
+ expect(compiler.subroutine_instructions).to eq [:meow, :purr, :pant, :woof]
57
+ end
58
+
59
+ it 'assigns the correct numbers to labels' do
60
+ dsl = Tataru::TopDsl.new(Tataru::ResourceTypePool.new)
61
+ compiler = Tataru::Compiler.new(dsl)
62
+
63
+ a = double('SubroutineCompiler')
64
+ b = double('SubroutineCompiler')
65
+
66
+ allow(a).to receive(:body_instructions) { [:meow, :purr, :drink_milk] }
67
+ allow(b).to receive(:body_instructions) { [:pant, :woof] }
68
+
69
+ allow(a).to receive(:label) { :cat }
70
+ allow(b).to receive(:label) { :dog }
71
+
72
+ allow(compiler).to receive(:subroutines) { {a: a, b: b} }
73
+
74
+ expect(compiler.generate_labels).to eq(cat: 2, dog: 5)
75
+ end
76
+
77
+ it 'generates the right subroutines' do
78
+ dsl = Tataru::TopDsl.new(Tataru::ResourceTypePool.new)
79
+ compiler = Tataru::Compiler.new(dsl)
80
+
81
+ dummy = double('SubroutineCompiler')
82
+ allow(dummy).to receive(:call_instruction)
83
+
84
+ dummy_subroutine_hash = double('Hash')
85
+ allow(compiler).to receive(:subroutines) { dummy_subroutine_hash }
86
+
87
+ allow(dsl).to receive(:dep_graph) { { a: [:b], c: [:b], b: [] } }
88
+
89
+ expect(dummy_subroutine_hash).to receive(:[]).with('b_start') { dummy }
90
+ expect(dummy_subroutine_hash).to receive(:[]).with('b_check') { dummy }
91
+ expect(dummy_subroutine_hash).to receive(:[]).with('b_commit') { dummy }
92
+ expect(dummy_subroutine_hash).to receive(:[]).with('b_finish') { dummy }
93
+
94
+ expect(dummy_subroutine_hash).to receive(:[]).with('a_start') { dummy }
95
+ expect(dummy_subroutine_hash).to receive(:[]).with('a_check') { dummy }
96
+ expect(dummy_subroutine_hash).to receive(:[]).with('a_commit') { dummy }
97
+ expect(dummy_subroutine_hash).to receive(:[]).with('a_finish') { dummy }
98
+
99
+ expect(dummy_subroutine_hash).to receive(:[]).with('c_start') { dummy }
100
+ expect(dummy_subroutine_hash).to receive(:[]).with('c_check') { dummy }
101
+ expect(dummy_subroutine_hash).to receive(:[]).with('c_commit') { dummy }
102
+ expect(dummy_subroutine_hash).to receive(:[]).with('c_finish') { dummy }
103
+
104
+ compiler.generate_top_instructions
105
+ end
106
+
107
+ it 'generates create instructions by default' do
108
+ dsl = Tataru::TopDsl.new(Tataru::ResourceTypePool.new)
109
+ compiler = Tataru::Compiler.new(dsl)
110
+
111
+ cat = Tataru::Representations::ResourceRepresentation.new('ccat', Tataru::BaseResourceDesc.new, {})
112
+ dog = Tataru::Representations::ResourceRepresentation.new('ddog', Tataru::BaseResourceDesc.new, {})
113
+ allow(dsl).to receive(:resources) do
114
+ {
115
+ 'cat' => cat,
116
+ 'dog' => dog
117
+ }
118
+ end
119
+
120
+ expect(Tataru::SubroutineCompiler).to receive(:new).with(cat, :create)
121
+ expect(Tataru::SubroutineCompiler).to receive(:new).with(cat, :check_create)
122
+
123
+ expect(Tataru::SubroutineCompiler).to receive(:new).with(cat, :commit_create)
124
+ expect(Tataru::SubroutineCompiler).to receive(:new).with(cat, :finish_create)
125
+
126
+ expect(Tataru::SubroutineCompiler).to receive(:new).with(dog, :create)
127
+ expect(Tataru::SubroutineCompiler).to receive(:new).with(dog, :check_create)
128
+
129
+ expect(Tataru::SubroutineCompiler).to receive(:new).with(dog, :commit_create)
130
+ expect(Tataru::SubroutineCompiler).to receive(:new).with(dog, :finish_create)
131
+
132
+ expect(compiler.generate_subroutines.keys).to eq [
133
+ 'ccat_start', 'ccat_check', 'ccat_commit', 'ccat_finish',
134
+ 'ddog_start', 'ddog_check', 'ddog_commit', 'ddog_finish'
135
+ ]
136
+ end
137
+
138
+ it 'generates delete instructions for extant names' do
139
+ dsl = Tataru::TopDsl.new(Tataru::ResourceTypePool.new)
140
+ compiler = Tataru::Compiler.new(dsl, { 'thing' => 'BaseResourceDesc' })
141
+
142
+ expect(Tataru::SubroutineCompiler).to receive(:new).with(instance_of(Tataru::Representations::ResourceRepresentation), :delete)
143
+ expect(Tataru::SubroutineCompiler).to receive(:new).with(instance_of(Tataru::Representations::ResourceRepresentation), :check_delete)
144
+ expect(Tataru::SubroutineCompiler).to receive(:new).with(instance_of(Tataru::Representations::ResourceRepresentation), :commit_delete)
145
+ expect(Tataru::SubroutineCompiler).to receive(:new).with(instance_of(Tataru::Representations::ResourceRepresentation), :finish_delete)
146
+
147
+ expect(compiler.generate_subroutines.keys).to eq [
148
+ 'thing_start', 'thing_check', 'thing_commit', 'thing_finish'
149
+ ]
150
+ end
151
+
152
+ it 'generates update instructions for extant names that are set' do
153
+ dsl = Tataru::TopDsl.new(Tataru::ResourceTypePool.new)
154
+ compiler = Tataru::Compiler.new(dsl, { 'thong' => 'BaseResourceDesc' })
155
+
156
+ dog = Tataru::Representations::ResourceRepresentation.new('ddog', Tataru::BaseResourceDesc.new, {})
157
+ allow(dsl).to receive(:resources) do
158
+ {
159
+ 'thong' => dog
160
+ }
161
+ end
162
+
163
+ expect(Tataru::SubroutineCompiler).to receive(:new).with(dog, :update)
164
+ expect(Tataru::SubroutineCompiler).to receive(:new).with(dog, :check_update)
165
+ expect(Tataru::SubroutineCompiler).to receive(:new).with(dog, :commit_update)
166
+ expect(Tataru::SubroutineCompiler).to receive(:new).with(dog, :finish_update)
167
+ expect(Tataru::SubroutineCompiler).to receive(:new).with(dog, :modify)
168
+ expect(Tataru::SubroutineCompiler).to receive(:new).with(dog, :modify_check)
169
+ expect(Tataru::SubroutineCompiler).to receive(:new).with(dog, :recreate)
170
+ expect(Tataru::SubroutineCompiler).to receive(:new).with(dog, :recreate_check)
171
+ expect(Tataru::SubroutineCompiler).to receive(:new).with(dog, :recreate_commit)
172
+ expect(Tataru::SubroutineCompiler).to receive(:new).with(dog, :recreate_finish)
173
+
174
+ expect(compiler.generate_subroutines.keys).to eq [
175
+ 'ddog_start', 'ddog_check', 'ddog_commit', 'ddog_finish',
176
+ 'ddog_modify', 'ddog_modify_check',
177
+ 'ddog_recreate', 'ddog_recreate_check',
178
+ 'ddog_recreate_commit', 'ddog_recreate_finish'
179
+ ]
180
+ end
181
+ end