icu_tournament 1.0.5 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -101,6 +101,8 @@ The full list of supported methods is:
101
101
  * _Harkness_ (or _median_): like Buchholz except the highest and lowest opponents' scores are discarded (or two highest and lowest if 9 rounds or more)
102
102
  * _modified_median_: same as Harkness except only lowest (or highest) score(s) are discarded for players with more (or less) than 50%
103
103
  * _Neustadtl_ (or _Sonneborn-Berger_): sum of scores of players defeated plus half sum of scores of players drawn against
104
+ * _progressive_ (or _cumulative_): sum of running score for each round
105
+ * _ratings_: sum of opponents ratings
104
106
  * _blacks_: number of blacks
105
107
  * _wins_: number of wins
106
108
  * _name_: alphabetical by name (if _tie_breaks_ is set to an empty array, as it is initially, then this will be used as the back-up tie breaker)
@@ -215,12 +217,13 @@ The return value from _renumber_ is the tournament object itself.
215
217
  when 'sonneborn_berger' then 'neustadtl'
216
218
  when 'modified_median' then 'modified'
217
219
  when 'median' then 'harkness'
220
+ when 'cumulative' then 'progressive'
218
221
  else m
219
222
  end
220
223
  end
221
224
 
222
225
  # Check they're all valid.
223
- tie_breaks.each { |m| raise "invalid tie break method '#{m}'" unless m.to_s.match(/^(blacks|buchholz|harkness|modified|name|neustadtl|wins)$/) }
226
+ tie_breaks.each { |m| raise "invalid tie break method '#{m}'" unless m.to_s.match(/^(blacks|buchholz|harkness|modified|name|neustadtl|progressive|ratings|wins)$/) }
224
227
 
225
228
  # Finally set them.
226
229
  @tie_breaks = tie_breaks;
@@ -469,27 +472,25 @@ The return value from _renumber_ is the tournament object itself.
469
472
  # Add the configured methods.
470
473
  tie_breaks.each do |m|
471
474
  methods << m
472
- order[m] = -1
475
+ order[m] = m == 'name' ? 1 : -1
473
476
  end
474
477
 
475
478
  # Name is included as the last and least important tie breaker unless it's already been added.
476
479
  unless methods.include?('name')
477
480
  methods << 'name'
478
- order['name'] = +1
481
+ order['name'] = 1
479
482
  end
480
483
 
481
484
  # We'll need the number of rounds.
482
485
  rounds = last_round
483
486
 
484
- # Pre-calculate some scores that are not in themselves tie break score
487
+ # Pre-calculate some scores that are not in themselves tie break scores
485
488
  # but are needed in the calculation of some of the actual tie-break scores.
486
489
  pre_calculated = Array.new
487
490
  pre_calculated << 'opp-score' # sum scores where a non-played games counts 0.5
488
491
  pre_calculated.each do |m|
489
492
  data[m] = Hash.new
490
- @player.values.each do |p|
491
- data[m][p.num] = tie_break_score(data, m, p, rounds)
492
- end
493
+ @player.values.each { |p| data[m][p.num] = tie_break_score(data, m, p, rounds) }
493
494
  end
494
495
 
495
496
  # Now calculate all the other scores.
@@ -506,12 +507,14 @@ The return value from _renumber_ is the tournament object itself.
506
507
  # Return a tie break score for a given player and a given tie break method.
507
508
  def tie_break_score(hash, method, player, rounds)
508
509
  case method
