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