Mercurial > nagslang
annotate nagslang/tests/test_yamlish.py @ 137:c5ff16c66100
Support other interesting keys, too
author | Stefano Rivera <stefano@rivera.za.net> |
---|---|
date | Mon, 02 Sep 2013 18:00:52 +0200 |
parents | 0280ee006d95 |
children | 366b334a7018 |
rev | line source |
---|---|
114
d1a96fc62d26
Fallback to pytest's skip exception
Stefano Rivera <stefano@rivera.za.net>
parents:
112
diff
changeset
|
1 from unittest import TestCase |
d1a96fc62d26
Fallback to pytest's skip exception
Stefano Rivera <stefano@rivera.za.net>
parents:
112
diff
changeset
|
2 |
d1a96fc62d26
Fallback to pytest's skip exception
Stefano Rivera <stefano@rivera.za.net>
parents:
112
diff
changeset
|
3 from nagslang.yamlish import load_s, dump_s |
89
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
4 |
90
a8d83de5b460
Dump our YAML subset too
Stefano Rivera <stefano@rivera.za.net>
parents:
89
diff
changeset
|
5 try: |
a8d83de5b460
Dump our YAML subset too
Stefano Rivera <stefano@rivera.za.net>
parents:
89
diff
changeset
|
6 import yaml |
a8d83de5b460
Dump our YAML subset too
Stefano Rivera <stefano@rivera.za.net>
parents:
89
diff
changeset
|
7 except ImportError: |
a8d83de5b460
Dump our YAML subset too
Stefano Rivera <stefano@rivera.za.net>
parents:
89
diff
changeset
|
8 yaml = None # pyflakes:ignore |
a8d83de5b460
Dump our YAML subset too
Stefano Rivera <stefano@rivera.za.net>
parents:
89
diff
changeset
|
9 |
114
d1a96fc62d26
Fallback to pytest's skip exception
Stefano Rivera <stefano@rivera.za.net>
parents:
112
diff
changeset
|
10 try: |
d1a96fc62d26
Fallback to pytest's skip exception
Stefano Rivera <stefano@rivera.za.net>
parents:
112
diff
changeset
|
11 from unittest import SkipTest |
d1a96fc62d26
Fallback to pytest's skip exception
Stefano Rivera <stefano@rivera.za.net>
parents:
112
diff
changeset
|
12 except ImportError: |
d1a96fc62d26
Fallback to pytest's skip exception
Stefano Rivera <stefano@rivera.za.net>
parents:
112
diff
changeset
|
13 from pytest import skip |
d1a96fc62d26
Fallback to pytest's skip exception
Stefano Rivera <stefano@rivera.za.net>
parents:
112
diff
changeset
|
14 SkipTest = skip.Exception # pyflakes:ignore |
103
adf3cd83bf7a
Support a common stylistic variation
Stefano Rivera <stefano@rivera.za.net>
parents:
90
diff
changeset
|
15 |
adf3cd83bf7a
Support a common stylistic variation
Stefano Rivera <stefano@rivera.za.net>
parents:
90
diff
changeset
|
16 |
adf3cd83bf7a
Support a common stylistic variation
Stefano Rivera <stefano@rivera.za.net>
parents:
90
diff
changeset
|
17 class TestParse(TestCase): |
112
c28f2fc2bb05
Test with dump_s and load_s
Stefano Rivera <stefano@rivera.za.net>
parents:
103
diff
changeset
|
18 def assertParsesAs(self, text, expected): |
c28f2fc2bb05
Test with dump_s and load_s
Stefano Rivera <stefano@rivera.za.net>
parents:
103
diff
changeset
|
19 self.assertEqual(load_s(text.strip()), expected) |
103
adf3cd83bf7a
Support a common stylistic variation
Stefano Rivera <stefano@rivera.za.net>
parents:
90
diff
changeset
|
20 |
adf3cd83bf7a
Support a common stylistic variation
Stefano Rivera <stefano@rivera.za.net>
parents:
90
diff
changeset
|
21 def test_dict_list_1(self): |
adf3cd83bf7a
Support a common stylistic variation
Stefano Rivera <stefano@rivera.za.net>
parents:
90
diff
changeset
|
22 self.assertParsesAs(''' |
adf3cd83bf7a
Support a common stylistic variation
Stefano Rivera <stefano@rivera.za.net>
parents:
90
diff
changeset
|
23 foo: |
adf3cd83bf7a
Support a common stylistic variation
Stefano Rivera <stefano@rivera.za.net>
parents:
90
diff
changeset
|
24 - bar |
adf3cd83bf7a
Support a common stylistic variation
Stefano Rivera <stefano@rivera.za.net>
parents:
90
diff
changeset
|
25 - baz |
adf3cd83bf7a
Support a common stylistic variation
Stefano Rivera <stefano@rivera.za.net>
parents:
90
diff
changeset
|
26 ''', {'foo': ['bar', 'baz']}) |
adf3cd83bf7a
Support a common stylistic variation
Stefano Rivera <stefano@rivera.za.net>
parents:
90
diff
changeset
|
27 |
adf3cd83bf7a
Support a common stylistic variation
Stefano Rivera <stefano@rivera.za.net>
parents:
90
diff
changeset
|
28 def test_dict_list_2(self): |
adf3cd83bf7a
Support a common stylistic variation
Stefano Rivera <stefano@rivera.za.net>
parents:
90
diff
changeset
|
29 self.assertParsesAs(''' |
adf3cd83bf7a
Support a common stylistic variation
Stefano Rivera <stefano@rivera.za.net>
parents:
90
diff
changeset
|
30 foo: |
adf3cd83bf7a
Support a common stylistic variation
Stefano Rivera <stefano@rivera.za.net>
parents:
90
diff
changeset
|
31 - bar |
adf3cd83bf7a
Support a common stylistic variation
Stefano Rivera <stefano@rivera.za.net>
parents:
90
diff
changeset
|
32 - baz |
adf3cd83bf7a
Support a common stylistic variation
Stefano Rivera <stefano@rivera.za.net>
parents:
90
diff
changeset
|
33 ''', {'foo': ['bar', 'baz']}) |
89
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
34 |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
35 |
90
a8d83de5b460
Dump our YAML subset too
Stefano Rivera <stefano@rivera.za.net>
parents:
89
diff
changeset
|
36 class TestRoundTrip(TestCase): |
89
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
37 def roundtrip(self, data): |
112
c28f2fc2bb05
Test with dump_s and load_s
Stefano Rivera <stefano@rivera.za.net>
parents:
103
diff
changeset
|
38 text = self.dump_s(data) |
c28f2fc2bb05
Test with dump_s and load_s
Stefano Rivera <stefano@rivera.za.net>
parents:
103
diff
changeset
|
39 print '\n=== Begin ===\n%s\n=== End ===' % text |
c28f2fc2bb05
Test with dump_s and load_s
Stefano Rivera <stefano@rivera.za.net>
parents:
103
diff
changeset
|
40 self.assertEqual(self.load_s(text), data) |
90
a8d83de5b460
Dump our YAML subset too
Stefano Rivera <stefano@rivera.za.net>
parents:
89
diff
changeset
|
41 |
112
c28f2fc2bb05
Test with dump_s and load_s
Stefano Rivera <stefano@rivera.za.net>
parents:
103
diff
changeset
|
42 def dump_s(self, data): |
c28f2fc2bb05
Test with dump_s and load_s
Stefano Rivera <stefano@rivera.za.net>
parents:
103
diff
changeset
|
43 return dump_s(data) |
90
a8d83de5b460
Dump our YAML subset too
Stefano Rivera <stefano@rivera.za.net>
parents:
89
diff
changeset
|
44 |
112
c28f2fc2bb05
Test with dump_s and load_s
Stefano Rivera <stefano@rivera.za.net>
parents:
103
diff
changeset
|
45 def load_s(self, text): |
c28f2fc2bb05
Test with dump_s and load_s
Stefano Rivera <stefano@rivera.za.net>
parents:
103
diff
changeset
|
46 return load_s(text) |
89
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
47 |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
48 def test_simple_dict(self): |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
49 self.roundtrip({'foo': 'bar'}) |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
50 |
129
423266f0b9e4
Support inline lists, dicts, etc. And alternative top level objects
Stefano Rivera <stefano@rivera.za.net>
parents:
120
diff
changeset
|
51 def test_simple_list(self): |
423266f0b9e4
Support inline lists, dicts, etc. And alternative top level objects
Stefano Rivera <stefano@rivera.za.net>
parents:
120
diff
changeset
|
52 self.roundtrip(['foo', 'bar']) |
423266f0b9e4
Support inline lists, dicts, etc. And alternative top level objects
Stefano Rivera <stefano@rivera.za.net>
parents:
120
diff
changeset
|
53 |
89
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
54 def test_dict_of_dicts(self): |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
55 self.roundtrip({'foo': {'bar': 'baz'}}) |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
56 |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
57 def test_dict_tree(self): |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
58 self.roundtrip({ |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
59 'foo': { |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
60 'bar': { |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
61 'baz': 'qux' |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
62 }, |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
63 'quux': 'corge', |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
64 } |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
65 }) |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
66 |
129
423266f0b9e4
Support inline lists, dicts, etc. And alternative top level objects
Stefano Rivera <stefano@rivera.za.net>
parents:
120
diff
changeset
|
67 def test_list_of_lists(self): |
423266f0b9e4
Support inline lists, dicts, etc. And alternative top level objects
Stefano Rivera <stefano@rivera.za.net>
parents:
120
diff
changeset
|
68 self.roundtrip(['foo', ['bar', 'baz'], 'qux']) |
423266f0b9e4
Support inline lists, dicts, etc. And alternative top level objects
Stefano Rivera <stefano@rivera.za.net>
parents:
120
diff
changeset
|
69 |
89
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
70 def test_dict_list(self): |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
71 self.roundtrip({ |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
72 'foo': ['bar', 'baz'], |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
73 }) |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
74 |
129
423266f0b9e4
Support inline lists, dicts, etc. And alternative top level objects
Stefano Rivera <stefano@rivera.za.net>
parents:
120
diff
changeset
|
75 def test_list_dict(self): |
423266f0b9e4
Support inline lists, dicts, etc. And alternative top level objects
Stefano Rivera <stefano@rivera.za.net>
parents:
120
diff
changeset
|
76 self.roundtrip([ |
423266f0b9e4
Support inline lists, dicts, etc. And alternative top level objects
Stefano Rivera <stefano@rivera.za.net>
parents:
120
diff
changeset
|
77 {'foo': 'bar'}, |
423266f0b9e4
Support inline lists, dicts, etc. And alternative top level objects
Stefano Rivera <stefano@rivera.za.net>
parents:
120
diff
changeset
|
78 {'baz': 'qux', 'quux': 'corge'}, |
423266f0b9e4
Support inline lists, dicts, etc. And alternative top level objects
Stefano Rivera <stefano@rivera.za.net>
parents:
120
diff
changeset
|
79 ]) |
423266f0b9e4
Support inline lists, dicts, etc. And alternative top level objects
Stefano Rivera <stefano@rivera.za.net>
parents:
120
diff
changeset
|
80 |
89
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
81 def test_nested_lists(self): |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
82 self.roundtrip({ |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
83 'foo': [['bar', 'baz', 'qux'], 'quux'], |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
84 }) |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
85 |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
86 def test_list_of_dicts(self): |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
87 self.roundtrip({ |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
88 'foo': [ |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
89 {'bar': 'baz'}, |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
90 {'qux': 'quux'}, |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
91 ], |
102043902451
Simple (subset of) YAML parser
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
92 }) |
90
a8d83de5b460
Dump our YAML subset too
Stefano Rivera <stefano@rivera.za.net>
parents:
89
diff
changeset
|
93 |
136
0280ee006d95
Support integer dict keys
Stefano Rivera <stefano@rivera.za.net>
parents:
130
diff
changeset
|
94 def test_int_dict(self): |
0280ee006d95
Support integer dict keys
Stefano Rivera <stefano@rivera.za.net>
parents:
130
diff
changeset
|
95 self.roundtrip({ |
0280ee006d95
Support integer dict keys
Stefano Rivera <stefano@rivera.za.net>
parents:
130
diff
changeset
|
96 1: 'foo', |
0280ee006d95
Support integer dict keys
Stefano Rivera <stefano@rivera.za.net>
parents:
130
diff
changeset
|
97 2: 'bar', |
0280ee006d95
Support integer dict keys
Stefano Rivera <stefano@rivera.za.net>
parents:
130
diff
changeset
|
98 3: ['baz', 'qux'], |
0280ee006d95
Support integer dict keys
Stefano Rivera <stefano@rivera.za.net>
parents:
130
diff
changeset
|
99 }) |
0280ee006d95
Support integer dict keys
Stefano Rivera <stefano@rivera.za.net>
parents:
130
diff
changeset
|
100 |
137
c5ff16c66100
Support other interesting keys, too
Stefano Rivera <stefano@rivera.za.net>
parents:
136
diff
changeset
|
101 def test_dict_keys(self): |
c5ff16c66100
Support other interesting keys, too
Stefano Rivera <stefano@rivera.za.net>
parents:
136
diff
changeset
|
102 self.roundtrip({ |
c5ff16c66100
Support other interesting keys, too
Stefano Rivera <stefano@rivera.za.net>
parents:
136
diff
changeset
|
103 True: 'true', |
c5ff16c66100
Support other interesting keys, too
Stefano Rivera <stefano@rivera.za.net>
parents:
136
diff
changeset
|
104 False: [], |
c5ff16c66100
Support other interesting keys, too
Stefano Rivera <stefano@rivera.za.net>
parents:
136
diff
changeset
|
105 None: {}, |
c5ff16c66100
Support other interesting keys, too
Stefano Rivera <stefano@rivera.za.net>
parents:
136
diff
changeset
|
106 0.7: -0.7, |
c5ff16c66100
Support other interesting keys, too
Stefano Rivera <stefano@rivera.za.net>
parents:
136
diff
changeset
|
107 }) |
c5ff16c66100
Support other interesting keys, too
Stefano Rivera <stefano@rivera.za.net>
parents:
136
diff
changeset
|
108 |
119
b75de48a618c
Support boolean and None types
Stefano Rivera <stefano@rivera.za.net>
parents:
114
diff
changeset
|
109 def test_quoted(self): |
b75de48a618c
Support boolean and None types
Stefano Rivera <stefano@rivera.za.net>
parents:
114
diff
changeset
|
110 # a literal true is True, but 'true' is a string |
b75de48a618c
Support boolean and None types
Stefano Rivera <stefano@rivera.za.net>
parents:
114
diff
changeset
|
111 self.roundtrip({'foo': 'true'}) |
b75de48a618c
Support boolean and None types
Stefano Rivera <stefano@rivera.za.net>
parents:
114
diff
changeset
|
112 |
b75de48a618c
Support boolean and None types
Stefano Rivera <stefano@rivera.za.net>
parents:
114
diff
changeset
|
113 def test_literals(self): |
b75de48a618c
Support boolean and None types
Stefano Rivera <stefano@rivera.za.net>
parents:
114
diff
changeset
|
114 self.roundtrip({'foo': [True, False, None]}) |
b75de48a618c
Support boolean and None types
Stefano Rivera <stefano@rivera.za.net>
parents:
114
diff
changeset
|
115 |
120
e6e7a471146a
Support numeric types
Stefano Rivera <stefano@rivera.za.net>
parents:
119
diff
changeset
|
116 def test_numeric(self): |
e6e7a471146a
Support numeric types
Stefano Rivera <stefano@rivera.za.net>
parents:
119
diff
changeset
|
117 self.roundtrip({'foo': [1, 2.0, -1, -2.5]}) |
e6e7a471146a
Support numeric types
Stefano Rivera <stefano@rivera.za.net>
parents:
119
diff
changeset
|
118 |
130
67f18e72024d
Handle corner cases around quotes in strings
Stefano Rivera <stefano@rivera.za.net>
parents:
129
diff
changeset
|
119 def test_inline(self): |
67f18e72024d
Handle corner cases around quotes in strings
Stefano Rivera <stefano@rivera.za.net>
parents:
129
diff
changeset
|
120 self.roundtrip([[1, 2, "hi, there' joe", '', "'"], [3, 4]]) |
67f18e72024d
Handle corner cases around quotes in strings
Stefano Rivera <stefano@rivera.za.net>
parents:
129
diff
changeset
|
121 |
90
a8d83de5b460
Dump our YAML subset too
Stefano Rivera <stefano@rivera.za.net>
parents:
89
diff
changeset
|
122 |
a8d83de5b460
Dump our YAML subset too
Stefano Rivera <stefano@rivera.za.net>
parents:
89
diff
changeset
|
123 class TestFromPyYAML(TestRoundTrip): |
112
c28f2fc2bb05
Test with dump_s and load_s
Stefano Rivera <stefano@rivera.za.net>
parents:
103
diff
changeset
|
124 def dump_s(self, data): |
90
a8d83de5b460
Dump our YAML subset too
Stefano Rivera <stefano@rivera.za.net>
parents:
89
diff
changeset
|
125 if yaml is None: |
a8d83de5b460
Dump our YAML subset too
Stefano Rivera <stefano@rivera.za.net>
parents:
89
diff
changeset
|
126 raise SkipTest('yaml module unavailable') |
112
c28f2fc2bb05
Test with dump_s and load_s
Stefano Rivera <stefano@rivera.za.net>
parents:
103
diff
changeset
|
127 return yaml.dump(data, default_flow_style=False) |
90
a8d83de5b460
Dump our YAML subset too
Stefano Rivera <stefano@rivera.za.net>
parents:
89
diff
changeset
|
128 |
a8d83de5b460
Dump our YAML subset too
Stefano Rivera <stefano@rivera.za.net>
parents:
89
diff
changeset
|
129 |
129
423266f0b9e4
Support inline lists, dicts, etc. And alternative top level objects
Stefano Rivera <stefano@rivera.za.net>
parents:
120
diff
changeset
|
130 class TestFromPyYAMLInlineLists(TestRoundTrip): |
423266f0b9e4
Support inline lists, dicts, etc. And alternative top level objects
Stefano Rivera <stefano@rivera.za.net>
parents:
120
diff
changeset
|
131 def dump_s(self, data): |
423266f0b9e4
Support inline lists, dicts, etc. And alternative top level objects
Stefano Rivera <stefano@rivera.za.net>
parents:
120
diff
changeset
|
132 if yaml is None: |
423266f0b9e4
Support inline lists, dicts, etc. And alternative top level objects
Stefano Rivera <stefano@rivera.za.net>
parents:
120
diff
changeset
|
133 raise SkipTest('yaml module unavailable') |
423266f0b9e4
Support inline lists, dicts, etc. And alternative top level objects
Stefano Rivera <stefano@rivera.za.net>
parents:
120
diff
changeset
|
134 return yaml.dump(data) |
423266f0b9e4
Support inline lists, dicts, etc. And alternative top level objects
Stefano Rivera <stefano@rivera.za.net>
parents:
120
diff
changeset
|
135 |
423266f0b9e4
Support inline lists, dicts, etc. And alternative top level objects
Stefano Rivera <stefano@rivera.za.net>
parents:
120
diff
changeset
|
136 |
90
a8d83de5b460
Dump our YAML subset too
Stefano Rivera <stefano@rivera.za.net>
parents:
89
diff
changeset
|
137 class TestToPyYAML(TestRoundTrip): |
112
c28f2fc2bb05
Test with dump_s and load_s
Stefano Rivera <stefano@rivera.za.net>
parents:
103
diff
changeset
|
138 def load_s(self, text): |
90
a8d83de5b460
Dump our YAML subset too
Stefano Rivera <stefano@rivera.za.net>
parents:
89
diff
changeset
|
139 if yaml is None: |
a8d83de5b460
Dump our YAML subset too
Stefano Rivera <stefano@rivera.za.net>
parents:
89
diff
changeset
|
140 raise SkipTest('yaml module unavailable') |
112
c28f2fc2bb05
Test with dump_s and load_s
Stefano Rivera <stefano@rivera.za.net>
parents:
103
diff
changeset
|
141 return yaml.load(text) |