509
- when 'score' then player.points
510
- when 'wins' then player.results.inject(0) { |t,r| t + (r.opponent && r.score == 'W' ? 1 : 0) }
511
- when 'blacks' then player.results.inject(0) { |t,r| t + (r.opponent && r.colour == 'B' ? 1 : 0) }
512
- when 'buchholz' then player.results.inject(0.0) { |t,r| t + (r.opponent ? hash['opp-score'][r.opponent] : 0.0) }
513
- when 'neustadtl' then player.results.inject(0.0) { |t,r| t + (r.opponent ? hash['opp-score'][r.opponent] * r.points : 0.0) }
514
- when 'opp-score' then player.results.inject(0.0) { |t,r| t + (r.opponent ? r.points : 0.5) } + (rounds - player.results.size) * 0.5
510
+ when 'score' then player.points
511
+ when 'wins' then player.results.inject(0) { |t,r| t + (r.opponent && r.score == 'W' ? 1 : 0) }
512
+ when 'blacks' then player.results.inject(0) { |t,r| t + (r.opponent && r.colour == 'B' ? 1 : 0) }
513
+ when 'buchholz' then player.results.inject(0.0) { |t,r| t + (r.opponent ? hash['opp-score'][r.opponent] : 0.0) }
514
+ when 'neustadtl' then player.results.inject(0.0) { |t,r| t + (r.opponent ? hash['opp-score'][r.opponent] * r.points : 0.0) }
515
+ when 'opp-score' then player.results.inject(0.0) { |t,r| t + (r.opponent ? r.points : 0.5) } + (rounds - player.results.size) * 0.5
516
+ when 'progressive' then (1..rounds).inject(0.0) { |t,n| r = player.find_result(n); s = r ? r.points : 0.0; t + s * (rounds + 1 - n) }
517
+ when 'ratings' then player.results.inject(0) { |t,r| t + (r.opponent && @player[r.opponent].rating ? @player[r.opponent].rating : 0) }
515
518
  when 'harkness', 'modified'
516
519
  scores = player.results.map{ |r| r.opponent ? hash['opp-score'][r.opponent] : 0.0 }.sort
517
520
  1.upto(rounds - player.results.size) { scores << 0.0 }
@@ -39,7 +39,7 @@ ratings or IDs are required instead, use the options _id_ and _rating_. For exam
39
39
  tournament = parser.parse_file('ncc', "2010-05-08")
40
40
  tournament.player(2).id # => 12379 (ICU ID)
41
41
  tournament.player(2).rating # => 2556 (ICU rating)
42
-
42
+
43
43
  tournament = parser.parse_file('ncc', "2010-05-08", :id => :intl, :rating => :intl)
44
44
  tournament.player(2).id # => 1205064 (FIDE ID)
45
45
  tournament.player(2).rating # => 2530 (FIDE rating)
@@ -78,10 +78,6 @@ Should you wish to rank the tournament using a different set of tie-break rules,
78
78
  tournament.tie_breaks = [:wins, :blacks]
79
79
  swiss_perfect = tournament.rerank.renumber.serialize('SwissPerfect')
80
80
 
81
- == Todo
82
-
83
- * Implement the extra tie-break rules that SP has
84
-
85
81
  =end
86
82
 
87
83
  class SwissPerfect
@@ -182,9 +178,10 @@ Should you wish to rank the tournament using a different set of tie-break rules,
182
178
  ext = $2.downcase
183
179
  stem[ext] = stm
184
180
  tmp = Tempfile.new(e.name)
185
- tmp.close
186
- e.extract(tmp.path) { true }
187
- temp[ext] = tmp.path
181
+ pth = tmp.path
182
+ tmp.close!
183
+ e.extract(pth) { true }
184
+ temp[ext] = pth
188
185
  end
189
186
  end
190
187
  %w(ini trn sco).each { |ext| raise "no #{ext.upcase} file found" unless stem[ext] }
@@ -210,17 +207,17 @@ Should you wish to rank the tournament using a different set of tie-break rules,
210
207
  @t.send("#{key}=", val) if val.size > 0
211
208
  end
212
209
  @t.tie_breaks = ini['Standings']['Tie Breaks'].to_s.split(/,/).map do |tbid|
