The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -T
use 5.006;
use strict;
use warnings FATAL => 'all';
use Test::More;
use Test::Exception;
use Log::Any::Test;    # should appear before 'use Log::Any'!
use Log::Any qw($log);

use lib 't';
use lib 'integ_t';
require 'iron_io_integ_tests_common.pl';

plan tests => 1;

require IO::Iron::IronCache::Client;
require IO::Iron::IronCache::Item;

#use Log::Any::Adapter ('Stderr'); # Activate to get all log messages.
use Data::Dumper; $Data::Dumper::Maxdepth = 4;

diag("Testing IO::Iron::IronCache::Client with policies, Perl $], $^X");

## Test case
my $project_id;
my $cache_client;
my $unique_cache_name_01;
my $created_iron_cache_01;

my $test_policy = {
  'definition' => {
      'character_set' => 'ascii', # The only supported character set!
      'character_group' => {
          '[:mychars:]' => 'abc',
          '[:mydigits:]' => '23',
      },
  },
  'name' => [
              '[:mychars:]{1,2}[:mydigits:]{1}',
            ],
  'item_key' => [
                  'item_01_[:digit:]{2}',
                  'item_01_[:digit:]{3}',
                  'item_01_[:digit:]{4}',
                  'item_01_[:alpha:]{1,4}'
                ]
};

