1use strict;
2use warnings;
3use Test::More;
4use Path::Dispatcher;
5
6my @calls;
7
8do {
9    package MyApp::Dispatcher::Rule::Language;
10    use Moo;
11    extends 'Path::Dispatcher::Rule::Enum';
12
13    has '+enum' => (
14        default => sub { [qw/ruby perl php python/] },
15    );
16};
17
18my $dispatcher = Path::Dispatcher->new(
19    rules => [
20        Path::Dispatcher::Rule::Sequence->new(
21            rules => [
22                Path::Dispatcher::Rule::Eq->new(string => 'use'),
23                MyApp::Dispatcher::Rule::Language->new,
24            ],
25            block => sub { push @calls, shift->positional_captures },
26        ),
27    ],
28);
29
30$dispatcher->run("use perl");
31is_deeply([splice @calls], [["use", "perl"]]);
32
33$dispatcher->run("use python");
34is_deeply([splice @calls], [["use", "python"]]);
35
36$dispatcher->run("use php");
37is_deeply([splice @calls], [["use", "php"]]);
38
39$dispatcher->run("use ruby");
40is_deeply([splice @calls], [["use", "ruby"]]);
41
42$dispatcher->run("use c++");
43is_deeply([splice @calls], []);
44
45is_deeply([$dispatcher->complete("u")], ["use"]);
46is_deeply([$dispatcher->complete("use")], ["use ruby", "use perl", "use php", "use python"]);
47is_deeply([$dispatcher->complete("use ")], ["use ruby", "use perl", "use php", "use python"]);
48is_deeply([$dispatcher->complete("use r")], ["use ruby"]);
49is_deeply([$dispatcher->complete("use p")], ["use perl", "use php", "use python"]);
50is_deeply([$dispatcher->complete("use pe")], ["use perl"]);
51is_deeply([$dispatcher->complete("use ph")], ["use php"]);
52is_deeply([$dispatcher->complete("use py")], ["use python"]);
53is_deeply([$dispatcher->complete("use px")], []);
54is_deeply([$dispatcher->complete("use x")], []);
55
56
57$dispatcher = Path::Dispatcher->new(
58    rules => [
59        Path::Dispatcher::Rule::Sequence->new(
60            rules => [
61                Path::Dispatcher::Rule::Eq->new(string => 'use'),
62                MyApp::Dispatcher::Rule::Language->new,
63                Path::Dispatcher::Rule::Eq->new(string => 'please'),
64            ],
65            block => sub { push @calls, shift->positional_captures },
66        ),
67    ],
68);
69
70$dispatcher->run("use perl");
71is_deeply([splice @calls], []);
72
73$dispatcher->run("use perl please");
74is_deeply([splice @calls], [["use", "perl", "please"]]);
75
76$dispatcher->run("use python");
77is_deeply([splice @calls], []);
78
79$dispatcher->run("use python please");
80is_deeply([splice @calls], [["use", "python", "please"]]);
81
82$dispatcher->run("use php");
83is_deeply([splice @calls], []);
84
85$dispatcher->run("use php please");
86is_deeply([splice @calls], [["use", "php", "please"]]);
87
88$dispatcher->run("use ruby");
89is_deeply([splice @calls], []);
90
91$dispatcher->run("use ruby please");
92is_deeply([splice @calls], [["use", "ruby", "please"]]);
93
94$dispatcher->run("use c++");
95is_deeply([splice @calls], []);
96
97$dispatcher->run("use c++ please");
98is_deeply([splice @calls], []);
99
100is_deeply([$dispatcher->complete("u")], ["use"]);
101is_deeply([$dispatcher->complete("use")], ["use ruby", "use perl", "use php", "use python"]);
102is_deeply([$dispatcher->complete("use ")], ["use ruby", "use perl", "use php", "use python"]);
103is_deeply([$dispatcher->complete("use r")], ["use ruby"]);
104is_deeply([$dispatcher->complete("use p")], ["use perl", "use php", "use python"]);
105is_deeply([$dispatcher->complete("use pe")], ["use perl"]);
106is_deeply([$dispatcher->complete("use ph")], ["use php"]);
107is_deeply([$dispatcher->complete("use py")], ["use python"]);
108is_deeply([$dispatcher->complete("use px")], []);
109is_deeply([$dispatcher->complete("use x")], []);
110
111is_deeply([$dispatcher->complete("use ruby")], ["use ruby please"]);
112is_deeply([$dispatcher->complete("use ruby ")], ["use ruby please"]);
113is_deeply([$dispatcher->complete("use ruby pl")], ["use ruby please"]);
114is_deeply([$dispatcher->complete("use ruby pleas")], ["use ruby please"]);
115is_deeply([$dispatcher->complete("use ruby please")], []);
116is_deeply([$dispatcher->complete("use ruby plx")], []);
117
118is_deeply([$dispatcher->complete("use perl")], ["use perl please"]);
119is_deeply([$dispatcher->complete("use perl ")], ["use perl please"]);
120is_deeply([$dispatcher->complete("use perl pl")], ["use perl please"]);
121is_deeply([$dispatcher->complete("use perl pleas")], ["use perl please"]);
122is_deeply([$dispatcher->complete("use perl please")], []);
123is_deeply([$dispatcher->complete("use perl plx")], []);
124
125done_testing;
126