213
- case tbid.to_i # tie break name in SwissPerfect
214
- when 1217 then :buchholz # Buchholz
215
- when 1218 then :harkness # Median Buchholz
216
- when 1219 then nil # Progress - not implenented yet
217
- when 1220 then :neustadtl # Berger
218
- when 1221 then nil # Rating Sum - not implemented yet
219
- when 1222 then :wins # Number of Wins
220
- when 1223 then nil # Minor Scores - not applicable
221
- when 1226 then nil # Brightwell - not applicable
210
+ case tbid.to_i # tie break name in SwissPerfect
211
+ when 1217 then :buchholz # Buchholz
212
+ when 1218 then :harkness # Median Buchholz
213
+ when 1219 then :progressive # cumulative
214
+ when 1220 then :neustadtl # Berger
215
+ when 1221 then :ratings # rating sum
216
+ when 1222 then :wins # number of wins
217
+ when 1223 then nil # minor scores - not applicable
218
+ when 1226 then nil # Brightwell - not applicable
222
219
  else nil
223
- end
220
+ end
224
221
  end.find_all { |tb| tb }
225
222
  end
226
223
 
@@ -1,5 +1,5 @@
1
1
  module ICU
2
2
  class Tournament
3
- VERSION = "1.0.5"
3
+ VERSION = "1.0.6"
4
4
  end
5
5
  end
@@ -49,7 +49,7 @@ module ICU
49
49
  end
50
50
 
51
51
  it "should have the correct tie breaks" do
52
- @t.tie_breaks.join('|').should == "buchholz|harkness"
52
+ @t.tie_breaks.join('|').should == "buchholz|harkness|progressive"
53
53
  end
54
54
 
55
55
  it "should serialize to the text export format" do
@@ -116,7 +116,7 @@ module ICU
116
116
  end
117
117
 
118
118
  it "should have the correct tie breaks" do
119
- @t.tie_breaks.join('|').should == "harkness|buchholz"
119
+ @t.tie_breaks.join('|').should == "harkness|buchholz|progressive"
120
120
  end
121
121
  end
122
122
 
@@ -271,14 +271,6 @@ module ICU
271
271
  @t.player(8).signature.should == "Vega, Marcos Llaneza||2475|3.0|16|1234|DDWW|BWBW|TTTT"
272
272
  @t.player(67).signature.should == "Lee, Shane|780|1633|1.0|52|134|DLD|WWW|TTT"
273
273
  end
274
-
275
- it "should have correct details for selection of players, including international IDs and ratings when so configured" do
276
- @t = @p.parse_file(SAMPLES + 'ncc', "2010-05-08", :id => :intl, :rating => :intl)
277
- @t.player(2).signature.should == "Szabo, Gergely|1205064||4.0|4|1234|WWWW|WBWB|TTTT"
278
- @t.player(5).signature.should == "Daly, Colm|2500434||3.5|7|1234|WWWD|WBWB|TTTT"
279
- @t.player(8).signature.should == "Vega, Marcos Llaneza|2253585||3.0|16|1234|DDWW|BWBW|TTTT"
280
- @t.player(67).signature.should == "Lee, Shane|||1.0|52|134|DLD|WWW|TTT"
281
- end
282
274
  end
283
275
  end
284
276
  end
@@ -16,7 +16,7 @@ module ICU
16
16
  end.should_not raise_error
17
17
  end
18
18
  end
19
-
19
+
20
20
  context "documentation example" do
21
21
  before(:each) do
22
22
  @t = t = ICU::Tournament.new('Bangor Masters', '2009-11-09')
@@ -35,12 +35,12 @@ module ICU
35
35
  001 30 Orr,Mark 0.5 3 10 b = 20 w 0
36
36
  EOS
37
37
  end
38
-
38
+
39
39
  it "should serialize to Krause" do
40
40
  parser = ICU::Tournament::Krause.new
41
41
  parser.serialize(@t).should == @s
42
42
  end
43
- end
43
+ end
44
44
 
45
45
  context "name" do
46
46
  before(:each) do
@@ -57,8 +57,8 @@ EOS
57
57
  end
58
58
 
59
59
  it "should not be blank or without letters" do
