]> git.vpit.fr Git - perl/modules/LaTeX-TikZ.git/blob - t/21-layer.t
Flatten scopes at creation time
[perl/modules/LaTeX-TikZ.git] / t / 21-layer.t
1 #!perl -T
2
3 use strict;
4 use warnings;
5
6 use Test::More tests => 9 + 3 * 10;
7
8 use LaTeX::TikZ;
9
10 use lib 't/lib';
11 use LaTeX::TikZ::TestHelper;
12
13 using Tikz->formatter(
14  format => '%d',
15 );
16
17 sub check_layers {
18  my ($set, $desc, $exp, $layers) = @_;
19
20  local $Test::Builder::Level = $Test::Builder::Level + 1;
21
22  my ($head, $decl, $body) = check($set, $desc, $exp);
23
24  my $exp_decl = [
25   map("\\pgfdeclarelayer{$_}", @$layers),
26   "\\pgfsetlayers{main,@{[join ',', @$layers]}}",
27  ];
28
29  is_deeply $decl, $exp_decl, "$desc: declarations";
30 }
31
32 my $middle = eval {
33  Tikz->layer('middle');
34 };
35 is $@, '', 'creating a layer doesn\'t croak';
36
37 my $top = eval {
38  Tikz->layer(
39   'top',
40   above => [ 'middle' ],
41  );
42 };
43 is $@, '', 'creating a layer above another doesn\'t croak';
44
45 my $bottom = eval {
46  Tikz->layer(
47   'bottom',
48   above => [ 'main' ],
49   below => [ 'middle' ],
50  );
51 };
52 is $@, '', 'creating a layer above and below anothers doesn\'t croak';
53
54 my $foo = eval {
55  Tikz->raw('foo')
56      ->mod($middle)
57 };
58 is $@, '', 'creating a layered raw set doesn\'t croak';
59
60 check_layers $foo, 'one layered raw set', <<'RES', [ 'middle' ];
61 \begin{pgfonlayer}{middle}
62 \draw foo ;
63 \end{pgfonlayer}
64 RES
65
66 my $bar = eval {
67  Tikz->raw('bar')
68      ->mod($top)
69 };
70 is $@, '', 'creating another layered raw set doesn\'t croak';
71
72 my $seq = Tikz->seq($foo, $bar);
73
74 check_layers $seq, 'a sequence of two layered raw sets',
75              <<'RES', [ qw<middle top> ];
76 \begin{pgfonlayer}{middle}
77 \draw foo ;
78 \end{pgfonlayer}
79 \begin{pgfonlayer}{top}
80 \draw bar ;
81 \end{pgfonlayer}
82 RES
83
84 sub failed_valid {
85  my ($tc) = @_;
86  qr/Validation failed for '\Q$tc\E'/;
87 }
88
89 eval {
90  $seq->layer(sub { });
91 };
92 like $@, failed_valid('Str'), 'directly adding a wrong layer croaks';
93
94 eval {
95  $seq->layer($bottom);
96 };
97 is $@, '', 'directly adding a layer to a sequence doesn\'t croak';
98
99 my $res = eval {
100  $seq->layer;
101 };
102 is $@,     '',     'calling an empty ->layer onto a sequence doesn\'t croak';
103 is "$res", "$seq", 'empty ->layer returns the object itself';
104
105 check_layers $seq, 'a layered sequence', <<'RES', [ qw<bottom middle top> ];
106 \begin{pgfonlayer}{bottom}
107 \begin{pgfonlayer}{middle}
108 \draw foo ;
109 \end{pgfonlayer}
110 \begin{pgfonlayer}{top}
111 \draw bar ;
112 \end{pgfonlayer}
113 \end{pgfonlayer}
114 RES
115
116 my $baz = Tikz->raw('baz');
117 $seq->add($baz);
118
119 my $red = Tikz->color('red');
120 $seq->mod($red);
121
122 check_layers $seq, 'mods folding with layers 1',
123              <<'RES', [ qw<bottom middle top> ];
124 \begin{pgfonlayer}{bottom}
125 \begin{scope} [color=red]
126 \begin{pgfonlayer}{middle}
127 \draw [color=red] foo ;
128 \end{pgfonlayer}
129 \begin{pgfonlayer}{top}
130 \draw [color=red] bar ;
131 \end{pgfonlayer}
132 \draw baz ;
133 \end{scope}
134 \end{pgfonlayer}
135 RES
136
137 $baz->mod($top);
138
139 check_layers $seq, 'mods folding with layers 2',
140              <<'RES', [ qw<bottom middle top> ];
141 \begin{pgfonlayer}{bottom}
142 \begin{scope} [color=red]
143 \begin{pgfonlayer}{middle}
144 \draw [color=red] foo ;
145 \end{pgfonlayer}
146 \begin{pgfonlayer}{top}
147 \draw [color=red] bar ;
148 \end{pgfonlayer}
149 \begin{pgfonlayer}{top}
150 \draw [color=red] baz ;
151 \end{pgfonlayer}
152 \end{scope}
153 \end{pgfonlayer}
154 RES
155
156 my $seq2 = Tikz->seq($bar, $baz, $foo)
157                ->mod($red);
158
159 check_layers $seq2, 'mods folding with layers 3', <<'RES', [ qw<middle top> ];
160 \begin{scope} [color=red]
161 \begin{pgfonlayer}{top}
162 \begin{scope} [color=red]
163 \draw bar ;
164 \draw baz ;
165 \end{scope}
166 \end{pgfonlayer}
167 \begin{pgfonlayer}{middle}
168 \draw [color=red] foo ;
169 \end{pgfonlayer}
170 \end{scope}
171 RES
172
173 my $qux = Tikz->raw('qux');
174 $seq2 = Tikz->seq($qux, $foo)
175             ->mod($red);
176
177 check_layers $seq2, 'mods folding with layers 4', <<'RES', [ 'middle' ];
178 \begin{scope} [color=red]
179 \draw qux ;
180 \begin{pgfonlayer}{middle}
181 \draw [color=red] foo ;
182 \end{pgfonlayer}
183 \end{scope}
184 RES
185
186 my $seq3 = Tikz->seq($seq2, $bar)
187                ->mod($red);
188
189 check_layers $seq3, 'mods folding with layers 5', <<'RES', [ qw<middle top> ];
190 \begin{scope} [color=red]
191 \draw qux ;
192 \begin{pgfonlayer}{middle}
193 \draw [color=red] foo ;
194 \end{pgfonlayer}
195 \begin{pgfonlayer}{top}
196 \draw [color=red] bar ;
197 \end{pgfonlayer}
198 \end{scope}
199 RES
200
201 $seq3 = Tikz->seq($bar, $seq2)
202             ->mod($red);
203
204 check_layers $seq3, 'mods folding with layers 6', <<'RES', [ qw<middle top> ];
205 \begin{scope} [color=red]
206 \begin{pgfonlayer}{top}
207 \draw [color=red] bar ;
208 \end{pgfonlayer}
209 \draw qux ;
210 \begin{pgfonlayer}{middle}
211 \draw [color=red] foo ;
212 \end{pgfonlayer}
213 \end{scope}
214 RES
215
216 my $blue = Tikz->color('blue');
217 $qux->mod($blue);
218
219 check_layers $seq2, 'mods folding with layers 7', <<'RES', [ 'middle' ];
220 \begin{scope} [color=red]
221 \draw [color=blue] qux ;
222 \begin{pgfonlayer}{middle}
223 \draw [color=red] foo ;
224 \end{pgfonlayer}
225 \end{scope}
226 RES