The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w

BEGIN { chdir 't' if -d 't' }

use strict;
use Test::More tests => 19;

BEGIN { use_ok( 'Devel::Constants',  'flag_to_names' ) }

use constant ONE	=> 1;
use constant TWO	=> 2;
use constant THREE	=> 4;
use constant FOUR	=> 8;
use constant FIVE	=> 16;

my $val = ONE | TWO | THREE;

my $flagstring = flag_to_names($val);
for (qw( ONE TWO THREE )) {
	ok( $flagstring =~ s/\s?$_\s?//, "$_ flag should be set in string" );
}

my @flaglist = flag_to_names($val);
for my $flag (qw( ONE TWO THREE )) {
	ok( (grep { $_ eq $flag } @flaglist), "$flag flag should be set in list" );
}

is( Devel::Constants::to_name(8), 'FOUR', 'should be able to resolve label ');

my %flags;

# must be done at compile time
Devel::Constants->import(\%flags);

constant->import( A => 1 );
constant->import( B => 2 );
constant->import( C => 3 );

for my $flag (qw( A B C )) {
	my $sub = main->can( $flag);
	ok( $flags{$sub->()}, "$flag exists in passed-in hash");
	is( $flags{$sub->()}, $flag, "$flag has correct value too!" );
}

# now check to see if the custom exporter works
Devel::Constants->import( import => 'bar', to_name => 'label', 'flag_to_names');
diag( 'should import into requested namespace' );
can_ok( 'bar', 'flag_to_names');
can_ok( 'bar', 'label');
diag( 'should export requested name' );

# tell it to capture variables for constants in another package
Devel::Constants->import( package => 'foo', \%foo::fflags);

package foo;

use vars '%fflags';

# must be done at compile time
constant->import( NAME	=> 1 );
constant->import( VALUE	=> 2 );

::is( keys %fflags, 2,     'should capture values in another package' );
::is( $fflags{2}, 'VALUE', '... setting captured value in other package' );

package main;

is( flag_to_names(1, 'foo'), 'NAME', 'should get names for other package' );