ardm-validations 1.2.0

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 (153) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +35 -0
  3. data/.travis.yml +11 -0
  4. data/Gemfile +51 -0
  5. data/LICENSE +21 -0
  6. data/README.rdoc +122 -0
  7. data/Rakefile +4 -0
  8. data/ardm-validations.gemspec +28 -0
  9. data/lib/ardm-validations.rb +1 -0
  10. data/lib/dm-validations.rb +169 -0
  11. data/lib/dm-validations/auto_validate.rb +252 -0
  12. data/lib/dm-validations/context.rb +66 -0
  13. data/lib/dm-validations/contextual_validators.rb +220 -0
  14. data/lib/dm-validations/exceptions.rb +5 -0
  15. data/lib/dm-validations/formats/email.rb +65 -0
  16. data/lib/dm-validations/formats/url.rb +27 -0
  17. data/lib/dm-validations/support/object.rb +18 -0
  18. data/lib/dm-validations/support/ordered_hash.rb +434 -0
  19. data/lib/dm-validations/validation_errors.rb +137 -0
  20. data/lib/dm-validations/validators/absent_field_validator.rb +58 -0
  21. data/lib/dm-validations/validators/acceptance_validator.rb +79 -0
  22. data/lib/dm-validations/validators/block_validator.rb +61 -0
  23. data/lib/dm-validations/validators/confirmation_validator.rb +92 -0
  24. data/lib/dm-validations/validators/format_validator.rb +124 -0
  25. data/lib/dm-validations/validators/generic_validator.rb +184 -0
  26. data/lib/dm-validations/validators/length_validator.rb +249 -0
  27. data/lib/dm-validations/validators/method_validator.rb +64 -0
  28. data/lib/dm-validations/validators/numeric_validator.rb +182 -0
  29. data/lib/dm-validations/validators/primitive_validator.rb +58 -0
  30. data/lib/dm-validations/validators/required_field_validator.rb +83 -0
  31. data/lib/dm-validations/validators/uniqueness_validator.rb +67 -0
  32. data/lib/dm-validations/validators/within_validator.rb +74 -0
  33. data/lib/dm-validations/version.rb +5 -0
  34. data/spec/fixtures/barcode.rb +40 -0
  35. data/spec/fixtures/basketball_court.rb +58 -0
  36. data/spec/fixtures/basketball_player.rb +34 -0
  37. data/spec/fixtures/beta_tester_account.rb +33 -0
  38. data/spec/fixtures/bill_of_landing.rb +47 -0
  39. data/spec/fixtures/boat_dock.rb +26 -0
  40. data/spec/fixtures/city.rb +24 -0
  41. data/spec/fixtures/company.rb +93 -0
  42. data/spec/fixtures/corporate_world.rb +39 -0
  43. data/spec/fixtures/country.rb +24 -0
  44. data/spec/fixtures/ethernet_frame.rb +56 -0
  45. data/spec/fixtures/event.rb +44 -0
  46. data/spec/fixtures/g3_concert.rb +57 -0
  47. data/spec/fixtures/jabberwock.rb +27 -0
  48. data/spec/fixtures/kayak.rb +28 -0
  49. data/spec/fixtures/lernean_hydra.rb +39 -0
  50. data/spec/fixtures/llama_spaceship.rb +15 -0
  51. data/spec/fixtures/mathematical_function.rb +34 -0
  52. data/spec/fixtures/memory_object.rb +30 -0
  53. data/spec/fixtures/mittelschnauzer.rb +39 -0
  54. data/spec/fixtures/motor_launch.rb +21 -0
  55. data/spec/fixtures/multibyte.rb +16 -0
  56. data/spec/fixtures/page.rb +32 -0
  57. data/spec/fixtures/phone_number.rb +28 -0
  58. data/spec/fixtures/pirogue.rb +28 -0
  59. data/spec/fixtures/programming_language.rb +83 -0
  60. data/spec/fixtures/reservation.rb +38 -0
  61. data/spec/fixtures/scm_operation.rb +56 -0
  62. data/spec/fixtures/sms_message.rb +22 -0
  63. data/spec/fixtures/udp_packet.rb +49 -0
  64. data/spec/integration/absent_field_validator/absent_field_validator_spec.rb +90 -0
  65. data/spec/integration/absent_field_validator/spec_helper.rb +7 -0
  66. data/spec/integration/acceptance_validator/acceptance_validator_spec.rb +196 -0
  67. data/spec/integration/acceptance_validator/spec_helper.rb +7 -0
  68. data/spec/integration/automatic_validation/custom_messages_for_inferred_validation_spec.rb +57 -0
  69. data/spec/integration/automatic_validation/disabling_inferred_validation_spec.rb +49 -0
  70. data/spec/integration/automatic_validation/inferred_boolean_properties_validation_spec.rb +100 -0
  71. data/spec/integration/automatic_validation/inferred_float_property_validation_spec.rb +45 -0
  72. data/spec/integration/automatic_validation/inferred_format_validation_spec.rb +35 -0
  73. data/spec/integration/automatic_validation/inferred_integer_properties_validation_spec.rb +70 -0
  74. data/spec/integration/automatic_validation/inferred_length_validation_spec.rb +142 -0
  75. data/spec/integration/automatic_validation/inferred_presence_validation_spec.rb +45 -0
  76. data/spec/integration/automatic_validation/inferred_primitive_validation_spec.rb +22 -0
  77. data/spec/integration/automatic_validation/inferred_uniqueness_validation_spec.rb +52 -0
  78. data/spec/integration/automatic_validation/inferred_within_validation_spec.rb +39 -0
  79. data/spec/integration/automatic_validation/spec_helper.rb +57 -0
  80. data/spec/integration/block_validator/block_validator_spec.rb +32 -0
  81. data/spec/integration/block_validator/spec_helper.rb +5 -0
  82. data/spec/integration/conditional_validation/if_condition_spec.rb +63 -0
  83. data/spec/integration/conditional_validation/spec_helper.rb +5 -0
  84. data/spec/integration/confirmation_validator/confirmation_validator_spec.rb +76 -0
  85. data/spec/integration/confirmation_validator/spec_helper.rb +5 -0
  86. data/spec/integration/datamapper_models/association_validation_spec.rb +29 -0
  87. data/spec/integration/datamapper_models/inheritance_spec.rb +82 -0
  88. data/spec/integration/dirty_attributes/dirty_attributes_spec.rb +13 -0
  89. data/spec/integration/duplicated_validations/duplicated_validations_spec.rb +24 -0
  90. data/spec/integration/duplicated_validations/spec_helper.rb +5 -0
  91. data/spec/integration/format_validator/email_format_validator_spec.rb +139 -0
  92. data/spec/integration/format_validator/format_validator_spec.rb +64 -0
  93. data/spec/integration/format_validator/regexp_validator_spec.rb +33 -0
  94. data/spec/integration/format_validator/spec_helper.rb +5 -0
  95. data/spec/integration/format_validator/url_format_validator_spec.rb +93 -0
  96. data/spec/integration/length_validator/default_value_spec.rb +14 -0
  97. data/spec/integration/length_validator/equality_spec.rb +87 -0
  98. data/spec/integration/length_validator/error_message_spec.rb +22 -0
  99. data/spec/integration/length_validator/maximum_spec.rb +49 -0
  100. data/spec/integration/length_validator/minimum_spec.rb +54 -0
  101. data/spec/integration/length_validator/range_spec.rb +87 -0
  102. data/spec/integration/length_validator/spec_helper.rb +7 -0
  103. data/spec/integration/method_validator/method_validator_spec.rb +241 -0
  104. data/spec/integration/method_validator/spec_helper.rb +5 -0
  105. data/spec/integration/numeric_validator/equality_with_float_type_spec.rb +65 -0
  106. data/spec/integration/numeric_validator/equality_with_integer_type_spec.rb +41 -0
  107. data/spec/integration/numeric_validator/float_type_spec.rb +90 -0
  108. data/spec/integration/numeric_validator/gt_with_float_type_spec.rb +37 -0
  109. data/spec/integration/numeric_validator/gte_with_float_type_spec.rb +37 -0
  110. data/spec/integration/numeric_validator/integer_only_true_spec.rb +91 -0
  111. data/spec/integration/numeric_validator/integer_type_spec.rb +86 -0
  112. data/spec/integration/numeric_validator/lt_with_float_type_spec.rb +37 -0
  113. data/spec/integration/numeric_validator/lte_with_float_type_spec.rb +37 -0
  114. data/spec/integration/numeric_validator/spec_helper.rb +5 -0
  115. data/spec/integration/primitive_validator/primitive_validator_spec.rb +92 -0
  116. data/spec/integration/primitive_validator/spec_helper.rb +5 -0
  117. data/spec/integration/pure_ruby_objects/plain_old_ruby_object_validation_spec.rb +118 -0
  118. data/spec/integration/required_field_validator/association_spec.rb +72 -0
  119. data/spec/integration/required_field_validator/boolean_type_value_spec.rb +155 -0
  120. data/spec/integration/required_field_validator/date_type_value_spec.rb +127 -0
  121. data/spec/integration/required_field_validator/datetime_type_value_spec.rb +127 -0
  122. data/spec/integration/required_field_validator/float_type_value_spec.rb +131 -0
  123. data/spec/integration/required_field_validator/integer_type_value_spec.rb +99 -0
  124. data/spec/integration/required_field_validator/plain_old_ruby_object_spec.rb +35 -0
  125. data/spec/integration/required_field_validator/shared_examples.rb +26 -0
  126. data/spec/integration/required_field_validator/spec_helper.rb +7 -0
  127. data/spec/integration/required_field_validator/string_type_value_spec.rb +167 -0
  128. data/spec/integration/required_field_validator/text_type_value_spec.rb +49 -0
  129. data/spec/integration/shared/default_validation_context.rb +13 -0
  130. data/spec/integration/shared/valid_and_invalid_model.rb +35 -0
  131. data/spec/integration/uniqueness_validator/spec_helper.rb +5 -0
  132. data/spec/integration/uniqueness_validator/uniqueness_validator_spec.rb +116 -0
  133. data/spec/integration/within_validator/spec_helper.rb +5 -0
  134. data/spec/integration/within_validator/within_validator_spec.rb +168 -0
  135. data/spec/public/resource_spec.rb +105 -0
  136. data/spec/rcov.opts +6 -0
  137. data/spec/spec.opts +4 -0
  138. data/spec/spec_helper.rb +29 -0
  139. data/spec/unit/contextual_validators/emptiness_spec.rb +50 -0
  140. data/spec/unit/contextual_validators/execution_spec.rb +48 -0
  141. data/spec/unit/contextual_validators/spec_helper.rb +37 -0
  142. data/spec/unit/generic_validator/equality_operator_spec.rb +26 -0
  143. data/spec/unit/generic_validator/optional_spec.rb +54 -0
  144. data/spec/unit/validation_errors/adding_spec.rb +54 -0
  145. data/spec/unit/validation_errors/emptiness_spec.rb +38 -0
  146. data/spec/unit/validation_errors/enumerable_spec.rb +32 -0
  147. data/spec/unit/validation_errors/reading_spec.rb +35 -0
  148. data/spec/unit/validation_errors/respond_to_spec.rb +15 -0
  149. data/spec/unit/validators/within_validator_spec.rb +23 -0
  150. data/tasks/spec.rake +38 -0
  151. data/tasks/yard.rake +9 -0
  152. data/tasks/yardstick.rake +19 -0
  153. metadata +256 -0
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+ require 'integration/length_validator/spec_helper'
3
+
4
+ describe 'DataMapper::Validations::Fixtures::BoatDock' do
5
+ before :all do
6
+ DataMapper::Validations::Fixtures::BoatDock.auto_migrate!
7
+
8
+ @model = DataMapper::Validations::Fixtures::BoatDock.new
9
+ end
10
+
11
+ describe "with default values that are valid" do
12
+ it_should_behave_like "valid model"
13
+ end
14
+ end
@@ -0,0 +1,87 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+ require 'integration/length_validator/spec_helper'
5
+
6
+ describe "entity with wrong destination MAC address length", :shared => true do
7
+ it "has error message with range bounds" do
8
+ @model.errors.on(:destination_mac).should == [ 'Destination mac must be 6 characters long' ]
9
+ end
10
+ end
11
+
12
+
13
+ describe 'DataMapper::Validations::Fixtures::EthernetFrame' do
14
+ before :all do
15
+ DataMapper::Validations::Fixtures::EthernetFrame.auto_migrate!
16
+
17
+ @model = DataMapper::Validations::Fixtures::EthernetFrame.valid_instance
18
+ @model.link_support_fragmentation = false
19
+ end
20
+
21
+ it_should_behave_like "valid model"
22
+
23
+ describe "with destination MAC 3 'bits' long" do
24
+ before :all do
25
+ @model.destination_mac = "123"
26
+ @model.valid?
27
+ end
28
+
29
+ it_should_behave_like "invalid model"
30
+
31
+ it_should_behave_like "entity with wrong destination MAC address length"
32
+ end
33
+
34
+ describe "with destination MAC 8 'bits' long" do
35
+ before :all do
36
+ @model.destination_mac = "123abce8"
37
+ @model.valid?
38
+ end
39
+
40
+ it_should_behave_like "invalid model"
41
+
42
+ it_should_behave_like "entity with wrong destination MAC address length"
43
+ end
44
+
45
+ # arguable but reasonable for 80% of cases
46
+ # to treat nil as a 0 lengh value
47
+ # reported in
48
+ # http://datamapper.lighthouseapp.com/projects/20609/tickets/646
49
+ describe "that has no destination MAC address" do
50
+ before :all do
51
+ @model.destination_mac = nil
52
+ @model.valid?
53
+ end
54
+
55
+ it_should_behave_like "invalid model"
56
+
57
+ it_should_behave_like "entity with wrong destination MAC address length"
58
+ end
59
+
60
+ describe "with a 6 'bits' destination MAC address" do
61
+ before :all do
62
+ @model.destination_mac = "a1b2c3"
63
+ @model.valid?
64
+ end
65
+
66
+ it_should_behave_like "valid model"
67
+ end
68
+
69
+ describe "with multibyte characters" do
70
+ before :all do
71
+ begin
72
+ # force normal encoding in this block
73
+ original, $KCODE = $KCODE, 'N' if RUBY_VERSION <= '1.8.6'
74
+
75
+ # example from: http://intertwingly.net/stories/2004/04/14/i18n.html
76
+ @model = DataMapper::Validations::Fixtures::Multibyte.new(
77
+ :name => 'Iñtërnâtiônàlizætiøn'
78
+ )
79
+ @model.should be_valid
80
+ ensure
81
+ $KCODE = original if RUBY_VERSION <= '1.8.6'
82
+ end
83
+ end
84
+
85
+ it_should_behave_like "valid model"
86
+ end
87
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+ require 'integration/length_validator/spec_helper'
3
+
4
+ describe 'DataMapper::Validations::Fixtures::Jabberwock' do
5
+ before :all do
6
+ DataMapper::Validations::Fixtures::Jabberwock.auto_migrate!
7
+
8
+ @model = DataMapper::Validations::Fixtures::Jabberwock.new
9
+ end
10
+
11
+ describe "without snickersnack" do
12
+ before :all do
13
+ @model.snickersnack = nil
14
+ end
15
+
16
+ it_should_behave_like "invalid model"
17
+
18
+ it "has custom error message" do
19
+ @model.errors.on(:snickersnack).should == [ 'worble warble' ]
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+ require 'integration/length_validator/spec_helper'
3
+
4
+ describe "barcode with invalid code length", :shared => true do
5
+ it "has a meaninful error message with length restrictions mentioned" do
6
+ @model.errors.on(:code).should == [ 'Code must be at most 10 characters long' ]
7
+ end
8
+ end
9
+
10
+ describe 'DataMapper::Validations::Fixtures::Barcode' do
11
+ before :all do
12
+ DataMapper::Validations::Fixtures::Barcode.auto_migrate!
13
+
14
+ @model = DataMapper::Validations::Fixtures::Barcode.valid_instance
15
+ end
16
+
17
+ it_should_behave_like "valid model"
18
+
19
+ describe "with a 17 characters long code" do
20
+ before :all do
21
+ @model.code = "18283849284728124"
22
+ @model.valid?
23
+ end
24
+
25
+ it_should_behave_like "invalid model"
26
+
27
+ it_should_behave_like "barcode with invalid code length"
28
+ end
29
+
30
+ describe "with a 7 characters long code" do
31
+ before :all do
32
+ @model.code = "8372786"
33
+ @model.valid?
34
+ end
35
+
36
+ it_should_behave_like "valid model"
37
+ end
38
+
39
+ describe "with an 11 characters long code" do
40
+ before :all do
41
+ @model.code = "83727868754"
42
+ @model.valid?
43
+ end
44
+
45
+ it_should_behave_like "invalid model"
46
+
47
+ it_should_behave_like "barcode with invalid code length"
48
+ end
49
+ end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+ require 'integration/length_validator/spec_helper'
3
+
4
+ describe "entity with a name shorter than 2 characters", :shared => true do
5
+ it "has a meaninful error message with length restrictions mentioned" do
6
+ @model.errors.on(:name).should == [ 'Name must be at least 2 characters long' ]
7
+ end
8
+ end
9
+
10
+ describe 'DataMapper::Validations::Fixtures::Mittelschnauzer' do
11
+ before :all do
12
+ DataMapper::Validations::Fixtures::Mittelschnauzer.auto_migrate!
13
+
14
+ @model = DataMapper::Validations::Fixtures::Mittelschnauzer.valid_instance
15
+ end
16
+
17
+ it_should_behave_like "valid model"
18
+
19
+ describe "with a 13 characters long name" do
20
+ it_should_behave_like "valid model"
21
+ end
22
+
23
+ describe "with a single character name" do
24
+ before :all do
25
+ @model.name = "R"
26
+ @model.valid?
27
+ end
28
+
29
+ it_should_behave_like "invalid model"
30
+
31
+ it_should_behave_like "entity with a name shorter than 2 characters"
32
+ end
33
+
34
+ describe "with blank name" do
35
+ before :all do
36
+ @model.name = ""
37
+ @model.valid?
38
+ end
39
+
40
+ it_should_behave_like "invalid model"
41
+
42
+ it_should_behave_like "entity with a name shorter than 2 characters"
43
+ end
44
+
45
+ describe "persisted, with a single character owner" do
46
+ before :all do
47
+ @model.save
48
+ @model.owner = 'a'
49
+ @model.valid?
50
+ end
51
+
52
+ it_should_behave_like "invalid model"
53
+ end
54
+ end
@@ -0,0 +1,87 @@
1
+ require 'spec_helper'
2
+ require 'integration/length_validator/spec_helper'
3
+
4
+ describe 'DataMapper::Validations::Fixtures::EthernetFrame' do
5
+ before :all do
6
+ DataMapper::Validations::Fixtures::EthernetFrame.auto_migrate!
7
+
8
+ @model = DataMapper::Validations::Fixtures::EthernetFrame.valid_instance
9
+ @model.link_support_fragmentation = false
10
+ end
11
+
12
+ it_should_behave_like "valid model"
13
+
14
+ describe "with payload that is 7 'bits' long (too short)" do
15
+ before :all do
16
+ @model.payload = "1234567"
17
+ @model.valid?
18
+ end
19
+
20
+ it_should_behave_like "invalid model"
21
+
22
+ it "has error message with range bounds" do
23
+ @model.errors.on(:payload).should == [ 'Payload must be between 46 and 1500 characters long' ]
24
+ end
25
+ end
26
+
27
+
28
+ describe "with a one character long payload (too short)" do
29
+ before :all do
30
+ @model.payload = 'a'
31
+ @model.valid?
32
+ end
33
+
34
+ it_should_behave_like "invalid model"
35
+
36
+ it "has error message with range bounds" do
37
+ @model.errors.on(:payload).should == [ 'Payload must be between 46 and 1500 characters long' ]
38
+ end
39
+ end
40
+
41
+
42
+ describe "with a 1600 'bits' long payload (needs fragmentation)" do
43
+ before :all do
44
+ @model.payload = 'a'
45
+ @model.valid?
46
+ end
47
+
48
+ it_should_behave_like "invalid model"
49
+
50
+ it "has error message with range bounds" do
51
+ @model.errors.on(:payload).should == [ 'Payload must be between 46 and 1500 characters long' ]
52
+ end
53
+ end
54
+
55
+
56
+ # arguable but reasonable for 80% of cases
57
+ # to treat nil as a 0 lengh value
58
+ # reported in
59
+ # http://datamapper.lighthouseapp.com/projects/20609/tickets/646
60
+ describe "that has no payload" do
61
+ before :all do
62
+ @model.payload = nil
63
+ @model.valid?
64
+ end
65
+
66
+ it_should_behave_like "invalid model"
67
+
68
+ it "has error message with range bounds" do
69
+ @model.errors.on(:payload).should == [ 'Payload must be between 46 and 1500 characters long' ]
70
+ end
71
+ end
72
+
73
+
74
+
75
+ describe "with a 50 characters long payload" do
76
+ before :all do
77
+ @model.payload = 'Imagine yourself a beautiful bag full of bits here'
78
+ @model.valid?
79
+ end
80
+
81
+ it_should_behave_like "valid model"
82
+
83
+ it "has blank error message" do
84
+ @model.errors.on(:payload).should be_nil
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,7 @@
1
+ # put validator specific fixture models and helpers here
2
+ #
3
+ # make sure you check out spec/fixtures to see fixture models
4
+ # already written
5
+ #
6
+ # DataMapper developers feels strongly against foobars in the spec
7
+ # suite
@@ -0,0 +1,241 @@
1
+ require 'spec_helper'
2
+ require 'integration/method_validator/spec_helper'
3
+
4
+ describe "a good fit for DSLs", :shared => true do
5
+ it "is a good fit for DSLs" do
6
+ @model.should be_valid_for_implementing_a_dsl
7
+ end
8
+
9
+ it "is totally fine for DSLs" do
10
+ @model.ensure_appropriate_for_dsls.should be(true)
11
+ end
12
+ end
13
+
14
+ describe "a poor candidate for DSLs", :shared => true do
15
+ it "is a poor candidate for DSLs" do
16
+ @model.should_not be_valid_for_implementing_a_dsl
17
+ end
18
+
19
+ it "is unappropriate for DSLs" do
20
+ @model.ensure_appropriate_for_dsls.first.should be(false)
21
+ end
22
+
23
+ it "has a (more or less) meaningful error message" do
24
+ @model.errors.on(:ensure_appropriate_for_dsls).should == [ 'may not be so good for domain specific languages' ]
25
+ end
26
+ end
27
+
28
+
29
+ describe "a good fit for game engine core", :shared => true do
30
+ it "is a good fit for game engine core" do
31
+ @model.should be_valid_for_implementing_a_game_engine_core
32
+ end
33
+
34
+ it "is appropriate for system programming" do
35
+ @model.ensure_appropriate_for_system_programming.should be(true)
36
+ end
37
+ end
38
+
39
+ describe "a poor candidate for game engine core", :shared => true do
40
+ it "is a poor candidate for game engine core" do
41
+ @model.should_not be_valid_for_implementing_a_game_engine_core
42
+ end
43
+ end
44
+
45
+
46
+
47
+ describe "a good fit for kernel hacking", :shared => true do
48
+ it "is a good fit for kernel hacking" do
49
+ @model.should be_valid_for_hacking_on_the_kernel
50
+ end
51
+
52
+ it "is appropriate for system programming" do
53
+ @model.ensure_appropriate_for_system_programming.should be(true)
54
+ end
55
+ end
56
+
57
+
58
+ describe "a poor candidate for kernel hacking", :shared => true do
59
+ it "is not a good fit for kernel hacking" do
60
+ @model.should_not be_valid_for_hacking_on_the_kernel
61
+ end
62
+ end
63
+
64
+ #
65
+ # Note that ProgrammingLanguage is not a DM resource,
66
+ # it is a plain old Ruby object (PORO), or simply put,
67
+ # just a "regular" Ruby class with a bunch of accessors.
68
+ #
69
+ # And yes, assumptions below are full of bullshit and
70
+ # author is a moron, and your favourite programming
71
+ # language is good for EVARYTHIN'!
72
+ #
73
+ #Please see spec_helper.rb next to this file
74
+ #
75
+
76
+ describe "C" do
77
+ before :all do
78
+ @model = ::DataMapper::Validations::Fixtures::ProgrammingLanguage.new(:name => "C",
79
+ :allows_system_calls => true,
80
+ :allows_manual_memory_management => true,
81
+ :approved_by_linus => true,
82
+ :compiler_excels_at_utilizing_cpu_cache => true,
83
+ :is_very_high_level => false,
84
+ :does_not_require_explicit_return_keyword => false,
85
+ :allows_operator_overload => false,
86
+ :allows_optional_parentheses => false
87
+ )
88
+ end
89
+
90
+ it_should_behave_like "a good fit for kernel hacking"
91
+
92
+ it_should_behave_like "a good fit for game engine core"
93
+
94
+ it_should_behave_like "a poor candidate for DSLs"
95
+ end
96
+
97
+
98
+
99
+ describe "C++" do
100
+ before :all do
101
+ @model = ::DataMapper::Validations::Fixtures::ProgrammingLanguage.new(:name => "C++",
102
+ :allows_system_calls => true,
103
+ :allows_manual_memory_management => true,
104
+ :approved_by_linus => false,
105
+ :compiler_excels_at_utilizing_cpu_cache => true,
106
+ :is_very_high_level => false,
107
+ :does_not_require_explicit_return_keyword => false,
108
+ :allows_operator_overload => true,
109
+ :allows_optional_parentheses => false
110
+ )
111
+ end
112
+
113
+ it_should_behave_like "a poor candidate for kernel hacking"
114
+
115
+ it_should_behave_like "a good fit for game engine core"
116
+
117
+ it_should_behave_like "a poor candidate for DSLs"
118
+
119
+ it "is not approved by Linus" do
120
+ @model.valid?(:hacking_on_the_kernel)
121
+ @model.errors.on(:ensure_approved_by_linus_himself).should_not be_empty
122
+ end
123
+ end
124
+
125
+
126
+ describe "Ruby" do
127
+ before :all do
128
+ @model = ::DataMapper::Validations::Fixtures::ProgrammingLanguage.new(:name => "Ruby",
129
+ # well, C extensions do not really count
130
+ :allows_system_calls => false,
131
+ :allows_manual_memory_management => false,
132
+ :approved_by_linus => false,
133
+ :compiler_excels_at_utilizing_cpu_cache => false,
134
+ :is_very_high_level => true,
135
+ :does_not_require_explicit_return_keyword => true,
136
+ :allows_operator_overload => true,
137
+ :allows_optional_parentheses => true
138
+ )
139
+ end
140
+
141
+ it_should_behave_like "a good fit for DSLs"
142
+
143
+ it_should_behave_like "a poor candidate for kernel hacking"
144
+
145
+ it_should_behave_like "a poor candidate for game engine core"
146
+
147
+ it "has a (more or less) meaningful error message" do
148
+ @model.valid?(:doing_system_programming)
149
+ @model.errors.on(:ensure_appropriate_for_system_programming).should == [ 'try something that is closer to the metal' ]
150
+ end
151
+ end
152
+
153
+
154
+ describe "Scala" do
155
+ before :all do
156
+ @model = ::DataMapper::Validations::Fixtures::ProgrammingLanguage.new(:name => "Scala",
157
+ :allows_system_calls => false,
158
+ :allows_manual_memory_management => false,
159
+ :approved_by_linus => false,
160
+ :compiler_excels_at_utilizing_cpu_cache => false,
161
+ :is_very_high_level => true,
162
+ :does_not_require_explicit_return_keyword => true,
163
+ :allows_operator_overload => true,
164
+ :allows_optional_parentheses => true
165
+ )
166
+ end
167
+
168
+ it_should_behave_like "a good fit for DSLs"
169
+
170
+ it_should_behave_like "a poor candidate for kernel hacking"
171
+
172
+ it_should_behave_like "a poor candidate for game engine core"
173
+
174
+ it "has a (more or less) meaningful error message" do
175
+ @model.valid?(:doing_system_programming)
176
+ @model.errors.on(:ensure_appropriate_for_system_programming).should == [ 'try something that is closer to the metal' ]
177
+ end
178
+ end
179
+
180
+
181
+
182
+ describe "Haskell" do
183
+ before :all do
184
+ @model = ::DataMapper::Validations::Fixtures::ProgrammingLanguage.new(:name => "Haskell",
185
+ :allows_system_calls => false,
186
+ :allows_manual_memory_management => false,
187
+ :approved_by_linus => false,
188
+ :compiler_excels_at_utilizing_cpu_cache => true,
189
+ :is_very_high_level => true,
190
+ :does_not_require_explicit_return_keyword => true,
191
+ # operators are not different from any other function
192
+ :allows_operator_overload => true,
193
+ # or, allows explicit parentheses? who cares, we
194
+ # are just trying to come up with a relatively
195
+ # non-stupid spec example
196
+ :allows_optional_parentheses => true
197
+ )
198
+ end
199
+
200
+ it_should_behave_like "a good fit for DSLs"
201
+
202
+ it_should_behave_like "a poor candidate for kernel hacking"
203
+
204
+ it_should_behave_like "a poor candidate for game engine core"
205
+
206
+ it "has a (more or less) meaningful error message" do
207
+ @model.valid?(:doing_system_programming)
208
+ @model.errors.on(:ensure_appropriate_for_system_programming).should == [ 'try something that is closer to the metal' ]
209
+ end
210
+ end
211
+
212
+
213
+ describe 'DataMapper::Validations::Fixtures::Event' do
214
+ before :all do
215
+ DataMapper::Validations::Fixtures::Event.auto_migrate!
216
+
217
+ @model = DataMapper::Validations::Fixtures::Event.new(:name => "Fools day 2009")
218
+ end
219
+
220
+ describe "with start time before end time" do
221
+ before :all do
222
+ @model.starts_at = DateTime.new(2009, 4, 1, 00, 00, 01)
223
+ @model.ends_at = DateTime.new(2009, 4, 1, 23, 59, 59)
224
+ end
225
+
226
+ it_should_behave_like "valid model"
227
+ end
228
+
229
+ describe "with start time after end time" do
230
+ before :all do
231
+ @model.starts_at = DateTime.new(2009, 4, 1, 23, 59, 59)
232
+ @model.ends_at = DateTime.new(2009, 4, 1, 00, 00, 01)
233
+ end
234
+
235
+ it_should_behave_like "invalid model"
236
+
237
+ it "uses custom error message for property starts_at" do
238
+ @model.errors.on(:starts_at).should == [ 'Start time cannot be after end time' ]
239
+ end
240
+ end
241
+ end