sashite-ggn 0.1.0 → 0.2.0

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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +8 -528
  3. data/VERSION.semver +1 -1
  4. data/lib/sashite/ggn.rb +2 -2
  5. data/lib/sashite/ggn/ability.rb +2 -20
  6. data/lib/sashite/ggn/gameplay.rb +2 -13
  7. data/lib/sashite/ggn/object.rb +2 -21
  8. data/lib/sashite/ggn/pattern.rb +2 -13
  9. data/lib/sashite/ggn/square.rb +2 -24
  10. data/lib/sashite/ggn/state.rb +2 -21
  11. data/lib/sashite/ggn/subject.rb +2 -22
  12. data/lib/sashite/ggn/verb.rb +2 -28
  13. data/sashite-ggn.gemspec +2 -2
  14. data/test/test_ggn.rb +6 -543
  15. data/test/test_ggn_ability.rb +28 -38
  16. data/test/test_ggn_gameplay.rb +8 -548
  17. data/test/test_ggn_object.rb +30 -22
  18. data/test/test_ggn_pattern.rb +8 -75
  19. data/test/test_ggn_square.rb +30 -14
  20. data/test/test_ggn_state.rb +18 -13
  21. data/test/test_ggn_subject.rb +30 -17
  22. data/test/test_ggn_verb.rb +18 -16
  23. metadata +4 -73
  24. data/lib/sashite/ggn/actor.rb +0 -20
  25. data/lib/sashite/ggn/ally.rb +0 -20
  26. data/lib/sashite/ggn/area.rb +0 -17
  27. data/lib/sashite/ggn/attacked.rb +0 -20
  28. data/lib/sashite/ggn/boolean.rb +0 -17
  29. data/lib/sashite/ggn/digit.rb +0 -20
  30. data/lib/sashite/ggn/digit_excluding_zero.rb +0 -17
  31. data/lib/sashite/ggn/direction.rb +0 -19
  32. data/lib/sashite/ggn/gameplay_into_base64.rb +0 -21
  33. data/lib/sashite/ggn/integer.rb +0 -20
  34. data/lib/sashite/ggn/last_moved_actor.rb +0 -20
  35. data/lib/sashite/ggn/maximum_magnitude.rb +0 -20
  36. data/lib/sashite/ggn/name.rb +0 -17
  37. data/lib/sashite/ggn/negative_integer.rb +0 -19
  38. data/lib/sashite/ggn/null.rb +0 -21
  39. data/lib/sashite/ggn/occupied.rb +0 -29
  40. data/lib/sashite/ggn/previous_moves_counter.rb +0 -20
  41. data/lib/sashite/ggn/promotable_into_actors.rb +0 -23
  42. data/lib/sashite/ggn/required.rb +0 -19
  43. data/lib/sashite/ggn/self.rb +0 -21
  44. data/lib/sashite/ggn/unsigned_integer.rb +0 -20
  45. data/lib/sashite/ggn/unsigned_integer_excluding_zero.rb +0 -20
  46. data/lib/sashite/ggn/zero.rb +0 -21
  47. data/test/test_ggn_actor.rb +0 -571
  48. data/test/test_ggn_ally.rb +0 -35
  49. data/test/test_ggn_area.rb +0 -21
  50. data/test/test_ggn_attacked.rb +0 -35
  51. data/test/test_ggn_boolean.rb +0 -21
  52. data/test/test_ggn_digit.rb +0 -21
  53. data/test/test_ggn_digit_excluding_zero.rb +0 -21
  54. data/test/test_ggn_direction.rb +0 -21
  55. data/test/test_ggn_gameplay_into_base64.rb +0 -555
  56. data/test/test_ggn_integer.rb +0 -39
  57. data/test/test_ggn_last_moved_actor.rb +0 -35
  58. data/test/test_ggn_maximum_magnitude.rb +0 -39
  59. data/test/test_ggn_name.rb +0 -21
  60. data/test/test_ggn_negative_integer.rb +0 -21
  61. data/test/test_ggn_null.rb +0 -21
  62. data/test/test_ggn_occupied.rb +0 -78
  63. data/test/test_ggn_previous_moves_counter.rb +0 -39
  64. data/test/test_ggn_promotable_into_actors.rb +0 -578
  65. data/test/test_ggn_required.rb +0 -21
  66. data/test/test_ggn_self.rb +0 -21
  67. data/test/test_ggn_unsigned_integer.rb +0 -39
  68. data/test/test_ggn_unsigned_integer_excluding_zero.rb +0 -25
  69. data/test/test_ggn_zero.rb +0 -21
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
@@ -3,8 +3,8 @@ require_relative 'ggn/gameplay'
3
3
  module Sashite