60
- lambda { Tournament.new(' ', '2009-11-09') }.should raise_error(/invalid.*name/)
61
- lambda { @t.name = '333' }.should raise_error(/invalid.*name/)
60
+ lambda { Tournament.new(' ', '2009-11-09') }.should raise_error(/invalid.*name/)
61
+ lambda { @t.name = '333' }.should raise_error(/invalid.*name/)
62
62
  end
63
63
  end
64
64
 
@@ -262,17 +262,17 @@ EOS
262
262
  lambda { @t.time_control = 'abc' }.should raise_error(/invalid.*time.*control/)
263
263
  end
264
264
  end
265
-
265
+
266
266
  context "tie breaks" do
267
267
  before(:each) do
268
268
  @t = Tournament.new('Edinburgh Masters', '2009-11-09')
269
269
  end
270
-
270
+
271
271
  it "should an empty tie breaks list by default" do
272
272
  @t.tie_breaks.should be_an_instance_of(Array)
273
273
  @t.tie_breaks.should be_empty
274
274
  end
275
-
275
+
276
276
  it "should be settable to one or more valid tie break methods" do
277
277
  @t.tie_breaks = [:neustadtl]
278
278
  @t.tie_breaks.join('|').should == "neustadtl"
@@ -283,11 +283,11 @@ EOS
283
283
  @t.tie_breaks = []
284
284
  @t.tie_breaks.join('|').should == ""
285
285
  end
286
-
286
+
287
287
  it "should rasie an error is not given an array" do
288
288
  lambda { @t.tie_breaks = :neustadtl }.should raise_error(/array/i)
289
289
  end
290
-
290
+
291
291
  it "should rasie an error is given any invalid tie-break methods" do
292
292
  lambda { @t.tie_breaks = ["My Bum"] }.should raise_error(/invalid/i)
293
293
  lambda { @t.tie_breaks = [:neustadtl, "Your arse"] }.should raise_error(/invalid/i)
@@ -370,7 +370,7 @@ EOS
370
370
  @t.find_player(Player.new('John', 'Orr', 4, :fed => 'IRL')).should be_nil
371
371
  end
372
372
  end
373
-
373
+
374
374
  context "teams" do
375
375
  before(:each) do
376
376
  @t = Tournament.new('Bangor Bash', '2009-11-09')
@@ -382,20 +382,20 @@ EOS
382
382
  @t.get_team(' wandering dragons ').should be_an_instance_of Team
383
383
  @t.get_team('Blundering Bishops').should be_nil
384
384
  end
385
-
385
+
386
386
  it "should be able to create and add a new team and retrieve it" do
387
387
  @t.add_team('Blundering Bishops').should be_an_instance_of Team
388
388
  @t.get_team(' blundering bishops ').should be_an_instance_of Team
389
389
  @t.get_team('Wandering Dragons').should be_nil
390
390
  end
391
-
391
+
392
392
  it "should throw and exception if there is an attempt to add a team with a name that matches an existing team" do
393
393
  lambda { @t.add_team('Blundering Bishops') }.should_not raise_error
394
394
  lambda { @t.add_team('Wandering Dragons') }.should_not raise_error
395
395
  lambda { @t.add_team(' wandering dragons ') }.should raise_error(/similar.*exists/)
396
396
  end
397
397
  end
398
-
398
+
399
399
  context "validation" do
400
400
  before(:each) do
401
401
  @t = Tournament.new('Edinburgh Masters', '2009-11-09')
@@ -465,7 +465,7 @@ EOS
465
465
  @t.player(3).rank = 3
466
466
  lambda { @t.validate! }.should raise_error(/player 2.*above.*player 1/)
467
467
  end
468
-
468
+
469
469
  it "should be valid if there are teams, every player is in one of them, and no team has an invalid member" do
470
470
  team1 = Team.new('International Masters')
471
471
  team2 = Team.new('World Champions')
@@ -479,7 +479,7 @@ EOS
479
479
  team1.add_member(4)
