14
14
15
15
import qgis # NOQA
16
16
17
- from qgis .PyQt .QtCore import QVariant
17
+ from qgis .PyQt .QtCore import QVariant , QLocale
18
18
from qgis .PyQt .QtGui import QValidator
19
19
from qgis .core import QgsVectorLayer
20
20
from qgis .gui import QgsFieldValidator
@@ -39,45 +39,41 @@ def tearDown(self):
39
39
"""Run after each test."""
40
40
pass
41
41
42
- def test_validator (self ):
43
- # Test the double
44
- """
42
+ def _fld_checker (self , field ):
43
+ """
45
44
Expected results from validate
46
45
QValidator::Invalid 0 The string is clearly invalid.
47
46
QValidator::Intermediate 1 The string is a plausible intermediate value.
48
47
QValidator::Acceptable 2 The string is acceptable as a final result; i.e. it is valid.
49
48
"""
49
+ DECIMAL_SEPARATOR = QLocale ().decimalPoint ()
50
+ OTHER_SEPARATOR = ',' if DECIMAL_SEPARATOR == '.' else '.'
50
51
51
- double_field = self .vl .fields ()[self .vl .fields ().indexFromName ('double_field' )]
52
- self .assertEqual (double_field .precision (), 0 ) # this is what the provider reports :(
53
- self .assertEqual (double_field .length (), 0 ) # not set
54
- self .assertEqual (double_field .type (), QVariant .Double )
55
-
56
- validator = QgsFieldValidator (None , double_field , '0.0' , '' )
52
+ validator = QgsFieldValidator (None , field , '0.0' , '' )
57
53
58
54
def _test (value , expected ):
59
55
ret = validator .validate (value , 0 )
60
- self .assertEqual (ret [0 ], expected , value )
56
+ self .assertEqual (ret [0 ], expected , "%s != %s" % ( ret [ 0 ], expected ) )
61
57
if value :
62
58
self .assertEqual (validator .validate ('-' + value , 0 )[0 ], expected , '-' + value )
63
- # Check the decimal comma separator has been properly transformed
64
- if expected != QValidator .Invalid :
65
- self .assertEqual (ret [1 ], value .replace (',' , '.' ))
66
59
67
60
# Valid
68
61
_test ('0.1234' , QValidator .Acceptable )
69
62
_test ('0,1234' , QValidator .Acceptable )
70
- _test ('12345.1234e+123' , QValidator .Acceptable )
71
- _test ('12345.1234e-123' , QValidator .Acceptable )
72
- _test ('12345,1234e+123' , QValidator .Acceptable )
73
- _test ('12345,1234e-123' , QValidator .Acceptable )
74
- _test ('' , QValidator .Acceptable )
75
63
76
- # Out of range
77
- _test ('12345.1234e+823' , QValidator .Intermediate )
78
- _test ('12345.1234e-823' , QValidator .Intermediate )
79
- _test ('12345,1234e+823' , QValidator .Intermediate )
80
- _test ('12345,1234e-823' , QValidator .Intermediate )
64
+ # If precision is > 0, regexp validator is used (and it does not support sci notation)
65
+ if field .precision () == 0 :
66
+ _test ('12345.1234e+123' , QValidator .Acceptable )
67
+ _test ('12345.1234e-123' , QValidator .Acceptable )
68
+ _test ('12345,1234e+123' , QValidator .Acceptable )
69
+ _test ('12345,1234e-123' , QValidator .Acceptable )
70
+ _test ('' , QValidator .Acceptable )
71
+
72
+ # Out of range
73
+ _test ('12345.1234e+823' , QValidator .Intermediate )
74
+ _test ('12345.1234e-823' , QValidator .Intermediate )
75
+ _test ('12345,1234e+823' , QValidator .Intermediate )
76
+ _test ('12345,1234e-823' , QValidator .Intermediate )
81
77
82
78
# Invalid
83
79
_test ('12345-1234' , QValidator .Invalid )
@@ -97,9 +93,39 @@ def _test(value, expected):
97
93
98
94
# Invalid
99
95
_test ('12345-1234' , QValidator .Invalid )
100
- _test ('12345.1234' , QValidator .Invalid )
96
+ _test ('12345%s1234' % DECIMAL_SEPARATOR , QValidator .Invalid )
101
97
_test ('onetwothree' , QValidator .Invalid )
102
98
99
+ def test_doubleValidator (self ):
100
+ """Test the double with default (system) locale"""
101
+ field = self .vl .fields ()[self .vl .fields ().indexFromName ('double_field' )]
102
+ self .assertEqual (field .precision (), 0 ) # this is what the provider reports :(
103
+ self .assertEqual (field .length (), 0 ) # not set
104
+ self .assertEqual (field .type (), QVariant .Double )
105
+ self ._fld_checker (field )
106
+
107
+ def test_doubleValidatorCommaLocale (self ):
108
+ """Test the double with german locale"""
109
+ QLocale .setDefault (QLocale (QLocale .German , QLocale .Germany ))
110
+ assert QLocale ().decimalPoint () == ','
111
+ field = self .vl .fields ()[self .vl .fields ().indexFromName ('double_field' )]
112
+ self ._fld_checker (field )
113
+
114
+ def test_doubleValidatorDotLocale (self ):
115
+ """Test the double with english locale"""
116
+ QLocale .setDefault (QLocale (QLocale .English ))
117
+ assert QLocale ().decimalPoint () == '.'
118
+ field = self .vl .fields ()[self .vl .fields ().indexFromName ('double_field' )]
119
+ self ._fld_checker (field )
120
+
121
+ def test_precision (self ):
122
+ """Test different precision"""
123
+ QLocale .setDefault (QLocale (QLocale .English ))
124
+ assert QLocale ().decimalPoint () == '.'
125
+ field = self .vl .fields ()[self .vl .fields ().indexFromName ('double_field' )]
126
+ field .setPrecision (4 )
127
+ self ._fld_checker (field )
128
+
103
129
104
130
if __name__ == '__main__' :
105
131
unittest .main ()
0 commit comments