diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-14 19:07:17 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-14 19:07:17 +0000 |
commit | 2e8bb0941c5a991bc317e5edea246972d78e769b (patch) | |
tree | 4fe98f76327452bce9489ab93c48ff403c7d577b /tests/rules/test_quoted_strings.py | |
parent | Releasing progress-linux version 1.33.0-1~progress7.99u1. (diff) | |
download | yamllint-2e8bb0941c5a991bc317e5edea246972d78e769b.tar.xz yamllint-2e8bb0941c5a991bc317e5edea246972d78e769b.zip |
Merging upstream version 1.35.1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/rules/test_quoted_strings.py')
-rw-r--r-- | tests/rules/test_quoted_strings.py | 786 |
1 files changed, 772 insertions, 14 deletions
diff --git a/tests/rules/test_quoted_strings.py b/tests/rules/test_quoted_strings.py index 543cc0d..1bcb6f8 100644 --- a/tests/rules/test_quoted_strings.py +++ b/tests/rules/test_quoted_strings.py @@ -18,7 +18,7 @@ from tests.common import RuleTestCase from yamllint import config -class QuotedTestCase(RuleTestCase): +class QuotedValuesTestCase(RuleTestCase): rule_id = 'quoted-strings' def test_disabled(self): @@ -57,9 +57,14 @@ class QuotedTestCase(RuleTestCase): ' - foo\n' # fails ' - "foo"\n' 'flow-seq: [foo, "foo"]\n' # fails - 'flow-map: {a: foo, b: "foo"}\n', # fails - conf, problem1=(4, 10), problem2=(17, 5), - problem3=(19, 12), problem4=(20, 15)) + 'flow-map: {a: foo, b: "foo"}\n' # fails + 'flow-seq2: [foo, "foo,bar", "foo[bar]", "foo{bar}"]\n' + 'flow-map2: {a: foo, b: "foo,bar"}\n' + 'nested-flow1: {a: foo, b: [foo, "foo,bar"]}\n' + 'nested-flow2: [{a: foo}, {b: "foo,bar", c: ["d[e]"]}]\n', + conf, problem1=(4, 10), problem2=(17, 5), problem3=(19, 12), + problem4=(20, 15), problem5=(21, 13), problem6=(22, 16), + problem7=(23, 19), problem8=(23, 28), problem9=(24, 20)) self.check('---\n' 'multiline string 1: |\n' ' line 1\n' @@ -97,11 +102,19 @@ class QuotedTestCase(RuleTestCase): ' - foo\n' # fails ' - "foo"\n' # fails 'flow-seq: [foo, "foo"]\n' # fails - 'flow-map: {a: foo, b: "foo"}\n', # fails + 'flow-map: {a: foo, b: "foo"}\n' # fails + 'flow-seq2: [foo, "foo,bar", "foo[bar]", "foo{bar}"]\n' + 'flow-map2: {a: foo, b: "foo,bar"}\n' + 'nested-flow1: {a: foo, b: [foo, "foo,bar"]}\n' + 'nested-flow2: [{a: foo}, {b: "foo,bar", c: ["d[e]"]}]\n', conf, problem1=(4, 10), problem2=(5, 10), problem3=(6, 10), problem4=(7, 10), problem5=(17, 5), problem6=(18, 5), problem7=(19, 12), problem8=(19, 17), problem9=(20, 15), - problem10=(20, 23)) + problem10=(20, 23), problem11=(21, 13), problem12=(21, 18), + problem13=(21, 29), problem14=(21, 41), problem15=(22, 16), + problem16=(22, 24), problem17=(23, 19), problem18=(23, 28), + problem19=(23, 33), problem20=(24, 20), problem21=(24, 30), + problem22=(24, 45)) self.check('---\n' 'multiline string 1: |\n' ' line 1\n' @@ -139,9 +152,15 @@ class QuotedTestCase(RuleTestCase): ' - foo\n' # fails ' - "foo"\n' 'flow-seq: [foo, "foo"]\n' # fails - 'flow-map: {a: foo, b: "foo"}\n', # fails + 'flow-map: {a: foo, b: "foo"}\n' # fails + 'flow-seq2: [foo, "foo,bar", "foo[bar]", "foo{bar}"]\n' + 'flow-map2: {a: foo, b: "foo,bar"}\n' + 'nested-flow1: {a: foo, b: [foo, "foo,bar"]}\n' + 'nested-flow2: [{a: foo}, {b: "foo,bar", c: ["d[e]"]}]\n', conf, problem1=(4, 10), problem2=(8, 10), problem3=(17, 5), - problem4=(19, 12), problem5=(20, 15)) + problem4=(19, 12), problem5=(20, 15), problem6=(21, 13), + problem7=(22, 16), problem8=(23, 19), problem9=(23, 28), + problem10=(24, 20)) self.check('---\n' 'multiline string 1: |\n' ' line 1\n' @@ -179,7 +198,11 @@ class QuotedTestCase(RuleTestCase): ' - foo\n' # fails ' - "foo"\n' 'flow-seq: [foo, "foo"]\n' # fails - 'flow-map: {a: foo, b: "foo"}\n', # fails + 'flow-map: {a: foo, b: "foo"}\n' # fails + 'flow-seq2: [foo, "foo,bar", "foo[bar]", "foo{bar}"]\n' + 'flow-map2: {a: foo, b: "foo,bar"}\n' + 'nested-flow1: {a: foo, b: [foo, "foo,bar"]}\n' + 'nested-flow2: [{a: foo}, {b: "foo,bar", c: ["d[e]"]}]\n', conf) self.check('---\n' 'multiline string 1: |\n' @@ -218,9 +241,16 @@ class QuotedTestCase(RuleTestCase): ' - foo\n' # fails ' - "foo"\n' 'flow-seq: [foo, "foo"]\n' # fails - 'flow-map: {a: foo, b: "foo"}\n', # fails + 'flow-map: {a: foo, b: "foo"}\n' # fails + 'flow-seq2: [foo, "foo,bar", "foo[bar]", "foo{bar}"]\n' + 'flow-map2: {a: foo, b: "foo,bar"}\n' + 'nested-flow1: {a: foo, b: [foo, "foo,bar"]}\n' + 'nested-flow2: [{a: foo}, {b: "foo,bar", c: ["d[e]"]}]\n', conf, problem1=(5, 10), problem2=(6, 10), problem3=(7, 10), - problem4=(18, 5), problem5=(19, 17), problem6=(20, 23)) + problem4=(18, 5), problem5=(19, 17), problem6=(20, 23), + problem7=(21, 18), problem8=(21, 29), problem9=(21, 41), + problem10=(22, 24), problem11=(23, 33), problem12=(24, 30), + problem13=(24, 45)) self.check('---\n' 'multiline string 1: |\n' ' line 1\n' @@ -258,7 +288,11 @@ class QuotedTestCase(RuleTestCase): ' - foo\n' ' - "foo"\n' # fails 'flow-seq: [foo, "foo"]\n' # fails - 'flow-map: {a: foo, b: "foo"}\n', # fails + 'flow-map: {a: foo, b: "foo"}\n' # fails + 'flow-seq2: [foo, "foo,bar", "foo[bar]", "foo{bar}"]\n' + 'flow-map2: {a: foo, b: "foo,bar"}\n' + 'nested-flow1: {a: foo, b: [foo, "foo,bar"]}\n' + 'nested-flow2: [{a: foo}, {b: "foo,bar", c: ["d[e]"]}]\n', conf, problem1=(5, 10), problem2=(8, 10), problem3=(18, 5), problem4=(19, 17), problem5=(20, 23)) self.check('---\n' @@ -299,10 +333,15 @@ class QuotedTestCase(RuleTestCase): ' - foo\n' ' - "foo"\n' # fails 'flow-seq: [foo, "foo"]\n' # fails - 'flow-map: {a: foo, b: "foo"}\n', # fails + 'flow-map: {a: foo, b: "foo"}\n' # fails + 'flow-seq2: [foo, "foo,bar"]\n' # fails + 'flow-map2: {a: foo, b: "foo,bar"}\n' # fails + 'nested-flow1: {a: foo, b: [foo, "foo,bar"]}\n' + 'nested-flow2: [{a: foo}, {b: "foo,bar", c: ["d[e]"]}]\n', conf, problem1=(5, 10), problem2=(6, 10), problem3=(7, 10), problem4=(8, 10), problem5=(18, 5), problem6=(19, 17), - problem7=(20, 23)) + problem7=(20, 23), problem8=(21, 18), problem9=(22, 24), + problem10=(23, 33), problem11=(24, 30), problem12=(24, 45)) self.check('---\n' 'multiline string 1: |\n' ' line 1\n' @@ -556,3 +595,722 @@ class QuotedTestCase(RuleTestCase): "foo1: '[barbaz]'\n" "foo2: '[bar\"baz]'\n", conf) + + +class QuotedKeysTestCase(RuleTestCase): + rule_id = 'quoted-strings' + + def test_disabled(self): + conf_disabled = "quoted-strings: {}" + key_strings = ('---\n' + 'true: 2\n' + '123: 3\n' + 'foo1: 4\n' + '"foo2": 5\n' + '"false": 6\n' + '"234": 7\n' + '\'bar\': 8\n' + '!!str generic_string: 9\n' + '!!str 456: 10\n' + '!!str "quoted_generic_string": 11\n' + '!!binary binstring: 12\n' + '!!int int_string: 13\n' + '!!bool bool_string: 14\n' + '!!bool "quoted_bool_string": 15\n' + # Sequences and mappings + '? - 16\n' + ' - 17\n' + ': 18\n' + '[119, 219]: 19\n' + '? a: 20\n' + ' "b": 21\n' + ': 22\n' + '{a: 123, "b": 223}: 23\n' + # Multiline strings + '? |\n' + ' line 1\n' + ' line 2\n' + ': 27\n' + '? >\n' + ' line 1\n' + ' line 2\n' + ': 31\n' + '?\n' + ' line 1\n' + ' line 2\n' + ': 35\n' + '?\n' + ' "line 1\\\n' + ' line 2"\n' + ': 39\n') + self.check(key_strings, conf_disabled) + + def test_default(self): + # Default configuration, but with check-keys + conf_default = ("quoted-strings:\n" + " check-keys: true\n") + key_strings = ('---\n' + 'true: 2\n' + '123: 3\n' + 'foo1: 4\n' + '"foo2": 5\n' + '"false": 6\n' + '"234": 7\n' + '\'bar\': 8\n' + '!!str generic_string: 9\n' + '!!str 456: 10\n' + '!!str "quoted_generic_string": 11\n' + '!!binary binstring: 12\n' + '!!int int_string: 13\n' + '!!bool bool_string: 14\n' + '!!bool "quoted_bool_string": 15\n' + # Sequences and mappings + '? - 16\n' + ' - 17\n' + ': 18\n' + '[119, 219]: 19\n' + '? a: 20\n' + ' "b": 21\n' + ': 22\n' + '{a: 123, "b": 223}: 23\n' + # Multiline strings + '? |\n' + ' line 1\n' + ' line 2\n' + ': 27\n' + '? >\n' + ' line 1\n' + ' line 2\n' + ': 31\n' + '?\n' + ' line 1\n' + ' line 2\n' + ': 35\n' + '?\n' + ' "line 1\\\n' + ' line 2"\n' + ': 39\n') + self.check(key_strings, conf_default, problem1=(4, 1), + problem3=(20, 3), problem4=(23, 2), problem5=(33, 3)) + + def test_quote_type_any(self): + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' quote-type: any\n') + + key_strings = ('---\n' + 'true: 2\n' + '123: 3\n' + 'foo1: 4\n' + '"foo2": 5\n' + '"false": 6\n' + '"234": 7\n' + '\'bar\': 8\n' + '!!str generic_string: 9\n' + '!!str 456: 10\n' + '!!str "quoted_generic_string": 11\n' + '!!binary binstring: 12\n' + '!!int int_string: 13\n' + '!!bool bool_string: 14\n' + '!!bool "quoted_bool_string": 15\n' + # Sequences and mappings + '? - 16\n' + ' - 17\n' + ': 18\n' + '[119, 219]: 19\n' + '? a: 20\n' + ' "b": 21\n' + ': 22\n' + '{a: 123, "b": 223}: 23\n' + # Multiline strings + '? |\n' + ' line 1\n' + ' line 2\n' + ': 27\n' + '? >\n' + ' line 1\n' + ' line 2\n' + ': 31\n' + '?\n' + ' line 1\n' + ' line 2\n' + ': 35\n' + '?\n' + ' "line 1\\\n' + ' line 2"\n' + ': 39\n') + self.check(key_strings, conf, + problem1=(4, 1), problem2=(20, 3), problem3=(23, 2), + problem4=(33, 3)) + + def test_quote_type_single(self): + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' quote-type: single\n') + + key_strings = ('---\n' + 'true: 2\n' + '123: 3\n' + 'foo1: 4\n' + '"foo2": 5\n' + '"false": 6\n' + '"234": 7\n' + '\'bar\': 8\n' + '!!str generic_string: 9\n' + '!!str 456: 10\n' + '!!str "quoted_generic_string": 11\n' + '!!binary binstring: 12\n' + '!!int int_string: 13\n' + '!!bool bool_string: 14\n' + '!!bool "quoted_bool_string": 15\n' + # Sequences and mappings + '? - 16\n' + ' - 17\n' + ': 18\n' + '[119, 219]: 19\n' + '? a: 20\n' + ' "b": 21\n' + ': 22\n' + '{a: 123, "b": 223}: 23\n' + # Multiline strings + '? |\n' + ' line 1\n' + ' line 2\n' + ': 27\n' + '? >\n' + ' line 1\n' + ' line 2\n' + ': 31\n' + '?\n' + ' line 1\n' + ' line 2\n' + ': 35\n' + '?\n' + ' "line 1\\\n' + ' line 2"\n' + ': 39\n') + self.check(key_strings, conf, + problem1=(4, 1), problem2=(5, 1), problem3=(6, 1), + problem4=(7, 1), problem5=(20, 3), problem6=(21, 3), + problem7=(23, 2), problem8=(23, 10), problem9=(33, 3), + problem10=(37, 3)) + + def test_quote_type_double(self): + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' quote-type: double\n') + + key_strings = ('---\n' + 'true: 2\n' + '123: 3\n' + 'foo1: 4\n' + '"foo2": 5\n' + '"false": 6\n' + '"234": 7\n' + '\'bar\': 8\n' + '!!str generic_string: 9\n' + '!!str 456: 10\n' + '!!str "quoted_generic_string": 11\n' + '!!binary binstring: 12\n' + '!!int int_string: 13\n' + '!!bool bool_string: 14\n' + '!!bool "quoted_bool_string": 15\n' + # Sequences and mappings + '? - 16\n' + ' - 17\n' + ': 18\n' + '[119, 219]: 19\n' + '? a: 20\n' + ' "b": 21\n' + ': 22\n' + '{a: 123, "b": 223}: 23\n' + # Multiline strings + '? |\n' + ' line 1\n' + ' line 2\n' + ': 27\n' + '? >\n' + ' line 1\n' + ' line 2\n' + ': 31\n' + '?\n' + ' line 1\n' + ' line 2\n' + ': 35\n' + '?\n' + ' "line 1\\\n' + ' line 2"\n' + ': 39\n') + self.check(key_strings, conf, + problem1=(4, 1), problem2=(8, 1), problem3=(20, 3), + problem4=(23, 2), problem5=(33, 3)) + + def test_any_quotes_not_required(self): + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' quote-type: any\n' + ' required: false\n') + + key_strings = ('---\n' + 'true: 2\n' + '123: 3\n' + 'foo1: 4\n' + '"foo2": 5\n' + '"false": 6\n' + '"234": 7\n' + '\'bar\': 8\n' + '!!str generic_string: 9\n' + '!!str 456: 10\n' + '!!str "quoted_generic_string": 11\n' + '!!binary binstring: 12\n' + '!!int int_string: 13\n' + '!!bool bool_string: 14\n' + '!!bool "quoted_bool_string": 15\n' + # Sequences and mappings + '? - 16\n' + ' - 17\n' + ': 18\n' + '[119, 219]: 19\n' + '? a: 20\n' + ' "b": 21\n' + ': 22\n' + '{a: 123, "b": 223}: 23\n' + # Multiline strings + '? |\n' + ' line 1\n' + ' line 2\n' + ': 27\n' + '? >\n' + ' line 1\n' + ' line 2\n' + ': 31\n' + '?\n' + ' line 1\n' + ' line 2\n' + ': 35\n' + '?\n' + ' "line 1\\\n' + ' line 2"\n' + ': 39\n') + self.check(key_strings, conf) + + def test_single_quotes_not_required(self): + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' quote-type: single\n' + ' required: false\n') + + key_strings = ('---\n' + 'true: 2\n' + '123: 3\n' + 'foo1: 4\n' + '"foo2": 5\n' + '"false": 6\n' + '"234": 7\n' + '\'bar\': 8\n' + '!!str generic_string: 9\n' + '!!str 456: 10\n' + '!!str "quoted_generic_string": 11\n' + '!!binary binstring: 12\n' + '!!int int_string: 13\n' + '!!bool bool_string: 14\n' + '!!bool "quoted_bool_string": 15\n' + # Sequences and mappings + '? - 16\n' + ' - 17\n' + ': 18\n' + '[119, 219]: 19\n' + '? a: 20\n' + ' "b": 21\n' + ': 22\n' + '{a: 123, "b": 223}: 23\n' + # Multiline strings + '? |\n' + ' line 1\n' + ' line 2\n' + ': 27\n' + '? >\n' + ' line 1\n' + ' line 2\n' + ': 31\n' + '?\n' + ' line 1\n' + ' line 2\n' + ': 35\n' + '?\n' + ' "line 1\\\n' + ' line 2"\n' + ': 39\n') + self.check(key_strings, conf, + problem1=(5, 1), problem2=(6, 1), problem3=(7, 1), + problem4=(21, 3), problem5=(23, 10), problem6=(37, 3)) + + def test_only_when_needed(self): + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' required: only-when-needed\n') + + key_strings = ('---\n' + 'true: 2\n' + '123: 3\n' + 'foo1: 4\n' + '"foo2": 5\n' + '"false": 6\n' + '"234": 7\n' + '\'bar\': 8\n' + '!!str generic_string: 9\n' + '!!str 456: 10\n' + '!!str "quoted_generic_string": 11\n' + '!!binary binstring: 12\n' + '!!int int_string: 13\n' + '!!bool bool_string: 14\n' + '!!bool "quoted_bool_string": 15\n' + # Sequences and mappings + '? - 16\n' + ' - 17\n' + ': 18\n' + '[119, 219]: 19\n' + '? a: 20\n' + ' "b": 21\n' + ': 22\n' + '{a: 123, "b": 223}: 23\n' + # Multiline strings + '? |\n' + ' line 1\n' + ' line 2\n' + ': 27\n' + '? >\n' + ' line 1\n' + ' line 2\n' + ': 31\n' + '?\n' + ' line 1\n' + ' line 2\n' + ': 35\n' + '?\n' + ' "line 1\\\n' + ' line 2"\n' + ': 39\n') + self.check(key_strings, conf, + problem1=(5, 1), problem2=(8, 1), problem3=(21, 3), + problem4=(23, 10), problem5=(37, 3)) + + def test_only_when_needed_single_quotes(self): + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' quote-type: single\n' + ' required: only-when-needed\n') + + key_strings = ('---\n' + 'true: 2\n' + '123: 3\n' + 'foo1: 4\n' + '"foo2": 5\n' + '"false": 6\n' + '"234": 7\n' + '\'bar\': 8\n' + '!!str generic_string: 9\n' + '!!str 456: 10\n' + '!!str "quoted_generic_string": 11\n' + '!!binary binstring: 12\n' + '!!int int_string: 13\n' + '!!bool bool_string: 14\n' + '!!bool "quoted_bool_string": 15\n' + # Sequences and mappings + '? - 16\n' + ' - 17\n' + ': 18\n' + '[119, 219]: 19\n' + '? a: 20\n' + ' "b": 21\n' + ': 22\n' + '{a: 123, "b": 223}: 23\n' + # Multiline strings + '? |\n' + ' line 1\n' + ' line 2\n' + ': 27\n' + '? >\n' + ' line 1\n' + ' line 2\n' + ': 31\n' + '?\n' + ' line 1\n' + ' line 2\n' + ': 35\n' + '?\n' + ' "line 1\\\n' + ' line 2"\n' + ': 39\n') + self.check(key_strings, conf, + problem1=(5, 1), problem2=(6, 1), problem3=(7, 1), + problem4=(8, 1), problem5=(21, 3), problem6=(23, 10), + problem7=(37, 3)) + + def test_only_when_needed_corner_cases(self): + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' required: only-when-needed\n') + + self.check('---\n' + '"": 2\n' + '"- item": 3\n' + '"key: value": 4\n' + '"%H:%M:%S": 5\n' + '"%wheel ALL=(ALL) NOPASSWD: ALL": 6\n' + '\'"quoted"\': 7\n' + '"\'foo\' == \'bar\'": 8\n' + '"\'Mac\' in ansible_facts.product_name": 9\n' + '\'foo # bar\': 10\n', + conf) + self.check('---\n' + '"": 2\n' + '"- item": 3\n' + '"key: value": 4\n' + '"%H:%M:%S": 5\n' + '"%wheel ALL=(ALL) NOPASSWD: ALL": 6\n' + '\'"quoted"\': 7\n' + '"\'foo\' == \'bar\'": 8\n' + '"\'Mac\' in ansible_facts.product_name": 9\n', + conf) + + self.check('---\n' + '---: 2\n' + '"----": 3\n' # fails + '---------: 4\n' + '"----------": 5\n' # fails + ':wq: 6\n' + '":cw": 7\n', # fails + conf, problem1=(3, 1), problem2=(5, 1), problem3=(7, 1)) + + def test_only_when_needed_extras(self): + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' required: true\n' + ' extra-allowed: [^http://]\n') + self.assertRaises(config.YamlLintConfigError, self.check, '', conf) + + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' required: true\n' + ' extra-required: [^http://]\n') + self.assertRaises(config.YamlLintConfigError, self.check, '', conf) + + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' required: false\n' + ' extra-allowed: [^http://]\n') + self.assertRaises(config.YamlLintConfigError, self.check, '', conf) + + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' required: true\n') + self.check('---\n' + '123: 2\n' + '"234": 3\n' + 'localhost: 4\n' # fails + '"host.local": 5\n' + 'http://localhost: 6\n' # fails + '"http://host.local": 7\n' + 'ftp://localhost: 8\n' # fails + '"ftp://host.local": 9\n', + conf, problem1=(4, 1), problem2=(6, 1), problem3=(8, 1)) + + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' required: only-when-needed\n' + ' extra-allowed: [^ftp://]\n' + ' extra-required: [^http://]\n') + self.check('---\n' + '123: 2\n' + '"234": 3\n' + 'localhost: 4\n' + '"host.local": 5\n' # fails + 'http://localhost: 6\n' # fails + '"http://host.local": 7\n' + 'ftp://localhost: 8\n' + '"ftp://host.local": 9\n', + conf, problem1=(5, 1), problem2=(6, 1)) + + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' required: false\n' + ' extra-required: [^http://, ^ftp://]\n') + self.check('---\n' + '123: 2\n' + '"234": 3\n' + 'localhost: 4\n' + '"host.local": 5\n' + 'http://localhost: 6\n' # fails + '"http://host.local": 7\n' + 'ftp://localhost: 8\n' # fails + '"ftp://host.local": 9\n', + conf, problem1=(6, 1), problem2=(8, 1)) + + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' required: only-when-needed\n' + ' extra-allowed: [^ftp://, ";$", " "]\n') + self.check('---\n' + 'localhost: 2\n' + '"host.local": 3\n' # fails + 'ftp://localhost: 4\n' + '"ftp://host.local": 5\n' + 'i=i+1: 6\n' + '"i=i+2": 7\n' # fails + 'i=i+3;: 8\n' + '"i=i+4;": 9\n' + 'foo1: 10\n' + '"foo2": 11\n' # fails + 'foo bar1: 12\n' + '"foo bar2": 13\n', + conf, problem1=(3, 1), problem2=(7, 1), problem3=(11, 1)) + + def test_octal_values(self): + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' required: true\n') + + self.check('---\n' + '100: 2\n' + '0100: 3\n' + '0o100: 4\n' + '777: 5\n' + '0777: 6\n' + '0o777: 7\n' + '800: 8\n' + '0800: 9\n' # fails + '0o800: 10\n' # fails + '"0900": 11\n' + '"0o900": 12\n', + conf, + problem1=(9, 1), problem2=(10, 1)) + + def test_allow_quoted_quotes(self): + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' quote-type: single\n' + ' required: false\n' + ' allow-quoted-quotes: false\n') + self.check('---\n' + '"[barbaz]": 2\n' # fails + '"[bar\'baz]": 3\n', # fails + conf, problem1=(2, 1), problem2=(3, 1)) + + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' quote-type: single\n' + ' required: false\n' + ' allow-quoted-quotes: true\n') + self.check('---\n' + '"[barbaz]": 2\n' # fails + '"[bar\'baz]": 3\n', + conf, problem1=(2, 1)) + + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' quote-type: single\n' + ' required: true\n' + ' allow-quoted-quotes: false\n') + self.check('---\n' + '"[barbaz]": 2\n' # fails + '"[bar\'baz]": 3\n', # fails + conf, problem1=(2, 1), problem2=(3, 1)) + + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' quote-type: single\n' + ' required: true\n' + ' allow-quoted-quotes: true\n') + self.check('---\n' + '"[barbaz]": 2\n' # fails + '"[bar\'baz]": 3\n', + conf, problem1=(2, 1)) + + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' quote-type: single\n' + ' required: only-when-needed\n' + ' allow-quoted-quotes: false\n') + self.check('---\n' + '"[barbaz]": 2\n' # fails + '"[bar\'baz]": 3\n', # fails + conf, problem1=(2, 1), problem2=(3, 1)) + + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' quote-type: single\n' + ' required: only-when-needed\n' + ' allow-quoted-quotes: true\n') + self.check('---\n' + '"[barbaz]": 2\n' # fails + '"[bar\'baz]": 3\n', + conf, problem1=(2, 1)) + + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' quote-type: double\n' + ' required: false\n' + ' allow-quoted-quotes: false\n') + self.check("---\n" + "'[barbaz]': 2\n" # fails + "'[bar\"baz]': 3\n", # fails + conf, problem1=(2, 1), problem2=(3, 1)) + + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' quote-type: double\n' + ' required: false\n' + ' allow-quoted-quotes: true\n') + self.check("---\n" + "'[barbaz]': 2\n" # fails + "'[bar\"baz]': 3\n", + conf, problem1=(2, 1)) + + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' quote-type: double\n' + ' required: true\n' + ' allow-quoted-quotes: false\n') + self.check("---\n" + "'[barbaz]': 2\n" # fails + "'[bar\"baz]': 3\n", # fails + conf, problem1=(2, 1), problem2=(3, 1)) + + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' quote-type: double\n' + ' required: true\n' + ' allow-quoted-quotes: true\n') + self.check("---\n" + "'[barbaz]': 2\n" # fails + "'[bar\"baz]': 3\n", + conf, problem1=(2, 1)) + + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' quote-type: double\n' + ' required: only-when-needed\n' + ' allow-quoted-quotes: false\n') + self.check("---\n" + "'[barbaz]': 2\n" # fails + "'[bar\"baz]': 3\n", # fails + conf, problem1=(2, 1), problem2=(3, 1)) + + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' quote-type: double\n' + ' required: only-when-needed\n' + ' allow-quoted-quotes: true\n') + self.check("---\n" + "'[barbaz]': 2\n" # fails + "'[bar\"baz]': 3\n", + conf, problem1=(2, 1)) + + conf = ('quoted-strings:\n' + ' check-keys: true\n' + ' quote-type: any\n') + self.check("---\n" + "'[barbaz]': 2\n" + "'[bar\"baz]': 3\n", + conf) |