aboutsummaryrefslogtreecommitdiffstats
path: root/test/20-reader.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/20-reader.py')
-rw-r--r--test/20-reader.py419
1 files changed, 419 insertions, 0 deletions
diff --git a/test/20-reader.py b/test/20-reader.py
new file mode 100644
index 0000000..fc6806f
--- /dev/null
+++ b/test/20-reader.py
@@ -0,0 +1,419 @@
+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";
+ }
+}