The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl
use strict;
use File::Path;
use MealMaster;
use Test::More tests => 18;
use_ok("Search::Mousse");
use_ok("Search::Mousse::Writer");
use_ok("Search::Mousse::Writer::Related");

my $directory = "t/tmp";
rmtree($directory);
mkdir($directory) || die $!;

my $mousse = Search::Mousse::Writer->new(
  directory => $directory,
  name      => 'recipes',
);

my $mm = MealMaster->new;
my @recipes = $mm->parse("t/0222-1.TXT");
foreach my $recipe (@recipes) {
  my $title = ucfirst(lc($recipe->title));
  $recipe->title($title);
  my $categories = join ' ', @{ $recipe->categories };
  $mousse->add($recipe->title, $recipe, "$title $categories");
}
$mousse->write;

$mousse = Search::Mousse->new(
  directory => $directory,
  name      => 'recipes',
);

my $related = Search::Mousse::Writer::Related->new(mousse => $mousse);
$related->write;

$mousse = Search::Mousse->new(
  directory => $directory,
  name      => 'recipes',
  and       => 1,
);

my $recipe = $mousse->fetch("Hearty Russian Beet Soup");
ok(!$recipe);

$recipe = $mousse->fetch("Hearty russian beet soup");
is($recipe->title, "Hearty russian beet soup");

my @related = $mousse->fetch_related("Hearty russian beet soup");
is_deeply([sort map { $_->title } @related], [
       'French onion soup coca-cola',
          'Hearty soup mix',
          'Italian minestrone soup coca-cola',
          'Russian beef stroganoff coca-cola',
          'Russian refresher mix',
]);

@related = $mousse->fetch_related_keys("Hearty russian beet soup");
is_deeply([sort @related], [
       'French onion soup coca-cola',
          'Hearty soup mix',
          'Italian minestrone soup coca-cola',
          'Russian beef stroganoff coca-cola',
          'Russian refresher mix',
]);

$recipe = $mousse->fetch("Chiles rellenos casserole");
is($recipe->title, "Chiles rellenos casserole");

@related = $mousse->fetch_related("Chiles rellenos casserole");
is_deeply([sort map { $_->title } @related], [
          'Baked apple zapata',
          'Chinese pepper steak coca-cola',
          'German sauerbraten coca-cola',
          'Grecian green beans coca-cola',
          'Greek stew',
          'Mexican meat mix',
          'Mexican rice mix',
          'Russian beef stroganoff coca-cola',
          'Vegetarian rice mix',
]);

@related = $mousse->fetch_related_keys("Chiles rellenos casserole");
is_deeply([sort @related], [
          'Baked apple zapata',
          'Chinese pepper steak coca-cola',
          'German sauerbraten coca-cola',
          'Grecian green beans coca-cola',
          'Greek stew',
          'Mexican meat mix',
          'Mexican rice mix',
          'Russian beef stroganoff coca-cola',
          'Vegetarian rice mix',
]);

$recipe = $mousse->fetch("Crumb topping mix");
is($recipe->title, "Crumb topping mix");

@related = $mousse->fetch_related("Crumb topping mix");
is_deeply([sort map { $_->title } @related], [
          'Cookie crumb crust mix'
]);

@related = $mousse->fetch_related_keys("Crumb topping mix");
is_deeply([sort @related], [
          'Cookie crumb crust mix'
]);

my @search = $mousse->search("crumb");
is_deeply([sort map { $_->title } @search ], [
  'Cookie crumb crust mix',
  'Crumb topping mix',
]);

@search = $mousse->search("crumb +topping");
is_deeply([sort map { $_->title } @search ], [
  'Crumb topping mix',
]);

@search = $mousse->search("crumb -topping");
is_deeply([sort map { $_->title } @search ], [
  'Cookie crumb crust mix',
]);

@search = $mousse->search_keys("italian");
is_deeply([sort @search ], [
  'Italian cooking sauce mix',
  'Italian meat sauce mix',
  'Italian minestrone soup coca-cola',
]);

@search = $mousse->search_keys("italian sauce");
is_deeply([sort @search], [
  'Italian cooking sauce mix',
  'Italian meat sauce mix',
]);