meiro 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,296 @@
1
+ require 'spec_helper'
2
+
3
+ class Meiro::MapLayer
4
+ # テスト用にアクセス可能にする
5
+ attr_accessor :map
6
+ end
7
+
8
+ describe Meiro::MapLayer do
9
+ let(:width) { 10 }
10
+ let(:height) { 5 }
11
+
12
+ describe '.new' do
13
+ context '幅:10、高さ:5の場合' do
14
+ subject { described_class.new(width, height) }
15
+
16
+ its(:map) do
17
+ expect = [[nil,nil,nil,nil,nil,nil,nil,nil,nil,nil],
18
+ [nil,nil,nil,nil,nil,nil,nil,nil,nil,nil],
19
+ [nil,nil,nil,nil,nil,nil,nil,nil,nil,nil],
20
+ [nil,nil,nil,nil,nil,nil,nil,nil,nil,nil],
21
+ [nil,nil,nil,nil,nil,nil,nil,nil,nil,nil],]
22
+ should eq(expect)
23
+ end
24
+ end
25
+ end
26
+
27
+ let(:map_layer) { described_class.new(width, height) }
28
+
29
+ describe '#[]' do
30
+ before(:each) { map_layer.map = [[1,2,3],[4,5,6],[7,8,9]] }
31
+
32
+ subject { map_layer[x, y] }
33
+
34
+ [
35
+ [0, 0, 1],
36
+ [1, 0, 2],
37
+ [2, 0, 3],
38
+ [0, 1, 4],
39
+ [1, 1, 5],
40
+ [2, 1, 6],
41
+ [0, 2, 7],
42
+ [1, 2, 8],
43
+ [2, 2, 9],
44
+ ].each do |_x, _y, expect|
45
+ context "[#{_x}, #{_y}]にアクセスした場合" do
46
+ let(:x) { _x }
47
+ let(:y) { _y }
48
+
49
+ it { should eq(expect) }
50
+ end
51
+ end
52
+ end
53
+
54
+ describe '#[]=' do
55
+ [
56
+ [0, 0, 1],
57
+ [1, 0, 2],
58
+ [2, 0, 3],
59
+ [0, 1, 4],
60
+ [1, 1, 5],
61
+ [2, 1, 6],
62
+ [0, 2, 7],
63
+ [1, 2, 8],
64
+ [2, 2, 9],
65
+ ].each do |_x, _y, v|
66
+ context "[#{_x}, #{_y}]にアクセスした場合" do
67
+ subject { map_layer[_x, _y] = v; map_layer[_x, _y] }
68
+
69
+ it { should eq(v) }
70
+ end
71
+ end
72
+ end
73
+
74
+ describe '#each_line' do
75
+ before(:each) { map_layer.map = [[1,2,3],[4,5,6],[7,8,9]] }
76
+
77
+ subject do
78
+ sub = []
79
+ map_layer.each_line {|line| sub.unshift(line) }
80
+ sub
81
+ end
82
+
83
+ it { should eq([[7,8,9],[4,5,6],[1,2,3]]) }
84
+ end
85
+
86
+ describe '#each_tile' do
87
+ before(:each) { map_layer.map = [[1,2,3],[4,5,6],[7,8,9]] }
88
+
89
+ subject do
90
+ sub = [[],[],[]]
91
+ map_layer.each_tile {|x, y, tile| sub[x][y] = tile }
92
+ sub
93
+ end
94
+
95
+ it { should eq([[1,4,7],[2,5,8],[3,6,9]]) }
96
+ end
97
+ end
98
+
99
+ class Meiro::BaseMap
100
+ # テスト用にアクセス可能にする
101
+ attr_accessor :map
102
+ end
103
+
104
+ describe Meiro::BaseMap do
105
+ let(:dungeon) { Meiro::Dungeon.new }
106
+ let(:floor) do
107
+ args = [dungeon, dungeon.width, dungeon.height,
108
+ dungeon.min_room_width, dungeon.min_room_height,
109
+ dungeon.max_room_width, dungeon.max_room_height,]
110
+ Meiro::Floor.new(*args)
111
+ end
112
+
113
+ let(:width) { 10 }
114
+ let(:height) { 5 }
115
+ let(:wall_klass) { Meiro::Tile::Wall }
116
+
117
+ describe '.new' do
118
+ context '要素のクラス指定なしの場合' do
119
+ subject { described_class.new(width, height) }
120
+
121
+ its(:map) do
122
+ expect = [[nil,nil,nil,nil,nil,nil,nil,nil,nil,nil],
123
+ [nil,nil,nil,nil,nil,nil,nil,nil,nil,nil],
124
+ [nil,nil,nil,nil,nil,nil,nil,nil,nil,nil],
125
+ [nil,nil,nil,nil,nil,nil,nil,nil,nil,nil],
126
+ [nil,nil,nil,nil,nil,nil,nil,nil,nil,nil],]
127
+ should eq(expect)
128
+ end
129
+ end
130
+
131
+ context '要素のクラス指定ありの場合' do
132
+ subject { described_class.new(width, height, wall_klass) }
133
+
134
+ its(:map) do
135
+ subject.each_tile do |x, y, tile|
136
+ tile.should be_instance_of(wall_klass)
137
+ end
138
+ end
139
+ end
140
+ end
141
+
142
+ let(:base_map) { described_class.new(width, height, wall_klass) }
143
+
144
+ describe '#fill_rect' do
145
+ let(:klass_1) { class C1; def self.new; 1; end; end; C1 }
146
+ let(:klass_0) { class C0; def self.new; 0; end; end; C0 }
147
+ let(:base_map) { described_class.new(width, height, klass_1) }
148
+ let(:width) { 5 }
149
+ let(:heiht) { 5 }
150
+
151
+ subject do
152
+ base_map.fill_rect(x1, y1, x2, y2, klass_0)
153
+ base_map.map
154
+ end
155
+
156
+ context '線形に処理する場合' do
157
+ let(:x1) { 2 }; let(:y1) { 0 }
158
+ let(:x2) { 2 }; let(:y2) { 4 }
159
+
160
+ it do
161
+ should eq([[1,1,0,1,1],
162
+ [1,1,0,1,1],
163
+ [1,1,0,1,1],
164
+ [1,1,0,1,1],
165
+ [1,1,0,1,1],])
166
+ end
167
+ end
168
+
169
+ context '正方形に処理する場合' do
170
+ let(:x1) { 1 }; let(:y1) { 1 }
171
+ let(:x2) { 3 }; let(:y2) { 3 }
172
+
173
+ it do
174
+ should eq([[1,1,1,1,1],
175
+ [1,0,0,0,1],
176
+ [1,0,0,0,1],
177
+ [1,0,0,0,1],
178
+ [1,1,1,1,1],])
179
+ end
180
+ end
181
+ end
182
+
183
+ describe '#apply_room' do
184
+ let(:klass_1) { class C1; def self.new; 1; end; end; C1 }
185
+ let(:klass_0) { class C0; def self.new; 0; end; end; C0 }
186
+ let(:base_map) { described_class.new(width, height, klass_1) }
187
+ let(:width) { 5 }
188
+ let(:heiht) { 5 }
189
+ let(:block) { Meiro::Block.new(floor, 0, 0, 5, 5) }
190
+ let(:room) { Meiro::Room.new(3, 3) }
191
+
192
+ before(:each) do
193
+ room.block = block
194
+ room.relative_x = 1
195
+ room.relative_y = 1
196
+ end
197
+
198
+ subject do
199
+ base_map.apply_room(room, klass_0)
200
+ base_map.map
201
+ end
202
+
203
+ it do
204
+ should eq([[1,1,1,1,1],
205
+ [1,0,0,0,1],
206
+ [1,0,0,0,1],
207
+ [1,0,0,0,1],
208
+ [1,1,1,1,1],])
209
+ end
210
+ end
211
+
212
+ describe '#apply_passage' do
213
+ let(:klass_2) { class C2; def self.new; 2; end; end; C2 }
214
+ let(:klass_1) { class C1; def self.new; 1; end; end; C1 }
215
+ let(:klass_0) { class C0; def self.new; 0; end; end; C0 }
216
+ let(:base_map) { described_class.new(width, height, klass_1) }
217
+ let(:width) { 5 }
218
+ let(:heiht) { 5 }
219
+ let(:block) { Meiro::Block.new(floor, 0, 0, 5, 5) }
220
+ let(:room) { Meiro::Room.new(3, 3) }
221
+ let(:other_room) { Meiro::Room.new(3, 3) }
222
+
223
+ subject do
224
+ base_map.apply_passage([room], klass_2, klass_0)
225
+ base_map.map
226
+ end
227
+
228
+ before(:each) { passages.each {|p| room.all_pass << p } }
229
+
230
+ context '通路のみ' do
231
+ context '1本の場合' do
232
+ let(:passages) { [Meiro::Passage.new(0, 0, 0, 4)] }
233
+
234
+ it do
235
+ should eq([[0,1,1,1,1],
236
+ [0,1,1,1,1],
237
+ [0,1,1,1,1],
238
+ [0,1,1,1,1],
239
+ [0,1,1,1,1],])
240
+ end
241
+ end
242
+
243
+ context '複数の場合' do
244
+ let(:passages) do
245
+ [Meiro::Passage.new(0, 0, 2, 0),
246
+ Meiro::Passage.new(2, 0, 2, 4),
247
+ Meiro::Passage.new(2, 4, 4, 4),]
248
+ end
249
+
250
+ it do
251
+ should eq([[0,0,0,1,1],
252
+ [1,1,0,1,1],
253
+ [1,1,0,1,1],
254
+ [1,1,0,1,1],
255
+ [1,1,0,0,0],])
256
+ end
257
+ end
258
+ end
259
+
260
+ context '通路+出口' do
261
+ context '通路と出口が重ならない場合' do
262
+ before(:each) do
263
+ room.connected_rooms[gate_coordinate] = other_room
264
+ end
265
+
266
+ let(:passages) { [Meiro::Passage.new(0, 0, 0, 4)] }
267
+ let(:gate_coordinate) { [2, 2] }
268
+
269
+ it do
270
+ should eq([[0,1,1,1,1],
271
+ [0,1,1,1,1],
272
+ [0,1,2,1,1],
273
+ [0,1,1,1,1],
274
+ [0,1,1,1,1],])
275
+ end
276
+ end
277
+
278
+ context '通路と出口が重なる場合' do
279
+ before(:each) do
280
+ room.connected_rooms[gate_coordinate] = other_room
281
+ end
282
+
283
+ let(:passages) { [Meiro::Passage.new(0, 0, 0, 4)] }
284
+ let(:gate_coordinate) { [0, 4] }
285
+
286
+ it do
287
+ should eq([[0,1,1,1,1],
288
+ [0,1,1,1,1],
289
+ [0,1,1,1,1],
290
+ [0,1,1,1,1],
291
+ [2,1,1,1,1],])
292
+ end
293
+ end
294
+ end
295
+ end
296
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Meiro do
4
+ let(:options) { Hash.new }
5
+
6
+ describe '.create_dungeon' do
7
+ subject { described_class.create_dungeon(options) }
8
+
9
+ its(:class) { should eq(Meiro::Dungeon) }
10
+ end
11
+
12
+ it 'should have a version number' do
13
+ Meiro::VERSION.should_not be_nil
14
+ end
15
+ end
@@ -0,0 +1,564 @@
1
+ require 'spec_helper'
2
+
3
+ describe Meiro::Room do
4
+ let(:dungeon) { Meiro::Dungeon.new }
5
+ let(:floor) do
6
+ args = [dungeon, dungeon.width, dungeon.height,
7
+ dungeon.min_room_width, dungeon.min_room_height,
8
+ dungeon.max_room_width, dungeon.max_room_height,]
9
+ Meiro::Floor.new(*args)
10
+ end
11
+
12
+ let(:width) { 10 }
13
+ let(:height) { 5 }
14
+
15
+ describe '.new' do
16
+ subject { described_class.new(width, height) }
17
+
18
+ context '正常系' do
19
+ context '汎用値' do
20
+ let(:width) { 10 }
21
+ let(:height) { 5 }
22
+
23
+ its(:width) { should eq(10) }
24
+ its(:height) { should eq(5) }
25
+ end
26
+
27
+ context '最小値' do
28
+ let(:width) { 3 }
29
+ let(:height) { 3 }
30
+
31
+ its(:width) { should eq(3) }
32
+ its(:height) { should eq(3) }
33
+ end
34
+ end
35
+
36
+ context '異常系' do
37
+ context '幅が小さすぎる場合' do
38
+ let(:width) { 2 }
39
+
40
+ it { expect {subject}.to raise_error }
41
+ end
42
+
43
+ context '高さが小さすぎる場合' do
44
+ let(:height) { 2 }
45
+
46
+ it { expect {subject}.to raise_error }
47
+ end
48
+ end
49
+ end
50
+
51
+ let(:room) { described_class.new(width, height) }
52
+
53
+ let(:b_x) { 0 }
54
+ let(:b_y) { 0 }
55
+ let(:b_width) { 60 }
56
+ let(:b_height) { 40 }
57
+ let(:parent) { nil }
58
+ let(:block) { Meiro::Block.new(floor, b_x, b_y, b_width, b_height, parent) }
59
+
60
+ let(:relative_x) { 8 }
61
+ let(:relative_y) { 4 }
62
+
63
+ describe '#x' do
64
+ context 'Blockを紐付けていない場合' do
65
+ subject do
66
+ room.relative_x = relative_x
67
+ room.relative_y = relative_y
68
+ room.x
69
+ end
70
+
71
+ it { should be_nil }
72
+ end
73
+
74
+ context 'Blockを紐付けている場合' do
75
+ subject do
76
+ block.put_room(room)
77
+ room.relative_x = relative_x
78
+ room.relative_y = relative_y
79
+ room.x
80
+ end
81
+
82
+ context 'Blockのx座標が0の場合' do
83
+ it 'Roomの相対座標がそのまま絶対座標となる' do
84
+ should eq(8)
85
+ end
86
+ end
87
+
88
+ context 'Blockのx座標が>0の場合' do
89
+ let(:b_x) { 5 }
90
+
91
+ it 'Blockのx座標にRoomの相対座標を足しあわせたものが絶対座標となる' do
92
+ should eq(13)
93
+ end
94
+ end
95
+ end
96
+ end
97
+
98
+ describe '#y' do
99
+ context 'Blockを紐付けていない場合' do
100
+ subject do
101
+ room.relative_x = relative_x
102
+ room.relative_y = relative_y
103
+ room.y
104
+ end
105
+
106
+ it { should be_nil }
107
+ end
108
+
109
+ context 'Blockを紐付けている場合' do
110
+ subject do
111
+ block.put_room(room)
112
+ room.relative_x = relative_x
113
+ room.relative_y = relative_y
114
+ room.y
115
+ end
116
+
117
+ context 'Blockのx座標が0の場合' do
118
+ it 'Roomの相対座標がそのまま絶対座標となる' do
119
+ should eq(4)
120
+ end
121
+ end
122
+
123
+ context 'Blockのx座標が>0の場合' do
124
+ let(:b_y) { 5 }
125
+
126
+ it 'Blockのx座標にRoomの相対座標を足しあわせたものが絶対座標となる' do
127
+ should eq(9)
128
+ end
129
+ end
130
+ end
131
+ end
132
+
133
+ describe '#get_all_abs_coordinate' do
134
+ before do
135
+ block.put_room(room)
136
+ room.relative_x = relative_x
137
+ room.relative_y = relative_y
138
+ end
139
+
140
+ subject { room.get_all_abs_coordinate }
141
+
142
+ context 'ブロックの座標が(0,0)、相対座標が(8,4)、幅が10、高さが5の場合' do
143
+ let(:expected_ary) do
144
+ a = []
145
+ (4..8).each {|y| (8..17).each {|x| a << [x, y] } }
146
+ a
147
+ end
148
+
149
+ it { should eq(expected_ary) }
150
+ end
151
+ end
152
+
153
+ describe '#block=' do
154
+ subject { room.block = block }
155
+
156
+ context '相対座標を指定していない場合' do
157
+ it { expect{ subject }.not_to raise_error }
158
+ it { should be_instance_of(Meiro::Block) }
159
+ end
160
+
161
+ context '相対座標を指定している場合' do
162
+ let(:width) { 5 }
163
+ let(:height) { 5 }
164
+ let(:b_width) { 10 }
165
+ let(:b_height) { 10 }
166
+
167
+ subject do
168
+ room.relative_x = relative_x
169
+ room.relative_y = relative_y
170
+ room.block = block
171
+ end
172
+
173
+ [
174
+ [1, 1],
175
+ [1, 4],
176
+ [4, 1],
177
+ [4, 4],
178
+ ].each do |x, y|
179
+ context "適切な相対座標(#{x}, #{y})が指定されている場合" do
180
+ let(:relative_x) { x }
181
+ let(:relative_y) { y }
182
+
183
+ it { expect{ subject }.not_to raise_error }
184
+ it { should be_instance_of(Meiro::Block) }
185
+ end
186
+ end
187
+
188
+ [
189
+ [0, 0],
190
+ [4, 0],
191
+ [5, 1],
192
+ [0, 4],
193
+ [4, 5],
194
+ [5, 4],
195
+ [9, 9],
196
+ ].each do |x, y|
197
+ context "不適切な相対座標(#{x}, #{y})が指定されている場合" do
198
+ let(:relative_x) { x }
199
+ let(:relative_y) { y }
200
+
201
+ it { expect{ subject }.to raise_error }
202
+ end
203
+ end
204
+ end
205
+ end
206
+
207
+ describe '#set_random_coordinate' do
208
+ context 'Blockを紐付けていない場合' do
209
+ subject { room.set_random_coordinate }
210
+
211
+ it { expect{ subject }.to raise_error }
212
+ end
213
+
214
+ context 'Blockを紐付けている場合' do
215
+ let(:randomizer) { Random.new(1) }
216
+
217
+ subject do
218
+ block.put_room(room)
219
+ room.set_random_coordinate(randomizer)
220
+ end
221
+
222
+ context '乱数のseedが1, Blockの幅:60、高さ:40の場合' do
223
+ # この条件下では必ず以下の組み合わせになる
224
+ it { should eq([38, 13]) }
225
+ end
226
+
227
+ context '乱数のseedが1, Blockの幅:30、高さ:20の場合' do
228
+ let(:b_width) { 30 }
229
+ let(:b_height) { 20 }
230
+ # この条件下では必ず以下の組み合わせになる
231
+ it { should eq([6, 12]) }
232
+ end
233
+
234
+ context '乱数の幅がないような設定(Blockの幅:12、高さ:7)の場合' do
235
+ let(:width) { 10 }
236
+ let(:height) { 5 }
237
+ let(:b_width) { 12 }
238
+ let(:b_height) { 7 }
239
+
240
+ it { should eq([1, 1]) }
241
+ end
242
+ end
243
+ end
244
+
245
+ describe '#available_x_max' do
246
+ let(:width) { 3 }
247
+ let(:height) { 3 }
248
+ let(:b_x) { 0 }
249
+ let(:b_y) { 0 }
250
+ let(:b_width) { 5 }
251
+ let(:b_height) { 5 }
252
+
253
+ subject do
254
+ room.relative_x = 1
255
+ room.relative_y = 1
256
+ block.put_room(room)
257
+ room.available_x_max
258
+ end
259
+
260
+ context 'Block幅が5、Room幅が3の場合' do
261
+ it { should eq(1) }
262
+ end
263
+
264
+ context 'Block幅が6、Room幅が3の場合' do
265
+ let(:b_width) { 6 }
266
+ it { should eq(2) }
267
+ end
268
+ end
269
+
270
+ describe '#available_y_max' do
271
+ let(:width) { 3 }
272
+ let(:height) { 3 }
273
+ let(:b_x) { 0 }
274
+ let(:b_y) { 0 }
275
+ let(:b_width) { 5 }
276
+ let(:b_height) { 5 }
277
+
278
+ subject do
279
+ room.relative_x = 1
280
+ room.relative_y = 1
281
+ block.put_room(room)
282
+ room.available_y_max
283
+ end
284
+
285
+ context 'Block高さが5、Room高さが3の場合' do
286
+ it { should eq(1) }
287
+ end
288
+
289
+ context 'Block高さが6、Room高さが3の場合' do
290
+ let(:b_height) { 6 }
291
+ it { should eq(2) }
292
+ end
293
+ end
294
+
295
+ describe '#each_coordinate' do
296
+ let(:width) { 3 }
297
+ let(:height) { 3 }
298
+ let(:b_x) { 0 }
299
+ let(:b_y) { 0 }
300
+ let(:b_width) { 5 }
301
+ let(:b_height) { 5 }
302
+
303
+ subject do
304
+ room.relative_x = 1
305
+ room.relative_y = 1
306
+ block.put_room(room)
307
+ sub = []
308
+ room.each_coordinate do |x, y|
309
+ sub << [x, y]
310
+ end
311
+ sub
312
+ end
313
+
314
+ it do
315
+ expected = [[1, 1], [2, 1], [3, 1],
316
+ [1, 2], [2, 2], [3, 2],
317
+ [1, 3], [2, 3], [3, 3],]
318
+ should eq(expected)
319
+ end
320
+ end
321
+
322
+ describe '#generation' do
323
+ subject { room.generation }
324
+
325
+ context 'Blockに割り当てられていない部屋の場合' do
326
+ it { should eq(nil) }
327
+ end
328
+
329
+ context 'Blockに割り当てられている部屋の場合' do
330
+ before do
331
+ room.relative_x = 1
332
+ room.relative_y = 1
333
+ block.put_room(room)
334
+ block.should_receive(:generation).once
335
+ end
336
+
337
+ it { expect{ subject }.not_to raise_error }
338
+ end
339
+ end
340
+
341
+ describe '#partition' do
342
+ subject { room.partition }
343
+
344
+ context 'Blockに割り当てられていない部屋の場合' do
345
+ it { should eq(nil) }
346
+ end
347
+
348
+ context 'Blockに割り当てられている部屋の場合' do
349
+ before do
350
+ room.relative_x = 1
351
+ room.relative_y = 1
352
+ block.put_room(room)
353
+ block.should_receive(:partition).once
354
+ end
355
+
356
+ it { expect{ subject }.not_to raise_error }
357
+ end
358
+ end
359
+
360
+ describe '#brother' do
361
+ subject { room.brother }
362
+
363
+ context 'Blockに割り当てられていない部屋の場合' do
364
+ it { should eq(nil) }
365
+ end
366
+
367
+ context '割り当てられているBlockが分割されたものでない場合' do
368
+ before do
369
+ room.relative_x = 1
370
+ room.relative_y = 1
371
+ block.put_room(room)
372
+ end
373
+
374
+ it { should eq(nil) }
375
+ end
376
+
377
+ context '割り当てられているBlockが分割されたものである場合' do
378
+ let(:parent) { Meiro::Block.new(floor, b_x, b_y, b_width, b_height, nil) }
379
+ let(:block2) { Meiro::Block.new(floor, b_x, b_y, b_width, b_height, parent) }
380
+ let(:room2) { described_class.new(3, 3) }
381
+
382
+ before(:each) do
383
+ room.relative_x = 1
384
+ room.relative_y = 1
385
+ block.put_room(room)
386
+ room2.relative_x = 1
387
+ room2.relative_y = 1
388
+ block2.put_room(room2)
389
+ end
390
+
391
+ context '対象の部屋がupper_leftの場合' do
392
+ before do
393
+ parent.instance_variable_set(:@upper_left, block)
394
+ parent.instance_variable_set(:@lower_right, block2)
395
+ end
396
+
397
+ it { should eq(room2) }
398
+ end
399
+
400
+ context '対象の部屋がupper_leftの場合' do
401
+ before do
402
+ parent.instance_variable_set(:@upper_left, block2)
403
+ parent.instance_variable_set(:@lower_right, block)
404
+ end
405
+
406
+ it { should eq(room2) }
407
+ end
408
+ end
409
+ end
410
+
411
+ def put_and_return_room(block)
412
+ r = described_class.new(3, 3)
413
+ r.relative_x, r.relative_y = 1, 1
414
+ block.put_room(r)
415
+ r
416
+ end
417
+
418
+ describe '#select_partition' do
419
+ let(:root_block) { floor.root_block.separate; floor.root_block }
420
+
421
+ subject { room.select_partition(other) }
422
+
423
+ context '第2世代-第2世代' do
424
+ # +---+---+
425
+ # | 1 | 2 |
426
+ # +---+---+
427
+ let(:block_1) { root_block.upper_left }
428
+ let(:block_2) { root_block.lower_right }
429
+ let(:room_1) { put_and_return_room(block_1) }
430
+ let(:room_2) { put_and_return_room(block_2) }
431
+
432
+ context 'self:1, other:2の場合' do
433
+ let(:room) { room_1 }
434
+ let(:other) { room_2 }
435
+
436
+ it { should eq(root_block.partition) }
437
+ end
438
+
439
+ context 'self:2, other:1の場合' do
440
+ let(:room) { room_1 }
441
+ let(:other) { room_2 }
442
+
443
+ it { should eq(root_block.partition) }
444
+ end
445
+ end
446
+
447
+ context '第3世代-第3世代' do
448
+ # +---+---+
449
+ # | 1 | 3 |
450
+ # +---+---+
451
+ # | 2 | 4 |
452
+ # +---+---+
453
+ let(:block_l) { root_block.upper_left.separate; root_block.upper_left }
454
+ let(:block_r) { root_block.lower_right.separate; root_block.lower_right }
455
+ let(:block_1) { block_l.upper_left }
456
+ let(:block_2) { block_l.lower_right }
457
+ let(:block_3) { block_r.upper_left }
458
+ let(:block_4) { block_r.lower_right }
459
+ let(:room_1) { put_and_return_room(block_1) }
460
+ let(:room_2) { put_and_return_room(block_2) }
461
+ let(:room_3) { put_and_return_room(block_3) }
462
+ let(:room_4) { put_and_return_room(block_4) }
463
+
464
+ context 'self:1, other:2の場合' do
465
+ let(:room) { room_1 }
466
+ let(:other) { room_2 }
467
+
468
+ it { should eq(block_l.partition) }
469
+ end
470
+
471
+ context 'self:1, other:3の場合' do
472
+ let(:room) { room_1 }
473
+ let(:other) { room_3 }
474
+
475
+ it { should eq(root_block.partition) }
476
+ end
477
+
478
+ context 'self:1, other:4の場合' do
479
+ let(:room) { room_1 }
480
+ let(:other) { room_3 }
481
+
482
+ it { should eq(root_block.partition) }
483
+ end
484
+ end
485
+
486
+ context '第2世代-第3世代' do
487
+ # +---+---+
488
+ # | | 2 |
489
+ # | 1 +---+
490
+ # | | 3 |
491
+ # +---+---+
492
+ let(:block_1) { root_block.upper_left }
493
+ let(:block_r) { root_block.lower_right.separate; root_block.lower_right }
494
+ let(:block_2) { block_r.upper_left }
495
+ let(:block_3) { block_r.lower_right }
496
+ let(:room_1) { put_and_return_room(block_1) }
497
+ let(:room_2) { put_and_return_room(block_2) }
498
+ let(:room_3) { put_and_return_room(block_3) }
499
+
500
+ context 'self:1, other:2の場合' do
501
+ let(:room) { room_1 }
502
+ let(:other) { room_2 }
503
+
504
+ it { should eq(root_block.partition) }
505
+ end
506
+
507
+ context 'self:1, other:3の場合' do
508
+ let(:room) { room_1 }
509
+ let(:other) { room_3 }
510
+
511
+ it { should eq(root_block.partition) }
512
+ end
513
+ end
514
+
515
+ context '第2世代-第4世代' do
516
+ # +------+---+---+
517
+ # | | 2 | 3 |
518
+ # | 1 +---+---+
519
+ # | | 4 | 5 |
520
+ # +------+---+---+
521
+ let(:block_1) { root_block.upper_left }
522
+ let(:block_r) { root_block.lower_right.separate; root_block.lower_right }
523
+ let(:block_ru) { block_r.upper_left.separate; block_r.upper_left }
524
+ let(:block_rl) { block_r.lower_right.separate; block_r.lower_right }
525
+ let(:block_2) { block_ru.upper_left }
526
+ let(:block_3) { block_ru.lower_right }
527
+ let(:block_4) { block_rl.upper_left }
528
+ let(:block_5) { block_rl.lower_right }
529
+ let(:room_1) { put_and_return_room(block_1) }
530
+ let(:room_2) { put_and_return_room(block_2) }
531
+ let(:room_3) { put_and_return_room(block_3) }
532
+ let(:room_4) { put_and_return_room(block_4) }
533
+ let(:room_5) { put_and_return_room(block_5) }
534
+
535
+ context 'self:1, other:2の場合' do
536
+ let(:room) { room_1 }
537
+ let(:other) { room_2 }
538
+
539
+ it { should eq(root_block.partition) }
540
+ end
541
+
542
+ context 'self:1, other:3の場合' do
543
+ let(:room) { room_1 }
544
+ let(:other) { room_3 }
545
+
546
+ it { should eq(root_block.partition) }
547
+ end
548
+
549
+ context 'self:1, other:4の場合' do
550
+ let(:room) { room_1 }
551
+ let(:other) { room_4 }
552
+
553
+ it { should eq(root_block.partition) }
554
+ end
555
+
556
+ context 'self:1, other:5の場合' do
557
+ let(:room) { room_1 }
558
+ let(:other) { room_5 }
559
+
560
+ it { should eq(root_block.partition) }
561
+ end
562
+ end
563
+ end
564
+ end