The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Module::New::Test::Queue::Basic;

use strict;
use warnings;
use Test::Classy::Base;
use Module::New::Queue;

sub items_in_queue_are {
  my ($class, $expected) = @_;

  my $number_in_queue = scalar Module::New::Queue->queue;
  ok $number_in_queue == $expected,
     $class->message("$number_in_queue items are queued");
}

sub joined_string_is {
  my ($class, $expected) = @_;

  my $string = join ', ', map { $_->() } Module::New::Queue->queue;
  ok $string eq $expected,
     $class->message("and the order is right: $string");
}

sub basic : Tests(2) {
  my $class = shift;

  Module::New::Queue->clear;
  Module::New::Queue->register(sub { "first" });
  Module::New::Queue->register(sub { "second" });
  Module::New::Queue->register(sub { "third" });

  $class->items_in_queue_are(3);
  $class->joined_string_is('first, second, third');
}

sub localized : Tests(4) {
  my $class = shift;

  Module::New::Queue->clear;
  Module::New::Queue->register(sub { "first" });
  Module::New::Queue->register(sub { "second" });
  Module::New::Queue->localize(sub {
    Module::New::Queue->register(sub { "local first" });
    Module::New::Queue->register(sub { "local second" });

    $class->items_in_queue_are(2);
    $class->joined_string_is('local first, local second');
  });
  Module::New::Queue->register(sub { "third" });

  $class->items_in_queue_are(3);
  $class->joined_string_is('first, second, third');
}

1;