ValidatesNumericalityOfTest.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <?php
  2. include 'helpers/config.php';
  3. class BookNumericality extends ActiveRecord\Model
  4. {
  5. static $table_name = 'books';
  6. static $validates_numericality_of = array(
  7. array('name')
  8. );
  9. }
  10. class ValidatesNumericalityOfTest extends DatabaseTest
  11. {
  12. static $NULL = array(null);
  13. static $BLANK = array("", " ", " \t \r \n");
  14. static $FLOAT_STRINGS = array('0.0','+0.0','-0.0','10.0','10.5','-10.5','-0.0001','-090.1');
  15. static $INTEGER_STRINGS = array('0', '+0', '-0', '10', '+10', '-10', '0090', '-090');
  16. static $FLOATS = array(0.0, 10.0, 10.5, -10.5, -0.0001);
  17. static $INTEGERS = array(0, 10, -10);
  18. static $JUNK = array("not a number", "42 not a number", "00-1", "--3", "+-3", "+3-1", "-+019.0", "12.12.13.12", "123\nnot a number");
  19. public function set_up($connection_name=null)
  20. {
  21. parent::set_up($connection_name);
  22. BookNumericality::$validates_numericality_of = array(
  23. array('numeric_test')
  24. );
  25. }
  26. private function assert_validity($value, $boolean, $msg=null)
  27. {
  28. $book = new BookNumericality;
  29. $book->numeric_test = $value;
  30. if ($boolean == 'valid')
  31. {
  32. $this->assert_true($book->save());
  33. $this->assert_false($book->errors->is_invalid('numeric_test'));
  34. }
  35. else
  36. {
  37. $this->assert_false($book->save());
  38. $this->assert_true($book->errors->is_invalid('numeric_test'));
  39. if (!is_null($msg))
  40. $this->assert_same($msg, $book->errors->on('numeric_test'));
  41. }
  42. }
  43. private function assert_invalid($values, $msg=null)
  44. {
  45. foreach ($values as $value)
  46. $this->assert_validity($value, 'invalid', $msg);
  47. }
  48. private function assert_valid($values, $msg=null)
  49. {
  50. foreach ($values as $value)
  51. $this->assert_validity($value, 'valid', $msg);
  52. }
  53. public function test_numericality()
  54. {
  55. //$this->assert_invalid(array("0xdeadbeef"));
  56. $this->assert_valid(array_merge(self::$FLOATS, self::$INTEGERS));
  57. $this->assert_invalid(array_merge(self::$NULL, self::$BLANK, self::$JUNK));
  58. }
  59. public function test_not_anumber()
  60. {
  61. $this->assert_invalid(array('blah'), 'is not a number');
  62. }
  63. public function test_invalid_null()
  64. {
  65. $this->assert_invalid(array(null));
  66. }
  67. public function test_invalid_blank()
  68. {
  69. $this->assert_invalid(array(' ', ' '), 'is not a number');
  70. }
  71. public function test_invalid_whitespace()
  72. {
  73. $this->assert_invalid(array(''));
  74. }
  75. public function test_valid_null()
  76. {
  77. BookNumericality::$validates_numericality_of[0]['allow_null'] = true;
  78. $this->assert_valid(array(null));
  79. }
  80. public function test_only_integer()
  81. {
  82. BookNumericality::$validates_numericality_of[0]['only_integer'] = true;
  83. $this->assert_valid(array(1, '1'));
  84. $this->assert_invalid(array(1.5, '1.5'));
  85. }
  86. public function test_only_integer_matching_does_not_ignore_other_options()
  87. {
  88. BookNumericality::$validates_numericality_of[0]['only_integer'] = true;
  89. BookNumericality::$validates_numericality_of[0]['greater_than'] = 0;
  90. $this->assert_invalid(array(-1,'-1'));
  91. }
  92. public function test_greater_than()
  93. {
  94. BookNumericality::$validates_numericality_of[0]['greater_than'] = 5;
  95. $this->assert_valid(array(6, '7'));
  96. $this->assert_invalid(array(5, '5'), 'must be greater than 5');
  97. }
  98. public function test_greater_than_or_equal_to()
  99. {
  100. BookNumericality::$validates_numericality_of[0]['greater_than_or_equal_to'] = 5;
  101. $this->assert_valid(array(5, 5.1, '5.1'));
  102. $this->assert_invalid(array(-50, 4.9, '4.9','-5.1'));
  103. }
  104. public function test_less_than()
  105. {
  106. BookNumericality::$validates_numericality_of[0]['less_than'] = 5;
  107. $this->assert_valid(array(4.9, -1, 0, '-5'));
  108. $this->assert_invalid(array(5, '5'), 'must be less than 5');
  109. }
  110. public function test_less_than_or_equal_to()
  111. {
  112. BookNumericality::$validates_numericality_of[0]['less_than_or_equal_to'] = 5;
  113. $this->assert_valid(array(5, -1, 0, 4.9, '-5'));
  114. $this->assert_invalid(array('8', 5.1), 'must be less than or equal to 5');
  115. }
  116. public function test_greater_than_less_than_and_even()
  117. {
  118. BookNumericality::$validates_numericality_of[0] = array('numeric_test', 'greater_than' => 1, 'less_than' => 4, 'even' => true);
  119. $this->assert_valid(array(2));
  120. $this->assert_invalid(array(1,3,4));
  121. }
  122. public function test_custom_message()
  123. {
  124. BookNumericality::$validates_numericality_of = array(
  125. array('numeric_test', 'message' => 'Hello')
  126. );
  127. $book = new BookNumericality(array('numeric_test' => 'NaN'));
  128. $book->is_valid();
  129. $this->assert_equals(array('Numeric test Hello'),$book->errors->full_messages());
  130. }
  131. };
  132. array_merge(ValidatesNumericalityOfTest::$INTEGERS, ValidatesNumericalityOfTest::$INTEGER_STRINGS);
  133. array_merge(ValidatesNumericalityOfTest::$FLOATS, ValidatesNumericalityOfTest::$FLOAT_STRINGS);
  134. ?>