1 // Copyright 2014 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.
5 #include "components/cloud_devices/printer_description.h"
7 #include "base/json/json_reader.h"
8 #include "base/json/json_writer.h"
9 #include "base/strings/string_util.h"
10 #include "base/values.h"
11 #include "testing/gtest/include/gtest/gtest.h"
13 namespace cloud_devices {
17 // Replaces ' with " to allow readable json constants in tests.
18 // Makes sure that same json value represented by same strings to simplify
20 std::string NormalizeJson(const std::string& json) {
21 std::string result = json;
22 base::ReplaceChars(result, "'", "\"", &result);
23 scoped_ptr<base::Value> value(base::JSONReader::Read(result));
25 base::JSONWriter::Write(value.get(), &result);
33 " 'supported_content_type': [ {"
34 " 'content_type': 'image/pwg-raster'"
36 " 'content_type': 'image/jpeg'"
40 " 'is_default': true,"
41 " 'type': 'STANDARD_COLOR'"
43 " 'type': 'STANDARD_MONOCHROME'"
45 " 'type': 'CUSTOM_MONOCHROME',"
46 " 'vendor_id': '123',"
47 " 'custom_display_name': 'monochrome'"
52 " 'is_default': true,"
53 " 'type': 'LONG_EDGE'"
55 " 'type': 'SHORT_EDGE'"
57 " 'type': 'NO_DUPLEX'"
60 " 'page_orientation': {"
64 " 'type': 'LANDSCAPE'"
66 " 'is_default': true,"
74 " 'is_default': true,"
75 " 'type': 'BORDERLESS',"
77 " 'right_microns': 0,"
78 " 'bottom_microns': 0,"
81 " 'type': 'STANDARD',"
82 " 'top_microns': 100,"
83 " 'right_microns': 200,"
84 " 'bottom_microns': 300,"
85 " 'left_microns': 400"
89 " 'right_microns': 2,"
90 " 'bottom_microns': 3,"
96 " 'horizontal_dpi': 150,"
97 " 'vertical_dpi': 250"
99 " 'is_default': true,"
100 " 'horizontal_dpi': 600,"
101 " 'vertical_dpi': 1600"
106 " 'is_default': true,"
107 " 'type': 'NO_FITTING'"
109 " 'type': 'FIT_TO_PAGE'"
111 " 'type': 'GROW_TO_PAGE'"
113 " 'type': 'SHRINK_TO_PAGE'"
115 " 'type': 'FILL_PAGE'"
122 " 'is_default': true,"
123 " 'name': 'NA_LETTER',"
124 " 'width_microns': 2222,"
125 " 'height_microns': 3333"
128 " 'width_microns': 4444,"
129 " 'height_microns': 5555"
131 " 'name': 'JPN_YOU4',"
132 " 'width_microns': 6666,"
133 " 'height_microns': 7777"
135 " 'width_microns': 1111,"
136 " 'is_continuous_feed': true,"
137 " 'custom_display_name': 'FEED'"
143 " 'reverse_order': {"
150 const char kDefaultCdd[] =
155 const char kBadVersionCdd[] =
162 const char kNoDefaultCdd[] =
168 " 'type': 'STANDARD_COLOR'"
170 " 'type': 'STANDARD_MONOCHROME'"
176 const char kMultyDefaultCdd[] =
182 " 'is_default': true,"
183 " 'type': 'STANDARD_COLOR'"
185 " 'is_default': true,"
186 " 'type': 'STANDARD_MONOCHROME'"
197 " 'type': 'STANDARD_MONOCHROME'"
200 " 'type': 'NO_DUPLEX'"
202 " 'page_orientation': {"
203 " 'type': 'LANDSCAPE'"
211 " 'right_microns': 6,"
212 " 'bottom_microns': 3,"
216 " 'horizontal_dpi': 562,"
217 " 'vertical_dpi': 125"
220 " 'type': 'SHRINK_TO_PAGE'"
231 " 'name': 'ISO_C7C6',"
232 " 'width_microns': 4261,"
233 " 'height_microns': 334"
238 " 'reverse_order': {"
239 " 'reverse_order': true"
244 const char kDefaultCjt[] =
249 const char kBadVersionCjt[] =
256 TEST(PrinterDescriptionTest, CddInit) {
257 CloudDeviceDescription description;
258 EXPECT_EQ(NormalizeJson(kDefaultCdd), NormalizeJson(description.ToString()));
260 ContentTypesCapability content_types;
261 ColorCapability color;
262 DuplexCapability duplex;
263 OrientationCapability orientation;
264 MarginsCapability margins;
266 FitToPageCapability fit_to_page;
267 MediaCapability media;
268 CopiesCapability copies;
269 PageRangeCapability page_range;
270 CollateCapability collate;
271 ReverseCapability reverse;
273 EXPECT_FALSE(content_types.LoadFrom(description));
274 EXPECT_FALSE(color.LoadFrom(description));
275 EXPECT_FALSE(duplex.LoadFrom(description));
276 EXPECT_FALSE(orientation.LoadFrom(description));
277 EXPECT_FALSE(copies.LoadFrom(description));
278 EXPECT_FALSE(margins.LoadFrom(description));
279 EXPECT_FALSE(dpi.LoadFrom(description));
280 EXPECT_FALSE(fit_to_page.LoadFrom(description));
281 EXPECT_FALSE(page_range.LoadFrom(description));
282 EXPECT_FALSE(media.LoadFrom(description));
283 EXPECT_FALSE(collate.LoadFrom(description));
284 EXPECT_FALSE(reverse.LoadFrom(description));
285 EXPECT_FALSE(media.LoadFrom(description));
288 TEST(PrinterDescriptionTest, CddInvalid) {
289 CloudDeviceDescription description;
290 ColorCapability color;
292 EXPECT_FALSE(description.InitFromString(NormalizeJson(kBadVersionCdd)));
294 EXPECT_TRUE(description.InitFromString(NormalizeJson(kNoDefaultCdd)));
295 EXPECT_FALSE(color.LoadFrom(description));
297 EXPECT_TRUE(description.InitFromString(NormalizeJson(kMultyDefaultCdd)));
298 EXPECT_FALSE(color.LoadFrom(description));
301 TEST(PrinterDescriptionTest, CddSetAll) {
302 CloudDeviceDescription description;
304 ContentTypesCapability content_types;
305 ColorCapability color;
306 DuplexCapability duplex;
307 OrientationCapability orientation;
308 MarginsCapability margins;
310 FitToPageCapability fit_to_page;
311 MediaCapability media;
312 CopiesCapability copies;
313 PageRangeCapability page_range;
314 CollateCapability collate;
315 ReverseCapability reverse;
317 content_types.AddOption("image/pwg-raster");
318 content_types.AddOption("image/jpeg");
320 color.AddDefaultOption(Color(STANDARD_COLOR), true);
321 color.AddOption(Color(STANDARD_MONOCHROME));
322 Color custom(CUSTOM_MONOCHROME);
323 custom.vendor_id = "123";
324 custom.custom_display_name = "monochrome";
325 color.AddOption(custom);
327 duplex.AddDefaultOption(LONG_EDGE, true);
328 duplex.AddOption(SHORT_EDGE);
329 duplex.AddOption(NO_DUPLEX);
331 orientation.AddOption(PORTRAIT);
332 orientation.AddOption(LANDSCAPE);
333 orientation.AddDefaultOption(AUTO_ORIENTATION, true);
335 margins.AddDefaultOption(Margins(NO_MARGINS, 0, 0, 0, 0), true);
336 margins.AddOption(Margins(STANDARD_MARGINS, 100, 200, 300, 400));
337 margins.AddOption(Margins(CUSTOM_MARGINS, 1, 2, 3, 4));
339 dpi.AddOption(Dpi(150, 250));
340 dpi.AddDefaultOption(Dpi(600, 1600), true);
342 fit_to_page.AddDefaultOption(NO_FITTING, true);
343 fit_to_page.AddOption(FIT_TO_PAGE);
344 fit_to_page.AddOption(GROW_TO_PAGE);
345 fit_to_page.AddOption(SHRINK_TO_PAGE);
346 fit_to_page.AddOption(FILL_PAGE);
348 media.AddDefaultOption(Media(NA_LETTER, 2222, 3333), true);
349 media.AddOption(Media(ISO_A6, 4444, 5555));
350 media.AddOption(Media(JPN_YOU4, 6666, 7777));
351 media.AddOption(Media("FEED", 1111, 0));
353 collate.set_default_value(false);
354 reverse.set_default_value(true);
356 content_types.SaveTo(&description);
357 color.SaveTo(&description);
358 duplex.SaveTo(&description);
359 orientation.SaveTo(&description);
360 copies.SaveTo(&description);
361 margins.SaveTo(&description);
362 dpi.SaveTo(&description);
363 fit_to_page.SaveTo(&description);
364 page_range.SaveTo(&description);
365 media.SaveTo(&description);
366 collate.SaveTo(&description);
367 reverse.SaveTo(&description);
369 EXPECT_EQ(NormalizeJson(kCdd), NormalizeJson(description.ToString()));
372 TEST(PrinterDescriptionTest, CddGetAll) {
373 CloudDeviceDescription description;
374 ASSERT_TRUE(description.InitFromString(NormalizeJson(kCdd)));
376 ContentTypesCapability content_types;
377 ColorCapability color;
378 DuplexCapability duplex;
379 OrientationCapability orientation;
380 MarginsCapability margins;
382 FitToPageCapability fit_to_page;
383 MediaCapability media;
384 CopiesCapability copies;
385 PageRangeCapability page_range;
386 CollateCapability collate;
387 ReverseCapability reverse;
389 EXPECT_TRUE(content_types.LoadFrom(description));
390 EXPECT_TRUE(color.LoadFrom(description));
391 EXPECT_TRUE(duplex.LoadFrom(description));
392 EXPECT_TRUE(orientation.LoadFrom(description));
393 EXPECT_TRUE(copies.LoadFrom(description));
394 EXPECT_TRUE(margins.LoadFrom(description));
395 EXPECT_TRUE(dpi.LoadFrom(description));
396 EXPECT_TRUE(fit_to_page.LoadFrom(description));
397 EXPECT_TRUE(page_range.LoadFrom(description));
398 EXPECT_TRUE(media.LoadFrom(description));
399 EXPECT_TRUE(collate.LoadFrom(description));
400 EXPECT_TRUE(reverse.LoadFrom(description));
401 EXPECT_TRUE(media.LoadFrom(description));
403 EXPECT_TRUE(content_types.Contains("image/pwg-raster"));
404 EXPECT_TRUE(content_types.Contains("image/jpeg"));
406 EXPECT_TRUE(color.Contains(Color(STANDARD_COLOR)));
407 EXPECT_TRUE(color.Contains(Color(STANDARD_MONOCHROME)));
408 Color custom(CUSTOM_MONOCHROME);
409 custom.vendor_id = "123";
410 custom.custom_display_name = "monochrome";
411 EXPECT_TRUE(color.Contains(custom));
412 EXPECT_EQ(Color(STANDARD_COLOR), color.GetDefault());
414 EXPECT_TRUE(duplex.Contains(LONG_EDGE));
415 EXPECT_TRUE(duplex.Contains(SHORT_EDGE));
416 EXPECT_TRUE(duplex.Contains(NO_DUPLEX));
417 EXPECT_EQ(LONG_EDGE, duplex.GetDefault());
419 EXPECT_TRUE(orientation.Contains(PORTRAIT));
420 EXPECT_TRUE(orientation.Contains(LANDSCAPE));
421 EXPECT_TRUE(orientation.Contains(AUTO_ORIENTATION));
422 EXPECT_EQ(AUTO_ORIENTATION, orientation.GetDefault());
424 EXPECT_TRUE(margins.Contains(Margins(NO_MARGINS, 0, 0, 0, 0)));
425 EXPECT_TRUE(margins.Contains(Margins(STANDARD_MARGINS, 100, 200, 300, 400)));
426 EXPECT_TRUE(margins.Contains(Margins(CUSTOM_MARGINS, 1, 2, 3, 4)));
427 EXPECT_EQ(Margins(NO_MARGINS, 0, 0, 0, 0), margins.GetDefault());
429 EXPECT_TRUE(dpi.Contains(Dpi(150, 250)));
430 EXPECT_TRUE(dpi.Contains(Dpi(600, 1600)));
431 EXPECT_EQ(Dpi(600, 1600), dpi.GetDefault());
433 EXPECT_TRUE(fit_to_page.Contains(NO_FITTING));
434 EXPECT_TRUE(fit_to_page.Contains(FIT_TO_PAGE));
435 EXPECT_TRUE(fit_to_page.Contains(GROW_TO_PAGE));
436 EXPECT_TRUE(fit_to_page.Contains(SHRINK_TO_PAGE));
437 EXPECT_TRUE(fit_to_page.Contains(FILL_PAGE));
438 EXPECT_EQ(NO_FITTING, fit_to_page.GetDefault());
440 EXPECT_TRUE(media.Contains(Media(NA_LETTER, 2222, 3333)));
441 EXPECT_TRUE(media.Contains(Media(ISO_A6, 4444, 5555)));
442 EXPECT_TRUE(media.Contains(Media(JPN_YOU4, 6666, 7777)));
443 EXPECT_TRUE(media.Contains(Media("FEED", 1111, 0)));
444 EXPECT_EQ(Media(NA_LETTER, 2222, 3333), media.GetDefault());
446 EXPECT_FALSE(collate.default_value());
447 EXPECT_TRUE(reverse.default_value());
449 EXPECT_EQ(NormalizeJson(kCdd), NormalizeJson(description.ToString()));
452 TEST(PrinterDescriptionTest, CjtInit) {
453 CloudDeviceDescription description;
454 EXPECT_EQ(NormalizeJson(kDefaultCjt), NormalizeJson(description.ToString()));
456 ColorTicketItem color;
457 DuplexTicketItem duplex;
458 OrientationTicketItem orientation;
459 MarginsTicketItem margins;
461 FitToPageTicketItem fit_to_page;
462 MediaTicketItem media;
463 CopiesTicketItem copies;
464 PageRangeTicketItem page_range;
465 CollateTicketItem collate;
466 ReverseTicketItem reverse;
468 EXPECT_FALSE(color.LoadFrom(description));
469 EXPECT_FALSE(duplex.LoadFrom(description));
470 EXPECT_FALSE(orientation.LoadFrom(description));
471 EXPECT_FALSE(copies.LoadFrom(description));
472 EXPECT_FALSE(margins.LoadFrom(description));
473 EXPECT_FALSE(dpi.LoadFrom(description));
474 EXPECT_FALSE(fit_to_page.LoadFrom(description));
475 EXPECT_FALSE(page_range.LoadFrom(description));
476 EXPECT_FALSE(media.LoadFrom(description));
477 EXPECT_FALSE(collate.LoadFrom(description));
478 EXPECT_FALSE(reverse.LoadFrom(description));
479 EXPECT_FALSE(media.LoadFrom(description));
482 TEST(PrinterDescriptionTest, CjtInvalid) {
483 CloudDeviceDescription ticket;
484 EXPECT_FALSE(ticket.InitFromString(NormalizeJson(kBadVersionCjt)));
487 TEST(PrinterDescriptionTest, CjtSetAll) {
488 CloudDeviceDescription description;
490 ColorTicketItem color;
491 DuplexTicketItem duplex;
492 OrientationTicketItem orientation;
493 MarginsTicketItem margins;
495 FitToPageTicketItem fit_to_page;
496 MediaTicketItem media;
497 CopiesTicketItem copies;
498 PageRangeTicketItem page_range;
499 CollateTicketItem collate;
500 ReverseTicketItem reverse;
502 color.set_value(Color(STANDARD_MONOCHROME));
503 duplex.set_value(NO_DUPLEX);
504 orientation.set_value(LANDSCAPE);
505 copies.set_value(123);
506 margins.set_value(Margins(CUSTOM_MARGINS, 7, 6, 3, 1));
507 dpi.set_value(Dpi(562, 125));
508 fit_to_page.set_value(SHRINK_TO_PAGE);
509 PageRange page_ranges;
510 page_ranges.push_back(Interval(1, 99));
511 page_ranges.push_back(Interval(150));
512 page_range.set_value(page_ranges);
513 media.set_value(Media(ISO_C7C6, 4261, 334));
514 collate.set_value(false);
515 reverse.set_value(true);
517 color.SaveTo(&description);
518 duplex.SaveTo(&description);
519 orientation.SaveTo(&description);
520 copies.SaveTo(&description);
521 margins.SaveTo(&description);
522 dpi.SaveTo(&description);
523 fit_to_page.SaveTo(&description);
524 page_range.SaveTo(&description);
525 media.SaveTo(&description);
526 collate.SaveTo(&description);
527 reverse.SaveTo(&description);
529 EXPECT_EQ(NormalizeJson(kCjt), NormalizeJson(description.ToString()));
532 TEST(PrinterDescriptionTest, CjtGetAll) {
533 CloudDeviceDescription description;
534 ASSERT_TRUE(description.InitFromString(NormalizeJson(kCjt)));
536 ColorTicketItem color;
537 DuplexTicketItem duplex;
538 OrientationTicketItem orientation;
539 MarginsTicketItem margins;
541 FitToPageTicketItem fit_to_page;
542 MediaTicketItem media;
543 CopiesTicketItem copies;
544 PageRangeTicketItem page_range;
545 CollateTicketItem collate;
546 ReverseTicketItem reverse;
548 EXPECT_TRUE(color.LoadFrom(description));
549 EXPECT_TRUE(duplex.LoadFrom(description));
550 EXPECT_TRUE(orientation.LoadFrom(description));
551 EXPECT_TRUE(copies.LoadFrom(description));
552 EXPECT_TRUE(margins.LoadFrom(description));
553 EXPECT_TRUE(dpi.LoadFrom(description));
554 EXPECT_TRUE(fit_to_page.LoadFrom(description));
555 EXPECT_TRUE(page_range.LoadFrom(description));
556 EXPECT_TRUE(media.LoadFrom(description));
557 EXPECT_TRUE(collate.LoadFrom(description));
558 EXPECT_TRUE(reverse.LoadFrom(description));
559 EXPECT_TRUE(media.LoadFrom(description));
561 EXPECT_EQ(color.value(), Color(STANDARD_MONOCHROME));
562 EXPECT_EQ(duplex.value(), NO_DUPLEX);
563 EXPECT_EQ(orientation.value(), LANDSCAPE);
564 EXPECT_EQ(copies.value(), 123);
565 EXPECT_EQ(margins.value(), Margins(CUSTOM_MARGINS, 7, 6, 3, 1));
566 EXPECT_EQ(dpi.value(), Dpi(562, 125));
567 EXPECT_EQ(fit_to_page.value(), SHRINK_TO_PAGE);
568 PageRange page_ranges;
569 page_ranges.push_back(Interval(1, 99));
570 page_ranges.push_back(Interval(150));
571 EXPECT_EQ(page_range.value(), page_ranges);
572 EXPECT_EQ(media.value(), Media(ISO_C7C6, 4261, 334));
573 EXPECT_FALSE(collate.value());
574 EXPECT_TRUE(reverse.value());
576 EXPECT_EQ(NormalizeJson(kCjt), NormalizeJson(description.ToString()));
579 } // namespace printer
581 } // namespace cloud_devices