chess 0.3.3 → 0.3.5
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.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +4 -4
- data/.gitignore +4 -4
- data/Gemfile +12 -0
- data/Gemfile.lock +55 -37
- data/Rakefile +2 -2
- data/chess.gemspec +2 -14
- data/ext/{chess.c → chess/chess.c} +1 -0
- data/ext/{extconf.rb → chess/extconf.rb} +3 -0
- data/lib/chess/game.rb +15 -10
- data/lib/chess/gnuchess.rb +2 -1
- data/lib/chess/pgn.rb +2 -2
- data/lib/chess/version.rb +1 -1
- data/lib/chess.rb +13 -5
- data/test/test_big_pgn_collection.rb +1 -1
- data/test/test_checkmate.rb +3 -1
- data/test/test_fifty_rule_move.rb +3 -1
- data/test/test_game.rb +9 -0
- data/test/test_helper.rb +2 -2
- data/test/test_illegal_moves.rb +1 -0
- data/test/test_insufficient_material.rb +7 -3
- data/test/test_load_fen.rb +6 -0
- data/test/test_move_generator.rb +2 -1
- data/test/test_pgn.rb +9 -3
- data/test/test_pgn_collection.rb +5 -2
- data/test/test_stalemate.rb +3 -1
- data/test/test_threefold_repetition.rb +3 -1
- data/test/test_uci_castling.rb +18 -0
- metadata +19 -173
- /data/ext/{MakefileC → chess/MakefileC} +0 -0
- /data/ext/{bitboard.c → chess/bitboard.c} +0 -0
- /data/ext/{bitboard.h → chess/bitboard.h} +0 -0
- /data/ext/{board.c → chess/board.c} +0 -0
- /data/ext/{board.h → chess/board.h} +0 -0
- /data/ext/{chess.h → chess/chess.h} +0 -0
- /data/ext/{common.c → chess/common.c} +0 -0
- /data/ext/{common.h → chess/common.h} +0 -0
- /data/ext/{game.c → chess/game.c} +0 -0
- /data/ext/{game.h → chess/game.h} +0 -0
- /data/ext/{special.c → chess/special.c} +0 -0
- /data/ext/{special.h → chess/special.h} +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d5ebf213b0cfe5414754b1e1de84f9b27a958980c9da5e52b09301419a0f51a3
|
4
|
+
data.tar.gz: b8d71f48aac60f4183d19c8d7407ee2c5d90ad591f734aeac8a49ce351989fa2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eca934b958eaae5a65d1b3cef8890a3093e27fa521ab73d9f0f70c11b18f7b1015fb3a0db9fbc528c5f2bcc101c4fb94db4a0b194020694972fd180e58581ad5
|
7
|
+
data.tar.gz: d5aeec92185bbc74206839fea269ddb088ed24c8dcad1c0e1dee9f294ef6299bdc355333f9415b47616abd5e87518b7969b314b56fb93d53667e652148c998a6
|
data/.github/workflows/ruby.yml
CHANGED
@@ -18,7 +18,7 @@ jobs:
|
|
18
18
|
runs-on: ubuntu-latest
|
19
19
|
strategy:
|
20
20
|
matrix:
|
21
|
-
ruby-version: ['2.
|
21
|
+
ruby-version: ['2.7', '3.0', '3.1', '3.2', '3.3']
|
22
22
|
|
23
23
|
steps:
|
24
24
|
- uses: actions/checkout@v2
|
@@ -28,14 +28,14 @@ jobs:
|
|
28
28
|
ruby-version: ${{ matrix.ruby-version }}
|
29
29
|
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
30
30
|
- name: Compile extension
|
31
|
-
working-directory: ./ext
|
31
|
+
working-directory: ./ext/chess
|
32
32
|
run: |
|
33
33
|
ruby extconf.rb
|
34
34
|
make
|
35
35
|
- name: Run tests
|
36
36
|
run: bundle exec rake test
|
37
37
|
env:
|
38
|
-
|
38
|
+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
39
39
|
# - name: Upload coverage report to Codecov
|
40
40
|
# uses: codecov/codecov-action@v1
|
41
41
|
# with:
|
@@ -45,7 +45,7 @@ jobs:
|
|
45
45
|
runs-on: ubuntu-latest
|
46
46
|
strategy:
|
47
47
|
matrix:
|
48
|
-
ruby-version: ['2.
|
48
|
+
ruby-version: ['2.7', '3.0', '3.1', '3.2', '3.3']
|
49
49
|
|
50
50
|
steps:
|
51
51
|
- uses: actions/checkout@v2
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
@@ -2,3 +2,15 @@ source 'http://rubygems.org'
|
|
2
2
|
|
3
3
|
# Specify your gem's dependencies in chess.gemspec
|
4
4
|
gemspec
|
5
|
+
|
6
|
+
gem 'bundler'
|
7
|
+
gem 'codecov'
|
8
|
+
gem 'debug'
|
9
|
+
gem 'minitest'
|
10
|
+
gem 'rake'
|
11
|
+
gem 'rubocop'
|
12
|
+
gem 'rubocop-minitest'
|
13
|
+
gem 'rubocop-performance'
|
14
|
+
gem 'rubocop-rake'
|
15
|
+
gem 'simplecov'
|
16
|
+
gem 'yard', '>= 0.9.20'
|
data/Gemfile.lock
CHANGED
@@ -1,55 +1,73 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
chess (0.3.
|
4
|
+
chess (0.3.5)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: http://rubygems.org/
|
8
8
|
specs:
|
9
9
|
ast (2.4.2)
|
10
|
-
byebug (11.1.3)
|
11
10
|
codecov (0.6.0)
|
12
11
|
simplecov (>= 0.15, < 0.22)
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
12
|
+
debug (1.9.2)
|
13
|
+
irb (~> 1.10)
|
14
|
+
reline (>= 0.3.8)
|
15
|
+
docile (1.4.1)
|
16
|
+
io-console (0.7.2)
|
17
|
+
irb (1.14.0)
|
18
|
+
rdoc (>= 4.0.0)
|
19
|
+
reline (>= 0.4.2)
|
20
|
+
json (2.7.2)
|
21
|
+
language_server-protocol (3.17.0.3)
|
22
|
+
minitest (5.25.1)
|
23
|
+
parallel (1.26.3)
|
24
|
+
parser (3.3.4.2)
|
18
25
|
ast (~> 2.4.1)
|
26
|
+
racc
|
27
|
+
psych (5.1.2)
|
28
|
+
stringio
|
29
|
+
racc (1.8.1)
|
19
30
|
rainbow (3.1.1)
|
20
|
-
rake (13.
|
21
|
-
|
22
|
-
|
23
|
-
|
31
|
+
rake (13.2.1)
|
32
|
+
rdoc (6.7.0)
|
33
|
+
psych (>= 4.0.0)
|
34
|
+
regexp_parser (2.9.2)
|
35
|
+
reline (0.5.9)
|
36
|
+
io-console (~> 0.5)
|
37
|
+
rexml (3.3.6)
|
38
|
+
strscan
|
39
|
+
rubocop (1.65.1)
|
24
40
|
json (~> 2.3)
|
41
|
+
language_server-protocol (>= 3.17.0)
|
25
42
|
parallel (~> 1.10)
|
26
|
-
parser (>= 3.
|
43
|
+
parser (>= 3.3.0.2)
|
27
44
|
rainbow (>= 2.2.2, < 4.0)
|
28
|
-
regexp_parser (>=
|
45
|
+
regexp_parser (>= 2.4, < 3.0)
|
29
46
|
rexml (>= 3.2.5, < 4.0)
|
30
|
-
rubocop-ast (>= 1.
|
47
|
+
rubocop-ast (>= 1.31.1, < 2.0)
|
31
48
|
ruby-progressbar (~> 1.7)
|
32
|
-
unicode-display_width (>=
|
33
|
-
rubocop-ast (1.
|
34
|
-
parser (>= 3.
|
35
|
-
rubocop-minitest (0.
|
36
|
-
rubocop (>=
|
37
|
-
|
38
|
-
|
39
|
-
rubocop
|
49
|
+
unicode-display_width (>= 2.4.0, < 3.0)
|
50
|
+
rubocop-ast (1.32.1)
|
51
|
+
parser (>= 3.3.1.0)
|
52
|
+
rubocop-minitest (0.35.1)
|
53
|
+
rubocop (>= 1.61, < 2.0)
|
54
|
+
rubocop-ast (>= 1.31.1, < 2.0)
|
55
|
+
rubocop-performance (1.21.1)
|
56
|
+
rubocop (>= 1.48.1, < 2.0)
|
57
|
+
rubocop-ast (>= 1.31.1, < 2.0)
|
40
58
|
rubocop-rake (0.6.0)
|
41
59
|
rubocop (~> 1.0)
|
42
|
-
ruby-progressbar (1.
|
60
|
+
ruby-progressbar (1.13.0)
|
43
61
|
simplecov (0.21.2)
|
44
62
|
docile (~> 1.1)
|
45
63
|
simplecov-html (~> 0.11)
|
46
64
|
simplecov_json_formatter (~> 0.1)
|
47
65
|
simplecov-html (0.12.3)
|
48
66
|
simplecov_json_formatter (0.1.4)
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
67
|
+
stringio (3.1.1)
|
68
|
+
strscan (3.1.0)
|
69
|
+
unicode-display_width (2.5.0)
|
70
|
+
yard (0.9.36)
|
53
71
|
|
54
72
|
PLATFORMS
|
55
73
|
ruby
|
@@ -57,17 +75,17 @@ PLATFORMS
|
|
57
75
|
x86_64-darwin-19
|
58
76
|
|
59
77
|
DEPENDENCIES
|
60
|
-
bundler
|
61
|
-
byebug (~> 11)
|
78
|
+
bundler
|
62
79
|
chess!
|
63
|
-
codecov
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
rubocop
|
68
|
-
rubocop-
|
69
|
-
rubocop-
|
70
|
-
|
80
|
+
codecov
|
81
|
+
debug
|
82
|
+
minitest
|
83
|
+
rake
|
84
|
+
rubocop
|
85
|
+
rubocop-minitest
|
86
|
+
rubocop-performance
|
87
|
+
rubocop-rake
|
88
|
+
simplecov
|
71
89
|
yard (>= 0.9.20)
|
72
90
|
|
73
91
|
BUNDLED WITH
|
data/Rakefile
CHANGED
@@ -2,7 +2,7 @@ require 'bundler/gem_tasks'
|
|
2
2
|
|
3
3
|
require 'yard'
|
4
4
|
YARD::Rake::YardocTask.new do |t|
|
5
|
-
t.files = ['lib/**/*.rb', 'ext
|
5
|
+
t.files = ['lib/**/*.rb', 'ext/**/*.c']
|
6
6
|
t.options << '-rREADME.md'
|
7
7
|
t.options << '--title=Chess'
|
8
8
|
t.options << '-mmarkdown'
|
@@ -12,7 +12,7 @@ end
|
|
12
12
|
require 'rake/testtask'
|
13
13
|
task default: :test
|
14
14
|
Rake::TestTask.new do |test|
|
15
|
-
test.libs
|
15
|
+
test.libs += %w[ext lib test]
|
16
16
|
test.warning = true
|
17
17
|
test.test_files = FileList["test/test_#{ENV.fetch('T', '*')}.rb"]
|
18
18
|
end
|
data/chess.gemspec
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
|
2
|
-
require 'chess/version'
|
1
|
+
require_relative 'lib/chess/version'
|
3
2
|
|
4
3
|
Gem::Specification.new do |s|
|
5
4
|
s.name = 'chess'
|
@@ -13,21 +12,10 @@ Gem::Specification.new do |s|
|
|
13
12
|
|
14
13
|
s.files = `git ls-files`.split("\n")
|
15
14
|
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
16
|
-
s.extensions = ['ext/extconf.rb']
|
15
|
+
s.extensions = ['ext/chess/extconf.rb']
|
17
16
|
s.require_paths = ['lib']
|
18
17
|
|
19
18
|
s.metadata['rubygems_mfa_required'] = 'true'
|
20
19
|
|
21
20
|
s.required_ruby_version = '>= 2.5'
|
22
|
-
s.add_development_dependency 'bundler', '~> 2'
|
23
|
-
s.add_development_dependency 'byebug', '~> 11'
|
24
|
-
s.add_development_dependency 'codecov', '~> 0'
|
25
|
-
s.add_development_dependency 'minitest', '~> 5'
|
26
|
-
s.add_development_dependency 'rake', '~> 13'
|
27
|
-
s.add_development_dependency 'rubocop', '~> 1'
|
28
|
-
s.add_development_dependency 'rubocop-minitest', '~> 0'
|
29
|
-
s.add_development_dependency 'rubocop-performance', '~> 1'
|
30
|
-
s.add_development_dependency 'rubocop-rake', '~> 0'
|
31
|
-
s.add_development_dependency 'simplecov', '~> 0'
|
32
|
-
s.add_development_dependency 'yard', '>= 0.9.20'
|
33
21
|
end
|
@@ -716,6 +716,7 @@ Init_chess ()
|
|
716
716
|
* This ensures a fast library.
|
717
717
|
*/
|
718
718
|
board_klass = rb_define_class_under (chess, "Board", rb_cObject);
|
719
|
+
rb_undef_alloc_func (board_klass);
|
719
720
|
rb_define_method (board_klass, "placement", board_placement, 0);
|
720
721
|
rb_define_method (board_klass, "[]", board_get_piece, 1);
|
721
722
|
rb_define_method (board_klass, "check?", board_king_in_check, 0);
|
data/lib/chess/game.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), '../../ext/chess')
|
2
|
-
|
3
1
|
module Chess
|
4
2
|
# This class rappresents a chess game.
|
5
3
|
class Game < CGame
|
@@ -157,14 +155,8 @@ module Chess
|
|
157
155
|
expand[:from] = match[2] if match[2] && match[2].size == 2
|
158
156
|
|
159
157
|
# Support UCI protocol (Lichess)
|
160
|
-
|
161
|
-
|
162
|
-
expand[:to] = 'g1' if expand[:to] == 'h1' # UCI protocol (Lichess) white king short castling
|
163
|
-
expand[:to] = 'c1' if expand[:to] == 'a1' # UCI protocol (Lichess) white king long castling
|
164
|
-
when 'e8'
|
165
|
-
expand[:to] = 'g8' if expand[:to] == 'h8' # UCI protocol (Lichess) black king short castling
|
166
|
-
expand[:to] = 'c8' if expand[:to] == 'a8' # UCI protocol (Lichess) black king long castling
|
167
|
-
end
|
158
|
+
uci_to_coord = uci_castling_to_coord(expand[:from], expand[:to])
|
159
|
+
expand[:to] = uci_to_coord if uci_to_coord
|
168
160
|
|
169
161
|
return expand
|
170
162
|
end
|
@@ -183,6 +175,19 @@ module Chess
|
|
183
175
|
|
184
176
|
raise BadNotationError.new(notation)
|
185
177
|
end
|
178
|
+
|
179
|
+
# Support Castling notation valid in UCI (Universal Chess Interface)
|
180
|
+
# protocol (Lichess)
|
181
|
+
def uci_castling_to_coord(from, to)
|
182
|
+
if from == 'e1' && self.board['e1'] == 'K'
|
183
|
+
return 'g1' if to == 'h1' # UCI protocol (Lichess) white king short castling
|
184
|
+
return 'c1' if to == 'a1' # UCI protocol (Lichess) white king long castling
|
185
|
+
elsif from == 'e8' && self.board['e8'] == 'k'
|
186
|
+
return 'g8' if to == 'h8' # UCI protocol (Lichess) black king short castling
|
187
|
+
return 'c8' if to == 'a8' # UCI protocol (Lichess) black king long castling
|
188
|
+
end
|
189
|
+
return nil
|
190
|
+
end
|
186
191
|
end
|
187
192
|
|
188
193
|
MOVE_REGEXP = /^([RNBQK])?([a-h]|[1-8]|[a-h][1-8])?(?:x)?([a-h][1-8])(?:=?([RrNnBbQq]))?(?:ep)?(?:\+|\#)?$/.freeze
|
data/lib/chess/gnuchess.rb
CHANGED
@@ -75,7 +75,8 @@ module Chess
|
|
75
75
|
until done
|
76
76
|
pipe.write("go\n")
|
77
77
|
while (line = pipe.gets)
|
78
|
-
break if
|
78
|
+
break if line.include?('My move is : ')
|
79
|
+
break if line.include?(' : resign')
|
79
80
|
|
80
81
|
if / : 1-0 {White mates}/.match?(line)
|
81
82
|
done = :white_won
|
data/lib/chess/pgn.rb
CHANGED
@@ -62,7 +62,7 @@ module Chess
|
|
62
62
|
def load_from_string(str, check_moves: false)
|
63
63
|
str.gsub!(/\{.*?\}/, '') # remove comments
|
64
64
|
TAGS.each do |t|
|
65
|
-
instance_variable_set("@#{t}", str.match(/^\[#{t.capitalize} ".*"\]\s?$/).to_s.strip[t.size + 3..-3])
|
65
|
+
instance_variable_set(:"@#{t}", str.match(/^\[#{t.capitalize} ".*"\]\s?$/).to_s.strip[t.size + 3..-3])
|
66
66
|
end
|
67
67
|
@result = '1/2-1/2' if @result == '1/2'
|
68
68
|
game_index = str.index(/^1\./)
|
@@ -82,7 +82,7 @@ module Chess
|
|
82
82
|
def to_s
|
83
83
|
s = ''
|
84
84
|
TAGS.each do |t|
|
85
|
-
tag = instance_variable_defined?("@#{t}") ? instance_variable_get("@#{t}") : ''
|
85
|
+
tag = instance_variable_defined?(:"@#{t}") ? instance_variable_get(:"@#{t}") : ''
|
86
86
|
s << "[#{t.capitalize} \"#{tag}\"]\n"
|
87
87
|
end
|
88
88
|
s << "\n"
|
data/lib/chess/version.rb
CHANGED
data/lib/chess.rb
CHANGED
@@ -1,5 +1,13 @@
|
|
1
|
-
require 'chess/
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
require 'chess/chess' # this is the compiled ruby extension (chess.so or chess.bundle)
|
2
|
+
require_relative 'chess/exceptions'
|
3
|
+
require_relative 'chess/game'
|
4
|
+
require_relative 'chess/gnuchess'
|
5
|
+
require_relative 'chess/pgn'
|
6
|
+
require_relative 'chess/version'
|
7
|
+
|
8
|
+
# While development to require 'chess' from irb run with `irb -I lib:ext`
|
9
|
+
# $ irb -I lib:ext
|
10
|
+
# irb(main):001:0> require 'chess'
|
11
|
+
# => true
|
12
|
+
# irb(main):002:0> Chess::Game.new
|
13
|
+
# => #<Chess::Game:0x0000000000000001>
|
@@ -8,7 +8,7 @@ class ChessTest < Minitest::Test
|
|
8
8
|
path = File.join(TestHelper::BIG_PGN_COLLECTION, filename)
|
9
9
|
break unless File.exist?(path)
|
10
10
|
|
11
|
-
define_method "test_big_pgn_#{filename}" do
|
11
|
+
define_method :"test_big_pgn_#{filename}" do
|
12
12
|
pgn = Chess::Pgn.new(path)
|
13
13
|
game = Chess::Game.new(pgn.moves)
|
14
14
|
assert(game.checkmate?) if pgn.moves.last.match?(/\#$/)
|
data/test/test_checkmate.rb
CHANGED
@@ -4,9 +4,11 @@ class ChessTest < Minitest::Test
|
|
4
4
|
TestHelper.pgns('checkmate').each do |file|
|
5
5
|
name = File.basename(file, '.pgn')
|
6
6
|
win = file.include?('white') ? 'white' : 'black'
|
7
|
-
|
7
|
+
|
8
|
+
define_method :"test_#{win}_checkmate_#{name}" do
|
8
9
|
pgn = Chess::Pgn.new(file)
|
9
10
|
game = Chess::Game.new(pgn.moves)
|
11
|
+
|
10
12
|
assert(game.board.checkmate?)
|
11
13
|
if file.include?('white_won')
|
12
14
|
assert_equal('1-0', game.result)
|
@@ -3,9 +3,11 @@ require 'test_helper'
|
|
3
3
|
class ChessTest < Minitest::Test
|
4
4
|
TestHelper.pgns('fifty_move_rule').each do |file|
|
5
5
|
name = File.basename(file, '.pgn')
|
6
|
-
|
6
|
+
|
7
|
+
define_method :"test_fifty_move_rule_#{name}" do
|
7
8
|
pgn = Chess::Pgn.new(file)
|
8
9
|
game = Chess::Game.new(pgn.moves)
|
10
|
+
|
9
11
|
assert game.board.fifty_move_rule?
|
10
12
|
end
|
11
13
|
end
|
data/test/test_game.rb
CHANGED
@@ -4,24 +4,28 @@ class ChessTest < Minitest::Test
|
|
4
4
|
def test_moves
|
5
5
|
game = Chess::Game.new
|
6
6
|
game.moves = %w[e4 e5]
|
7
|
+
|
7
8
|
assert_equal %w[e4 e5], game.moves
|
8
9
|
end
|
9
10
|
|
10
11
|
def test_active_player
|
11
12
|
game = Chess::Game.new
|
12
13
|
game << 'a3'
|
14
|
+
|
13
15
|
assert_equal :black, game.active_player
|
14
16
|
end
|
15
17
|
|
16
18
|
def test_inactive_player
|
17
19
|
game = Chess::Game.new
|
18
20
|
game.moves = %w[a3 f5]
|
21
|
+
|
19
22
|
assert_equal :black, game.inactive_player
|
20
23
|
end
|
21
24
|
|
22
25
|
def test_status_white_won_resign
|
23
26
|
game = Chess::Game.new
|
24
27
|
game.resign(:black)
|
28
|
+
|
25
29
|
assert_equal :white_won_resign, game.status
|
26
30
|
assert game.over?
|
27
31
|
assert_equal '1-0', game.result
|
@@ -31,6 +35,7 @@ class ChessTest < Minitest::Test
|
|
31
35
|
game = Chess::Game.new
|
32
36
|
game << 'e4'
|
33
37
|
game.resign(:white)
|
38
|
+
|
34
39
|
assert_equal :black_won_resign, game.status
|
35
40
|
assert game.over?
|
36
41
|
assert_equal '0-1', game.result
|
@@ -39,6 +44,7 @@ class ChessTest < Minitest::Test
|
|
39
44
|
def test_status_insufficient_material
|
40
45
|
pgn = TestHelper.pick_pgn('insufficient_material/0001.pgn')
|
41
46
|
game = Chess::Game.new(pgn.moves)
|
47
|
+
|
42
48
|
assert_equal :insufficient_material, game.status
|
43
49
|
end
|
44
50
|
|
@@ -46,6 +52,7 @@ class ChessTest < Minitest::Test
|
|
46
52
|
pgn = TestHelper.pick_pgn('fifty_move_rule/0001.pgn')
|
47
53
|
game = Chess::Game.new(pgn.moves)
|
48
54
|
game.draw
|
55
|
+
|
49
56
|
assert_equal :fifty_move_rule, game.status
|
50
57
|
end
|
51
58
|
|
@@ -53,12 +60,14 @@ class ChessTest < Minitest::Test
|
|
53
60
|
pgn = TestHelper.pick_pgn('threefold_repetition/0001.pgn')
|
54
61
|
game = Chess::Game.new(pgn.moves)
|
55
62
|
game.draw
|
63
|
+
|
56
64
|
assert_equal :threefold_repetition, game.status
|
57
65
|
end
|
58
66
|
|
59
67
|
def test_pgn
|
60
68
|
pgn = TestHelper.pick_pgn('valid/0001.pgn')
|
61
69
|
game = Chess::Game.new(pgn.moves)
|
70
|
+
|
62
71
|
expected_pgn = <<~PGN
|
63
72
|
[Event ""]
|
64
73
|
[Site ""]
|
data/test/test_helper.rb
CHANGED
@@ -2,14 +2,14 @@ require 'simplecov'
|
|
2
2
|
SimpleCov.start do
|
3
3
|
add_filter 'lib/chess/gnuchess.rb'
|
4
4
|
end
|
5
|
-
if ENV['
|
5
|
+
if ENV['CODECOV_TOKEN']
|
6
6
|
require 'codecov'
|
7
7
|
SimpleCov.formatter = SimpleCov::Formatter::Codecov
|
8
8
|
end
|
9
9
|
|
10
10
|
require 'chess'
|
11
|
+
require 'debug'
|
11
12
|
require 'minitest/autorun'
|
12
|
-
require 'byebug'
|
13
13
|
|
14
14
|
module TestHelper
|
15
15
|
PGN_COLLECTION = 'test/pgn_collection'.freeze
|
data/test/test_illegal_moves.rb
CHANGED
@@ -15,15 +15,17 @@ class ChessTest < Minitest::Test
|
|
15
15
|
].freeze
|
16
16
|
|
17
17
|
FENS.each_with_index do |fen, i|
|
18
|
-
define_method
|
18
|
+
define_method :"test_insufficient_material_by_fen_#{i}" do
|
19
19
|
game = Chess::Game.load_fen(fen)
|
20
|
+
|
20
21
|
assert game.board.insufficient_material?
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
24
25
|
ONLY_KINGS_FENS.each_with_index do |fen, i|
|
25
|
-
define_method
|
26
|
+
define_method :"test_only_kings_by_fen_#{i}" do
|
26
27
|
game = Chess::Game.load_fen(fen)
|
28
|
+
|
27
29
|
assert game.board.insufficient_material?
|
28
30
|
assert game.board.only_kings?
|
29
31
|
end
|
@@ -31,9 +33,11 @@ class ChessTest < Minitest::Test
|
|
31
33
|
|
32
34
|
TestHelper.pgns('insufficient_material').each do |file|
|
33
35
|
name = File.basename(file, '.pgn')
|
34
|
-
|
36
|
+
|
37
|
+
define_method :"test_insufficient_material_#{name}" do
|
35
38
|
pgn = Chess::Pgn.new(file)
|
36
39
|
game = Chess::Game.new(pgn.moves)
|
40
|
+
|
37
41
|
assert game.board.insufficient_material?
|
38
42
|
end
|
39
43
|
end
|
data/test/test_load_fen.rb
CHANGED
@@ -3,6 +3,7 @@ require 'test_helper'
|
|
3
3
|
class ChessTest < Minitest::Test
|
4
4
|
def test_fen_in_progress
|
5
5
|
g = Chess::Game.load_fen('rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - 1 2')
|
6
|
+
|
6
7
|
assert_equal 'P', g.board['e4']
|
7
8
|
assert_equal 'p', g.board['c5']
|
8
9
|
assert_equal 'K', g.board[4]
|
@@ -12,6 +13,7 @@ class ChessTest < Minitest::Test
|
|
12
13
|
|
13
14
|
def test_fen_white_won
|
14
15
|
g = Chess::Game.load_fen('rnbqkbnr/1ppp1Qpp/8/p3p3/2B1P3/8/PPPP1PPP/RNB1K1NR b KQkq - 1 3')
|
16
|
+
|
15
17
|
assert_equal 'Q', g.board['f7']
|
16
18
|
assert_equal 'p', g.board['e5']
|
17
19
|
assert_equal 'P', g.board[28]
|
@@ -21,6 +23,7 @@ class ChessTest < Minitest::Test
|
|
21
23
|
|
22
24
|
def test_fen_black_won
|
23
25
|
g = Chess::Game.load_fen('rnb1kbnr/pppp1ppp/4p3/8/5PPq/8/PPPPP2P/RNBQKBNR w KQkq - 1 3')
|
26
|
+
|
24
27
|
assert_equal 'q', g.board['h4']
|
25
28
|
assert_equal 'P', g.board['f4']
|
26
29
|
assert_equal 'p', g.board[44]
|
@@ -30,6 +33,7 @@ class ChessTest < Minitest::Test
|
|
30
33
|
|
31
34
|
def test_fen_stalemate
|
32
35
|
g = Chess::Game.load_fen('8/6b1/8/8/8/n7/PP6/K7 w KQkq - 1 3')
|
36
|
+
|
33
37
|
assert_equal 'b', g.board['g7']
|
34
38
|
assert_equal 'n', g.board['a3']
|
35
39
|
assert_equal 'K', g.board[0]
|
@@ -40,12 +44,14 @@ class ChessTest < Minitest::Test
|
|
40
44
|
def test_fen_castling_from
|
41
45
|
g = Chess::Game.load_fen('2b1kbnr/rpq1pp1p/2n3p1/8/3Q4/2P5/PP3PPP/RN2KBNR w KQk - 0 9')
|
42
46
|
g.move('Kd1')
|
47
|
+
|
43
48
|
assert_equal '2b1kbnr/rpq1pp1p/2n3p1/8/3Q4/2P5/PP3PPP/RN1K1BNR b k - 1 9', g.board.to_fen
|
44
49
|
end
|
45
50
|
|
46
51
|
def test_fen_castling_to
|
47
52
|
g = Chess::Game.load_fen('2b1kbnr/rpq1pp1p/2n3p1/8/3Q4/2P5/PP3PPP/RN2KBNR w KQk - 0 9')
|
48
53
|
g.move('Qh8')
|
54
|
+
|
49
55
|
assert_equal '2b1kbnQ/rpq1pp1p/2n3p1/8/8/2P5/PP3PPP/RN2KBNR b KQ - 0 9', g.board.to_fen
|
50
56
|
end
|
51
57
|
end
|
data/test/test_move_generator.rb
CHANGED
@@ -17,10 +17,11 @@ class ChessTest < Minitest::Test
|
|
17
17
|
}.freeze
|
18
18
|
|
19
19
|
GENS.each do |fen, generators|
|
20
|
-
define_method
|
20
|
+
define_method :"test_move_generator_#{fen}" do
|
21
21
|
game = Chess::Game.load_fen(fen)
|
22
22
|
generators.each do |from, moves|
|
23
23
|
result = game.board.generate_moves(from)
|
24
|
+
|
24
25
|
assert_equal moves.sort, result.sort
|
25
26
|
end
|
26
27
|
end
|
data/test/test_pgn.rb
CHANGED
@@ -3,7 +3,8 @@ require 'test_helper'
|
|
3
3
|
class ChessTest < Minitest::Test
|
4
4
|
TestHelper.pgns('invalid').each do |file|
|
5
5
|
name = File.basename(file, '.pgn')
|
6
|
-
|
6
|
+
|
7
|
+
define_method :"test_invalid_pgn_#{name}" do
|
7
8
|
assert_raises(Chess::InvalidPgnFormatError) do
|
8
9
|
Chess::Pgn.new(file)
|
9
10
|
end
|
@@ -12,7 +13,8 @@ class ChessTest < Minitest::Test
|
|
12
13
|
|
13
14
|
TestHelper.pgns('illegal').each do |file|
|
14
15
|
name = File.basename(file, '.pgn')
|
15
|
-
|
16
|
+
|
17
|
+
define_method :"test_illegal_pgn_#{name}" do
|
16
18
|
assert_raises(Chess::IllegalMoveError) do
|
17
19
|
Chess::Pgn.new(file, check_moves: true)
|
18
20
|
end
|
@@ -33,6 +35,7 @@ class ChessTest < Minitest::Test
|
|
33
35
|
PGN
|
34
36
|
pgn = Chess::Pgn.new
|
35
37
|
pgn.load_from_string(pgn_string, check_moves: true)
|
38
|
+
|
36
39
|
assert_equal '70th ch-ITA', pgn.event
|
37
40
|
assert_equal 'Siena ITA', pgn.site
|
38
41
|
assert_equal '10', pgn.round
|
@@ -57,6 +60,7 @@ class ChessTest < Minitest::Test
|
|
57
60
|
PGN
|
58
61
|
pgn = Chess::Pgn.new
|
59
62
|
pgn.load_from_string(pgn_string, check_moves: true)
|
63
|
+
|
60
64
|
assert_nil pgn.event
|
61
65
|
assert_nil pgn.site
|
62
66
|
assert_nil pgn.round
|
@@ -80,10 +84,10 @@ class ChessTest < Minitest::Test
|
|
80
84
|
pgn.white = 'Pioz'
|
81
85
|
pgn.black = 'Elizabeth Harmon'
|
82
86
|
pgn.write(tempfile.path)
|
83
|
-
|
84
87
|
loaded_pgn = Chess::Pgn.new
|
85
88
|
loaded_pgn.load(tempfile.path)
|
86
89
|
tempfile.delete
|
90
|
+
|
87
91
|
assert_equal 'Ruby Chess Tournament', loaded_pgn.event
|
88
92
|
assert_equal 'Ruby Chess test suite', loaded_pgn.site
|
89
93
|
assert_equal '1984.10.21', loaded_pgn.date
|
@@ -97,9 +101,11 @@ class ChessTest < Minitest::Test
|
|
97
101
|
def test_set_date
|
98
102
|
pgn = Chess::Pgn.new
|
99
103
|
pgn.date = Time.parse('21-10-1984')
|
104
|
+
|
100
105
|
assert_equal '1984.10.21', pgn.date
|
101
106
|
|
102
107
|
pgn.date = '1984.10.21'
|
108
|
+
|
103
109
|
assert_equal '1984.10.21', pgn.date
|
104
110
|
end
|
105
111
|
end
|
data/test/test_pgn_collection.rb
CHANGED
@@ -3,7 +3,8 @@ require 'test_helper'
|
|
3
3
|
class ChessTest < Minitest::Test
|
4
4
|
TestHelper.pgns('valid').each do |file|
|
5
5
|
name = File.basename(file, '.pgn')
|
6
|
-
|
6
|
+
|
7
|
+
define_method :"test_pgn_#{name}" do
|
7
8
|
pgn = Chess::Pgn.new(file)
|
8
9
|
game = Chess::Game.new
|
9
10
|
pgn.moves.each do |m|
|
@@ -12,9 +13,11 @@ class ChessTest < Minitest::Test
|
|
12
13
|
assert(game.board.checkmate?) if m.match?(/\#$/)
|
13
14
|
end
|
14
15
|
end
|
15
|
-
|
16
|
+
|
17
|
+
define_method :"test_pgn_result_#{name}" do
|
16
18
|
pgn = Chess::Pgn.new(file)
|
17
19
|
game = Chess::Game.load_pgn(file)
|
20
|
+
|
18
21
|
assert_equal(pgn.result, game.result)
|
19
22
|
end
|
20
23
|
end
|
data/test/test_stalemate.rb
CHANGED
@@ -3,9 +3,11 @@ require 'test_helper'
|
|
3
3
|
class ChessTest < Minitest::Test
|
4
4
|
TestHelper.pgns('stalemate').each do |file|
|
5
5
|
name = File.basename(file, '.pgn')
|
6
|
-
|
6
|
+
|
7
|
+
define_method :"test_stalemate_#{name}" do
|
7
8
|
pgn = Chess::Pgn.new(file)
|
8
9
|
game = Chess::Game.new(pgn.moves)
|
10
|
+
|
9
11
|
assert(game.board.stalemate?)
|
10
12
|
assert_equal('1/2-1/2', game.result)
|
11
13
|
end
|
@@ -3,9 +3,11 @@ require 'test_helper'
|
|
3
3
|
class ChessTest < Minitest::Test
|
4
4
|
TestHelper.pgns('threefold_repetition').each do |file|
|
5
5
|
name = File.basename(file, '.pgn')
|
6
|
-
|
6
|
+
|
7
|
+
define_method :"test_threefold_repetition_#{name}" do
|
7
8
|
pgn = Chess::Pgn.new(file)
|
8
9
|
game = Chess::Game.new(pgn.moves)
|
10
|
+
|
9
11
|
assert game.threefold_repetition?
|
10
12
|
end
|
11
13
|
end
|
data/test/test_uci_castling.rb
CHANGED
@@ -4,24 +4,28 @@ class UCICastrlingTest < Minitest::Test
|
|
4
4
|
def test_uci_white_short_castling
|
5
5
|
game = Chess::Game.new
|
6
6
|
game.moves = %w[e4 c5 c3 d5 exd5 Qxd5 d4 Nf6 Nf3 e6 Be2 Be7 e1h1 Nc6]
|
7
|
+
|
7
8
|
assert_equal '*', game.result
|
8
9
|
end
|
9
10
|
|
10
11
|
def test_uci_white_long_castling
|
11
12
|
game = Chess::Game.new
|
12
13
|
game.moves = %w[e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 Nf6 Nc3 d6 Bg5 Qb6 Nb3 e6 Qd2 Be7 e1a1]
|
14
|
+
|
13
15
|
assert_equal '*', game.result
|
14
16
|
end
|
15
17
|
|
16
18
|
def test_uci_black_short_castling
|
17
19
|
game = Chess::Game.new
|
18
20
|
game.moves = %w[d4 d5 c4 dxc4 e4 e5 Nf3 Bb4+ Nc3 exd4 Nxd4 Ne7 Bf4 Bxc3+ bxc3 Ng6 Bg3 Qe7 Bxc4 Qxe4+ Qe2 Qxe2+ Bxe2 Na6 Rb1 e8h8]
|
21
|
+
|
19
22
|
assert_equal '*', game.result
|
20
23
|
end
|
21
24
|
|
22
25
|
def test_uci_black_long_castling
|
23
26
|
game = Chess::Game.new
|
24
27
|
game.moves = %w[e4 c5 Nf3 d6 d4 cxd4 Qxd4 Nc6 Bb5 Bd7 Bxc6 Bxc6 Bg5 Nf6 Bxf6 gxf6 Nc3 e6 e1c1 Be7 Rhe1 Rg8 Qe3 Rxg2 Rg1 Rg6 Nd4 Qb6 h4 e8a8]
|
28
|
+
|
25
29
|
assert_equal '*', game.result
|
26
30
|
end
|
27
31
|
|
@@ -31,4 +35,18 @@ class UCICastrlingTest < Minitest::Test
|
|
31
35
|
game.moves = %w[e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 Nf6 Nc3 d6 Bg5 Qb6 Nb3 e6 Qd2 Be7 e8a8]
|
32
36
|
end
|
33
37
|
end
|
38
|
+
|
39
|
+
def test_github_issue31
|
40
|
+
g = Chess::Game.load_fen('4Q3/8/8/8/8/8/4K3/7k w - - 0 1')
|
41
|
+
|
42
|
+
assert_equal 'Q', g.board['e8']
|
43
|
+
assert_equal 'K', g.board['e2']
|
44
|
+
assert_equal 'k', g.board['h1']
|
45
|
+
assert_equal '*', g.result
|
46
|
+
assert_equal :in_progress, g.status
|
47
|
+
|
48
|
+
g << 'e8a8' # It should not be considered as a UCI casting
|
49
|
+
|
50
|
+
assert_equal 'Q', g.board['a8']
|
51
|
+
end
|
34
52
|
end
|
metadata
CHANGED
@@ -1,175 +1,21 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chess
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Enrico Pilotto
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: bundler
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '2'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '2'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: byebug
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '11'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '11'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: codecov
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: minitest
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '5'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '5'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rake
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '13'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '13'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: rubocop
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '1'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '1'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: rubocop-minitest
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - "~>"
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - "~>"
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: rubocop-performance
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - "~>"
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '1'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - "~>"
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '1'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: rubocop-rake
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - "~>"
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - "~>"
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '0'
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: simplecov
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - "~>"
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: '0'
|
146
|
-
type: :development
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - "~>"
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: '0'
|
153
|
-
- !ruby/object:Gem::Dependency
|
154
|
-
name: yard
|
155
|
-
requirement: !ruby/object:Gem::Requirement
|
156
|
-
requirements:
|
157
|
-
- - ">="
|
158
|
-
- !ruby/object:Gem::Version
|
159
|
-
version: 0.9.20
|
160
|
-
type: :development
|
161
|
-
prerelease: false
|
162
|
-
version_requirements: !ruby/object:Gem::Requirement
|
163
|
-
requirements:
|
164
|
-
- - ">="
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version: 0.9.20
|
11
|
+
date: 2024-08-28 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
167
13
|
description: A fast chess library that use bitboards to play chess with Ruby.
|
168
14
|
email:
|
169
15
|
- epilotto@gmx.com
|
170
16
|
executables: []
|
171
17
|
extensions:
|
172
|
-
- ext/extconf.rb
|
18
|
+
- ext/chess/extconf.rb
|
173
19
|
extra_rdoc_files: []
|
174
20
|
files:
|
175
21
|
- ".github/FUNDING.yml"
|
@@ -207,20 +53,20 @@ files:
|
|
207
53
|
- docs/js/jquery.js
|
208
54
|
- docs/method_list.html
|
209
55
|
- docs/top-level-namespace.html
|
210
|
-
- ext/MakefileC
|
211
|
-
- ext/bitboard.c
|
212
|
-
- ext/bitboard.h
|
213
|
-
- ext/board.c
|
214
|
-
- ext/board.h
|
215
|
-
- ext/chess.c
|
216
|
-
- ext/chess.h
|
217
|
-
- ext/common.c
|
218
|
-
- ext/common.h
|
219
|
-
- ext/extconf.rb
|
220
|
-
- ext/game.c
|
221
|
-
- ext/game.h
|
222
|
-
- ext/special.c
|
223
|
-
- ext/special.h
|
56
|
+
- ext/chess/MakefileC
|
57
|
+
- ext/chess/bitboard.c
|
58
|
+
- ext/chess/bitboard.h
|
59
|
+
- ext/chess/board.c
|
60
|
+
- ext/chess/board.h
|
61
|
+
- ext/chess/chess.c
|
62
|
+
- ext/chess/chess.h
|
63
|
+
- ext/chess/common.c
|
64
|
+
- ext/chess/common.h
|
65
|
+
- ext/chess/extconf.rb
|
66
|
+
- ext/chess/game.c
|
67
|
+
- ext/chess/game.h
|
68
|
+
- ext/chess/special.c
|
69
|
+
- ext/chess/special.h
|
224
70
|
- lib/chess.rb
|
225
71
|
- lib/chess/exceptions.rb
|
226
72
|
- lib/chess/game.rb
|
@@ -1471,7 +1317,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
1471
1317
|
- !ruby/object:Gem::Version
|
1472
1318
|
version: '0'
|
1473
1319
|
requirements: []
|
1474
|
-
rubygems_version: 3.
|
1320
|
+
rubygems_version: 3.5.11
|
1475
1321
|
signing_key:
|
1476
1322
|
specification_version: 4
|
1477
1323
|
summary: A fast chess library to play chess with Ruby.
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|