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 14 TEST(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 102 TEST(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 167 TEST(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 196 TEST(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