480
480
  @t.invalid.should match(/not.*valid/)
481
481
  end
482
-
482
+
483
483
  it "should not be valid if one player is in more than one team" do
484
484
  team1 = Team.new('XInternational Masters')
485
485
  team1.add_member(1)
@@ -493,7 +493,7 @@ EOS
493
493
  @t.invalid.should match(/already.*member/)
494
494
  end
495
495
  end
496
-
496
+
497
497
  context "renumbering" do
498
498
  before(:each) do
499
499
  @t = Tournament.new('Edinburgh Masters', '2009-11-09')
@@ -504,7 +504,7 @@ EOS
504
504
  @t.add_result(Result.new(2, 30, 'W', :opponent => 10))
505
505
  @t.add_result(Result.new(3, 20, 'W', :opponent => 30))
506
506
  end
507
-
507
+
508
508
  it "sample tournament is valid but unranked" do
509
509
  @t.invalid.should be_false
510
510
  @t.player(10).rank.should be_nil
@@ -518,7 +518,7 @@ EOS
518
518
  @t.players.map{ |p| p.num }.join('|').should == '1|2|3'
519
519
  @t.players.map{ |p| p.last_name }.join('|').should == 'Fischer|Kasparov|Orr'
520
520
  end
521
-
521
+
522
522
  it "should be renumberable by rank if the tournament is ranked" do
523
523
  @t.rerank.renumber
524
524
  @t.invalid.should be_false
@@ -526,7 +526,7 @@ EOS
526
526
  @t.players.map{ |p| p.rank }.join('|').should == '1|2|3'
527
527
  @t.players.map{ |p| p.last_name }.join('|').should == 'Orr|Kasparov|Fischer'
528
528
  end
529
-
529
+
530
530
  it "should be renumberable by name even if the tourament is ranked" do
531
531
  @t.rerank.renumber(:name)
532
532
  @t.invalid.should be_false
@@ -545,12 +545,12 @@ EOS
545
545
  context "reranking" do
546
546
  before(:each) do
547
547
  @t = Tournament.new('Edinburgh Masters', '2009-11-09')
548
- @t.add_player(@boby = Player.new('Bobby', 'Fischer', 1))
549
- @t.add_player(@gary = Player.new('Gary', 'Kasparov', 2))
548
+ @t.add_player(@boby = Player.new('Bobby', 'Fischer', 1, :rating => 2600))
549
+ @t.add_player(@gary = Player.new('Gary', 'Kasparov', 2, :rating => 2700))
550
550
  @t.add_player(@boby = Player.new('Micky', 'Mouse', 3))
551
- @t.add_player(@boby = Player.new('Minnie', 'Mouse', 4))
552
- @t.add_player(@boby = Player.new('Gearoidin', 'Ui Laighleis', 5))
553
- @t.add_player(@mark = Player.new('Mark', 'Orr', 6))
551
+ @t.add_player(@boby = Player.new('Minnie', 'Mouse', 4, :rating => 1500))
552
+ @t.add_player(@boby = Player.new('Gearoidin', 'Ui Laighleis', 5, :rating => 1700))
553
+ @t.add_player(@mark = Player.new('Mark', 'Orr', 6, :rating => 2300))
554
554
  @t.add_result(Result.new(1, 1, 'W', :opponent => 6, :colour => 'W'))
555
555
  @t.add_result(Result.new(2, 1, 'W', :opponent => 3, :colour => 'B'))
556
556
  @t.add_result(Result.new(3, 1, 'W', :opponent => 5, :colour => 'W'))
@@ -566,13 +566,13 @@ EOS
566
566
  @t.invalid.should be_false
567
567
  @t.player(1).rank.should be_nil
568
568
  end
569
-
569
+
570
570
  it "should have correct default tie break scores" do
571
571
  scores = @t.tie_break_scores
572
572
  scores[1].should == 'Fischer, Bobby'
573
573
  scores[5].should == 'Ui Laighleis, Gearoidin'
574
574
  end
575
-
575
+
576
576
  it "should have correct actual scores" do
577
577
  @t.player(1).points.should == 3.0
578
578
  @t.player(2).points.should == 3.0
@@ -581,7 +581,7 @@ EOS
581
581
  @t.player(5).points.should == 0.5
582
582
  @t.player(6).points.should == 0.5
583
583
  end
584
-
584
+
585
585
  it "should have correct Buchholz tie break scores" do
586
586
  @t.tie_breaks = ["Buchholz"]
587
587
  scores = @t.tie_break_scores
@@ -592,7 +592,7 @@ EOS
592
592
  scores[5].should == 6.5
593
593
  scores[6].should == 4.5
594
594
  end
595
-
595
+
596
596
  it "Buchholz should be sensitive to unplayed games" do
597
597
  @t.player(1).find_result(1).opponent = nil
598
598
  @t.player(6).find_result(1).opponent = nil
@@ -605,7 +605,29 @@ EOS
605
605
  scores[5].should == 6.5 # 3 from Fischer changed to 2.5, 0.5 from Orr changed to 1 (cancels out)
606
606
  scores[6].should == 1.5 # 3 from Fischer changed to 0
607
607
  end
608
-
608
+
609
+ it "should have correct progressive tie break scores" do
610
+ @t.tie_breaks = [:progressive]
611
+ scores = @t.tie_break_scores
612
+ scores[1].should == 6.0
613
+ scores[2].should == 6.0
614
+ scores[3].should == 3.0
615
+ scores[4].should == 1.0
616
+ scores[5].should == 1.0
617
+ scores[6].should == 1.0
618
+ end
619
+
620
+ it "should have correct ratings tie break scores" do
621
+ @t.tie_breaks = ['ratings']
622
+ scores = @t.tie_break_scores
623
+ scores[1].should == 4000
624
+ scores[2].should == 3200
625
+ scores[3].should == 6800
626
+ scores[4].should == 5000
627
+ scores[5].should == 7600
628
+ scores[6].should == 5800
629
+ end
630
+
609
631
  it "should have correct Neustadtl tie break scores" do
610
632
  @t.tie_breaks = [:neustadtl]
611
633
  scores = @t.tie_break_scores
@@ -616,7 +638,7 @@ EOS
616
638
  scores[5].should == 0.25
617
639
  scores[6].should == 0.25
618
640
  end
619
-
641
+
620
642
  it "Neustadtl should be sensitive to unplayed games" do
621
643
  @t.player(1).find_result(1).opponent = nil
622
644
  @t.player(6).find_result(1).opponent = nil
@@ -629,7 +651,7 @@ EOS
629
651
  scores[5].should == 0.5 # 0.25 from Orr changed to 0.5
630
652
  scores[6].should == 0.25 # loss against Fisher and unplayed against Fisher equivalent
631
653
  end
632
-
654
+
633
655
  it "should have correct Harkness tie break scores" do
634
656
  @t.tie_breaks = ['harkness']
635
657
  scores = @t.tie_break_scores
@@ -640,7 +662,7 @@ EOS
640
662
  scores[5].should == 3.0
641
663
  scores[6].should == 1.0
642
664
  end
643
-
665
+
644
666
  it "should have correct Modified Median tie break scores" do
645
667
  @t.tie_breaks = ['Modified Median']
646
668
  scores = @t.tie_break_scores
@@ -651,14 +673,14 @@ EOS
651
673
  scores[5].should == 3.5
652
674
  scores[6].should == 1.5
653
675
  end
654
-
676
+
655
677
  it "should have correct tie break scores for number of blacks" do
656
678
  @t.tie_breaks = ['Blacks']
657
679
  scores = @t.tie_break_scores
658
680
  scores[3].should == 0
659
681
  scores[4].should == 2
660
682
  end
661
-
683
+
662
684
  it "number of blacks should should be sensitive to unplayed games" do
663
685
  @t.player(2).find_result(1).opponent = nil
