1// Copyright (c) 2012 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/backend/cups_helper.h"
6#include "printing/backend/print_backend.h"
7#include "testing/gtest/include/gtest/gtest.h"
8
9TEST(PrintBackendCupsHelperTest, TestPpdParsingNoColorDuplexLongEdge) {
10  std::string test_ppd_data;
11  test_ppd_data.append(
12      "*PPD-Adobe: \"4.3\"\n\n"
13      "*OpenGroup: General/General\n\n"
14      "*OpenUI *ColorModel/Color Model: PickOne\n"
15      "*DefaultColorModel: Gray\n"
16      "*ColorModel Gray/Grayscale: \""
17      "<</cupsColorSpace 0/cupsColorOrder 0>>"
18      "setpagedevice\"\n"
19      "*ColorModel Black/Inverted Grayscale: \""
20      "<</cupsColorSpace 3/cupsColorOrder 0>>"
21      "setpagedevice\"\n"
22      "*CloseUI: *ColorModel\n"
23      "*OpenUI *Duplex/2-Sided Printing: PickOne\n"
24      "*DefaultDuplex: DuplexTumble\n"
25      "*Duplex None/Off: \"<</Duplex false>>"
26      "setpagedevice\"\n"
27      "*Duplex DuplexNoTumble/LongEdge: \""
28      "<</Duplex true/Tumble false>>setpagedevice\"\n"
29      "*Duplex DuplexTumble/ShortEdge: \""
30      "<</Duplex true/Tumble true>>setpagedevice\"\n"
31      "*CloseUI: *Duplex\n\n"
32      "*CloseGroup: General\n");
33
34  printing::PrinterSemanticCapsAndDefaults caps;
35  EXPECT_TRUE(printing::ParsePpdCapabilities("test", test_ppd_data, &caps));
36  EXPECT_TRUE(caps.collate_capable);
37  EXPECT_TRUE(caps.collate_default);
38  EXPECT_TRUE(caps.copies_capable);
39  EXPECT_TRUE(caps.duplex_capable);
40  EXPECT_EQ(caps.duplex_default, printing::LONG_EDGE);
41  EXPECT_FALSE(caps.color_changeable);
42  EXPECT_FALSE(caps.color_default);
43}
44
45// Test duplex detection code, which regressed in http://crbug.com/103999.
46TEST(PrintBackendCupsHelperTest, TestPpdParsingNoColorDuplexSimples) {
47  std::string test_ppd_data;
48  test_ppd_data.append(
49      "*PPD-Adobe: \"4.3\"\n\n"
50      "*OpenGroup: General/General\n\n"
51      "*OpenUI *Duplex/Double-Sided Printing: PickOne\n"
52      "*DefaultDuplex: None\n"
53      "*Duplex None/Off: "
54      "\"<</Duplex false>>setpagedevice\"\n"
55      "*Duplex DuplexNoTumble/Long Edge (Standard): "
56      "\"<</Duplex true/Tumble false>>setpagedevice\"\n"
57      "*Duplex DuplexTumble/Short Edge (Flip): "
58      "\"<</Duplex true/Tumble true>>setpagedevice\"\n"
59      "*CloseUI: *Duplex\n\n"
60      "*CloseGroup: General\n");
61
62  printing::PrinterSemanticCapsAndDefaults caps;
63  EXPECT_TRUE(printing::ParsePpdCapabilities("test", test_ppd_data, &caps));
64  EXPECT_TRUE(caps.collate_capable);
65  EXPECT_TRUE(caps.collate_default);
66  EXPECT_TRUE(caps.copies_capable);
67  EXPECT_TRUE(caps.duplex_capable);
68  EXPECT_EQ(caps.duplex_default, printing::SIMPLEX);
69  EXPECT_FALSE(caps.color_changeable);
70  EXPECT_FALSE(caps.color_default);
71}
72
73TEST(PrintBackendCupsHelperTest, TestPpdParsingNoColorNoDuplex) {
74  std::string test_ppd_data;
75  test_ppd_data.append(
76      "*PPD-Adobe: \"4.3\"\n\n"
77      "*OpenGroup: General/General\n\n"
78      "*OpenUI *ColorModel/Color Model: PickOne\n"
79      "*DefaultColorModel: Gray\n"
80      "*ColorModel Gray/Grayscale: \""
81      "<</cupsColorSpace 0/cupsColorOrder 0>>"
82      "setpagedevice\"\n"
83      "*ColorModel Black/Inverted Grayscale: \""
84      "<</cupsColorSpace 3/cupsColorOrder 0>>"
85      "setpagedevice\"\n"
86      "*CloseUI: *ColorModel\n"
87      "*CloseGroup: General\n");
88
89  printing::PrinterSemanticCapsAndDefaults caps;
90  EXPECT_TRUE(printing::ParsePpdCapabilities("test", test_ppd_data, &caps));
91  EXPECT_TRUE(caps.collate_capable);
92  EXPECT_TRUE(caps.collate_default);
93  EXPECT_TRUE(caps.copies_capable);
94  EXPECT_FALSE(caps.duplex_capable);
95  EXPECT_EQ(caps.duplex_default, printing::UNKNOWN_DUPLEX_MODE);
96  EXPECT_FALSE(caps.color_changeable);
97  EXPECT_FALSE(caps.color_default);
98}
99
100TEST(PrintBackendCupsHelperTest, TestPpdParsingColorTrueDuplexLongEdge) {
101  std::string test_ppd_data;
102  test_ppd_data.append(
103      "*PPD-Adobe: \"4.3\"\n\n"
104      "*ColorDevice: True\n"
105      "*DefaultColorSpace: CMYK\n\n"
106      "*OpenGroup: General/General\n\n"
107      "*OpenUI *ColorModel/Color Model: PickOne\n"
108      "*DefaultColorModel: CMYK\n"
109      "*ColorModel CMYK/Color: "
110      "\"(cmyk) RCsetdevicecolor\"\n"
111      "*ColorModel Gray/Black and White: "
112      "\"(gray) RCsetdevicecolor\"\n"
113      "*CloseUI: *ColorModel\n"
114      "*OpenUI *Duplex/2-Sided Printing: PickOne\n"
115      "*DefaultDuplex: DuplexTumble\n"
116      "*Duplex None/Off: \"<</Duplex false>>"
117      "setpagedevice\"\n"
118      "*Duplex DuplexNoTumble/LongEdge: \""
119      "<</Duplex true/Tumble false>>setpagedevice\"\n"
120      "*Duplex DuplexTumble/ShortEdge: \""
121      "<</Duplex true/Tumble true>>setpagedevice\"\n"
122      "*CloseUI: *Duplex\n\n"
123      "*CloseGroup: General\n");
124
125  printing::PrinterSemanticCapsAndDefaults caps;
126  EXPECT_TRUE(printing::ParsePpdCapabilities("test", test_ppd_data, &caps));
127  EXPECT_TRUE(caps.collate_capable);
128  EXPECT_TRUE(caps.collate_default);
129  EXPECT_TRUE(caps.copies_capable);
130  EXPECT_TRUE(caps.duplex_capable);
131  EXPECT_EQ(caps.duplex_default, printing::LONG_EDGE);
132  EXPECT_TRUE(caps.color_changeable);
133  EXPECT_TRUE(caps.color_default);
134}
135
136TEST(PrintBackendCupsHelperTest, TestPpdParsingColorFalseDuplexLongEdge) {
137  std::string test_ppd_data;
138  test_ppd_data.append(
139      "*PPD-Adobe: \"4.3\"\n\n"
140      "*ColorDevice: True\n"
141      "*DefaultColorSpace: CMYK\n\n"
142      "*OpenGroup: General/General\n\n"
143      "*OpenUI *ColorModel/Color Model: PickOne\n"
144      "*DefaultColorModel: Grayscale\n"
145      "*ColorModel Color/Color: "
146      "\"%% FoomaticRIPOptionSetting: ColorModel=Color\"\n"
147      "*FoomaticRIPOptionSetting ColorModel=Color: "
148      "\"JCLDatamode=Color GSCmdLine=Color\"\n"
149      "*ColorModel Grayscale/Grayscale: "
150      "\"%% FoomaticRIPOptionSetting: ColorModel=Grayscale\"\n"
151      "*FoomaticRIPOptionSetting ColorModel=Grayscale: "
152      "\"JCLDatamode=Grayscale GSCmdLine=Grayscale\"\n"
153      "*CloseUI: *ColorModel\n"
154      "*OpenUI *Duplex/2-Sided Printing: PickOne\n"
155      "*DefaultDuplex: DuplexTumble\n"
156      "*Duplex None/Off: \"<</Duplex false>>"
157      "setpagedevice\"\n"
158      "*Duplex DuplexNoTumble/LongEdge: \""
159      "<</Duplex true/Tumble false>>setpagedevice\"\n"
160      "*Duplex DuplexTumble/ShortEdge: \""
161      "<</Duplex true/Tumble true>>setpagedevice\"\n"
162      "*CloseUI: *Duplex\n\n"
163      "*CloseGroup: General\n");
164
165  printing::PrinterSemanticCapsAndDefaults caps;
166  EXPECT_TRUE(printing::ParsePpdCapabilities("test", test_ppd_data, &caps));
167  EXPECT_TRUE(caps.collate_capable);
168  EXPECT_TRUE(caps.collate_default);
169  EXPECT_TRUE(caps.copies_capable);
170  EXPECT_TRUE(caps.duplex_capable);
171  EXPECT_EQ(caps.duplex_default, printing::LONG_EDGE);
172  EXPECT_TRUE(caps.color_changeable);
173  EXPECT_FALSE(caps.color_default);
174}
175
176TEST(PrintBackendCupsHelperTest, TestPpdParsingPageSize) {
177  std::string test_ppd_data;
178  test_ppd_data.append(
179      "*PPD-Adobe: \"4.3\"\n\n"
180      "*OpenUI *PageSize: PickOne\n"
181      "*OrderDependency: 30 AnySetup *PageSize\n"
182      "*DefaultPageSize: Letter\n"
183      "*PageSize Letter/US Letter: \""
184      "  <</DeferredMediaSelection true /PageSize [612 792] "
185      "  /ImagingBBox null /MediaClass null >> setpagedevice\"\n"
186      "*End\n"
187      "*PageSize Legal/US Legal: \""
188      "  <</DeferredMediaSelection true /PageSize [612 1008] "
189      "  /ImagingBBox null /MediaClass null >> setpagedevice\"\n"
190      "*End\n"
191      "*DefaultPaperDimension: Letter\n"
192      "*PaperDimension Letter/US Letter: \"612   792\"\n"
193      "*PaperDimension Legal/US Legal: \"612  1008\"\n\n"
194      "*CloseUI: *PageSize\n\n");
195
196  printing::PrinterSemanticCapsAndDefaults caps;
197  EXPECT_TRUE(printing::ParsePpdCapabilities("test", test_ppd_data, &caps));
198  ASSERT_EQ(2UL, caps.papers.size());
199  EXPECT_EQ("Letter", caps.papers[0].vendor_id);
200  EXPECT_EQ("US Letter", caps.papers[0].display_name);
201  EXPECT_EQ(215900, caps.papers[0].size_um.width());
202  EXPECT_EQ(279400, caps.papers[0].size_um.height());
203  EXPECT_EQ("Legal", caps.papers[1].vendor_id);
204  EXPECT_EQ("US Legal", caps.papers[1].display_name);
205  EXPECT_EQ(215900, caps.papers[1].size_um.width());
206  EXPECT_EQ(355600, caps.papers[1].size_um.height());
207}
208