blob: 3c39426e1937bb5eda63b9b7e4ef2db0e09d37cb [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/scanning/scanning_type_converters.h"
#include "ash/webui/scanning/mojom/scanning.mojom.h"
#include "chromeos/dbus/lorgnette/lorgnette_service.pb.h"
#include "mojo/public/cpp/bindings/enum_traits.h"
#include "mojo/public/cpp/bindings/struct_traits.h"
#include "testing/gmock/include/gmock/gmock-matchers.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace ash {
namespace {
using ::testing::ElementsAreArray;
namespace mojo_ipc = scanning::mojom;
// POD struct for ScannerCapabilitiesTest.
struct ScannerCapabilitiesTestParams {
lorgnette::SourceType lorgnette_source_type;
lorgnette::ColorMode lorgnette_color_mode;
mojo_ipc::SourceType mojom_source_type;
mojo_ipc::ColorMode mojom_color_mode;
};
// POD struct for ScanSettingsTest.
struct ScanSettingsTestParams {
mojo_ipc::ColorMode mojom_color_mode;
lorgnette::ColorMode lorgnette_color_mode;
mojo_ipc::FileType mojom_file_type;
lorgnette::ImageFormat lorgnete_image_format;
mojo_ipc::PageSize mojom_page_size;
double bottom_right_x;
double bottom_right_y;
};
// Document source name used for tests.
constexpr char kDocumentSourceName[] = "Test Name";
// Scannable area dimensions used for tests. These are large enough to ensure
// every page size is supported by the scanner.
constexpr int kScanAreaWidthMm = 500;
constexpr int kScanAreaHeightMm = 750;
// Resolutions used for tests.
constexpr uint32_t kFirstResolution = 75;
constexpr uint32_t kSecondResolution = 300;
// Returns a DocumentSource object with the given |source_type|.
lorgnette::DocumentSource CreateLorgnetteDocumentSource(
lorgnette::SourceType source_type) {
lorgnette::DocumentSource source;
source.set_type(source_type);
source.set_name(kDocumentSourceName);
source.mutable_area()->set_width(kScanAreaWidthMm);
source.mutable_area()->set_height(kScanAreaHeightMm);
return source;
}
// Returns a ScannerCapabilities object with the given |source_type| and
// |color_mode|.
lorgnette::ScannerCapabilities CreateLorgnetteScannerCapabilities(
lorgnette::SourceType source_type,
lorgnette::ColorMode color_mode) {
lorgnette::ScannerCapabilities caps;
*caps.add_sources() = CreateLorgnetteDocumentSource(source_type);
caps.add_color_modes(color_mode);
caps.add_resolutions(kFirstResolution);
caps.add_resolutions(kSecondResolution);
return caps;
}
// Returns a ScanSettingsPtr with the given |color_mode|, |page_size| and
// |file_type|.
mojo_ipc::ScanSettingsPtr CreateMojomScanSettings(
mojo_ipc::ColorMode color_mode,
mojo_ipc::PageSize page_size,
mojo_ipc::FileType file_type) {
mojo_ipc::ScanSettings settings;
settings.source_name = kDocumentSourceName;
settings.color_mode = color_mode;
settings.file_type = file_type;
settings.page_size = page_size;
settings.resolution_dpi = kFirstResolution;
return settings.Clone();
}
} // namespace
// Tests that each possible lorgnette::ScannerCapabilities proto can be
// correctly converted into a mojo_ipc::ScannerCapabilitiesPtr.
//
// This is a parameterized test with the following parameters (accessed through
// ScannerCapabilitiesTestParams):
// * |lorgnette_source_type| - the lorgnette::SourceType to convert.
// * |lorgnette_color_mode| - the lorgnette::ColorMode to convert.
// * |mojom_source_type| - the expected mojo_ipc::SourceType.
// * |mojom_color_mode| - the expected mojo_ipc::ColorMode.
class ScannerCapabilitiesTest
: public testing::Test,
public testing::WithParamInterface<ScannerCapabilitiesTestParams> {
protected:
// Accessors to the test parameters returned by gtest's GetParam():
ScannerCapabilitiesTestParams params() const { return GetParam(); }
};
// Test that lorgnette::ScannerCapabilities can be converted into a
// mojo_ipc::ScannerCapabilitiesPtr.
TEST_P(ScannerCapabilitiesTest, LorgnetteCapsToMojom) {
mojo_ipc::ScannerCapabilitiesPtr mojo_caps =
mojo::StructTraits<ash::scanning::mojom::ScannerCapabilitiesPtr,
lorgnette::ScannerCapabilities>::
ToMojom(CreateLorgnetteScannerCapabilities(
params().lorgnette_source_type, params().lorgnette_color_mode));
ASSERT_EQ(mojo_caps->sources.size(), 1u);
EXPECT_EQ(mojo_caps->sources[0]->type, params().mojom_source_type);
EXPECT_EQ(mojo_caps->sources[0]->name, kDocumentSourceName);
EXPECT_THAT(
mojo_caps->sources[0]->page_sizes,
ElementsAreArray({mojo_ipc::PageSize::kMax, mojo_ipc::PageSize::kIsoA4,
mojo_ipc::PageSize::kNaLetter}));
ASSERT_EQ(mojo_caps->color_modes.size(), 1u);
EXPECT_EQ(mojo_caps->color_modes[0], params().mojom_color_mode);
ASSERT_EQ(mojo_caps->resolutions.size(), 2u);
EXPECT_EQ(mojo_caps->resolutions[0], kFirstResolution);
EXPECT_EQ(mojo_caps->resolutions[1], kSecondResolution);
}
INSTANTIATE_TEST_SUITE_P(
,
ScannerCapabilitiesTest,
testing::Values(
ScannerCapabilitiesTestParams{lorgnette::SOURCE_PLATEN,
lorgnette::MODE_LINEART,
mojo_ipc::SourceType::kFlatbed,
mojo_ipc::ColorMode::kBlackAndWhite},
ScannerCapabilitiesTestParams{
lorgnette::SOURCE_ADF_SIMPLEX, lorgnette::MODE_GRAYSCALE,
mojo_ipc::SourceType::kAdfSimplex, mojo_ipc::ColorMode::kGrayscale},
ScannerCapabilitiesTestParams{
lorgnette::SOURCE_ADF_DUPLEX, lorgnette::MODE_COLOR,
mojo_ipc::SourceType::kAdfDuplex, mojo_ipc::ColorMode::kColor},
ScannerCapabilitiesTestParams{
lorgnette::SOURCE_DEFAULT, lorgnette::MODE_COLOR,
mojo_ipc::SourceType::kDefault, mojo_ipc::ColorMode::kColor}));
// Tests that each possible mojo_ipc::ScanSettingsPtr can be correctly converted
// into a lorgnette::ScanSettings proto.
//
// This is a parameterized test with the following parameters (accessed through
// ScanSettingsTestParams):
// * |mojom_color_mode| - the mojo_ipc::ColorMode to convert.
// * |lorgnette_color_mode| - the expected lorgnette::ColorMode.
// * |mojom_file_type| - the mojo_ipc::FileType to convert.
// * |lorgnette_image_format| - the expected lorgnette::ImageFormat.
// * |mojom_page_size| - the mojo_ipc::PageSize to convert.
// * |bottom_right_x| - the expected bottom-right x-coordinate.
// * |bottom_right_y| - the expected bottom-right y-coordinate.
class ScanSettingsTest
: public testing::Test,
public testing::WithParamInterface<ScanSettingsTestParams> {
protected:
// Accessors to the test parameters returned by gtest's GetParam():
ScanSettingsTestParams params() const { return GetParam(); }
};
// Test that mojo_ipc::ScanSettingsPtr can be converted into a
// lorgnette::ScanSettings proto.
TEST_P(ScanSettingsTest, MojomSettingsToLorgnette) {
lorgnette::ScanSettings lorgnette_settings =
mojo::StructTraits<lorgnette::ScanSettings, mojo_ipc::ScanSettingsPtr>::
ToMojom(CreateMojomScanSettings(params().mojom_color_mode,
params().mojom_page_size,
params().mojom_file_type));
EXPECT_EQ(lorgnette_settings.source_name(), kDocumentSourceName);
EXPECT_EQ(lorgnette_settings.color_mode(), params().lorgnette_color_mode);
EXPECT_EQ(lorgnette_settings.image_format(), params().lorgnete_image_format);
EXPECT_EQ(lorgnette_settings.resolution(), kFirstResolution);
if (params().mojom_page_size == mojo_ipc::PageSize::kMax) {
EXPECT_FALSE(lorgnette_settings.has_scan_region());
} else {
ASSERT_TRUE(lorgnette_settings.has_scan_region());
EXPECT_EQ(lorgnette_settings.scan_region().top_left_x(), 0);
EXPECT_EQ(lorgnette_settings.scan_region().top_left_y(), 0);
EXPECT_EQ(lorgnette_settings.scan_region().bottom_right_x(),
params().bottom_right_x);
EXPECT_EQ(lorgnette_settings.scan_region().bottom_right_y(),
params().bottom_right_y);
}
}
INSTANTIATE_TEST_SUITE_P(
,
ScanSettingsTest,
testing::Values(
ScanSettingsTestParams{
mojo_ipc::ColorMode::kBlackAndWhite, lorgnette::MODE_LINEART,
mojo_ipc::FileType::kPng, lorgnette::IMAGE_FORMAT_PNG,
mojo_ipc::PageSize::kIsoA4, 210, 297},
ScanSettingsTestParams{
mojo_ipc::ColorMode::kGrayscale, lorgnette::MODE_GRAYSCALE,
mojo_ipc::FileType::kJpg, lorgnette::IMAGE_FORMAT_JPEG,
mojo_ipc::PageSize::kNaLetter, 215.9, 279.4},
ScanSettingsTestParams{mojo_ipc::ColorMode::kColor,
lorgnette::MODE_COLOR, mojo_ipc::FileType::kPdf,
lorgnette::IMAGE_FORMAT_JPEG,
mojo_ipc::PageSize::kMax, 0, 0},
ScanSettingsTestParams{
mojo_ipc::ColorMode::kColor, lorgnette::MODE_COLOR,
mojo_ipc::FileType::kSearchablePdf, lorgnette::IMAGE_FORMAT_JPEG,
mojo_ipc::PageSize::kMax, 0, 0}));
// Test that each lorgnette::ScanFailureMode is converted into the correct
// mojo_ipc::ScanResult.
TEST(ScanResultTest, Convert) {
EXPECT_EQ((mojo::EnumTraits<ash::scanning::mojom::ScanResult,
lorgnette::ScanFailureMode>::
ToMojom(lorgnette::SCAN_FAILURE_MODE_NO_FAILURE)),
mojo_ipc::ScanResult::kSuccess);
EXPECT_EQ((mojo::EnumTraits<ash::scanning::mojom::ScanResult,
lorgnette::ScanFailureMode>::
ToMojom(lorgnette::SCAN_FAILURE_MODE_UNKNOWN)),
mojo_ipc::ScanResult::kUnknownError);
EXPECT_EQ((mojo::EnumTraits<ash::scanning::mojom::ScanResult,
lorgnette::ScanFailureMode>::
ToMojom(lorgnette::SCAN_FAILURE_MODE_DEVICE_BUSY)),
mojo_ipc::ScanResult::kDeviceBusy);
EXPECT_EQ((mojo::EnumTraits<ash::scanning::mojom::ScanResult,
lorgnette::ScanFailureMode>::
ToMojom(lorgnette::SCAN_FAILURE_MODE_ADF_JAMMED)),
mojo_ipc::ScanResult::kAdfJammed);
EXPECT_EQ((mojo::EnumTraits<ash::scanning::mojom::ScanResult,
lorgnette::ScanFailureMode>::
ToMojom(lorgnette::SCAN_FAILURE_MODE_ADF_EMPTY)),
mojo_ipc::ScanResult::kAdfEmpty);
EXPECT_EQ((mojo::EnumTraits<ash::scanning::mojom::ScanResult,
lorgnette::ScanFailureMode>::
ToMojom(lorgnette::SCAN_FAILURE_MODE_FLATBED_OPEN)),
mojo_ipc::ScanResult::kFlatbedOpen);
EXPECT_EQ((mojo::EnumTraits<ash::scanning::mojom::ScanResult,
lorgnette::ScanFailureMode>::
ToMojom(lorgnette::SCAN_FAILURE_MODE_IO_ERROR)),
mojo_ipc::ScanResult::kIoError);
}
} // namespace ash