Data-TOON

 view release on metacpan or  search on metacpan

t/06_delimiters.t  view on Meta::CPAN

use strict;
use Test::More 0.98;
use Data::TOON;
use Data::Dumper;

# Test 1: Tab delimiter with tabular format
{
    my $tab = "\t";
    my $toon_text = "items[2$tab]{id${tab}name}:\n  1${tab}Alice\n  2${tab}Bob\n";
    
    my $data = Data::TOON->decode($toon_text);
    ok($data, 'decode with tab delimiter');
    is(scalar @{$data->{items}}, 2, 'correct number of items');
    is($data->{items}->[0]->{id}, 1, 'first item id');
    is($data->{items}->[0]->{name}, 'Alice', 'first item name');
    is($data->{items}->[1]->{name}, 'Bob', 'second item name');
}

# Test 2: Pipe delimiter with tabular format
{
    my $toon_text = "items[2|]{id|name}:\n  1|Alice\n  2|Bob\n";
    
    my $data = Data::TOON->decode($toon_text);
    ok($data, 'decode with pipe delimiter');
    is(scalar @{$data->{items}}, 2, 'correct number of items');
    is($data->{items}->[0]->{name}, 'Alice', 'pipe: first item name');
}

# Test 3: Tab delimiter with primitive array
{
    my $toon_text = 'tags[3	]: a	b	c';
    
    my $data = Data::TOON->decode($toon_text);
    ok($data, 'decode tab-delimited primitive array');
    is(scalar @{$data->{tags}}, 3, 'correct number of tags');
    is($data->{tags}->[0], 'a', 'first tag');
}

# Test 4: Pipe delimiter with primitive array
{
    my $toon_text = 'tags[3|]: a|b|c';
    
    my $data = Data::TOON->decode($toon_text);
    ok($data, 'decode pipe-delimited primitive array');
    is(scalar @{$data->{tags}}, 3, 'correct number of tags');
    is($data->{tags}->[1], 'b', 'second tag');
}

# Test 5: Tab delimiter round-trip encode/decode
{
    my $data = {
        records => [
            { field1 => 'value1', field2 => 'value2' },
            { field1 => 'value3', field2 => 'value4' }
        ]
    };
    
    my $encoder = Data::TOON::Encoder->new(delimiter => "\t");
    my $encoded = $encoder->encode($data);
    my $decoded = Data::TOON->decode($encoded);
    
    is_deeply($decoded, $data, 'tab round-trip preserves data');
}

# Test 6: Pipe delimiter round-trip
{
    my $data = {
        records => [
            { field1 => 'value1', field2 => 'value2' },
            { field1 => 'value3', field2 => 'value4' }
        ]
    };
    
    my $encoder = Data::TOON::Encoder->new(delimiter => '|');
    my $encoded = $encoder->encode($data);
    my $decoded = Data::TOON->decode($encoded);
    
    is_deeply($decoded, $data, 'pipe round-trip preserves data');
}

# Test 7: Delimiter with comma in values (should be quoted)
{
    my $data = {
        items => [
            { desc => 'hello,world', id => 1 },
            { desc => 'foo,bar', id => 2 }
        ]
    };
    
    my $encoder = Data::TOON::Encoder->new(delimiter => '|');
    my $encoded = $encoder->encode($data);
    my $decoded = Data::TOON->decode($encoded);
    
    is($decoded->{items}->[0]->{desc}, 'hello,world', 'comma in value with pipe delimiter');
}

done_testing;



( run in 1.084 second using v1.01-cache-2.11-cpan-5837b0d9d2c )