664
686
  @t.player(4).find_result(1).opponent = nil
@@ -667,14 +689,14 @@ EOS
667
689
  scores[3].should == 0
668
690
  scores[4].should == 1
669
691
  end
670
-
692
+
671
693
  it "should have correct tie break scores for number of wins" do
672
694
  @t.tie_breaks = [:wins]
673
695
  scores = @t.tie_break_scores
674
696
  scores[1].should == 3
675
697
  scores[6].should == 0
676
698
  end
677
-
699
+
678
700
  it "number of wins should should be sensitive to unplayed games" do
679
701
  @t.player(1).find_result(1).opponent = nil
680
702
  @t.player(6).find_result(1).opponent = nil
@@ -693,7 +715,7 @@ EOS
693
715
  @t.player(6).rank.should == 5 # 0.5/"Ui"
694
716
  @t.player(5).rank.should == 6 # 0.5/"Orr"
695
717
  end
696
-
718
+
697
719
  it "should be configurable to use Buchholz" do
698
720
  @t.tie_breaks = ['Buchholz']
699
721
  @t.rerank
@@ -704,7 +726,7 @@ EOS
704
726
  @t.player(5).rank.should == 5 # 0.5/6.5
705
727
  @t.player(6).rank.should == 6 # 0.5/4.5
706
728
  end
707
-
729
+
708
730
  it "should be configurable to use Neustadtl" do
709
731
  @t.tie_breaks = [:neustadtl]
710
732
  @t.rerank
@@ -715,7 +737,7 @@ EOS
715
737
  @t.player(6).rank.should == 5 # 0.5/0.25/"Orr"
716
738
  @t.player(5).rank.should == 6 # 0.5/0.25/"Ui"
717
739
  end
718
-
740
+
719
741
  it "should be configurable to use number of blacks" do
720
742
  @t.tie_breaks = [:blacks]
721
743
  @t.rerank
@@ -726,7 +748,7 @@ EOS
726
748
  @t.player(6).rank.should == 5 # 0.5/2
727
749
  @t.player(5).rank.should == 6 # 0.5/1
728
750
  end
729
-
751
+
730
752
  it "should be configurable to use number of wins" do
731
753
  @t.tie_breaks = [:wins]
732
754
  @t.rerank
@@ -737,13 +759,13 @@ EOS
737
759
  @t.player(6).rank.should == 5 # 0.5/0/"Orr"
738
760
  @t.player(5).rank.should == 6 # 0.5/0/"Ui"
739
761
  end
740
-
762
+
741
763
  it "should exhibit equivalence between Neustadtl and Sonneborn-Berger" do
742
764
  @t.tie_breaks = ['Sonneborn-Berger']
743
765
  @t.rerank
744
766
  (1..6).inject(''){ |t,r| t << @t.player(r).rank.to_s }.should == '213465'
745
767
  end
746
-
768
+
747
769
  it "should be able to use more than one method" do
748
770
  @t.tie_breaks = [:neustadtl, :buchholz]
749
771
  @t.rerank
@@ -754,7 +776,7 @@ EOS
754
776
  @t.player(5).rank.should == 5 # 0.5/0.25/6.5
755
777
  @t.player(6).rank.should == 6 # 0.5/0.25/4.5
756
778
  end
757
-
779
+
758
780
  it "should be possible as a side effect of validation" do
759
781
  @t.tie_breaks = [:buchholz]
760
782
  @t.invalid(:rerank => true).should be_false
@@ -765,7 +787,7 @@ EOS
765
787
  @t.player(5).rank.should == 5 # 1/6
766
788
  @t.player(6).rank.should == 6 # 0/5
767
789
  end
768
-
790
+
769
791
  it "should be possible as a side effect of validation with multiple tie break methods" do
770
792
  @t.tie_breaks = [:neustadtl, :buchholz]
771
793
  @t.invalid(:rerank => true).should be_false
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: icu_tournament
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.5
4
+ version: 1.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Orr