croupier 1.6.0 → 2.0.0.rc1

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 (63) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +2 -2
  3. data/Rakefile +7 -0
  4. data/lib/croupier/distribution.rb +115 -36
  5. data/lib/croupier/distribution_generator.rb +57 -0
  6. data/lib/croupier/distribution_generators/enumerator_block_generator.rb +23 -0
  7. data/lib/croupier/distribution_generators/enumerator_generator.rb +21 -0
  8. data/lib/croupier/distribution_generators/inverse_cdf_generator.rb +21 -0
  9. data/lib/croupier/distribution_generators/minimum_sample_generator.rb +24 -0
  10. data/lib/croupier/distribution_generators.rb +18 -0
  11. data/lib/croupier/distributions/bernoulli.rb +18 -25
  12. data/lib/croupier/distributions/binomial.rb +30 -29
  13. data/lib/croupier/distributions/cauchy.rb +22 -19
  14. data/lib/croupier/distributions/credit_card.rb +39 -29
  15. data/lib/croupier/distributions/degenerate.rb +16 -19
  16. data/lib/croupier/distributions/exponential.rb +18 -19
  17. data/lib/croupier/distributions/gamma.rb +66 -37
  18. data/lib/croupier/distributions/geometric.rb +19 -20
  19. data/lib/croupier/distributions/nbinomial.rb +22 -33
  20. data/lib/croupier/distributions/normal.rb +30 -34
  21. data/lib/croupier/distributions/poisson.rb +26 -25
  22. data/lib/croupier/distributions/triangular.rb +39 -25
  23. data/lib/croupier/distributions/uniform.rb +43 -19
  24. data/lib/croupier/distributions.rb +3 -4
  25. data/lib/croupier/version.rb +1 -1
  26. data/lib/croupier.rb +43 -6
  27. data/test/minitest/distribution_class/test_class_methods.rb +142 -0
  28. data/test/{test_distribution_class.rb → minitest/distribution_class/test_instance_methods.rb} +26 -28
  29. data/test/minitest/distribution_generator_class/test_class_methods.rb +24 -0
  30. data/test/minitest/distribution_generator_class/test_instance_methods.rb +35 -0
  31. data/test/minitest/distribution_generators/test_enumerator_block_generator.rb +31 -0
  32. data/test/minitest/distribution_generators/test_enumerator_generator.rb +33 -0
  33. data/test/minitest/distribution_generators/test_inverse_cdf_generator.rb +36 -0
  34. data/test/minitest/distribution_generators/test_minimum_sample_generator.rb +33 -0
  35. data/test/minitest/distributions/test_bernoulli_distribution.rb +13 -0
  36. data/test/minitest/distributions/test_binomial_distribution.rb +18 -0
  37. data/test/minitest/distributions/test_cauchy_distribution.rb +18 -0
  38. data/test/{distributions/minitest/test_credit_card.rb → minitest/distributions/test_credit_card_distribution.rb} +5 -0
  39. data/test/{distributions/minitest → minitest/distributions}/test_degenerate_distribution.rb +2 -2
  40. data/test/minitest/distributions/test_exponential_distribution.rb +13 -0
  41. data/test/minitest/distributions/test_gamma_distribution.rb +23 -0
  42. data/test/minitest/distributions/test_geometric_distribution.rb +13 -0
  43. data/test/minitest/distributions/test_normal_distribution.rb +17 -0
  44. data/test/minitest/distributions/test_poisson_distribution.rb +13 -0
  45. data/test/minitest/distributions/test_triangular_distribution.rb +26 -0
  46. data/test/minitest/distributions/test_uniform_distribution.rb +54 -0
  47. data/test/{test_croupier_module.rb → minitest/test_croupier_module.rb} +0 -0
  48. data/test/minitest/test_distribution_generators_module.rb +37 -0
  49. data/test/{test_distributions_module.rb → minitest/test_distributions_module.rb} +0 -0
  50. data/test/rtests.R +1 -0
  51. metadata +62 -44
  52. data/test/distributions/R_tests/test_bernoulli.R +0 -17
  53. data/test/distributions/R_tests/test_binomial.R +0 -17
  54. data/test/distributions/R_tests/test_cauchy.R +0 -28
  55. data/test/distributions/R_tests/test_exponential.R +0 -28
  56. data/test/distributions/R_tests/test_gamma.R +0 -27
  57. data/test/distributions/R_tests/test_geometric.R +0 -23
  58. data/test/distributions/R_tests/test_nbinomial.R +0 -17
  59. data/test/distributions/R_tests/test_normal.R +0 -52
  60. data/test/distributions/R_tests/test_poisson.R +0 -17
  61. data/test/distributions/R_tests/test_triangular.R +0 -28
  62. data/test/distributions/R_tests/test_uniform.R +0 -30
  63. data/test/testsuite.R +0 -37
