1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "printing/page_setup.h"
6
7#include <stdlib.h>
8#include <time.h>
9
10#include <algorithm>
11
12#include "testing/gtest/include/gtest/gtest.h"
13
14TEST(PageSetupTest, Random) {
15  time_t seed = time(NULL);
16  int kMax = 10;
17  srand(static_cast<unsigned>(seed));
18
19  // Margins.
20  printing::PageMargins margins;
21  margins.header = rand() % kMax;
22  margins.footer = rand() % kMax;
23  margins.left = rand() % kMax;
24  margins.top = rand() % kMax;
25  margins.right = rand() % kMax;
26  margins.bottom = rand() % kMax;
27  int kTextHeight = rand() % kMax;
28
29  // Page description.
30  gfx::Size page_size(100 + rand() % kMax, 200 + rand() % kMax);
31  gfx::Rect printable_area(rand() % kMax, rand() % kMax, 0, 0);
32  printable_area.set_width(page_size.width() - (rand() % kMax) -
33                           printable_area.x());
34  printable_area.set_height(page_size.height() - (rand() % kMax) -
35                            printable_area.y());
36
37  // Make the calculations.
38  printing::PageSetup setup;
39  setup.SetRequestedMargins(margins);
40  setup.Init(page_size, printable_area, kTextHeight);
41
42  // Calculate the effective margins.
43  printing::PageMargins effective_margins;
44  effective_margins.header = std::max(margins.header, printable_area.y());
45  effective_margins.left = std::max(margins.left, printable_area.x());
46  effective_margins.top = std::max(margins.top,
47                                   effective_margins.header + kTextHeight);
48  effective_margins.footer = std::max(margins.footer,
49                                      page_size.height() -
50                                          printable_area.bottom());
51  effective_margins.right = std::max(margins.right,
52                                      page_size.width() -
53                                          printable_area.right());
54  effective_margins.bottom = std::max(margins.bottom,
55                                      effective_margins.footer  + kTextHeight);
56
57  // Calculate the overlay area.
58  gfx::Rect overlay_area(effective_margins.left, effective_margins.header,
59                         page_size.width() - effective_margins.right -
60                            effective_margins.left,
61                         page_size.height() - effective_margins.footer -
62                            effective_margins.header);
63
64  // Calculate the content area.
65  gfx::Rect content_area(overlay_area.x(),
66                         effective_margins.top,
67                         overlay_area.width(),
68                         page_size.height() - effective_margins.bottom -
69                             effective_margins.top);
70
71  // Test values.
72  EXPECT_EQ(page_size, setup.physical_size()) << seed << " " <<
73      page_size.ToString() << " " << printable_area.ToString() <<
74      " " << kTextHeight;
75  EXPECT_EQ(overlay_area, setup.overlay_area()) << seed << " " <<
76      page_size.ToString() << " " << printable_area.ToString() <<
77      " " << kTextHeight;
78  EXPECT_EQ(content_area, setup.content_area()) << seed << " " <<
79      page_size.ToString() << " " << printable_area.ToString() <<
80      " " << kTextHeight;
81
82  EXPECT_EQ(effective_margins.header, setup.effective_margins().header) <<
83      seed << " " << page_size.ToString() << " " << printable_area.ToString() <<
84      " " << kTextHeight;
85  EXPECT_EQ(effective_margins.footer, setup.effective_margins().footer) <<
86      seed << " " << page_size.ToString() << " " << printable_area.ToString() <<
87      " " << kTextHeight;
88  EXPECT_EQ(effective_margins.left, setup.effective_margins().left) << seed <<
89      " " << page_size.ToString() << " " << printable_area.ToString() <<
90      " " << kTextHeight;
91  EXPECT_EQ(effective_margins.top, setup.effective_margins().top) << seed <<
92      " " << page_size.ToString() << " " << printable_area.ToString() <<
93      " " << kTextHeight;
94  EXPECT_EQ(effective_margins.right, setup.effective_margins().right) << seed <<
95      " " << page_size.ToString() << " " << printable_area.ToString() <<
96      " " << kTextHeight;
97  EXPECT_EQ(effective_margins.bottom, setup.effective_margins().bottom) <<
98      seed << " " << page_size.ToString() << " " << printable_area.ToString() <<
99       " " << kTextHeight;
100}
101
102TEST(PageSetupTest, HardCoded) {
103  // Margins.
104  printing::PageMargins margins;
105  margins.header = 2;
106  margins.footer = 2;
107  margins.left = 4;
108  margins.top = 4;
109  margins.right = 4;
110  margins.bottom = 4;
111  int kTextHeight = 3;
112
113  // Page description.
114  gfx::Size page_size(100, 100);
115  gfx::Rect printable_area(3, 3, 94, 94);
116
117  // Make the calculations.
118  printing::PageSetup setup;
119  setup.SetRequestedMargins(margins);
120  setup.Init(page_size, printable_area, kTextHeight);
121
122  // Calculate the effective margins.
123  printing::PageMargins effective_margins;
124  effective_margins.header = 3;
125  effective_margins.left = 4;
126  effective_margins.top = 6;
127  effective_margins.footer = 3;
128  effective_margins.right = 4;
129  effective_margins.bottom = 6;
130
131  // Calculate the overlay area.
132  gfx::Rect overlay_area(4, 3, 92, 94);
133
134  // Calculate the content area.
135  gfx::Rect content_area(4, 6, 92, 88);
136
137  // Test values.
138  EXPECT_EQ(page_size, setup.physical_size()) << " " << page_size.ToString() <<
139      " " << printable_area.ToString() << " " << kTextHeight;
140  EXPECT_EQ(overlay_area, setup.overlay_area()) << " " <<
141      page_size.ToString() <<  " " << printable_area.ToString() <<
142      " " << kTextHeight;
143  EXPECT_EQ(content_area, setup.content_area()) << " " <<
144      page_size.ToString() <<  " " << printable_area.ToString() <<
145      " " << kTextHeight;
146
147  EXPECT_EQ(effective_margins.header, setup.effective_margins().header) <<
148      " " << page_size.ToString() << " " <<
149      printable_area.ToString() << " " << kTextHeight;
150  EXPECT_EQ(effective_margins.footer, setup.effective_margins().footer) <<
151      " " << page_size.ToString() << " " << printable_area.ToString() <<
152      " " << kTextHeight;
153  EXPECT_EQ(effective_margins.left, setup.effective_margins().left) <<
154      " " << page_size.ToString() << " " << printable_area.ToString() <<
155      " " << kTextHeight;
156  EXPECT_EQ(effective_margins.top, setup.effective_margins().top) <<
157      " " << page_size.ToString() << " " << printable_area.ToString() <<
158      " " << kTextHeight;
159  EXPECT_EQ(effective_margins.right, setup.effective_margins().right) <<
160      " " << page_size.ToString() << " " << printable_area.ToString() <<
161      " " << kTextHeight;
162  EXPECT_EQ(effective_margins.bottom, setup.effective_margins().bottom) <<
163      " " << page_size.ToString() << " " << printable_area.ToString() <<
164      " " << kTextHeight;
165}
166
167TEST(PageSetupTest, OutOfRangeMargins) {
168  printing::PageMargins margins;
169  margins.header = 0;
170  margins.footer = 0;
171  margins.left = -10;
172  margins.top = -11;
173  margins.right = -12;
174  margins.bottom = -13;
175
176  gfx::Size page_size(100, 100);
177  gfx::Rect printable_area(1, 2, 96, 94);
178
179  // Make the calculations.
180  printing::PageSetup setup;
181  setup.SetRequestedMargins(margins);
182  setup.Init(page_size, printable_area, 0);
183
184  EXPECT_EQ(setup.effective_margins().left, 1);
185  EXPECT_EQ(setup.effective_margins().top, 2);
186  EXPECT_EQ(setup.effective_margins().right, 3);
187  EXPECT_EQ(setup.effective_margins().bottom, 4);
188
189  setup.ForceRequestedMargins(margins);
190  EXPECT_EQ(setup.effective_margins().left, 0);
191  EXPECT_EQ(setup.effective_margins().top, 0);
192  EXPECT_EQ(setup.effective_margins().right, 0);
193  EXPECT_EQ(setup.effective_margins().bottom, 0);
194}
195
196TEST(PageSetupTest, FlipOrientation) {
197  // Margins.
198  printing::PageMargins margins;
199  margins.header = 2;
200  margins.footer = 3;
201  margins.left = 4;
202  margins.top = 14;
203  margins.right = 6;
204  margins.bottom = 7;
205  int kTextHeight = 5;
206
207  // Page description.
208  gfx::Size page_size(100, 70);
209  gfx::Rect printable_area(8, 9, 92, 50);
210
211  // Make the calculations.
212  printing::PageSetup setup;
213  setup.SetRequestedMargins(margins);
214  setup.Init(page_size, printable_area, kTextHeight);
215
216  gfx::Rect overlay_area(8, 9, 86, 50);
217  gfx::Rect content_area(8, 14, 86, 40);
218
219  EXPECT_EQ(page_size, setup.physical_size());
220  EXPECT_EQ(overlay_area, setup.overlay_area());
221  EXPECT_EQ(content_area, setup.content_area());
222
223  EXPECT_EQ(setup.effective_margins().left, 8);
224  EXPECT_EQ(setup.effective_margins().top, 14);
225  EXPECT_EQ(setup.effective_margins().right, 6);
226  EXPECT_EQ(setup.effective_margins().bottom, 16);
227
228  // Flip the orientation
229  setup.FlipOrientation();
230
231  // Expected values.
232  gfx::Size flipped_page_size(70, 100);
233  gfx::Rect flipped_printable_area(9, 0, 50, 92);
234  gfx::Rect flipped_overlay_area(9, 2, 50, 90);
235  gfx::Rect flipped_content_area(9, 14, 50, 73);
236
237  // Test values.
238  EXPECT_EQ(flipped_page_size, setup.physical_size());
239  EXPECT_EQ(flipped_overlay_area, setup.overlay_area());
240  EXPECT_EQ(flipped_content_area, setup.content_area());
241  EXPECT_EQ(flipped_printable_area, setup.printable_area());
242
243  // Margin values are updated as per the flipped values.
244  EXPECT_EQ(setup.effective_margins().left, 9);
245  EXPECT_EQ(setup.effective_margins().top, 14);
246  EXPECT_EQ(setup.effective_margins().right, 11);
247  EXPECT_EQ(setup.effective_margins().bottom, 13);
248
249  // Force requested margins and flip the orientation.
250  setup.Init(page_size, printable_area, kTextHeight);
251  setup.ForceRequestedMargins(margins);
252  EXPECT_EQ(setup.effective_margins().left, 4);
253  EXPECT_EQ(setup.effective_margins().top, 14);
254  EXPECT_EQ(setup.effective_margins().right, 6);
255  EXPECT_EQ(setup.effective_margins().bottom, 7);
256
257  // Flip the orientation
258  setup.FlipOrientation();
259
260  // Expected values.
261  gfx::Rect new_printable_area(9, 0, 50, 92);
262  gfx::Rect new_overlay_area(4, 2, 60, 95);
263  gfx::Rect new_content_area(4, 14, 60, 79);
264
265  // Test values.
266  EXPECT_EQ(flipped_page_size, setup.physical_size());
267  EXPECT_EQ(new_overlay_area, setup.overlay_area());
268  EXPECT_EQ(new_content_area, setup.content_area());
269  EXPECT_EQ(new_printable_area, setup.printable_area());
270
271  // Margins values are changed respectively.
272  EXPECT_EQ(setup.effective_margins().left, 4);
273  EXPECT_EQ(setup.effective_margins().top, 14);
274  EXPECT_EQ(setup.effective_margins().right, 6);
275  EXPECT_EQ(setup.effective_margins().bottom, 7);
276}
277