aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/__init__.py20
-rw-r--r--test/all_tests.py22
-rw-r--r--test/output.py107
-rw-r--r--test/pod.py6
-rw-r--r--test/pod_coverage.py9
-rw-r--r--test/reader.py419
-rw-r--r--test/test_input.py (renamed from test/input.py)8
-rw-r--r--test/test_load.py (renamed from test/load.py)5
-rw-r--r--test/test_output.py107
-rw-r--r--test/test_reader.py417
-rw-r--r--test/test_writer.py197
-rw-r--r--test/writer.py200
12 files changed, 764 insertions, 753 deletions
diff --git a/test/__init__.py b/test/__init__.py
new file mode 100644
index 0000000..9f3cdc6
--- /dev/null
+++ b/test/__init__.py
@@ -0,0 +1,20 @@
+def TODO(func):
+ """unittest test method decorator that ignores
+ exceptions raised by test
+
+ Used to annotate test methods for code that may
+ not be written yet. Ignores failures in the
+ annotated test method; fails if the text
+ unexpectedly succeeds.
+ """
+ def wrapper(*args, **kw):
+ try:
+ func(*args, **kw)
+ succeeded = True
+ except:
+ succeeded = False
+ assert succeeded is False, \
+ "%s marked TODO but passed" % func.__name__
+ wrapper.__name__ = func.__name__
+ wrapper.__doc__ = func.__doc__
+ return wrapper
diff --git a/test/all_tests.py b/test/all_tests.py
index f4f3bbe..4a1a532 100644
--- a/test/all_tests.py
+++ b/test/all_tests.py
@@ -1,11 +1,17 @@
import unittest
-import load, input, reader, output, writer
+import test_load
+import test_input
+#import test_reader
+import test_output
+#import test_writer
-add_tests_from_class = unittest.TestLoader().loadTestsFromTestCase
+if __name__ == "__main__":
+ loader = unittest.TestLoader()
+ suite = loader.loadTestsFromModule(test_load)
+ suite.addTests(loader.loadTestsFromModule(test_input))
+ #suite.addTests(loader.loadTestsFromModule(test_reader))
+ suite.addTests(loader.loadTestsFromModule(test_output))
+ #suite.addTests(loader.loadTestsFromModule(test_writer))
-suite = unittest.TestSuite()
-suite.addTest(add_tests_from_class(load.TestBasics))
-suite.addTest(add_tests_from_class(TestHappyPath))
-suite.addTest(add_tests_from_class(TestBadPath))
-suite.addTest(add_tests_from_class(TestPiglitData))
-suite.addTest(add_tests_from_class(TestMainArgsMgmt))
+ runner = unittest.TextTestRunner(verbosity=2)
+ result = runner.run(suite)
diff --git a/test/output.py b/test/output.py
deleted file mode 100644
index 56cfb0a..0000000
--- a/test/output.py
+++ /dev/null
@@ -1,107 +0,0 @@
-use strict;
-use warnings;
-use Test::More tests => 9;
-use Data::Dumper;
-
-use Data::YAML::Writer;
-
-my $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",
- "...",
-];
-
-my $in = {
- 'bill-to' => {
- 'given' => 'Chris',
- 'address' => {
- 'city' => 'Royal Oak',
- 'postal' => '48046',
- 'lines' => "458 Walkman Dr.\nSuite #292\n",
- 'state' => 'MI'
- },
- 'family' => 'Dumars'
- },
- 'invoice' => '34843',
- 'date' => '2001-01-23',
- 'tax' => '251.42',
- 'product' => [
- {
- 'sku' => 'BL394D',
- 'quantity' => '4',
- 'price' => '450.00',
- 'description' => 'Basketball'
- },
- {
- 'sku' => 'BL4438H',
- 'quantity' => '1',
- 'price' => '2392.00',
- 'description' => 'Super Hoop'
- }
- ],
- 'comments' =>
- "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338\n",
- 'total' => '4443.52'
-};
-
-my @buf1 = ();
-my @buf2 = ();
-my $buf3 = '';
-
-my @destination = (
- {
- name => 'Array reference',
- destination => \@buf1,
- normalise => sub { return \@buf1 },
- },
- {
- name => 'Closure',
- destination => sub { push @buf2, shift },
- normalise => sub { return \@buf2 },
- },
- {
- name => 'Scalar',
- destination => \$buf3,
- normalise => sub {
- my @ar = split( /\n/, $buf3 );
- return \@ar;
- },
- },
-);
-
-for my $dest ( @destination ) {
- my $name = $dest->{name};
- ok my $yaml = Data::YAML::Writer->new, "$name: Created";
- isa_ok $yaml, 'Data::YAML::Writer';
-
- $yaml->write( $in, $dest->{destination} );
- my $got = $dest->{normalise}->();
- unless ( is_deeply $got, $out, "$name: Result matches" ) {
- local $Data::Dumper::Useqq = $Data::Dumper::Useqq = 1;
- diag( Data::Dumper->Dump( [$got], ['$got'] ) );
- diag( Data::Dumper->Dump( [$out], ['$expected'] ) );
- }
-}
diff --git a/test/pod.py b/test/pod.py
deleted file mode 100644
index 976d7cd..0000000
--- a/test/pod.py
+++ /dev/null
@@ -1,6 +0,0 @@
-#!perl -T
-
-use Test::More;
-eval "use Test::Pod 1.14";
-plan skip_all => "Test::Pod 1.14 required for testing POD" if $@;
-all_pod_files_ok();
diff --git a/test/pod_coverage.py b/test/pod_coverage.py
deleted file mode 100644
index c412996..0000000
--- a/test/pod_coverage.py
+++ /dev/null
@@ -1,9 +0,0 @@
-#!perl -T
-
-use Test::More;
-eval "use Test::Pod::Coverage 1.04";
-plan skip_all =>
- "Test::Pod::Coverage 1.04 required for testing POD coverage"
- if $@;
-all_pod_coverage_ok(
- { private => [ qr{^BUILD|DEMOLISH|AUTOMETHOD|START$}, qr{^_} ] } );
diff --git a/test/reader.py b/test/reader.py
deleted file mode 100644
index fc6806f..0000000
--- a/test/reader.py
+++ /dev/null
@@ -1,419 +0,0 @@
-use strict;
-use warnings;
-use Test::More;
-use Data::Dumper;
-
-use Data::YAML::Reader;
-
-my @SCHEDULE;
-
-BEGIN {
- @SCHEDULE = (
- {
- name => 'Hello World',
- in => [ '--- Hello, World', '...', ],
- out => "Hello, World",
- },
- {
- name => 'Hello World 2',
- in => [ '--- \'Hello, \'\'World\'', '...', ],
- out => "Hello, 'World",
- },
- {
- name => 'Hello World 3',
- in => [ '--- "Hello, World"', '...', ],
- out => "Hello, World",
- },
- {
- name => 'Hello World 4',
- in => [ '--- "Hello, World"', '...', ],
- out => "Hello, World",
- },
- {
- name => 'Hello World 4',
- in => [ '--- >', ' Hello,', ' World', '...', ],
- out => "Hello, World\n",
- },
- {
- name => 'Hello World 5',
- in => [ '--- >', ' Hello,', ' World', '...', ],
- error => qr{Missing\s+'[.][.][.]'},
- },
- {
- name => 'Simple array',
- in => [ '---', '- 1', '- 2', '- 3', '...', ],
- out => [ '1', '2', '3' ],
- },
- {
- name => 'Mixed array',
- in => [ '---', '- 1', '- \'two\'', '- "three\n"', '...', ],
- out => [ '1', 'two', "three\n" ],
- },
- {
- name => 'Hash in array',
- in => [ '---', '- 1', '- two: 2', '- 3', '...', ],
- out => [ '1', { two => '2' }, '3' ],
- },
- {
- name => 'Hash in array 2',
- in => [ '---', '- 1', '- two: 2', ' three: 3', '- 4', '...', ],
- out => [ '1', { two => '2', three => '3' }, '4' ],
- },
- {
- name => 'Nested array',
- in => [
- '---',
- '- one',
- '-',
- ' - two',
- ' -',
- ' - three',
- ' - four',
- '- five',
- '...',
- ],
- out => [ 'one', [ 'two', ['three'], 'four' ], 'five' ],
- },
- {
- name => 'Nested hash',
- in => [
- '---',
- 'one:',
- ' five: 5',
- ' two:',
- ' four: 4',
- ' three: 3',
- 'six: 6',
- '...',
- ],
- out => {
- one => { two => { three => '3', four => '4' }, five => '5' },
- six => '6'
- },
- },
-
- {
- name => 'Original YAML::Tiny test',
- in => [
- '---',
- 'invoice: 34843',
- 'date : 2001-01-23',
- 'bill-to:',
- ' given : Chris',
- ' family : Dumars',
- ' address:',
- ' lines: |',
- ' 458 Walkman Dr.',
- ' Suite #292',
- ' city : Royal Oak',
- ' state : MI',
- ' postal : 48046',
- 'product:',
- ' - sku : BL394D',
- ' quantity : 4',
- ' description : Basketball',
- ' price : 450.00',
- ' - sku : BL4438H',
- ' quantity : 1',
- ' description : Super Hoop',
- ' price : 2392.00',
- 'tax : 251.42',
- 'total: 4443.52',
- 'comments: >',
- ' Late afternoon is best.',
- ' Backup contact is Nancy',
- ' Billsmer @ 338-4338',
- '...',
- ],
- out => {
- 'bill-to' => {
- 'given' => 'Chris',
- 'address' => {
- 'city' => 'Royal Oak',
- 'postal' => '48046',
- 'lines' => "458 Walkman Dr.\nSuite #292\n",
- 'state' => 'MI'
- },
- 'family' => 'Dumars'
- },
- 'invoice' => '34843',
- 'date' => '2001-01-23',
- 'tax' => '251.42',
- 'product' => [
- {
- 'sku' => 'BL394D',
- 'quantity' => '4',
- 'price' => '450.00',
- 'description' => 'Basketball'
- },
- {
- 'sku' => 'BL4438H',
- 'quantity' => '1',
- 'price' => '2392.00',
- 'description' => 'Super Hoop'
- }
- ],
- 'comments' =>
- "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338\n",
- 'total' => '4443.52'
- }
- },
-
- # Tests harvested from YAML::Tiny
- {
- in => ['...'],
- name => 'Regression: empty',
- error => qr{document\s+header\s+not\s+found}
- },
- {
- in => [ '# comment', '...' ],
- name => 'Regression: only_comment',
- error => qr{document\s+header\s+not\s+found}
- },
- {
- out => undef,
- in => [ '---', '...' ],
- name => 'Regression: only_header',
- error => qr{Premature\s+end}i,
- },
- {
- out => undef,
- in => [ '---', '---', '...' ],
- name => 'Regression: two_header',
- error => qr{Unexpected\s+start}i,
- },
- {
- out => undef,
- in => [ '--- ~', '...' ],
- name => 'Regression: one_undef'
- },
- {
- out => undef,
- in => [ '--- ~', '...' ],
- name => 'Regression: one_undef2'
- },
- {
- in => [ '--- ~', '---', '...' ],
- name => 'Regression: two_undef',
- error => qr{Missing\s+'[.][.][.]'},
- },
- {
- out => 'foo',
- in => [ '--- foo', '...' ],
- name => 'Regression: one_scalar',
- },
- {
- out => 'foo',
- in => [ '--- foo', '...' ],
- name => 'Regression: one_scalar2',
- },
- {
- in => [ '--- foo', '--- bar', '...' ],
- name => 'Regression: two_scalar',
- error => qr{Missing\s+'[.][.][.]'},
- },
- {
- out => ['foo'],
- in => [ '---', '- foo', '...' ],
- name => 'Regression: one_list1'
- },
- {
- out => [ 'foo', 'bar' ],
- in => [ '---', '- foo', '- bar', '...' ],
- name => 'Regression: one_list2'
- },
- {
- out => [ undef, 'bar' ],
- in => [ '---', '- ~', '- bar', '...' ],
- name => 'Regression: one_listundef'
- },
- {
- out => { 'foo' => 'bar' },
- in => [ '---', 'foo: bar', '...' ],
- name => 'Regression: one_hash1'
- },
- {
- out => {
- 'foo' => 'bar',
- 'this' => undef
- },
- in => [ '---', 'foo: bar', 'this: ~', '...' ],
- name => 'Regression: one_hash2'
- },
- {
- out => { 'foo' => [ 'bar', undef, 'baz' ] },
- in => [ '---', 'foo:', ' - bar', ' - ~', ' - baz', '...' ],
- name => 'Regression: array_in_hash'
- },
- {
- out => {
- 'bar' => { 'foo' => 'bar' },
- 'foo' => undef
- },
- in => [ '---', 'foo: ~', 'bar:', ' foo: bar', '...' ],
- name => 'Regression: hash_in_hash'
- },
- {
- out => [
- {
- 'foo' => undef,
- 'this' => 'that'
- },
- 'foo', undef,
- {
- 'foo' => 'bar',
- 'this' => 'that'
- }
- ],
- in => [
- '---',
- '-',
- ' foo: ~',
- ' this: that',
- '- foo',
- '- ~',
- '-',
- ' foo: bar',
- ' this: that',
- '...'
- ],
- name => 'Regression: hash_in_array'
- },
- {
- out => ['foo'],
- in => [ '---', '- \'foo\'', '...' ],
- name => 'Regression: single_quote1'
- },
- {
- out => [' '],
- in => [ '---', '- \' \'', '...' ],
- name => 'Regression: single_spaces'
- },
- {
- out => [''],
- in => [ '---', '- \'\'', '...' ],
- name => 'Regression: single_null'
- },
- {
- out => ' ',
- in => [ '--- " "', '...' ],
- name => 'Regression: only_spaces'
- },
- {
- out => [
- undef,
- {
- 'foo' => 'bar',
- 'this' => 'that'
- },
- 'baz'
- ],
- in =>
- [ '---', '- ~', '- foo: bar', ' this: that', '- baz', '...' ],
- name => 'Regression: inline_nested_hash'
- },
- {
- name => "Unprintables",
- in => [
- "---",
- "- \"\\z\\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",
- "..."
- ],
- 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",
- " !\"#\$%&'()*+,-./",
- "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"
- ],
- },
- {
- name => 'Quoted hash keys',
- in => [
- '---', ' "quoted": Magic!', ' "\n\t": newline, tab', '...',
- ],
- out => {
- quoted => 'Magic!',
- "\n\t" => 'newline, tab',
- },
- },
- );
-
- plan tests => @SCHEDULE * 5;
-}
-
-sub iter {
- my $ar = shift;
- return sub {
- return shift @$ar;
- };
-}
-
-for my $test ( @SCHEDULE ) {
- my $name = $test->{name};
- ok my $yaml = Data::YAML::Reader->new, "$name: Created";
- isa_ok $yaml, 'Data::YAML::Reader';
-
- # diag "$name\n";
-
- # unless ( $test->{in} ) {
- # pass for 1 .. 2;
- # use YAML;
- # diag "Input for test:\n";
- # diag( Dump( $test->{out} ) );
- # next;
- # }
-
- my $source = join( "\n", @{ $test->{in} } ) . "\n";
-
- my $iter = iter( $test->{in} );
- my $got = eval { $yaml->read( $iter ) };
-
- my $raw = $yaml->get_raw;
-
- if ( my $err = $test->{error} ) {
- unless ( like $@, $err, "$name: Error message" ) {
- diag "Error: $@\n";
- }
- ok !$got, "$name: No result";
- pass;
- }
- else {
- my $want = $test->{out};
- unless ( ok !$@, "$name: No error" ) {
- diag "Error: $@\n";
- }
- unless ( is_deeply $got, $want, "$name: Result matches" ) {
- local $Data::Dumper::Useqq = $Data::Dumper::Useqq = 1;
- diag( Data::Dumper->Dump( [$got], ['$got'] ) );
- diag( Data::Dumper->Dump( [$want], ['$expected'] ) );
- }
- is $raw, $source, "$name: Captured source matches";
- }
-}
diff --git a/test/input.py b/test/test_input.py
index 8f7e553..a979756 100644
--- a/test/input.py
+++ b/test/test_input.py
@@ -1,7 +1,10 @@
# -*- coding: utf-8 -*-
+from __future__ import absolute_import, print_function, unicode_literals
import logging
import unittest
import yamlish
+logging.basicConfig(format='%(levelname)s:%(funcName)s:%(message)s',
+ level=logging.INFO)
IN = """
---
@@ -87,7 +90,7 @@ class TestInput(unittest.TestCase):
for src in source:
name = src['name']
yaml = yamlish.Reader()
- self.assert_(True, "$name: Created")
+ self.assert_(True, "%s: Created" % name)
self.assert_(isinstance(yaml, yamlish.Reader))
#my $got = eval { $yaml -> read($src -> {source}) };
@@ -97,6 +100,3 @@ class TestInput(unittest.TestCase):
observed = %s
""" % (name, OUT, got))
-
-if __name__ == "__main__":
- unittest.main()
diff --git a/test/load.py b/test/test_load.py
index e4f3f5f..852dd29 100644
--- a/test/load.py
+++ b/test/test_load.py
@@ -5,6 +5,11 @@ class TestBasics(unittest.TestCase):
def test_import(self):
import yamlish
from yamlish import Reader
+ self.assert_(True, "Importing Reader.")
from yamlish import Writer
+ self.assert_(True, "Importing Writer.")
self.assert_(True,
"Testing import of yamlish, version %s." % yamlish.__version__)
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/test/test_output.py b/test/test_output.py
new file mode 100644
index 0000000..a8f5a43
--- /dev/null
+++ b/test/test_output.py
@@ -0,0 +1,107 @@
+# -*- coding: utf-8 -*-
+from __future__ import absolute_import, print_function, unicode_literals
+import re
+import unittest
+import yamlish
+from . import TODO
+
+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",
+ "...",
+]
+
+IN = {
+ 'bill-to': {
+ 'given': 'Chris',
+ 'address': {
+ 'city': 'Royal Oak',
+ 'postal': '48046',
+ 'lines': "458 Walkman Dr.\nSuite #292\n",
+ 'state': 'MI'
+ },
+ 'family': 'Dumars'
+ },
+ 'invoice': '34843',
+ 'date': '2001-01-23',
+ 'tax': '251.42',
+ 'product': [
+ {
+ 'sku': 'BL394D',
+ 'quantity': '4',
+ 'price': '450.00',
+ 'description': 'Basketball'
+ },
+ {
+ 'sku': 'BL4438H',
+ 'quantity': '1',
+ 'price': '2392.00',
+ 'description': 'Super Hoop'
+ }
+ ],
+ 'comments': "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338\n",
+ 'total': '4443.52'
+}
+
+buf1 = []
+buf2 = []
+buf3 = ""
+
+destination = [
+ {
+ "name": 'Array reference',
+ "destination": buf1,
+ "normalise": (lambda x: 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):
+ @TODO
+ def test_output(self):
+ for dest in destination:
+ name = dest['name']
+ yaml = yamlish.Writer()
+ self.assert_(True, "%s: Created" % name)
+ self.assert_(isinstance(yaml, yamlish.Writer))
+
+ yaml.write(IN, dest[destination])
+ got = dest['normalise']()
+
+ self.assertEqual(got, OUT, """%s: Result matches
+ expected = %s
+
+ observed = %s
+ """ % (name, OUT, got))
diff --git a/test/test_reader.py b/test/test_reader.py
new file mode 100644
index 0000000..61a5ca8
--- /dev/null
+++ b/test/test_reader.py
@@ -0,0 +1,417 @@
+# -*- coding: utf-8 -*-
+from __future__ import absolute_import, print_function, unicode_literals
+import unittest
+import yamlish
+
+my @SCHEDULE;
+
+BEGIN {
+ @SCHEDULE = (
+ {
+ name= > 'Hello World',
+ in= > [ '--- Hello, World', '...', ],
+ out= > "Hello, World",
+ },
+ {
+ name= > 'Hello World 2',
+ in= > [ '--- \'Hello, \'\'World\'', '...', ],
+ out= > "Hello, 'World",
+ },
+ {
+ name= > 'Hello World 3',
+ in= > [ '--- "Hello, World"', '...', ],
+ out= > "Hello, World",
+ },
+ {
+ name= > 'Hello World 4',
+ in= > [ '--- "Hello, World"', '...', ],
+ out= > "Hello, World",
+ },
+ {
+ name= > 'Hello World 4',
+ in= > [ '--- >', ' Hello,', ' World', '...', ],
+ out= > "Hello, World\n",
+ },
+ {
+ name= > 'Hello World 5',
+ in= > [ '--- >', ' Hello,', ' World', '...', ],
+ error= > qr{Missing\s + '[.][.][.]'},
+ },
+ {
+ name= > 'Simple array',
+ in= > [ '---', '- 1', '- 2', '- 3', '...', ],
+ out= > [ '1', '2', '3' ],
+ },
+ {
+ name= > 'Mixed array',
+ in= > [ '---', '- 1', '- \'two\'', '- "three\n"', '...', ],
+ out= > [ '1', 'two', "three\n" ],
+ },
+ {
+ name= > 'Hash in array',
+ in= > [ '---', '- 1', '- two: 2', '- 3', '...', ],
+ out= > [ '1', { two= > '2' }, '3' ],
+ },
+ {
+ name= > 'Hash in array 2',
+ in= > [ '---', '- 1', '- two: 2', ' three: 3', '- 4', '...', ],
+ out= > [ '1', { two= > '2', three= > '3' }, '4' ],
+ },
+ {
+ name= > 'Nested array',
+ in= > [
+ '---',
+ '- one',
+ '-',
+ ' - two',
+ ' -',
+ ' - three',
+ ' - four',
+ '- five',
+ '...',
+ ],
+ out= > [ 'one', [ 'two', ['three'], 'four' ], 'five' ],
+ },
+ {
+ name= > 'Nested hash',
+ in= > [
+ '---',
+ 'one:',
+ ' five: 5',
+ ' two:',
+ ' four: 4',
+ ' three: 3',
+ 'six: 6',
+ '...',
+ ],
+ out= > {
+ one= > { two= > { three= > '3', four= > '4' }, five= > '5' },
+ six= > '6'
+ },
+ },
+
+ {
+ name= > 'Original YAML::Tiny test',
+ in= > [
+ '---',
+ 'invoice: 34843',
+ 'date : 2001-01-23',
+ 'bill-to:',
+ ' given : Chris',
+ ' family : Dumars',
+ ' address:',
+ ' lines: |',
+ ' 458 Walkman Dr.',
+ ' Suite #292',
+ ' city : Royal Oak',
+ ' state : MI',
+ ' postal : 48046',
+ 'product:',
+ ' - sku : BL394D',
+ ' quantity : 4',
+ ' description : Basketball',
+ ' price : 450.00',
+ ' - sku : BL4438H',
+ ' quantity : 1',
+ ' description : Super Hoop',
+ ' price : 2392.00',
+ 'tax : 251.42',
+ 'total: 4443.52',
+ 'comments: >',
+ ' Late afternoon is best.',
+ ' Backup contact is Nancy',
+ ' Billsmer @ 338-4338',
+ '...',
+ ],
+ out= > {
+ 'bill-to'= > {
+ 'given'= > 'Chris',
+ 'address'= > {
+ 'city'= > 'Royal Oak',
+ 'postal'= > '48046',
+ 'lines'= > "458 Walkman Dr.\nSuite #292\n",
+ 'state'= > 'MI'
+ },
+ 'family'= > 'Dumars'
+ },
+ 'invoice'= > '34843',
+ 'date'= > '2001-01-23',
+ 'tax'= > '251.42',
+ 'product'= > [
+ {
+ 'sku'= > 'BL394D',
+ 'quantity'= > '4',
+ 'price'= > '450.00',
+ 'description'= > 'Basketball'
+ },
+ {
+ 'sku'= > 'BL4438H',
+ 'quantity'= > '1',
+ 'price'= > '2392.00',
+ 'description'= > 'Super Hoop'
+ }
+ ],
+ 'comments'= >
+ "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338\n",
+ 'total'= > '4443.52'
+ }
+ },
+
+ # Tests harvested from YAML::Tiny
+ {
+ in= > ['...'],
+ name= > 'Regression: empty',
+ error= > qr{document\s + header\s + not\s + found}
+ },
+ {
+ in= > [ '# comment', '...' ],
+ name= > 'Regression: only_comment',
+ error= > qr{document\s + header\s + not\s + found}
+ },
+ {
+ out= > undef,
+ in= > [ '---', '...' ],
+ name= > 'Regression: only_header',
+ error= > qr{Premature\s + end}i,
+ },
+ {
+ out= > undef,
+ in= > [ '---', '---', '...' ],
+ name= > 'Regression: two_header',
+ error= > qr{Unexpected\s + start}i,
+ },
+ {
+ out= > undef,
+ in= > [ '--- ~', '...' ],
+ name= > 'Regression: one_undef'
+ },
+ {
+ out= > undef,
+ in= > [ '--- ~', '...' ],
+ name= > 'Regression: one_undef2'
+ },
+ {
+ in= > [ '--- ~', '---', '...' ],
+ name= > 'Regression: two_undef',
+ error= > qr{Missing\s + '[.][.][.]'},
+ },
+ {
+ out= > 'foo',
+ in= > [ '--- foo', '...' ],
+ name= > 'Regression: one_scalar',
+ },
+ {
+ out= > 'foo',
+ in= > [ '--- foo', '...' ],
+ name= > 'Regression: one_scalar2',
+ },
+ {
+ in= > [ '--- foo', '--- bar', '...' ],
+ name= > 'Regression: two_scalar',
+ error= > qr{Missing\s + '[.][.][.]'},
+ },
+ {
+ out= > ['foo'],
+ in= > [ '---', '- foo', '...' ],
+ name= > 'Regression: one_list1'
+ },
+ {
+ out= > [ 'foo', 'bar' ],
+ in= > [ '---', '- foo', '- bar', '...' ],
+ name= > 'Regression: one_list2'
+ },
+ {
+ out= > [ undef, 'bar' ],
+ in= > [ '---', '- ~', '- bar', '...' ],
+ name= > 'Regression: one_listundef'
+ },
+ {
+ out= > { 'foo'= > 'bar' },
+ in= > [ '---', 'foo: bar', '...' ],
+ name= > 'Regression: one_hash1'
+ },
+ {
+ out= > {
+ 'foo'= > 'bar',
+ 'this'= > undef
+ },
+ in= > [ '---', 'foo: bar', 'this: ~', '...' ],
+ name= > 'Regression: one_hash2'
+ },
+ {
+ out= > { 'foo'= > [ 'bar', undef, 'baz' ] },
+ in= > [ '---', 'foo:', ' - bar', ' - ~', ' - baz', '...' ],
+ name= > 'Regression: array_in_hash'
+ },
+ {
+ out= > {
+ 'bar'= > { 'foo'= > 'bar' },
+ 'foo'= > undef
+ },
+ in= > [ '---', 'foo: ~', 'bar:', ' foo: bar', '...' ],
+ name= > 'Regression: hash_in_hash'
+ },
+ {
+ out= > [
+ {
+ 'foo'= > undef,
+ 'this'= > 'that'
+ },
+ 'foo', undef,
+ {
+ 'foo'= > 'bar',
+ 'this'= > 'that'
+ }
+ ],
+ in= > [
+ '---',
+ '-',
+ ' foo: ~',
+ ' this: that',
+ '- foo',
+ '- ~',
+ '-',
+ ' foo: bar',
+ ' this: that',
+ '...'
+ ],
+ name= > 'Regression: hash_in_array'
+ },
+ {
+ out= > ['foo'],
+ in= > [ '---', '- \'foo\'', '...' ],
+ name= > 'Regression: single_quote1'
+ },
+ {
+ out= > [' '],
+ in= > [ '---', '- \' \'', '...' ],
+ name= > 'Regression: single_spaces'
+ },
+ {
+ out= > [''],
+ in= > [ '---', '- \'\'', '...' ],
+ name= > 'Regression: single_null'
+ },
+ {
+ out= > ' ',
+ in= > [ '--- " "', '...' ],
+ name= > 'Regression: only_spaces'
+ },
+ {
+ out= > [
+ undef,
+ {
+ 'foo'= > 'bar',
+ 'this'= > 'that'
+ },
+ 'baz'
+ ],
+ in= >
+ [ '---', '- ~', '- foo: bar', ' this: that', '- baz', '...' ],
+ name= > 'Regression: inline_nested_hash'
+ },
+ {
+ name= > "Unprintables",
+ in= > [
+ "---",
+ "- \"\\z\\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",
+ "..."
+ ],
+ 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",
+ " !\"#\$%&'()*+,-./",
+ "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"
+ ],
+ },
+ {
+ name= > 'Quoted hash keys',
+ in= > [
+ '---', ' "quoted": Magic!', ' "\n\t": newline, tab', '...',
+ ],
+ out= > {
+ quoted= > 'Magic!',
+ "\n\t"= > 'newline, tab',
+ },
+ },
+ );
+
+ plan tests = > @SCHEDULE * 5;
+}
+
+sub iter {
+ my $ar = shift;
+ return sub {
+ return shift @$ar;
+ };
+}
+
+for my $test (@SCHEDULE) {
+ my $name = $test -> {name};
+ ok my $yaml = Data::YAML::Reader -> new, "$name: Created";
+ isa_ok $yaml, 'Data::YAML::Reader';
+
+ # diag "$name\n";
+
+ # unless ( $test->{in} ) {
+ # pass for 1 .. 2;
+ # use YAML;
+ # diag "Input for test:\n";
+ # diag( Dump( $test->{out} ) );
+ # next;
+ # }
+
+ my $source = join("\n", @{ $test -> {in} }) . "\n";
+
+ my $iter = iter($test -> {in});
+ my $got = eval { $yaml -> read($iter) };
+
+ my $raw = $yaml -> get_raw;
+
+ if (my $err=$test -> {error}) {
+ unless (like $@, $err, "$name: Error message") {
+ diag "Error: $@\n";
+ }
+ ok ! $got, "$name: No result";
+ pass;
+ }
+ else {
+ my $want = $test -> {out};
+ unless (ok ! $@, "$name: No error") {
+ diag "Error: $@\n";
+ }
+ unless (is_deeply $got, $want, "$name: Result matches") {
+ local $Data::Dumper::Useqq = $Data::Dumper::Useqq = 1;
+ diag(Data::Dumper -> Dump([$got], ['$got']));
+ diag(Data::Dumper -> Dump([$want], ['$expected']));
+ }
+ is $raw, $source, "$name: Captured source matches";
+ }
+}
diff --git a/test/test_writer.py b/test/test_writer.py
new file mode 100644
index 0000000..508543f
--- /dev/null
+++ b/test/test_writer.py
@@ -0,0 +1,197 @@
+# -*- coding: utf-8 -*-
+from __future__ import absolute_import, print_function, unicode_literals
+
+import unittest
+import yamlish
+
+my @SCHEDULE;
+
+BEGIN {
+ @SCHEDULE = (
+ {
+ name= > 'Simple scalar',
+ in= > 1,
+ out= > [ '--- 1', '...', ],
+ },
+ {
+ name= > 'Undef',
+ in= > undef,
+ out= > [ '--- ~', '...', ],
+ },
+ {
+ name= > 'Unprintable',
+ in= > "\x01\n\t",
+ out= > [ '--- "\x01\n\t"', '...', ],
+ },
+ {
+ name= > 'Simple array',
+ in= > [ 1, 2, 3 ],
+ out= > [ '---', '- 1', '- 2', '- 3', '...', ],
+ },
+ {
+ name= > 'Array, two elements, undef',
+ in= > [ undef, undef ],
+ out= > [ '---', '- ~', '- ~', '...', ],
+ },
+ {
+ name= > 'Nested array',
+ in= > [ 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', '...', ],
+ },
+ {
+ name= > 'Nested hash',
+ in= > {
+ one= > '1',
+ two= > '2',
+ more= > { three= > '3', four= > '4' }
+ },
+ 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', '...', ],
+ },
+ {
+ name= > 'Empty key',
+ in= > { ''= > 'empty' },
+ out= > [ '---', "'': empty", '...', ],
+ },
+ {
+ name= > 'Empty value',
+ in= > { ''= > '' },
+ out= > [ '---', "'': ''", '...', ],
+ },
+ {
+ name= > 'Complex',
+ in= > {
+ 'bill-to'= > {
+ 'given'= > 'Chris',
+ 'address'= > {
+ 'city'= > 'Royal Oak',
+ 'postal'= > '48046',
+ 'lines'= > "458 Walkman Dr.\nSuite #292\n",
+ 'state'= > 'MI'
+ },
+ 'family'= > 'Dumars'
+ },
+ 'invoice'= > '34843',
+ 'date'= > '2001-01-23',
+ 'tax'= > '251.42',
+ 'product'= > [
+ {
+ 'sku'= > 'BL394D',
+ 'quantity'= > '4',
+ 'price'= > '450.00',
+ 'description'= > 'Basketball'
+ },
+ {
+ 'sku'= > 'BL4438H',
+ 'quantity'= > '1',
+ 'price'= > '2392.00',
+ 'description'= > 'Super Hoop'
+ }
+ ],
+ 'comments'= >
+ "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338\n",
+ '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",
+ "...",
+ ],
+ },
+ );
+
+ plan tests = > @SCHEDULE * 5;
+}
+
+sub iter {
+ my $ar = shift;
+ return sub {
+ return shift @$ar;
+ };
+}
+
+for my $test (@SCHEDULE) {
+ my $name = $test -> {name};
+ ok my $yaml = Data::YAML::Writer -> new, "$name: Created";
+ isa_ok $yaml, 'Data::YAML::Writer';
+
+ my $got = [];
+ my $writer = sub { push @$got, shift };
+
+ my $data = $test -> {in};
+
+ eval { $yaml -> write($data, $writer) };
+
+ if (my $err=$test -> {error}) {
+ unless (like $@, $err, "$name: Error message") {
+ diag "Error: $@\n";
+ }
+ is_deeply $got, [], "$name: No result";
+ pass;
+ }
+ else {
+ my $want = $test -> {out};
+ unless (ok ! $@, "$name: No error") {
+ diag "Error: $@\n";
+ }
+ unless (is_deeply $got, $want, "$name: Result matches") {
+ local $Data::Dumper::Useqq = $Data::Dumper::Useqq = 1;
+ diag(Data::Dumper -> Dump([$got], ['$got']));
+ diag(Data::Dumper -> Dump([$want], ['$expected']));
+ }
+
+ my $yr = Data::YAML::Reader -> new;
+
+ # Now try parsing it
+ my $reader = sub { shift @$got };
+ my $parsed = $yr -> read($reader);
+
+ unless (is_deeply $parsed, $data, "$name: Reparse OK") {
+ local $Data::Dumper::Useqq = $Data::Dumper::Useqq = 1;
+ diag(Data::Dumper -> Dump([$parsed], ['$parsed']));
+ diag(Data::Dumper -> Dump([$data], ['$data']));
+ }
+ }
+}
+
diff --git a/test/writer.py b/test/writer.py
deleted file mode 100644
index 4d70780..0000000
--- a/test/writer.py
+++ /dev/null
@@ -1,200 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-use Test::More;
-use Data::Dumper;
-use Data::YAML::Reader;
-use Data::YAML::Writer;
-
-my @SCHEDULE;
-
-BEGIN {
- @SCHEDULE = (
- {
- name => 'Simple scalar',
- in => 1,
- out => [ '--- 1', '...', ],
- },
- {
- name => 'Undef',
- in => undef,
- out => [ '--- ~', '...', ],
- },
- {
- name => 'Unprintable',
- in => "\x01\n\t",
- out => [ '--- "\x01\n\t"', '...', ],
- },
- {
- name => 'Simple array',
- in => [ 1, 2, 3 ],
- out => [ '---', '- 1', '- 2', '- 3', '...', ],
- },
- {
- name => 'Array, two elements, undef',
- in => [ undef, undef ],
- out => [ '---', '- ~', '- ~', '...', ],
- },
- {
- name => 'Nested array',
- in => [ 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', '...', ],
- },
- {
- name => 'Nested hash',
- in => {
- one => '1',
- two => '2',
- more => { three => '3', four => '4' }
- },
- 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', '...', ],
- },
- {
- name => 'Empty key',
- in => { '' => 'empty' },
- out => [ '---', "'': empty", '...', ],
- },
- {
- name => 'Empty value',
- in => { '' => '' },
- out => [ '---', "'': ''", '...', ],
- },
- {
- name => 'Complex',
- in => {
- 'bill-to' => {
- 'given' => 'Chris',
- 'address' => {
- 'city' => 'Royal Oak',
- 'postal' => '48046',
- 'lines' => "458 Walkman Dr.\nSuite #292\n",
- 'state' => 'MI'
- },
- 'family' => 'Dumars'
- },
- 'invoice' => '34843',
- 'date' => '2001-01-23',
- 'tax' => '251.42',
- 'product' => [
- {
- 'sku' => 'BL394D',
- 'quantity' => '4',
- 'price' => '450.00',
- 'description' => 'Basketball'
- },
- {
- 'sku' => 'BL4438H',
- 'quantity' => '1',
- 'price' => '2392.00',
- 'description' => 'Super Hoop'
- }
- ],
- 'comments' =>
- "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338\n",
- '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",
- "...",
- ],
- },
- );
-
- plan tests => @SCHEDULE * 5;
-}
-
-sub iter {
- my $ar = shift;
- return sub {
- return shift @$ar;
- };
-}
-
-for my $test ( @SCHEDULE ) {
- my $name = $test->{name};
- ok my $yaml = Data::YAML::Writer->new, "$name: Created";
- isa_ok $yaml, 'Data::YAML::Writer';
-
- my $got = [];
- my $writer = sub { push @$got, shift };
-
- my $data = $test->{in};
-
- eval { $yaml->write( $data, $writer ) };
-
- if ( my $err = $test->{error} ) {
- unless ( like $@, $err, "$name: Error message" ) {
- diag "Error: $@\n";
- }
- is_deeply $got, [], "$name: No result";
- pass;
- }
- else {
- my $want = $test->{out};
- unless ( ok !$@, "$name: No error" ) {
- diag "Error: $@\n";
- }
- unless ( is_deeply $got, $want, "$name: Result matches" ) {
- local $Data::Dumper::Useqq = $Data::Dumper::Useqq = 1;
- diag( Data::Dumper->Dump( [$got], ['$got'] ) );
- diag( Data::Dumper->Dump( [$want], ['$expected'] ) );
- }
-
- my $yr = Data::YAML::Reader->new;
-
- # Now try parsing it
- my $reader = sub { shift @$got };
- my $parsed = $yr->read( $reader );
-
- unless ( is_deeply $parsed, $data, "$name: Reparse OK" ) {
- local $Data::Dumper::Useqq = $Data::Dumper::Useqq = 1;
- diag( Data::Dumper->Dump( [$parsed], ['$parsed'] ) );
- diag( Data::Dumper->Dump( [$data], ['$data'] ) );
- }
- }
-}
-