@@ -4,9 +4,9 @@ module Croupier
4
4
  class << self
5
5
  # An array containing all available Distribution classes
6
6
  def all
7
- ::Croupier::Distributions.constants(false).inject([]){|list, distrib|
7
+ ::Croupier::Distributions.constants(false).each_with_object([]){|distrib, list|
8
8
  d = ::Croupier::Distributions.const_get(distrib)
9
- (d.is_a?(Class) && d.superclass == Croupier::Distribution) ? list << d : list
9
+ list << d if (d.is_a?(Class) && d.superclass == Croupier::Distribution)
10
10
  }.uniq.compact
11
11
  end
12
12
 
@@ -17,7 +17,7 @@ module Croupier
17
17
 
18
18
  def method_missing(method, *args, &block) # :nodoc:
19
19
  return super unless self.respond_to?(method)
20
- self.all.select{|d| d.cli_name == method.to_s}.first.new *args
20
+ self.all.find{|d| d.cli_name == method.to_s}.new(*args)
21
21
  end
22
22
 
23
23
  def respond_to?(method, include_private = false) # :nodoc:
@@ -25,5 +25,4 @@ module Croupier
25
25
  end
26
26
  end
27
27
  end
28
-
29
28
  end
@@ -1,3 +1,3 @@
1
1
  module Croupier
2
- VERSION = "1.6.0"
2
+ VERSION = "2.0.0.rc1"
3
3
  end
data/lib/croupier.rb CHANGED
@@ -1,10 +1,13 @@
1
- require 'croupier/version'
2
- require 'croupier/cli/trollop'
3
- require 'croupier/exceptions'
4
- require 'croupier/distribution'
5
- require 'croupier/distributions'
1
+ require_relative 'croupier/version'
2
+ require_relative 'croupier/cli/trollop'
3
+ require_relative 'croupier/exceptions'
4
+ require_relative 'croupier/distribution_generator'
5
+ require_relative 'croupier/distribution_generators'
6
+ Dir[File.join(File.dirname(__FILE__), "./croupier/distribution_generators/*.rb")].each {|f| require f}
7
+ require_relative 'croupier/distribution'
8
+ require_relative 'croupier/distributions'
6
9
  Dir[File.join(File.dirname(__FILE__), "./croupier/distributions/*.rb")].each {|f| require f}
7
- require 'croupier/cli/application'
10
+ require_relative 'croupier/cli/application'
8
11
  #####################################################################
9
12
  # Croupier module.
10
13
  # Used as a namespace containing all the Croupier code.
@@ -62,5 +65,39 @@ module Croupier
62
65
  Croupier.stop("\nCroupier Exiting... Interrupt signal received.")
63
66
  end
64
67
  end
68
+
69
+ ## Random generator related stuff.
70
+
71
+ # Same as Random#rand applied to Croupier random object.
72
+ #
73
+ # @return random number x, 0 <= x < 1
74
+ def rand *args
75
+ random.rand *args
76
+ end
77
+
78
+ # Sets Croupier random generator to a new object
79
+ # with provided seed.
80
+ # If seed is omitted, a new Random object is created
81
+ # without explicit seed.
82
+ # @param seed [Numeric] optional seed
83
+ # @return [NilClass] nil
84
+ def srand(seed=nil)
85
+ @random_generator = seed ? Random.new(seed) : Random.new
86
+ nil
87
+ end
88
+
89
+ # Croupier Random object
90
+ #
91
+ # @return [Random] croupier random object
92
+ def random
93
+ @random_generator ||= Random.new
94
+ end
95
+
96
+ # Croupier Random object seed.
97
+ #
98
+ # @return [Numeric] croupier random object seed
99
+ def seed
100
+ random.seed
101
+ end
65
102
  end
66
103
  end
@@ -0,0 +1,142 @@
1
+ require 'minitest/autorun'
2
+ require 'croupier'
3
+
4
+ class TestDistributionClassClassMethods < MiniTest::Unit::TestCase
5
+
6
+ def distribution_subclass_with_name name
7
+ Class.new Croupier::Distribution do
8
+ distribution_name name
9
+ end
10
+ end
11
+
12
+ def distribution_subclass_with_description description
13
+ Class.new Croupier::Distribution do
14
+ distribution_description description
15
+ end
16
+ end
17
+
18
+ def distribution_subclass_with_generator_class klazz
19
+ Class.new Croupier::Distribution do
20
+ generator_class klazz
21
+ end
22
+ end
23
+
24
+ def distribution_subclass_with_generator_block &block
25
+ Class.new Croupier::Distribution do
26
+ generator_block &block
27
+ end
28
+ end
29
+
30
+ def distribution_subclass_with_cli_options opts
31
+ Class.new Croupier::Distribution do
32
+ cli_options opts
33
+ end
34
+ end
35
+
36
+ def distribution_subclass_with_cli_name name
37
+ Class.new Croupier::Distribution do
38
+ cli_name name
39
+ end
40
+ end
41
+
42
+ def test_name_setter_adds_the_name
43
+ a = distribution_subclass_with_name "My name"
44
+ assert_equal "My name", a.distribution_name
45
+ end
46
+
47
+ def test_name_sets_separated_names_for_each_subclass
48
+ a = distribution_subclass_with_name "A"
49
+ b = distribution_subclass_with_name "B"
50
+ assert_equal "A", a.distribution_name
51
+ assert_equal "B", b.distribution_name
52
+ assert_nil Croupier::Distribution.distribution_name
53
+ end
54
+
55
+ def test_description_setter_adds_the_description
56
+ a = distribution_subclass_with_description "My desc"
57
+ assert_equal "My desc", a.distribution_description
58
+ end
59
+
60
+ def test_description_sets_separated_descriptions_for_each_subclass
61
+ a = distribution_subclass_with_description "A"
62
+ b = distribution_subclass_with_description "B"
63
+ assert_equal "A", a.distribution_description
64
+ assert_equal "B", b.distribution_description
65
+ assert_nil Croupier::Distribution.distribution_description
66
+ end
67
+
68
+ def test_cli_name_setter_adds_the_cli_name
69
+ a = distribution_subclass_with_cli_name "name"
70
+ assert_equal "name", a.cli_name
71
+ end
72
+
73
+ def test_cli_name_sets_separated_names_for_each_subclass
74
+ a = distribution_subclass_with_cli_name "a"
75
+ b = distribution_subclass_with_cli_name "b"
76
+ assert_equal "a", a.cli_name
77
+ assert_equal "b", b.cli_name
78
+ assert_nil Croupier::Distribution.cli_name
79
+ end
80
+
81
+ def test_cli_options_setter_adds_the_options
82
+ opts = Hash.new
83
+ a = distribution_subclass_with_cli_options opts
84
+ assert_equal opts, a.cli_options
85
+ end
86
+
87
+ def test_default_parameters_correctly_computed_from_cli_options
88
+ opts = {banner: 'Something', options: [[:a, "A", {type: :float, default: 0.5}], [:b, "B", {type: :float, default: 0.7}]]}
89
+ a = distribution_subclass_with_cli_options opts
90
+ assert_equal 0.5, a.default_parameters[:a]
91
+ assert_equal 0.7, a.default_parameters[:b]
92
+ end
93
+
94
+ def test_cli_options_sets_separated_cli_options_for_each_subclass
95
+ ha = Hash.new
96
+ hb = Hash.new
97
+ a = distribution_subclass_with_cli_options ha
98
+ b = distribution_subclass_with_cli_options hb
99
+ assert_equal ha, a.cli_options
100
+ assert_equal hb, b.cli_options
101
+ assert_empty Croupier::Distribution.cli_options
102
+ end
103
+
104
+ def test_responds_to_generators_methods
105
+ assert_respond_to ::Croupier::Distribution, 'inv_cdf'
106
+ assert_respond_to ::Croupier::Distribution, 'minimum_sample'
107
+ assert_respond_to ::Croupier::Distribution, 'enumerator_block'
108
+ assert_respond_to ::Croupier::Distribution, 'enumerator'
109
+ end
110
+
111
+ def test_generator_class_setter_adds_generator_class
112
+ klazz = Class.new
113
+ a = distribution_subclass_with_generator_class klazz
114
+ assert_equal klazz, a.generator_class
115
+ end
116
+
117
+ def test_generator_class_sets_separated_classes_for_each_subclass
118
+ ka = Class.new
119
+ kb = Class.new
120
+ a = distribution_subclass_with_generator_class ka
121
+ b = distribution_subclass_with_generator_class kb
122
+ assert_equal ka, a.generator_class
123
+ assert_equal kb, b.generator_class
124
+ assert_nil Croupier::Distribution.generator_class
125
+ end
126
+
127
+ def test_generator_block_setter_adds_generator_class
128
+ block = -> { 2 }
129
+ a = distribution_subclass_with_generator_block &block
130
+ assert_equal block, a.generator_block
131
+ end
132
+
133
+ def test_generator_block_sets_separated_blocks_for_each_subclass
134
+ pa = -> { 2 }
135
+ pb = -> { 3 }
136
+ a = distribution_subclass_with_generator_block &pa
137
+ b = distribution_subclass_with_generator_block &pb
138
+ assert_equal pa, a.generator_block
139
+ assert_equal pb, b.generator_block
140
+ assert_nil Croupier::Distribution.generator_block
141
+ end
142
+ end
@@ -1,6 +1,6 @@
1
1
  require "minitest/autorun"
2
2
  require "croupier"
3
- class TestDistributionClass < MiniTest::Unit::TestCase
3
+ class TestDistributionClassInstanceMethods < MiniTest::Unit::TestCase
4
4
 
5
5
  def test_distribution_has_name_and_description
6
6
  dist = Croupier::Distribution.new
@@ -8,10 +8,26 @@ class TestDistributionClass < MiniTest::Unit::TestCase
8
8
  assert_respond_to dist, 'description'
9
9
  end
10
10
 
11
+ def test_name_returns_distribution_name
12
+ dist = Class.new Croupier::Distribution do
13
+ distribution_name "Dist"
14
+ end
15
+ sample = dist.new
16
+ assert_equal "Dist", sample.name
17
+ end
18
+
19
+ def test_description_returns_distribution_description
20
+ dist = Class.new Croupier::Distribution do
21
+ distribution_description "Desc"
22
+ end
23
+ sample = dist.new
24
+ assert_equal "Desc", sample.description
25
+ end
26
+
11
27
  def test_distribution_accepts_parameter_configuration
12
28
  dist = Croupier::Distribution.new
13
29
  assert_equal dist.parameters, dist.default_parameters
14
- dist.configure({:larry => 'bird', :leonard => 'euler'})
30
+ dist.configure({larry: 'bird', leonard: 'euler'})
15
31
  refute_equal dist.parameters, dist.default_parameters
16
32
  assert_equal dist.parameters[:larry], 'bird'
17
33
  assert_equal dist.parameters[:leonard], 'euler'
@@ -23,36 +39,18 @@ class TestDistributionClass < MiniTest::Unit::TestCase
23
39
  end
24
40
 
25
41
  def test_distribution_generates_array_of_n_results
26
- a = Croupier::Distribution.new
27
- def a.generate_number; 15; end
28
- assert_equal a.generate_sample(15).size, 15
42
+ u = Croupier::Distributions.uniform
43
+ assert_equal u.generate_sample(15).size, 15
29
44
  end
30
45
 
31
- def test_generate_number_calls_inv_cdf_if_present
46
+ def test_initialize_creates_a_generator
32
47
  c = Class.new(Croupier::Distribution) do
33
- def inv_cdf n; true; end
34
- def generate_sample n; false; end
35
- end
36
- a = c.new
37
- assert a.generate_number
38
- end
39
-
40
- def test_generate_sample_calls_inv_cdf_if_present
41
- c = Class.new(Croupier::Distribution) do
42
- def inv_cdf n; true; end
43
- def generate_number n; false; end
44
- end
45
- a = c.new
46
- assert a.generate_sample(3).all?
47
- end
48
-
49
- def test_generate_number_not_returning_array_when_inv_cdf_not_implemented
50
- c = Class.new(Croupier::Distribution) do
51
- def generate_sample n
52
- [1]*n
48
+ inv_cdf do |n|
49
+ 2
53
50
  end
54
51
  end
55
- a = c.new
56
- assert_kind_of Numeric, a.generate_number
52
+
53
+ d = c.new
54
+ assert_kind_of ::Croupier::DistributionGenerators::InverseCDFGenerator, d.generator
57
55
  end
58
56
  end
@@ -0,0 +1,24 @@
1
+ require "minitest/autorun"
2
+ require "croupier"
3
+
4
+ class DistributionGeneratorClassClassMethods < MiniTest::Unit::TestCase
5
+
6
+ def create_generator_with_method_name name
7
+ Class.new Croupier::DistributionGenerator do
8
+ method_name name
9
+ end
10
+ end
11
+
12
+ def test_method_name_setter_sets_the_name
13
+ gen = create_generator_with_method_name "method_name"
14
+ assert_equal "method_name", gen.method_name
15
+ end
16
+
17
+ def test_method_name_sets_different_names_for_each_subclass
18
+ a = create_generator_with_method_name "method_a"
19
+ b = create_generator_with_method_name "method_b"
20
+ assert_equal "method_a", a.method_name
21
+ assert_equal "method_b", b.method_name
22
+ assert_nil Croupier::DistributionGenerator.method_name
23
+ end
24
+ end
@@ -0,0 +1,35 @@
1
+ require "minitest/autorun"
2
+ require "croupier"
3
+
4
+ class DistributionGeneratorClassIntanceMethods < MiniTest::Unit::TestCase
5
+
6
+ def setup
7
+ @distribution = Croupier::Distribution.new
8
+ @params = @distribution.parameters
9
+ @block = Proc.new { }
10
+ @generator = Croupier::DistributionGenerator.new @distribution, &@block
11
+ def @generator.generate_minimum_sample
12
+ [1,2,3]
13
+ end
14
+ end
15
+
16
+ def test_parameters_returns_distribution_parameters
17
+ assert_same @params, @generator.params
18
+ end
19
+
20
+ def test_distribution_accessor
21
+ assert_equal @distribution, @generator.distribution
22
+ end
23
+
24
+ def test_block_accessor
25
+ assert_equal @block, @generator.block
26
+ end
27
+
28
+ def test_croupier_method_returns_distributions
29
+ assert_same Croupier::Distributions, @generator.croupier
30
+ end
31
+
32
+ def test_to_enum
33
+ assert_equal [1,2,3,1,2], @generator.to_enum.take(5)
34
+ end
35
+ end
@@ -0,0 +1,31 @@
1
+ require "minitest/autorun"
2
+ require "croupier"
3
+
4
+ class TestEnumeratorBlockGenerator < MiniTest::Unit::TestCase
5
+
6
+ def setup
7
+ @klazz = Class.new(::Croupier::Distribution) do
8
+ def my_num
9
+ 2
10
+ end
11
+ end
12
+ @distribution = @klazz.new
13
+ @block = ->(y) { y << my_num while true }
14
+ @gen = ::Croupier::DistributionGenerators::EnumeratorBlockGenerator.new @distribution, &@block
15
+ end
16
+
17
+ def test_initialize_calls_super_and_it_works
18
+ assert_equal @distribution, @gen.distribution
19
+ assert_equal @block, @gen.block
20
+ end
21
+
22
+ def test_to_enum_calls_the_block
23
+ assert_kind_of Enumerator, @gen.to_enum
24
+ assert_equal 2, @gen.to_enum.first
25
+ end
26
+
27
+ def test_block_can_access_methods_in_distribution
28
+ assert_kind_of Enumerator, @gen.to_enum
29
+ assert_equal 2, @gen.to_enum.first
30
+ end
31
+ end
@@ -0,0 +1,33 @@
1
+ require "minitest/autorun"
2
+ require "croupier"
3
+
4
+ class TestEnumeratorGenerator < MiniTest::Unit::TestCase
5
+
6
+ def setup
7
+ @klazz = Class.new(::Croupier::Distribution) do
8
+ def my_num
9
+ 2
10
+ end
11
+ end
12
+ @distribution = @klazz.new
13
+ @block = ->(c) { Enumerator.new do |y| loop do y << [c, my_num]; end; end }
14
+ @gen = ::Croupier::DistributionGenerators::EnumeratorGenerator.new @distribution, &@block
15
+ end
16
+
17
+ def test_initialize_calls_super_and_it_works
18
+ assert_equal @distribution, @gen.distribution
19
+ assert_equal @block, @gen.block
20
+ end
21
+
22
+ def test_to_enum_calls_the_block
23
+ assert_kind_of Enumerator, @gen.to_enum
24
+ mod, num = @gen.to_enum.first
25
+ assert_equal 2, num
26
+ assert_equal ::Croupier::Distributions, mod
27
+ end
28
+
29
+ def test_block_can_access_methods_in_distribution
30
+ assert_kind_of Enumerator, @gen.to_enum
31
+ assert_equal 2, @gen.to_enum.first.last
32
+ end
33
+ end
@@ -0,0 +1,36 @@
1
+ require "minitest/autorun"
2
+ require "croupier"
3
+ class TestInverseCdfGenerator < MiniTest::Unit::TestCase
4
+
5
+ def setup
6
+ @distribution = ::Croupier::Distribution.new
7
+ @block = ->(n) { 2+n }
8
+ @gen = ::Croupier::DistributionGenerators::InverseCDFGenerator.new @distribution, &@block
9
+ end
10
+
11
+ def test_initialize_calls_super_and_it_works
12
+ assert_equal @distribution, @gen.distribution
13
+ assert_equal @block, @gen.block
14
+ end
15
+
16
+ def test_to_enum_calls_the_block
17
+ @gen.to_enum.take(10).each do |n|
18
+ assert_operator 2, :<=, n, "#{n} is not at least 2"
19
+ assert_operator 3, :>, n, "#{n} is not strictly less than 3"
20
+ end
21
+ end
22
+
23
+ def test_block_can_access_methods_in_distribution
24
+ @distribution = Class.new(::Croupier::Distribution) do
25
+ def my_method n
26
+ 2
27
+ end
28
+ end
29
+
30
+ @block = ->(n) { my_method n }
31
+
32
+ @gen = ::Croupier::DistributionGenerators::InverseCDFGenerator.new @distribution.new, &@block
33
+
34
+ assert_equal [2,2,2,2], @gen.to_enum.take(4).to_a
35
+ end
36
+ end
@@ -0,0 +1,33 @@
1
+ require "minitest/autorun"
2
+ require "croupier"
3
+ class TestMinimumSampleGenerator < MiniTest::Unit::TestCase
4
+
5
+ def setup
6
+ @distribution = ::Croupier::Distribution.new
7
+ @block = ->() { [1,2,3] }
8
+ @gen = ::Croupier::DistributionGenerators::MinimumSampleGenerator.new @distribution, &@block
9
+ end
10
+
11
+ def test_initialize_calls_super_and_it_works
12
+ assert_equal @distribution, @gen.distribution
13
+ assert_equal @block, @gen.block
14
+ end
15
+
16
+ def test_to_enum_calls_the_block
17
+ assert_equal [1,2,3,1,2,3,1], @gen.to_enum.take(7).to_a
18
+ end
19
+
20
+ def test_block_can_access_methods_in_distribution
21
+ @distribution = Class.new(::Croupier::Distribution) do
22
+ def my_method
23
+ [1,2,3]
24
+ end
25
+ end.new
26
+
27
+ @block = ->() { my_method }
28
+
29
+ @gen = ::Croupier::DistributionGenerators::MinimumSampleGenerator.new @distribution, &@block
30
+
31
+ assert_equal [1,2,3,1], @gen.to_enum.take(4).to_a
32
+ end
33
+ end
@@ -0,0 +1,13 @@
1
+ require "minitest/autorun"
2
+ require "croupier"
3
+ class TestBinomialDistribution < MiniTest::Unit::TestCase
4
+
5
+ def bernoulli *args
6
+ ::Croupier::Distributions.bernoulli *args
7
+ end
8
+
9
+ def test_success_returns_correct_success
10
+ b = bernoulli success: 0.3
11
+ assert_in_delta 0.3, b.success, 1e-10, "success is not right"
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ require "minitest/autorun"
2
+ require "croupier"
3
+ class TestBinomialDistribution < MiniTest::Unit::TestCase
4
+
5
+ def binomial *args
6
+ ::Croupier::Distributions.binomial *args
7
+ end
8
+
9
+ def test_success_returns_correct_success
10
+ b = binomial size: 15, success: 0.3
11
+ assert_in_delta 0.3, b.success, 1e-10, "success is not right"
12
+ end
13
+
14
+ def test_size_returns_correct_size
15
+ b = binomial size: 15, success: 0.3
16
+ assert_equal 15, b.size
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ require "minitest/autorun"
2
+ require "croupier"
3
+ class TestCauchyDistribution < MiniTest::Unit::TestCase
4
+
5
+ def cauchy *args
6
+ ::Croupier::Distributions.cauchy *args
7
+ end
8
+
9
+ def test_location_returns_correct_location
10
+ c = cauchy location: 3.1, scale: 5.2
11
+ assert_in_delta 3.1, c.location, 1e-10, "location is not right"
12
+ end
13
+
14
+ def test_scale_returns_correct_scale
15
+ c = cauchy location: 3.1, scale: 5.2
16
+ assert_in_delta 5.2, c.scale, 1e-10, "scale is not right"
17
+ end
18
+ end
@@ -16,6 +16,11 @@ class TestDistributionClass < MiniTest::Unit::TestCase
16
16
  assert_respond_to dist, 'description'
17
17
  end
18
18
 
19
+ def test_init_method
20
+ c = Croupier::Distributions::CreditCard.new visa: true, initial_values: "5678"
21
+ assert_equal "45678", c.init
22
+ end
23
+
19
24
  def test_visa_starts_with_4
20
25
  assert_equal "4", credit_card(visa: true)[0]
21
26
  end
@@ -1,6 +1,6 @@
1
1
  require "minitest/autorun"
2
2
  require "croupier"
3
- class TestDistributionClass < MiniTest::Unit::TestCase
3
+ class TestDegenerateDistribution < MiniTest::Unit::TestCase
4
4
 
5
5
  def test_distribution_has_name_and_description
6
6
  dist = Croupier::Distributions::Degenerate.new
@@ -18,6 +18,6 @@ class TestDistributionClass < MiniTest::Unit::TestCase
18
18
  def test_to_enum
19
19
  enum = Croupier::Distributions::Degenerate.new(constant: 5).to_enum
20
20
  assert_kind_of Enumerator, enum
21
- assert_equal [5,5,5], enum.take(3)
21
+ assert_equal [5,5,5], enum.take(3).to_a
22
22
  end
23
23
  end
@@ -0,0 +1,13 @@
1
+ require "minitest/autorun"
2
+ require "croupier"
3
+ class TestExponentialDistribution < MiniTest::Unit::TestCase
4
+
5
+ def exponential *args
6
+ ::Croupier::Distributions.exponential *args
7
+ end
8
+
9
+ def test_lambda_returns_params_lambda
10
+ e = exponential lambda: 30.3
11
+ assert_in_delta 30.3, e.lambda, 1e-10, "lambda is not right"
12
+ end
13
+ end
@@ -0,0 +1,23 @@
1
+ require "minitest/autorun"
2
+ require "croupier"
3
+ class TestGammaDistribution < MiniTest::Unit::TestCase
4
+
5
+ def gamma *args
6
+ ::Croupier::Distributions.gamma *args
7
+ end
8
+
9
+ def test_shape_returns_right_shape
10
+ g = gamma shape: 5.3, scale: 3.1
11
+ assert_in_delta 5.3, g.shape, 1e-10, "shape is not right"
12
+ end
13
+
14
+ def test_scale_returns_right_scale
15
+ g = gamma shape: 5.3, scale: 3.1
16
+ assert_in_delta 3.1, g.scale, 1e-10, "scale is not right"
17
+ end
18
+
19
+ def test_delta_is_correct_delta
20
+ g = gamma shape: 5.3, scale: 3.1
21
+ assert_in_delta 0.3, g.delta, 1e-10, "delta is not right"
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ require "minitest/autorun"
2
+ require "croupier"
3
+ class TestGeometricDistribution < MiniTest::Unit::TestCase
4
+
5
+ def geometric *args
6
+ ::Croupier::Distributions.geometric *args
7
+ end
8
+
9
+ def test_success_returns_success_param
10
+ g = geometric success: 0.7
11
+ assert_in_delta 0.7, g.success, 1e-10, "success is right param"
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ require "minitest/autorun"
2
+ require "croupier"
3
+ class TestNormalDistribution < MiniTest::Unit::TestCase
4
+ def normal *args
5
+ ::Croupier::Distributions.normal *args
6
+ end
7
+
8
+ def test_mean_returns_mean
9
+ n = normal std: 1, mean: 23.2
10
+ assert_in_delta 23.2, n.mean, 1e-10, "mean is right"
11
+ end
12
+
13
+ def test_std_returns_standard_deviation
14
+ n = normal std: 1.23, mean: 2
15
+ assert_in_delta 1.23, n.std, 1e-10, "standard deviation is right"
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ require "minitest/autorun"
2
+ require "croupier"
3
+ class TestPoissonDistribution < MiniTest::Unit::TestCase
4
+
5
+ def poisson *args
6
+ ::Croupier::Distributions.poisson *args
7
+ end
8
+
9
+ def test_lambda_gets_correct_value
10
+ p = poisson lambda: 10.1
11
+ assert_equal 10.1, p.lambda, "lambda is not right"
12
+ end
13
+ end