Mail-Make

 view release on metacpan or  search on metacpan

t/89_mm_table.t  view on Meta::CPAN

    ok( $t, 'make() returns object even with nelts 0' );
    isa_ok( $t, 'MM::Table' );

    $t->set( Foo => 'one' );
    $t->add( Foo => 'two' );

    my $copy = $t->copy( undef );
    ok( $copy, 'copy() returns object' );
    isa_ok( $copy, 'MM::Table' );

    is( $copy->get( 'foo' ), 'one', 'copy keeps data (scalar get oldest)' );
    my @vals = $copy->get( 'foo' );
    is_deeply( \@vals, [ 'one', 'two' ], 'copy keeps data (list get all)' );

    $t->clear();
    is( $t->get( 'foo' ), undef, 'clear removes everything' );
    my @none = $t->get( 'foo' );
    is_deeply( \@none, [], 'clear: list context empty' );
};

# NOTE: set/add/unset/get ordering + case-insensitive keys
subtest 'set/add/unset/get ordering + case-insensitive keys' => sub
{
    my $t = MM::Table->make( undef, 10 );

    $t->set( Foo => 'one' );
    $t->add( foo => 'two' );
    $t->add( FOO => 'three' );

    is( $t->get( 'fOo' ), 'one', 'scalar get returns oldest value' );

    my @vals = $t->get( 'foo' );
    is_deeply( \@vals, [ 'one', 'two', 'three' ], 'list get returns all in insertion order' );

    $t->unset( 'FOO' );
    is( $t->get( 'foo' ), undef, 'unset removes all values for key (case-insensitive)' );
};

# NOTE: merge semantics (first value only) + missing key
subtest 'merge semantics (first value only) + missing key' => sub
{
    my $t = MM::Table->make( undef, 10 );

    $t->set( merge => '1' );
    $t->merge( merge => 'a' );
    is( $t->get( 'merge' ), '1, a', 'merge appends to first value using ", "' );

    $t->clear();
    $t->set( merge => '1' );
    $t->add( merge => '2' );
    $t->merge( merge => 'a' );

    my @vals = $t->get( 'merge' );
    is_deeply( \@vals, [ '1, a', '2' ], 'merge affects only first (oldest) value of multivalued key' );

    $t->clear();
    $t->merge( miss => 'a' );
    is( $t->get( 'miss' ), 'a', 'merge on missing key behaves like add()' );
};

# NOTE: overlay semantics (new table = overlay first, then base)
subtest 'overlay semantics (new table = overlay first, then base)' => sub
{
    my $base = MM::Table->make( undef, 10 );
    my $add  = MM::Table->make( undef, 10 );

    $base->set( bar => 'beer' );
    $base->set( foo => 'one' );
    $base->add( foo => 'two' );

    $add->set( foo => 'three' );

    my $ov = $base->overlay( $add, undef );

    _pairs_eq(
        _dump_table_pairs( $ov ),
        [
            [ 'foo', 'three' ],
            [ 'bar', 'beer' ],
            [ 'foo', 'one' ],
            [ 'foo', 'two'  ],
        ],
        'overlay pair order'
    );

    # Verify originals unmodified
    _pairs_eq(
        _dump_table_pairs( $base ),
        [
            [ 'bar', 'beer' ],
            [ 'foo', 'one'  ],
            [ 'foo', 'two'  ],
        ],
        'base unmodified after overlay'
    );

    _pairs_eq(
        _dump_table_pairs( $add ),
        [
            [ 'foo', 'three' ],
        ],
        'add unmodified after overlay'
    );
};

# NOTE: compress SET (keep last) and MERGE (comma list) with stable order by first occurrence
subtest 'compress SET (keep last) and MERGE (comma list) with stable order by first occurrence' => sub
{
    my $t = MM::Table->make( undef, 10 );

    $t->set( bar => 'beer' );
    $t->set( foo => 'one' );
    $t->add( foo => 'two' );
    $t->add( foo => 'three' );

    my $t_set = $t->copy( undef );
    $t_set->compress( OVERLAP_TABLES_SET );

    _pairs_eq(
        _dump_table_pairs( $t_set ),
        [
            [ 'bar', 'beer'  ],
            [ 'foo', 'three' ],
        ],
        'compress SET result'
    );

    my $t_merge = $t->copy( undef );
    $t_merge->compress( OVERLAP_TABLES_MERGE );

    _pairs_eq(
        _dump_table_pairs( $t_merge ),
        [
            [ 'bar', 'beer'             ],
            [ 'foo', 'one, two, three'  ],
        ],
        'compress MERGE result'
    );
};

# NOTE: overlap SET overwrites key entirely; overlap MERGE merges into first value
subtest 'overlap SET overwrites key entirely; overlap MERGE merges into first value' => sub
{
    my $base = MM::Table->make( undef, 10 );
    my $add  = MM::Table->make( undef, 10 );

    $base->set( bar => 'beer' );
    $base->set( foo => 'one' );
    $base->add( foo => 'two' );
    $add->set( foo => 'three' );

    my $set = $base->copy( undef );
    $set->overlap( $add, OVERLAP_TABLES_SET );

    _pairs_eq(
        _dump_table_pairs( $set ),
        [
            [ 'bar', 'beer'  ],
            [ 'foo', 'three' ],
        ],
        'overlap SET'
    );



( run in 2.186 seconds using v1.01-cache-2.11-cpan-75ffa21a3d4 )