HEX
Server: Apache
System: Linux server-634962.emtiyz.com 5.14.0-611.11.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Dec 3 09:47:37 EST 2025 x86_64
User: codo66ho (1003)
PHP: 8.2.30
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //home/.cpan/build/Path-Tiny-0.146-0/t/size.t
use 5.008001;
use strict;
use warnings;
use Test::More 0.96;

use lib 't/lib';
use TestUtils qw/exception tempd/;

use Path::Tiny;

subtest "size API tests" => sub {
    my $wd   = tempd();
    my $path = path("1025");
    $path->spew( "A" x 1025 );
    is( $path->size,       -s $path, "size() is -s" );
    is( $path->size_human, "1.1 K",  "size_human() is 1.1 K" );
};

subtest "size_human format" => sub {
    my $wd    = tempd();
    my $base2 = path("1024");
    $base2->spew( "A" x 1024 );
    my $base10 = path("1000");
    $base10->spew( "A" x 1000 );

    is( $base2->size_human,                        "1.0 K",   "default" );
    is( $base2->size_human( { format => "ls" } ),  "1.0 K",   "explicit ls" );
    is( $base2->size_human( { format => "iec" } ), "1.0 KiB", "iec" );
    is( $base10->size_human( { format => "si" } ), "1.0 kB",  "si" );

    is( path("doesnotexist")->size_human, "", "missing file" );

    like(
        exception { $base2->size_human( { format => "fake" } ) },
        qr/Invalid format 'fake'/,
        "bad format exception"
    );

};

# The rest of the tests use the private function for size conversion
# rather than actually creating files of each size. Test cases were
# derived from actual `ls -lh` output on Ubuntu 20.04.

my $kib      = 1024;
my %ls_tests = (
    0                       => "0",
    $kib - 1                => "1023",
    $kib                    => "1.0 K",
    $kib + 1                => "1.1 K",
    int( 1.1 * $kib )       => "1.1 K",
    int( 1.1 * $kib ) + 1   => "1.2 K",
    int( 1.9 * $kib )       => "1.9 K",
    int( 1.9 * $kib ) + 1   => "2.0 K",
    9 * $kib                => "9.0 K",
    9 * $kib + 1            => "9.1 K",
    int( 9.9 * $kib )       => "9.9 K",
    int( 9.9 * $kib ) + 1   => "10 K",
    10 * $kib               => "10 K",
    10 * $kib + 1           => "11 K",
    ( $kib - 1 ) * $kib     => "1023 K",
    ( $kib - 1 ) * $kib + 1 => "1.0 M",

    $kib**2 - 1                => "1.0 M",
    $kib**2                    => "1.0 M",
    $kib**2 + 1                => "1.1 M",
    int( 1.1 * $kib**2 )       => "1.1 M",
    int( 1.1 * $kib**2 ) + 1   => "1.2 M",
    int( 1.9 * $kib**2 )       => "1.9 M",
    int( 1.9 * $kib**2 ) + 1   => "2.0 M",
    9 * $kib**2                => "9.0 M",
    9 * $kib**2 + 1            => "9.1 M",
    int( 9.9 * $kib**2 )       => "9.9 M",
    int( 9.9 * $kib**2 ) + 1   => "10 M",
    10 * $kib**2               => "10 M",
    10 * $kib**2 + 1           => "11 M",
    ( $kib - 1 ) * $kib**2     => "1023 M",
    ( $kib - 1 ) * $kib**2 + 1 => "1.0 G",
);

subtest "ls format" => sub {
    for my $k ( sort { $a <=> $b } keys %ls_tests ) {
        my $opts = Path::Tiny::_formats("ls");
        my $got  = Path::Tiny::_human_size( $k, @$opts );
        is( $got, $ls_tests{$k}, "ls: $k" );
    }
};

subtest "iec format" => sub {
    for my $k ( sort { $a <=> $b } keys %ls_tests ) {
        my $opts = Path::Tiny::_formats("iec");
        my $got  = Path::Tiny::_human_size( $k, @$opts );
        my $want = $ls_tests{$k};
        $want .= "iB" if $want =~ /[a-z]/i;
        is( $got, $want, "iec: $k" );
    }
};

my $kb       = 1000;
my %si_tests = (
    0                     => "0",
    $kb - 1               => "999",
    $kb                   => "1.0 kB",
    $kb + 1               => "1.1 kB",
    int( 1.1 * $kb )      => "1.1 kB",
    int( 1.1 * $kb ) + 1  => "1.2 kB",
    int( 1.9 * $kb )      => "1.9 kB",
    int( 1.9 * $kb ) + 1  => "2.0 kB",
    9 * $kb               => "9.0 kB",
    9 * $kb + 1           => "9.1 kB",
    int( 9.9 * $kb )      => "9.9 kB",
    int( 9.9 * $kb ) + 1  => "10 kB",
    10 * $kb              => "10 kB",
    10 * $kb + 1          => "11 kB",
    ( $kb - 1 ) * $kb     => "999 kB",
    ( $kb - 1 ) * $kb + 1 => "1.0 MB",

    $kb**2 - 1               => "1.0 MB",
    $kb**2                   => "1.0 MB",
    $kb**2 + 1               => "1.1 MB",
    int( 1.1 * $kb**2 )      => "1.1 MB",
    int( 1.1 * $kb**2 ) + 1  => "1.2 MB",
    int( 1.9 * $kb**2 )      => "1.9 MB",
    int( 1.9 * $kb**2 ) + 1  => "2.0 MB",
    9 * $kb**2               => "9.0 MB",
    9 * $kb**2 + 1           => "9.1 MB",
    int( 9.9 * $kb**2 )      => "9.9 MB",
    int( 9.9 * $kb**2 ) + 1  => "10 MB",
    10 * $kb**2              => "10 MB",
    10 * $kb**2 + 1          => "11 MB",
    ( $kb - 1 ) * $kb**2     => "999 MB",
    ( $kb - 1 ) * $kb**2 + 1 => "1.0 GB",
);

subtest "si format" => sub {
    for my $k ( sort { $a <=> $b } keys %si_tests ) {
        my $opts = Path::Tiny::_formats("si");
        my $got  = Path::Tiny::_human_size( $k, @$opts );
        is( $got, $si_tests{$k}, "si: $k" );
    }
};

done_testing;
#
# This file is part of Path-Tiny
#
# This software is Copyright (c) 2014 by David Golden.
#
# This is free software, licensed under:
#
#   The Apache License, Version 2.0, January 2004
#