PageRenderTime 46ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/test/ValidatesNumericalityOfTest.php

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