#-------------------------------------------------------------------
# WebGUI is Copyright 2001-2009 Plain Black Corporation.
#-------------------------------------------------------------------
# Please read the legal notices (docs/legal.txt) and the license
# (docs/license.txt) that came with this distribution before using
# this software.
#-------------------------------------------------------------------
# http://www.plainblack.com                     info@plainblack.com
#-------------------------------------------------------------------


use FindBin;
use strict;
use lib "$FindBin::Bin/lib";
use Tie::IxHash;

use WebGUI::Test;
use WebGUI::Session;

use Test::More tests => 57; # increment this value for each test you create
use Test::Deep;

my $session = WebGUI::Test->session;

# commify
is(WebGUI::Utility::commify(10), "10", 'commify() - no comma needed');
is(WebGUI::Utility::commify(1000), "1,000", 'commify() - single comma');
is(WebGUI::Utility::commify(10000000), "10,000,000", 'commify() - multiple commas');

# formatBytes
is(WebGUI::Utility::formatBytes(10), '10 B', 'formatBytes() - bytes');
is(WebGUI::Utility::formatBytes(4300), '4 kB', 'formatBytes() - kilobytes');
is(WebGUI::Utility::formatBytes(1700000), '2 MB', 'formatBytes() - megabytes');

# isBetween 
ok(WebGUI::Utility::isBetween(0,-1,1), 'isBetween() - negative and positive range'); 
ok(WebGUI::Utility::isBetween(0,1,-1), 'isBetween() - negative and positive range, reversed'); 
ok(WebGUI::Utility::isBetween(11,1,15), 'isBetween() - positive range'); 
ok(WebGUI::Utility::isBetween(-5,-10,-2), 'isBetween() - negative range'); 
ok(!WebGUI::Utility::isBetween(+5,-10,-2), 'isBetween() - not in range on high side'); 
ok(!WebGUI::Utility::isBetween(-15,-10,-2), 'isBetween() - not in range on low side'); 

# isIn
ok(WebGUI::Utility::isIn("webgui", qw(cars trucks webgui trains)), 'isIn()');

# makeArrayCommaSafe
my @commaFilledArray = ("this,that", "foo,bar", "x-y");
WebGUI::Utility::makeArrayCommaSafe(\@commaFilledArray);
my $noCommaFound = 1;
foreach my $row (@commaFilledArray) {
	$noCommaFound = 0 if ($row =~ m/,/);
}
ok($noCommaFound, 'makeArrayCommaSafe()');

# makeCommaSafe
unlike(WebGUI::Utility::makeCommaSafe("this,that,foo,,bar"),  qr/,/, 'makeCommaSafe()');
is(
    WebGUI::Utility::makeCommaSafe("this,that,foo,,bar"),
    'this;that;foo;;bar', 
    'makeCommaSafe()'
);
is(
    WebGUI::Utility::makeCommaSafe("this,that\nfoo\rbar\r\n"),
    'this;that foo bar  ', 
    'makeCommaSafe()'
);

# makeTabSafe
unlike(WebGUI::Utility::makeTabSafe("this\tthat\tfoo\tbar\t"), qr/\t/, 'makeTabSafe()');
is(
    WebGUI::Utility::makeTabSafe("this\tthat\tfoo\tbar\t"),
    "this    that    foo    bar    ", 
    'makeCommaSafe(): clearing tabs'
);
is(
    WebGUI::Utility::makeTabSafe("this\nthat\tfoo\rbar\r\n"),
    "this that    foo bar  ", 
    'makeCommaSafe(): clearing tabs, newlines and carriage returns'
);

# makeArrayTabSafe -- modifies an array in place
my $tabbedArray = ["this\tthat", "these\nthose"];
WebGUI::Utility::makeArrayTabSafe($tabbedArray);
cmp_deeply(
    $tabbedArray,
    ["this    that", "these those"],
    'makeArrayTabSafe'
);

# randint
my $number = WebGUI::Utility::randint(50,75);
ok($number >= 50 && $number <= 75, 'randint()');
$number = WebGUI::Utility::randint();
ok($number >= 0 && $number <= 1, 'randint() with default params');
my $number = WebGUI::Utility::randint(10,5);
ok($number >= 5 && $number <= 10, 'randint() auto reverses params if they are backwards');

# randomizeArray
SKIP: {
	skip("Don't know how to test randomizeArray.",1);
	ok(undef, 'randomizeArray()');
	}

