betforker 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +5 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +3 -0
  5. data/Gemfile +2 -0
  6. data/Gemfile.lock +90 -0
  7. data/README.md +53 -0
  8. data/Rakefile +12 -0
  9. data/betforker.gemspec +23 -0
  10. data/bin/betforker +64 -0
  11. data/config.yml +14 -0
  12. data/lib/betforker.rb +80 -0
  13. data/lib/betforker/bookmakers/__to_change__/betfair.rb +112 -0
  14. data/lib/betforker/bookmakers/__to_change__/parimatch.rb +137 -0
  15. data/lib/betforker/bookmakers/__to_change__/sbobet.rb +90 -0
  16. data/lib/betforker/bookmakers/__to_change__/winlinebet.rb +122 -0
  17. data/lib/betforker/bookmakers/marathon.rb +121 -0
  18. data/lib/betforker/bookmakers/williamhill.rb +115 -0
  19. data/lib/betforker/comparer.rb +176 -0
  20. data/lib/betforker/config.rb +201 -0
  21. data/lib/betforker/downloader.rb +128 -0
  22. data/lib/betforker/event.rb +74 -0
  23. data/lib/betforker/fork.rb +29 -0
  24. data/lib/betforker/names_winlinebet.rb +1092 -0
  25. data/lib/betforker/parsed_page.rb +13 -0
  26. data/lib/betforker/version.rb +3 -0
  27. data/spec/betforker_spec.rb +39 -0
  28. data/spec/bookmakers/__to_change__/betfair_test.rb +40 -0
  29. data/spec/bookmakers/__to_change__/parimatch_test.rb +41 -0
  30. data/spec/bookmakers/__to_change__/sbobet_test.rb +40 -0
  31. data/spec/bookmakers/__to_change__/winlinebet_test.rb +39 -0
  32. data/spec/bookmakers/marathon_spec.rb +84 -0
  33. data/spec/bookmakers/williamhill_spec.rb +81 -0
  34. data/spec/comparer_spec.rb +162 -0
  35. data/spec/config_spec.rb +155 -0
  36. data/spec/downloader_spec.rb +88 -0
  37. data/spec/event_spec.rb +94 -0
  38. data/spec/features/without_downloads_spec.rb +138 -0
  39. data/spec/fork_spec.rb +21 -0
  40. data/spec/spec_helper.rb +199 -0
  41. data/spec/support/html/betfair/betfair1.html +3453 -0
  42. data/spec/support/html/betfair/betfair2.html +3996 -0
  43. data/spec/support/html/betfair/betfair3.html +6566 -0
  44. data/spec/support/html/betfair/betfair4.html +3373 -0
  45. data/spec/support/html/betfair/bf_live.htm +5905 -0
  46. data/spec/support/html/fake/fake.html +15759 -0
  47. data/spec/support/html/marathon/first.html +2717 -0
  48. data/spec/support/html/marathon/live_page.html +7226 -0
  49. data/spec/support/html/marathon/second.html +3500 -0
  50. data/spec/support/html/marathon/with_forks.html +2525 -0
  51. data/spec/support/html/parimatch/parimatch1.html +588 -0
  52. data/spec/support/html/parimatch/parimatch2.html +589 -0
  53. data/spec/support/html/parimatch/parimatch3.html +581 -0
  54. data/spec/support/html/parimatch/parimatch4.html +641 -0
  55. data/spec/support/html/parimatch/pm_live.html +1049 -0
  56. data/spec/support/html/sbobet/sb1.htm +8 -0
  57. data/spec/support/html/sbobet/sb2.htm +8 -0
  58. data/spec/support/html/sbobet/sb3.htm +8 -0
  59. data/spec/support/html/sbobet/sb4.htm +8 -0
  60. data/spec/support/html/sbobet/sbobet_live.htm +8 -0
  61. data/spec/support/html/williamhill/first.html +13273 -0
  62. data/spec/support/html/williamhill/live_page.html +42735 -0
  63. data/spec/support/html/williamhill/second.html +15759 -0
  64. data/spec/support/html/williamhill/with_forks.html +13473 -0
  65. data/spec/support/html/williamhill/without_forks.html +14016 -0
  66. data/spec/support/html/winlinebet/win1.htm +23797 -0
  67. data/spec/support/html/winlinebet/win2.htm +23797 -0
  68. data/spec/support/html/winlinebet/win3.htm +23797 -0
  69. data/spec/support/html/winlinebet/win4.htm +23797 -0
  70. data/spec/support/html/winlinebet/win_live.htm +23815 -0
  71. metadata +211 -0
@@ -0,0 +1,13 @@
1
+ module Betforker
2
+ class ParsedPage
3
+ attr_accessor :bookie, :home_player, :away_player, :score
4
+
5
+ def initialize(bookie: '')
6
+ @bookie = bookie
7
+ @home_player = {}
8
+ @away_player = {}
9
+ @score = ''
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ module Betforker
2
+ VERSION = '1.0.1'
3
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Betforker do
4
+ let(:unstructured) { unstructured_events }
5
+ let(:structured) { structured_events }
6
+ $config = {}
7
+
8
+ describe '#build_events' do
9
+ let(:bookmakers) { ['First', 'Second'] }
10
+ let(:sport) { 'tennis' }
11
+
12
+ it 'successfully' do
13
+ allow(Betforker).to receive(:pull_live_events).
14
+ and_return(unstructured)
15
+ result = Betforker.build_events bookmakers, sport
16
+
17
+ expect(result.size).to eq 3
18
+ result.each do |e|
19
+ expect(e.class).to eq Event
20
+ expect(e.addresses.size).to be > 1
21
+ end
22
+ end
23
+
24
+ it 'with empty hash of events' do
25
+ allow(Betforker).to receive(:pull_live_events).
26
+ and_return({})
27
+ result = Betforker.build_events bookmakers, sport
28
+ expect(result.size).to eq 0
29
+ end
30
+ end
31
+
32
+ describe '#structure_events' do
33
+ it 'returns right hash' do
34
+ result = Betforker.structure_events unstructured
35
+ expect(result).to eq structured
36
+ end
37
+ end
38
+ end
39
+
@@ -0,0 +1,40 @@
1
+ require_relative 'test_helper'
2
+
3
+ class BetfairTest < Minitest::Test
4
+
5
+ def setup
6
+ @bf = Betfair.new
7
+ @html_folder = 'test/html/betfair/'
8
+ end
9
+
10
+ def test_betfair_live_page_parsing
11
+ html = open("#{@html_folder}bf_live.htm").read
12
+ result = @bf.live_page_parsed(html)
13
+ assert_equal Hash, result.class
14
+ assert_equal 6, result.size
15
+ result.each do |addr, who|
16
+ assert addr.include?('www.betfair.com')
17
+ assert_equal String, addr.class
18
+ assert_equal String, who.class
19
+ end
20
+ # result.each {|k,r| puts k; puts r}
21
+ end
22
+
23
+ def test_betfair_event_parsing
24
+ events = []
25
+ (1..4).each do |num|
26
+ events << "#{@html_folder}betfair#{num}.html"
27
+ end
28
+ events.each do |event_page|
29
+ @bf = Betfair.new
30
+ res = @bf.event_parsed(open(event_page).read)
31
+ # p res
32
+ assert_equal(String, res[:home_player][:name].class)
33
+ assert_equal(String, res[:away_player][:name].class)
34
+ assert_equal(Hash, res[:home_player].class)
35
+ assert_equal(Hash, res[:away_player].class)
36
+ assert_equal(String, res[:score].class)
37
+ assert_equal('Betfair', res[:bookie])
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,41 @@
1
+ require_relative 'test_helper'
2
+
3
+ class ParimatchTest < Minitest::Test
4
+
5
+ def setup
6
+ @pm = Parimatch.new
7
+ @html_folder = 'test/html/parimatch/'
8
+ end
9
+
10
+ def test_parimatch_live_page_parsing
11
+ html = open("#{@html_folder}pm_live.html").read
12
+ result = @pm.live_page_parsed(html)
13
+ assert_equal Hash, result.class
14
+ assert_equal 16, result.size
15
+ result.each do |addr, who|
16
+ assert addr.include?('parimatch.com')
17
+ assert_equal String, addr.class
18
+ assert_equal String, who.class
19
+ end
20
+ # result.each {|k,r| puts k; puts r}
21
+ end
22
+
23
+ def test_parimatch_event_parsing
24
+ events = []
25
+ (1..4).each do |num|
26
+ events << "#{@html_folder}parimatch#{num}.html"
27
+ end
28
+ events.each do |event_page|
29
+ @pm = Parimatch.new
30
+ res = @pm.event_parsed(open(event_page).read)
31
+ # p res
32
+ assert_equal(String, res[:home_player][:name].class)
33
+ assert_equal(String, res[:away_player][:name].class)
34
+ assert_equal(Hash, res[:home_player].class)
35
+ assert_equal(Hash, res[:away_player].class)
36
+ assert_equal(String, res[:score].class)
37
+ assert_equal('Parimatch', res[:bookie])
38
+ end
39
+ end
40
+
41
+ end
@@ -0,0 +1,40 @@
1
+ require_relative 'test_helper'
2
+
3
+ class SbobetTest < Minitest::Test
4
+
5
+ def setup
6
+ @sb = Sbobet.new
7
+ @html_folder = 'test/html/sbobet/'
8
+ end
9
+
10
+ def test_sbobet_live_page_parsing
11
+ html = open("#{@html_folder}sbobet_live.htm").read
12
+ result = @sb.live_page_parsed(html)
13
+ assert_equal Hash, result.class
14
+ assert_equal 8, result.size
15
+ result.each do |addr, who|
16
+ assert addr.include?('sbobet')
17
+ assert_equal String, addr.class
18
+ assert_equal String, who.class
19
+ end
20
+ # result.each {|k,r| puts k; puts r}
21
+ end
22
+
23
+ def test_sbobet_event_parsing
24
+ events = []
25
+ (1..4).each do |num|
26
+ events << "#{@html_folder}sb#{num}.htm"
27
+ end
28
+ events.each do |event_page|
29
+ @sb = Sbobet.new
30
+ res = @sb.event_parsed(open(event_page).read)
31
+ # p res
32
+ assert_equal(String, res[:home_player][:name].class)
33
+ assert_equal(String, res[:away_player][:name].class)
34
+ assert_equal(Hash, res[:home_player].class)
35
+ assert_equal(Hash, res[:away_player].class)
36
+ assert_equal(String, res[:score].class)
37
+ assert_equal('Sbobet', res[:bookie])
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,39 @@
1
+ require_relative 'test_helper'
2
+
3
+ class WinlinebetTest < Minitest::Test
4
+
5
+ def setup
6
+ @win = Winlinebet.new
7
+ @html_folder = 'test/html/winlinebet/'
8
+ end
9
+
10
+ def test_winline_live_page_parsing
11
+ html = open("#{@html_folder}win_live.htm").read
12
+ result = @win.live_page_parsed(html)
13
+ assert_equal Hash, result.class
14
+ result.each do |addr, who|
15
+ assert addr.include?('winlinebet')
16
+ assert_equal String, addr.class
17
+ assert_equal String, who.class
18
+ end
19
+ # result.each {|k,r| puts k; puts r}
20
+ end
21
+
22
+ def test_winline_event_parsing
23
+ events = []
24
+ (1..4).each do |num|
25
+ events << "#{@html_folder}win#{num}.htm"
26
+ end
27
+ events.each do |event_page|
28
+ @win = Winlinebet.new
29
+ res = @win.event_parsed(open(event_page).read)
30
+ # p res
31
+ assert_equal(String, res[:home_player][:name].class)
32
+ assert_equal(String, res[:away_player][:name].class)
33
+ assert_equal(Hash, res[:home_player].class)
34
+ assert_equal(Hash, res[:away_player].class)
35
+ assert_equal(String, res[:score].class)
36
+ assert_equal('Winlinebet', res[:bookie])
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Betforker::Bookmakers::Marathon do
4
+ describe '#parse_live_page' do
5
+ let(:sport) { 'tennis' }
6
+ let(:result) { Marathon.parse_live_page(webpage, sport) }
7
+
8
+ context 'tennis successfully' do
9
+ let(:webpage) { open_right_live_page 'marathon' }
10
+
11
+ specify { expect(result.instance_of?(Hash)).to be true }
12
+ specify { expect(result.size).not_to eq 0 }
13
+
14
+ it "every hash key contains address" do
15
+ result.keys.each do |key|
16
+ expect(key).to include Betforker::MARATHON_BASE
17
+ end
18
+ end
19
+ end
20
+
21
+ context 'tennis with no events' do
22
+ let(:webpage) { marathon_live_page_without_events }
23
+ specify { expect(result.size).to eq 0 }
24
+ end
25
+
26
+ context 'tennis with wrong webpage' do
27
+ let(:webpage) { open_right_live_page 'williamhill' }
28
+ specify { expect(result.size).to eq 0 }
29
+ end
30
+ end
31
+
32
+ describe '#parse_event' do
33
+ let(:sport) { 'tennis' }
34
+ let(:result) do
35
+ event = Event.new [1,2,3], sport
36
+ event.webpages.merge!({ 'marathon' => webpage })
37
+ Marathon.parse_event(event, sport)
38
+ event.parsed_webpages.first
39
+ end
40
+
41
+ context 'tennis C.Cianci/P.Martins vs B.Luz/J.Vale Costa' do
42
+ let(:webpage) { open_event_page('marathon', 'first.html') }
43
+ it 'all must be good' do
44
+ expect(result.home_player[:name]).to eq 'CianciMartins'
45
+ expect(result.away_player[:name]).to eq 'CostaLuz'
46
+ expect(result.home_player[:match]).to eq 3.05
47
+ expect(result.away_player[:match]).to eq 1.37
48
+ expect(result.score).to eq '30:0 (1:0)'
49
+ expect(result.home_player[:set]['1']).to eq 2.14
50
+ expect(result.away_player[:set]['1']).to eq 1.70
51
+ expect(result.home_player[:game]['3']).to eq 3.00
52
+ expect(result.away_player[:game]['3']).to eq 1.38
53
+ end
54
+ end
55
+
56
+ context 'tennis Melzer vs Skugor' do
57
+ let(:webpage) { open_event_page('marathon', 'second.html') }
58
+ it 'all must be good' do
59
+ expect(result.home_player[:name]).to eq 'Melzer'
60
+ expect(result.away_player[:name]).to eq 'Skugor'
61
+ expect(result.home_player[:match]).to eq 1.89
62
+ expect(result.away_player[:match]).to eq 1.909
63
+ expect(result.home_player[:set]['2']).to eq 7.20
64
+ expect(result.away_player[:set]['2']).to eq 1.095
65
+ expect(result.home_player[:game]['7']).to eq 4.40
66
+ expect(result.away_player[:game]['7']).to eq 1.21
67
+ end
68
+ end
69
+ end
70
+
71
+ describe '#concatenated_names' do
72
+ let(:result) { Marathon.concatenated_names(names) }
73
+
74
+ context 'First, Player v Second, Player' do
75
+ let(:names) { 'First, Player v Second, Player' }
76
+ specify { expect(result).to eq 'FirstSecond' }
77
+ end
78
+
79
+ context 'R.Klaasen / R.Ram v O.Marach / F.Martin' do
80
+ let(:names) { 'R.Klaasen / R.Ram v O.Marach / F.Martin' }
81
+ specify { expect(result).to eq 'KlaasenMarachMartinRam' }
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,81 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Betforker::Bookmakers::WilliamHill do
4
+ describe '#parse_live_page' do
5
+ let(:sport) { 'tennis' }
6
+ let(:result) { WilliamHill.parse_live_page(webpage, sport) }
7
+
8
+ context 'tennis successfully' do
9
+ let(:webpage) { open_right_live_page 'williamhill' }
10
+
11
+ specify { expect(result.instance_of?(Hash)).to be true }
12
+ specify { expect(result.size).not_to eq 0 }
13
+
14
+ it "every hash key contains address" do
15
+ result.keys.each do |key|
16
+ expect(key).to include Betforker::WILLIAMHILL_BASE
17
+ end
18
+ end
19
+ end
20
+
21
+ context 'tennis with no events' do
22
+ let(:webpage) { williamhill_live_page_without_events }
23
+ specify { expect(result.size).to eq 0 }
24
+ end
25
+
26
+ context 'tennis with wrong webpage' do
27
+ let(:webpage) { open_right_live_page 'marathon' }
28
+ specify { expect(result.size).to eq 0 }
29
+ end
30
+ end
31
+
32
+ describe '#parse_event' do
33
+ let(:sport) { 'tennis' }
34
+ let(:result) do
35
+ event = Event.new [1,2,3], sport
36
+ event.webpages.merge!({ 'williamhill' => webpage })
37
+ WilliamHill.parse_event(event, sport)
38
+ event.parsed_webpages.first
39
+ end
40
+
41
+ context 'tennis Motti/Peng vs Donati/Sonego' do
42
+ let(:webpage) { open_event_page('williamhill', 'first.html') }
43
+ it 'all must be good' do
44
+ expect(result.home_player[:name]).to eq 'MottiPeng'
45
+ expect(result.away_player[:name]).to eq 'DonatiSonego'
46
+ expect(result.home_player[:match]).to eq 3.75
47
+ expect(result.away_player[:match]).to eq 1.25
48
+ expect(result.home_player[:game]['4']).to eq 4.00
49
+ expect(result.away_player[:game]['4']).to eq 1.22
50
+ end
51
+ end
52
+
53
+ context 'tennis Schmiedlova vs Argyelan' do
54
+ let(:webpage) { open_event_page('williamhill', 'second.html') }
55
+ it 'all must be good' do
56
+ expect(result.home_player[:name]).to eq 'Schmiedlova'
57
+ expect(result.away_player[:name]).to eq 'Argyelan'
58
+ expect(result.home_player[:match]).to eq 1.73
59
+ expect(result.away_player[:match]).to eq 2.00
60
+ expect(result.home_player[:game]['1']).to eq 2.00
61
+ expect(result.away_player[:game]['1']).to eq 1.73
62
+ expect(result.home_player[:game]['2']).to eq 1.40
63
+ expect(result.away_player[:game]['2']).to eq 2.75
64
+ end
65
+ end
66
+ end
67
+
68
+ describe '#concatenated_names' do
69
+ let(:result) { WilliamHill.concatenated_names(names) }
70
+
71
+ context 'Luna Meers v Steffii Distelmans' do
72
+ let(:names) { 'Luna Meers v Steffii Distelmans' }
73
+ specify { expect(result).to eq 'DistelmansMeers' }
74
+ end
75
+
76
+ context 'Oleksandr Bielinsky/Michail Fufygin v Vitaly Kozyukov/Aleksander Ovcharov' do
77
+ let(:names) { 'Oleksandr Bielinsky/Aleksander Ovcharov v Vitaly Kozyukov/Michail Fufygin' }
78
+ specify { expect(result).to eq 'BielinskyFufyginKozyukovOvcharov' }
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,162 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Betforker::Comparer do
4
+ before do
5
+ $config = { min_percent: 1.1, filtering: true }
6
+ end
7
+
8
+ describe '#compare' do
9
+ let(:first) do
10
+ parsed = ParsedPage.new bookie: 'WilliamHill'
11
+ parsed.score = ''
12
+ parsed.home_player =
13
+ { name: 'Home_Player', match: 1.6, game: {'5' => 2.2 }, set: {'1' => 1.4 } }
14
+ parsed.away_player =
15
+ { name: 'Away_Player', match: 2.3, game: {'5' => 1.7 }, set: {'1' => 2.9 } }
16
+ parsed
17
+ end
18
+
19
+ let(:second) do
20
+ parsed = ParsedPage.new bookie: 'Betfair'
21
+ parsed.score = '0:0 (2:1)'
22
+ parsed.home_player =
23
+ { name: 'Home_Player', match: 1.3, game: {'5' => 2.9 }, set: {'1' => 1.6 } }
24
+ parsed.away_player =
25
+ { name: 'Away_Player', match: 3.3, game: {'5' => 1.4 }, set: {'1' => 2.2 } }
26
+ parsed
27
+ end
28
+
29
+ it 'find forks' do
30
+ forks = Comparer.compare first, second
31
+ expect(forks).not_to be_empty
32
+ forks.each do |f|
33
+ expect(f.class).to eq Fork
34
+ expect(f.bookmakers).to eq 'WilliamHill - Betfair'
35
+ expect(f.players).to eq 'Away_Player VS Home_Player'
36
+ expect(f.score).to eq '0:0 (2:1)'
37
+ expect(f.what).to match /match|game5|set1/
38
+ end
39
+ end
40
+
41
+ it 'find only one fork(game)' do
42
+ scores = ['15:0 (2:1)', '30:0 (0:3)', '0:0 (0:2)', '0:0 (1:1)']
43
+ scores.each do |s|
44
+ second.score = s
45
+ forks = Comparer.compare first, second
46
+ expect(forks).not_to be_empty
47
+ expect(forks.size).to eq 1
48
+ expect(forks[0].what).to eq 'game5'
49
+ end
50
+ end
51
+
52
+ it 'find if it is break' do
53
+ scores = ['0:0 (0:0)', '0:0 (2:3)', '0:0 (6:2)', '0:0 (5:7)']
54
+ scores.each do |s|
55
+ second.score = s
56
+ second.home_player[:game]['5'] = 2.2
57
+ forks = Comparer.compare first, second
58
+ expect(forks).not_to be_empty
59
+ expect(forks.size).to eq 2
60
+ forks.each do |f|
61
+ expect(f.what).to match /match|set1/
62
+ end
63
+ end
64
+ end
65
+
66
+ it 'do not find forks' do
67
+ other_second = second.dup
68
+ other_second.home_player = second.away_player
69
+ forks = Comparer.compare first, other_second
70
+ expect(forks).to be_empty
71
+ end
72
+
73
+ it 'do not find when not break' do
74
+ scores = ['0:0 (2:2)', '15:30 (2:3)', '0:0 (6:6)']
75
+ scores.each do |s|
76
+ second.score = s
77
+ forks = Comparer.compare first, second
78
+ expect(forks).to be_empty
79
+ end
80
+ end
81
+ end
82
+
83
+ describe '#check_sorting' do
84
+ let(:homeplayer) { 'Aaaa' }
85
+ let(:awayplayer) { 'Zzzz' }
86
+ let(:first) do
87
+ parsed = ParsedPage.new bookie: 'First'
88
+ parsed.home_player[:name] = homeplayer
89
+ parsed.away_player[:name] = awayplayer
90
+ parsed
91
+ end
92
+ let(:second) do
93
+ parsed = ParsedPage.new bookie: 'Second'
94
+ parsed.home_player[:name] = homeplayer
95
+ parsed.away_player[:name] = awayplayer
96
+ parsed
97
+ end
98
+
99
+ it 'will not change anything' do
100
+ Comparer.check_sorting first, second
101
+
102
+ expect(first.home_player[:name]).to eq homeplayer
103
+ expect(first.away_player[:name]).to eq awayplayer
104
+ expect(second.home_player[:name]).to eq homeplayer
105
+ expect(second.away_player[:name]).to eq awayplayer
106
+ end
107
+
108
+ it 'will change players' do
109
+ Comparer.change_names(first)
110
+ expect(first.home_player[:name]).to_not eq homeplayer
111
+ expect(first.away_player[:name]).to_not eq awayplayer
112
+ expect(second.home_player[:name]).to eq homeplayer
113
+ expect(second.away_player[:name]).to eq awayplayer
114
+ Comparer.check_sorting first, second
115
+ expect(first.home_player[:name]).to eq homeplayer
116
+ expect(first.away_player[:name]).to eq awayplayer
117
+ expect(second.home_player[:name]).to eq homeplayer
118
+ expect(second.away_player[:name]).to eq awayplayer
119
+ end
120
+ end
121
+
122
+ describe '#calculate' do
123
+ it 'when it is a fork' do
124
+ x, y = 1.5, 4.0
125
+ percent = Comparer.calculate x, y
126
+ expect(percent).to be > 2.0
127
+ end
128
+
129
+ it 'when it is a fork(reverted x and y)' do
130
+ x, y = 4.0, 1.5
131
+ percent = Comparer.calculate x, y
132
+ expect(percent).to be > 2.0
133
+ end
134
+
135
+ it 'when it is not a fork' do
136
+ x, y = 1.2, 4.0
137
+ percent = Comparer.calculate x, y
138
+ expect(percent).to be < 2.0
139
+ end
140
+
141
+ it 'when x or y are 0' do
142
+ x, y = 0.0, 0.0
143
+ percent = Comparer.calculate x, y
144
+ expect(percent).to be == -3.5
145
+ end
146
+ end
147
+
148
+ describe '#is_a_break?' do
149
+ it 'when a break' do
150
+ ['0:0 (2:3)', '0:0 (5:2)', '0:0 (0:0)'].each do |score|
151
+ state = Comparer.is_a_break? score
152
+ expect(state).to be_truthy
153
+ end
154
+ end
155
+ it 'when not a break' do
156
+ ['0:0 (4:4)', '0:0 (6:6)', '30:15 (0:1)'].each do |score|
157
+ state = Comparer.is_a_break? score
158
+ expect(state).to be_falsey
159
+ end
160
+ end
161
+ end
162
+ end