| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "printing/backend/xps_utils_win.h" |
| |
| #include <utility> |
| |
| #include "base/test/gmock_expected_support.h" |
| #include "base/test/values_test_util.h" |
| #include "base/types/expected.h" |
| #include "printing/backend/print_backend.h" |
| #include "printing/backend/print_backend_test_constants.h" |
| #include "printing/mojom/print.mojom.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace printing { |
| |
| namespace { |
| // The correct format of XPS "PageOutputQuality" and "PageOutputColor" |
| // capabilities. |
| constexpr char kCorrectCapabilities[] = R"({ |
| "type": "element", |
| "tag": "psf:PrintCapabilities", |
| "children": [ |
| { |
| "type": "element", |
| "tag": "psf:Feature", |
| "attributes": { |
| "name": "psk:PageOutputQuality" |
| }, |
| "children": [ |
| { |
| "type": "element", |
| "tag": "psf:Feature", |
| "attributes": { |
| "name": "psk:PageOutputQuality" |
| } |
| }, |
| { |
| "type": "element", |
| "tag": "psf:Property", |
| "attributes": { |
| "name": "psf:SelectionType" |
| }, |
| "children": [ |
| { |
| "type": "element", |
| "tag": "psf:Value", |
| "attributes": { |
| "xsi:type": "xsd:QName" |
| }, |
| "children": [ |
| { |
| "type": "text", |
| "text": "psk:PickOne" |
| } |
| ] |
| } |
| ] |
| }, |
| { |
| "type": "element", |
| "tag": "psf:Property", |
| "attributes": { |
| "name": "psf:DisplayName" |
| }, |
| "children": [ |
| { |
| "type": "element", |
| "tag": "psf:Value", |
| "attributes": { |
| "xsi:type": "xsd:string" |
| }, |
| "children": [ |
| { |
| "type": "text", |
| "text": "Quality" |
| } |
| ] |
| } |
| ] |
| }, |
| { |
| "type": "element", |
| "tag": "psf:Option", |
| "attributes": { |
| "name": "ns0000:Draft", |
| "constrain": "psk:None" |
| }, |
| "children": [ |
| { |
| "type": "element", |
| "tag": "psf:Property", |
| "attributes": { |
| "name": "psf:DisplayName" |
| }, |
| "children": [ |
| { |
| "type": "element", |
| "tag": "psf:Value", |
| "attributes": { |
| "xsi:type": "xsd:string" |
| }, |
| "children": [ |
| { |
| "type": "text", |
| "text": "Draft" |
| } |
| ] |
| } |
| ] |
| } |
| ] |
| }, |
| { |
| "type": "element", |
| "tag": "psf:Option", |
| "attributes": { |
| "name": "ns0000:Advanced", |
| "constrain": "psk:None" |
| }, |
| "children": [ |
| { |
| "type": "element", |
| "tag": "psf:Property", |
| "attributes": { |
| "name": "psf:DisplayName" |
| }, |
| "children": [ |
| { |
| "type": "element", |
| "tag": "psf:Value", |
| "attributes": { |
| "xsi:type": "xsd:string" |
| }, |
| "children": [ |
| { |
| "type": "text", |
| "text": "Advanced" |
| } |
| ] |
| } |
| ] |
| } |
| ] |
| }, |
| { |
| "type": "element", |
| "tag": "psf:Option", |
| "attributes": { |
| "name": "psk:Normal" |
| } |
| } |
| ] |
| }, |
| { |
| "type": "element", |
| "tag": "psf:Feature", |
| "attributes": { |
| "name": "psk:PageOutputColor" |
| } |
| } |
| ] |
| } |
| )"; |
| |
| // The incorrect format of XPS `PageOutputQuality` capability. |
| // The property inside option ns0000:Draft does not have any value. |
| constexpr char kIncorrectCapabilities[] = R"({ |
| "type": "element", |
| "tag": "psf:PrintCapabilities", |
| "children": [ |
| { |
| "type": "element", |
| "tag": "psf:Feature", |
| "attributes": { |
| "name": "psk:PageOutputQuality" |
| }, |
| "children": [ |
| { |
| "type": "element", |
| "tag": "psf:Feature", |
| "attributes": { |
| "name": "psk:PageOutputQuality" |
| } |
| }, |
| { |
| "type": "element", |
| "tag": "psf:Property", |
| "attributes": { |
| "name": "psf:SelectionType" |
| }, |
| "children": [ |
| { |
| "type": "element", |
| "tag": "psf:Value", |
| "attributes": { |
| "xsi:type": "xsd:QName" |
| }, |
| "children": [ |
| { |
| "type": "text", |
| "text": "psk:PickOne" |
| } |
| ] |
| } |
| ] |
| }, |
| { |
| "type": "element", |
| "tag": "psf:Property", |
| "attributes": { |
| "name": "psf:DisplayName" |
| }, |
| "children": [ |
| { |
| "type": "element", |
| "tag": "psf:Value", |
| "attributes": { |
| "xsi:type": "xsd:string" |
| }, |
| "children": [ |
| { |
| "type": "text", |
| "text": "Quality" |
| } |
| ] |
| } |
| ] |
| }, |
| { |
| "type": "element", |
| "tag": "psf:Option", |
| "attributes": { |
| "name": "ns0000:Draft", |
| "constrain": "psk:None" |
| }, |
| "children": [ |
| { |
| "type": "element", |
| "tag": "psf:Property", |
| "attributes": { |
| "name": "psf:DisplayName" |
| } |
| } |
| ] |
| } |
| ] |
| } |
| ] |
| } |
| )"; |
| |
| const PageOutputQualityAttributes kPageOutputQualities = { |
| PageOutputQualityAttribute("Draft", "ns0000:Draft"), |
| PageOutputQualityAttribute("Advanced", "ns0000:Advanced"), |
| PageOutputQualityAttribute("", "psk:Normal")}; |
| |
| } // namespace |
| |
| TEST(XpsUtilTest, ParseCorrectPageOutputQualityForXpsPrinterCapabilities) { |
| // Assert that parsing XPS printer capabilities is successful. |
| ASSERT_OK_AND_ASSIGN(const XpsCapabilities result, |
| ParseValueForXpsPrinterCapabilities( |
| base::test::ParseJson(kCorrectCapabilities))); |
| ASSERT_TRUE(result.page_output_quality); |
| EXPECT_EQ(result.page_output_quality->qualities, kPageOutputQualities); |
| } |
| |
| TEST(XpsUtilTest, ParseIncorrectPageOutputQualityForXpsPrinterCapabilities) { |
| // The property inside option ns0000:Draft does not have any value, |
| // so parsing XPS printer capabilities should fail. |
| EXPECT_THAT(ParseValueForXpsPrinterCapabilities( |
| base::test::ParseJson(kIncorrectCapabilities)), |
| base::test::ErrorIs(mojom::ResultCode::kFailed)); |
| } |
| |
| TEST(XpsUtilTest, MergeXpsCapabilitiesPageOutputQuality) { |
| PrinterSemanticCapsAndDefaults printer_capabilities = |
| GenerateSamplePrinterSemanticCapsAndDefaults({}); |
| |
| XpsCapabilities xps_capabilities; |
| xps_capabilities.page_output_quality = kPageOutputQuality; |
| |
| MergeXpsCapabilities(std::move(xps_capabilities), printer_capabilities); |
| |
| // Expect that XPS capability PageOutputQuality was successfully merged into a |
| // PrinterSemanticCapsAndDefaults object. |
| ASSERT_TRUE(printer_capabilities.page_output_quality.has_value()); |
| EXPECT_EQ(printer_capabilities.page_output_quality.value(), |
| kPageOutputQuality); |
| |
| // Expect that non-XPS capabilities remain unmodified. |
| printer_capabilities.page_output_quality = std::nullopt; |
| EXPECT_EQ(printer_capabilities, |
| GenerateSamplePrinterSemanticCapsAndDefaults({})); |
| } |
| |
| } // namespace printing |