4
4
  module GGN
5
5
  # Loads a document from the current io stream.
6
- def self.load io
7
- Gameplay.load io
6
+ def self.new
7
+ Gameplay.new
8
8
  end
9
9
  end
10
10
  end
@@ -4,26 +4,8 @@ require_relative 'object'
4
4
 
5
5
  module Sashite
6
6
  module GGN
7
- module Ability
8
- PATTERN = /#{Subject::PATTERN}\^#{Verb::PATTERN}=#{Object::PATTERN}/
9
-
10
- def self.valid? io
11
- !!io.match("^#{PATTERN}$")
12
- end
13
-
14
- def self.load io
15
- raise ArgumentError unless valid? io
16
-
17
- subject = Subject.load io.split('^').fetch 0
18
- verb = Verb.load io.split('^').fetch(1).split('=').fetch 0
19
- object = Object.load io.split('=').fetch 1
20
-
21
- {
22
- subject: subject,
23
- verb: verb,
24
- object: object
25
- }
26
- end
7
+ class Ability
8
+ attr_accessor :subject, :verb, :object
27
9
  end
28
10
  end
29
11
  end
@@ -2,19 +2,8 @@ require_relative 'pattern'
2
2
 
3
3
  module Sashite
4
4
  module GGN
5
- module Gameplay
6
- PATTERN = /#{Pattern::PATTERN}(\. #{Pattern::PATTERN})*\./
7
-
8
- def self.valid? io
9
- io.match("^#{PATTERN}$") &&
10
- io.split('. ').sort.join('. ') == io &&
11
- io[0..-2].split('. ').uniq.join('. ').concat('.') == io
12
- end
13
-
14
- def self.load io
15
- raise ArgumentError unless valid? io
16
- io[0..-2].split('. ').map { |s| Pattern.load s }
17
- end
5
+ class Gameplay
6
+ attr_accessor :patterns
18
7
  end
19
8
  end
20
9
  end
@@ -1,28 +1,9 @@
1
1
  require_relative 'square'
2
- require_relative 'promotable_into_actors'
3
2
 
4
3
  module Sashite
5
4
  module GGN
6
- module Object
7
- PATTERN = /#{Square::PATTERN}~#{Square::PATTERN}%#{PromotableIntoActors::PATTERN}/
8
-
9
- def self.valid? io
10
- !!io.match("^#{PATTERN}$")
11
- end
12
-
13
- def self.load io
14
- raise ArgumentError unless valid? io
15
-
16
- src_square = Square.load io.split('~').fetch 0
17
- dst_square = Square.load io.split('~').fetch(1).split('%').fetch 0
18
- promotable_into_actors = PromotableIntoActors.load io.split('%').fetch 1
19
-
20
- {
21
- src_square: src_square,
22
- dst_square: dst_square,
23
- promotable_into_actors: promotable_into_actors
24
- }
25
- end
5
+ class Object
6
+ attr_accessor :src_square, :dst_square, :promotable_into_actors
26
7
  end
27
8
  end
28
9
  end
@@ -2,19 +2,8 @@ require_relative 'ability'
2
2
 
3
3
  module Sashite
4
4
  module GGN
5
- module Pattern
6
- PATTERN = /#{Ability::PATTERN}(; #{Ability::PATTERN})*/
7
-
8
- def self.valid? io
9
- io.match("^#{PATTERN}$") &&
10
- io.split('; ').uniq.join('; ') == io
11
- end
12
-
13
- def self.load io
14
- raise ArgumentError unless valid? io
15
-
16
- io.split('; ').map { |ability| Ability.load ability }
17
- end
5
+ class Pattern
6
+ attr_accessor :abilities
18
7
  end
19
8
  end
20
9
  end
@@ -1,29 +1,7 @@
1
- require_relative 'attacked'
2
- require_relative 'occupied'
3
- require_relative 'area'
4
-
5
1
  module Sashite
6
2
  module GGN