subtest 'Check for valid cache and key names' => sub {
    plan tests => 3;

    my $cache_name = '';
    my $item_key = '';
    # Create an IronCache client.
    $cache_client = IO::Iron::IronCache::Client->new(
        #'config' => 'iron_cache.json'
        'project_id' => 'dummy_project_id',
    );
    $project_id = $cache_client->{'connection'}->{'project_id'};
    # Use $project_id for log message comparisons.

    # Test
    # Below: internal assignment, suitable only when testing!
    $cache_client->{'policy'} = $test_policy;
    my $expecteds = [sort qw(
            a2 b2 c2 a3 b3 c3
            aa2 ab2 ac2 ba2 bb2 bc2 ca2 cb2 cc2
            aa3 ab3 ac3 ba3 bb3 bc3 ca3 cb3 cc3
             )];
    my $gots = [ sort $cache_client->cache_name_alternatives() ];
    is_deeply($gots, $expecteds, 'Got what expected.');

    # Test
    $cache_client->{'policy'}->{'definition'}->{'character_group'}->
            {'[:daydigit:]'} = '0123';
            # Possible dates 1.,2.,3.,10.,11.,12.,13.,20.,21, ...
    $cache_client->{'policy'}->{'definition'}->{'character_group'}->
            {'[:two_years:]'} = '45';
    $cache_client->{'policy'}->{'name'} = [
              '201[:two_years:]{1}-Jan-[:daydigit:]{2}.[:digit:]{1}',
            ];
    $expecteds = [sort qw(
            2014-Jan-00.0
            2014-Jan-00.1
            2014-Jan-00.2
            2014-Jan-00.3
            2014-Jan-00.4
            2014-Jan-00.5
            2014-Jan-00.6
            2014-Jan-00.7
            2014-Jan-00.8
            2014-Jan-00.9
            2014-Jan-01.0
            2014-Jan-01.1
            2014-Jan-01.2
            2014-Jan-01.3
            2014-Jan-01.4
            2014-Jan-01.5
            2014-Jan-01.6
            2014-Jan-01.7
            2014-Jan-01.8
            2014-Jan-01.9
            2014-Jan-02.0
            2014-Jan-02.1
            2014-Jan-02.2
            2014-Jan-02.3
            2014-Jan-02.4
            2014-Jan-02.5
            2014-Jan-02.6
            2014-Jan-02.7
            2014-Jan-02.8
            2014-Jan-02.9
            2014-Jan-03.0
            2014-Jan-03.1
            2014-Jan-03.2
            2014-Jan-03.3
            2014-Jan-03.4
            2014-Jan-03.5
            2014-Jan-03.6
            2014-Jan-03.7
            2014-Jan-03.8
            2014-Jan-03.9
            2014-Jan-10.0
            2014-Jan-10.1
            2014-Jan-10.2
            2014-Jan-10.3
            2014-Jan-10.4
            2014-Jan-10.5
            2014-Jan-10.6
            2014-Jan-10.7
            2014-Jan-10.8
            2014-Jan-10.9
            2014-Jan-11.0
            2014-Jan-11.1
            2014-Jan-11.2
            2014-Jan-11.3
            2014-Jan-11.4
            2014-Jan-11.5
            2014-Jan-11.6
            2014-Jan-11.7
            2014-Jan-11.8
            2014-Jan-11.9
            2014-Jan-12.0
            2014-Jan-12.1
            2014-Jan-12.2
            2014-Jan-12.3
            2014-Jan-12.4
            2014-Jan-12.5
            2014-Jan-12.6
            2014-Jan-12.7
            2014-Jan-12.8
            2014-Jan-12.9
            2014-Jan-13.0
            2014-Jan-13.1
            2014-Jan-13.2
            2014-Jan-13.3
            2014-Jan-13.4
            2014-Jan-13.5
            2014-Jan-13.6
            2014-Jan-13.7
            2014-Jan-13.8
            2014-Jan-13.9
            2014-Jan-20.0
            2014-Jan-20.1
            2014-Jan-20.2
            2014-Jan-20.3
            2014-Jan-20.4
            2014-Jan-20.5
            2014-Jan-20.6
            2014-Jan-20.7
            2014-Jan-20.8
            2014-Jan-20.9
            2014-Jan-21.0
            2014-Jan-21.1
            2014-Jan-21.2
            2014-Jan-21.3
            2014-Jan-21.4
            2014-Jan-21.5
            2014-Jan-21.6
            2014-Jan-21.7
            2014-Jan-21.8
            2014-Jan-21.9
            2014-Jan-22.0
            2014-Jan-22.1
            2014-Jan-22.2
            2014-Jan-22.3
            2014-Jan-22.4
            2014-Jan-22.5
            2014-Jan-22.6
            2014-Jan-22.7
            2014-Jan-22.8
            2014-Jan-22.9
            2014-Jan-23.0
            2014-Jan-23.1
            2014-Jan-23.2
            2014-Jan-23.3
            2014-Jan-23.4
            2014-Jan-23.5
            2014-Jan-23.6
            2014-Jan-23.7
            2014-Jan-23.8
            2014-Jan-23.9
            2014-Jan-30.0
            2014-Jan-30.1
            2014-Jan-30.2
            2014-Jan-30.3
            2014-Jan-30.4
            2014-Jan-30.5
            2014-Jan-30.6
            2014-Jan-30.7
            2014-Jan-30.8
            2014-Jan-30.9
            2014-Jan-31.0
            2014-Jan-31.1
            2014-Jan-31.2
            2014-Jan-31.3
            2014-Jan-31.4
            2014-Jan-31.5
            2014-Jan-31.6
            2014-Jan-31.7
            2014-Jan-31.8
            2014-Jan-31.9
            2014-Jan-32.0
            2014-Jan-32.1
            2014-Jan-32.2
            2014-Jan-32.3
            2014-Jan-32.4
            2014-Jan-32.5
            2014-Jan-32.6
            2014-Jan-32.7
            2014-Jan-32.8
            2014-Jan-32.9
            2014-Jan-33.0
            2014-Jan-33.1
            2014-Jan-33.2
            2014-Jan-33.3
            2014-Jan-33.4
            2014-Jan-33.5
            2014-Jan-33.6
            2014-Jan-33.7
            2014-Jan-33.8
            2014-Jan-33.9
            2015-Jan-00.0
            2015-Jan-00.1
            2015-Jan-00.2
            2015-Jan-00.3
            2015-Jan-00.4
            2015-Jan-00.5
            2015-Jan-00.6
            2015-Jan-00.7
            2015-Jan-00.8
            2015-Jan-00.9
            2015-Jan-01.0
            2015-Jan-01.1
            2015-Jan-01.2
            2015-Jan-01.3
            2015-Jan-01.4
            2015-Jan-01.5
            2015-Jan-01.6
            2015-Jan-01.7
            2015-Jan-01.8
            2015-Jan-01.9
            2015-Jan-02.0
            2015-Jan-02.1
            2015-Jan-02.2
            2015-Jan-02.3
            2015-Jan-02.4
            2015-Jan-02.5
            2015-Jan-02.6
            2015-Jan-02.7
            2015-Jan-02.8
            2015-Jan-02.9
            2015-Jan-03.0
            2015-Jan-03.1
            2015-Jan-03.2
            2015-Jan-03.3
            2015-Jan-03.4
            2015-Jan-03.5
            2015-Jan-03.6
            2015-Jan-03.7
            2015-Jan-03.8
            2015-Jan-03.9
            2015-Jan-10.0
            2015-Jan-10.1
            2015-Jan-10.2
            2015-Jan-10.3
            2015-Jan-10.4
            2015-Jan-10.5
            2015-Jan-10.6
            2015-Jan-10.7
            2015-Jan-10.8
            2015-Jan-10.9
            2015-Jan-11.0
            2015-Jan-11.1
            2015-Jan-11.2
            2015-Jan-11.3
            2015-Jan-11.4
            2015-Jan-11.5
            2015-Jan-11.6
            2015-Jan-11.7
            2015-Jan-11.8
            2015-Jan-11.9
            2015-Jan-12.0
            2015-Jan-12.1
            2015-Jan-12.2
            2015-Jan-12.3
            2015-Jan-12.4
            2015-Jan-12.5
            2015-Jan-12.6
            2015-Jan-12.7
            2015-Jan-12.8
            2015-Jan-12.9
            2015-Jan-13.0
            2015-Jan-13.1
            2015-Jan-13.2
            2015-Jan-13.3
            2015-Jan-13.4
            2015-Jan-13.5
            2015-Jan-13.6
            2015-Jan-13.7
            2015-Jan-13.8
            2015-Jan-13.9
            2015-Jan-20.0
            2015-Jan-20.1
            2015-Jan-20.2
            2015-Jan-20.3
            2015-Jan-20.4
            2015-Jan-20.5
            2015-Jan-20.6
            2015-Jan-20.7
            2015-Jan-20.8
            2015-Jan-20.9
            2015-Jan-21.0
            2015-Jan-21.1
            2015-Jan-21.2
            2015-Jan-21.3
            2015-Jan-21.4
            2015-Jan-21.5
            2015-Jan-21.6
            2015-Jan-21.7
            2015-Jan-21.8
            2015-Jan-21.9
            2015-Jan-22.0
            2015-Jan-22.1
            2015-Jan-22.2
            2015-Jan-22.3
            2015-Jan-22.4
            2015-Jan-22.5
            2015-Jan-22.6
            2015-Jan-22.7
            2015-Jan-22.8
            2015-Jan-22.9
            2015-Jan-23.0
            2015-Jan-23.1
            2015-Jan-23.2
            2015-Jan-23.3
            2015-Jan-23.4
            2015-Jan-23.5
            2015-Jan-23.6
            2015-Jan-23.7
            2015-Jan-23.8
            2015-Jan-23.9
            2015-Jan-30.0
            2015-Jan-30.1
            2015-Jan-30.2
            2015-Jan-30.3
            2015-Jan-30.4
            2015-Jan-30.5
            2015-Jan-30.6
            2015-Jan-30.7
            2015-Jan-30.8
            2015-Jan-30.9
            2015-Jan-31.0
            2015-Jan-31.1
            2015-Jan-31.2
            2015-Jan-31.3
            2015-Jan-31.4
            2015-Jan-31.5
            2015-Jan-31.6
            2015-Jan-31.7
            2015-Jan-31.8
            2015-Jan-31.9
            2015-Jan-32.0
            2015-Jan-32.1
            2015-Jan-32.2
            2015-Jan-32.3
            2015-Jan-32.4
            2015-Jan-32.5
            2015-Jan-32.6
            2015-Jan-32.7
            2015-Jan-32.8
            2015-Jan-32.9
            2015-Jan-33.0
            2015-Jan-33.1
            2015-Jan-33.2
            2015-Jan-33.3
            2015-Jan-33.4
            2015-Jan-33.5
            2015-Jan-33.6
            2015-Jan-33.7
            2015-Jan-33.8
            2015-Jan-33.9
                 )];
    $gots = [ sort $cache_client->cache_name_alternatives() ];
    is_deeply($gots, $expecteds, 'Got what expected.');
    
    # Test
    $cache_client->{'policy'}->{'name'} = [
              'Cache_[:mychars:]{1}[:mydigits:]{3}',
            ];
    $expecteds = [sort qw(
            Cache_a222
            Cache_a223
            Cache_a232
            Cache_a233
            Cache_a322
            Cache_a323
            Cache_a332
            Cache_a333

            Cache_b222
            Cache_b223
            Cache_b232
            Cache_b233
            Cache_b322
            Cache_b323
            Cache_b332
            Cache_b333

            Cache_c222
            Cache_c223
            Cache_c232
            Cache_c233
            Cache_c322
            Cache_c323
            Cache_c332
            Cache_c333
             )];
    $gots = [ sort $cache_client->cache_name_alternatives() ];
    is_deeply($gots, $expecteds, 'Got what expected.');
};