Chromium Code Reviews| Index: ui/gfx/image/mojo/image_traits_unittest.cc |
| diff --git a/ui/gfx/image/mojo/image_traits_unittest.cc b/ui/gfx/image/mojo/image_traits_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..f7832f1d97d2031c24dd3a38e65ba9ea2ab1c4d8 |
| --- /dev/null |
| +++ b/ui/gfx/image/mojo/image_traits_unittest.cc |
| @@ -0,0 +1,194 @@ |
| +// Copyright 2017 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 <vector> |
| + |
| +#include "base/macros.h" |
| +#include "base/message_loop/message_loop.h" |
| +#include "mojo/public/cpp/bindings/binding_set.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| +#include "third_party/skia/include/core/SkBitmap.h" |
| +#include "ui/gfx/geometry/size.h" |
| +#include "ui/gfx/image/image_skia_operations.h" |
| +#include "ui/gfx/image/image_skia_source.h" |
| +#include "ui/gfx/image/mojo/image_traits_test_service.mojom.h" |
| +#include "ui/gfx/skia_util.h" |
| + |
| +namespace gfx { |
| + |
| +namespace { |
| + |
| +// Returns true if all reps in |reps| are present in |image|. |
| +bool ContainsSameRepresentation(const std::vector<ImageSkiaRep>& reps, |
|
msw
2017/03/23 20:47:52
nit: look at gfx::test::ImageSkiaStructureMatches,
xiyuan
2017/03/24 05:45:31
Acknowledged.
|
| + const ImageSkia& image) { |
| + for (const auto& rep : reps) { |
|
msw
2017/03/23 20:47:52
Should we check that image.image_reps().size() ==
xiyuan
2017/03/24 05:45:27
Done. Revised code to get image_reps() from |image
|
| + if (!gfx::BitmapsAreEqual( |
| + rep.sk_bitmap(), |
| + image.GetRepresentation(rep.scale()).sk_bitmap())) { |
|
msw
2017/03/23 20:47:52
Should we be checking HasRepresentation before cal
xiyuan
2017/03/24 05:45:24
Good point. GetRepresentation should not be used.
|
| + return false; |
| + } |
| + } |
| + return true; |
| +} |
| + |
| +class TestImageSkiaSource : public ImageSkiaSource { |
|
msw
2017/03/23 20:47:52
nit: add a comment
xiyuan
2017/03/24 05:45:26
Done.
|
| + public: |
| + explicit TestImageSkiaSource(const gfx::Size& dip_size) |
| + : dip_size_(dip_size) {} |
| + ~TestImageSkiaSource() override = default; |
| + |
| + // ImageSkiaSource: |
| + ImageSkiaRep GetImageForScale(float scale) override { |
| + return ImageSkiaRep(ScaleToCeiledSize(dip_size_, scale), scale); |
| + } |
| + |
| + private: |
| + const gfx::Size dip_size_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(TestImageSkiaSource); |
| +}; |
| + |
| +class ImageTraitsTest : public testing::Test, |
|
msw
2017/03/23 20:47:52
See my earlier comment; hopefully the test service
xiyuan
2017/03/24 05:45:28
Tried it and handles are not supported in Deserial
|
| + public mojom::ImageTraitsTestService { |
| + public: |
| + ImageTraitsTest() = default; |
| + |
| + // testing::Test: |
| + void SetUp() override { |
| + service_ = bindings_.CreateInterfacePtrAndBind(this); |
| + } |
| + |
| + mojom::ImageTraitsTestServicePtr& service() { return service_; } |
| + |
| + private: |
| + // mojom::ImageTraitsTestService: |
| + void EchoImageSkiaRep(const ImageSkiaRep& in, |
| + const EchoImageSkiaRepCallback& callback) override { |
| + callback.Run(in); |
| + } |
| + void EchoImageSkia(const ImageSkia& in, |
| + const EchoImageSkiaCallback& callback) override { |
| + callback.Run(in); |
| + } |
| + |
| + base::MessageLoop loop_; |
| + mojo::BindingSet<ImageTraitsTestService> bindings_; |
| + mojom::ImageTraitsTestServicePtr service_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(ImageTraitsTest); |
| +}; |
| + |
| +} // namespace |
| + |
| +TEST_F(ImageTraitsTest, NullImageSkiaRep) { |
| + ImageSkiaRep null_rep; |
| + ASSERT_TRUE(null_rep.is_null()); |
| + |
| + ImageSkiaRep output(gfx::Size(1, 1), 1.0f); |
| + ASSERT_FALSE(output.is_null()); |
| + service()->EchoImageSkiaRep(null_rep, &output); |
| + EXPECT_TRUE(output.is_null()); |
| +} |
| + |
| +TEST_F(ImageTraitsTest, EmptyImageSkiaRepIsNull) { |
| + SkBitmap empty_bitmap; |
| + empty_bitmap.allocN32Pixels(0, 0); |
|
msw
2017/03/23 20:47:52
optional nit: check if the bitmap is null?
xiyuan
2017/03/24 05:45:31
Done.
|
| + ImageSkiaRep image_rep(empty_bitmap, 1.0f); |
|
msw
2017/03/23 20:47:52
nit: after this, ASSERT_TRUE(image_rep.is_null());
xiyuan
2017/03/24 05:45:23
This is the tricky part, might be a bug with curre
|
| + |
| + ImageSkiaRep output(gfx::Size(1, 1), 1.0f); |
| + ASSERT_FALSE(output.is_null()); |
| + service()->EchoImageSkiaRep(image_rep, &output); |
| + EXPECT_TRUE(output.is_null()); |
| +} |
| + |
| +TEST_F(ImageTraitsTest, ImageSkiaRep) { |
| + ImageSkiaRep image_rep(gfx::Size(2, 4), 2.0f); |
| + |
| + ImageSkiaRep output; |
| + service()->EchoImageSkiaRep(image_rep, &output); |
| + |
| + EXPECT_FALSE(output.is_null()); |
| + EXPECT_EQ(image_rep.scale(), output.scale()); |
| + EXPECT_EQ(image_rep.pixel_size(), output.pixel_size()); |
| + EXPECT_EQ(image_rep.GetWidth(), output.GetWidth()); |
| + EXPECT_EQ(image_rep.GetHeight(), output.GetHeight()); |
| + EXPECT_TRUE(gfx::BitmapsAreEqual(image_rep.sk_bitmap(), output.sk_bitmap())); |
| +} |
| + |
| +TEST_F(ImageTraitsTest, NullImageSkia) { |
| + ImageSkia null_image; |
| + ASSERT_TRUE(null_image.isNull()); |
| + |
| + ImageSkia output(ImageSkiaRep(gfx::Size(1, 1), 1.0f)); |
| + ASSERT_FALSE(output.isNull()); |
| + service()->EchoImageSkia(null_image, &output); |
| + EXPECT_TRUE(output.isNull()); |
| +} |
| + |
| +TEST_F(ImageTraitsTest, ImageSkiaWithNoRepsTreatedAsNull) { |
|
msw
2017/03/23 20:47:52
Hmm, I wonder if this behavior will bite us later.
xiyuan
2017/03/24 05:45:30
Possible. But there is not much we could do at thi
|
| + const gfx::Size kSize(1, 2); |
| + ImageSkia image(new TestImageSkiaSource(kSize), kSize); |
| + ASSERT_FALSE(image.isNull()); |
| + |
| + ImageSkia output(ImageSkiaRep(gfx::Size(1, 1), 1.0f)); |
| + ASSERT_FALSE(output.isNull()); |
| + service()->EchoImageSkia(image, &output); |
| + |
|
msw
2017/03/23 20:47:52
optional nit: remove blank line
xiyuan
2017/03/24 05:45:29
Done.
|
| + EXPECT_TRUE(output.isNull()); |
| +} |
| + |
| +TEST_F(ImageTraitsTest, ImageSkia) { |
| + const gfx::Size kSize(1, 2); |
| + ImageSkia image(new TestImageSkiaSource(kSize), kSize); |
| + image.GetRepresentation(1.0f); |
| + image.GetRepresentation(2.0f); |
| + |
| + ImageSkia output; |
| + service()->EchoImageSkia(image, &output); |
| + |
| + EXPECT_FALSE(output.isNull()); |
| + const std::vector<ImageSkiaRep> output_reps = output.image_reps(); |
| + EXPECT_EQ(2u, output_reps.size()); |
| + EXPECT_TRUE(ContainsSameRepresentation(output_reps, image)); |
| +} |
| + |
| +TEST_F(ImageTraitsTest, EmptyRepStripped) { |
| + const gfx::Size kSize(1, 2); |
| + ImageSkia image(new TestImageSkiaSource(kSize), kSize); |
| + image.GetRepresentation(1.0f); |
| + |
| + SkBitmap empty_bitmap; |
| + empty_bitmap.allocN32Pixels(0, 0); |
| + image.AddRepresentation(ImageSkiaRep(empty_bitmap, 2.0f)); |
| + |
| + ImageSkia output; |
| + service()->EchoImageSkia(image, &output); |
| + |
| + EXPECT_FALSE(output.isNull()); |
| + const std::vector<ImageSkiaRep> output_reps = output.image_reps(); |
| + EXPECT_EQ(1u, output_reps.size()); |
| + EXPECT_TRUE(ContainsSameRepresentation(output_reps, image)); |
| +} |
| + |
| +TEST_F(ImageTraitsTest, ImageSkiaWithOperations) { |
| + const gfx::Size kSize(32, 32); |
| + ImageSkia image(new TestImageSkiaSource(kSize), kSize); |
| + |
| + const gfx::Size kNewSize(16, 16); |
| + ImageSkia resized = ImageSkiaOperations::CreateResizedImage( |
| + image, skia::ImageOperations::RESIZE_BEST, kNewSize); |
| + resized.GetRepresentation(1.0f); |
| + resized.GetRepresentation(2.0f); |
| + |
| + ImageSkia output; |
| + service()->EchoImageSkia(resized, &output); |
| + |
| + EXPECT_FALSE(output.isNull()); |
| + EXPECT_EQ(kNewSize, output.size()); |
| + const std::vector<ImageSkiaRep> output_reps = output.image_reps(); |
| + EXPECT_EQ(2u, output_reps.size()); |
| + EXPECT_TRUE(ContainsSameRepresentation(output_reps, resized)); |
| +} |
| + |
| +} // namespace gfx |