diff options
author | Matěj Cepl <mcepl@redhat.com> | 2012-03-08 19:37:34 +0100 |
---|---|---|
committer | Matěj Cepl <mcepl@redhat.com> | 2012-03-08 19:37:34 +0100 |
commit | 8ac3747446cb2e8b0749e91cb6e6dbf318efe516 (patch) | |
tree | 2ec279889bc9e0365eb4ceccd2dbb3cbac1903b3 | |
parent | d9f2aa1f9d1066a168700c4e356db4f26772468a (diff) | |
download | yamlish-8ac3747446cb2e8b0749e91cb6e6dbf318efe516.tar.gz |
All tests succeeding!!!
-rw-r--r-- | failing_test.py | 15 | ||||
-rw-r--r-- | test/__init__.py | 55 | ||||
-rw-r--r-- | test/test_input.py | 11 | ||||
-rw-r--r-- | test/test_load.py | 5 | ||||
-rw-r--r-- | test/test_output.py | 116 | ||||
-rw-r--r-- | test/test_reader.py | 54 | ||||
-rw-r--r-- | test/test_writer.py | 206 | ||||
-rw-r--r-- | yamlish.py | 4 |
8 files changed, 248 insertions, 218 deletions
diff --git a/failing_test.py b/failing_test.py deleted file mode 100644 index 7a2f655..0000000 --- a/failing_test.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/python -from __future__ import absolute_import, print_function, unicode_literals -import yaml - -inobj = { - "date": "2001-01-23", - "state": "MI", - "quantity": 4 - } - -print("type inobj = %s" % type(inobj)) -print(inobj) -res = yaml.dump(inobj, encoding="utf-8", default_flow_style=False, - default_style=False, canonical=False, Dumper=yaml.SafeDumper) -print("'%s'" % res) diff --git a/test/__init__.py b/test/__init__.py index b66ce57..1ebe41b 100644 --- a/test/__init__.py +++ b/test/__init__.py @@ -1,20 +1,25 @@ # -*- coding: utf-8 -*- IGNORE:C0111 from __future__ import absolute_import, print_function, unicode_literals import logging -from test import test_reader, test_input import yamlish -import unittest +import unittest2 as unittest import yaml +import tempfile +import textwrap +from textwrap import dedent logging.basicConfig(level=logging.INFO) +INPUT = 1 +OUTPUT = 2 + def _generate_test_name(source): """ Clean up human-friendly test name into a method name. """ - out = source.replace(' ', '_').replace(':', '').lower() + out = source.replace(' ', '_').replace(':', '').replace(',', '').lower() return "test_%s" % out -def _create_test(test_src, tested_function): +def _create_input_test(test_src, tested_function): """ Decorate tested function to be used as a method for TestCase. """ @@ -22,6 +27,7 @@ def _create_test(test_src, tested_function): """ Execute a test by calling a tested_function on test_src data. """ + self.maxDiff = None if ('skip' in test_src) and test_src['skip']: logging.info("test_src skipped!") return @@ -43,7 +49,41 @@ def _create_test(test_src, tested_function): return do_test_expected -def generate_testsuite(test_data, test_case_shell, test_fce): +def _create_output_test(test_src, tested_function): + """ + Decorate tested function to be used as a method for TestCase. + """ + def do_test_expected(self): + """ + Execute a test by calling a tested_function on test_src data. + """ + self.maxDiff = None + if ('skip' in test_src) and test_src['skip']: + logging.info("test_src skipped!") + return + + + # We currently don't throw any exceptions in Writer, so this + # this is always false + if 'error' in test_src: + self.assertRaises(test_src['error'], yamlish.dumps, test_src['in']) + else: + logging.debug("out:\n%s", textwrap.dedent(test_src['out'])) + want = yaml.load(textwrap.dedent(test_src['out'])) + logging.debug("want:\n%s", want) + with tempfile.NamedTemporaryFile(delete=False) as test_file: + tested_function(test_src['in'], test_file) + test_file.seek(0) + got_str = test_file.read() + logging.debug("got_str = %s", got_str) + got = yaml.load(got_str) + self.assertEqual(got, want, "Result matches") + + return do_test_expected + + + +def generate_testsuite(test_data, test_case_shell, test_fce, direction=INPUT): """ Generate tests from the test data, class to build upon and function to use for testing. """ @@ -52,6 +92,9 @@ def generate_testsuite(test_data, test_case_shell, test_fce): logging.info("test %s skipped!", in_test['name']) continue name = _generate_test_name(in_test['name']) - test_method = _create_test (in_test, test_fce) + if direction == INPUT: + test_method = _create_input_test (in_test, test_fce) + elif direction == OUTPUT: + test_method = _create_output_test(in_test, test_fce) test_method.__name__ = str('test_%s' % name) # IGNORE:W0622 setattr (test_case_shell, test_method.__name__, test_method) diff --git a/test/test_input.py b/test/test_input.py index 6ed6a6f..cfd4142 100644 --- a/test/test_input.py +++ b/test/test_input.py @@ -1,22 +1,22 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import, print_function, unicode_literals import test -import unittest +import unittest2 as unittest import yamlish test_data_list = [ { "name": "Input test", - "in": """--- + "in": r"""--- bill-to: address: city: "Royal Oak" - lines: "458 Walkman Dr.\\nSuite #292\\n" + lines: "458 Walkman Dr.\nSuite #292\n" postal: 48046 state: MI family: Dumars given: Chris -comments: "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338\\n" +comments: "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338\n" date: 2001-01-23 invoice: 34843 product: @@ -72,6 +72,7 @@ total: 4443.52 class TestInput(unittest.TestCase): # IGNORE:C0111 pass +test.generate_testsuite(test_data_list, TestInput, yamlish.load) + if __name__ == "__main__": - test.generate_testsuite(test_data_list, TestInput, yamlish.load) unittest.main() diff --git a/test/test_load.py b/test/test_load.py index a86364b..b5ac95e 100644 --- a/test/test_load.py +++ b/test/test_load.py @@ -1,11 +1,10 @@ # -*- coding: utf-8 -*- -import unittest +from __future__ import absolute_import, print_function, unicode_literals +import unittest2 as unittest class TestBasics(unittest.TestCase): def test_import(self): import yamlish - from yamlish import Reader #IGNORE:W0612 - from yamlish import Writer #IGNORE:W0612 self.assertTrue(yamlish.__version__, "Testing import of yamlish, version %s." % yamlish.__version__) diff --git a/test/test_output.py b/test/test_output.py index 4ed050f..907dea6 100644 --- a/test/test_output.py +++ b/test/test_output.py @@ -5,39 +5,39 @@ Test general output functionality. Without much stress on the format itself. """ from __future__ import absolute_import, print_function, unicode_literals -from StringIO import StringIO -import re -import unittest +import unittest2 as unittest import yamlish +import yaml +import logging +import tempfile -OUT = [ - "---", - "bill-to:", - " address:", - " city: 'Royal Oak'", - " lines: \"458 Walkman Dr.\\nSuite #292\\n\"", - " postal: 48046", - " state: MI", - " family: Dumars", - " given: Chris", - "comments: \"Late afternoon is best. Backup contact is Nancy Billsmer \@ 338-4338\\n\"", - "date: 2001-01-23", - "invoice: 34843", - "product:", - " -", - " description: Basketball", - " price: 450.00", - " quantity: 4", - " sku: BL394D", - " -", - " description: 'Super Hoop'", - " price: 2392.00", - " quantity: 1", - " sku: BL4438H", - "tax: 251.42", - "total: 4443.52", - "...", -] +OUT = """--- +bill-to: + address: + city: Royal Oak + lines: "458 Walkman Dr.\\nSuite #292\\n" + postal: 48046 + state: MI + family: Dumars + given: Chris +comments: Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338 +date: 2001-01-23 +invoice: 34843 +product: + - + description: Basketball + price: 450.00 + quantity: 4 + sku: BL394D + - + description: Super Hoop + price: 2392.00 + quantity: 1 + sku: BL4438H +tax: 251.42 +total: 4443.52 +... +""" IN = { 'bill-to': { @@ -45,7 +45,7 @@ IN = { 'address': { 'city': 'Royal Oak', 'postal': 48046, - 'lines': "458 Walkman Dr.\\nSuite #292\\n", + 'lines': "458 Walkman Dr.\nSuite #292\n", 'state': 'MI' }, 'family': 'Dumars' @@ -67,67 +67,39 @@ IN = { 'description': 'Super Hoop' } ], - 'comments': "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338\\n", + 'comments': "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338", 'total': 4443.52 } -buf1 = [] -buf2 = [] -buf3 = "" - -destination = [ - { - "name": 'Array reference', - "destination": buf1, - "normalise": (lambda : buf1), - }, -# { -# "name": 'Closure', -# "destination": sub { push @buf2, shift }, -# "normalise": sub { return \@buf2 }, -# }, - { - "name": 'Scalar', - "destination": buf3, - "normalise": (lambda : re.split(r" \n ", buf3)) - } -] - class TestOuptut(unittest.TestCase): def setUp(self): """ Transform expected list into string which we actually use. """ - self._expected = "" - for line in OUT: - self._expected += line + "\n" + self._expected = yaml.safe_load(OUT) - def notest_file_output(self): + def test_file_output(self): """ Test output to a file. """ - outf = StringIO() - yamlish.dump(IN, outf) + outf = tempfile.TemporaryFile() + yaml.safe_dump(IN, outf) outf.seek(0) - got = outf.read() + got_str = outf.read() outf.close() - self.assertEqual(got, self._expected, """Result matches - expected = %s + logging.debug("got_str = %s", got_str) + got = yaml.safe_load(got_str) + self.assertEqual(got, self._expected, "Result matches") - observed = %s - """ % (self._expected, got)) def test_string_output(self): """ Test output to a string. """ - got = yamlish.dumps(IN) - self.assertEqual(got, self._expected, """Result matches - expected = %s - - observed = %s - """ % (self._expected, got)) + got_str = yamlish.dumps(IN) + got = yaml.load(got_str) + self.assertEqual(got, self._expected, "Result matches") if __name__ == "__main__": unittest.main() diff --git a/test/test_reader.py b/test/test_reader.py index 8c681c8..0676b30 100644 --- a/test/test_reader.py +++ b/test/test_reader.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- +from __future__ import absolute_import, print_function, unicode_literals import yaml import yamlish import test -import unittest +import unittest2 as unittest test_data_list = [ { @@ -42,7 +43,7 @@ test_data_list = [ }, { "name": 'Mixed array', - "in": [ '---', '- 1', "- 'two'", '- "three\n"', '...', ], + "in": [ '---', '- 1', "- 'two'", r'- "three\n"', '...', ], "out": [ 1, 'two', "three\n" ], }, { @@ -311,44 +312,42 @@ test_data_list = [ }, { "name": "Unprintables", - "skip": True, "in": [ - "---", - "- \"\\z\\x01\\x02\\x03\\x04\\x05\\x06\\a\\x08\\t\\n\\v\\f\\r\\x0e\\x0f\"", + "- \"\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\a\\x08\\t\\n\\v\\f\\r\\x0e\\x0f\"", "- \"\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\e\\x1c\\x1d\\x1e\\x1f\"", - "- \" !\\\"#\$%&'()*+,-./\"", + "- \" !\\\"#$%&'()*+,-./\"", "- 0123456789:;<=>?", "- '\@ABCDEFGHIJKLMNO'", "- 'PQRSTUVWXYZ[\\]^_'", "- '`abcdefghijklmno'", - "- 'pqrstuvwxyz{|}~\177'", - "- \200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217", - "- \220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237", - "- \240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257", - "- \260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277", - "- \300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317", - "- \320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337", - "- \340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357", - "- \360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377", + r"- 'pqrstuvwxyz{|}~\177'", + "- \\200\\201\\202\\203\\204\\205\\206\\207\\210\\211\\212\\213\\214\\215\\216\\217", + "- \\220\\221\\222\\223\\224\\225\\226\\227\\230\\231\\232\\233\\234\\235\\236\\237", + "- \\240\\241\\242\\243\\244\\245\\246\\247\\250\\251\\252\\253\\254\\255\\256\\257", + "- \\260\\261\\262\\263\\264\\265\\266\\267\\270\\271\\272\\273\\274\\275\\276\\277", + "- \\300\\301\\302\\303\\304\\305\\306\\307\\310\\311\\312\\313\\314\\315\\316\\317", + "- \\320\\321\\322\\323\\324\\325\\326\\327\\330\\331\\332\\333\\334\\335\\336\\337", + "- \\340\\341\\342\\343\\344\\345\\346\\347\\350\\351\\352\\353\\354\\355\\356\\357", + "- \\360\\361\\362\\363\\364\\365\\366\\367\\370\\371\\372\\373\\374\\375\\376\\377", "..." ], "out": [ "\0\1\2\3\4\5\6\a\b\t\n\13\f\r\16\17", - "\20\21\22\23\24\25\26\27\30\31\32\e\34\35\36\37", - " !\"#\$%&'()*+,-./", + "\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37", + " !\"#$%&'()*+,-./", "0123456789:;<=>?", "\@ABCDEFGHIJKLMNO", "PQRSTUVWXYZ[\\]^_", "`abcdefghijklmno", - "pqrstuvwxyz{|}~\177", - "\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217", - "\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237", - "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257", - "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277", - "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317", - "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337", - "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357", - "\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377" + r"pqrstuvwxyz{|}~\177", + r"\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217", + r"\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237", + r"\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257", + r"\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277", + r"\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317", + r"\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337", + r"\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357", + r"\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377" ] }, { @@ -366,6 +365,7 @@ test_data_list = [ class TestReader(unittest.TestCase): # IGNORE:C0111 pass +test.generate_testsuite(test_data_list, TestReader, yamlish.load) + if __name__ == "__main__": - test.generate_testsuite(test_data_list, TestReader, yamlish.load) unittest.main() diff --git a/test/test_writer.py b/test/test_writer.py index 0c1b517..7d9e690 100644 --- a/test/test_writer.py +++ b/test/test_writer.py @@ -1,77 +1,127 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import, print_function, unicode_literals -import unittest +import unittest2 as unittest +import test import yamlish test_data_list = [ { "name": 'Simple scalar', "in": 1, - "out": [ '--- 1', '...', ], + "out": """\ + --- 1 + ... + """, }, { "name": 'Undef', "in": None, - "out": [ '--- ~', '...', ], + "out": """\ + --- ~ + ... + """, }, { "name": 'Unprintable', "in": "\x01\n\t", - "out": [ '--- "\x01\n\t"', '...', ], + "out": """\ + --- + "\\x01\\n\\t" + ... + """, }, { "name": 'Simple array', "in": [ 1, 2, 3 ], - "out": [ '---', '- 1', '- 2', '- 3', '...', ], + "out": """\ + --- + - 1 + - 2 + - 3 + ... + """, }, { "name": 'Array, two elements, None', "in": [ None, None ], - "out": [ '---', '- ~', '- ~', '...', ], + "out": """\ + --- + - ~ + - ~ + ... + """, }, { "name": 'Nested array', "in": [ 1, 2, [ 3, 4 ], 5 ], - "out": - [ '---', '- 1', '- 2', '-', ' - 3', ' - 4', '- 5', '...', ], + "out": """\ + --- + - 1 + - 2 + - + - 3 + - 4 + - 5 + ... + """, }, { "name": 'Simple hash', - "in": { "one": '1', "two": '2', "three": '3' }, - "out": [ '---', 'one: 1', 'three: 3', 'two: 2', '...', ], + "in": { "one": 1, "two": 2, "three": 3 }, + "out": """\ + --- + one: 1 + three: 3 + two: 2 + ... + """, }, { "name": 'Nested hash', "in": { - "one": '1', - "two": '2', - "more": { "three": '3', "four": '4' } + "one": 1, + "two": 2, + "more": { "three": 3, "four": 4 } }, - "out": [ - '---', - 'more:', - ' four: 4', - ' three: 3', - 'one: 1', - 'two: 2', - '...', - ], + "out": """\ + --- + more: + four: 4 + three: 3 + one: 1 + two: 2 + ... + """, }, { "name": 'Unprintable key', - "in": { "one": '1', "\x02": '2', "three": '3' }, - "out": [ '---', '"\x02": 2', 'one: 1', 'three: 3', '...', ], + "in": { "one": 1, "\x02": 2, "three": 3 }, + "out": """\ + --- + "\\x02": 2 + one: 1 + three: 3 + ... + """, }, { "name": 'Empty key', "in": { '': 'empty' }, - "out": [ '---', "'': empty", '...', ], + "out": """\ + --- + '': empty + ... + """, }, { "name": 'Empty value', "in": { '': '' }, - "out": [ '---', "'': ''", '...', ], + "out": """\ + --- + '': '' + ... + """, }, { "name": 'Complex', @@ -80,90 +130,68 @@ test_data_list = [ 'given': 'Chris', 'address': { 'city': 'Royal Oak', - 'postal': '48046', + 'postal': 48046, 'lines': "458 Walkman Dr.\nSuite #292\n", 'state': 'MI' }, 'family': 'Dumars' }, - 'invoice': '34843', + 'invoice': 34843, 'date': '2001-01-23', - 'tax': '251.42', + 'tax': 251.42, 'product': [ { 'sku': 'BL394D', - 'quantity': '4', - 'price': '450.00', + 'quantity': 4, + 'price': 450.00, 'description': 'Basketball' }, { 'sku': 'BL4438H', - 'quantity': '1', - 'price': '2392.00', + 'quantity': 1, + 'price': 2392.00, 'description': 'Super Hoop' } ], 'comments': "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338\n", - 'total': '4443.52' + 'total': 4443.52 }, - "out": [ - "---", - "bill-to:", - " address:", - " city: 'Royal Oak'", - " lines: \"458 Walkman Dr.\\nSuite #292\\n\"", - " postal: 48046", - " state: MI", - " family: Dumars", - " given: Chris", - "comments: \"Late afternoon is best. Backup contact is Nancy Billsmer \@ 338-4338\\n\"", - "date: 2001-01-23", - "invoice: 34843", - "product:", - " -", - " description: Basketball", - " price: 450.00", - " quantity: 4", - " sku: BL394D", - " -", - " description: 'Super Hoop'", - " price: 2392.00", - " quantity: 1", - " sku: BL4438H", - "tax: 251.42", - "total: 4443.52", - "...", - ], + "out": r""" + --- + bill-to: + address: + city: 'Royal Oak' + lines: "458 Walkman Dr.\nSuite #292\n" + postal: 48046 + state: MI + family: Dumars + given: Chris + comments: "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338\n" + date: 2001-01-23 + invoice: 34843 + product: + - + description: Basketball + price: 450.00 + quantity: 4 + sku: BL394D + - + description: 'Super Hoop' + price: 2392.00 + quantity: 1 + sku: BL4438H + tax: 251.42 + total: 4443.52 + ... + """, }, ] -# plan(tests = len(test_data_list) * 5) +class TestWriter(unittest.TestCase): # IGNORE:C0111 + pass -class TestWriter(unittest.TestCase): - def test_writer(self): - for test in test_data_list: - name = test['name'] - data = test['in'] +test.generate_testsuite(test_data_list, TestWriter, yamlish.dump, direction=test.OUTPUT) - got = "" - # We currently don't throw any exceptions in Writer, so this - # this is always false - if 'error' in test: - self.assertRaises(test['error'], yamlish.dumps, test['in']) - else: - want = test['out'] - yamlish.dump(test['in'], got) - self.assertEqual(got, want, """%s: Result matches - expected = %s - - observed = %s - """ % (name, want, got)) - - # Now try parsing it - parsed = yamlish.load(got) # FIXME got has an iterator - self.assertEqual(parsed, data, """%s: Reparse OK - expected = %s - - observed = %s - """ % (name, data, parsed)) +if __name__ == "__main__": + unittest.main() @@ -172,10 +172,12 @@ def dump(source, destination): if isinstance(destination, (str, unicode)): with open(destination, "w") as outf: dump(source, outf) - elif isinstance(destination, file): + elif getattr(destination, "file"): yaml.dump(source, destination, encoding="utf-8", default_flow_style=False, canonical=False, Dumper=yaml.SafeDumper) + else: + raise NameError def dumps(source): """ |