7
- module Square
8
- PATTERN = /#{Attacked::PATTERN}@#{Occupied::PATTERN}\+#{Area::PATTERN}/
9
-
10
- def self.valid? io
11
- !!io.match("^#{PATTERN}$")
12
- end
13
-
14
- def self.load io
15
- raise ArgumentError unless valid? io
16
-
17
- attacked = Attacked.load io.split('@').fetch(0)
18
- occupied = Occupied.load io.split('@').fetch(1).split('+').fetch(0)
19
- area = Area.load io.split('+').fetch(1)
20
-
21
- {
22
- :"...attacked?" => attacked,
23
- :"...occupied!" => occupied,
24
- :"area" => area
25
- }
26
- end
3
+ class Square
4
+ attr_accessor :attacked, :occupied, :area
27
5
  end
28
6
  end
29
7
  end
@@ -1,26 +1,7 @@
1
- require_relative 'last_moved_actor'
2
- require_relative 'previous_moves_counter'
3
-
4
1
  module Sashite
5
2
  module GGN
6
- module State
7
- PATTERN = /#{LastMovedActor::PATTERN}&#{PreviousMovesCounter::PATTERN}/
8
-
9
- def self.valid? io
10
- !!io.match("^#{PATTERN}$")
11
- end
12
-
13
- def self.load io
14
- raise ArgumentError unless valid? io
15
-
16
- last_moved_actor = LastMovedActor.load io.split('&').fetch(0)
17
- previous_moves_counter = PreviousMovesCounter.load io.split('&').fetch(1)
18
-
19
- {
20
- :"...last_moved_actor?" => last_moved_actor,
21
- :"...previous_moves_counter" => previous_moves_counter
22
- }
23
- end
3
+ class State
4
+ attr_accessor :last_moved_actor, :previous_moves_counter
24
5
  end
25
6
  end
26
7
  end
@@ -1,29 +1,9 @@
1
- require_relative 'ally'
2
- require_relative 'actor'
3
1
  require_relative 'state'
4
2
 
5
3
  module Sashite
6
4
  module GGN
7
- module Subject
8
- PATTERN = /#{Ally::PATTERN}<#{Actor::PATTERN}>#{State::PATTERN}/
9
-
10
- def self.valid? io
11
- !!io.match("^#{PATTERN}$")
12
- end
13
-
14
- def self.load io
15
- raise ArgumentError unless valid? io
16
-
17
- ally = Ally.load io.split('<').fetch(0)
18
- actor = Actor.load io.split('<').fetch(1).split('>').fetch(0)
19
- state = State.load io.split('>').fetch(1)
20
-
21
- {
22
- :"...ally?" => ally,
23
- actor: actor,
24
- state: state
25
- }
26
- end
5
+ class Subject
6
+ attr_accessor :ally, :actor, :state
27
7
  end
28
8
  end
29
9
  end
@@ -1,33 +1,7 @@
1
- require_relative 'direction'
2
- require_relative 'maximum_magnitude'
3
- require_relative 'name'
4
- require_relative 'required'
5
-
6
1
  module Sashite
7
2
  module GGN
8
- module Verb
9
- PATTERN = /#{Name::PATTERN}\[#{Direction::PATTERN}\]#{MaximumMagnitude::PATTERN}\/#{Required::PATTERN}/
10
-
11
- def self.valid? io
12
- !!io.match("^#{PATTERN}$")
13
- end
14
-
15
- def self.load io
16
- raise ArgumentError unless valid? io
17
-
18
- name = Name.load io.split('[').fetch 0
19
- direction = Direction.load io.split('[').fetch(1).split(']').fetch 0
20
- maximum_magnitude = MaximumMagnitude.load io.split(']').fetch(1).split('/').fetch 0
21
- required = Required.load io.split('/').fetch 1
22
-
23
- {
24
- name: name,
25
- vector: {
26
- :"...maximum_magnitude" => maximum_magnitude,
27
- direction: direction
28
- }
29
- }
30
- end
3
+ class Verb
4
+ attr_accessor :name, :vector
31
5
  end
32
6
  end
33
7
  end
@@ -3,8 +3,8 @@ Gem::Specification.new do |spec|
3
3
  spec.version = File.read('VERSION.semver')
4
4
  spec.authors = ['Cyril Wack']
5
5
  spec.email = ['contact@cyril.io']
