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,41 @@
1
+ require_relative '_test_helper'
2
+
3
+ describe Sashite::GGN::Integer do
4
+ describe '.new' do
5
+ describe 'negative' do
6
+ before do
7
+ @integer = Sashite::GGN::Integer.new('-42')
8
+ end
9
+
10
+ it 'returns the GGN as a JSON' do
11
+ @integer.as_json.must_equal -42
12
+ end
13
+
14
+ it 'returns the GGN as a string' do
15
+ @integer.to_s.must_equal '-42'
16
+ end
17
+
18
+ it 'raises an error' do
19
+ -> { Sashite::GGN::Integer.new('-01') }.must_raise ArgumentError
20
+ end
21
+ end
22
+
23
+ describe 'unsigned' do
24
+ before do
25
+ @integer = Sashite::GGN::Integer.new('42')
26
+ end
27
+
28
+ it 'returns the GGN as a JSON' do
29
+ @integer.as_json.must_equal 42
30
+ end
31
+
32
+ it 'returns the GGN as a string' do
33
+ @integer.to_s.must_equal '42'
34
+ end
35
+
36
+ it 'raises an error' do
37
+ -> { Sashite::GGN::Integer.new('01') }.must_raise ArgumentError
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,51 @@
1
+ require_relative '_test_helper'
2
+
3
+ describe Sashite::GGN::LastMovedActor do
4
+ describe '.new' do
5
+ describe 'false' do
6
+ before do
7
+ @last_moved_actor = Sashite::GGN::LastMovedActor.new('f')
8
+ end
9
+
10
+ it 'returns the GGN as a JSON' do
11
+ @last_moved_actor.as_json.must_equal false
12
+ end
13
+
14
+ it 'returns the GGN as a string' do
15
+ @last_moved_actor.to_s.must_equal 'f'
16
+ end
17
+ end
18
+
19
+ describe 'true' do
20
+ before do
21
+ @last_moved_actor = Sashite::GGN::LastMovedActor.new('t')
22
+ end
23
+
24
+ it 'returns the GGN as a JSON' do
25
+ @last_moved_actor.as_json.must_equal true
26
+ end
27
+
28
+ it 'returns the GGN as a string' do
29
+ @last_moved_actor.to_s.must_equal 't'
30
+ end
31
+ end
32
+
33
+ describe 'null' do
34
+ before do
35
+ @last_moved_actor = Sashite::GGN::LastMovedActor.new('_')
36
+ end
37
+
38
+ it 'returns the GGN as a JSON' do
39
+ @last_moved_actor.as_json.must_equal nil
40
+ end
41
+
42
+ it 'returns the GGN as a string' do
43
+ @last_moved_actor.to_s.must_equal '_'
44
+ end
45
+ end
46
+ end
47
+
48
+ it 'raises an error' do
49
+ -> { Sashite::GGN::LastMovedActor.new('foobar') }.must_raise ArgumentError
50
+ end
51
+ end
@@ -0,0 +1,37 @@
1
+ require_relative '_test_helper'
2
+
3
+ describe Sashite::GGN::MaximumMagnitude do
4
+ describe '.new' do
5
+ describe 'null' do
6
+ before do
7
+ @maximum_magnitude = Sashite::GGN::MaximumMagnitude.new('_')
8
+ end
9
+
10
+ it 'returns the GGN as a JSON' do
11
+ @maximum_magnitude.as_json.must_equal nil
12
+ end
13
+
14
+ it 'returns the GGN as a string' do
15
+ @maximum_magnitude.to_s.must_equal '_'
16
+ end
17
+ end
18
+
19
+ describe 'unsigned integer' do
20
+ before do
21
+ @maximum_magnitude = Sashite::GGN::MaximumMagnitude.new('42')
22
+ end
23
+
24
+ it 'returns the GGN as a JSON' do
25
+ @maximum_magnitude.as_json.must_equal 42
26
+ end
27
+
28
+ it 'returns the GGN as a string' do
29
+ @maximum_magnitude.to_s.must_equal '42'
30
+ end
31
+ end
32
+ end
33
+
34
+ it 'raises an error' do
35
+ -> { Sashite::GGN::MaximumMagnitude.new('0') }.must_raise ArgumentError
36
+ end
37
+ end
@@ -0,0 +1,51 @@
1
+ require_relative '_test_helper'
2
+
3
+ describe Sashite::GGN::Name do
4
+ describe '.new' do
5
+ describe 'capture' do
6
+ before do
7
+ @name = Sashite::GGN::Name.new('capture')
8
+ end
9
+
10
+ it 'returns the GGN as a JSON' do
11
+ @name.as_json.must_equal :capture
12
+ end
13
+
14
+ it 'returns the GGN as a string' do
15
+ @name.to_s.must_equal 'capture'
16
+ end
17
+ end
18
+
19
+ describe 'remove' do
20
+ before do
21
+ @name = Sashite::GGN::Name.new('remove')
22
+ end
23
+
24
+ it 'returns the GGN as a JSON' do
25
+ @name.as_json.must_equal :remove
26
+ end
27
+
28
+ it 'returns the GGN as a string' do
29
+ @name.to_s.must_equal 'remove'
30
+ end
31
+ end
32
+
33
+ describe 'shift' do
34
+ before do
35
+ @name = Sashite::GGN::Name.new('shift')
36
+ end
37
+
38
+ it 'returns the GGN as a JSON' do
39
+ @name.as_json.must_equal :shift
40
+ end
41
+
42
+ it 'returns the GGN as a string' do
43
+ @name.to_s.must_equal 'shift'
44
+ end
45
+ end
46
+ end
47
+
48
+ it 'raises an error' do
49
+ -> { Sashite::GGN::Name.new('foobar') }.must_raise ArgumentError
50
+ end
51
+ end
@@ -0,0 +1,21 @@
1
+ require_relative '_test_helper'
2
+
3
+ describe Sashite::GGN::NegativeInteger do
4
+ describe '.new' do
5
+ before do
6
+ @negative_integer = Sashite::GGN::NegativeInteger.new('-42')
7
+ end
8
+
9
+ it 'returns the GGN as a JSON' do
10
+ @negative_integer.as_json.must_equal -42
11
+ end
12
+
13
+ it 'returns the GGN as a string' do
14
+ @negative_integer.to_s.must_equal '-42'
15
+ end
16
+ end
17
+
18
+ it 'raises an error' do
19
+ -> { Sashite::GGN::NegativeInteger.new('42') }.must_raise ArgumentError
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ require_relative '_test_helper'
2
+
3
+ describe Sashite::GGN::Null do
4
+ describe '.instance' do
5
+ before do
6
+ @null = Sashite::GGN::Null.instance
7
+ end
8
+
9
+ it 'returns the GGN as a JSON' do
10
+ @null.as_json.must_be_nil
11
+ end
12
+
13
+ it 'returns the GGN as a string' do
14
+ @null.to_s.must_equal '_'
15
+ end
16
+ end
17
+
18
+ it 'is false' do
19
+ Sashite::GGN::Null.valid?('foobar').must_equal false
20
+ end
21
+ end
@@ -0,0 +1,35 @@
1
+ require_relative '_test_helper'
2
+
3
+ describe Sashite::GGN::Object do
4
+ describe '.new' do
5
+ before do
6
+ @object = Sashite::GGN::Object.new('_@f+all~_@f+all%self')
7
+ end
8
+
9
+ it 'returns the GGN as a JSON' do
10
+ @object.as_json.hash.must_equal(
11
+ {
12
+ src_square: {
13
+ :"...attacked?" => nil,
14
+ :"...occupied!" => false,
15
+ area: :all
16
+ },
17
+ dst_square: {
18
+ :"...attacked?" => nil,
19
+ :"...occupied!" => false,
20
+ area: :all
21
+ },
22
+ promotable_into_actors: [:self]
23
+ }.hash
24
+ )
25
+ end
26
+
27
+ it 'returns the GGN as a string' do
28
+ @object.to_s.must_equal '_@f+all~_@f+all%self'
29
+ end
30
+ end
31
+
32
+ it 'raises an error' do
33
+ -> { Sashite::GGN::Object.new('foo') }.must_raise ArgumentError
34
+ end
35
+ end
@@ -0,0 +1,102 @@
1
+ require_relative '_test_helper'
2
+
3
+ describe Sashite::GGN::Occupied do
4
+ describe '.new' do
5
+ describe 'an ally actor' do
6
+ before do
7
+ @occupied = Sashite::GGN::Occupied.new('an_ally_actor')
8
+ end
9
+
10
+ it 'returns the GGN as a JSON' do
11
+ @occupied.as_json.must_equal :an_ally_actor
12
+ end
13
+
14
+ it 'returns the GGN as a string' do
15
+ @occupied.to_s.must_equal 'an_ally_actor'
16
+ end
17
+ end
18
+
19
+ describe 'an enemy actor' do
20
+ before do
21
+ @occupied = Sashite::GGN::Occupied.new('an_enemy_actor')
22
+ end
23
+
24
+ it 'returns the GGN as a JSON' do
25
+ @occupied.as_json.must_equal :an_enemy_actor
26
+ end
27
+
28
+ it 'returns the GGN as a string' do
29
+ @occupied.to_s.must_equal 'an_enemy_actor'
30
+ end
31
+ end
32
+
33
+ describe 'null' do
34
+ before do
35
+ @occupied = Sashite::GGN::Occupied.new('_')
36
+ end
37
+
38
+ it 'returns the GGN as a JSON' do
39
+ @occupied.as_json.must_equal nil
40
+ end
41
+
42
+ it 'returns the GGN as a string' do
43
+ @occupied.to_s.must_equal '_'
44
+ end
45
+ end
46
+
47
+ describe 'true' do
48
+ before do
49
+ @occupied = Sashite::GGN::Occupied.new('t')
50
+ end
51
+
52
+ it 'returns the GGN as a JSON' do
53
+ @occupied.as_json.must_equal true
54
+ end
55
+
56
+ it 'returns the GGN as a string' do
57
+ @occupied.to_s.must_equal 't'
58
+ end
59
+ end
60
+
61
+ describe 'false' do
62
+ before do
63
+ @occupied = Sashite::GGN::Occupied.new('f')
64
+ end
65
+
66
+ it 'returns the GGN as a JSON' do
67
+ @occupied.as_json.must_equal false
68
+ end
69
+
70
+ it 'returns the GGN as a string' do
71
+ @occupied.to_s.must_equal 'f'
72
+ end
73
+ end
74
+
75
+ describe 'a subject' do
76
+ before do
77
+ @occupied = Sashite::GGN::Occupied.new('f<self>_&_')
78
+ end
79
+
80
+ it 'returns the GGN as a JSON' do
81
+ @occupied.as_json.hash.must_equal(
82
+ {
83
+ :"...ally?" => false,
84
+ actor: :self,
85
+ state: {
86
+ :"...last_moved_actor?" => nil,
87
+ :"...previous_moves_counter" => nil
88
+ }
89
+ }.hash
90
+ )
91
+ end
92
+
93
+ it 'returns the GGN as a string' do
94
+ @occupied.to_s.must_equal 'f<self>_&_'
95
+ end
96
+ end
97
+ end
98
+
99
+ it 'raises an error' do
100
+ -> { Sashite::GGN::Occupied.new('foobar') }.must_raise ArgumentError
101
+ end
102
+ end
@@ -0,0 +1,82 @@
1
+ require_relative '_test_helper'
2
+
3
+ describe Sashite::GGN::Pattern do
4
+ describe '.new' do
5
+ before do
6
+ @pattern = Sashite::GGN::Pattern.new('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')
7
+ end
8
+
9
+ it 'returns the GGN as a JSON' do
10
+ @pattern.as_json.hash.must_equal(
11
+ [
12
+ {
13
+ :"subject" => {
14
+ :"...ally?" => true,
15
+ :"actor" => :self,
16
+ :"state" => {
17
+ :"...last_moved_actor?" => nil,
18
+ :"...previous_moves_counter" => nil
19
+ }
20
+ },
21
+
22
+ :"verb" => {
23
+ :"name" => :shift,
24
+ :"vector" => {:"...maximum_magnitude" => nil, :direction => [-1,0]}
25
+ },
26
+
27
+ :"object" => {
28
+ :"src_square" => {
29
+ :"...attacked?" => nil,
30
+ :"...occupied!" => false,
31
+ :"area" => :all
32
+ },
33
+ :"dst_square" => {
34
+ :"...attacked?" => nil,
35
+ :"...occupied!" => false,
36
+ :"area" => :all
37
+ },
38
+ :"promotable_into_actors" => [:self]
39
+ }
40
+ },
41
+ {
42
+ :"subject" => {
43
+ :"...ally?" => true,
44
+ :"actor" => :self,
45
+ :"state" => {
46
+ :"...last_moved_actor?" => nil,
47
+ :"...previous_moves_counter" => nil
48
+ }
49
+ },
50
+
51
+ :"verb" => {
52
+ :"name" => :remove,
53
+ :"vector" => {:"...maximum_magnitude" => 1, :direction => [-1,0]}
54
+ },
55
+
56
+ :"object" => {
57
+ :"src_square" => {
58
+ :"...attacked?" => nil,
59
+ :"...occupied!" => false,
60
+ :"area" => :all
61
+ },
62
+ :"dst_square" => {
63
+ :"...attacked?" => nil,
64
+ :"...occupied!" => :an_enemy_actor,
65
+ :"area" => :all
66
+ },
67
+ :"promotable_into_actors" => [:self]
68
+ }
69
+ }
70
+ ].hash
71
+ )
72
+ end
73
+
74
+ it 'returns the GGN as a string' do
75
+ @pattern.to_s.must_equal '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'
76
+ end
77
+ end
78
+
79
+ it 'raises an error' do
80
+ -> { Sashite::GGN::Pattern.new('foobar') }.must_raise ArgumentError
81
+ end
82
+ end