예제 #1
0
    def _fld_checker(self, field):
        """
        Expected results from validate
        QValidator::Invalid 0 The string is clearly invalid.
        QValidator::Intermediate 1 The string is a plausible intermediate value.
        QValidator::Acceptable 2 The string is acceptable as a final result; i.e. it is valid.
        """
        DECIMAL_SEPARATOR = QLocale().decimalPoint()
        OTHER_SEPARATOR = ',' if DECIMAL_SEPARATOR == '.' else '.'

        validator = QgsFieldValidator(None, field, '0.0', '')

        def _test(value, expected):
            ret = validator.validate(value, 0)
            self.assertEqual(ret[0], expected, "%s != %s" % (ret[0], expected))
            if value:
                self.assertEqual(
                    validator.validate('-' + value, 0)[0], expected,
                    '-' + value)

        # Valid
        _test('0.1234', QValidator.Acceptable)

        # Apparently we accept comma only when locale say so
        if DECIMAL_SEPARATOR != '.':
            _test('0,1234', QValidator.Acceptable)

        # If precision is > 0, regexp validator is used (and it does not support sci notation)
        if field.precision() == 0:
            _test('12345.1234e+123', QValidator.Acceptable)
            _test('12345.1234e-123', QValidator.Acceptable)
            if DECIMAL_SEPARATOR != '.':
                _test('12345,1234e+123', QValidator.Acceptable)
                _test('12345,1234e-123', QValidator.Acceptable)
            _test('', QValidator.Acceptable)

            # Out of range
            _test('12345.1234e+823', QValidator.Intermediate)
            _test('12345.1234e-823', QValidator.Intermediate)
            if DECIMAL_SEPARATOR != '.':
                _test('12345,1234e+823', QValidator.Intermediate)
                _test('12345,1234e-823', QValidator.Intermediate)

        # Invalid
        _test('12345-1234', QValidator.Invalid)
        _test('onetwothree', QValidator.Invalid)

        int_field = self.vl.fields()[self.vl.fields().indexFromName(
            'int_field')]
        self.assertEqual(int_field.precision(),
                         0)  # this is what the provider reports :(
        self.assertEqual(int_field.length(), 0)  # not set
        self.assertEqual(int_field.type(), QVariant.Int)

        validator = QgsFieldValidator(None, int_field, '0', '')

        # Valid
        _test('0', QValidator.Acceptable)
        _test('1234', QValidator.Acceptable)
        _test('', QValidator.Acceptable)

        # Invalid
        _test('12345-1234', QValidator.Invalid)
        _test('12345%s1234' % DECIMAL_SEPARATOR, QValidator.Invalid)
        _test('onetwothree', QValidator.Invalid)
예제 #2
0
    def test_validator(self):
        # Test the double
        """ 
        Expected results from validate
        QValidator::Invalid 0 The string is clearly invalid.
        QValidator::Intermediate 1 The string is a plausible intermediate value.
        QValidator::Acceptable 2 The string is acceptable as a final result; i.e. it is valid.
        """

        double_field = self.vl.fields()[self.vl.fields().indexFromName(
            'double_field')]
        self.assertEqual(double_field.precision(),
                         0)  # this is what the provider reports :(
        self.assertEqual(double_field.length(), 0)  # not set
        self.assertEqual(double_field.type(), QVariant.Double)

        validator = QgsFieldValidator(None, double_field, '0.0', '')

        def _test(value, expected):
            ret = validator.validate(value, 0)
            self.assertEqual(ret[0], expected, value)
            if value:
                self.assertEqual(
                    validator.validate('-' + value, 0)[0], expected,
                    '-' + value)
            # Check the decimal comma separator has been properly transformed
            if expected != QValidator.Invalid:
                self.assertEqual(ret[1], value.replace(',', '.'))

        # Valid
        _test('0.1234', QValidator.Acceptable)
        _test('0,1234', QValidator.Acceptable)
        _test('12345.1234e+123', QValidator.Acceptable)
        _test('12345.1234e-123', QValidator.Acceptable)
        _test('12345,1234e+123', QValidator.Acceptable)
        _test('12345,1234e-123', QValidator.Acceptable)
        _test('', QValidator.Acceptable)

        # Out of range
        _test('12345.1234e+823', QValidator.Intermediate)
        _test('12345.1234e-823', QValidator.Intermediate)
        _test('12345,1234e+823', QValidator.Intermediate)
        _test('12345,1234e-823', QValidator.Intermediate)

        # Invalid
        _test('12345-1234', QValidator.Invalid)
        _test('onetwothree', QValidator.Invalid)

        int_field = self.vl.fields()[self.vl.fields().indexFromName(
            'int_field')]
        self.assertEqual(int_field.precision(),
                         0)  # this is what the provider reports :(
        self.assertEqual(int_field.length(), 0)  # not set
        self.assertEqual(int_field.type(), QVariant.Int)

        validator = QgsFieldValidator(None, int_field, '0', '')

        # Valid
        _test('0', QValidator.Acceptable)
        _test('1234', QValidator.Acceptable)
        _test('', QValidator.Acceptable)

        # Invalid
        _test('12345-1234', QValidator.Invalid)
        _test('12345.1234', QValidator.Invalid)
        _test('onetwothree', QValidator.Invalid)