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/common/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'"
38 " 'pwg_raster_config' : {"
39 " 'document_sheet_back' : 'MANUAL_TUMBLE',"
40 " 'reverse_order_streaming': true"
44 " 'is_default': true,"
45 " 'type': 'STANDARD_COLOR'"
47 " 'type': 'STANDARD_MONOCHROME'"
49 " 'type': 'CUSTOM_MONOCHROME',"
50 " 'vendor_id': '123',"
51 " 'custom_display_name': 'monochrome'"
56 " 'is_default': true,"
57 " 'type': 'LONG_EDGE'"
59 " 'type': 'SHORT_EDGE'"
61 " 'type': 'NO_DUPLEX'"
64 " 'page_orientation': {"
68 " 'type': 'LANDSCAPE'"
70 " 'is_default': true,"
78 " 'is_default': true,"
79 " 'type': 'BORDERLESS',"
81 " 'right_microns': 0,"
82 " 'bottom_microns': 0,"
85 " 'type': 'STANDARD',"
86 " 'top_microns': 100,"
87 " 'right_microns': 200,"
88 " 'bottom_microns': 300,"
89 " 'left_microns': 400"
93 " 'right_microns': 2,"
94 " 'bottom_microns': 3,"
100 " 'horizontal_dpi': 150,"
101 " 'vertical_dpi': 250"
103 " 'is_default': true,"
104 " 'horizontal_dpi': 600,"
105 " 'vertical_dpi': 1600"
110 " 'is_default': true,"
111 " 'type': 'NO_FITTING'"
113 " 'type': 'FIT_TO_PAGE'"
115 " 'type': 'GROW_TO_PAGE'"
117 " 'type': 'SHRINK_TO_PAGE'"
119 " 'type': 'FILL_PAGE'"
126 " 'is_default': true,"
127 " 'name': 'NA_LETTER',"
128 " 'width_microns': 2222,"
129 " 'height_microns': 3333"
132 " 'width_microns': 4444,"
133 " 'height_microns': 5555"
135 " 'name': 'JPN_YOU4',"
136 " 'width_microns': 6666,"
137 " 'height_microns': 7777"
139 " 'width_microns': 1111,"
140 " 'is_continuous_feed': true,"
141 " 'custom_display_name': 'FEED'"
147 " 'reverse_order': {"
153 const char kDefaultCdd[] =
158 const char kBadVersionCdd[] =
165 const char kNoDefaultCdd[] =
171 " 'type': 'STANDARD_COLOR'"
173 " 'type': 'STANDARD_MONOCHROME'"
179 const char kMultyDefaultCdd[] =
185 " 'is_default': true,"
186 " 'type': 'STANDARD_COLOR'"
188 " 'is_default': true,"
189 " 'type': 'STANDARD_MONOCHROME'"
199 " 'pwg_raster_config' : {"
200 " 'document_sheet_back' : 'MANUAL_TUMBLE',"
201 " 'reverse_order_streaming': true"
204 " 'type': 'STANDARD_MONOCHROME'"
207 " 'type': 'NO_DUPLEX'"
209 " 'page_orientation': {"
210 " 'type': 'LANDSCAPE'"
218 " 'right_microns': 6,"
219 " 'bottom_microns': 3,"
223 " 'horizontal_dpi': 562,"
224 " 'vertical_dpi': 125"
227 " 'type': 'SHRINK_TO_PAGE'"
238 " 'name': 'ISO_C7C6',"
239 " 'width_microns': 4261,"
240 " 'height_microns': 334"
245 " 'reverse_order': {"
246 " 'reverse_order': true"
251 const char kDefaultCjt[] =
256 const char kBadVersionCjt[] =
263 TEST(PrinterDescriptionTest, CddInit) {
264 CloudDeviceDescription description;
265 EXPECT_EQ(NormalizeJson(kDefaultCdd), NormalizeJson(description.ToString()));
267 ContentTypesCapability content_types;
268 PwgRasterConfigCapability pwg_raster;
269 ColorCapability color;
270 DuplexCapability duplex;
271 OrientationCapability orientation;
272 MarginsCapability margins;
274 FitToPageCapability fit_to_page;
275 MediaCapability media;
276 CopiesCapability copies;
277 PageRangeCapability page_range;
278 CollateCapability collate;
279 ReverseCapability reverse;
281 EXPECT_FALSE(content_types.LoadFrom(description));
282 EXPECT_FALSE(pwg_raster.LoadFrom(description));
283 EXPECT_FALSE(color.LoadFrom(description));
284 EXPECT_FALSE(duplex.LoadFrom(description));
285 EXPECT_FALSE(orientation.LoadFrom(description));
286 EXPECT_FALSE(copies.LoadFrom(description));
287 EXPECT_FALSE(margins.LoadFrom(description));
288 EXPECT_FALSE(dpi.LoadFrom(description));
289 EXPECT_FALSE(fit_to_page.LoadFrom(description));
290 EXPECT_FALSE(page_range.LoadFrom(description));
291 EXPECT_FALSE(media.LoadFrom(description));
292 EXPECT_FALSE(collate.LoadFrom(description));
293 EXPECT_FALSE(reverse.LoadFrom(description));
294 EXPECT_FALSE(media.LoadFrom(description));
297 TEST(PrinterDescriptionTest, CddInvalid) {
298 CloudDeviceDescription description;
299 ColorCapability color;
301 EXPECT_FALSE(description.InitFromString(NormalizeJson(kBadVersionCdd)));
303 EXPECT_TRUE(description.InitFromString(NormalizeJson(kNoDefaultCdd)));
304 EXPECT_FALSE(color.LoadFrom(description));
306 EXPECT_TRUE(description.InitFromString(NormalizeJson(kMultyDefaultCdd)));
307 EXPECT_FALSE(color.LoadFrom(description));
310 TEST(PrinterDescriptionTest, CddSetAll) {
311 CloudDeviceDescription description;
313 ContentTypesCapability content_types;
314 PwgRasterConfigCapability pwg_raster_config;
315 ColorCapability color;
316 DuplexCapability duplex;
317 OrientationCapability orientation;
318 MarginsCapability margins;
320 FitToPageCapability fit_to_page;
321 MediaCapability media;
322 CopiesCapability copies;
323 PageRangeCapability page_range;
324 CollateCapability collate;
325 ReverseCapability reverse;
327 content_types.AddOption("image/pwg-raster");
328 content_types.AddOption("image/jpeg");
330 PwgRasterConfig custom_raster;
331 custom_raster.document_sheet_back = MANUAL_TUMBLE;
332 custom_raster.reverse_order_streaming = true;
333 custom_raster.rotate_all_pages = false;
334 pwg_raster_config.set_value(custom_raster);
336 color.AddDefaultOption(Color(STANDARD_COLOR), true);
337 color.AddOption(Color(STANDARD_MONOCHROME));
338 Color custom(CUSTOM_MONOCHROME);
339 custom.vendor_id = "123";
340 custom.custom_display_name = "monochrome";
341 color.AddOption(custom);
343 duplex.AddDefaultOption(LONG_EDGE, true);
344 duplex.AddOption(SHORT_EDGE);
345 duplex.AddOption(NO_DUPLEX);
347 orientation.AddOption(PORTRAIT);
348 orientation.AddOption(LANDSCAPE);
349 orientation.AddDefaultOption(AUTO_ORIENTATION, true);
351 margins.AddDefaultOption(Margins(NO_MARGINS, 0, 0, 0, 0), true);
352 margins.AddOption(Margins(STANDARD_MARGINS, 100, 200, 300, 400));
353 margins.AddOption(Margins(CUSTOM_MARGINS, 1, 2, 3, 4));
355 dpi.AddOption(Dpi(150, 250));
356 dpi.AddDefaultOption(Dpi(600, 1600), true);
358 fit_to_page.AddDefaultOption(NO_FITTING, true);
359 fit_to_page.AddOption(FIT_TO_PAGE);
360 fit_to_page.AddOption(GROW_TO_PAGE);
361 fit_to_page.AddOption(SHRINK_TO_PAGE);
362 fit_to_page.AddOption(FILL_PAGE);
364 media.AddDefaultOption(Media(NA_LETTER, 2222, 3333), true);
365 media.AddOption(Media(ISO_A6, 4444, 5555));
366 media.AddOption(Media(JPN_YOU4, 6666, 7777));
367 media.AddOption(Media("FEED", 1111, 0));
369 collate.set_default_value(false);
370 reverse.set_default_value(true);
372 content_types.SaveTo(&description);
373 color.SaveTo(&description);
374 duplex.SaveTo(&description);
375 orientation.SaveTo(&description);
376 copies.SaveTo(&description);
377 margins.SaveTo(&description);
378 dpi.SaveTo(&description);
379 fit_to_page.SaveTo(&description);
380 page_range.SaveTo(&description);
381 media.SaveTo(&description);
382 collate.SaveTo(&description);
383 reverse.SaveTo(&description);
384 pwg_raster_config.SaveTo(&description);
386 EXPECT_EQ(NormalizeJson(kCdd), NormalizeJson(description.ToString()));
389 TEST(PrinterDescriptionTest, CddGetAll) {
390 CloudDeviceDescription description;
391 ASSERT_TRUE(description.InitFromString(NormalizeJson(kCdd)));
393 ContentTypesCapability content_types;
394 PwgRasterConfigCapability pwg_raster_config;
395 ColorCapability color;
396 DuplexCapability duplex;
397 OrientationCapability orientation;
398 MarginsCapability margins;
400 FitToPageCapability fit_to_page;
401 MediaCapability media;
402 CopiesCapability copies;
403 PageRangeCapability page_range;
404 CollateCapability collate;
405 ReverseCapability reverse;
407 EXPECT_TRUE(content_types.LoadFrom(description));
408 EXPECT_TRUE(color.LoadFrom(description));
409 EXPECT_TRUE(duplex.LoadFrom(description));
410 EXPECT_TRUE(orientation.LoadFrom(description));
411 EXPECT_TRUE(copies.LoadFrom(description));
412 EXPECT_TRUE(margins.LoadFrom(description));
413 EXPECT_TRUE(dpi.LoadFrom(description));
414 EXPECT_TRUE(fit_to_page.LoadFrom(description));
415 EXPECT_TRUE(page_range.LoadFrom(description));
416 EXPECT_TRUE(media.LoadFrom(description));
417 EXPECT_TRUE(collate.LoadFrom(description));
418 EXPECT_TRUE(reverse.LoadFrom(description));
419 EXPECT_TRUE(media.LoadFrom(description));
420 EXPECT_TRUE(pwg_raster_config.LoadFrom(description));
422 EXPECT_TRUE(content_types.Contains("image/pwg-raster"));
423 EXPECT_TRUE(content_types.Contains("image/jpeg"));
425 EXPECT_EQ(MANUAL_TUMBLE, pwg_raster_config.value().document_sheet_back);
426 EXPECT_TRUE(pwg_raster_config.value().reverse_order_streaming);
427 EXPECT_FALSE(pwg_raster_config.value().rotate_all_pages);
429 EXPECT_TRUE(color.Contains(Color(STANDARD_COLOR)));
430 EXPECT_TRUE(color.Contains(Color(STANDARD_MONOCHROME)));
431 Color custom(CUSTOM_MONOCHROME);
432 custom.vendor_id = "123";
433 custom.custom_display_name = "monochrome";
434 EXPECT_TRUE(color.Contains(custom));
435 EXPECT_EQ(Color(STANDARD_COLOR), color.GetDefault());
437 EXPECT_TRUE(duplex.Contains(LONG_EDGE));
438 EXPECT_TRUE(duplex.Contains(SHORT_EDGE));
439 EXPECT_TRUE(duplex.Contains(NO_DUPLEX));
440 EXPECT_EQ(LONG_EDGE, duplex.GetDefault());
442 EXPECT_TRUE(orientation.Contains(PORTRAIT));
443 EXPECT_TRUE(orientation.Contains(LANDSCAPE));
444 EXPECT_TRUE(orientation.Contains(AUTO_ORIENTATION));
445 EXPECT_EQ(AUTO_ORIENTATION, orientation.GetDefault());
447 EXPECT_TRUE(margins.Contains(Margins(NO_MARGINS, 0, 0, 0, 0)));
448 EXPECT_TRUE(margins.Contains(Margins(STANDARD_MARGINS, 100, 200, 300, 400)));
449 EXPECT_TRUE(margins.Contains(Margins(CUSTOM_MARGINS, 1, 2, 3, 4)));
450 EXPECT_EQ(Margins(NO_MARGINS, 0, 0, 0, 0), margins.GetDefault());
452 EXPECT_TRUE(dpi.Contains(Dpi(150, 250)));
453 EXPECT_TRUE(dpi.Contains(Dpi(600, 1600)));
454 EXPECT_EQ(Dpi(600, 1600), dpi.GetDefault());
456 EXPECT_TRUE(fit_to_page.Contains(NO_FITTING));
457 EXPECT_TRUE(fit_to_page.Contains(FIT_TO_PAGE));
458 EXPECT_TRUE(fit_to_page.Contains(GROW_TO_PAGE));
459 EXPECT_TRUE(fit_to_page.Contains(SHRINK_TO_PAGE));
460 EXPECT_TRUE(fit_to_page.Contains(FILL_PAGE));
461 EXPECT_EQ(NO_FITTING, fit_to_page.GetDefault());
463 EXPECT_TRUE(media.Contains(Media(NA_LETTER, 2222, 3333)));
464 EXPECT_TRUE(media.Contains(Media(ISO_A6, 4444, 5555)));
465 EXPECT_TRUE(media.Contains(Media(JPN_YOU4, 6666, 7777)));
466 EXPECT_TRUE(media.Contains(Media("FEED", 1111, 0)));
467 EXPECT_EQ(Media(NA_LETTER, 2222, 3333), media.GetDefault());
469 EXPECT_FALSE(collate.default_value());
470 EXPECT_TRUE(reverse.default_value());
472 EXPECT_EQ(NormalizeJson(kCdd), NormalizeJson(description.ToString()));
475 TEST(PrinterDescriptionTest, CjtInit) {
476 CloudDeviceDescription description;
477 EXPECT_EQ(NormalizeJson(kDefaultCjt), NormalizeJson(description.ToString()));
479 PwgRasterConfigTicketItem pwg_raster_config;
480 ColorTicketItem color;
481 DuplexTicketItem duplex;
482 OrientationTicketItem orientation;
483 MarginsTicketItem margins;
485 FitToPageTicketItem fit_to_page;
486 MediaTicketItem media;
487 CopiesTicketItem copies;
488 PageRangeTicketItem page_range;
489 CollateTicketItem collate;
490 ReverseTicketItem reverse;
492 EXPECT_FALSE(pwg_raster_config.LoadFrom(description));
493 EXPECT_FALSE(color.LoadFrom(description));
494 EXPECT_FALSE(duplex.LoadFrom(description));
495 EXPECT_FALSE(orientation.LoadFrom(description));
496 EXPECT_FALSE(copies.LoadFrom(description));
497 EXPECT_FALSE(margins.LoadFrom(description));
498 EXPECT_FALSE(dpi.LoadFrom(description));
499 EXPECT_FALSE(fit_to_page.LoadFrom(description));
500 EXPECT_FALSE(page_range.LoadFrom(description));
501 EXPECT_FALSE(media.LoadFrom(description));
502 EXPECT_FALSE(collate.LoadFrom(description));
503 EXPECT_FALSE(reverse.LoadFrom(description));
504 EXPECT_FALSE(media.LoadFrom(description));
507 TEST(PrinterDescriptionTest, CjtInvalid) {
508 CloudDeviceDescription ticket;
509 EXPECT_FALSE(ticket.InitFromString(NormalizeJson(kBadVersionCjt)));
512 TEST(PrinterDescriptionTest, CjtSetAll) {
513 CloudDeviceDescription description;
515 PwgRasterConfigTicketItem pwg_raster_config;
516 ColorTicketItem color;
517 DuplexTicketItem duplex;
518 OrientationTicketItem orientation;
519 MarginsTicketItem margins;
521 FitToPageTicketItem fit_to_page;
522 MediaTicketItem media;
523 CopiesTicketItem copies;
524 PageRangeTicketItem page_range;
525 CollateTicketItem collate;
526 ReverseTicketItem reverse;
528 PwgRasterConfig custom_raster;
529 custom_raster.document_sheet_back = MANUAL_TUMBLE;
530 custom_raster.reverse_order_streaming = true;
531 custom_raster.rotate_all_pages = false;
532 pwg_raster_config.set_value(custom_raster);
533 color.set_value(Color(STANDARD_MONOCHROME));
534 duplex.set_value(NO_DUPLEX);
535 orientation.set_value(LANDSCAPE);
536 copies.set_value(123);
537 margins.set_value(Margins(CUSTOM_MARGINS, 7, 6, 3, 1));
538 dpi.set_value(Dpi(562, 125));
539 fit_to_page.set_value(SHRINK_TO_PAGE);
540 PageRange page_ranges;
541 page_ranges.push_back(Interval(1, 99));
542 page_ranges.push_back(Interval(150));
543 page_range.set_value(page_ranges);
544 media.set_value(Media(ISO_C7C6, 4261, 334));
545 collate.set_value(false);
546 reverse.set_value(true);
548 pwg_raster_config.SaveTo(&description);
549 color.SaveTo(&description);
550 duplex.SaveTo(&description);
551 orientation.SaveTo(&description);
552 copies.SaveTo(&description);
553 margins.SaveTo(&description);
554 dpi.SaveTo(&description);
555 fit_to_page.SaveTo(&description);
556 page_range.SaveTo(&description);
557 media.SaveTo(&description);
558 collate.SaveTo(&description);
559 reverse.SaveTo(&description);
561 EXPECT_EQ(NormalizeJson(kCjt), NormalizeJson(description.ToString()));
564 TEST(PrinterDescriptionTest, CjtGetAll) {
565 CloudDeviceDescription description;
566 ASSERT_TRUE(description.InitFromString(NormalizeJson(kCjt)));
568 ColorTicketItem color;
569 DuplexTicketItem duplex;
570 OrientationTicketItem orientation;
571 MarginsTicketItem margins;
573 FitToPageTicketItem fit_to_page;
574 MediaTicketItem media;
575 CopiesTicketItem copies;
576 PageRangeTicketItem page_range;
577 CollateTicketItem collate;
578 ReverseTicketItem reverse;
579 PwgRasterConfigTicketItem pwg_raster_config;
581 EXPECT_TRUE(pwg_raster_config.LoadFrom(description));
582 EXPECT_TRUE(color.LoadFrom(description));
583 EXPECT_TRUE(duplex.LoadFrom(description));
584 EXPECT_TRUE(orientation.LoadFrom(description));
585 EXPECT_TRUE(copies.LoadFrom(description));
586 EXPECT_TRUE(margins.LoadFrom(description));
587 EXPECT_TRUE(dpi.LoadFrom(description));
588 EXPECT_TRUE(fit_to_page.LoadFrom(description));
589 EXPECT_TRUE(page_range.LoadFrom(description));
590 EXPECT_TRUE(media.LoadFrom(description));
591 EXPECT_TRUE(collate.LoadFrom(description));
592 EXPECT_TRUE(reverse.LoadFrom(description));
593 EXPECT_TRUE(media.LoadFrom(description));
595 EXPECT_EQ(MANUAL_TUMBLE, pwg_raster_config.value().document_sheet_back);
596 EXPECT_TRUE(pwg_raster_config.value().reverse_order_streaming);
597 EXPECT_FALSE(pwg_raster_config.value().rotate_all_pages);
598 EXPECT_EQ(color.value(), Color(STANDARD_MONOCHROME));
599 EXPECT_EQ(duplex.value(), NO_DUPLEX);
600 EXPECT_EQ(orientation.value(), LANDSCAPE);
601 EXPECT_EQ(copies.value(), 123);
602 EXPECT_EQ(margins.value(), Margins(CUSTOM_MARGINS, 7, 6, 3, 1));
603 EXPECT_EQ(dpi.value(), Dpi(562, 125));
604 EXPECT_EQ(fit_to_page.value(), SHRINK_TO_PAGE);
605 PageRange page_ranges;
606 page_ranges.push_back(Interval(1, 99));
607 page_ranges.push_back(Interval(150));
608 EXPECT_EQ(page_range.value(), page_ranges);
609 EXPECT_EQ(media.value(), Media(ISO_C7C6, 4261, 334));
610 EXPECT_FALSE(collate.value());
611 EXPECT_TRUE(reverse.value());
613 EXPECT_EQ(NormalizeJson(kCjt), NormalizeJson(description.ToString()));
616 } // namespace printer
618 } // namespace cloud_devices