6
- spec.summary = %q{General Gameplay Notation.}
7
- spec.description = %q{A Ruby interface for data serialization in GGN format.}
6
+ spec.summary = %q{Some mappers for GGN objects}
7
+ spec.description = %q{A Ruby interface for GGN (General Gameplay Notation) objects.}
8
8
  spec.homepage = 'https://github.com/sashite/ggn.rb'
9
9
  spec.license = 'MIT'
10
10
 
@@ -1,552 +1,15 @@
1
1
  require_relative '_test_helper'
2
2
 
3
3
  describe Sashite::GGN do
4
- subject { Sashite::GGN }
4
+ subject { Sashite::GGN.new }
5
5
 
6
- describe '.load' do
7
- it 'loads a document from the current io stream' do
8
- subject.load(
9
- 't<self>_&_^remove[-1,0]1/t=_@f+all~_@an_enemy_actor+all%self. ' +
10
- 't<self>_&_^remove[0,-1]1/t=_@f+all~_@an_enemy_actor+all%self. ' +
11
- 't<self>_&_^remove[0,1]1/t=_@f+all~_@an_enemy_actor+all%self. ' +
12
- 't<self>_&_^remove[1,0]1/t=_@f+all~_@an_enemy_actor+all%self. ' +
13
- 't<self>_&_^shift[-1,0]_/t=_@f+all~_@f+all%self. ' +
14
- 't<self>_&_^shift[-1,0]_/t=_@f+all~_@f+all%self; t<self>_&_^remove[-1,0]1/t=_@f+all~_@an_enemy_actor+all%self. ' +
15
- 't<self>_&_^shift[0,-1]_/t=_@f+all~_@f+all%self. ' +
16
- 't<self>_&_^shift[0,-1]_/t=_@f+all~_@f+all%self; t<self>_&_^remove[0,-1]1/t=_@f+all~_@an_enemy_actor+all%self. ' +
17
- 't<self>_&_^shift[0,1]_/t=_@f+all~_@f+all%self. ' +
18
- 't<self>_&_^shift[0,1]_/t=_@f+all~_@f+all%self; t<self>_&_^remove[0,1]1/t=_@f+all~_@an_enemy_actor+all%self. ' +
19
- 't<self>_&_^shift[1,0]_/t=_@f+all~_@f+all%self. ' +
20
- 't<self>_&_^shift[1,0]_/t=_@f+all~_@f+all%self; t<self>_&_^remove[1,0]1/t=_@f+all~_@an_enemy_actor+all%self.'
21
- ).hash.must_equal [
22
- [
23
- {
24
- :"subject" => {
25
- :"...ally?" => true,
26
- :"actor" => :self,
27
- :"state" => {
28
- :"...last_moved_actor?" => nil,
29
- :"...previous_moves_counter" => nil
30
- }
31
- },
32
-
33
- :"verb" => {
34
- :"name" => :remove,
35
- :"vector" => {:"...maximum_magnitude" => 1, direction: [-1,0]}
36
- },
37
-
38
- :"object" => {
39
- :"src_square" => {
40
- :"...attacked?" => nil,
41
- :"...occupied!" => false,
42
- :"area" => :all
43
- },
44
- :"dst_square" => {
45
- :"...attacked?" => nil,
46
- :"...occupied!" => :an_enemy_actor,
47
- :"area" => :all
48
- },
49
- :"promotable_into_actors" => [:self]
50
- }
51
- }
52
- ],
53
-
54
-
55
-
56
- [
57
- {
58
- :"subject" => {
59
- :"...ally?" => true,
60
- :"actor" => :self,
61
- :"state" => {
62
- :"...last_moved_actor?" => nil,
63
- :"...previous_moves_counter" => nil
64
- }
65
- },
66
-
67
- :"verb" => {
68
- :"name" => :remove,
69
- :"vector" => {:"...maximum_magnitude" => 1, direction: [0,-1]}
70
- },
71
-
72
- :"object" => {
73
- :"src_square" => {
74
- :"...attacked?" => nil,
75
- :"...occupied!" => false,
76
- :"area" => :all
77
- },
78
- :"dst_square" => {
79
- :"...attacked?" => nil,
80
- :"...occupied!" => :an_enemy_actor,
81
- :"area" => :all
82
- },
83
- :"promotable_into_actors" => [:self]
84
- }
85
- }
86
- ],
87
-
88
-
89
-
90
- [
91
- {
92
- :"subject" => {
93
- :"...ally?" => true,
94
- :"actor" => :self,
95
- :"state" => {
96
- :"...last_moved_actor?" => nil,
97
- :"...previous_moves_counter" => nil
98
- }
99
- },
100
-
101
- :"verb" => {
102
- :"name" => :remove,
103
- :"vector" => {:"...maximum_magnitude" => 1, direction: [0,1]}
104
- },
105
-
106
- :"object" => {
107
- :"src_square" => {
108
- :"...attacked?" => nil,
109
- :"...occupied!" => false,
110
- :"area" => :all
111
- },
112
- :"dst_square" => {
113
- :"...attacked?" => nil,
114
- :"...occupied!" => :an_enemy_actor,
115
- :"area" => :all
116
- },
117
- :"promotable_into_actors" => [:self]
118
- }
119
- }
120
- ],
121
-
122
-
123
-
124
- [
125
- {
126
- :"subject" => {
127
- :"...ally?" => true,
128
- :"actor" => :self,
129
- :"state" => {
130
- :"...last_moved_actor?" => nil,
131
- :"...previous_moves_counter" => nil
132
- }
133
- },
134
-
135
- :"verb" => {
136
- :"name" => :remove,
137
- :"vector" => {:"...maximum_magnitude" => 1, direction: [1,0]}
138
- },
139
-
140
- :"object" => {
141
- :"src_square" => {
142
- :"...attacked?" => nil,
143
- :"...occupied!" => false,
144
- :"area" => :all
145
- },
146
- :"dst_square" => {
147
- :"...attacked?" => nil,
148
- :"...occupied!" => :an_enemy_actor,
149
- :"area" => :all
150
- },
151
- :"promotable_into_actors" => [:self]
152
- }
153
- }
154
- ],
155
-
156
-
157
-
158
- [
159
- {
160
- :"subject" => {
161
- :"...ally?" => true,
162
- :"actor" => :self,
163
- :"state" => {
164
- :"...last_moved_actor?" => nil,
165
- :"...previous_moves_counter" => nil
166
- }
167
- },
168
-
169
- :"verb" => {
170
- :"name" => :shift,
171
- :"vector" => {:"...maximum_magnitude" => nil, direction: [-1,0]}
172
- },
173
-
174
- :"object" => {
175
- :"src_square" => {
176
- :"...attacked?" => nil,
177
- :"...occupied!" => false,
178
- :"area" => :all
179
- },
180
- :"dst_square" => {
181
- :"...attacked?" => nil,
182
- :"...occupied!" => false,
183
- :"area" => :all
184
- },
185
- :"promotable_into_actors" => [:self]
186
- }
187
- }
188
- ],
189
-
190
-
191
-
192
- [
193
- {
194
- :"subject" => {
195
- :"...ally?" => true,
196
- :"actor" => :self,
197
- :"state" => {
198
- :"...last_moved_actor?" => nil,
199
- :"...previous_moves_counter" => nil
200
- }
201
- },
202
-
203
- :"verb" => {
204
- :"name" => :shift,
205
- :"vector" => {:"...maximum_magnitude" => nil, direction: [-1,0]}
206
- },
207
-
208
- :"object" => {
209
- :"src_square" => {
210
- :"...attacked?" => nil,
211
- :"...occupied!" => false,
212
- :"area" => :all
213
- },
214
- :"dst_square" => {
215
- :"...attacked?" => nil,
216
- :"...occupied!" => false,
217
- :"area" => :all
218
- },
219
- :"promotable_into_actors" => [:self]
220
- }
221
- },
222
- {
223
- :"subject" => {
224
- :"...ally?" => true,
225
- :"actor" => :self,
226
- :"state" => {
227
- :"...last_moved_actor?" => nil,
228
- :"...previous_moves_counter" => nil
229
- }
230
- },
231
-
232
- :"verb" => {
233
- :"name" => :remove,
234
- :"vector" => {:"...maximum_magnitude" => 1, direction: [-1,0]}
235
- },
236
-
237
- :"object" => {
238
- :"src_square" => {
239
- :"...attacked?" => nil,
240
- :"...occupied!" => false,
241
- :"area" => :all
242
- },
243
- :"dst_square" => {
244
- :"...attacked?" => nil,
245
- :"...occupied!" => :an_enemy_actor,
246
- :"area" => :all
247
- },
248
- :"promotable_into_actors" => [:self]
249
- }
250
- }
251
- ],
252
-
253
-
254
-
255
- [
256
- {
257
- :"subject" => {
258
- :"...ally?" => true,
259
- :"actor" => :self,
260
- :"state" => {
261
- :"...last_moved_actor?" => nil,
262
- :"...previous_moves_counter" => nil
263
- }
264
- },
265
-
266
- :"verb" => {
267
- :"name" => :shift,
268
- :"vector" => {:"...maximum_magnitude" => nil, direction: [0,-1]}
269
- },
270
-
271
- :"object" => {
272
- :"src_square" => {
273
- :"...attacked?" => nil,
274
- :"...occupied!" => false,
275
- :"area" => :all
276
- },
277
- :"dst_square" => {
278
- :"...attacked?" => nil,
279
- :"...occupied!" => false,
280
- :"area" => :all
281
- },
282
- :"promotable_into_actors" => [:self]
283
- }
284
- }
285
- ],
286
-
287
-
288
-
289
- [
290
- {
291
- :"subject" => {
292
- :"...ally?" => true,
293
- :"actor" => :self,
294
- :"state" => {
295
- :"...last_moved_actor?" => nil,
296
- :"...previous_moves_counter" => nil
297
- }
298
- },
299
-
300
- :"verb" => {
301
- :"name" => :shift,
302
- :"vector" => {:"...maximum_magnitude" => nil, direction: [0,-1]}
303
- },
304
-
305
- :"object" => {
306
- :"src_square" => {
307
- :"...attacked?" => nil,
308
- :"...occupied!" => false,
309
- :"area" => :all
310
- },
311
- :"dst_square" => {
312
- :"...attacked?" => nil,
313
- :"...occupied!" => false,
314
- :"area" => :all
315
- },
316
- :"promotable_into_actors" => [:self]
317
- }
318
- },
319
- {
320
- :"subject" => {
321
- :"...ally?" => true,
322
- :"actor" => :self,
323
- :"state" => {
324
- :"...last_moved_actor?" => nil,
325
- :"...previous_moves_counter" => nil
326
- }
327
- },
328
-
329
- :"verb" => {
330
- :"name" => :remove,
331
- :"vector" => {:"...maximum_magnitude" => 1, direction: [0,-1]}
332
- },
333
-
334
- :"object" => {
335
- :"src_square" => {
336
- :"...attacked?" => nil,
337
- :"...occupied!" => false,
338
- :"area" => :all
339
- },
340
- :"dst_square" => {
341
- :"...attacked?" => nil,
342
- :"...occupied!" => :an_enemy_actor,
343
- :"area" => :all
344
- },
345
- :"promotable_into_actors" => [:self]
346
- }
347
- }
348
- ],
349
-
350
-
351
-
352
- [
353
- {
354
- :"subject" => {
355
- :"...ally?" => true,
356
- :"actor" => :self,
357
- :"state" => {
358
- :"...last_moved_actor?" => nil,
359
- :"...previous_moves_counter" => nil
360
- }
361
- },
362
-
363
- :"verb" => {
364
- :"name" => :shift,
365
- :"vector" => {:"...maximum_magnitude" => nil, direction: [0,1]}
366
- },
367
-
368
- :"object" => {
369
- :"src_square" => {
370
- :"...attacked?" => nil,
371
- :"...occupied!" => false,
372
- :"area" => :all
373
- },
374
- :"dst_square" => {
375
- :"...attacked?" => nil,
376
- :"...occupied!" => false,
377
- :"area" => :all
378
- },
379
- :"promotable_into_actors" => [:self]
380
- }
381
- }
382
- ],
383
-
384
-
385
-
386
- [
387
- {
388
- :"subject" => {
389
- :"...ally?" => true,
390
- :"actor" => :self,
391
- :"state" => {
392
- :"...last_moved_actor?" => nil,
393
- :"...previous_moves_counter" => nil
394
- }
395
- },
396
-
397
- :"verb" => {
398
- :"name" => :shift,
399
- :"vector" => {:"...maximum_magnitude" => nil, direction: [0,1]}
400
- },
401
-
402
- :"object" => {
403
- :"src_square" => {
404
- :"...attacked?" => nil,
405
- :"...occupied!" => false,
406
- :"area" => :all
407
- },
408
- :"dst_square" => {
409
- :"...attacked?" => nil,
410
- :"...occupied!" => false,
411
- :"area" => :all
412
- },
413
- :"promotable_into_actors" => [:self]
414
- }
415
- },
416
- {
417
- :"subject" => {
418
- :"...ally?" => true,
419
- :"actor" => :self,
420
- :"state" => {
421
- :"...last_moved_actor?" => nil,
422
- :"...previous_moves_counter" => nil
423
- }
424
- },
425
-
426
- :"verb" => {
427
- :"name" => :remove,
428
- :"vector" => {:"...maximum_magnitude" => 1, direction: [0,1]}
429
- },
430
-
431
- :"object" => {
432
- :"src_square" => {
433
- :"...attacked?" => nil,
434
- :"...occupied!" => false,
435
- :"area" => :all
436
- },
437
- :"dst_square" => {
438
- :"...attacked?" => nil,
439
- :"...occupied!" => :an_enemy_actor,
440
- :"area" => :all
441
- },
442
- :"promotable_into_actors" => [:self]
443
- }
444
- }
445
- ],
446
-
447
-
448
-
449
- [
450
- {
451
- :"subject" => {
452
- :"...ally?" => true,
453
- :"actor" => :self,
454
- :"state" => {
455
- :"...last_moved_actor?" => nil,
456
- :"...previous_moves_counter" => nil
457
- }
458
- },
459
-
460
- :"verb" => {
461
- :"name" => :shift,
462
- :"vector" => {:"...maximum_magnitude" => nil, direction: [1,0]}
463
- },
464
-
465
- :"object" => {
466
- :"src_square" => {
467
- :"...attacked?" => nil,
468
- :"...occupied!" => false,
469
- :"area" => :all
470
- },
471
- :"dst_square" => {
472
- :"...attacked?" => nil,
473
- :"...occupied!" => false,
474
- :"area" => :all
475
- },
476
- :"promotable_into_actors" => [:self]
477
- }
478
- }
479
- ],
480
-
481
-
482
-
483
- [
484
- {
485
- :"subject" => {
486
- :"...ally?" => true,
487
- :"actor" => :self,
488
- :"state" => {
489
- :"...last_moved_actor?" => nil,
490
- :"...previous_moves_counter" => nil
491
- }
492
- },
493
-
494
- :"verb" => {
495
- :"name" => :shift,
496
- :"vector" => {:"...maximum_magnitude" => nil, direction: [1,0]}
497
- },
498
-
499
- :"object" => {
500
- :"src_square" => {
501
- :"...attacked?" => nil,
502
- :"...occupied!" => false,
503
- :"area" => :all
504
- },
505
- :"dst_square" => {
506
- :"...attacked?" => nil,
507
- :"...occupied!" => false,
508
- :"area" => :all
509
- },
510
- :"promotable_into_actors" => [:self]
511
- }
512
- },
513
- {
514
- :"subject" => {
515
- :"...ally?" => true,
516
- :"actor" => :self,
517
- :"state" => {
518
- :"...last_moved_actor?" => nil,
519
- :"...previous_moves_counter" => nil
520
- }
521
- },
522
-
523
- :"verb" => {
524
- :"name" => :remove,
525
- :"vector" => {:"...maximum_magnitude" => 1, direction: [1,0]}
526
- },
527
-
528
- :"object" => {
529
- :"src_square" => {
530
- :"...attacked?" => nil,
531
- :"...occupied!" => false,
532
- :"area" => :all
533
- },
534
- :"dst_square" => {
535
- :"...attacked?" => nil,
536
- :"...occupied!" => :an_enemy_actor,
537
- :"area" => :all
538
- },
539
- :"promotable_into_actors" => [:self]
540
- }
541
- }
542
- ]
543
- ].hash
6
+ describe 'GGN instance' do
7
+ it 'responds to patterns' do
8
+ subject.must_respond_to :patterns
544
9
  end
545
10
 
546
- describe 'errors' do
547
- it 'raises without a gameplay' do
548
- -> { subject.load 'foobar' }.must_raise ArgumentError
549
- end
11
+ it 'responds to patterns=' do
12
+ subject.must_respond_to :patterns=
550
13
  end
551
14
  end
552
15
  end