# randomizeHash
SKIP: {
	skip("Don't know how to test randomizeHash.",1);
	ok(undef, 'randomizeHash()');
	}

# round
is(WebGUI::Utility::round(47.133984233, 0), 47, 'round() - 0 significant digits');
is(WebGUI::Utility::round(47.133984233, 3), 47.134, 'round() - multiple significant digits');
is(WebGUI::Utility::round(47.6, 0), 48, 'round() - rounds up, too');

{
	# Just some basic tests for now.

	my (%hash1, %hash2, %hash3);
	my %hash1 = ('a' => 5, 'b' => 3, 'c' => 2, 'd' => 4, 'e' => 1);
	tie my %hash2, 'Tie::IxHash';
	tie my %hash3, 'Tie::IxHash';
	%hash2 = WebGUI::Utility::sortHash(%hash1);
	%hash3 = WebGUI::Utility::sortHashDescending(%hash1);
	is_deeply([keys %hash2], [qw/e c b d a/], 'sortHash');
	is_deeply([keys %hash3], [qw/a d b c e/], 'sortHashDescending');
}

#####################################################################
#
# scalarEquals
#
#####################################################################
{
    my %eq = (
        0 => 0,
        "0" => "0",
        0.1 => 0.1,
        "0.1" => "0.1",
        "0 but true" => "0 but true",
        "string" => "string",
    );
    while (my($a, $b) = each %eq) {
        ok(WebGUI::Utility::scalarEquals($a, $b), "scalarEquals($a, $b) truthy");
    }
    
    my %ne = (
        0 => "0",
        "0.0" => "0",
        "0.1" => "0.10",
        "0" => "0 but true",
        "1" => "0 but true",
        0 => "0 but true",
        1 => "0 but true",
    );
    while (my($a, $b) = each %ne) {
        ok(!WebGUI::Utility::scalarEquals($a, $b), "scalarEquals($a, $b) falsy");
    }
    ok(!WebGUI::Utility::scalarEquals(), "scalarEquals() falsy when no args");
    ok(!WebGUI::Utility::scalarEquals(1), "falsy for 1 arg");
    ok(!WebGUI::Utility::scalarEquals(1, undef, 1), "falsy for 3 args");
}

# isInSubnets
is(WebGUI::Utility::isInSubnet('192.168.0.1', []), 0, 'isInSubnet: comparing against an empty array ref');
is(WebGUI::Utility::isInSubnet('192.168.0.1', ['192.168.0.1/32']), 1, 'isInSubnet: comparing against an exact match');
is(WebGUI::Utility::isInSubnet('192.168.0.2', ['192.168.0.1/32']), 0, 'isInSubnet: comparing against a mismatch');
is(WebGUI::Utility::isInSubnet('192.168.0.2', ['192.168.0.1/30']), 1, 'isInSubnet: comparing against a match with mask');
is(WebGUI::Utility::isInSubnet('256.168.0.2', ['192.168.0.1/30']), 0, 'isInSubnet: ip is out of range');
is(WebGUI::Utility::isInSubnet('192.168.0.1', ['192.168.0.1/33']), undef, 'isInSubnet: mask is out of range');
is(WebGUI::Utility::isInSubnet('192.168.0.1', ['192.168.0.0.1/33']), undef, 'isInSubnet: ip has too many dots');
is(WebGUI::Utility::isInSubnet('192.168.0.1', ['0.0.1/33']), undef, 'isInSubnet: ip has too few dots');
is(WebGUI::Utility::isInSubnet('192.168.0.1', ['192.168.0.1']), undef, 'isInSubnet: ip is missing mask');
is(WebGUI::Utility::isInSubnet('192.168.0.1', ['256.168.0.1/32']), undef, 'isInSubnet: ip has an out of range quad');
is(WebGUI::Utility::isInSubnet('192.168.0.1', ['192.257.0.1/32']), undef, 'isInSubnet: ip has an out of range quad');
is(WebGUI::Utility::isInSubnet('192.168.0.1', ['192.168.258.1/32']), undef, 'isInSubnet: ip has an out of range quad');
is(WebGUI::Utility::isInSubnet('192.168.0.1', ['192.168.0.259/32']), undef, 'isInSubnet: ip has an out of range quad');

#####################################################################
#
# emailRegex
#
#####################################################################

isa_ok(WebGUI::Utility::emailRegex, 'Regexp');

TODO: {
    local $TODO = 'Things to do';
    ok(0, 'Move email validation tests out of Form/Email into here');
}

# Local variables:
# mode: cperl
# End:
