use strict;
use warnings qw(all);
use 5.022;

use Test::More tests => 3;
use Test::Warn;

use Config::Structured;

use experimental qw(signatures);

my $conf;
warnings_like {
  $conf = Config::Structured->new(
    structure => {
      core => {
        assets => {
          isa => 'Str'
        },
        logs => {
          isa => 'Str'
        },
        tmp => {
          isa => 'Str'
        },
      },
      auxiliary => {
        assets => {
          isa => 'Str'
        },
        tmp => {
          isa => 'Str'
        }
      }
    },
    config => {
      core => {
        assets => '/data/assets',
        logs   => '/data/logs',
        tmp    => '/data/tmp',
      },
      auxiliary => {
        assets => '/aux/assets',
        tmp    => '/aux/tmp',
      }
    },
    hooks => {
      '/core/*' => {
        on_load => sub ($path, $value) {
          warn("Directory '$value' does not exist at $path (load)");
        },
        on_access => sub ($path, $value) {
          warn("Touched a core dir");
        }
      },
      '/*/tmp' => {
        on_access => sub ($path, $value) {
          warn("Touched a tmp dir");
        }
      }
    }
  );
  $conf->core;
  $conf->auxiliary->assets;
}
[(qr{Directory '/data/\w+' does not exist at /core/\w+ \(load\)}) x 3,], 'on_load wildcard hook runs';

warning_is {$conf->auxiliary->tmp} "Touched a tmp dir", "on_access wildcard hook runs";

warnings_like {$conf->core->tmp} [(qr{Touched a (tmp|core) dir}) x 2], "on_access wildcard hooks run";