sashite-ggn 0.0.1

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